diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..9b0bc3d5 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Tests + +on: + push: + branches: [speed.python.org] + pull_request: + branches: [speed.python.org] + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 + with: + python-version: "3.13" + - run: pip install -r requirements-dev.txt + - run: flake8 codespeed + + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.12", "3.13", "3.14"] + django: ["5.2", "6.1"] + name: Python ${{ matrix.python-version }} / Django ${{ matrix.django }} + env: + DJANGO_SETTINGS_MODULE: sample_project.settings + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0 + with: + python-version: ${{ matrix.python-version }} + - run: pip install -r requirements.txt "django==${{ matrix.django }}.*" + - run: python manage.py test codespeed diff --git a/.gitignore b/.gitignore index 744c888c..c60b703f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ override build dist *.egg-info +.venv*/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3295e1ba..00000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: python -branches: - only: - - master -env: - global: - - DJANGO_SETTINGS_MODULE=sample_project.settings -matrix: - include: - - python: "2.7" - env: DJANGO_VERSION=1.11 - - python: "3.5" - env: DJANGO_VERSION=1.11 - - python: "3.5" - env: DJANGO_VERSION=2.1 -install: - - pip install flake8 mock - - pip install -q Django==$DJANGO_VERSION - - python setup.py install -before_script: - flake8 codespeed -script: - - python manage.py test codespeed diff --git a/README.md b/README.md index f9c8d61b..c4bc7e50 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Codespeed -[![Build Status](https://travis-ci.org/tobami/codespeed.png?branch=master)](https://travis-ci.org/tobami/codespeed) +[![Tests](https://github.com/python/codespeed/actions/workflows/test.yml/badge.svg)](https://github.com/python/codespeed/actions/workflows/test.yml) [![PyPI version](https://img.shields.io/pypi/v/codespeed.svg)](https://pypi.python.org/pypi/codespeed) Codespeed is a web application to monitor and analyze the performance of your code. diff --git a/codespeed/__init__.py b/codespeed/__init__.py index 8c1ca00e..e69de29b 100644 --- a/codespeed/__init__.py +++ b/codespeed/__init__.py @@ -1 +0,0 @@ -default_app_config = 'codespeed.apps.CodespeedConfig' diff --git a/codespeed/commits/__init__.py b/codespeed/commits/__init__.py index fd42ce72..6f6f0064 100644 --- a/codespeed/commits/__init__.py +++ b/codespeed/commits/__init__.py @@ -1 +1,3 @@ from .logs import get_logs, get_commit_date + +__all__ = ["get_logs", "get_commit_date"] diff --git a/codespeed/commits/logs.py b/codespeed/commits/logs.py index 753a7d75..2869ad72 100644 --- a/codespeed/commits/logs.py +++ b/codespeed/commits/logs.py @@ -16,7 +16,7 @@ def get_scm(project): elif project.repo_type == project.GIT: from .git import getlogs, updaterepo elif project.repo_type == project.GITHUB: - from .github import getlogs, updaterepo + from .github import getlogs, updaterepo # noqa: F401 else: return None @@ -51,6 +51,7 @@ def _get_commit_date(project, commit_id): return scm.get_commit_date(commit_id) + def get_commit_date(project, commit_id): date = _get_commit_date(project, commit_id) if date is not None: diff --git a/codespeed/commits/mercurial.py b/codespeed/commits/mercurial.py index f5392a6a..636af365 100644 --- a/codespeed/commits/mercurial.py +++ b/codespeed/commits/mercurial.py @@ -24,7 +24,7 @@ def update_repo(self, update=True): return p = Popen(['hg', 'pull', '-u'], stdout=PIPE, stderr=PIPE, - cwd=project.working_copy) + cwd=project.working_copy) stdout, stderr = p.communicate() if p.returncode != 0 or stderr: @@ -37,7 +37,7 @@ def update_repo(self, update=True): cmd = ['hg', 'clone', project.repo_path, project.repo_name] p = Popen(cmd, stdout=PIPE, stderr=PIPE, - cwd=settings.REPOSITORY_BASE_PATH) + cwd=settings.REPOSITORY_BASE_PATH) logger.debug('Cloning Mercurial repo {0} for project {1}'.format( project.repo_path, project)) stdout, stderr = p.communicate() @@ -52,9 +52,11 @@ def update_repo(self, update=True): def get_logs(self, endrev, startrev): self.update_repo(update=False) + template = ("{rev}:{node|short}\n{node}\n{author|user}\n" + "{author|email}\n{date}\n{desc}\n=newlog=\n") cmd = ["hg", "log", - "-r", "%s::%s" % (startrev.commitid, endrev.commitid), - "--template", "{rev}:{node|short}\n{node}\n{author|user}\n{author|email}\n{date}\n{desc}\n=newlog=\n"] + "-r", "%s::%s" % (startrev.commitid, endrev.commitid), + "--template", template] working_copy = self.project.working_copy p = Popen(cmd, @@ -86,7 +88,8 @@ def get_logs(self, endrev, startrev): # Parse date date = date.split('-')[0] - date = datetime.datetime.fromtimestamp(float(date)).strftime("%Y-%m-%d %H:%M:%S") + date = datetime.datetime.fromtimestamp( + float(date)).strftime("%Y-%m-%d %H:%M:%S") # Add changeset info logs.append({ diff --git a/codespeed/commits/tests/test_git.py b/codespeed/commits/tests/test_git.py index ad74b280..d5db51db 100644 --- a/codespeed/commits/tests/test_git.py +++ b/codespeed/commits/tests/test_git.py @@ -1,6 +1,6 @@ from datetime import datetime from django.test import TestCase, override_settings -from mock import Mock, patch +from unittest.mock import Mock, patch from codespeed.commits.git import getlogs from codespeed.models import Project, Revision, Branch, Environment @@ -57,4 +57,4 @@ def side_effect(cmd, *args, **kwargs): 'short_commit_id': 'id', 'tag': 'tag', } - self.assertEquals([expected], logs) + self.assertEqual([expected], logs) diff --git a/codespeed/fixtures/timeline_tests.json b/codespeed/fixtures/timeline_tests.json index 37fc501f..3321ef05 100644 --- a/codespeed/fixtures/timeline_tests.json +++ b/codespeed/fixtures/timeline_tests.json @@ -82,7 +82,7 @@ "commitid": "1", "tag": "", "branch": 1, - "date": "2011-04-12T16:43:20", + "date": "2011-04-12T16:43:20Z", "message": "" } }, @@ -95,7 +95,7 @@ "commitid": "2", "tag": "", "branch": 1, - "date": "2011-04-13T17:04:22", + "date": "2011-04-13T17:04:22Z", "message": "" } }, @@ -108,7 +108,7 @@ "commitid": "3", "tag": "", "branch": 2, - "date": "2011-04-13T12:03:38", + "date": "2011-04-13T12:03:38Z", "message": "" } }, @@ -121,7 +121,7 @@ "commitid": "4", "tag": "", "branch": 2, - "date": "2011-04-14T18:04:51", + "date": "2011-04-14T18:04:51Z", "message": "" } }, @@ -134,7 +134,7 @@ "commitid": "5", "tag": "", "branch": 1, - "date": "2011-04-14T19:13:05", + "date": "2011-04-14T19:13:05Z", "message": "" } }, @@ -147,7 +147,7 @@ "commitid": "1", "tag": "", "branch": 3, - "date": "2011-04-13T12:05:11", + "date": "2011-04-13T12:05:11Z", "message": "" } }, @@ -160,7 +160,7 @@ "commitid": "2", "tag": "", "branch": 3, - "date": "2011-04-14T12:05:22", + "date": "2011-04-14T12:05:22Z", "message": "" } }, @@ -173,7 +173,7 @@ "commitid": "444", "tag": "1.0", "branch": 4, - "date": "2011-05-24T09:37:32", + "date": "2011-05-24T09:37:32Z", "message": "" } }, @@ -253,7 +253,7 @@ "environment": 1, "val_min": 3995.1, "std_dev": 1.11111, - "date": "2011-04-13T19:04:00", + "date": "2011-04-13T19:04:00Z", "val_max": 4001.6, "revision": 1 } @@ -268,7 +268,7 @@ "environment": 1, "val_min": 1995.1, "std_dev": 1.11111, - "date": "2011-04-13T17:06:19", + "date": "2011-04-13T17:06:19Z", "val_max": 2001.6, "revision": 2 } @@ -283,7 +283,7 @@ "environment": 1, "val_min": 995.1, "std_dev": 1.11111, - "date": "2011-04-13T17:06:47", + "date": "2011-04-13T17:06:47Z", "val_max": 1001.6, "revision": 5 } @@ -298,7 +298,7 @@ "environment": 1, "val_min": 3995.1, "std_dev": 1.11111, - "date": "2011-04-13T19:06:11", + "date": "2011-04-13T19:06:11Z", "val_max": 4001.6, "revision": 3 } @@ -313,7 +313,7 @@ "environment": 1, "val_min": 995.1, "std_dev": 1.11111, - "date": "2011-04-13T19:11:50", + "date": "2011-04-13T19:11:50Z", "val_max": 1001.6, "revision": 6 } @@ -328,7 +328,7 @@ "environment": 1, "val_min": 2995.1, "std_dev": 1.11111, - "date": "2011-04-13T19:06:58", + "date": "2011-04-13T19:06:58Z", "val_max": 3001.6, "revision": 4 } @@ -343,7 +343,7 @@ "environment": 1, "val_min": 495.1, "std_dev": 1.11111, - "date": "2011-04-13T19:12:23", + "date": "2011-04-13T19:12:23Z", "val_max": 501.6, "revision": 7 } @@ -358,7 +358,7 @@ "environment": 1, "val_min": null, "std_dev": null, - "date": "2011-05-24T09:38:18", + "date": "2011-05-24T09:38:18Z", "val_max": null, "revision": 8 } diff --git a/codespeed/models.py b/codespeed/models.py index 2ba9336b..a3ae267d 100644 --- a/codespeed/models.py +++ b/codespeed/models.py @@ -145,7 +145,8 @@ def __str__(self): date = None else: date = self.date.isoformat(sep=" ") - string = " - ".join(filter(None, (date, self.commitid, self.tag, self.branch.name))) + string = " - ".join( + filter(None, (date, self.commitid, self.tag, self.branch.name))) return string class Meta: diff --git a/codespeed/results.py b/codespeed/results.py index 2afeed38..ff1e3d2b 100644 --- a/codespeed/results.py +++ b/codespeed/results.py @@ -2,9 +2,9 @@ from __future__ import absolute_import import logging -from datetime import datetime from django.core.exceptions import ValidationError +from django.utils import timezone from .models import (Environment, Project, Branch, Benchmark, Executable, Revision, Result, Report) @@ -52,7 +52,7 @@ def save_result(data, update_repo=True): if error: return res, True else: - assert(isinstance(res, Environment)) + assert isinstance(res, Environment) env = res p, created = Project.objects.get_or_create(name=data["project"]) @@ -119,7 +119,7 @@ def save_result(data, update_repo=True): elif rev.date: r.date = rev.date else: - r.date = datetime.now() + r.date = timezone.now() r.std_dev = data.get('std_dev') r.val_min = data.get('min') diff --git a/codespeed/tests/test_auth.py b/codespeed/tests/test_auth.py index 8e2868bc..bc2b356b 100644 --- a/codespeed/tests/test_auth.py +++ b/codespeed/tests/test_auth.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -import mock +from unittest import mock from django.test import TestCase, override_settings from django.http import HttpResponse diff --git a/codespeed/tests/test_models.py b/codespeed/tests/test_models.py index 5d116c73..df4283d0 100644 --- a/codespeed/tests/test_models.py +++ b/codespeed/tests/test_models.py @@ -104,7 +104,7 @@ def test_good_benchmark_change_beats_bad_average_trend(self): self.make_result(x, rev=s1, benchmark=b1) self.make_result(changes[-2] * .97, rev=s1, benchmark=b1) rep = self.make_report(s1) - self.assertEquals('green', rep.colorcode) + self.assertEqual('green', rep.colorcode) self.assertIn('b1', rep.summary) def test_good_average_change_beats_bad_average_trend(self): @@ -116,7 +116,7 @@ def test_good_average_change_beats_bad_average_trend(self): self.make_result(x, rev=s1, benchmark=b1) self.make_result(changes[-2] * .92, rev=s1, benchmark=b1) rep = self.make_report(s1) - self.assertEquals('green', rep.colorcode) + self.assertEqual('green', rep.colorcode) self.assertIn('Average', rep.summary) def test_good_change_beats_good_trend(self): @@ -156,7 +156,7 @@ def test_bad_change_beats_good_trend(self): rep = self.make_report(s1) self.assertIn('b1', rep.summary) self.assertNotIn('trend', rep.summary) - self.assertEquals('red', rep.colorcode) + self.assertEqual('red', rep.colorcode) def test_bad_beats_good_change(self): b1 = self.make_bench('b1') @@ -184,7 +184,7 @@ def test_bigger_bad_beats_smaller_bad(self): rep = self.make_report(s2) self.assertIn('b1', rep.summary) - self.assertEquals('red', rep.colorcode) + self.assertEqual('red', rep.colorcode) def test_multiple_quantities(self): b1 = self.make_bench('b1', quantity='Space', units='bytes') @@ -195,8 +195,8 @@ def test_multiple_quantities(self): self.make_result(1.5, rev=s2, benchmark=b1) rep = self.make_report(s2) - self.assertRegexpMatches(rep.summary, '[sS]pace') - self.assertEquals('red', rep.colorcode) + self.assertRegex(rep.summary, '[sS]pace') + self.assertEqual('red', rep.colorcode) def make_result(self, value, rev=None, benchmark=None): from uuid import uuid4 @@ -280,18 +280,18 @@ def test_github_browsing_url(self): # It should work with https:// as well as git:// urls self.github_project.save() - self.assertEquals(self.github_project.commit_browsing_url, - 'https://github.com/tobami/codespeed.git/' - 'commit/{commitid}') + self.assertEqual(self.github_project.commit_browsing_url, + 'https://github.com/tobami/codespeed.git/' + 'commit/{commitid}') self.github_project.repo_path = 'git://github.com/tobami/codespeed.git' self.github_project.save() - self.assertEquals(self.github_project.commit_browsing_url, - 'https://github.com/tobami/codespeed.git/' - 'commit/{commitid}') + self.assertEqual(self.github_project.commit_browsing_url, + 'https://github.com/tobami/codespeed.git/' + 'commit/{commitid}') # If filled in, commit browsing url should not change self.github_project.commit_browsing_url = 'https://example.com/{commitid}' self.github_project.save() - self.assertEquals(self.github_project.commit_browsing_url, - 'https://example.com/{commitid}') + self.assertEqual(self.github_project.commit_browsing_url, + 'https://example.com/{commitid}') diff --git a/codespeed/tests/test_views.py b/codespeed/tests/test_views.py index c56132be..367d2b87 100644 --- a/codespeed/tests/test_views.py +++ b/codespeed/tests/test_views.py @@ -5,6 +5,7 @@ from django.test import TestCase, override_settings from django.urls import reverse +from django.utils import timezone from codespeed.models import (Project, Benchmark, Revision, Branch, Executable, Environment, Result, Report) @@ -36,15 +37,15 @@ def test_add_correct_result(self): response = self.client.post(self.path, self.data) # Check that we get a success response - self.assertEquals(response.status_code, 202) - self.assertEquals(response.content.decode(), "Result data saved successfully") + self.assertEqual(response.status_code, 202) + self.assertEqual(response.content.decode(), "Result data saved successfully") # Check that the data was correctly saved e = Environment.objects.get(name='Dual Core') b = Benchmark.objects.get(name='float') - self.assertEquals(b.benchmark_type, "C") - self.assertEquals(b.units, "seconds") - self.assertEquals(b.lessisbetter, True) + self.assertEqual(b.benchmark_type, "C") + self.assertEqual(b.units, "seconds") + self.assertEqual(b.lessisbetter, True) p = Project.objects.get(name='MyProject') branch = Branch.objects.get(name='default', project=p) r = Revision.objects.get(commitid='23', branch=branch) @@ -68,15 +69,15 @@ def test_add_non_default_result(self): modified_data['max'] = 2 modified_data['min'] = 1.0 response = self.client.post(self.path, modified_data) - self.assertEquals(response.status_code, 202) - self.assertEquals(response.content.decode(), "Result data saved successfully") + self.assertEqual(response.status_code, 202) + self.assertEqual(response.content.decode(), "Result data saved successfully") e = Environment.objects.get(name='Dual Core') p = Project.objects.get(name='MyProject') branch = Branch.objects.get(name='default', project=p) r = Revision.objects.get(commitid='23', branch=branch) - # Tweak the resolution down to avoid failing over very slight differences: - self.assertEquals(r.date, revision_date) + # Posted datetimes are naive and interpreted in the current time zone + self.assertEqual(r.date, timezone.make_aware(revision_date)) i = Executable.objects.get(name='myexe O3 64bits') b = Benchmark.objects.get(name='float') @@ -86,19 +87,19 @@ def test_add_non_default_result(self): benchmark=b, environment=e ) - self.assertEquals(res.date, result_date) - self.assertEquals(res.std_dev, 1.11111) - self.assertEquals(res.val_max, 2) - self.assertEquals(res.val_min, 1) + self.assertEqual(res.date, timezone.make_aware(result_date)) + self.assertEqual(res.std_dev, 1.11111) + self.assertEqual(res.val_max, 2) + self.assertEqual(res.val_min, 1) def test_bad_environment(self): """Should return 400 when environment does not exist""" bad_name = '10 Core' self.data['environment'] = bad_name response = self.client.post(self.path, self.data) - self.assertEquals(response.status_code, 400) - self.assertEquals(response.content.decode(), - "Environment " + bad_name + " not found") + self.assertEqual(response.status_code, 400) + self.assertEqual(response.content.decode(), + "Environment " + bad_name + " not found") self.data['environment'] = 'Dual Core' def test_empty_argument(self): @@ -107,20 +108,20 @@ def test_empty_argument(self): backup = self.data[key] self.data[key] = "" response = self.client.post(self.path, self.data) - self.assertEquals(response.status_code, 400) - self.assertEquals( + self.assertEqual(response.status_code, 400) + self.assertEqual( response.content.decode(), 'Value for key "' + key + '" empty in request') self.data[key] = backup def test_missing_argument(self): """Should respond 400 when a POST request is missing an argument""" - for key in self.data: + for key in list(self.data): backup = self.data[key] - del(self.data[key]) + del self.data[key] response = self.client.post(self.path, self.data) - self.assertEquals(response.status_code, 400) - self.assertEquals( + self.assertEqual(response.status_code, 400) + self.assertEqual( response.content.decode(), 'Key "' + key + '" missing from request') self.data[key] = backup @@ -130,7 +131,7 @@ def test_report_is_not_created(self): self.client.post(self.path, self.data) number_of_reports = len(Report.objects.all()) # After adding one result for one revision, there should be no reports - self.assertEquals(number_of_reports, 0) + self.assertEqual(number_of_reports, 0) def test_report_is_created(self): """Should create a report when adding a result for two revisions""" @@ -142,15 +143,15 @@ def test_report_is_created(self): # Second result should trigger report creation self.client.post(self.path, modified_data) number_of_reports = len(Report.objects.all()) - self.assertEquals(number_of_reports, 1) + self.assertEqual(number_of_reports, 1) def test_submit_data_with_none_timestamp(self): """Should add a default revision date when timestamp is None""" modified_data = copy.deepcopy(self.data) - # The value None will get urlencoded and converted to a "None" string - modified_data['revision_date'] = None + # Older clients urlencoded None as the string "None" + modified_data['revision_date'] = "None" response = self.client.post(self.path, modified_data) - self.assertEquals(response.status_code, 202) + self.assertEqual(response.status_code, 202) def test_add_result_with_no_project(self): """Should add a revision with the project""" @@ -158,8 +159,8 @@ def test_add_result_with_no_project(self): modified_data['project'] = "My new project" modified_data['executable'] = "My new executable" response = self.client.post(self.path, modified_data) - self.assertEquals(response.status_code, 202) - self.assertEquals( + self.assertEqual(response.status_code, 202) + self.assertEqual( response.content.decode(), "Result data saved successfully") @@ -210,7 +211,7 @@ def test_get_returns_405(self): response = self.client.get(self.path, {'json': json.dumps(self.data)}) - self.assertEquals(response.status_code, 405) + self.assertEqual(response.status_code, 405) def test_add_correct_results(self): """Should add all results when the request data is valid""" @@ -218,16 +219,16 @@ def test_add_correct_results(self): {'json': json.dumps(self.data)}) # Check that we get a success response - self.assertEquals(response.status_code, 202) - self.assertEquals(response.content.decode(), - "All result data saved successfully") + self.assertEqual(response.status_code, 202) + self.assertEqual(response.content.decode(), + "All result data saved successfully") # Check that the data was correctly saved e = Environment.objects.get(name='bigdog') b = Benchmark.objects.get(name='Richards') - self.assertEquals(b.benchmark_type, "C") - self.assertEquals(b.units, "seconds") - self.assertEquals(b.lessisbetter, True) + self.assertEqual(b.benchmark_type, "C") + self.assertEqual(b.units, "seconds") + self.assertEqual(b.lessisbetter, True) p = Project.objects.get(name='pypy') branch = Branch.objects.get(name='default', project=p) r = Revision.objects.get(commitid='123', branch=branch) @@ -271,8 +272,8 @@ def test_bad_environment(self): response = self.client.post(self.path, {'json': json.dumps(self.data)}) - self.assertEquals(response.status_code, 400) - self.assertEquals( + self.assertEqual(response.status_code, 400) + self.assertEqual( response.content.decode(), "Environment " + bad_name + " not found") data['environment'] = 'bigdog' @@ -284,8 +285,8 @@ def test_empty_argument(self): data[key] = "" response = self.client.post(self.path, {'json': json.dumps(self.data)}) - self.assertEquals(response.status_code, 400) - self.assertEquals( + self.assertEqual(response.status_code, 400) + self.assertEqual( response.content.decode(), 'Value for key "' + key + '" empty in request') data[key] = backup @@ -293,13 +294,13 @@ def test_empty_argument(self): def test_missing_argument(self): '''Should return 400 when making a request with a missing argument''' data = self.data[2] - for key in data: + for key in list(data): backup = data[key] - del(data[key]) + del data[key] response = self.client.post(self.path, {'json': json.dumps(self.data)}) - self.assertEquals(response.status_code, 400) - self.assertEquals( + self.assertEqual(response.status_code, 400) + self.assertEqual( response.content.decode(), 'Key "' + key + '" missing from request') data[key] = backup @@ -310,13 +311,13 @@ def test_report_is_created(self): {'json': json.dumps(self.data)}) # Check that we get a success response - self.assertEquals(response.status_code, 202) + self.assertEqual(response.status_code, 202) number_of_reports = len(Report.objects.all()) # After adding 4 result for 3 revisions, only 2 reports should be created # The third revision will need an extra result for Richards2 in order # to trigger report creation - self.assertEquals(number_of_reports, 1) + self.assertEqual(number_of_reports, 1) class TestTimeline(TestCase): @@ -326,17 +327,17 @@ def test_fixture(self): """Test the loaded fixture data """ env = Environment.objects.filter(name="Dual Core") - self.assertEquals(len(env), 1) + self.assertEqual(len(env), 1) benchmarks = Benchmark.objects.filter(name="float") - self.assertEquals(len(benchmarks), 1) - self.assertEquals(benchmarks[0].units, "seconds") + self.assertEqual(len(benchmarks), 1) + self.assertEqual(benchmarks[0].units, "seconds") results = benchmarks[0].results.all() - self.assertEquals(len(results), 8) + self.assertEqual(len(results), 8) def test_timeline(self): path = reverse('timeline') response = self.client.get(path) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) responsedata = response.content.decode() self.assertIn('My Own Title\n: Timeline', responsedata) @@ -352,28 +353,28 @@ def test_gettimelinedata(self): "revs": "2" } response = self.client.get(path, data) - self.assertEquals(response.status_code, 200) + self.assertEqual(response.status_code, 200) responsedata = json.loads(response.getvalue().decode()) - self.assertEquals( + self.assertEqual( responsedata['error'], "None", "there should be no errors") - self.assertEquals( + self.assertEqual( len(responsedata['timelines']), 1, "there should be 1 benchmark") - self.assertEquals( + self.assertEqual( len(responsedata['timelines'][0]['branches']), 2, "there should be 2 branches") - self.assertEquals( + self.assertEqual( len(responsedata['timelines'][0]['branches']['default']), 1, "there should be 1 timeline for master") - self.assertEquals( + self.assertEqual( len(responsedata['timelines'][0]['branches']['master']['1']), 2, "There are 2 datapoints") - self.assertEquals( + self.assertEqual( responsedata['timelines'][0]['branches']['master']['1'][1], - [u'2011/04/13 17:04:22 ', 2000.0, 1.11111, u'2', u'', u'master']) + [u'2011/04/13 17:04:22 +0000', 2000.0, 1.11111, u'2', u'', u'master']) @override_settings(ALLOW_ANONYMOUS_POST=True) diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..39304807 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1 @@ +flake8 diff --git a/requirements.txt b/requirements.txt index 7a9d1bce..ea4a6b19 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -django<4 +django>=5.2,<7 isodate==0.6.1 -matplotlib<3.8 +matplotlib