Metadata-Version: 2.1
Name: codeforlife
Version: 0.25.2
Summary: Code for Life's common code.
Home-page: https://github.com/ocadotechnology/codeforlife-package-python
Author: Ocado
Author-email: code-for-life-full-time-xd@ocado.com
Requires-Python: ==3.12.*
Description-Content-Type: text/markdown
License-File: LICENSE.md
Requires-Dist: cfl-common==8.0.7
Requires-Dist: codeforlife-portal==8.0.7
Requires-Dist: django-countries==7.6.1
Requires-Dist: django-csp==3.8
Requires-Dist: django-pipeline==3.1.0
Requires-Dist: django-preventconcurrentlogins==0.8.2
Requires-Dist: django-recaptcha==4.0.0
Requires-Dist: phonenumbers==8.12.12
Requires-Dist: pypng==0.20220715.0
Requires-Dist: pytz==2025.1
Requires-Dist: rapid-router==7.2.6
Requires-Dist: tzdata==2025.1; python_version >= "2"
Requires-Dist: python-dateutil==2.9.0.post0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
Requires-Dist: six==1.17.0; python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3"
Requires-Dist: django-reverse-js==0.1.7; python_version >= "3.10"
Requires-Dist: numpy==2.2.2; python_version >= "3.10"
Requires-Dist: django-ratelimit==3.0.1; python_version >= "3.4"
Requires-Dist: more-itertools==8.7.0; python_version >= "3.5"
Requires-Dist: pyhamcrest==2.0.2; python_version >= "3.5"
Requires-Dist: certifi==2025.1.31; python_version >= "3.6"
Requires-Dist: idna==3.10; python_version >= "3.6"
Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7"
Requires-Dist: click==8.1.8; python_version >= "3.7"
Requires-Dist: diff-match-patch==20241021; python_version >= "3.7"
Requires-Dist: django-filter==23.2; python_version >= "3.7"
Requires-Dist: django-otp==1.5.4; python_version >= "3.7"
Requires-Dist: django-storages[s3]==1.14.4; python_version >= "3.7"
Requires-Dist: gunicorn==23.0.0; python_version >= "3.7"
Requires-Dist: h11==0.14.0; python_version >= "3.7"
Requires-Dist: importlib-metadata==4.13.0; python_version >= "3.7"
Requires-Dist: jmespath==1.0.1; python_version >= "3.7"
Requires-Dist: psycopg2-binary==2.9.9; python_version >= "3.7"
Requires-Dist: pyjwt==2.6.0; python_version >= "3.7"
Requires-Dist: pyotp==2.9.0; python_version >= "3.7"
Requires-Dist: qrcode==7.4.2; python_version >= "3.7"
Requires-Dist: reportlab==3.6.13; python_version >= "3.7" and python_version < "4"
Requires-Dist: asgiref==3.8.1; python_version >= "3.8"
Requires-Dist: boto3==1.34.162; python_version >= "3.8"
Requires-Dist: botocore==1.34.162; python_version >= "3.8"
Requires-Dist: django==4.2.17; python_version >= "3.8"
Requires-Dist: django-classy-tags==4.1.0; python_version >= "3.8"
Requires-Dist: django-formtools==2.5.1; python_version >= "3.8"
Requires-Dist: django-phonenumber-field==8.0.0; python_version >= "3.8"
Requires-Dist: django-sekizai==4.1.0; python_version >= "3.8"
Requires-Dist: django-treebeard==4.7.1; python_version >= "3.8"
Requires-Dist: django-two-factor-auth==1.17.0; python_version >= "3.8"
Requires-Dist: djangorestframework==3.15.2; python_version >= "3.8"
Requires-Dist: libsass==0.23.0; python_version >= "3.8"
Requires-Dist: packaging==24.2; python_version >= "3.8"
Requires-Dist: pgeocode==0.4.0; python_version >= "3.8"
Requires-Dist: python-dotenv==1.0.1; python_version >= "3.8"
Requires-Dist: pyyaml==6.0.2; python_version >= "3.8"
Requires-Dist: requests==2.32.2; python_version >= "3.8"
Requires-Dist: s3transfer==0.10.4; python_version >= "3.8"
Requires-Dist: setuptools==74.0.0; python_version >= "3.8"
Requires-Dist: sqlparse==0.5.3; python_version >= "3.8"
Requires-Dist: typing-extensions==4.12.2; python_version >= "3.8"
Requires-Dist: uvicorn-worker==0.2.0; python_version >= "3.8"
Requires-Dist: django-cors-headers==4.7.0; python_version >= "3.9"
Requires-Dist: django-import-export==4.2.0; python_version >= "3.9"
Requires-Dist: pandas==2.2.3; python_version >= "3.9"
Requires-Dist: pillow==11.1.0; python_version >= "3.9"
Requires-Dist: tablib==3.7.0; python_version >= "3.9"
Requires-Dist: urllib3==2.3.0; python_version >= "3.9"
Requires-Dist: uvicorn==0.34.0; python_version >= "3.9"
Requires-Dist: zipp==3.21.0; python_version >= "3.9"
Provides-Extra: dev
Requires-Dist: mypy-boto3-cloudformation==1.35.93; extra == "dev"
Requires-Dist: mypy-boto3-dynamodb==1.35.94; extra == "dev"
Requires-Dist: mypy-boto3-ec2==1.35.98; extra == "dev"
Requires-Dist: mypy-boto3-lambda==1.35.93; extra == "dev"
Requires-Dist: mypy-boto3-rds==1.35.95; extra == "dev"
Requires-Dist: mypy-boto3-s3==1.35.93; extra == "dev"
Requires-Dist: mypy-boto3-sqs==1.35.93; extra == "dev"
Requires-Dist: psutil==6.1.1; extra == "dev"
Requires-Dist: pyparsing==3.0.9; python_full_version >= "3.6.8" and extra == "dev"
Requires-Dist: astroid==3.2.4; python_full_version >= "3.8.0" and extra == "dev"
Requires-Dist: isort==5.13.2; python_full_version >= "3.8.0" and extra == "dev"
Requires-Dist: pylint==3.2.7; python_full_version >= "3.8.0" and extra == "dev"
Requires-Dist: pydot==1.4.2; (python_version >= "2.7" and python_version not in "3.0, 3.1, 3.2, 3.3") and extra == "dev"
Requires-Dist: dill==0.3.9; python_version >= "3.11" and extra == "dev"
Requires-Dist: mypy-extensions==1.0.0; python_version >= "3.5" and extra == "dev"
Requires-Dist: pytest-django==4.5.2; python_version >= "3.5" and extra == "dev"
Requires-Dist: certifi==2025.1.31; python_version >= "3.6" and extra == "dev"
Requires-Dist: django-extensions==3.2.1; python_version >= "3.6" and extra == "dev"
Requires-Dist: idna==3.10; python_version >= "3.6" and extra == "dev"
Requires-Dist: mccabe==0.7.0; python_version >= "3.6" and extra == "dev"
Requires-Dist: django-test-migrations==1.2.0; (python_version >= "3.6" and python_version < "4.0") and extra == "dev"
Requires-Dist: charset-normalizer==3.4.1; python_version >= "3.7" and extra == "dev"
Requires-Dist: click==8.1.8; python_version >= "3.7" and extra == "dev"
Requires-Dist: iniconfig==2.0.0; python_version >= "3.7" and extra == "dev"
Requires-Dist: pytest-env==0.8.1; python_version >= "3.7" and extra == "dev"
Requires-Dist: pytest-xdist[psutil]==3.5.0; python_version >= "3.7" and extra == "dev"
Requires-Dist: pylint-django==2.5.5; (python_version >= "3.7" and python_version < "4.0") and extra == "dev"
Requires-Dist: pylint-plugin-utils==0.8.2; (python_version >= "3.7" and python_version < "4.0") and extra == "dev"
Requires-Dist: asgiref==3.8.1; python_version >= "3.8" and extra == "dev"
Requires-Dist: black==24.8.0; python_version >= "3.8" and extra == "dev"
Requires-Dist: boto3-stubs[essential]==1.35.71; python_version >= "3.8" and extra == "dev"
Requires-Dist: botocore-stubs==1.36.15; python_version >= "3.8" and extra == "dev"
Requires-Dist: django==4.2.17; python_version >= "3.8" and extra == "dev"
Requires-Dist: django-stubs[compatible-mypy]==4.2.6; python_version >= "3.8" and extra == "dev"
Requires-Dist: django-stubs-ext==5.1.3; python_version >= "3.8" and extra == "dev"
Requires-Dist: djangorestframework-stubs[compatible-mypy]==3.14.4; python_version >= "3.8" and extra == "dev"
Requires-Dist: execnet==2.1.1; python_version >= "3.8" and extra == "dev"
Requires-Dist: mypy==1.6.1; python_version >= "3.8" and extra == "dev"
Requires-Dist: packaging==24.2; python_version >= "3.8" and extra == "dev"
Requires-Dist: pathspec==0.12.1; python_version >= "3.8" and extra == "dev"
Requires-Dist: platformdirs==4.3.6; python_version >= "3.8" and extra == "dev"
Requires-Dist: pluggy==1.5.0; python_version >= "3.8" and extra == "dev"
Requires-Dist: pytest==8.3.3; python_version >= "3.8" and extra == "dev"
Requires-Dist: pytest-cov==5.0.0; python_version >= "3.8" and extra == "dev"
Requires-Dist: requests==2.32.2; python_version >= "3.8" and extra == "dev"
Requires-Dist: sqlparse==0.5.3; python_version >= "3.8" and extra == "dev"
Requires-Dist: tomlkit==0.13.2; python_version >= "3.8" and extra == "dev"
Requires-Dist: types-awscrt==0.23.9; python_version >= "3.8" and extra == "dev"
Requires-Dist: types-pyyaml==6.0.12.20241230; python_version >= "3.8" and extra == "dev"
Requires-Dist: types-requests==2.32.0.20241016; python_version >= "3.8" and extra == "dev"
Requires-Dist: types-s3transfer==0.11.2; python_version >= "3.8" and extra == "dev"
Requires-Dist: typing-extensions==4.12.2; python_version >= "3.8" and extra == "dev"
Requires-Dist: coverage[toml]==7.6.10; python_version >= "3.9" and extra == "dev"
Requires-Dist: types-pytz==2025.1.0.20250204; python_version >= "3.9" and extra == "dev"
Requires-Dist: urllib3==2.3.0; python_version >= "3.9" and extra == "dev"

# codeforlife-package-python

This repo contains CFL's python package. This will be installed into all backend services.

## LICENCE
In accordance with the [Terms of Use](https://www.codeforlife.education/terms#terms)
of the Code for Life website, all copyright, trademarks, and other
intellectual property rights in and relating to Code for Life (including all
content of the Code for Life website, the Rapid Router application, the
Kurono application, related software (including any drawn and/or animated
avatars, whether such avatars have any modifications) and any other games,
applications or any other content that we make available from time to time) are
owned by Ocado Innovation Limited.

The source code of the Code for Life portal, the Rapid Router application
and the Kurono/aimmo application are [licensed under the GNU Affero General
Public License](https://github.com/ocadotechnology/codeforlife-workspace/blob/main/LICENSE.md).
All other assets including images, logos, sounds etc., are not covered by
this licence and no-one may copy, modify, distribute, show in public or
create any derivative work from these assets.

## Installation

To install this package, do one of the following options.

*Ensure you're installing the package with the required python version. See [setup.py](setup.py).*

*Remember to replace the version number ("0.0.0") with your [desired version](https://github.com/ocadotechnology/codeforlife-package-python/releases).*

**Option 1:** Run `pipenv install` command:

```bash
pipenv install git+https://github.com/ocadotechnology/codeforlife-package-python.git@v0.0.0#egg=codeforlife
```

**Option 2:** Add a row to `[packages]` in `Pipfile`:

```toml
[packages]
codeforlife = {ref = "v0.0.0", git = "https://github.com/ocadotechnology/codeforlife-package-python.git"}
```

## Making Changes

To make changes, you must:

1. Branch off of main.
1. Push your changes on your branch.
1. Ensure the pipeline runs successfully on your branch.
1. Have your changes reviewed and approved by a peer.
1. Merge your branch into the `main` branch.
1. [Manually trigger](https://github.com/ocadotechnology/codeforlife-package-python/actions/workflows/main.yml)
the `Main` pipeline for the `main` branch.

### Installing your branch

You may wish to install and integrate your changes into a CFL backend before it's been peer-reviewed.

*Remember to replace the branch name ("my-branch") with your
[branch](https://github.com/ocadotechnology/codeforlife-package-python/branches)*.

```toml
[packages]
codeforlife = {ref = "my-branch", git = "https://github.com/ocadotechnology/codeforlife-package-python.git"}
```

## Version Release

New versions of this package are automatically created via a GitHub Actions [workflow](.github/workflows/python-package.yml). Versions are determined using the [semantic-release commit message format](https://semantic-release.gitbook.io/semantic-release/#commit-message-format).

A new package may only be released if:

1. there are no formatting errors;
1. all unit tests pass;
1. (TODO) test/code coverage is acceptable.
