From 59a165734a3afbe0cdcbc5cb36a5bb02d7c71785 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Mon, 30 Nov 2015 14:03:24 -0500 Subject: [PATCH 1/6] Fix new pylint 1.5.0 violations --- exporter/tests/test_export.py | 6 ++---- importer/api/__init__.py | 5 +++-- importer/tests/test_import.py | 2 +- learningresources/tests/test_api.py | 5 +++-- learningresources/tests/test_models.py | 2 +- learningresources/tests/test_utils.py | 2 +- lore/settings.py | 2 +- rest/views.py | 11 ++++++----- roles/tests/test_user_models.py | 4 ++-- search/tasks.py | 2 +- search/utils.py | 3 ++- taxonomy/tests/test_api.py | 14 +++++++------- tests/test_urls.py | 5 ++--- ui/tests/test_ga.py | 4 ++-- ui/tests/test_learningresources_views.py | 5 +++-- 15 files changed, 37 insertions(+), 35 deletions(-) diff --git a/exporter/tests/test_export.py b/exporter/tests/test_export.py index 13b4e85d..9bd02d9e 100644 --- a/exporter/tests/test_export.py +++ b/exporter/tests/test_export.py @@ -21,16 +21,14 @@ from learningresources.api import ( update_description_path, create_static_asset, + create_resource, + create_course, ) from exporter.api import ( export_resources_to_directory, export_resources_to_tarball, ) from exporter.tasks import export_resources -from learningresources.api import ( - create_resource, - create_course, -) from importer.tasks import import_file diff --git a/importer/api/__init__.py b/importer/api/__init__.py index de3d7fe7..bee647eb 100644 --- a/importer/api/__init__.py +++ b/importer/api/__init__.py @@ -4,13 +4,14 @@ from __future__ import unicode_literals -from bs4 import BeautifulSoup from shutil import rmtree import logging from tempfile import mkdtemp from os.path import join, exists from os import listdir +from bs4 import BeautifulSoup + from archive import Archive, ArchiveException from django.core.files.storage import default_storage from django.db import transaction @@ -194,7 +195,7 @@ def import_children(course, element, parent, parent_dpath): # temp variable to store static assets for bulk insert static_assets_to_save = set() target = "/static/" - if element.tag == "video": + if element.tag == "video": # pylint: disable=too-many-nested-blocks subname = get_video_sub(element) if subname != "": assets = StaticAsset.objects.filter( diff --git a/importer/tests/test_import.py b/importer/tests/test_import.py index 0d566b3c..1a843db3 100644 --- a/importer/tests/test_import.py +++ b/importer/tests/test_import.py @@ -16,6 +16,7 @@ import mock from lxml import etree +from xbundle import XBundle from importer.api import ( import_course_from_file, import_course_from_path, @@ -33,7 +34,6 @@ ) from learningresources.tests.base import LoreTestCase from lore import settings -from xbundle import XBundle log = logging.getLogger(__name__) diff --git a/learningresources/tests/test_api.py b/learningresources/tests/test_api.py index 64c32e08..7ff3fc82 100644 --- a/learningresources/tests/test_api.py +++ b/learningresources/tests/test_api.py @@ -5,12 +5,14 @@ from __future__ import unicode_literals import logging +import tempfile from django.core.files import File from django.core.files.storage import default_storage from django.core.management import call_command from django.db.utils import IntegrityError -import tempfile + +from mock import patch from importer.api import import_course_from_file from learningresources import api @@ -19,7 +21,6 @@ LearningResource, static_asset_basepath, ) -from mock import patch from .base import LoreTestCase log = logging.getLogger(__name__) diff --git a/learningresources/tests/test_models.py b/learningresources/tests/test_models.py index 17d3725c..5caf10f1 100644 --- a/learningresources/tests/test_models.py +++ b/learningresources/tests/test_models.py @@ -88,7 +88,7 @@ def test_unicode(self): name="first" ) - self.assertEquals("first", str(first)) + self.assertEqual("first", str(first)) def test_repo_slug(self): """Test behavior saving a repository slug""" diff --git a/learningresources/tests/test_utils.py b/learningresources/tests/test_utils.py index b9eebbe6..6a442303 100644 --- a/learningresources/tests/test_utils.py +++ b/learningresources/tests/test_utils.py @@ -33,7 +33,7 @@ def test_sub_language(self): ("de", "de_subs_CCxmtcICYNc.srt.sjson"), ) for lang, sub in values: - self.assertEquals(sub, _subs_filename("CCxmtcICYNc", lang)) + self.assertEqual(sub, _subs_filename("CCxmtcICYNc", lang)) def test_get_sub_name(self): """Test getting subtitle names.""" diff --git a/lore/settings.py b/lore/settings.py index 54228b70..5793e03d 100644 --- a/lore/settings.py +++ b/lore/settings.py @@ -415,5 +415,5 @@ def get_var(name, default): GOOGLE_ANALYTICS_ID = get_var('LORE_GOOGLE_ANALYTICS_ID', None) # This is needed to connect the signals properly. -# pylint: disable=unused-import +# pylint: disable=unused-import,wrong-import-position import search.signals # noqa diff --git a/rest/views.py b/rest/views.py index 346e6ceb..3c3c6edd 100644 --- a/rest/views.py +++ b/rest/views.py @@ -24,10 +24,6 @@ from rest_framework.viewsets import GenericViewSet from statsd.defaults.django import statsd -from learningresources.api import ( - PermissionDenied, - NotFound, -) from roles.permissions import GroupTypes, BaseGroupTypes from roles.api import ( assign_user_to_repo_group, @@ -77,6 +73,11 @@ from search.api import construct_queryset from search.tasks import index_resources from taxonomy.models import Vocabulary + +from learningresources.api import ( + PermissionDenied, + NotFound, +) from learningresources.models import ( Repository, Course, @@ -654,7 +655,7 @@ def get_queryset(self): exports = [] return [{"id": lr_id} for lr_id in exports] - def create(self, request, *args, **kwargs): + def create(self, request, *args, **kwargs): # noqa pylint: disable=unused-argument try: lr_id = int(request.data['id']) except ValueError: diff --git a/roles/tests/test_user_models.py b/roles/tests/test_user_models.py index 274259ab..68c3fe31 100644 --- a/roles/tests/test_user_models.py +++ b/roles/tests/test_user_models.py @@ -49,8 +49,8 @@ class FooObject(object): def __init__(self, foo_var): self.foo_var = foo_var - user_group2 = FooObject('bar') - self.assertFalse(user_group1.__eq__(user_group2)) + foo_object = FooObject('bar') + self.assertFalse(user_group1.__eq__(foo_object)) def test_user_group_hash(self): """Test for UserGroup __hash__""" diff --git a/search/tasks.py b/search/tasks.py index 5f10fa07..51d25288 100644 --- a/search/tasks.py +++ b/search/tasks.py @@ -4,8 +4,8 @@ from __future__ import unicode_literals -from lore.celery import async from statsd.defaults.django import statsd +from lore.celery import async @async.task diff --git a/search/utils.py b/search/utils.py index 71e85efa..cbc684ea 100644 --- a/search/utils.py +++ b/search/utils.py @@ -5,10 +5,11 @@ from __future__ import unicode_literals from collections import defaultdict -from lxml import etree import logging from itertools import islice +from lxml import etree + from django.conf import settings from elasticsearch.helpers import bulk from elasticsearch.exceptions import NotFoundError diff --git a/taxonomy/tests/test_api.py b/taxonomy/tests/test_api.py index d644f415..1054e6a8 100644 --- a/taxonomy/tests/test_api.py +++ b/taxonomy/tests/test_api.py @@ -10,20 +10,20 @@ NotFound, PermissionDenied, ) - -from taxonomy.models import ( - Vocabulary, - Term, -) from learningresources.models import ( LearningResource, LearningResourceType, Course, ) + from taxonomy.api import ( get_term, get_vocabulary, ) +from taxonomy.models import ( + Vocabulary, + Term, +) class TestApi(LoreTestCase): @@ -69,7 +69,7 @@ def test_get_term(self): self.vocabulary.slug, self.term.slug ) - self.assertEquals(self.term, actual_term) + self.assertEqual(self.term, actual_term) with self.assertRaises(NotFound): get_term('missing', self.user.id, self.vocabulary.slug, self.term.slug) @@ -90,7 +90,7 @@ def test_get_vocabulary(self): actual_vocabulary = get_vocabulary( self.repo.slug, self.user.id, self.vocabulary.slug) - self.assertEquals(self.vocabulary, actual_vocabulary) + self.assertEqual(self.vocabulary, actual_vocabulary) with self.assertRaises(NotFound): get_vocabulary("missing", self.user.id, self.vocabulary.slug) diff --git a/tests/test_urls.py b/tests/test_urls.py index 9fad29f9..35bb6b22 100644 --- a/tests/test_urls.py +++ b/tests/test_urls.py @@ -3,17 +3,16 @@ """ from __future__ import unicode_literals +import ssl +from urltools import compare # noqa from django.core.urlresolvers import reverse from django.test import TestCase -import ssl if hasattr(ssl, '_create_unverified_context'): ssl._create_default_https_context = ssl._create_unverified_context # noqa pylint: disable=protected-access -from urltools import compare # noqa - class TestURLs(TestCase): """Verify project level URL configuration.""" diff --git a/ui/tests/test_ga.py b/ui/tests/test_ga.py index edf8d7d4..61881a34 100644 --- a/ui/tests/test_ga.py +++ b/ui/tests/test_ga.py @@ -3,10 +3,10 @@ """ from __future__ import unicode_literals -from learningresources.tests.base import LoreTestCase - from django.test.utils import override_settings +from learningresources.tests.base import LoreTestCase + class TestGoogleAnalytics(LoreTestCase): """Test the Google Analytics setting.""" diff --git a/ui/tests/test_learningresources_views.py b/ui/tests/test_learningresources_views.py index c3c690b1..8b0cde71 100644 --- a/ui/tests/test_learningresources_views.py +++ b/ui/tests/test_learningresources_views.py @@ -12,14 +12,15 @@ from django.core.files.storage import default_storage from django.core.urlresolvers import resolve +from six.moves import reload_module # pylint: disable=import-error + import ui.urls +from learningresources.tests.base import LoreTestCase from learningresources.models import Repository, StaticAsset from roles.api import assign_user_to_repo_group, remove_user_from_repo_group from roles.permissions import GroupTypes from search.sorting import LoreSortingFields -from six.moves import reload_module # pylint: disable=import-error -from learningresources.tests.base import LoreTestCase HTTP_OK = 200 UNAUTHORIZED = 403 From 4e263c54f84559e59b8749fa8b5782c38e96d0f2 Mon Sep 17 00:00:00 2001 From: Giovanni Di Milia Date: Thu, 21 Jan 2016 12:08:53 -0500 Subject: [PATCH 2/6] Fixed requests installation --- Dockerfile | 8 ++++++-- apt.txt | 3 +-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index c56acf29..06466998 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,8 +8,12 @@ WORKDIR /tmp COPY apt.txt /tmp/apt.txt RUN apt-get update &&\ apt-get install -y $(grep -vE "^\s*#" apt.txt | tr "\n" " ") &&\ - ln -s /usr/bin/nodejs /usr/bin/node &&\ - pip install pip --upgrade + ln -s /usr/bin/nodejs /usr/bin/node + +# Install pip +RUN curl --silent --location https://bootstrap.pypa.io/get-pip.py > get-pip.py &&\ + python3 get-pip.py &&\ + python get-pip.py # Add non-root user. RUN adduser --disabled-password --gecos "" mitodl diff --git a/apt.txt b/apt.txt index 989ef821..dbc2436b 100644 --- a/apt.txt +++ b/apt.txt @@ -1,9 +1,8 @@ # Core requirements +curl git libpq-dev -python-pip -python3-pip python-dev python3-dev npm From e668808bb3d664c1b05e0e3827ebd1ca850e7ea9 Mon Sep 17 00:00:00 2001 From: Giovanni Di Milia Date: Thu, 21 Jan 2016 23:37:12 -0500 Subject: [PATCH 3/6] Added sorting by relevance (_score) --- rest/serializers.py | 1 + rest/tests/test_search.py | 39 ++++++++++++++++++++--------- search/sorting.py | 6 +++-- search/tests/test_sorting.py | 26 ++++++++++++++++++- search/utils.py | 48 ++++++++++++++++++++++++------------ 5 files changed, 90 insertions(+), 30 deletions(-) diff --git a/rest/serializers.py b/rest/serializers.py index fadfb03a..5b43982c 100644 --- a/rest/serializers.py +++ b/rest/serializers.py @@ -335,3 +335,4 @@ class RepositorySearchSerializer(Serializer): description = CharField() description_path = CharField() preview_url = CharField() + score = FloatField() diff --git a/rest/tests/test_search.py b/rest/tests/test_search.py index 3d777b9d..4dad0796 100644 --- a/rest/tests/test_search.py +++ b/rest/tests/test_search.py @@ -20,6 +20,8 @@ from search.utils import recreate_index from taxonomy.models import Term, Vocabulary, make_vocab_key +# pylint: disable=too-many-statements + class TestSearch(RESTTestCase): """ @@ -29,6 +31,9 @@ class TestSearch(RESTTestCase): def assert_result_equal(self, result, resource): """Helper method to assert result == resource.""" + # remove the score from the result because + # it is meaningless for the tests + del result['score'] self.assertEqual( { 'course': resource.course.course_number, @@ -166,30 +171,42 @@ def test_sortby(self): resource1.xa_avg_grade = 2.0 resource1.xa_nr_attempts = 4 resource1.xa_nr_views = 1000 - resource1.title = '22222' + resource1.title = '22222 aaaa bbbb' resource1.save() resource2.xa_avg_grade = 4.0 resource2.xa_nr_attempts = 1 resource2.xa_nr_views = 100 - resource2.title = '11111' + resource2.title = '11111 aaaa' resource2.save() resource3.xa_avg_grade = 2.0 resource3.xa_nr_attempts = 4 resource3.xa_nr_views = 1000 - resource3.title = '00000' + resource3.title = '00000 bbbb' resource3.save() - # Default sorting should be by nr_views, descending, then id ascending. + # Default sorting should be by relevance and score + # is null without an actual search default_results = self.get_results()['results'] - self.assertEqual(default_results[0]['id'], resource1.id) - self.assertEqual(default_results[1]['id'], resource3.id) - self.assertEqual(default_results[2]['id'], resource2.id) - - nr_views_results = self.get_results( - sortby=LoreSortingFields.SORT_BY_NR_VIEWS[0])['results'] - self.assertEqual(default_results, nr_views_results) + for default_result in default_results: + self.assertIsNone(default_result['score']) + + # same thing if the sort by relevance is specified + relevance_results = self.get_results( + sortby=LoreSortingFields.SORT_BY_RELEVANCE[0])['results'] + for relevance_result in relevance_results: + self.assertIsNone(relevance_result['score']) + + # make a specific search + relevance_results = self.get_results('aaaa')['results'] + for relevance_result in relevance_results: + self.assertIsNotNone(relevance_result['score']) + self.assertEqual(len(relevance_results), 2) + self.assertGreaterEqual( + relevance_results[0]['score'], + relevance_results[1]['score'] + ) avg_grade_results = self.get_results( sortby=LoreSortingFields.SORT_BY_AVG_GRADE[0])['results'] diff --git a/search/sorting.py b/search/sorting.py index d117ab4c..3daba259 100644 --- a/search/sorting.py +++ b/search/sorting.py @@ -14,8 +14,9 @@ class LoreSortingFields(object): SORT_BY_NR_ATTEMPTS = ('nr_attempts', 'Number of Attempts (desc)', '-') SORT_BY_AVG_GRADE = ('avg_grade', 'Average Grade (desc)', '-') SORT_BY_TITLE = ('titlesort', 'Title (asc)', '') + SORT_BY_RELEVANCE = ('_score', 'Relevance', '') - DEFAULT_SORTING_FIELD = SORT_BY_NR_VIEWS[0] + DEFAULT_SORTING_FIELD = SORT_BY_RELEVANCE[0] # base sorting field in case the applied sorting is working on equal values BASE_SORTING_FIELD = 'id' @@ -29,7 +30,8 @@ def all_sorting_options(cls): cls.SORT_BY_NR_VIEWS, cls.SORT_BY_NR_ATTEMPTS, cls.SORT_BY_AVG_GRADE, - cls.SORT_BY_TITLE + cls.SORT_BY_TITLE, + cls.SORT_BY_RELEVANCE, ] @classmethod diff --git a/search/tests/test_sorting.py b/search/tests/test_sorting.py index 87f89bb8..363de69b 100644 --- a/search/tests/test_sorting.py +++ b/search/tests/test_sorting.py @@ -21,6 +21,7 @@ def test_all_sorting_options(self): LoreSortingFields.SORT_BY_NR_ATTEMPTS, LoreSortingFields.SORT_BY_AVG_GRADE, LoreSortingFields.SORT_BY_TITLE, + LoreSortingFields.SORT_BY_RELEVANCE, ] ) @@ -33,6 +34,7 @@ def test_all_sorting_fields(self): LoreSortingFields.SORT_BY_NR_ATTEMPTS[0], LoreSortingFields.SORT_BY_AVG_GRADE[0], LoreSortingFields.SORT_BY_TITLE[0], + LoreSortingFields.SORT_BY_RELEVANCE[0], ] ) @@ -62,9 +64,15 @@ def test_get_sorting_option(self): ), LoreSortingFields.SORT_BY_TITLE ) + self.assertEqual( + LoreSortingFields.get_sorting_option( + LoreSortingFields.SORT_BY_RELEVANCE[0] + ), + LoreSortingFields.SORT_BY_RELEVANCE + ) self.assertEqual( LoreSortingFields.get_sorting_option('foo_field'), - LoreSortingFields.SORT_BY_NR_VIEWS + LoreSortingFields.SORT_BY_RELEVANCE ) def test_all_sorting_options_but(self): @@ -77,6 +85,7 @@ def test_all_sorting_options_but(self): LoreSortingFields.SORT_BY_NR_ATTEMPTS, LoreSortingFields.SORT_BY_AVG_GRADE, LoreSortingFields.SORT_BY_TITLE, + LoreSortingFields.SORT_BY_RELEVANCE, ] ) self.assertEqual( @@ -87,6 +96,7 @@ def test_all_sorting_options_but(self): LoreSortingFields.SORT_BY_NR_VIEWS, LoreSortingFields.SORT_BY_AVG_GRADE, LoreSortingFields.SORT_BY_TITLE, + LoreSortingFields.SORT_BY_RELEVANCE, ] ) self.assertEqual( @@ -97,6 +107,7 @@ def test_all_sorting_options_but(self): LoreSortingFields.SORT_BY_NR_VIEWS, LoreSortingFields.SORT_BY_NR_ATTEMPTS, LoreSortingFields.SORT_BY_TITLE, + LoreSortingFields.SORT_BY_RELEVANCE, ] ) self.assertEqual( @@ -107,6 +118,18 @@ def test_all_sorting_options_but(self): LoreSortingFields.SORT_BY_NR_VIEWS, LoreSortingFields.SORT_BY_NR_ATTEMPTS, LoreSortingFields.SORT_BY_AVG_GRADE, + LoreSortingFields.SORT_BY_RELEVANCE, + ] + ) + self.assertEqual( + LoreSortingFields.all_sorting_options_but( + LoreSortingFields.SORT_BY_RELEVANCE[0] + ), + [ + LoreSortingFields.SORT_BY_NR_VIEWS, + LoreSortingFields.SORT_BY_NR_ATTEMPTS, + LoreSortingFields.SORT_BY_AVG_GRADE, + LoreSortingFields.SORT_BY_TITLE, ] ) self.assertEqual( @@ -116,5 +139,6 @@ def test_all_sorting_options_but(self): LoreSortingFields.SORT_BY_NR_ATTEMPTS, LoreSortingFields.SORT_BY_AVG_GRADE, LoreSortingFields.SORT_BY_TITLE, + LoreSortingFields.SORT_BY_RELEVANCE, ] ) diff --git a/search/utils.py b/search/utils.py index cbc684ea..c3d2c9c4 100644 --- a/search/utils.py +++ b/search/utils.py @@ -6,7 +6,7 @@ from collections import defaultdict import logging -from itertools import islice +from itertools import islice # pylint: disable=no-name-in-module from lxml import etree @@ -22,6 +22,7 @@ from rest.serializers import RepositorySearchSerializer from search.exceptions import ReindexException from search.search_indexes import get_course_metadata +from search.sorting import LoreSortingFields from search.tasks import refresh_index as _refresh_index from taxonomy.models import Vocabulary, Term, make_vocab_key @@ -33,6 +34,7 @@ _CONN = None _CONN_VERIFIED = False PAGE_LENGTH = 10 +META_FIELDS_IN_RESULT = ('score',) def get_vocab_ids(repo_slug=None): @@ -168,21 +170,33 @@ def search_index(tokens=None, repo_slug=None, sort_by=None, terms=None): search = search.query("match", repository=repo_slug) if sort_by is None: # Always sort by ID to preserve ordering. - search = search.sort("id") + search = search.sort(LoreSortingFields.BASE_SORTING_FIELD) + # Temporary workaround; the values in sorting.py should be updated, + # but for now Haystack is still using them. Also, the hyphen is + # required because we sort the numeric values high to low. + elif sort_by in ( + LoreSortingFields.SORT_BY_RELEVANCE[0], + LoreSortingFields.SORT_BY_TITLE[0] + ): + # special case when the sorting is by score with an empty search: + # in this case the score does not make any sense + if (sort_by == LoreSortingFields.SORT_BY_RELEVANCE[0] and + tokens is None): + search = search.sort(LoreSortingFields.BASE_SORTING_FIELD) + else: + search = search.sort( + sort_by, LoreSortingFields.BASE_SORTING_FIELD) else: - # Temporary workaround; the values in sorting.py should be updated, - # but for now Haystack is still using them. Also, the hyphen is - # required because we sort the numeric values high to low. - if "title" not in sort_by: - reverse = sort_by.startswith("-") - if reverse: - sort_by = sort_by[1:] - if "xa" not in sort_by: - sort_by = "xa_{0}".format(sort_by) - if reverse: - sort_by = "-{0}".format(sort_by) + + reverse = sort_by.startswith("-") + if reverse: + sort_by = sort_by[1:] + if "xa" not in sort_by: + sort_by = "xa_{0}".format(sort_by) + if reverse: + sort_by = "-{0}".format(sort_by) # Always sort by ID to preserve ordering. - search = search.sort(sort_by, "id") + search = search.sort(sort_by, LoreSortingFields.BASE_SORTING_FIELD) vocab_ids = set(get_vocab_ids(repo_slug=repo_slug)) for vocab_id in vocab_ids: @@ -199,7 +213,6 @@ def search_index(tokens=None, repo_slug=None, sort_by=None, terms=None): search.aggs.bucket( '{key}_builtins'.format(key=key), "terms", field=key ) - return SearchResults(search) @@ -413,7 +426,10 @@ def __getitem__(self, i): for hit in hits: for field_name in _get_field_names(): - setattr(hit, field_name, getattr(hit, field_name)[0]) + if field_name not in META_FIELDS_IN_RESULT: + setattr(hit, field_name, getattr(hit, field_name)[0]) + else: + setattr(hit, field_name, getattr(hit.meta, field_name)) if isinstance(i, slice): return hits From c2720f1a6e9416b3cc6eccf8e7337270932c57bd Mon Sep 17 00:00:00 2001 From: pwilkins Date: Mon, 25 Jan 2016 10:54:29 -0500 Subject: [PATCH 4/6] Release 0.15.0 - Added sorting by relevance ``(_score)``. - Fixed requests installation. - Fixed: new pylint 1.5.0 violations. --- RELEASE.rst | 7 +++++++ lore/settings.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/RELEASE.rst b/RELEASE.rst index 0510ad2d..5333a3ed 100644 --- a/RELEASE.rst +++ b/RELEASE.rst @@ -1,6 +1,13 @@ Release Notes ------------- +Version 0.15.0 +============== + +- Added sorting by relevance ``(_score)``. +- Fixed requests installation. +- Fixed new pylint 1.5.0 violations. + Version 0.14.1 ============== diff --git a/lore/settings.py b/lore/settings.py index 5793e03d..1fa88491 100644 --- a/lore/settings.py +++ b/lore/settings.py @@ -15,7 +15,7 @@ from django.core.exceptions import ImproperlyConfigured import yaml -VERSION = '0.14.1' +VERSION = '0.15.0' CONFIG_PATHS = [ os.environ.get('LORE_CONFIG', ''), From f09bad8e402bd7d346bb578ebd0da634ffab9b95 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Mon, 25 Jan 2016 15:58:12 -0500 Subject: [PATCH 5/6] Version lock doc_requirements packages --- doc_requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc_requirements.txt b/doc_requirements.txt index a6aac2df..c6ab5e97 100644 --- a/doc_requirements.txt +++ b/doc_requirements.txt @@ -1,4 +1,4 @@ -r requirements.txt -sphinx>=1.3.1 -sphinx_bootstrap_theme>=0.4.5 -sphinxcontrib-napoleon>=0.3.5 +sphinx==1.3.1 +sphinx_bootstrap_theme==0.4.5 +sphinxcontrib-napoleon==0.3.5 From 2fadcad92ec933fbc276f56a6b205cc5394a2b2f Mon Sep 17 00:00:00 2001 From: pwilkins Date: Mon, 25 Jan 2016 16:50:06 -0500 Subject: [PATCH 6/6] Release 0.15.1 - Version locked ``doc_requirements`` packages. --- RELEASE.rst | 5 +++++ lore/settings.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/RELEASE.rst b/RELEASE.rst index 5333a3ed..d9954a00 100644 --- a/RELEASE.rst +++ b/RELEASE.rst @@ -1,6 +1,11 @@ Release Notes ------------- +Version 0.15.1 +============== + +- Version locked ``doc_requirements`` packages. + Version 0.15.0 ============== diff --git a/lore/settings.py b/lore/settings.py index 1fa88491..7d8b0596 100644 --- a/lore/settings.py +++ b/lore/settings.py @@ -15,7 +15,7 @@ from django.core.exceptions import ImproperlyConfigured import yaml -VERSION = '0.15.0' +VERSION = '0.15.1' CONFIG_PATHS = [ os.environ.get('LORE_CONFIG', ''),