diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 53c7dfe67db..21608ec143d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,3 +1,3 @@
# WARNING: Do not edit this file manually! Edit ci/spec.yml and run ci/regen-workflow.py.
-{"name": "CI", "on": ["push", "pull_request"], "defaults": {"run": {"shell": "bash"}}, "env": {"PRODUCTION": "TRUE"}, "jobs": {"linting": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8]}, "fail-fast": false}, "steps": [{"name": "Set up repo", "uses": "actions/checkout@v2"}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Run flake8", "run": "flake8 --max-line-length 150 --exclude=*/migrations/* intranet/ scripts/ docs/ *.py"}, {"name": "Run pylint", "run": "pylint --jobs=0 --disable=fixme,broad-except,global-statement,attribute-defined-outside-init,cyclic-import --django-settings-module=intranet.settings intranet/"}, {"name": "Run isort", "run": "isort --check --recursive intranet"}]}, "formatting": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8]}, "fail-fast": false}, "steps": [{"name": "Set up repo", "uses": "actions/checkout@v2"}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Format code", "run": "./scripts/build_ensure_no_changes.sh ./scripts/format.sh"}, {"name": "Format static files and templates", "run": "./scripts/build_ensure_no_changes.sh ./scripts/static_templates_format.sh"}]}, "build": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8]}, "fail-fast": false}, "steps": [{"name": "Set up repo (fetching all commits)", "uses": "actions/checkout@v2", "with": {"fetch-depth": 0}}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Regenerate workflow YAML file and check for changes", "run": "set -e\npip install pyyaml\n./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py\n"}, {"name": "Build docs", "run": "./scripts/build_ensure_no_changes.sh ./scripts/build_docs.sh"}, {"name": "Build sources", "run": "./scripts/build_ensure_no_changes.sh ./scripts/build_sources.sh"}, {"name": "Check for chenges to CI spec", "run": "./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py"}, {"name": "Check for unmigrated changes", "run": "./scripts/build_ensure_no_changes.sh ./manage.py migrate"}, {"name": "Validate PR commit messages", "if": "github.event_name == 'pull_request'", "run": "./scripts/validate-commit-messages.py ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}"}, {"name": "Validate push commit messages", "if": "github.event_name == 'push' && (github.repository_owner != 'tjcsl' || github.ref != 'refs/heads/master' || github.ref != 'refs/heads/dev')", "run": "git fetch origin ${{ github.event.before }} && ./scripts/validate-commit-messages.py ${{ github.event.before }}..${{ github.event.after }}"}, {"name": "Push docs", "if": "github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository_owner == 'tjcsl' && matrix.python-version == 3.8", "run": "./scripts/push_docs.sh", "env": {"GH_TOKEN": "${{ secrets.DOCS_GH_TOKEN }}"}}]}, "tests": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8], "node-version": ["12.x"]}, "fail-fast": false}, "services": {"rabbitmq": {"image": "rabbitmq:latest", "ports": ["5672:5672"], "options": "--health-cmd \"rabbitmqctl node_health_check\" --health-interval 6s --health-timeout 5s --health-retries 10"}, "redis": {"image": "redis:latest", "ports": ["6379:6379"], "options": "--entrypoint redis-server"}, "postgres": {"image": "postgres:latest", "env": {"POSTGRES_USER": "postgres", "POSTGRES_PASSWORD": "postgres", "POSTGRES_DB": "postgres"}, "ports": ["5432:5432"], "options": "--health-cmd pg_isready --health-interval 6s --health-timeout 5s --health-retries 9"}}, "steps": [{"name": "Set up repo", "uses": "actions/checkout@v2"}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Set up Node.js ${{ matrix.node-version }}", "uses": "actions/setup-node@v1", "with": {"node-version": "${{ matrix.node-version }}"}}, {"name": "Install Sass and add Node modules bin to PATH", "run": "set -e\nnpm install sass\necho \"PATH=${{ github.workspace }}/node_modules/.bin:$PATH\" >> $GITHUB_ENV\n"}, {"name": "Set and create PGPASSFILE", "run": "set -e\nPGPASSFILE=${{ runner.temp }}/.pgpass\necho \"PGPASSFILE=$PGPASSFILE\" >> $GITHUB_ENV\necho 127.0.0.1:5432:postgres:postgres:postgres >$PGPASSFILE\nchmod 600 $PGPASSFILE\n"}, {"name": "Create database", "run": "psql -U postgres -h 127.0.0.1 -c 'create database ion'"}, {"name": "install Kerberos", "run": "sudo apt install -y krb5-user"}, {"name": "Run tests", "run": "coverage run ./setup.py test"}, {"name": "Migrate database", "run": "coverage run -a ./manage.py migrate"}, {"name": "Collect static files", "run": "coverage run -a ./manage.py collectstatic --noinput -v 0"}, {"name": "Report coverage to Coveralls", "uses": "AndreMiras/coveralls-python-action@develop", "with": {"parallel": true}}, {"name": "Build coverage XML file", "if": "github.repository_owner == 'tjcsl' && github.event_name != 'pull_request'", "run": "coverage xml"}, {"name": "Report coverage to Codacy", "uses": "codacy/codacy-coverage-reporter-action@master", "if": "github.repository_owner == 'tjcsl' && github.event_name != 'pull_request'", "with": {"coverage-reports": "coverage.xml", "project-token": "${{ secrets.CODACY_PROJECT_TOKEN }}"}}]}, "finish_success": {"needs": ["linting", "formatting", "build", "tests"], "runs-on": "ubuntu-latest", "steps": [{"name": "Tell Coveralls that parallel jobs have finished", "uses": "coverallsapp/github-action@master", "with": {"github-token": "${{ secrets.GITHUB_TOKEN }}", "parallel-finished": true}}]}}}
\ No newline at end of file
+{"name": "CI", "on": ["push", "pull_request"], "defaults": {"run": {"shell": "bash"}}, "env": {"PRODUCTION": "TRUE"}, "jobs": {"linting": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8]}, "fail-fast": false}, "steps": [{"name": "Set up repo", "uses": "actions/checkout@v2"}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Run flake8", "run": "flake8 --max-line-length 150 --exclude=*/migrations/* intranet/ scripts/ docs/ *.py"}, {"name": "Run pylint", "run": "pylint --jobs=0 --disable=fixme,broad-except,global-statement,attribute-defined-outside-init,cyclic-import --django-settings-module=intranet.settings intranet/"}, {"name": "Run isort", "run": "isort --check --recursive intranet"}]}, "formatting": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8]}, "fail-fast": false}, "steps": [{"name": "Set up repo", "uses": "actions/checkout@v2"}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Format code", "run": "./scripts/build_ensure_no_changes.sh ./scripts/format.sh"}, {"name": "Format static files and templates", "run": "./scripts/build_ensure_no_changes.sh ./scripts/static_templates_format.sh"}]}, "build": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8]}, "fail-fast": false}, "steps": [{"name": "Set up repo (fetching all commits)", "uses": "actions/checkout@v2", "with": {"fetch-depth": 0}}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Regenerate workflow YAML file and check for changes", "run": "./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py"}, {"name": "Build docs", "run": "./scripts/build_ensure_no_changes.sh ./scripts/build_docs.sh"}, {"name": "Build sources", "run": "./scripts/build_ensure_no_changes.sh ./scripts/build_sources.sh"}, {"name": "Check for changes to CI spec", "run": "./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py"}, {"name": "Check for unmigrated changes", "run": "./scripts/build_ensure_no_changes.sh ./manage.py migrate"}, {"name": "Validate PR commit messages", "if": "github.event_name == 'pull_request'", "run": "./scripts/validate-commit-messages.py ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}"}, {"name": "Validate push commit messages", "if": "github.event_name == 'push' && (github.repository_owner != 'tjcsl' || github.ref != 'refs/heads/master' || github.ref != 'refs/heads/dev')", "run": "git fetch origin ${{ github.event.before }} && ./scripts/validate-commit-messages.py ${{ github.event.before }}..${{ github.event.after }}"}, {"name": "Push docs", "if": "github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository_owner == 'tjcsl' && matrix.python-version == 3.8", "run": "./scripts/push_docs.sh", "env": {"GH_TOKEN": "${{ secrets.DOCS_GH_TOKEN }}"}}]}, "tests": {"runs-on": "ubuntu-latest", "strategy": {"matrix": {"python-version": [3.7, 3.8], "node-version": ["12.x"]}, "fail-fast": false}, "services": {"rabbitmq": {"image": "rabbitmq:latest", "ports": ["5672:5672"], "options": "--health-cmd \"rabbitmqctl node_health_check\" --health-interval 6s --health-timeout 5s --health-retries 10"}, "redis": {"image": "redis:latest", "ports": ["6379:6379"], "options": "--entrypoint redis-server"}, "postgres": {"image": "postgres:latest", "env": {"POSTGRES_USER": "postgres", "POSTGRES_PASSWORD": "postgres", "POSTGRES_DB": "postgres"}, "ports": ["5432:5432"], "options": "--health-cmd pg_isready --health-interval 6s --health-timeout 5s --health-retries 9"}}, "steps": [{"name": "Set up repo", "uses": "actions/checkout@v2"}, {"name": "Set up Python ${{ matrix.python-version }}", "uses": "actions/setup-python@v2", "with": {"python-version": "${{ matrix.python-version }}"}}, {"name": "Set up pip cache", "uses": "actions/cache@v2", "with": {"path": "~/.cache/pip", "key": "pip-${{ matrix.python-version }}"}}, {"name": "Set up venv", "run": "set -e\n\npip install -U virtualenv\nvirtualenv venv\n\nsource venv/bin/activate\n\npip install -U pip setuptools\npip install -U \\\n flake8 pylint pylint-django pylint-plugin-utils isort~=4.3 black==20.8b1 autopep8 \\\n coverage coveralls pyyaml\npip install -U -r requirements.txt\n\necho \"PATH=$PATH\" >> $GITHUB_ENV\necho \"VIRTUAL_ENV=$VIRTUAL_ENV\" >> $GITHUB_ENV\n"}, {"name": "Copy secret.py", "run": "cp intranet/settings/ci_secret.py intranet/settings/secret.py"}, {"name": "Set up Node.js ${{ matrix.node-version }}", "uses": "actions/setup-node@v1", "with": {"node-version": "${{ matrix.node-version }}"}}, {"name": "Install Sass and add Node modules bin to PATH", "run": "set -e\nnpm install sass\necho \"PATH=${{ github.workspace }}/node_modules/.bin:$PATH\" >> $GITHUB_ENV\n"}, {"name": "Set and create PGPASSFILE", "run": "set -e\nPGPASSFILE=${{ runner.temp }}/.pgpass\necho \"PGPASSFILE=$PGPASSFILE\" >> $GITHUB_ENV\necho 127.0.0.1:5432:postgres:postgres:postgres >$PGPASSFILE\nchmod 600 $PGPASSFILE\n"}, {"name": "Create database", "run": "psql -U postgres -h 127.0.0.1 -c 'create database ion'"}, {"name": "install Kerberos", "run": "sudo apt install -y krb5-user"}, {"name": "Run tests", "run": "coverage run ./setup.py test"}, {"name": "Migrate database", "run": "coverage run -a ./manage.py migrate"}, {"name": "Collect static files", "run": "coverage run -a ./manage.py collectstatic --noinput -v 0"}, {"name": "Report coverage to Coveralls", "uses": "AndreMiras/coveralls-python-action@develop", "with": {"parallel": true}}, {"name": "Build coverage XML file", "if": "github.repository_owner == 'tjcsl' && github.event_name != 'pull_request'", "run": "coverage xml"}, {"name": "Report coverage to Codacy", "uses": "codacy/codacy-coverage-reporter-action@master", "if": "github.repository_owner == 'tjcsl' && github.event_name != 'pull_request'", "with": {"coverage-reports": "coverage.xml", "project-token": "${{ secrets.CODACY_PROJECT_TOKEN }}"}}]}, "finish_success": {"needs": ["linting", "formatting", "build", "tests"], "runs-on": "ubuntu-latest", "steps": [{"name": "Tell Coveralls that parallel jobs have finished", "uses": "coverallsapp/github-action@master", "with": {"github-token": "${{ secrets.GITHUB_TOKEN }}", "parallel-finished": true}}]}}}
\ No newline at end of file
diff --git a/Ion.egg-info/PKG-INFO b/Ion.egg-info/PKG-INFO
index 42294e8a4c7..5fe6fc69e70 100644
--- a/Ion.egg-info/PKG-INFO
+++ b/Ion.egg-info/PKG-INFO
@@ -1,4 +1,4 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
Name: Ion
Version: 1.0
Summary: The next-generation Intranet platform for TJHSST
@@ -6,38 +6,6 @@ Home-page: https://github.com/tjcsl/ion
Author: The TJHSST Computer Systems Lab
Author-email: intranet@tjhsst.edu
License: UNKNOWN
-Description: **********
- Intranet 3
- **********
- .. image:: https://github.com/tjcsl/ion/workflows/CI/badge.svg?branch=master
- :target: https://github.com/tjcsl/ion/actions
- :alt: CI
-
- .. image:: https://coveralls.io/repos/tjcsl/ion/badge.svg?branch=master&service=github
- :target: https://coveralls.io/github/tjcsl/ion?branch=master
- :alt: Coverage
-
- *Version 3.0.0*
-
- Intranet3 (Ion) is the next-generation Intranet platform for `TJHSST
- `_. Using Python, Django, Redis, Postgres, and many other technologies, Ion was developed from the ground up to be simple, well-documented, and extensible.
-
- Documentation (in RestructuredText format) is available inside the "docs" folder or at https://tjcsl.github.io/ion publicly on the web.
-
- **What does the TJ Intranet do?** Ion allows students, teachers, and staff at TJHSST to access student information, manage activity signups for TJ's Eighth Period program, and view information on news and events. `Read more about how Ion is used at Thomas Jefferson `_.
-
- **Ion now requires Python 3.7+** Python 3.8.5 is currently used in both production and testing environments.
-
- **How can I create a testing environment?** Read the section on `Setting up Vagrant `_ in the documentation.
-
- **How can I contribute to Ion? How can I report a bug? How can I report a security issue/vulnerability?**
-
- Please read our `contributing guide `_ for more information.
-
- Current Intranet maintainer: `Laur04 `_
-
- Intranet maintainer emiriti: `Theo Ouzhinski `_ (TJ 2020) & `anonymoose2 `_
-
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)
@@ -45,3 +13,38 @@ Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Framework :: Django :: 1.11
+License-File: COPYING
+
+**********
+Intranet 3
+**********
+.. image:: https://github.com/tjcsl/ion/workflows/CI/badge.svg?branch=master
+ :target: https://github.com/tjcsl/ion/actions
+ :alt: CI
+
+.. image:: https://coveralls.io/repos/tjcsl/ion/badge.svg?branch=master&service=github
+ :target: https://coveralls.io/github/tjcsl/ion?branch=master
+ :alt: Coverage
+
+*Version 3.0.0*
+
+Intranet3 (Ion) is the next-generation Intranet platform for `TJHSST
+`_. Using Python, Django, Redis, Postgres, and many other technologies, Ion was developed from the ground up to be simple, well-documented, and extensible.
+
+Documentation (in RestructuredText format) is available inside the "docs" folder or at https://tjcsl.github.io/ion publicly on the web.
+
+**What does the TJ Intranet do?** Ion allows students, teachers, and staff at TJHSST to access student information, manage activity signups for TJ's Eighth Period program, and view information on news and events. `Read more about how Ion is used at Thomas Jefferson `_.
+
+**Ion now requires Python 3.7+** Python 3.8.5 is currently used in both production and testing environments.
+
+**How can I create a testing environment?** Read the section on `Setting up Vagrant `_ in the documentation.
+
+**How can I contribute to Ion? How can I report a bug? How can I report a security issue/vulnerability?**
+
+Please read our `contributing guide `_ for more information.
+
+Current Intranet maintainer: `Laur04 `_
+
+Intranet maintainer emiriti: `Theo Ouzhinski `_ (TJ 2020) & `anonymoose2 `_
+
+
diff --git a/ci/spec.yml b/ci/spec.yml
index c02e365ad55..a88825911bb 100644
--- a/ci/spec.yml
+++ b/ci/spec.yml
@@ -134,10 +134,7 @@ jobs:
- *copy_secret
- name: Regenerate workflow YAML file and check for changes
- run: |
- set -e
- pip install pyyaml
- ./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py
+ run: ./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py
# Build docs/sources
- name: Build docs
@@ -146,7 +143,7 @@ jobs:
run: ./scripts/build_ensure_no_changes.sh ./scripts/build_sources.sh
# Check for changes to CI spec
- - name: Check for chenges to CI spec
+ - name: Check for changes to CI spec
run: ./scripts/build_ensure_no_changes.sh ./ci/regen-workflow.py
# Check for unmigrated changes
diff --git a/setup.py b/setup.py
index 2c2e908720c..901d7b5151a 100755
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from setuptools import find_packages, setup