squad 1.72.2__tar.gz → 1.74__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {squad-1.72.2 → squad-1.74}/CHANGELOG.md +39 -0
- {squad-1.72.2/squad.egg-info → squad-1.74}/PKG-INFO +1 -1
- {squad-1.72.2 → squad-1.74}/squad/api/rest.py +19 -10
- {squad-1.72.2 → squad-1.74}/squad/ci/backend/lava.py +2 -2
- {squad-1.72.2 → squad-1.74}/squad/ci/backend/tuxsuite.py +71 -19
- {squad-1.72.2 → squad-1.74}/squad/compat.py +14 -0
- {squad-1.72.2 → squad-1.74}/squad/core/comparison.py +25 -10
- squad-1.74/squad/core/failures.py +28 -0
- {squad-1.72.2 → squad-1.74}/squad/core/history.py +32 -26
- {squad-1.72.2 → squad-1.74}/squad/core/models.py +1 -1
- {squad-1.72.2 → squad-1.74}/squad/core/queries.py +1 -1
- {squad-1.72.2 → squad-1.74}/squad/core/tasks/__init__.py +3 -3
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/diff.txt.jinja2 +1 -1
- {squad-1.72.2 → squad-1.74}/squad/core/utils.py +1 -1
- {squad-1.72.2 → squad-1.74}/squad/frontend/comparison.py +5 -5
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_results_table.jinja2 +0 -4
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build-nav.jinja2 +0 -5
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_history.jinja2 +1 -1
- {squad-1.72.2 → squad-1.74}/squad/frontend/templatetags/squad.py +5 -6
- {squad-1.72.2 → squad-1.74}/squad/frontend/tests.py +54 -36
- {squad-1.72.2 → squad-1.74}/squad/frontend/urls.py +0 -2
- {squad-1.72.2 → squad-1.74}/squad/frontend/views.py +42 -46
- squad-1.74/squad/version.py +1 -0
- {squad-1.72.2 → squad-1.74/squad.egg-info}/PKG-INFO +1 -1
- {squad-1.72.2 → squad-1.74}/squad.egg-info/SOURCES.txt +0 -2
- {squad-1.72.2 → squad-1.74}/test/api/test_rest.py +34 -12
- {squad-1.72.2 → squad-1.74}/test/ci/backend/test_tuxsuite.py +161 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_failures.py +4 -8
- {squad-1.72.2 → squad-1.74}/test/core/test_history.py +9 -9
- {squad-1.72.2 → squad-1.74}/test/frontend/test_basics.py +12 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_history.py +8 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_tests.py +34 -0
- squad-1.72.2/squad/core/failures.py +0 -32
- squad-1.72.2/squad/frontend/failures.py +0 -65
- squad-1.72.2/squad/frontend/templates/squad/failures.jinja2 +0 -91
- squad-1.72.2/squad/version.py +0 -1
- {squad-1.72.2 → squad-1.74}/.ackrc +0 -0
- {squad-1.72.2 → squad-1.74}/.coveragerc +0 -0
- {squad-1.72.2 → squad-1.74}/.ctags +0 -0
- {squad-1.72.2 → squad-1.74}/.dockerignore +0 -0
- {squad-1.72.2 → squad-1.74}/.github/workflows/release.yml +0 -0
- {squad-1.72.2 → squad-1.74}/.github/workflows/test.yml +0 -0
- {squad-1.72.2 → squad-1.74}/.gitignore +0 -0
- {squad-1.72.2 → squad-1.74}/.mailmap +0 -0
- {squad-1.72.2 → squad-1.74}/.readthedocs.yml +0 -0
- {squad-1.72.2 → squad-1.74}/.reuse/dep5 +0 -0
- {squad-1.72.2 → squad-1.74}/COPYING +0 -0
- {squad-1.72.2 → squad-1.74}/COPYRIGHTS +0 -0
- {squad-1.72.2 → squad-1.74}/Dockerfile +0 -0
- {squad-1.72.2 → squad-1.74}/LICENSES/GPL-3.0-or-later.txt +0 -0
- {squad-1.72.2 → squad-1.74}/LICENSES/MIT.txt +0 -0
- {squad-1.72.2 → squad-1.74}/LICENSES/OFL-1.1.txt +0 -0
- {squad-1.72.2 → squad-1.74}/MANIFEST.in +0 -0
- {squad-1.72.2 → squad-1.74}/Procfile +0 -0
- {squad-1.72.2 → squad-1.74}/README.rst +0 -0
- {squad-1.72.2 → squad-1.74}/babel.cfg +0 -0
- {squad-1.72.2 → squad-1.74}/dev-docker +0 -0
- {squad-1.72.2 → squad-1.74}/doc/.gitignore +0 -0
- {squad-1.72.2 → squad-1.74}/doc/Makefile +0 -0
- {squad-1.72.2 → squad-1.74}/doc/api.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/ci.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/conf.py +0 -0
- {squad-1.72.2 → squad-1.74}/doc/hacking.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/index.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/install.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/intro.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/lava_usecase.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/plugins.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/quickstart.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/translating.rst +0 -0
- {squad-1.72.2 → squad-1.74}/doc/tuxsuite_usecase.rst +0 -0
- {squad-1.72.2 → squad-1.74}/docker-compose.yaml +0 -0
- {squad-1.72.2 → squad-1.74}/manage.py +0 -0
- {squad-1.72.2 → squad-1.74}/package-lock.json +0 -0
- {squad-1.72.2 → squad-1.74}/package.json +0 -0
- {squad-1.72.2 → squad-1.74}/pytest.ini +0 -0
- {squad-1.72.2 → squad-1.74}/requirements-dev.txt +0 -0
- {squad-1.72.2 → squad-1.74}/requirements.txt +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/build +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/check-ci +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/check-ignore +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/community_connector/main.js +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/community_connector/manifest.json +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/dogfood +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/get-metrics +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/get-tests +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/git-build +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/pytest +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/rabbitmq-server +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/release +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/release-docker +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/squad-config +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/test-ci +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/test-docker +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-ci-jobs +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-metrics +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-test-data +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-tests +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/setup-dev +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/submit-ci-jobs +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/testdata/submit-test-data +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/translate +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/travis-lava +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/update-translation-files +0 -0
- {squad-1.72.2 → squad-1.74}/scripts/upload +0 -0
- {squad-1.72.2 → squad-1.74}/setup.cfg +0 -0
- {squad-1.72.2 → squad-1.74}/setup.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/admin.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/apps.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/ci.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/filters.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/urls.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/utils.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/api/views.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/celery.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/admin.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/apps.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/backend/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/backend/fake.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/backend/null.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/exceptions.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/management/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/listen.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/testfetch.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0001_initial.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0003_backend_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0004_testjob_failure.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0009_slug_pattern.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0012_testjob_build.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0013_testjob_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0018_testjob_dates.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/migrations/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/models.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/tasks.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/templatetags/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/templatetags/filter_jobs.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/ci/utils.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/container_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/admin.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/apps.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/callback.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/locale/django.pot +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/compute_build_summaries.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/compute_project_statuses.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/fill_test_metadata.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/import_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/import_data.rst +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/migrate_test_runs.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/prepdump.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/send-email.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/update_project_statuses.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/management/commands/users.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0001_initial.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0003_testrun_log_file.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0004_group_user_groups.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0005_token.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0008_status.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0010_testrun_datetime.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0012_build_datetime.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0015_attachment.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0016_project_is_public.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0017_slug_validator.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0018_build_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0019_build_version.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0020_build_ordering.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0021_global_tokens.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0022_projectstatus.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0023_subscription.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0032_testrun_completed.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0033_drop_debversion.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0035_remove_build_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0036_status_tests_skip.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0039_orderings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0043_project_status_build.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0044_project_html_mail.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0045_adminsubscription.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0048_moderate_notifications.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0051_build_status.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0054_custom_email_template.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0056_project_description.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0060_test_log.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0066_environment_description.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0068_suite_version.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0069_suite_metadata.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0072_group_description.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0074_add_indexes.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0076_patch_builds.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0077_knownissue.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0081_status_has_metrics.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0086_xfail.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0087_test_known_issues.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0088_user_subscriptions.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0092_annotation.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0096_build_keep_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0097_build_placeholder.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0098_blank_annotation.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0099_metricthreshold.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0101_project_project_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0103_populate_project_status.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0104_delayedreport.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0109_group_member.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0112_user_namespaces.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0118_project_is_archived.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0119_i18n.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0120_buildsummary.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0134_longer_metric_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0138_metric_unit.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0139_nullable_test_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0141_remove_test_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0143_attachment_storage.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0144_attachment_data_null.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0145_pluginscratch.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0149_build_patch_url.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0151_callback.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0157_remove_metric_name.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0164_django_update.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0166_build_is_release.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0167_add_project_datetime.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/0168_add_group_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/migrations/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/notification.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/plugins.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/statistics.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/tasks/exceptions.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/tasks/notification.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/base.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templatetags/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/core/templatetags/squad_notification.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/__main__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/admin.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/apps.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/badges.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/build_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/ci.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/extract.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/forms.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/group_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/locale/django.pot +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/management/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/management/commands/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/management/commands/get_token.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/metrics.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/project_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/queries.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/setup.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/compare.css +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/download +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/download.conf +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/favicon.ico +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/main.css +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/attach_select2.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/build.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/build_compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/build_list.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/charts.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/common.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/config.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/annotation.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/build_release.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/cancel.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/charts.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/fetch.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/filter.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/metric.threshold.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/project_compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/showHide.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/table.js +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad_sign.svg +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/401.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/404.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/django/rest_framework/api.html +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/base.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/builds.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/compare.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/index.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/login.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/tests.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/templatetags/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/user_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/frontend/utils.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/http.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/jinja2.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/mail.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/manage.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/plugins/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/plugins/example.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/plugins/gerrit.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/plugins/github.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/plugins/linux_log_parser.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/run/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/run/__main__.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/run/listener.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/run/scheduler.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/run/worker.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/socialaccount.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/urls.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad/wsgi.py +0 -0
- {squad-1.72.2 → squad-1.74}/squad.egg-info/dependency_links.txt +0 -0
- {squad-1.72.2 → squad-1.74}/squad.egg-info/entry_points.txt +0 -0
- {squad-1.72.2 → squad-1.74}/squad.egg-info/requires.txt +0 -0
- {squad-1.72.2 → squad-1.74}/squad.egg-info/top_level.txt +0 -0
- {squad-1.72.2 → squad-1.74}/squad.svg +0 -0
- {squad-1.72.2 → squad-1.74}/test/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/benchmarks.csv +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/benchmarks.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/definition.yaml +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/metadata.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/test_ci.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/test_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/test_run.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/tests.csv +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/tests.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/tests.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/tests_log.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/tests_two.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/api/twoline_definition.yaml +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/example-broken-log.yaml +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/example-lava-log.yaml +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/lava.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/test_fake.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/test_lava.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/test_real_lava.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/test_listen.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/test_models.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/ci/test_tasks.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_attachment.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_build.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_build_summary.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_callback.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_emailtemplate.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_group.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_historical_emailtemplate.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_known_issues.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_metric.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_metric_comparison.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_metric_threshold.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_metrics_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_metrics_summary.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_notification.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_notification_delivery.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_patch_source.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_project.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_project_status.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_statistics.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_tasks.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_tasks_notification.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_test.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_test_comparison.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_test_data.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_test_run.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_test_summary.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_update_project_statuses.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_user_namespace.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/core/test_utils.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_comparison.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_get_token_command.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_group_settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_template_tags.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_test_job.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/frontend/test_utils.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/integration/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/integration/plugins/test_tradefed.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
- {squad-1.72.2 → squad-1.74}/test/integration/test_build_notification_from_ci.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/javascript.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/karma.conf.js +0 -0
- {squad-1.72.2 → squad-1.74}/test/mock.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/performance.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/__init__.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kasan.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kernelpanic.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kfence.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/oops.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/test_gerrit.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/test_github.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/test_linux_log_parser.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/plugins/test_plugin.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/settings.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/test_architecture.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/test_code_quality.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/test_cors.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/test_i18n.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/test_mail.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/test_pending_migrations.py +0 -0
- {squad-1.72.2 → squad-1.74}/test/unit/test_annotation.js +0 -0
- {squad-1.72.2 → squad-1.74}/test/unit/test_cancel.js +0 -0
- {squad-1.72.2 → squad-1.74}/test/unit/test_charts.js +0 -0
- {squad-1.72.2 → squad-1.74}/test/unit/test_compare.js +0 -0
- {squad-1.72.2 → squad-1.74}/test/unit/test_filter.js +0 -0
- {squad-1.72.2 → squad-1.74}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,42 @@
|
|
1
|
+
# 1.74
|
2
|
+
|
3
|
+
This 1.74 release patches a couple of pages improving overall performance.
|
4
|
+
|
5
|
+
It improves loading times of build tests page, test history and build comparison by tests.
|
6
|
+
|
7
|
+
The release also removes "Test failures" page, given that there's already and API endpoint
|
8
|
+
for it and it is cumbersome to maintain an UI for it as well. Finaly, this release removes
|
9
|
+
the transitions table from build comparison page, which allowed users to query changes by
|
10
|
+
specific transitions. This is too expensive to compute in larger SQUAD instances.
|
11
|
+
|
12
|
+
Complete list of changes going in:
|
13
|
+
|
14
|
+
* api/rest.py:
|
15
|
+
* fix failures with confidence pagination
|
16
|
+
* re-add test id and test run on failures_with_confidence endpoint
|
17
|
+
* support looking release builds only
|
18
|
+
* backend/tuxsuite.py:
|
19
|
+
* avoid making extra requests when retrieving build_name
|
20
|
+
* support tuxsuite sanity tests
|
21
|
+
* core/failures.py: use past N builds instead past N tests
|
22
|
+
* core/history.py: improve history performance
|
23
|
+
* frontend/comparison.py: refactor comparison to show off regressions and fixes only
|
24
|
+
* frontend/tests.py:
|
25
|
+
* allow filtering tests by environment and suite
|
26
|
+
* catch non-existant tests
|
27
|
+
* reduce query size
|
28
|
+
* remove frontend/failures.py: there's an API endpoint for it
|
29
|
+
|
30
|
+
# 1.73
|
31
|
+
|
32
|
+
This release fixes a variety of bugs:
|
33
|
+
|
34
|
+
* flake8: fix misc new flake8 complaints
|
35
|
+
* frontend/templatetags: support newer versions of allauth package
|
36
|
+
* frontend/views.py: handle requests provinding invalid testrun id
|
37
|
+
* templates/notification/diff.txt.jinja2: fix typo when referencing environments from known issues
|
38
|
+
|
39
|
+
|
1
40
|
# 1.72.2
|
2
41
|
|
3
42
|
This 1.72.2 release does a few performance improvements in order to
|
@@ -3,7 +3,6 @@ import yaml
|
|
3
3
|
|
4
4
|
from django.db.models import Q, F, Value as V, CharField, Prefetch
|
5
5
|
from django.db.models.functions import Concat
|
6
|
-
from django.db.models.query import prefetch_related_objects
|
7
6
|
from django.db.utils import IntegrityError
|
8
7
|
from django.core import exceptions as core_exceptions
|
9
8
|
from django.core.exceptions import ValidationError
|
@@ -904,7 +903,10 @@ class BuildViewSet(NestedViewSetMixin, ModelViewSet):
|
|
904
903
|
|
905
904
|
* `api/builds/<id>/failures_with_confidence` GET
|
906
905
|
|
907
|
-
List of failing tests with confidence scores.
|
906
|
+
List of failing tests with confidence scores. For each failure SQUAD will look back
|
907
|
+
N builds, where N is defined in project settings. List is paginated.
|
908
|
+
|
909
|
+
* releases_only - when active, look back only on builds with is_release=True
|
908
910
|
|
909
911
|
* `api/builds/<id>/metrics` GET
|
910
912
|
|
@@ -1024,17 +1026,13 @@ class BuildViewSet(NestedViewSetMixin, ModelViewSet):
|
|
1024
1026
|
result=False,
|
1025
1027
|
).exclude(
|
1026
1028
|
has_known_issues=True,
|
1027
|
-
).only(
|
1028
|
-
'metadata__suite', 'metadata__name', 'metadata__id',
|
1029
1029
|
).order_by(
|
1030
|
-
'metadata__suite', 'metadata__name',
|
1031
|
-
).
|
1032
|
-
'metadata__suite', 'metadata__name', 'metadata__id', named=True,
|
1033
|
-
)
|
1030
|
+
'id', 'metadata__suite', 'metadata__name', 'environment__slug',
|
1031
|
+
).distinct()
|
1034
1032
|
|
1035
1033
|
page = self.paginate_queryset(failures)
|
1036
|
-
|
1037
|
-
|
1034
|
+
releases_only = request.GET.get("releases_only")
|
1035
|
+
fwc = failures_with_confidence(build.project, build, page, releases_only=releases_only)
|
1038
1036
|
serializer = FailuresWithConfidenceSerializer(fwc, many=True, context={'request': request})
|
1039
1037
|
return self.get_paginated_response(serializer.data)
|
1040
1038
|
|
@@ -1393,6 +1391,17 @@ class ConfidenceSerializer(serializers.BaseSerializer):
|
|
1393
1391
|
|
1394
1392
|
class FailuresWithConfidenceSerializer(TestSerializer):
|
1395
1393
|
confidence = ConfidenceSerializer()
|
1394
|
+
status = None
|
1395
|
+
|
1396
|
+
class Meta:
|
1397
|
+
model = Test
|
1398
|
+
exclude = (
|
1399
|
+
'known_issues',
|
1400
|
+
'has_known_issues',
|
1401
|
+
'result',
|
1402
|
+
'url',
|
1403
|
+
'suite',
|
1404
|
+
)
|
1396
1405
|
|
1397
1406
|
|
1398
1407
|
class TestViewSet(NestedViewSetMixin, ModelViewSet):
|
@@ -122,12 +122,12 @@ class Backend(BaseBackend):
|
|
122
122
|
start_time = data.get('start_time', None)
|
123
123
|
end_time = data.get('end_time', None)
|
124
124
|
# convert to datetime
|
125
|
-
if type(start_time)
|
125
|
+
if type(start_time) is str:
|
126
126
|
try:
|
127
127
|
start_time = isoparse(start_time)
|
128
128
|
except ValueError:
|
129
129
|
start_time = None
|
130
|
-
if type(end_time)
|
130
|
+
if type(end_time) is str:
|
131
131
|
try:
|
132
132
|
end_time = isoparse(end_time)
|
133
133
|
except ValueError:
|
@@ -19,6 +19,7 @@ from cryptography.hazmat.primitives import (
|
|
19
19
|
from squad.ci.backend.null import Backend as BaseBackend
|
20
20
|
from squad.ci.exceptions import FetchIssue, TemporaryFetchIssue
|
21
21
|
from squad.ci.models import TestJob
|
22
|
+
from squad.core.models import TestRun
|
22
23
|
|
23
24
|
|
24
25
|
logger = logging.getLogger('squad.ci.backend.tuxsuite')
|
@@ -146,6 +147,72 @@ class Backend(BaseBackend):
|
|
146
147
|
|
147
148
|
return None
|
148
149
|
|
150
|
+
def set_build_name(self, test_job, job_url, results, metadata, settings):
|
151
|
+
"""
|
152
|
+
Tuxsuite allows plans with builds and tests within.
|
153
|
+
Some of these plans also support "special tests", which are
|
154
|
+
kind a sanity test to run before spinning a heavy load of tests.
|
155
|
+
|
156
|
+
Here's the default plan hierarchy:
|
157
|
+
- build -> tests
|
158
|
+
|
159
|
+
Now with sanity tests in between:
|
160
|
+
- build -> sanity tests -> tests
|
161
|
+
|
162
|
+
SQUAD needs to get to the build level in
|
163
|
+
order to retrieve the build object and finally retrieve
|
164
|
+
its build name attribute
|
165
|
+
"""
|
166
|
+
|
167
|
+
build_id = results['waiting_for']
|
168
|
+
if build_id is None:
|
169
|
+
return
|
170
|
+
|
171
|
+
items = build_id.split('#')
|
172
|
+
if len(items) == 2:
|
173
|
+
_type = items[0]
|
174
|
+
_id = items[1]
|
175
|
+
else:
|
176
|
+
_type = "BUILD"
|
177
|
+
_id = items[0]
|
178
|
+
|
179
|
+
test_id = results['uid']
|
180
|
+
|
181
|
+
try:
|
182
|
+
# Check if the target build or sanity test is fetched
|
183
|
+
job_id = self.generate_job_id(_type.lower(), results)
|
184
|
+
job_id = job_id.replace(test_id, _id)
|
185
|
+
|
186
|
+
candidate = TestRun.objects.get(
|
187
|
+
build=test_job.target_build,
|
188
|
+
job_id=job_id
|
189
|
+
)
|
190
|
+
|
191
|
+
build_name = candidate.metadata.get('build_name')
|
192
|
+
if build_name:
|
193
|
+
metadata['build_name'] = build_name
|
194
|
+
return
|
195
|
+
|
196
|
+
except TestRun.DoesNotExist:
|
197
|
+
pass
|
198
|
+
|
199
|
+
# It is a sanity test, an extra request is needed to get build id
|
200
|
+
if _type == 'TEST':
|
201
|
+
follow_test_url = job_url.replace(test_id, _id)
|
202
|
+
test_json = self.fetch_url(follow_test_url).json()
|
203
|
+
build_id = test_json.get('waiting_for')
|
204
|
+
|
205
|
+
build_id = build_id.replace('BUILD#', '')
|
206
|
+
build_url = job_url.replace(test_id, build_id).replace('/tests/', '/builds/')
|
207
|
+
|
208
|
+
build_metadata = self.fetch_url(build_url).json()
|
209
|
+
|
210
|
+
build_metadata_keys = settings.get('TEST_BUILD_METADATA_KEYS', [])
|
211
|
+
metadata.update({k: build_metadata.get(k) for k in build_metadata_keys})
|
212
|
+
|
213
|
+
if 'toolchain' in build_metadata_keys and 'kconfig' in build_metadata_keys and metadata['build_name'] in [None, '']:
|
214
|
+
metadata['build_name'] = self.generate_test_name(build_metadata)
|
215
|
+
|
149
216
|
def parse_build_results(self, test_job, job_url, results, settings):
|
150
217
|
required_keys = ['build_status', 'warnings_count', 'download_url', 'retry']
|
151
218
|
self.__check_required_keys__(required_keys, results)
|
@@ -163,6 +230,7 @@ class Backend(BaseBackend):
|
|
163
230
|
metadata_keys = settings.get('BUILD_METADATA_KEYS', [])
|
164
231
|
metadata = {k: results.get(k) for k in metadata_keys}
|
165
232
|
metadata['job_url'] = job_url
|
233
|
+
metadata['job_id'] = test_job.job_id
|
166
234
|
metadata['config'] = urljoin(results.get('download_url') + '/', 'config')
|
167
235
|
metadata['build_name'] = test_name
|
168
236
|
|
@@ -200,6 +268,7 @@ class Backend(BaseBackend):
|
|
200
268
|
metadata_keys = settings.get('TEST_METADATA_KEYS', [])
|
201
269
|
metadata = {k: results.get(k) for k in metadata_keys}
|
202
270
|
metadata['job_url'] = job_url
|
271
|
+
metadata['job_id'] = test_job.job_id
|
203
272
|
|
204
273
|
# Set job name
|
205
274
|
try:
|
@@ -227,25 +296,8 @@ class Backend(BaseBackend):
|
|
227
296
|
# Retrieve TuxRun log
|
228
297
|
logs = self.fetch_url(job_url + '/', 'logs?format=txt').text
|
229
298
|
|
230
|
-
#
|
231
|
-
|
232
|
-
build_id = results['waiting_for']
|
233
|
-
|
234
|
-
# Tuxsuite recently has added support for tests depending on other tests
|
235
|
-
if build_id.startswith('BUILD#') or '#' not in build_id:
|
236
|
-
_, _, test_id = self.parse_job_id(test_job.job_id)
|
237
|
-
build_id = build_id.replace('BUILD#', '')
|
238
|
-
build_url = job_url.replace(test_id, build_id).replace('/tests/', '/builds/')
|
239
|
-
|
240
|
-
# TODO: check if we can save a few seconds by querying a testjob that
|
241
|
-
# already contains build results
|
242
|
-
build_metadata = self.fetch_url(build_url).json()
|
243
|
-
|
244
|
-
build_metadata_keys = settings.get('TEST_BUILD_METADATA_KEYS', [])
|
245
|
-
metadata.update({k: build_metadata.get(k) for k in build_metadata_keys})
|
246
|
-
|
247
|
-
if 'toolchain' in build_metadata_keys and 'kconfig' in build_metadata_keys and metadata['build_name'] in [None, '']:
|
248
|
-
metadata['build_name'] = self.generate_test_name(build_metadata)
|
299
|
+
# Follow up the chain and retrieve build name
|
300
|
+
self.set_build_name(test_job, job_url, results, metadata, settings)
|
249
301
|
|
250
302
|
# Create a boot test
|
251
303
|
boot_test_name = 'boot/' + (metadata.get('build_name') or 'boot')
|
@@ -2,8 +2,10 @@
|
|
2
2
|
SQUAD compatibity file
|
3
3
|
"""
|
4
4
|
from rest_framework_extensions import __version__ as DRFE_VERSION_STR
|
5
|
+
from allauth import __version__ as DAA_VERSION_STR
|
5
6
|
|
6
7
|
DRFE_VERSION = [int(n) for n in DRFE_VERSION_STR.split(".")]
|
8
|
+
DAA_VERSION = [int(n) for n in DAA_VERSION_STR.split(".")]
|
7
9
|
|
8
10
|
# Handles compatibility for django_restframework_filters
|
9
11
|
try:
|
@@ -27,3 +29,15 @@ def drf_basename(name):
|
|
27
29
|
return {"basename": name}
|
28
30
|
else:
|
29
31
|
return {"base_name": name}
|
32
|
+
|
33
|
+
|
34
|
+
def get_socialaccount_provider(providers, socialapp, request):
|
35
|
+
"""
|
36
|
+
Django-allauth 0.55 removed the function `by_id`
|
37
|
+
Ref: https://github.com/pennersr/django-allauth/commit/cc5279bb61dba9cf0fafb10f4ae175c018749f1f
|
38
|
+
"""
|
39
|
+
|
40
|
+
if DAA_VERSION >= [0, 55]:
|
41
|
+
return socialapp.get_provider(request)
|
42
|
+
else:
|
43
|
+
return providers.registry.by_id(socialapp.provider)
|
@@ -393,7 +393,7 @@ class TestComparison(BaseComparison):
|
|
393
393
|
|
394
394
|
tests = models.Test.objects.filter(test_run_id__in=test_runs_ids.keys()).annotate(
|
395
395
|
suite_slug=F('suite__slug'),
|
396
|
-
).prefetch_related('metadata').defer('log')
|
396
|
+
).prefetch_related('metadata').defer('log').order_by()
|
397
397
|
|
398
398
|
for test in tests:
|
399
399
|
build, env = test_runs_ids.get(test.test_run_id)
|
@@ -539,6 +539,9 @@ class TestComparison(BaseComparison):
|
|
539
539
|
# No baseline is present, then no comparison is needed
|
540
540
|
return
|
541
541
|
|
542
|
+
baseline = self.builds[0]
|
543
|
+
target = self.builds[1]
|
544
|
+
|
542
545
|
query = self.base_sql.copy()
|
543
546
|
query['select'].append('target.result')
|
544
547
|
query['select'].append('target.has_known_issues')
|
@@ -549,42 +552,54 @@ class TestComparison(BaseComparison):
|
|
549
552
|
tests = [t for t in models.Test.objects.raw(sql)]
|
550
553
|
prefetch_related_objects(tests, 'metadata', 'suite')
|
551
554
|
|
552
|
-
env_ids = []
|
555
|
+
env_ids = [t.environment_id for t in tests]
|
556
|
+
envs = {e.id: e for e in models.Environment.objects.filter(id__in=env_ids).all()}
|
557
|
+
envs_slugs = sorted({e.slug for e in envs.values()})
|
558
|
+
|
559
|
+
for build in self.builds:
|
560
|
+
self.environments[build] = envs_slugs
|
561
|
+
|
553
562
|
fixed_tests = defaultdict(set)
|
554
563
|
regressions = defaultdict(set)
|
555
564
|
fixes = defaultdict(set)
|
556
565
|
|
557
566
|
for test in tests:
|
558
567
|
env_id = test.environment_id
|
568
|
+
|
559
569
|
full_name = test.full_name
|
570
|
+
if full_name not in self.results:
|
571
|
+
self.results[full_name] = OrderedDict()
|
560
572
|
|
561
|
-
|
573
|
+
baseline_key = (baseline, envs[env_id].slug)
|
574
|
+
target_key = (target, envs[env_id].slug)
|
562
575
|
|
563
576
|
if test.status == 'fail':
|
564
577
|
regressions[env_id].add(full_name)
|
578
|
+
self.results[full_name][target_key] = 'fail'
|
579
|
+
self.results[full_name][baseline_key] = 'pass'
|
565
580
|
elif test.status == 'pass':
|
566
581
|
fixes[env_id].add(full_name)
|
567
582
|
fixed_tests[env_id].add(test.metadata_id)
|
583
|
+
self.results[full_name][target_key] = 'pass'
|
584
|
+
self.results[full_name][baseline_key] = 'fail'
|
568
585
|
|
569
|
-
|
586
|
+
self.results = OrderedDict(sorted(self.results.items()))
|
570
587
|
|
571
588
|
for env_id in regressions.keys():
|
572
|
-
self.__regressions__[
|
589
|
+
self.__regressions__[envs[env_id].slug] = list(regressions[env_id])
|
573
590
|
|
574
591
|
# It's not a fix if baseline test is intermittent for a given environment:
|
575
592
|
# - test.has_known_issues == True and
|
576
593
|
# - test.known_issues[env].intermittent == True
|
577
|
-
fixed_tests_environment_slugs = [
|
594
|
+
fixed_tests_environment_slugs = [envs[env_id] for env_id in fixed_tests.keys()]
|
578
595
|
intermittent_fixed_tests = self.__intermittent_fixed_tests__(fixed_tests, fixed_tests_environment_slugs)
|
579
596
|
for env_id in fixes.keys():
|
580
|
-
env_slug =
|
597
|
+
env_slug = envs[env_id].slug
|
581
598
|
test_list = [test for test in fixes[env_id] if (test, env_slug) not in intermittent_fixed_tests]
|
582
599
|
if len(test_list):
|
583
600
|
self.__fixes__[env_slug] = test_list
|
584
601
|
|
585
|
-
|
586
|
-
target = self.builds[1]
|
587
|
-
for env in environments.values():
|
602
|
+
for env in envs.values():
|
588
603
|
if env.slug in self.__regressions__:
|
589
604
|
for test in self.__regressions__[env.slug]:
|
590
605
|
self.__diff__[test][target][env.slug] = False
|
@@ -0,0 +1,28 @@
|
|
1
|
+
from django.db.models import prefetch_related_objects
|
2
|
+
|
3
|
+
from squad.core.models import Test
|
4
|
+
|
5
|
+
|
6
|
+
def failures_with_confidence(project, build, failures, releases_only=False):
|
7
|
+
limit = project.build_confidence_count
|
8
|
+
threshold = project.build_confidence_threshold
|
9
|
+
|
10
|
+
prefetch_related_objects(failures, "metadata")
|
11
|
+
|
12
|
+
queryset = project.builds.filter(id__lt=build.id)
|
13
|
+
if releases_only:
|
14
|
+
queryset = queryset.filter(is_release=True)
|
15
|
+
builds = queryset.order_by('-id').all()[:limit]
|
16
|
+
builds_ids = [b.id for b in builds]
|
17
|
+
|
18
|
+
# Find previous `limit` tests that contain this test x environment
|
19
|
+
for failure in failures:
|
20
|
+
history = Test.objects.filter(
|
21
|
+
build_id__in=builds_ids,
|
22
|
+
metadata_id=failure.metadata_id,
|
23
|
+
environment_id=failure.environment_id,
|
24
|
+
).only("result").order_by()
|
25
|
+
|
26
|
+
failure.set_confidence(threshold, history)
|
27
|
+
|
28
|
+
return failures
|
@@ -1,9 +1,9 @@
|
|
1
|
-
from collections import
|
1
|
+
from collections import defaultdict
|
2
2
|
from django.core.paginator import Paginator
|
3
3
|
|
4
4
|
from squad.core.queries import test_confidence
|
5
5
|
from squad.core.utils import parse_name
|
6
|
-
from squad.core.models import
|
6
|
+
from squad.core.models import SuiteMetadata, KnownIssue, Environment
|
7
7
|
|
8
8
|
|
9
9
|
class TestResult(object):
|
@@ -11,20 +11,20 @@ class TestResult(object):
|
|
11
11
|
__test__ = False
|
12
12
|
|
13
13
|
class TestRunStatus(object):
|
14
|
-
def __init__(self,
|
15
|
-
self.
|
14
|
+
def __init__(self, test_run_id, suite):
|
15
|
+
self.test_run_id = test_run_id
|
16
16
|
self.suite = suite
|
17
17
|
|
18
|
-
def __init__(self, test, suite, metadata, known_issues, is_duplicate=False):
|
18
|
+
def __init__(self, test, suite, metadata, known_issues, is_duplicate=False, list_of_duplicates=None):
|
19
19
|
self.test = test
|
20
20
|
self.suite = suite
|
21
21
|
self.known_issues = known_issues
|
22
22
|
if is_duplicate:
|
23
|
-
self.status, self.confidence_score = test_confidence(
|
23
|
+
self.status, self.confidence_score = test_confidence(None, list_of_duplicates=list_of_duplicates)
|
24
24
|
else:
|
25
25
|
self.status, self.confidence_score = (test.status, None)
|
26
|
-
self.
|
27
|
-
self.test_run_status = self.TestRunStatus(self.
|
26
|
+
self.test_run_id = test.test_run_id
|
27
|
+
self.test_run_status = self.TestRunStatus(self.test_run_id, self.suite)
|
28
28
|
self.info = {
|
29
29
|
"test_description": metadata.description if metadata else '',
|
30
30
|
"test_instructions": metadata.instructions_to_reproduce if metadata else '',
|
@@ -51,11 +51,6 @@ class TestHistory(object):
|
|
51
51
|
|
52
52
|
self.top = builds[0]
|
53
53
|
|
54
|
-
environments = OrderedDict()
|
55
|
-
results = OrderedDict()
|
56
|
-
for build in builds:
|
57
|
-
results[build] = {}
|
58
|
-
|
59
54
|
issues_by_env = {}
|
60
55
|
for issue in KnownIssue.active_by_project_and_test(project, full_test_name).all():
|
61
56
|
for env in issue.environments.all():
|
@@ -65,16 +60,27 @@ class TestHistory(object):
|
|
65
60
|
|
66
61
|
suite = project.suites.prefetch_related('metadata').get(slug=suite_slug)
|
67
62
|
metadata = SuiteMetadata.objects.get(kind='test', suite=suite_slug, name=test_name)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
63
|
+
|
64
|
+
results = defaultdict()
|
65
|
+
environments_ids = set()
|
66
|
+
for build in builds:
|
67
|
+
results[build] = defaultdict(list)
|
68
|
+
for test in build.tests.filter(metadata=metadata).order_by():
|
69
|
+
test.metadata = metadata
|
70
|
+
test.suite = suite
|
71
|
+
results[build][test.environment_id].append(test)
|
72
|
+
environments_ids.add(test.environment_id)
|
73
|
+
|
74
|
+
results_without_duplicates = defaultdict()
|
75
|
+
for build in results:
|
76
|
+
results_without_duplicates[build] = defaultdict()
|
77
|
+
for env in results[build]:
|
78
|
+
tests = results[build][env]
|
79
|
+
|
80
|
+
is_duplicate = len(tests) > 1
|
81
|
+
known_issues = issues_by_env.get(tests[0].environment_id)
|
82
|
+
result = TestResult(tests[0], suite, metadata, known_issues, is_duplicate, list_of_duplicates=tests)
|
83
|
+
results_without_duplicates[build][env] = result
|
84
|
+
|
85
|
+
self.environments = Environment.objects.filter(id__in=environments_ids).order_by('slug')
|
86
|
+
self.results = results_without_duplicates
|
@@ -199,7 +199,7 @@ def test_confidence(test, list_of_duplicates=None):
|
|
199
199
|
return {value: count for value, count in data.items() if count == max_count}
|
200
200
|
|
201
201
|
if test:
|
202
|
-
duplicates = models.Test.objects.filter(
|
202
|
+
duplicates = models.Test.objects.filter(metadata_id=test.metadata_id, environment_id=test.environment_id, build_id=test.build_id).order_by()
|
203
203
|
else:
|
204
204
|
duplicates = list_of_duplicates
|
205
205
|
|
@@ -72,7 +72,7 @@ class ValidateTestRun(object):
|
|
72
72
|
except json.decoder.JSONDecodeError as e:
|
73
73
|
raise exceptions.InvalidMetadataJSON("metadata is not valid JSON: " + str(e) + "\n" + metadata_json)
|
74
74
|
|
75
|
-
if type(metadata)
|
75
|
+
if type(metadata) is not dict:
|
76
76
|
raise exceptions.InvalidMetadata("metadata is not a object ({})")
|
77
77
|
|
78
78
|
if "job_id" in metadata.keys():
|
@@ -87,7 +87,7 @@ class ValidateTestRun(object):
|
|
87
87
|
except json.decoder.JSONDecodeError as e:
|
88
88
|
raise exceptions.InvalidMetricsDataJSON("metrics is not valid JSON: " + str(e) + "\n" + metrics_file)
|
89
89
|
|
90
|
-
if type(metrics)
|
90
|
+
if type(metrics) is not dict:
|
91
91
|
raise exceptions.InvalidMetricsData.type(metrics)
|
92
92
|
|
93
93
|
for metric, value_dict in metrics.items():
|
@@ -113,7 +113,7 @@ class ValidateTestRun(object):
|
|
113
113
|
except json.decoder.JSONDecodeError as e:
|
114
114
|
raise exceptions.InvalidTestsDataJSON("tests is not valid JSON: " + str(e) + "\n" + tests_file)
|
115
115
|
|
116
|
-
if type(tests)
|
116
|
+
if type(tests) is not dict:
|
117
117
|
raise exceptions.InvalidTestsData.type(tests)
|
118
118
|
|
119
119
|
|
@@ -24,7 +24,7 @@ Failures
|
|
24
24
|
{% if summary.failures %}
|
25
25
|
{% for env, tests in summary.failures.items() %}{{env}}:
|
26
26
|
{% for test in tests %}
|
27
|
-
* {{test.full_name}}{% for issue in known_issues %}{% if issue.test_name == test.full_name %}{% for issue_environment in issue.
|
27
|
+
* {{test.full_name}}{% for issue in known_issues %}{% if issue.test_name == test.full_name %}{% for issue_environment in issue.environments.all() %}{% if env == issue_environment.slug %}
|
28
28
|
* Known issue: {{issue.title}}{% if issue.url %} {{issue.url}}{% endif %}{% if issue.intermittent %} (intermittent){% endif %}{% endif %}{% endfor %}{% endif %}{% endfor %}{% endfor %}
|
29
29
|
{% endfor %}
|
30
30
|
{% else %}
|
@@ -170,7 +170,7 @@ def log_deletion(request, object, message):
|
|
170
170
|
|
171
171
|
def storage_save(obj, storage_field, filename, content):
|
172
172
|
content_bytes = content or ''
|
173
|
-
if type(content_bytes)
|
173
|
+
if type(content_bytes) is str:
|
174
174
|
content_bytes = content_bytes.encode()
|
175
175
|
filename = '%s/%s/%s' % (obj.__class__.__name__.lower(), obj.pk, filename)
|
176
176
|
storage_field.save(filename, ContentFile(content_bytes))
|
@@ -116,11 +116,11 @@ def compare_builds(request):
|
|
116
116
|
baseline = get_object_or_404(project.builds, version=baseline_build)
|
117
117
|
target = get_object_or_404(project.builds, version=target_build)
|
118
118
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
comparison
|
119
|
+
if comparison_type == 'test':
|
120
|
+
comparison = TestComparison(baseline, target, regressions_and_fixes_only=True)
|
121
|
+
else:
|
122
|
+
comparison_class = __get_comparison_class(comparison_type)
|
123
|
+
comparison = comparison_class.compare_builds(baseline, target)
|
124
124
|
|
125
125
|
comparison.results = __paginate(comparison.results, request)
|
126
126
|
|
@@ -103,11 +103,6 @@
|
|
103
103
|
{{ _('Tests') }}
|
104
104
|
</a>
|
105
105
|
</li>
|
106
|
-
<li role="presentation" {% if url_name == 'failures' %}class="active"{% endif %}>
|
107
|
-
<a href="{{build_section_url(build, 'failures')}}">
|
108
|
-
{{ _('Test failures') }}
|
109
|
-
</a>
|
110
|
-
</li>
|
111
106
|
<li role="presentation" {% if url_name == 'build_metrics' %}class="active"{% endif %}>
|
112
107
|
<a href="{{build_section_url(build, 'build_metrics')}}">
|
113
108
|
{{ _('Metrics') }}
|
@@ -39,7 +39,7 @@
|
|
39
39
|
<td><a href="{{project_url(build)}}">{{build.version}}</a></td>
|
40
40
|
<td>{{build.datetime|date}}</td>
|
41
41
|
{% for environment in history.environments %}
|
42
|
-
{% with result=results[environment] %}
|
42
|
+
{% with result=results[environment.id] %}
|
43
43
|
{% if result %}
|
44
44
|
{% with known_issues=result.known_issues %}
|
45
45
|
<td class='{{result.status|slugify}}'>
|
@@ -14,6 +14,7 @@ from allauth.socialaccount import providers
|
|
14
14
|
|
15
15
|
|
16
16
|
from squad import version
|
17
|
+
from squad.compat import get_socialaccount_provider
|
17
18
|
from squad.core.models import Test, Build
|
18
19
|
from squad.core.utils import format_metadata
|
19
20
|
from squad.jinja2 import register_global_function, register_filter
|
@@ -81,14 +82,12 @@ def testrun_suite_test_details_history_url(group, project, build, status, test):
|
|
81
82
|
|
82
83
|
|
83
84
|
def testrun_suite_or_test_url(group, project, build, status, kind, test=None):
|
84
|
-
testrun = status.test_run.id
|
85
|
-
suite = status.suite
|
86
85
|
args = (
|
87
86
|
group.slug,
|
88
87
|
project.slug,
|
89
88
|
build.version,
|
90
|
-
|
91
|
-
suite.slug.replace('/', '$'),
|
89
|
+
status.test_run_id,
|
90
|
+
status.suite.slug.replace('/', '$'),
|
92
91
|
)
|
93
92
|
if test:
|
94
93
|
if isinstance(test, Test):
|
@@ -272,7 +271,7 @@ def to_json(d):
|
|
272
271
|
def socialaccount_providers(context):
|
273
272
|
request = context['request']
|
274
273
|
return_dict = {}
|
275
|
-
for
|
276
|
-
provider = providers
|
274
|
+
for socialapp in SocialApp.objects.all():
|
275
|
+
provider = get_socialaccount_provider(providers, socialapp, request)
|
277
276
|
return_dict.update({provider: provider.get_login_url(request)})
|
278
277
|
return return_dict
|