diff --git a/.zuul.yaml b/.zuul.yaml index c4681084..759ee9d6 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -89,8 +89,10 @@ - tox-pep8 - tox-py36: timeout: 6000 + nodeset: ubuntu-bionic - tox-py37: timeout: 6000 + nodeset: ubuntu-bionic - tox-py38: timeout: 6000 - opendev-buildset-registry @@ -101,8 +103,10 @@ - tox-pep8 - tox-py36: timeout: 6000 + nodeset: ubuntu-bionic - tox-py37: timeout: 6000 + nodeset: ubuntu-bionic - tox-py38: timeout: 6000 - opendev-buildset-registry diff --git a/doc/requirements.txt b/doc/requirements.txt index aea0a6e9..d5e78edc 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,6 +1,8 @@ # The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. +jinja2<3.0.0 +MarkupSafe<2.1.0 sphinx<2.0.0 sphinxcontrib-pecanwsme>=0.5 openstackdocstheme diff --git a/storyboard/db/models.py b/storyboard/db/models.py index 1fb8f77b..ad876d2e 100644 --- a/storyboard/db/models.py +++ b/storyboard/db/models.py @@ -310,6 +310,45 @@ story_storytags = Table( ) +# Time-line models + +class TimeLineEvent(ModelBuilder, Base): + __tablename__ = 'events' + + story_id = Column(Integer, ForeignKey('stories.id'), nullable=True) + worklist_id = Column(Integer, ForeignKey('worklists.id'), nullable=True) + board_id = Column(Integer, ForeignKey('boards.id'), nullable=True) + comment_id = Column(Integer, ForeignKey('comments.id'), nullable=True) + comment = relationship('Comment', backref='event') + author_id = Column(Integer, ForeignKey('users.id'), nullable=True) + + event_type = Column(Enum(*event_types.ALL), nullable=False) + + # this info field should contain additional fields to describe the event + # ex. {'old_status': 'Todo', 'new_status': 'In progress'} + # or {'old_assignee_id': 1, 'new_assignee_id': 42} + event_info = Column(UnicodeText(), nullable=True) + + +class Comment(FullText, ModelBuilder, Base): + __fulltext_columns__ = ['content'] + + id = Column(Integer, primary_key=True) + content = Column(MYSQL_MEDIUM_TEXT) + is_active = Column(Boolean, default=True) + in_reply_to = Column(Integer, ForeignKey('comments.id')) + parent = relationship('Comment', remote_side=[id], backref='children') + + +class HistoricalComment(FullText, ModelBuilder, Base): + __tablename__ = 'comments_history' + __fulltext_columns__ = ['content'] + + content = Column(MYSQL_MEDIUM_TEXT) + comment_id = Column(Integer, ForeignKey('comments.id'), nullable=False) + current = relationship(Comment, backref='history') + + class Story(FullText, ModelBuilder, Base): __tablename__ = 'stories' @@ -526,45 +565,6 @@ class StorySummary(Base): "task_statuses"] -# Time-line models - -class TimeLineEvent(ModelBuilder, Base): - __tablename__ = 'events' - - story_id = Column(Integer, ForeignKey('stories.id'), nullable=True) - worklist_id = Column(Integer, ForeignKey('worklists.id'), nullable=True) - board_id = Column(Integer, ForeignKey('boards.id'), nullable=True) - comment_id = Column(Integer, ForeignKey('comments.id'), nullable=True) - comment = relationship('Comment', backref='event') - author_id = Column(Integer, ForeignKey('users.id'), nullable=True) - - event_type = Column(Enum(*event_types.ALL), nullable=False) - - # this info field should contain additional fields to describe the event - # ex. {'old_status': 'Todo', 'new_status': 'In progress'} - # or {'old_assignee_id': 1, 'new_assignee_id': 42} - event_info = Column(UnicodeText(), nullable=True) - - -class Comment(FullText, ModelBuilder, Base): - __fulltext_columns__ = ['content'] - - id = Column(Integer, primary_key=True) - content = Column(MYSQL_MEDIUM_TEXT) - is_active = Column(Boolean, default=True) - in_reply_to = Column(Integer, ForeignKey('comments.id')) - parent = relationship('Comment', remote_side=[id], backref='children') - - -class HistoricalComment(FullText, ModelBuilder, Base): - __tablename__ = 'comments_history' - __fulltext_columns__ = ['content'] - - content = Column(MYSQL_MEDIUM_TEXT) - comment_id = Column(Integer, ForeignKey('comments.id'), nullable=False) - current = relationship(Comment, backref='history') - - # Subscription and notifications class Subscription(ModelBuilder, Base): diff --git a/storyboard/db/projects_loader.py b/storyboard/db/projects_loader.py index 4a542a8a..61996d1a 100644 --- a/storyboard/db/projects_loader.py +++ b/storyboard/db/projects_loader.py @@ -38,7 +38,7 @@ LOG = log.getLogger(__name__) def do_load_models(filename): config_file = open(filename) session = db_api.get_session(autocommit=False, in_request=False) - projects_list = yaml.load(config_file) + projects_list = yaml.safe_load(config_file) project_groups = list() diff --git a/storyboard/tests/api/test_project_groups.py b/storyboard/tests/api/test_project_groups.py index d908218b..1b37043a 100644 --- a/storyboard/tests/api/test_project_groups.py +++ b/storyboard/tests/api/test_project_groups.py @@ -151,7 +151,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual('projectgroup2', result['name']) @@ -164,7 +164,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -179,7 +179,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -196,7 +196,7 @@ class TestProjectGroupSearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -224,7 +224,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(3, result['id']) @@ -242,7 +242,7 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -259,4 +259,4 @@ class TestProjectGroupSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) diff --git a/storyboard/tests/api/test_projects.py b/storyboard/tests/api/test_projects.py index 6b1ea10b..e9c6a7eb 100644 --- a/storyboard/tests/api/test_projects.py +++ b/storyboard/tests/api/test_projects.py @@ -143,7 +143,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_name(self): url = self.build_search_url({ @@ -153,7 +153,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual('project1', result['name']) @@ -166,7 +166,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -181,7 +181,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -197,7 +197,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -210,7 +210,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_limit(self): url = self.build_search_url({ @@ -222,7 +222,7 @@ class TestProjectSearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -250,7 +250,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(3, result['id']) @@ -268,7 +268,7 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -285,4 +285,4 @@ class TestProjectSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) diff --git a/storyboard/tests/api/test_stories.py b/storyboard/tests/api/test_stories.py index d3cb1bed..6995fd30 100644 --- a/storyboard/tests/api/test_stories.py +++ b/storyboard/tests/api/test_stories.py @@ -253,7 +253,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_title(self): url = self.build_search_url({ @@ -263,7 +263,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -278,7 +278,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -293,7 +293,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -304,7 +304,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -319,7 +319,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -334,7 +334,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -349,7 +349,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -401,7 +401,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_limit(self): url = self.build_search_url({ @@ -413,7 +413,7 @@ class TestStorySearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -441,7 +441,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(5, result['id']) @@ -463,7 +463,7 @@ class TestStorySearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) diff --git a/storyboard/tests/api/test_task_statuses.py b/storyboard/tests/api/test_task_statuses.py index 8f6e90b8..4b10d265 100644 --- a/storyboard/tests/api/test_task_statuses.py +++ b/storyboard/tests/api/test_task_statuses.py @@ -36,7 +36,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_name(self): """Test searching by various names.""" @@ -49,7 +49,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) # Assert that searching by 'task status' or some permutation works. url = self.build_search_url({ @@ -59,7 +59,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) url = self.build_search_url({ 'name': 'stat' @@ -68,7 +68,7 @@ class TestTaskStatusesSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(5, len(results.json)) self.assertEqual('5', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_constrain(self): """Test constraint searches.""" diff --git a/storyboard/tests/api/test_tasks.py b/storyboard/tests/api/test_tasks.py index f457855e..780b7a64 100644 --- a/storyboard/tests/api/test_tasks.py +++ b/storyboard/tests/api/test_tasks.py @@ -423,7 +423,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(4, len(results.json)) self.assertEqual('4', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_by_title(self): url = self.build_search_url({ @@ -433,7 +433,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -448,7 +448,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -465,7 +465,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(1, len(results.json)) self.assertEqual('1', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -478,7 +478,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -493,7 +493,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -510,7 +510,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -523,7 +523,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(3, len(results.json)) self.assertEqual('3', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -540,7 +540,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -553,7 +553,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(2, len(results.json)) self.assertEqual('2', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(2, result['id']) @@ -568,7 +568,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(0, len(results.json)) self.assertEqual('0', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) def test_search_limit(self): url = self.build_search_url({ @@ -580,7 +580,7 @@ class TestTaskSearch(base.FunctionalTest): self.assertEqual(1, len(results.json)) self.assertEqual('2', results.headers['X-Total']) self.assertEqual('1', results.headers['X-Limit']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -608,7 +608,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(4, len(results.json)) self.assertEqual('4', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(1, result['id']) @@ -628,7 +628,7 @@ class TestTaskSearch(base.FunctionalTest): results = self.get_json(url, expect_errors=True) self.assertEqual(4, len(results.json)) self.assertEqual('4', results.headers['X-Total']) - self.assertFalse('X-Marker' in results.headers) + self.assertNotIn('X-Marker', results.headers) result = results.json[0] self.assertEqual(4, result['id']) diff --git a/storyboard/tests/db/migration/test_unique_revisions.py b/storyboard/tests/db/migration/test_unique_revisions.py index 4f565e4a..8c3a3ba4 100644 --- a/storyboard/tests/db/migration/test_unique_revisions.py +++ b/storyboard/tests/db/migration/test_unique_revisions.py @@ -43,13 +43,13 @@ class UniqueRevisionsTestCase(testtools.TestCase): module = imp.load_source('module', six.text_type(module_path)) revision_id = module.revision - self.assertFalse(revision_id in revisions, + self.assertNotIn(revision_id, revisions, "Found two revisions with id %s" % revision_id) revisions.add(revision_id) down_revision_id = module.revision - self.assertFalse(down_revision_id in down_revisions, + self.assertNotIn(down_revision_id, down_revisions, "Found two revisions with down_revision_id %s" % revision_id) down_revisions.add(down_revision_id) diff --git a/storyboard/tests/plugin/test_user_preferences.py b/storyboard/tests/plugin/test_user_preferences.py index 7cc76dd3..d6a94d96 100644 --- a/storyboard/tests/plugin/test_user_preferences.py +++ b/storyboard/tests/plugin/test_user_preferences.py @@ -53,9 +53,9 @@ class TestUserPreferencesPluginBase(base.TestCase): self.assertEqual(2, len(manager.extensions)) manager.map(prefs_base.load_preferences, loaded_prefs) - self.assertTrue("foo" in loaded_prefs) - self.assertTrue("omg" in loaded_prefs) - self.assertTrue("lol" in loaded_prefs) + self.assertIn("foo", loaded_prefs) + self.assertIn("omg", loaded_prefs) + self.assertIn("lol", loaded_prefs) self.assertEqual(loaded_prefs["foo"], "baz") self.assertEqual(loaded_prefs["omg"], "wat") diff --git a/tox.ini b/tox.ini index 00b9d984..18f16cef 100644 --- a/tox.ini +++ b/tox.ini @@ -54,8 +54,9 @@ commands = # The following rules should either be addressed or determined to be # skippable long term. # E265 is ignored to make switch to newer hacking easier +# H216 is ignored to allow use of the mock library instead of unittest.mock # H405 is ignored to make switch to newer hacking easier -ignore = E125,E128,E265,H405,W503 +ignore = E125,E128,E265,H216,H405,W503 builtins = _ show-source = True exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build