diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..94143827 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +Dockerfile diff --git a/.github/docker-compose-ci.yml b/.github/docker-compose-ci.yml index e0c6ee46..21d29508 100644 --- a/.github/docker-compose-ci.yml +++ b/.github/docker-compose-ci.yml @@ -3,7 +3,7 @@ version: "2" services: analytics_api: - image: edxops/analytics_api:latest + image: edxops/analytics-api-dev:latest container_name: analytics_api_testing volumes: - ..:/edx/app/analytics_api/analytics_api diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac99c887..673f96e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,9 +21,9 @@ jobs: targets: [ 'quality','main.test','docs' ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: setup python - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml deleted file mode 100644 index 142977a8..00000000 --- a/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Push Docker Images - -on: - push: - branches: - - master -jobs: - push: - runs-on: ubuntu-latest - if: github.event_name == 'push' - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Build and Push docker image - env: - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - run : make docker_push diff --git a/.github/workflows/push-docker-images.yml b/.github/workflows/push-docker-images.yml new file mode 100644 index 00000000..ef465b17 --- /dev/null +++ b/.github/workflows/push-docker-images.yml @@ -0,0 +1,51 @@ +name: Build and Push Docker Images + +on: + push: + branches: + - master + - open-release/** +jobs: + push: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + # Use the release name as the image tag if we're building an open release branch. + # Examples: if we're building 'open-release/maple.master', tag the image as 'maple.master'. + # Otherwise, we must be building from a push to master, so use 'latest'. + - name: Get tag name + id: get-tag-name + uses: actions/github-script@v5 + with: + script: | + const branchName = context.ref.split('/').slice(-1)[0]; + const tagName = branchName === 'master' ? 'latest' : branchName; + console.log('Will use tag: ' + tagName); + return tagName; + result-encoding: string + + - name: Build and push Dev Docker image + uses: docker/build-push-action@v1 + with: + push: true + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + target: dev + repository: edxops/analytics-api-dev + tags: ${{ steps.get-tag-name.outputs.result }},${{ github.sha }} + + # This part is commented out for now as edxops/insights is the older image built using Ansible. + # For smooth transition we want to keep that image intact too. Apart from this, the current priority is to get + # the devstack off of Ansible based Images. + # - name: Build and push prod Docker image + # uses: docker/build-push-action@v1 + # with: + # push: true + # username: ${{ secrets.DOCKERHUB_USERNAME }} + # password: ${{ secrets.DOCKERHUB_PASSWORD }} + # target: prod + # repository: edxops/insights + # tags: ${{ steps.get-tag-name.outputs.result }},${{ github.sha }} diff --git a/.gitignore b/.gitignore index 6b33699c..01964783 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,6 @@ elasticsearch-* # Visual Studio Code .vscode + +#Pyenv +.python-version diff --git a/Dockerfile b/Dockerfile index 7e58ca31..71201ef7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,77 @@ -FROM ubuntu:focal as app +FROM ubuntu:focal as base +# System requirements. RUN apt update && \ - apt-get install -y software-properties-common && \ - apt-add-repository -y ppa:deadsnakes/ppa && apt-get update && \ - apt install -y git-core language-pack-en python3.8-dev python3.8-venv libmysqlclient-dev libffi-dev libssl-dev build-essential gettext openjdk-8-jdk && \ + apt-get install -qy \ + curl \ + vim \ + language-pack-en \ + build-essential \ + python3.8-dev \ + python3-virtualenv \ + python3.8-distutils \ + libmysqlclient-dev \ + libssl-dev && \ rm -rf /var/lib/apt/lists/* -ENV VIRTUAL_ENV=/venv -RUN python3.8 -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" - -RUN pip install pip==20.2.3 setuptools==50.3.0 - +# Use UTF-8. RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 -ENV ANALYTICS_API_CFG /edx/etc/analytics_api.yml -WORKDIR /edx/app/analytics_api -COPY requirements /edx/app/analytics_api/requirements -RUN pip install -r requirements/production.txt +ARG COMMON_APP_DIR="/edx/app" +ARG ANALYTICS_API_SERVICE_NAME="analytics_api" +ENV ANALYTICS_API_HOME "${COMMON_APP_DIR}/${ANALYTICS_API_SERVICE_NAME}" +ARG ANALYTICS_API_APP_DIR="${COMMON_APP_DIR}/${ANALYTICS_API_SERVICE_NAME}" +ARG ANALYTICS_API_VENV_DIR="${COMMON_APP_DIR}/${ANALYTICS_API_SERVICE_NAME}/venvs/${ANALYTICS_API_SERVICE_NAME}" +ARG ANALYTICS_API_CODE_DIR="${ANALYTICS_API_APP_DIR}/${ANALYTICS_API_SERVICE_NAME}" + +ENV ANALYTICS_API_CODE_DIR="${ANALYTICS_API_CODE_DIR}" +ENV PATH "${ANALYTICS_API_VENV_DIR}/bin:$PATH" +ENV COMMON_CFG_DIR "/edx/etc" +ENV ANALYTICS_API_CFG "/edx/etc/${ANALYTICS_API_SERVICE_NAME}.yml" + +# Working directory will be root of repo. +WORKDIR ${ANALYTICS_API_CODE_DIR} + +RUN virtualenv -p python3.8 --always-copy ${ANALYTICS_API_VENV_DIR} + +# Expose canonical Analytics port +EXPOSE 19001 + +FROM base as prod + +ENV DJANGO_SETTINGS_MODULE "analyticsdataserver.settings.production" + +COPY requirements/production.txt ${ANALYTICS_API_CODE_DIR}/requirements/production.txt + +RUN pip install -r ${ANALYTICS_API_CODE_DIR}/requirements/production.txt + +# Copy over rest of code. +# We do this AFTER requirements so that the requirements cache isn't busted +# every time any bit of code is changed. + +COPY . . + +# exec /edx/app/analytics_api/venvs/analytics_api/bin/gunicorn -c /edx/app/analytics_api/analytics_api_gunicorn.py analyticsdataserver.wsgi:application + +CMD ["gunicorn" , "-b", "0.0.0.0:8100", "--pythonpath", "/edx/app/analytics_api/analytics_api","analyticsdataserver.wsgi:application"] + +FROM base as dev + +ENV DJANGO_SETTINGS_MODULE "analyticsdataserver.settings.devstack" + +COPY requirements/dev.txt ${ANALYTICS_API_CODE_DIR}/requirements/dev.txt + +RUN pip install -r ${ANALYTICS_API_CODE_DIR}/requirements/dev.txt -EXPOSE 8100 -CMD gunicorn --bind=0.0.0.0:8100 --workers 2 --max-requests=1000 -c /edx/app/analytics_api/analytics_data_api/docker_gunicorn_configuration.py analyticsdataserver.wsgi:application +# Copy over rest of code. +# We do this AFTER requirements so that the requirements cache isn't busted +# every time any bit of code is changed. +COPY . . -RUN useradd -m --shell /bin/false app -USER app -COPY . /edx/app/analytics_api +# Devstack related step for backwards compatibility +RUN touch /edx/app/${ANALYTICS_API_SERVICE_NAME}/${ANALYTICS_API_SERVICE_NAME}_env -FROM app as newrelic -RUN pip install newrelic -CMD newrelic-admin run-program gunicorn --bind=0.0.0.0:8100 --workers 2 --max-requests=1000 -c /edx/app/analytics_api/analytics_data_api/docker_gunicorn_configuration.py analyticsdataserver.wsgi:application +CMD while true; do python ./manage.py runserver 0.0.0.0:8110; sleep 2; done diff --git a/Makefile b/Makefile index 0421c4cc..181c8f0f 100644 --- a/Makefile +++ b/Makefile @@ -120,22 +120,5 @@ github_ci: test.requirements clean migrate-all ## Used by CI for testing python manage.py generate_fake_course_data --database=analytics --num-weeks=2 --no-videos --course-id "edX/DemoX/Demo_Course" python manage.py generate_fake_course_data --database=analytics_v1 --num-weeks=2 --no-videos --course-id "edX/DemoX/Demo_Course" -docker_build: - docker build . -f Dockerfile -t openedx/analytics-data-api - docker build . -f Dockerfile --target newrelic -t openedx/analytics-data-api:latest-newrelic - -docker_tag: docker_build - docker tag openedx/analytics-data-api openedx/analytics-data-api:${GITHUB_SHA} - docker tag openedx/analytics-data-api:latest-newrelic openedx/analytics-data-api:${GITHUB_SHA}-newrelic - -docker_auth: - echo "$$DOCKERHUB_PASSWORD" | docker login -u "$$DOCKERHUB_USERNAME" --password-stdin - -docker_push: docker_tag docker_auth ## push to docker hub - docker push 'openedx/analytics-data-api:latest' - docker push "openedx/analytics-data-api:${GITHUB_SHA}" - docker push 'openedx/analytics-data-api:latest-newrelic' - docker push "openedx/analytics-data-api:${GITHUB_SHA}-newrelic" - docs: tox.requirements tox -e docs diff --git a/requirements/base.txt b/requirements/base.txt index d52b1ab0..7e78efe7 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,26 +1,26 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -asgiref==3.5.2 +asgiref==3.6.0 # via django boto==2.49.0 # via -r requirements/base.in -boto3==1.24.70 +boto3==1.26.55 # via -r requirements/base.in -botocore==1.27.70 +botocore==1.29.55 # via # boto3 # s3transfer -certifi==2022.6.15.1 +certifi==2022.12.7 # via requests cffi==1.15.1 # via # cryptography # pynacl -charset-normalizer==2.1.1 +charset-normalizer==3.0.1 # via requests click==8.1.3 # via edx-django-utils @@ -32,7 +32,7 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -cryptography==38.0.1 +cryptography==39.0.0 # via # django-fernet-fields # pyjwt @@ -57,7 +57,7 @@ django==3.2.17 # edx-rbac django-cors-headers==3.13.0 # via -r requirements/base.in -django-countries==7.3.2 +django-countries==7.5 # via -r requirements/base.in django-crum==0.7.9 # via @@ -67,7 +67,7 @@ django-fernet-fields==0.6 # via edx-enterprise-data django-filter==22.1 # via edx-enterprise-data -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # edx-enterprise-data # edx-rbac @@ -79,7 +79,7 @@ django-waffle==3.0.0 # via # edx-django-utils # edx-drf-extensions -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.in # djangorestframework-csv @@ -91,7 +91,7 @@ djangorestframework-csv==2.1.1 # via -r requirements/base.in drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.21.3 +drf-yasg==1.21.4 # via edx-api-doc-tools edx-api-doc-tools==1.6.0 # via -r requirements/base.in @@ -99,18 +99,18 @@ edx-ccx-keys==1.2.1 # via -r requirements/base.in edx-django-release-util==1.2.0 # via -r requirements/base.in -edx-django-utils==5.0.1 +edx-django-utils==5.2.0 # via # -r requirements/base.in # edx-drf-extensions # edx-enterprise-data # edx-rest-api-client -edx-drf-extensions==8.3.1 +edx-drf-extensions==8.4.1 # via # -r requirements/base.in # edx-enterprise-data # edx-rbac -edx-enterprise-data==4.6.3 +edx-enterprise-data==4.6.4 # via -r requirements/base.in edx-opaque-keys==2.3.0 # via @@ -126,15 +126,15 @@ edx-rest-api-client==5.5.0 # edx-enterprise-data factory-boy==3.2.1 # via edx-enterprise-data -faker==14.2.0 +faker==16.6.0 # via factory-boy -future==0.18.2 +future==0.18.3 # via pyjwkest html5lib==1.1 # via -r requirements/base.in -idna==3.3 +idna==3.4 # via requests -importlib-metadata==4.12.0 +importlib-metadata==6.0.0 # via markdown inflection==0.5.1 # via drf-yasg @@ -148,35 +148,33 @@ jmespath==1.0.1 # botocore markdown==3.4.1 # via -r requirements/base.in -markupsafe==2.1.1 +markupsafe==2.1.2 # via jinja2 -newrelic==8.0.0.179 +newrelic==8.5.0 # via edx-django-utils ordered-set==4.1.0 # via -r requirements/base.in -packaging==21.3 +packaging==23.0 # via drf-yasg -pbr==5.10.0 +pbr==5.11.1 # via stevedore -psutil==5.9.2 +psutil==5.9.4 # via edx-django-utils pycparser==2.21 # via cffi -pycryptodomex==3.15.0 +pycryptodomex==3.16.0 # via pyjwkest pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==2.4.0 +pyjwt[crypto]==2.6.0 # via # drf-jwt # edx-drf-extensions # edx-rest-api-client -pymongo==3.12.3 +pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils -pyparsing==3.0.9 - # via packaging python-dateutil==2.8.2 # via # botocore @@ -184,14 +182,14 @@ python-dateutil==2.8.2 # faker python-memcached==1.59 # via -r requirements/base.in -pytz==2022.2.1 +pytz==2022.7.1 # via # django # djangorestframework # drf-yasg pyyaml==6.0 # via edx-django-release-util -requests==2.28.1 +requests==2.28.2 # via # coreapi # edx-drf-extensions @@ -201,7 +199,7 @@ requests==2.28.1 # slumber ruamel-yaml==0.17.21 # via drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via ruamel-yaml rules==3.3 # via edx-enterprise-data @@ -222,15 +220,15 @@ six==1.16.0 # python-memcached slumber==0.7.1 # via edx-rest-api-client -sqlparse==0.4.2 +sqlparse==0.4.3 # via django -stevedore==4.0.0 +stevedore==4.1.1 # via # edx-django-utils # edx-opaque-keys tqdm==4.64.1 # via -r requirements/base.in -typing-extensions==4.3.0 +typing-extensions==4.4.0 # via django-countries unicodecsv==0.14.1 # via djangorestframework-csv @@ -238,12 +236,12 @@ uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.12 +urllib3==1.26.14 # via # -r requirements/base.in # botocore # requests webencodings==0.5.1 # via html5lib -zipp==3.8.1 +zipp==3.11.0 # via importlib-metadata diff --git a/requirements/ci.txt b/requirements/ci.txt index 543fbd0b..19a21bea 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,20 +1,20 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -certifi==2022.6.15.1 +certifi==2022.12.7 # via requests -charset-normalizer==2.1.1 +charset-normalizer==3.0.1 # via requests codecov==2.1.12 # via -r requirements/ci.in -coverage==6.4.4 +coverage==7.0.5 # via codecov -idna==3.3 +idna==3.4 # via requests -requests==2.28.1 +requests==2.28.2 # via codecov -urllib3==1.26.12 +urllib3==1.26.14 # via requests diff --git a/requirements/constraints.txt b/requirements/constraints.txt index de1c0823..363d74cd 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -23,3 +23,7 @@ elasticsearch-dsl>=7.2.1,<8.0.0 # Use same version of edx-lint pylint==2.4.4 pylint-django==2.0.11 + +# tox>4.0.0 isn't yet compatible with many tox plugins, causing CI failures in almost all repos. +# Details can be found in this discussion: https://github.com/tox-dev/tox/discussions/1810 +tox<4.0.0 diff --git a/requirements/dev.in b/requirements/dev.in index abfb2005..0c6a6795 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -1,3 +1,4 @@ # Local development dependencies go here -r base.in # Core dependencies of edx-analytics-data-api +mysqlclient diff --git a/requirements/dev.txt b/requirements/dev.txt index d52b1ab0..16da609d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,26 +1,26 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -asgiref==3.5.2 +asgiref==3.6.0 # via django boto==2.49.0 # via -r requirements/base.in -boto3==1.24.70 +boto3==1.26.55 # via -r requirements/base.in -botocore==1.27.70 +botocore==1.29.55 # via # boto3 # s3transfer -certifi==2022.6.15.1 +certifi==2022.12.7 # via requests cffi==1.15.1 # via # cryptography # pynacl -charset-normalizer==2.1.1 +charset-normalizer==3.0.1 # via requests click==8.1.3 # via edx-django-utils @@ -32,7 +32,7 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -cryptography==38.0.1 +cryptography==39.0.0 # via # django-fernet-fields # pyjwt @@ -57,7 +57,7 @@ django==3.2.17 # edx-rbac django-cors-headers==3.13.0 # via -r requirements/base.in -django-countries==7.3.2 +django-countries==7.5 # via -r requirements/base.in django-crum==0.7.9 # via @@ -67,7 +67,7 @@ django-fernet-fields==0.6 # via edx-enterprise-data django-filter==22.1 # via edx-enterprise-data -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # edx-enterprise-data # edx-rbac @@ -79,7 +79,7 @@ django-waffle==3.0.0 # via # edx-django-utils # edx-drf-extensions -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.in # djangorestframework-csv @@ -91,7 +91,7 @@ djangorestframework-csv==2.1.1 # via -r requirements/base.in drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.21.3 +drf-yasg==1.21.4 # via edx-api-doc-tools edx-api-doc-tools==1.6.0 # via -r requirements/base.in @@ -99,18 +99,18 @@ edx-ccx-keys==1.2.1 # via -r requirements/base.in edx-django-release-util==1.2.0 # via -r requirements/base.in -edx-django-utils==5.0.1 +edx-django-utils==5.2.0 # via # -r requirements/base.in # edx-drf-extensions # edx-enterprise-data # edx-rest-api-client -edx-drf-extensions==8.3.1 +edx-drf-extensions==8.4.1 # via # -r requirements/base.in # edx-enterprise-data # edx-rbac -edx-enterprise-data==4.6.3 +edx-enterprise-data==4.6.4 # via -r requirements/base.in edx-opaque-keys==2.3.0 # via @@ -126,15 +126,15 @@ edx-rest-api-client==5.5.0 # edx-enterprise-data factory-boy==3.2.1 # via edx-enterprise-data -faker==14.2.0 +faker==16.6.0 # via factory-boy -future==0.18.2 +future==0.18.3 # via pyjwkest html5lib==1.1 # via -r requirements/base.in -idna==3.3 +idna==3.4 # via requests -importlib-metadata==4.12.0 +importlib-metadata==6.0.0 # via markdown inflection==0.5.1 # via drf-yasg @@ -148,35 +148,35 @@ jmespath==1.0.1 # botocore markdown==3.4.1 # via -r requirements/base.in -markupsafe==2.1.1 +markupsafe==2.1.2 # via jinja2 -newrelic==8.0.0.179 +mysqlclient==2.1.1 + # via -r requirements/dev.in +newrelic==8.5.0 # via edx-django-utils ordered-set==4.1.0 # via -r requirements/base.in -packaging==21.3 +packaging==23.0 # via drf-yasg -pbr==5.10.0 +pbr==5.11.1 # via stevedore -psutil==5.9.2 +psutil==5.9.4 # via edx-django-utils pycparser==2.21 # via cffi -pycryptodomex==3.15.0 +pycryptodomex==3.16.0 # via pyjwkest pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==2.4.0 +pyjwt[crypto]==2.6.0 # via # drf-jwt # edx-drf-extensions # edx-rest-api-client -pymongo==3.12.3 +pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils -pyparsing==3.0.9 - # via packaging python-dateutil==2.8.2 # via # botocore @@ -184,14 +184,14 @@ python-dateutil==2.8.2 # faker python-memcached==1.59 # via -r requirements/base.in -pytz==2022.2.1 +pytz==2022.7.1 # via # django # djangorestframework # drf-yasg pyyaml==6.0 # via edx-django-release-util -requests==2.28.1 +requests==2.28.2 # via # coreapi # edx-drf-extensions @@ -201,7 +201,7 @@ requests==2.28.1 # slumber ruamel-yaml==0.17.21 # via drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via ruamel-yaml rules==3.3 # via edx-enterprise-data @@ -222,15 +222,15 @@ six==1.16.0 # python-memcached slumber==0.7.1 # via edx-rest-api-client -sqlparse==0.4.2 +sqlparse==0.4.3 # via django -stevedore==4.0.0 +stevedore==4.1.1 # via # edx-django-utils # edx-opaque-keys tqdm==4.64.1 # via -r requirements/base.in -typing-extensions==4.3.0 +typing-extensions==4.4.0 # via django-countries unicodecsv==0.14.1 # via djangorestframework-csv @@ -238,12 +238,12 @@ uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.12 +urllib3==1.26.14 # via # -r requirements/base.in # botocore # requests webencodings==0.5.1 # via html5lib -zipp==3.8.1 +zipp==3.11.0 # via importlib-metadata diff --git a/requirements/doc.txt b/requirements/doc.txt index 1181ea13..8c8ba5a9 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,30 +1,30 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -alabaster==0.7.12 +alabaster==0.7.13 # via sphinx -asgiref==3.5.2 +asgiref==3.6.0 # via django -babel==2.10.3 +babel==2.11.0 # via sphinx boto==2.49.0 # via -r requirements/base.in -boto3==1.24.70 +boto3==1.26.55 # via -r requirements/base.in -botocore==1.27.70 +botocore==1.29.55 # via # boto3 # s3transfer -certifi==2022.6.15.1 +certifi==2022.12.7 # via requests cffi==1.15.1 # via # cryptography # pynacl -charset-normalizer==2.1.1 +charset-normalizer==3.0.1 # via requests click==8.1.3 # via edx-django-utils @@ -36,7 +36,7 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -cryptography==38.0.1 +cryptography==39.0.0 # via # django-fernet-fields # pyjwt @@ -61,7 +61,7 @@ django==3.2.17 # edx-rbac django-cors-headers==3.13.0 # via -r requirements/base.in -django-countries==7.3.2 +django-countries==7.5 # via -r requirements/base.in django-crum==0.7.9 # via @@ -71,7 +71,7 @@ django-fernet-fields==0.6 # via edx-enterprise-data django-filter==22.1 # via edx-enterprise-data -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # edx-enterprise-data # edx-rbac @@ -83,7 +83,7 @@ django-waffle==3.0.0 # via # edx-django-utils # edx-drf-extensions -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.in # djangorestframework-csv @@ -97,7 +97,7 @@ docutils==0.19 # via sphinx drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.21.3 +drf-yasg==1.21.4 # via edx-api-doc-tools edx-api-doc-tools==1.6.0 # via -r requirements/base.in @@ -105,18 +105,18 @@ edx-ccx-keys==1.2.1 # via -r requirements/base.in edx-django-release-util==1.2.0 # via -r requirements/base.in -edx-django-utils==5.0.1 +edx-django-utils==5.2.0 # via # -r requirements/base.in # edx-drf-extensions # edx-enterprise-data # edx-rest-api-client -edx-drf-extensions==8.3.1 +edx-drf-extensions==8.4.1 # via # -r requirements/base.in # edx-enterprise-data # edx-rbac -edx-enterprise-data==4.6.3 +edx-enterprise-data==4.6.4 # via -r requirements/base.in edx-opaque-keys==2.3.0 # via @@ -130,21 +130,21 @@ edx-rest-api-client==5.5.0 # via # -r requirements/base.in # edx-enterprise-data -edx-sphinx-theme==3.0.0 +edx-sphinx-theme==3.1.0 # via -r requirements/doc.in factory-boy==3.2.1 # via edx-enterprise-data -faker==14.2.0 +faker==16.6.0 # via factory-boy -future==0.18.2 +future==0.18.3 # via pyjwkest html5lib==1.1 # via -r requirements/base.in -idna==3.3 +idna==3.4 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==4.12.0 +importlib-metadata==6.0.0 # via # markdown # sphinx @@ -162,41 +162,39 @@ jmespath==1.0.1 # botocore markdown==3.4.1 # via -r requirements/base.in -markupsafe==2.1.1 +markupsafe==2.1.2 # via jinja2 -newrelic==8.0.0.179 +newrelic==8.5.0 # via edx-django-utils ordered-set==4.1.0 # via -r requirements/base.in -packaging==21.3 +packaging==23.0 # via # drf-yasg # sphinx -path==16.4.0 +path==16.6.0 # via -r requirements/doc.in -pbr==5.10.0 +pbr==5.11.1 # via stevedore -psutil==5.9.2 +psutil==5.9.4 # via edx-django-utils pycparser==2.21 # via cffi -pycryptodomex==3.15.0 +pycryptodomex==3.16.0 # via pyjwkest -pygments==2.13.0 +pygments==2.14.0 # via sphinx pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==2.4.0 +pyjwt[crypto]==2.6.0 # via # drf-jwt # edx-drf-extensions # edx-rest-api-client -pymongo==3.12.3 +pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils -pyparsing==3.0.9 - # via packaging python-dateutil==2.8.2 # via # botocore @@ -204,7 +202,7 @@ python-dateutil==2.8.2 # faker python-memcached==1.59 # via -r requirements/base.in -pytz==2022.2.1 +pytz==2022.7.1 # via # babel # django @@ -212,7 +210,7 @@ pytz==2022.2.1 # drf-yasg pyyaml==6.0 # via edx-django-release-util -requests==2.28.1 +requests==2.28.2 # via # coreapi # edx-drf-extensions @@ -223,7 +221,7 @@ requests==2.28.1 # sphinx ruamel-yaml==0.17.21 # via drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via ruamel-yaml rules==3.3 # via edx-enterprise-data @@ -247,11 +245,11 @@ slumber==0.7.1 # via edx-rest-api-client snowballstemmer==2.2.0 # via sphinx -sphinx==5.1.1 +sphinx==5.3.0 # via # -r requirements/doc.in # edx-sphinx-theme -sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-devhelp==1.0.2 # via sphinx @@ -263,15 +261,15 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sqlparse==0.4.2 +sqlparse==0.4.3 # via django -stevedore==4.0.0 +stevedore==4.1.1 # via # edx-django-utils # edx-opaque-keys tqdm==4.64.1 # via -r requirements/base.in -typing-extensions==4.3.0 +typing-extensions==4.4.0 # via django-countries unicodecsv==0.14.1 # via djangorestframework-csv @@ -279,12 +277,12 @@ uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.12 +urllib3==1.26.14 # via # -r requirements/base.in # botocore # requests webencodings==0.5.1 # via html5lib -zipp==3.8.1 +zipp==3.11.0 # via importlib-metadata diff --git a/requirements/pip.txt b/requirements/pip.txt index a14541b6..82e1279e 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,14 +1,12 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # pip-compile --allow-unsafe --output-file=requirements/pip.txt requirements/pip.in # -wheel==0.37.1 +pip==22.3.1 # via -r requirements/pip.in - -# The following packages are considered to be unsafe in a requirements file: -pip==22.2.2 +setuptools==66.1.1 # via -r requirements/pip.in -setuptools==65.3.0 +wheel==0.38.4 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index 02f5a0ce..0150a928 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -1,28 +1,24 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -build==0.8.0 +build==0.10.0 # via pip-tools click==8.1.3 # via pip-tools -packaging==21.3 +packaging==23.0 # via build -pep517==0.13.0 - # via build -pip-tools==6.8.0 +pip-tools==6.12.1 # via -r requirements/pip_tools.in -pyparsing==3.0.9 - # via packaging +pyproject-hooks==1.0.0 + # via build six==1.16.0 # via -r requirements/pip_tools.in tomli==2.0.1 - # via - # build - # pep517 -wheel==0.37.1 + # via build +wheel==0.38.4 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/production.txt b/requirements/production.txt index 8ae4d851..bcf9bc6c 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1,26 +1,26 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -asgiref==3.5.2 +asgiref==3.6.0 # via django boto==2.49.0 # via -r requirements/base.in -boto3==1.24.70 +boto3==1.26.55 # via -r requirements/base.in -botocore==1.27.70 +botocore==1.29.55 # via # boto3 # s3transfer -certifi==2022.6.15.1 +certifi==2022.12.7 # via requests cffi==1.15.1 # via # cryptography # pynacl -charset-normalizer==2.1.1 +charset-normalizer==3.0.1 # via requests click==8.1.3 # via edx-django-utils @@ -32,7 +32,7 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -cryptography==38.0.1 +cryptography==39.0.0 # via # django-fernet-fields # pyjwt @@ -57,7 +57,7 @@ django==3.2.17 # edx-rbac django-cors-headers==3.13.0 # via -r requirements/base.in -django-countries==7.3.2 +django-countries==7.5 # via -r requirements/base.in django-crum==0.7.9 # via @@ -67,7 +67,7 @@ django-fernet-fields==0.6 # via edx-enterprise-data django-filter==22.1 # via edx-enterprise-data -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # edx-enterprise-data # edx-rbac @@ -79,7 +79,7 @@ django-waffle==3.0.0 # via # edx-django-utils # edx-drf-extensions -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.in # djangorestframework-csv @@ -91,7 +91,7 @@ djangorestframework-csv==2.1.1 # via -r requirements/base.in drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.21.3 +drf-yasg==1.21.4 # via edx-api-doc-tools edx-api-doc-tools==1.6.0 # via -r requirements/base.in @@ -99,18 +99,18 @@ edx-ccx-keys==1.2.1 # via -r requirements/base.in edx-django-release-util==1.2.0 # via -r requirements/base.in -edx-django-utils==5.0.1 +edx-django-utils==5.2.0 # via # -r requirements/base.in # edx-drf-extensions # edx-enterprise-data # edx-rest-api-client -edx-drf-extensions==8.3.1 +edx-drf-extensions==8.4.1 # via # -r requirements/base.in # edx-enterprise-data # edx-rbac -edx-enterprise-data==4.6.3 +edx-enterprise-data==4.6.4 # via -r requirements/base.in edx-opaque-keys==2.3.0 # via @@ -126,21 +126,21 @@ edx-rest-api-client==5.5.0 # edx-enterprise-data factory-boy==3.2.1 # via edx-enterprise-data -faker==14.2.0 +faker==16.6.0 # via factory-boy -future==0.18.2 +future==0.18.3 # via pyjwkest -gevent==21.12.0 +gevent==22.10.2 # via -r requirements/production.in -greenlet==1.1.3 +greenlet==2.0.1 # via gevent gunicorn==20.1.0 # via -r requirements/production.in html5lib==1.1 # via -r requirements/base.in -idna==3.3 +idna==3.4 # via requests -importlib-metadata==4.12.0 +importlib-metadata==6.0.0 # via markdown inflection==0.5.1 # via drf-yasg @@ -154,41 +154,39 @@ jmespath==1.0.1 # botocore markdown==3.4.1 # via -r requirements/base.in -markupsafe==2.1.1 +markupsafe==2.1.2 # via jinja2 mysqlclient==2.1.1 # via -r requirements/production.in -newrelic==8.0.0.179 +newrelic==8.5.0 # via # -r requirements/production.in # edx-django-utils ordered-set==4.1.0 # via -r requirements/base.in -packaging==21.3 +packaging==23.0 # via drf-yasg path-py==8.2.1 # via -r requirements/production.in -pbr==5.10.0 +pbr==5.11.1 # via stevedore -psutil==5.9.2 +psutil==5.9.4 # via edx-django-utils pycparser==2.21 # via cffi -pycryptodomex==3.15.0 +pycryptodomex==3.16.0 # via pyjwkest pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==2.4.0 +pyjwt[crypto]==2.6.0 # via # drf-jwt # edx-drf-extensions # edx-rest-api-client -pymongo==3.12.3 +pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils -pyparsing==3.0.9 - # via packaging python-dateutil==2.8.2 # via # botocore @@ -196,7 +194,7 @@ python-dateutil==2.8.2 # faker python-memcached==1.59 # via -r requirements/base.in -pytz==2022.2.1 +pytz==2022.7.1 # via # django # djangorestframework @@ -205,7 +203,7 @@ pyyaml==6.0 # via # -r requirements/production.in # edx-django-release-util -requests==2.28.1 +requests==2.28.2 # via # coreapi # edx-drf-extensions @@ -215,7 +213,7 @@ requests==2.28.1 # slumber ruamel-yaml==0.17.21 # via drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via ruamel-yaml rules==3.3 # via edx-enterprise-data @@ -236,15 +234,15 @@ six==1.16.0 # python-memcached slumber==0.7.1 # via edx-rest-api-client -sqlparse==0.4.2 +sqlparse==0.4.3 # via django -stevedore==4.0.0 +stevedore==4.1.1 # via # edx-django-utils # edx-opaque-keys tqdm==4.64.1 # via -r requirements/base.in -typing-extensions==4.3.0 +typing-extensions==4.4.0 # via django-countries unicodecsv==0.14.1 # via djangorestframework-csv @@ -252,18 +250,18 @@ uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.12 +urllib3==1.26.14 # via # -r requirements/base.in # botocore # requests webencodings==0.5.1 # via html5lib -zipp==3.8.1 +zipp==3.11.0 # via importlib-metadata -zope-event==4.5.0 +zope-event==4.6 # via gevent -zope-interface==5.4.0 +zope-interface==5.5.2 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/test.txt b/requirements/test.txt index ee5ddd29..c5ed6037 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,32 +1,32 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # -asgiref==3.5.2 +asgiref==3.6.0 # via django astroid==2.3.3 # via pylint -attrs==22.1.0 +attrs==22.2.0 # via pytest boto==2.49.0 # via -r requirements/base.in -boto3==1.24.70 +boto3==1.26.55 # via -r requirements/base.in -botocore==1.27.70 +botocore==1.29.55 # via # boto3 # s3transfer -certifi==2022.6.15.1 +certifi==2022.12.7 # via requests cffi==1.15.1 # via # cryptography # pynacl -chardet==5.0.0 +chardet==5.1.0 # via diff-cover -charset-normalizer==2.1.1 +charset-normalizer==3.0.1 # via requests click==8.1.3 # via edx-django-utils @@ -38,17 +38,17 @@ coreschema==0.0.4 # via # coreapi # drf-yasg -coverage[toml]==6.4.4 +coverage[toml]==7.0.5 # via # -r requirements/test.in # pytest-cov -cryptography==38.0.1 +cryptography==39.0.0 # via # django-fernet-fields # pyjwt ddt==1.6.0 # via -r requirements/test.in -diff-cover==6.5.1 +diff-cover==7.3.2 # via -r requirements/test.in # via # -c requirements/constraints.txt @@ -70,7 +70,7 @@ diff-cover==6.5.1 # edx-rbac django-cors-headers==3.13.0 # via -r requirements/base.in -django-countries==7.3.2 +django-countries==7.5 # via -r requirements/base.in django-crum==0.7.9 # via @@ -82,7 +82,7 @@ django-fernet-fields==0.6 # via edx-enterprise-data django-filter==22.1 # via edx-enterprise-data -django-model-utils==4.2.0 +django-model-utils==4.3.1 # via # edx-enterprise-data # edx-rbac @@ -94,7 +94,7 @@ django-waffle==3.0.0 # via # edx-django-utils # edx-drf-extensions -djangorestframework==3.13.1 +djangorestframework==3.14.0 # via # -r requirements/base.in # djangorestframework-csv @@ -106,7 +106,7 @@ djangorestframework-csv==2.1.1 # via -r requirements/base.in drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.21.3 +drf-yasg==1.21.4 # via edx-api-doc-tools edx-api-doc-tools==1.6.0 # via -r requirements/base.in @@ -114,18 +114,18 @@ edx-ccx-keys==1.2.1 # via -r requirements/base.in edx-django-release-util==1.2.0 # via -r requirements/base.in -edx-django-utils==5.0.1 +edx-django-utils==5.2.0 # via # -r requirements/base.in # edx-drf-extensions # edx-enterprise-data # edx-rest-api-client -edx-drf-extensions==8.3.1 +edx-drf-extensions==8.4.1 # via # -r requirements/base.in # edx-enterprise-data # edx-rbac -edx-enterprise-data==4.6.3 +edx-enterprise-data==4.6.4 # via -r requirements/base.in edx-opaque-keys==2.3.0 # via @@ -139,23 +139,25 @@ edx-rest-api-client==5.5.0 # via # -r requirements/base.in # edx-enterprise-data +exceptiongroup==1.1.0 + # via pytest factory-boy==3.2.1 # via edx-enterprise-data -faker==14.2.0 +faker==16.6.0 # via factory-boy freezegun==1.2.2 # via -r requirements/test.in -future==0.18.2 +future==0.18.3 # via pyjwkest html5lib==1.1 # via -r requirements/base.in -idna==3.3 +idna==3.4 # via requests -importlib-metadata==4.12.0 +importlib-metadata==6.0.0 # via markdown inflection==0.5.1 # via drf-yasg -iniconfig==1.1.1 +iniconfig==2.0.0 # via pytest isort==4.3.21 # via pylint @@ -173,41 +175,39 @@ lazy-object-proxy==1.4.3 # via astroid markdown==3.4.1 # via -r requirements/base.in -markupsafe==2.1.1 +markupsafe==2.1.2 # via jinja2 mccabe==0.6.1 # via pylint -newrelic==8.0.0.179 +newrelic==8.5.0 # via edx-django-utils ordered-set==4.1.0 # via -r requirements/base.in -packaging==21.3 +packaging==23.0 # via # drf-yasg # pytest -pbr==5.10.0 +pbr==5.11.1 # via stevedore pluggy==1.0.0 # via # diff-cover # pytest -psutil==5.9.2 +psutil==5.9.4 # via edx-django-utils -py==1.11.0 - # via pytest -pycodestyle==2.9.1 +pycodestyle==2.10.0 # via -r requirements/test.in pycparser==2.21 # via cffi -pycryptodomex==3.15.0 +pycryptodomex==3.16.0 # via pyjwkest -pydocstyle==6.1.1 +pydocstyle==6.3.0 # via -r requirements/test.in -pygments==2.13.0 +pygments==2.14.0 # via diff-cover pyjwkest==1.4.2 # via edx-drf-extensions -pyjwt[crypto]==2.4.0 +pyjwt[crypto]==2.6.0 # via # drf-jwt # edx-drf-extensions @@ -216,17 +216,15 @@ pylint==2.4.4 # via # -c requirements/constraints.txt # -r requirements/test.in -pymongo==3.12.3 +pymongo==3.13.0 # via edx-opaque-keys pynacl==1.5.0 # via edx-django-utils -pyparsing==3.0.9 - # via packaging -pytest==7.1.3 +pytest==7.2.1 # via # pytest-cov # pytest-django -pytest-cov==3.0.0 +pytest-cov==4.0.0 # via -r requirements/test.in pytest-django==4.5.2 # via -r requirements/test.in @@ -238,7 +236,7 @@ python-dateutil==2.8.2 # freezegun python-memcached==1.59 # via -r requirements/base.in -pytz==2022.2.1 +pytz==2022.7.1 # via # -r requirements/test.in # django @@ -246,7 +244,7 @@ pytz==2022.2.1 # drf-yasg pyyaml==6.0 # via edx-django-release-util -requests==2.28.1 +requests==2.28.2 # via # coreapi # edx-drf-extensions @@ -255,11 +253,11 @@ requests==2.28.1 # pyjwkest # responses # slumber -responses==0.21.0 +responses==0.22.0 # via -r requirements/test.in ruamel-yaml==0.17.21 # via drf-yasg -ruamel-yaml-clib==0.2.6 +ruamel-yaml-clib==0.2.7 # via ruamel-yaml rules==3.3 # via edx-enterprise-data @@ -284,19 +282,23 @@ slumber==0.7.1 # via edx-rest-api-client snowballstemmer==2.2.0 # via pydocstyle -sqlparse==0.4.2 +sqlparse==0.4.3 # via django -stevedore==4.0.0 +stevedore==4.1.1 # via # edx-django-utils # edx-opaque-keys +toml==0.10.2 + # via responses tomli==2.0.1 # via # coverage # pytest tqdm==4.64.1 # via -r requirements/base.in -typing-extensions==4.3.0 +types-toml==0.10.8.1 + # via responses +typing-extensions==4.4.0 # via django-countries unicodecsv==0.14.1 # via djangorestframework-csv @@ -304,7 +306,7 @@ uritemplate==4.1.1 # via # coreapi # drf-yasg -urllib3==1.26.12 +urllib3==1.26.14 # via # -r requirements/base.in # botocore @@ -314,5 +316,5 @@ webencodings==0.5.1 # via html5lib wrapt==1.11.2 # via astroid -zipp==3.8.1 +zipp==3.11.0 # via importlib-metadata diff --git a/requirements/tox.txt b/requirements/tox.txt index cca4fc72..38696911 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -1,34 +1,33 @@ # -# This file is autogenerated by pip-compile with python 3.8 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.8 +# by the following command: # # make upgrade # distlib==0.3.6 # via virtualenv -filelock==3.8.0 +filelock==3.9.0 # via # tox # virtualenv -packaging==21.3 +packaging==23.0 # via tox -platformdirs==2.5.2 +platformdirs==2.6.2 # via virtualenv pluggy==1.0.0 # via tox py==1.11.0 # via tox -pyparsing==3.0.9 - # via packaging six==1.16.0 # via tox tomli==2.0.1 # via tox -tox==3.26.0 +tox==3.28.0 # via + # -c requirements/constraints.txt # -r requirements/tox.in # tox-battery tox-battery==0.6.1 # via -r requirements/tox.in -virtualenv==20.16.5 +virtualenv==20.17.1 # via tox