From c536ceba3371f0742efa243de0b76e303eb5e3cb Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Rabby Date: Wed, 26 Jan 2022 16:15:49 +0600 Subject: [PATCH 1/9] update default docker-compose [docker-compose.yml] --- docker-compose.yml | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 3fa34c3..6991267 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,76 @@ services: - .env environment: - PYTHONPATH=/code/surface/api + - CLIMSOFT_DATABASE_URI=mysql+mysqldb://root:password@opencdms_climsoftdb:3306/climsoft + - CLIMSOFT_SECRET_KEY=climsoft-secret-key + - AUTH_DB_URI=postgresql+psycopg2://dba:dba@surfacedb:5432/surface + - SURFACE_DB_NAME=surface + - SURFACE_DB_USER=dba + - SURFACE_DB_PASSWORD=dba + - SURFACE_DB_HOST=surfacedb + - SURFACE_DB_PORT=5432 + - MCH_DB_PORT=3306 + - MCH_DB_HOST=mchdb + - MCH_DB_NAME=mch + - MCH_DB_PASSWORD=password + - MCH_DB_USER=root + - APP_SECRET=app-secret + - SURFACE_SECRET_KEY=surface-secret-key + - SECRET_KEY=secret-key + - TIMESCALEDB_TELEMETRY=off + - PGDATA=/var/lib/postgresql/data/pgdata + - SURFACE_DATA_DIR=/home/surface/surface_data/shared + - SURFACE_DB_ENGINE=django.contrib.gis.db.backends.postgis + - SURFACE_BROKER_URL=redis://redis:6379/0 + - SURFACE_DJANGO_DEBUG=False + - LOGIN_REDIRECT_URL=/wx/stations/map/ + - LOGOUT_REDIRECT_URL=/accounts/login/ + - LRGS_EXECUTABLE_PATH=/surface/LrgsClient/bin/getDcpMessages + - LRGS_SERVER_HOST=lrgseddn1.cr.usgs.gov + - LRGS_SERVER_PORT=16003 + - LRGS_USER=belnms + - LRGS_PASSWORD=BWSNlrgs2016! + - LRGS_CS_FILE_PATH=/data/search_parameters.cs + - LRGS_MAX_INTERVAL=719 + - ENTL_PRIMARY_SERVER_HOST=107.23.152.248 + - ENTL_PRIMARY_SERVER_PORT=2324 + - ENTL_SECONDARY_SERVER_HOST=107.23.135.182 + - ENTL_SECONDARY_SERVER_PORT=2324 + - ENTL_PARTNER_ID=2B6FDADE-CA7F-443A-AD79-2FF21CEF4857 + - EMAIL_HOST=smtp.gmail.com + - EMAIL_HOST_USER=test_email_host + - EMAIL_HOST_PASSWORD=test_email_password + - EMAIL_PORT=587 + - TIMEZONE_NAME=America/Belize + - TIMEZONE_OFFSET=-360 + - INMET_HOURLY_DATA_URL= + - INMET_DAILY_DATA_BASE_PATH= + - MAP_LATITUDE=17.302212 + - MAP_LONGITUDE=-88.429595 + - MAP_ZOOM=8 + - SPATIAL_ANALYSIS_INITIAL_LATITUDE=15.8469375676 + - SPATIAL_ANALYSIS_INITIAL_LONGITUDE=-89.227 + - SPATIAL_ANALYSIS_FINAL_LATITUDE=18.5299822047 + - SPATIAL_ANALYSIS_FINAL_LONGITUDE=-87.485 + - SPATIAL_ANALYSIS_SHAPE_FILE_PATH=/surface/static/images/blz_shape.png + - STATION_MAP_WIND_SPEED_ID=51 + - STATION_MAP_WIND_GUST_ID=53 + - STATION_MAP_WIND_DIRECTION_ID=56 + - STATION_MAP_TEMP_MAX_ID=16 + - STATION_MAP_TEMP_MIN_ID=14 + - STATION_MAP_TEMP_AVG_ID=10 + - STATION_MAP_ATM_PRESSURE_ID=60 + - STATION_MAP_PRECIPITATION_ID=0 + - STATION_MAP_RELATIVE_HUMIDITY_ID=30 + - STATION_MAP_SOLAR_RADIATION_ID=72 + - STATION_MAP_FILTER_WATERSHED=1 + - STATION_MAP_FILTER_REGION=1 + - STATION_MAP_FILTER_COMMUNICATION=1 + - SURFACE_API_ENABLED=true + - CLIMSOFT_API_ENABLED=true + - MCH_API_ENABLED=true + - DEFAULT_USERNAME=admin + - DEFAULT_PASSWORD=password123 depends_on: - opencdms_surfacedb - opencdms_mchdb From 7dbf1863571f374126a694667204065dbf6e4ad0 Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Rabby Date: Wed, 26 Jan 2022 16:56:53 +0600 Subject: [PATCH 2/9] update readme --- README.md | 109 +++++++++++++++++---------------------------- docker-compose.yml | 6 +-- 2 files changed, 45 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 97daa67..ee9ce93 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# opencdms-server +# opencdms-api OpenCDMS server uses Python FastAPI to expose a web interface for `opencdms-app` and other supported CDMSs. @@ -13,68 +13,63 @@ The root directory has two main directories: - `src` : Contains all the applications/CDMS wrappers - `tests` : Contains all the tests -Apart from these two directories we also have a docker-compose file contianing: +Apart from these two directories we also have three docker-compose files: -- `auth-db` service which is used for authentication -- `climsoft-db` service which should be used for storing Climsoft CDMS data -- `surface-db` service which should be used for storing Surface CDMS data -- `opencdms-server` is the application we are developing +- `docker-compose.yml` For development +- `docker-compose.prod.yml` For production deployment (contains traefik config for https) +- `docker-compose.test.yml` For testing -There is also a `Dockerfile` where we have defined the docker image for `opencdms-server` service +These docker-compose files have all the necessary services to run `opencdms-api` + +There is also a `dockerfile` where we have defined the docker image for `opencdms-api` service *Project root* ``` . +├── create_mch_english_basic_tables.sql +├── docker-compose.prod.yml +├── docker-compose.test.yml ├── docker-compose.yml -├── Dockerfile -├── LICENSE +├── dockerfile +├── entrypoint.sh +├── init_climsoft_db.py +├── makefile +├── mch.dbn +├── mch.dockerfile +├── MCHtablasycampos.def +├── poetry.lock +├── pyproject.toml ├── README.md +├── requirements-old.txt ├── requirements.txt +├── scripts +│ └── load_initial_surface_data.sh ├── src -│ ├── apps -│ ├── db -│ ├── main.py -│ └── utils -└── tests - ├── app-name - ├── ...other apps... - ├── conftest.py - └── datagen - -``` +│ └── opencdms_api +│ ├── config.py +│ ├── db.py +│ ├── deps.py +│ ├── __init__.py +│ ├── main.py +│ ├── middelware.py +│ ├── models.py +│ ├── router.py +│ ├── schema.py +│ └── templates +├── tests +│ ├── conftest.py +│ ├── __init__.py +│ └── test_router.py +└── traefik + └── traefik.toml -In the app specific directory, the file structure is like below - -*App root* - -``` -. -├── controllers -├── db -├── schemas -└── services ``` -Controllers directory holds all the routes that we define. Routes are meant to handle application logic, i.e. authorization, data validation etc. - -DB directory contains the DB configuration for respective app - -Schemas directory contains all the DTOs defined as Pydantic Model - -Services directory contains the business logic - ### Running Development Server The easiest way to go is running `docker-compose up -d --build` -The MCH database cannot be populated automatically. To populate the MCH database, do the following: - -```bash -$ docker exec -it mchdb bash -$ mysql -u root -p mch < /scripts/create_mch_english_basic_tables.sql -``` - Also, you can do the following: ```bash @@ -92,26 +87,6 @@ Note: You have to run database instance separately. Go to this repository for de Each master release should pass all the To check if the tests are as expected or to add new feature or to fix some issue, you can run the tests on your own. -Follow these steps: - -```bash -$ pip3 install virtualenv -$ virtualenv venv -$ source venv/bin/activate -$ pip install -r requirements.txt -$ docker-compose down -v -$ docker-compose up -d --build -$ pytest tests/integration -``` - -Additionally, you can run snapshot We have collected a subset of data from production climsoft instance and we will run query on them to check if we are getting expected result. - - - From outside your project, run `git clone https://github.com/opencdms/opencdms-test-data` - - `cd opencdms-test-data` - - `docker-compose down -v` - - `docker-compose up climsoft-4.1.1 --build` - - Go to the project root `opencdms-server` - - `source venv/bin/activate` - - `export CLIMSOFT_DB_URI=mysql+mysqldb://root:password@127.0.0.1:33308/mariadb_climsoft_test_db_v4` - - `pytest tests/snapshot` +To run the tests, you just need to run `docker-compose -f docker-compose.test.yml up --build` +Check the logs for error. \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6991267..eac1420 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,12 +18,12 @@ services: - SURFACE_DB_NAME=surface - SURFACE_DB_USER=dba - SURFACE_DB_PASSWORD=dba - - SURFACE_DB_HOST=surfacedb + - SURFACE_DB_HOST=opencdms_surfacedb - SURFACE_DB_PORT=5432 - MCH_DB_PORT=3306 - - MCH_DB_HOST=mchdb + - MCH_DB_HOST=opencdms_mchdb - MCH_DB_NAME=mch - - MCH_DB_PASSWORD=password + - MCH_DB_PASSWORD=root_password - MCH_DB_USER=root - APP_SECRET=app-secret - SURFACE_SECRET_KEY=surface-secret-key From 5ef9aa14e0f50245b35180a3a595d7704720923c Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Rabby Date: Wed, 26 Jan 2022 17:35:10 +0600 Subject: [PATCH 3/9] allow /climsoft/docs and /climsoft/openapi.json without auth --- README.md | 4 +++- src/opencdms_api/middelware.py | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ee9ce93..3d41dbf 100644 --- a/README.md +++ b/README.md @@ -89,4 +89,6 @@ Each master release should pass all the To check if the tests are as expected o To run the tests, you just need to run `docker-compose -f docker-compose.test.yml up --build` -Check the logs for error. \ No newline at end of file +Check the logs for error. + +### How to access surface, climsoft or mch API diff --git a/src/opencdms_api/middelware.py b/src/opencdms_api/middelware.py index f66bf73..2f5917e 100644 --- a/src/opencdms_api/middelware.py +++ b/src/opencdms_api/middelware.py @@ -47,5 +47,9 @@ def authenticate_request(self, request: Request): async def __call__(self, scope: Scope, receive: Receive, send: Send): request = Request(scope, receive, send) - self.authenticate_request(request) + if request.url.path not in { + "/climsoft/docs", + "/climsoft/openapi.json" + }: + self.authenticate_request(request) await self.app(scope, receive, send) From 2fb904576c8466356cbae4ebded0b897a07c2955 Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Mon, 31 Jan 2022 18:27:45 +0600 Subject: [PATCH 4/9] climsoft fork, opencdms-process not yet installed --- docker-compose.prod.yml | 2 +- docker-compose.yml | 3 +- dockerfile | 30 +- poetry.lock | 1132 -------------------------------- pyproject.toml | 27 - requirements-old.txt | 22 - requirements.txt | 129 ++-- src/opencdms_api/db.py | 2 +- src/opencdms_api/deps.py | 2 +- src/opencdms_api/main.py | 14 +- src/opencdms_api/middelware.py | 6 +- src/opencdms_api/models.py | 2 +- src/opencdms_api/router.py | 6 +- 13 files changed, 94 insertions(+), 1283 deletions(-) delete mode 100644 poetry.lock delete mode 100644 pyproject.toml delete mode 100644 requirements-old.txt diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 6fd5523..c76a37e 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -131,7 +131,7 @@ services: command: [ "uvicorn", - "opencdms_api.main:app", + "src.opencdms_api.main:app", "--host", "0.0.0.0", "--port", diff --git a/docker-compose.yml b/docker-compose.yml index eac1420..94a059d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -88,13 +88,12 @@ services: - opencdms_climsoftdb volumes: - ./src:/code/src - - ./surface:/code/surface networks: - opencdms_api_dev_network command: [ "uvicorn", - "opencdms_api.main:app", + "src.opencdms_api.main:app", "--host", "0.0.0.0", "--port", diff --git a/dockerfile b/dockerfile index 0d3eac0..5ade39d 100644 --- a/dockerfile +++ b/dockerfile @@ -1,41 +1,33 @@ FROM python:3.9.7-slim-bullseye -# https://docs.python.org/3/using/cmdline.html#envvar -# https://pip.pypa.io/en/stable/user_guide/#environment-variables -# https://python-poetry.org/docs/configuration/ ENV PYTHONFAULTHANDLER=1 \ PYTHONHASHSEED=random \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_DEFAULT_TIMEOUT=100 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ - PIP_NO_CACHE_DIR=1 \ - POETRY_VERSION=1.1.11 \ - POETRY_VIRTUALENVS_CREATE=0 + PIP_NO_CACHE_DIR=1 RUN apt-get update --fix-missing RUN apt-get install -y g++ libgdal-dev libpq-dev libgeos-dev libproj-dev openjdk-17-jre vim wait-for-it -RUN apt-get install -y curl git && pip install --upgrade pip "poetry==${POETRY_VERSION}" +RUN apt-get install -y curl git && pip install --upgrade pip WORKDIR /code -# TODO replace with actual surface repo -RUN git clone --branch refactor-for-opencdms-server https://github.com/Shaibujnr/surface.git surface +RUN git clone https://github.com/opencdms/surface.git RUN pip install numpy==1.21.2 --no-warn-script-location RUN pip install -r surface/api/requirements.txt -# Install Python dependencies. -COPY pyproject.toml poetry.lock ./ +COPY requirements.txt ./requirements.txt +RUN pip install -r requirements.txt - -RUN poetry install -v - - -COPY . . - - -RUN poetry install +COPY ./src ./src +COPY ./scripts ./scripts +COPY entrypoint.sh ./entrypoint.sh +COPY init_climsoft_db.py ./init_climsoft_db.py +COPY mch.dbn ./mch.dbn +COPY MCHtablasycampos.def ./MCHtablasycampos.def RUN useradd -m opencdms_api_user && chown -R opencdms_api_user /code diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 8d33cad..0000000 --- a/poetry.lock +++ /dev/null @@ -1,1132 +0,0 @@ -[[package]] -name = "alembic" -version = "1.7.5" -description = "A database migration tool for SQLAlchemy." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -Mako = "*" -SQLAlchemy = ">=1.3.0" - -[package.extras] -tz = ["python-dateutil"] - -[[package]] -name = "aniso8601" -version = "8.0.0" -description = "A library for parsing ISO 8601 strings." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "anyio" -version = "3.3.4" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] -test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16)"] - -[[package]] -name = "asgiref" -version = "3.4.1" -description = "ASGI specs, helper code, and adapters" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] - -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "climsoft-api" -version = "0.1.0" -description = "" -category = "main" -optional = false -python-versions = "^3.9" -develop = false - -[package.dependencies] -fastapi = "^0.70.1" -inflection = "^0.5.1" -opencdms = {git = "https://github.com/opencdms/pyopencdms.git", rev = "main"} -passlib = "^1.7.4" -python-jose = "^3.3.0" -SQLAlchemy = "^1.4.29" -uvicorn = "^0.16.0" - -[package.source] -type = "git" -url = "https://github.com/opencdms/climsoft-api.git" -reference = "main" -resolved_reference = "536394b07b60440bb88ebb0ea135ed2b6e38b4a3" - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "dnspython" -version = "2.1.0" -description = "DNS toolkit" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -dnssec = ["cryptography (>=2.6)"] -doh = ["requests", "requests-toolbelt"] -idna = ["idna (>=2.1)"] -curio = ["curio (>=1.2)", "sniffio (>=1.1)"] -trio = ["trio (>=0.14.0)", "sniffio (>=1.1)"] - -[[package]] -name = "ecdsa" -version = "0.17.0" -description = "ECDSA cryptographic signature library (pure python)" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[package.dependencies] -six = ">=1.9.0" - -[package.extras] -gmpy = ["gmpy"] -gmpy2 = ["gmpy2"] - -[[package]] -name = "email-validator" -version = "1.1.3" -description = "A robust email syntax and deliverability validation library for Python 2.x/3.x." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -dnspython = ">=1.15.0" -idna = ">=2.0.0" - -[[package]] -name = "faker" -version = "10.0.0" -description = "Faker is a Python package that generates fake data for you." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -python-dateutil = ">=2.4" -text-unidecode = "1.3" - -[[package]] -name = "fastapi" -version = "0.70.1" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = "0.16.0" - -[package.extras] -all = ["requests (>=2.24.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<3.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.16.0)"] -dev = ["python-jose[cryptography] (>=3.3.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.16.0)"] -doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=7.1.9,<8.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "typer-cli (>=0.0.12,<0.0.13)", "pyyaml (>=5.3.1,<6.0.0)"] -test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "mypy (==0.910)", "flake8 (>=3.8.3,<4.0.0)", "black (==21.9b0)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "flask (>=1.1.2,<3.0.0)", "anyio[trio] (>=3.2.1,<4.0.0)", "types-ujson (==0.1.1)", "types-orjson (==3.6.0)", "types-dataclasses (==0.1.7)"] - -[[package]] -name = "flask" -version = "1.1.2" -description = "A simple framework for building complex web applications." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -click = ">=5.1" -itsdangerous = ">=0.24" -Jinja2 = ">=2.10.1" -Werkzeug = ">=0.15" - -[package.extras] -dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] -docs = ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] -dotenv = ["python-dotenv"] - -[[package]] -name = "flask-mysqldb" -version = "0.2.0" -description = "MySQLdb extension for Flask" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -Flask = ">=0.10" -mysqlclient = "*" - -[[package]] -name = "flask-restful" -version = "0.3.8" -description = "Simple framework for creating REST APIs" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -aniso8601 = ">=0.82" -Flask = ">=0.8" -pytz = "*" -six = ">=1.3.0" - -[package.extras] -docs = ["sphinx"] - -[[package]] -name = "greenlet" -version = "1.1.2" -description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[package.extras] -docs = ["sphinx"] - -[[package]] -name = "h11" -version = "0.12.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "idna" -version = "3.3" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "inflect" -version = "5.3.0" -description = "Correctly generate plurals, singular nouns, ordinals, indefinite articles; convert numbers to words" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pygments", "pytest-black (>=0.3.7)", "pytest-mypy"] - -[[package]] -name = "inflection" -version = "0.5.1" -description = "A port of Ruby on Rails inflector to Python" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "itsdangerous" -version = "2.0.1" -description = "Safely pass data to untrusted environments and back." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "jinja2" -version = "2.11.2" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -name = "mako" -version = "1.1.6" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["babel"] -lingua = ["lingua"] - -[[package]] -name = "markdown" -version = "2.6.11" -description = "Python implementation of Markdown." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "mch-api" -version = "0.1.0" -description = "" -category = "main" -optional = false -python-versions = "*" -develop = false - -[package.dependencies] -aniso8601 = "8.0.0" -click = "7.1.2" -Flask = "1.1.2" -flask-mysqldb = "0.2.0" -Flask-RESTful = "0.3.8" -Jinja2 = "2.11.2" -markdown = "2.6.11" -pandas = "1.3.1" - -[package.source] -type = "git" -url = "https://github.com/opencdms/mch-api.git" -reference = "main" -resolved_reference = "c99815a135125f27ae7322f8e9fea117b72d8eb2" - -[[package]] -name = "mysqlclient" -version = "2.1.0" -description = "Python interface to MySQL" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "numpy" -version = "1.22.1" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "opencdms" -version = "0.1.0" -description = "OpenCDMS Python package" -category = "main" -optional = false -python-versions = "^3.8" -develop = false - -[package.dependencies] -alembic = ">=1.6.5" -mysqlclient = ">=2.0.3" -pandas = ">=1.3.1" -psycopg2 = ">=2.9.1" -sqlacodegen = ">=2.3.0" -SQLAlchemy = ">=1.4.22" - -[package.source] -type = "git" -url = "https://github.com/opencdms/pyopencdms.git" -reference = "main" -resolved_reference = "d250d5dfe0b58b1722766e320b83983e5d7995c2" - -[[package]] -name = "packaging" -version = "21.2" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3" - -[[package]] -name = "pandas" -version = "1.3.1" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.7.1" - -[package.dependencies] -numpy = ">=1.17.3" -python-dateutil = ">=2.7.3" -pytz = ">=2017.3" - -[package.extras] -test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] - -[[package]] -name = "passlib" -version = "1.7.4" -description = "comprehensive password hashing framework supporting over 30 schemes" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -argon2 = ["argon2-cffi (>=18.2.0)"] -bcrypt = ["bcrypt (>=3.1.0)"] -build_docs = ["sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)", "cloud-sptheme (>=1.10.1)"] -totp = ["cryptography"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "psycopg2" -version = "2.9.3" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pydantic" -version = "1.8.2" -description = "Data validation and settings management using python 3.6 type hinting" -category = "main" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -email-validator = {version = ">=1.0.3", optional = true, markers = "extra == \"email\""} -typing-extensions = ">=3.7.4.3" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-jose" -version = "3.3.0" -description = "JOSE implementation in Python" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -ecdsa = "!=0.15" -pyasn1 = "*" -rsa = "*" - -[package.extras] -cryptography = ["cryptography (>=3.4.0)"] -pycrypto = ["pycrypto (>=2.6.0,<2.7.0)", "pyasn1"] -pycryptodome = ["pycryptodome (>=3.3.1,<4.0.0)", "pyasn1"] - -[[package]] -name = "python-multipart" -version = "0.0.5" -description = "A streaming multipart parser for Python" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.4.0" - -[[package]] -name = "pytz" -version = "2021.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "rsa" -version = "4.7.2" -description = "Pure-Python RSA implementation" -category = "main" -optional = false -python-versions = ">=3.5, <4" - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "sniffio" -version = "1.2.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "sqlacodegen" -version = "2.3.0" -description = "Automatic model code generator for SQLAlchemy" -category = "main" -optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,>=2.7" - -[package.dependencies] -inflect = ">=0.2.0" -SQLAlchemy = ">=0.9.0" - -[package.extras] -test = ["pytest", "pytest-cov", "psycopg2-binary", "mysql-connector-python"] - -[[package]] -name = "sqlalchemy" -version = "1.4.29" -description = "Database Abstraction Library" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" - -[package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} - -[package.extras] -aiomysql = ["greenlet (!=0.4.17)", "aiomysql"] -aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"] -asyncio = ["greenlet (!=0.4.17)"] -asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3)"] -mariadb_connector = ["mariadb (>=1.0.1)"] -mssql = ["pyodbc"] -mssql_pymssql = ["pymssql"] -mssql_pyodbc = ["pyodbc"] -mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"] -mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"] -mysql_connector = ["mysql-connector-python"] -oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"] -postgresql = ["psycopg2 (>=2.7)"] -postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"] -postgresql_pg8000 = ["pg8000 (>=1.16.6)"] -postgresql_psycopg2binary = ["psycopg2-binary"] -postgresql_psycopg2cffi = ["psycopg2cffi"] -pymysql = ["pymysql (<1)", "pymysql"] -sqlcipher = ["sqlcipher3-binary"] - -[[package]] -name = "starlette" -version = "0.16.0" -description = "The little ASGI library that shines." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -anyio = ">=3.0.0,<4" - -[package.extras] -full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests", "graphene"] - -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "uvicorn" -version = "0.16.0" -description = "The lightning-fast ASGI server." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -asgiref = ">=3.4.0" -click = ">=7.0" -h11 = ">=0.8" - -[package.extras] -standard = ["httptools (>=0.2.0,<0.4.0)", "watchgod (>=0.6)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "websockets (>=9.1)", "websockets (>=10.0)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"] - -[[package]] -name = "werkzeug" -version = "2.0.2" -description = "The comprehensive WSGI web application library." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -watchdog = ["watchdog"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "69742751eac0234936855e1d75b7229db1bb3e51e7156a50b355c4ed7f7fa438" - -[metadata.files] -alembic = [ - {file = "alembic-1.7.5-py3-none-any.whl", hash = "sha256:a9dde941534e3d7573d9644e8ea62a2953541e27bc1793e166f60b777ae098b4"}, - {file = "alembic-1.7.5.tar.gz", hash = "sha256:7c328694a2e68f03ee971e63c3bd885846470373a5b532cf2c9f1601c413b153"}, -] -aniso8601 = [ - {file = "aniso8601-8.0.0-py2.py3-none-any.whl", hash = "sha256:c033f63d028b9a58e3ab0c2c7d0532ab4bfa7452bfc788fbfe3ddabd327b181a"}, - {file = "aniso8601-8.0.0.tar.gz", hash = "sha256:529dcb1f5f26ee0df6c0a1ee84b7b27197c3c50fc3a6321d66c544689237d072"}, -] -anyio = [ - {file = "anyio-3.3.4-py3-none-any.whl", hash = "sha256:4fd09a25ab7fa01d34512b7249e366cd10358cdafc95022c7ff8c8f8a5026d66"}, - {file = "anyio-3.3.4.tar.gz", hash = "sha256:67da67b5b21f96b9d3d65daa6ea99f5d5282cb09f50eb4456f8fb51dffefc3ff"}, -] -asgiref = [ - {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"}, - {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -climsoft-api = [] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -dnspython = [ - {file = "dnspython-2.1.0-py3-none-any.whl", hash = "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216"}, - {file = "dnspython-2.1.0.zip", hash = "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4"}, -] -ecdsa = [ - {file = "ecdsa-0.17.0-py2.py3-none-any.whl", hash = "sha256:5cf31d5b33743abe0dfc28999036c849a69d548f994b535e527ee3cb7f3ef676"}, - {file = "ecdsa-0.17.0.tar.gz", hash = "sha256:b9f500bb439e4153d0330610f5d26baaf18d17b8ced1bc54410d189385ea68aa"}, -] -email-validator = [ - {file = "email_validator-1.1.3-py2.py3-none-any.whl", hash = "sha256:5675c8ceb7106a37e40e2698a57c056756bf3f272cfa8682a4f87ebd95d8440b"}, - {file = "email_validator-1.1.3.tar.gz", hash = "sha256:aa237a65f6f4da067119b7df3f13e89c25c051327b2b5b66dc075f33d62480d7"}, -] -faker = [ - {file = "Faker-10.0.0-py3-none-any.whl", hash = "sha256:3163c84866cf118ac5329a802e046b0f729528ce62ebb2806b626e0badbb6ff3"}, - {file = "Faker-10.0.0.tar.gz", hash = "sha256:530690ad12a2a054071af95fc8a354c5fd57b5e7707053a9662f40f14a87b68e"}, -] -fastapi = [ - {file = "fastapi-0.70.1-py3-none-any.whl", hash = "sha256:5367226c7bcd7bfb2e17edaf225fd9a983095b1372281e9a3eb661336fb93748"}, - {file = "fastapi-0.70.1.tar.gz", hash = "sha256:21d03979b5336375c66fa5d1f3126c6beca650d5d2166fbb78345a30d33c8d06"}, -] -flask = [ - {file = "Flask-1.1.2-py2.py3-none-any.whl", hash = "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557"}, - {file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"}, -] -flask-mysqldb = [ - {file = "Flask-MySQLdb-0.2.0.tar.gz", hash = "sha256:1003c3d72d61a34f1ce5b1cbe427f31816f0c561cee5cd60d8158431381c37d7"}, -] -flask-restful = [ - {file = "Flask-RESTful-0.3.8.tar.gz", hash = "sha256:5ea9a5991abf2cb69b4aac19793faac6c032300505b325687d7c305ffaa76915"}, - {file = "Flask_RESTful-0.3.8-py2.py3-none-any.whl", hash = "sha256:d891118b951921f1cec80cabb4db98ea6058a35e6404788f9e70d5b243813ec2"}, -] -greenlet = [ - {file = "greenlet-1.1.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:58df5c2a0e293bf665a51f8a100d3e9956febfbf1d9aaf8c0677cf70218910c6"}, - {file = "greenlet-1.1.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:aec52725173bd3a7b56fe91bc56eccb26fbdff1386ef123abb63c84c5b43b63a"}, - {file = "greenlet-1.1.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:833e1551925ed51e6b44c800e71e77dacd7e49181fdc9ac9a0bf3714d515785d"}, - {file = "greenlet-1.1.2-cp27-cp27m-win32.whl", hash = "sha256:aa5b467f15e78b82257319aebc78dd2915e4c1436c3c0d1ad6f53e47ba6e2713"}, - {file = "greenlet-1.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:40b951f601af999a8bf2ce8c71e8aaa4e8c6f78ff8afae7b808aae2dc50d4c40"}, - {file = "greenlet-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:95e69877983ea39b7303570fa6760f81a3eec23d0e3ab2021b7144b94d06202d"}, - {file = "greenlet-1.1.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:356b3576ad078c89a6107caa9c50cc14e98e3a6c4874a37c3e0273e4baf33de8"}, - {file = "greenlet-1.1.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8639cadfda96737427330a094476d4c7a56ac03de7265622fcf4cfe57c8ae18d"}, - {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e5306482182170ade15c4b0d8386ded995a07d7cc2ca8f27958d34d6736497"}, - {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6a36bb9474218c7a5b27ae476035497a6990e21d04c279884eb10d9b290f1b1"}, - {file = "greenlet-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb7a75ed8b968f3061327c433a0fbd17b729947b400747c334a9c29a9af6c58"}, - {file = "greenlet-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:14d4f3cd4e8b524ae9b8aa567858beed70c392fdec26dbdb0a8a418392e71708"}, - {file = "greenlet-1.1.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:17ff94e7a83aa8671a25bf5b59326ec26da379ace2ebc4411d690d80a7fbcf23"}, - {file = "greenlet-1.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9f3cba480d3deb69f6ee2c1825060177a22c7826431458c697df88e6aeb3caee"}, - {file = "greenlet-1.1.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c"}, - {file = "greenlet-1.1.2-cp35-cp35m-win32.whl", hash = "sha256:7cbd7574ce8e138bda9df4efc6bf2ab8572c9aff640d8ecfece1b006b68da963"}, - {file = "greenlet-1.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:903bbd302a2378f984aef528f76d4c9b1748f318fe1294961c072bdc7f2ffa3e"}, - {file = "greenlet-1.1.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:049fe7579230e44daef03a259faa24511d10ebfa44f69411d99e6a184fe68073"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:dd0b1e9e891f69e7675ba5c92e28b90eaa045f6ab134ffe70b52e948aa175b3c"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7418b6bfc7fe3331541b84bb2141c9baf1ec7132a7ecd9f375912eca810e714e"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21915eb821a6b3d9d8eefdaf57d6c345b970ad722f856cd71739493ce003ad08"}, - {file = "greenlet-1.1.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eff9d20417ff9dcb0d25e2defc2574d10b491bf2e693b4e491914738b7908168"}, - {file = "greenlet-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:32ca72bbc673adbcfecb935bb3fb1b74e663d10a4b241aaa2f5a75fe1d1f90aa"}, - {file = "greenlet-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f0214eb2a23b85528310dad848ad2ac58e735612929c8072f6093f3585fd342d"}, - {file = "greenlet-1.1.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:b92e29e58bef6d9cfd340c72b04d74c4b4e9f70c9fa7c78b674d1fec18896dc4"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:93f81b134a165cc17123626ab8da2e30c0455441d4ab5576eed73a64c025b25c"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e12bdc622676ce47ae9abbf455c189e442afdde8818d9da983085df6312e7a1"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c790abda465726cfb8bb08bd4ca9a5d0a7bd77c7ac1ca1b839ad823b948ea28"}, - {file = "greenlet-1.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f276df9830dba7a333544bd41070e8175762a7ac20350786b322b714b0e654f5"}, - {file = "greenlet-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:64e6175c2e53195278d7388c454e0b30997573f3f4bd63697f88d855f7a6a1fc"}, - {file = "greenlet-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b11548073a2213d950c3f671aa88e6f83cda6e2fb97a8b6317b1b5b33d850e06"}, - {file = "greenlet-1.1.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:9633b3034d3d901f0a46b7939f8c4d64427dfba6bbc5a36b1a67364cf148a1b0"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eb6ea6da4c787111adf40f697b4e58732ee0942b5d3bd8f435277643329ba627"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f3acda1924472472ddd60c29e5b9db0cec629fbe3c5c5accb74d6d6d14773478"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e859fcb4cbe93504ea18008d1df98dee4f7766db66c435e4882ab35cf70cac43"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e44c8afdbe5467e4f7b5851be223be68adb4272f44696ee71fe46b7036a711"}, - {file = "greenlet-1.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec8c433b3ab0419100bd45b47c9c8551248a5aee30ca5e9d399a0b57ac04651b"}, - {file = "greenlet-1.1.2-cp38-cp38-win32.whl", hash = "sha256:288c6a76705dc54fba69fbcb59904ae4ad768b4c768839b8ca5fdadec6dd8cfd"}, - {file = "greenlet-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:8d2f1fb53a421b410751887eb4ff21386d119ef9cde3797bf5e7ed49fb51a3b3"}, - {file = "greenlet-1.1.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:166eac03e48784a6a6e0e5f041cfebb1ab400b394db188c48b3a84737f505b67"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:572e1787d1460da79590bf44304abbc0a2da944ea64ec549188fa84d89bba7ab"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:be5f425ff1f5f4b3c1e33ad64ab994eed12fc284a6ea71c5243fd564502ecbe5"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1692f7d6bc45e3200844be0dba153612103db241691088626a33ff1f24a0d88"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7227b47e73dedaa513cdebb98469705ef0d66eb5a1250144468e9c3097d6b59b"}, - {file = "greenlet-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff61ff178250f9bb3cd89752df0f1dd0e27316a8bd1465351652b1b4a4cdfd3"}, - {file = "greenlet-1.1.2-cp39-cp39-win32.whl", hash = "sha256:f70a9e237bb792c7cc7e44c531fd48f5897961701cdaa06cf22fc14965c496cf"}, - {file = "greenlet-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:013d61294b6cd8fe3242932c1c5e36e5d1db2c8afb58606c5a67efce62c1f5fd"}, - {file = "greenlet-1.1.2.tar.gz", hash = "sha256:e30f5ea4ae2346e62cedde8794a56858a67b878dd79f7df76a0767e356b1744a"}, -] -h11 = [ - {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, - {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -inflect = [ - {file = "inflect-5.3.0-py3-none-any.whl", hash = "sha256:42560be16af702a21d43d59427f276b5aed79efb1ded9b713468c081f4353d10"}, - {file = "inflect-5.3.0.tar.gz", hash = "sha256:41a23f6788962e9775e40e2ecfb1d6455d02de315022afeedd3c5dc070019d73"}, -] -inflection = [ - {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, - {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -itsdangerous = [ - {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, - {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, -] -jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, -] -mako = [ - {file = "Mako-1.1.6-py2.py3-none-any.whl", hash = "sha256:afaf8e515d075b22fad7d7b8b30e4a1c90624ff2f3733a06ec125f5a5f043a57"}, - {file = "Mako-1.1.6.tar.gz", hash = "sha256:4e9e345a41924a954251b95b4b28e14a301145b544901332e658907a7464b6b2"}, -] -markdown = [ - {file = "Markdown-2.6.11-py2.py3-none-any.whl", hash = "sha256:9ba587db9daee7ec761cfc656272be6aabe2ed300fece21208e4aab2e457bc8f"}, - {file = "Markdown-2.6.11.tar.gz", hash = "sha256:a856869c7ff079ad84a3e19cd87a64998350c2b94e9e08e44270faef33400f81"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -mch-api = [] -mysqlclient = [ - {file = "mysqlclient-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:02c8826e6add9b20f4cb12dcf016485f7b1d6e30356a1204d05431867a1b3947"}, - {file = "mysqlclient-2.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b62d23c11c516cedb887377c8807628c1c65d57593b57853186a6ee18b0c6a5b"}, - {file = "mysqlclient-2.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2c8410f54492a3d2488a6a53e2d85b7e016751a1e7d116e7aea9c763f59f5e8c"}, - {file = "mysqlclient-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6279263d5a9feca3e0edbc2b2a52c057375bf301d47da2089c075ff76331d14"}, - {file = "mysqlclient-2.1.0.tar.gz", hash = "sha256:973235686f1b720536d417bf0a0d39b4ab3d5086b2b6ad5e6752393428c02b12"}, -] -numpy = [ - {file = "numpy-1.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d62d6b0870b53799204515145935608cdeb4cebb95a26800b6750e48884cc5b"}, - {file = "numpy-1.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:831f2df87bd3afdfc77829bc94bd997a7c212663889d56518359c827d7113b1f"}, - {file = "numpy-1.22.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d1563060e77096367952fb44fca595f2b2f477156de389ce7c0ade3aef29e21"}, - {file = "numpy-1.22.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69958735d5e01f7b38226a6c6e7187d72b7e4d42b6b496aca5860b611ca0c193"}, - {file = "numpy-1.22.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45a7dfbf9ed8d68fd39763940591db7637cf8817c5bce1a44f7b56c97cbe211e"}, - {file = "numpy-1.22.1-cp310-cp310-win_amd64.whl", hash = "sha256:7e957ca8112c689b728037cea9c9567c27cf912741fabda9efc2c7d33d29dfa1"}, - {file = "numpy-1.22.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:800dfeaffb2219d49377da1371d710d7952c9533b57f3d51b15e61c4269a1b5b"}, - {file = "numpy-1.22.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:65f5e257987601fdfc63f1d02fca4d1c44a2b85b802f03bd6abc2b0b14648dd2"}, - {file = "numpy-1.22.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:632e062569b0fe05654b15ef0e91a53c0a95d08ffe698b66f6ba0f927ad267c2"}, - {file = "numpy-1.22.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d245a2bf79188d3f361137608c3cd12ed79076badd743dc660750a9f3074f7c"}, - {file = "numpy-1.22.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b4018a19d2ad9606ce9089f3d52206a41b23de5dfe8dc947d2ec49ce45d015"}, - {file = "numpy-1.22.1-cp38-cp38-win32.whl", hash = "sha256:f8ad59e6e341f38266f1549c7c2ec70ea0e3d1effb62a44e5c3dba41c55f0187"}, - {file = "numpy-1.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:60f19c61b589d44fbbab8ff126640ae712e163299c2dd422bfe4edc7ec51aa9b"}, - {file = "numpy-1.22.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2db01d9838a497ba2aa9a87515aeaf458f42351d72d4e7f3b8ddbd1eba9479f2"}, - {file = "numpy-1.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bcd19dab43b852b03868796f533b5f5561e6c0e3048415e675bec8d2e9d286c1"}, - {file = "numpy-1.22.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78bfbdf809fc236490e7e65715bbd98377b122f329457fffde206299e163e7f3"}, - {file = "numpy-1.22.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c51124df17f012c3b757380782ae46eee85213a3215e51477e559739f57d9bf6"}, - {file = "numpy-1.22.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d54b7b516f0ca38a69590557814de2dd638d7d4ed04864826acaac5ebb8f01"}, - {file = "numpy-1.22.1-cp39-cp39-win32.whl", hash = "sha256:b5ec9a5eaf391761c61fd873363ef3560a3614e9b4ead17347e4deda4358bca4"}, - {file = "numpy-1.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:4ac4d7c9f8ea2a79d721ebfcce81705fc3cd61a10b731354f1049eb8c99521e8"}, - {file = "numpy-1.22.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e60ef82c358ded965fdd3132b5738eade055f48067ac8a5a8ac75acc00cad31f"}, - {file = "numpy-1.22.1.zip", hash = "sha256:e348ccf5bc5235fc405ab19d53bec215bb373300e5523c7b476cc0da8a5e9973"}, -] -opencdms = [] -packaging = [ - {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, - {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"}, -] -pandas = [ - {file = "pandas-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ee8418d0f936ff2216513aa03e199657eceb67690995d427a4a7ecd2e68f442"}, - {file = "pandas-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d9acfca191140a518779d1095036d842d5e5bc8e8ad8b5eaad1aff90fe1870d"}, - {file = "pandas-1.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e323028ab192fcfe1e8999c012a0fa96d066453bb354c7e7a4a267b25e73d3c8"}, - {file = "pandas-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d06661c6eb741ae633ee1c57e8c432bb4203024e263fe1a077fa3fda7817fdb"}, - {file = "pandas-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:23c7452771501254d2ae23e9e9dac88417de7e6eff3ce64ee494bb94dc88c300"}, - {file = "pandas-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7150039e78a81eddd9f5a05363a11cadf90a4968aac6f086fd83e66cf1c8d1d6"}, - {file = "pandas-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5c09a2538f0fddf3895070579082089ff4ae52b6cb176d8ec7a4dacf7e3676c1"}, - {file = "pandas-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905fc3e0fcd86b0a9f1f97abee7d36894698d2592b22b859f08ea5a8fe3d3aab"}, - {file = "pandas-1.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ee927c70794e875a59796fab8047098aa59787b1be680717c141cd7873818ae"}, - {file = "pandas-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c976e023ed580e60a82ccebdca8e1cc24d8b1fbb28175eb6521025c127dab66"}, - {file = "pandas-1.3.1-cp38-cp38-win32.whl", hash = "sha256:22f3fcc129fb482ef44e7df2a594f0bd514ac45aabe50da1a10709de1b0f9d84"}, - {file = "pandas-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:45656cd59ae9745a1a21271a62001df58342b59c66d50754390066db500a8362"}, - {file = "pandas-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:114c6789d15862508900a25cb4cb51820bfdd8595ea306bab3b53cd19f990b65"}, - {file = "pandas-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:527c43311894aff131dea99cf418cd723bfd4f0bcf3c3da460f3b57e52a64da5"}, - {file = "pandas-1.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb3b33dde260b1766ea4d3c6b8fbf6799cee18d50a2a8bc534cf3550b7c819a"}, - {file = "pandas-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c28760932283d2c9f6fa5e53d2f77a514163b9e67fd0ee0879081be612567195"}, - {file = "pandas-1.3.1-cp39-cp39-win32.whl", hash = "sha256:be12d77f7e03c40a2466ed00ccd1a5f20a574d3c622fe1516037faa31aa448aa"}, - {file = "pandas-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:9e1fe6722cbe27eb5891c1977bca62d456c19935352eea64d33956db46139364"}, - {file = "pandas-1.3.1.tar.gz", hash = "sha256:341935a594db24f3ff07d1b34d1d231786aa9adfa84b76eab10bf42907c8aed3"}, -] -passlib = [ - {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -psycopg2 = [ - {file = "psycopg2-2.9.3-cp310-cp310-win32.whl", hash = "sha256:083707a696e5e1c330af2508d8fab36f9700b26621ccbcb538abe22e15485362"}, - {file = "psycopg2-2.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:d3ca6421b942f60c008f81a3541e8faf6865a28d5a9b48544b0ee4f40cac7fca"}, - {file = "psycopg2-2.9.3-cp36-cp36m-win32.whl", hash = "sha256:9572e08b50aed176ef6d66f15a21d823bb6f6d23152d35e8451d7d2d18fdac56"}, - {file = "psycopg2-2.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:a81e3866f99382dfe8c15a151f1ca5fde5815fde879348fe5a9884a7c092a305"}, - {file = "psycopg2-2.9.3-cp37-cp37m-win32.whl", hash = "sha256:cb10d44e6694d763fa1078a26f7f6137d69f555a78ec85dc2ef716c37447e4b2"}, - {file = "psycopg2-2.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4295093a6ae3434d33ec6baab4ca5512a5082cc43c0505293087b8a46d108461"}, - {file = "psycopg2-2.9.3-cp38-cp38-win32.whl", hash = "sha256:34b33e0162cfcaad151f249c2649fd1030010c16f4bbc40a604c1cb77173dcf7"}, - {file = "psycopg2-2.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:0762c27d018edbcb2d34d51596e4346c983bd27c330218c56c4dc25ef7e819bf"}, - {file = "psycopg2-2.9.3-cp39-cp39-win32.whl", hash = "sha256:8cf3878353cc04b053822896bc4922b194792df9df2f1ad8da01fb3043602126"}, - {file = "psycopg2-2.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:06f32425949bd5fe8f625c49f17ebb9784e1e4fe928b7cce72edc36fb68e4c0c"}, - {file = "psycopg2-2.9.3.tar.gz", hash = "sha256:8e841d1bf3434da985cc5ef13e6f75c8981ced601fd70cc6bf33351b91562981"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, - {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, - {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, - {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, - {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, - {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, - {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, - {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, - {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, - {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pydantic = [ - {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, - {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, - {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, - {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, - {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, - {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, - {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, - {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, - {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, - {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, - {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, - {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, - {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, - {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, - {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, - {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, - {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, - {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, - {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, - {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, - {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, - {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-jose = [ - {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, - {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, -] -python-multipart = [ - {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, -] -pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] -rsa = [ - {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, - {file = "rsa-4.7.2.tar.gz", hash = "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -sniffio = [ - {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, - {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, -] -sqlacodegen = [ - {file = "sqlacodegen-2.3.0-py2.py3-none-any.whl", hash = "sha256:6122465c0842b2f50c04efcf0ea5f882663a50cd205391d006f2475981269ab5"}, - {file = "sqlacodegen-2.3.0.tar.gz", hash = "sha256:f6ea38f815b330013548bb1f90158672f773d0b1fe97f61c117d291a70ab27de"}, -] -sqlalchemy = [ - {file = "SQLAlchemy-1.4.29-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:da64423c05256f4ab8c0058b90202053b201cbe3a081f3a43eb590cd554395ab"}, - {file = "SQLAlchemy-1.4.29-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0fc4eec2f46b40bdd42112b3be3fbbf88e194bcf02950fbb88bcdc1b32f07dc7"}, - {file = "SQLAlchemy-1.4.29-cp27-cp27m-win32.whl", hash = "sha256:101d2e100ba9182c9039699588e0b2d833c54b3bad46c67c192159876c9f27ea"}, - {file = "SQLAlchemy-1.4.29-cp27-cp27m-win_amd64.whl", hash = "sha256:ceac84dd9abbbe115e8be0c817bed85d9fa639b4d294e7817f9e61162d5f766c"}, - {file = "SQLAlchemy-1.4.29-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:15b65887b6c324cad638c7671cb95985817b733242a7eb69edd7cdf6953be1e0"}, - {file = "SQLAlchemy-1.4.29-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:78abc507d17753ed434b6cc0c0693126279723d5656d9775bfcac966a99a899b"}, - {file = "SQLAlchemy-1.4.29-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb8c993706e86178ce15a6b86a335a2064f52254b640e7f53365e716423d33f4"}, - {file = "SQLAlchemy-1.4.29-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:804e22d5b6165a4f3f019dd9c94bec5687de985a9c54286b93ded9f7846b8c82"}, - {file = "SQLAlchemy-1.4.29-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d9d62021946263d4478c9ca012fbd1805f10994cb615c88e7bfd1ae14604d8"}, - {file = "SQLAlchemy-1.4.29-cp310-cp310-win32.whl", hash = "sha256:027f356c727db24f3c75828c7feb426f87ce1241242d08958e454bd025810660"}, - {file = "SQLAlchemy-1.4.29-cp310-cp310-win_amd64.whl", hash = "sha256:debaf09a823061f88a8dee04949814cf7e82fb394c5bca22c780cb03172ca23b"}, - {file = "SQLAlchemy-1.4.29-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:dc27dcc6c72eb38be7f144e9c2c4372d35a3684d3a6dd43bd98c1238358ee17c"}, - {file = "SQLAlchemy-1.4.29-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4ddd4f2e247128c58bb3dd4489922874afce157d2cff0b2295d67fcd0f22494"}, - {file = "SQLAlchemy-1.4.29-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ce960a1dc60524136cf6f75621588e2508a117e04a6e3eedb0968bd13b8c824"}, - {file = "SQLAlchemy-1.4.29-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5919e647e1d4805867ea556ed4967c68b4d8b266059fa35020dbaed8ffdd60f3"}, - {file = "SQLAlchemy-1.4.29-cp36-cp36m-win32.whl", hash = "sha256:886359f734b95ad1ef443b13bb4518bcade4db4f9553c9ce33d6d04ebda8d44e"}, - {file = "SQLAlchemy-1.4.29-cp36-cp36m-win_amd64.whl", hash = "sha256:e9cc6d844e24c307c3272677982a9b33816aeb45e4977791c3bdd47637a8d810"}, - {file = "SQLAlchemy-1.4.29-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:5e9cd33459afa69c88fa648e803d1f1245e3caa60bfe8b80a9595e5edd3bda9c"}, - {file = "SQLAlchemy-1.4.29-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeaebceb24b46e884c4ad3c04f37feb178b81f6ce720af19bfa2592ca32fdef7"}, - {file = "SQLAlchemy-1.4.29-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e89347d3bd2ef873832b47e85f4bbd810a5e626c5e749d90a07638da100eb1c8"}, - {file = "SQLAlchemy-1.4.29-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a717c2e70fd1bb477161c4cc85258e41d978584fbe5522613618195f7e87d9b"}, - {file = "SQLAlchemy-1.4.29-cp37-cp37m-win32.whl", hash = "sha256:f74d6c05d2d163464adbdfbc1ab85048cc15462ff7d134b8aed22bd521e1faa5"}, - {file = "SQLAlchemy-1.4.29-cp37-cp37m-win_amd64.whl", hash = "sha256:621854dbb4d2413c759a5571564170de45ef37299df52e78e62b42e2880192e1"}, - {file = "SQLAlchemy-1.4.29-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:f3909194751bb6cb7c5511dd18bcf77e6e3f0b31604ed4004dffa9461f71e737"}, - {file = "SQLAlchemy-1.4.29-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd49d21d1f03c81fbec9080ecdc4486d5ddda67e7fbb75ebf48294465c022cdc"}, - {file = "SQLAlchemy-1.4.29-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e5f6959466a42b6569774c257e55f9cd85200d5b0ba09f0f5d8b5845349c5822"}, - {file = "SQLAlchemy-1.4.29-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0072f9887aabe66db23f818bbe950cfa1b6127c5cb769b00bcc07935b3adb0ad"}, - {file = "SQLAlchemy-1.4.29-cp38-cp38-win32.whl", hash = "sha256:ad618d687d26d4cbfa9c6fa6141d59e05bcdfc60cb6e1f1d3baa18d8c62fef5f"}, - {file = "SQLAlchemy-1.4.29-cp38-cp38-win_amd64.whl", hash = "sha256:878daecb6405e786b07f97e1c77a9cfbbbec17432e8a90c487967e32cfdecb33"}, - {file = "SQLAlchemy-1.4.29-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:e027bdf0a4cf6bd0a3ad3b998643ea374d7991bd117b90bf9982e41ceb742941"}, - {file = "SQLAlchemy-1.4.29-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5de7adfb91d351f44062b8dedf29f49d4af7cb765be65816e79223a4e31062b"}, - {file = "SQLAlchemy-1.4.29-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fbc6e63e481fa323036f305ada96a3362e1d60dd2bfa026cac10c3553e6880e9"}, - {file = "SQLAlchemy-1.4.29-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dd0502cb091660ad0d89c5e95a29825f37cde2a5249957838e975871fbffaad"}, - {file = "SQLAlchemy-1.4.29-cp39-cp39-win32.whl", hash = "sha256:37b46bfc4af3dc226acb6fa28ecd2e1fd223433dc5e15a2bad62bf0a0cbb4e8b"}, - {file = "SQLAlchemy-1.4.29-cp39-cp39-win_amd64.whl", hash = "sha256:08cfd35eecaba79be930c9bfd2e1f0c67a7e1314355d83a378f9a512b1cf7587"}, - {file = "SQLAlchemy-1.4.29.tar.gz", hash = "sha256:fa2bad14e1474ba649cfc969c1d2ec915dd3e79677f346bbfe08e93ef9020b39"}, -] -starlette = [ - {file = "starlette-0.16.0-py3-none-any.whl", hash = "sha256:38eb24bf705a2c317e15868e384c1b8a12ca396e5a3c3a003db7e667c43f939f"}, - {file = "starlette-0.16.0.tar.gz", hash = "sha256:e1904b5d0007aee24bdd3c43994be9b3b729f4f58e740200de1d623f8c3a8870"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] -uvicorn = [ - {file = "uvicorn-0.16.0-py3-none-any.whl", hash = "sha256:d8c839231f270adaa6d338d525e2652a0b4a5f4c2430b5c4ef6ae4d11776b0d2"}, - {file = "uvicorn-0.16.0.tar.gz", hash = "sha256:eacb66afa65e0648fcbce5e746b135d09722231ffffc61883d4fac2b62fbea8d"}, -] -werkzeug = [ - {file = "Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f"}, - {file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"}, -] diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 1f98549..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,27 +0,0 @@ -[tool.poetry] -name = "opencdms-api" -version = "0.1.0" -description = "" -authors = ["Your Name "] - -[tool.poetry.dependencies] -python = "^3.9" -fastapi = "^0.70.0" -uvicorn = "^0.16.0" -SQLAlchemy = "^1.4.26" -passlib = "^1.7.4" -inflection = "^0.5.1" -python-jose = "^3.3.0" -pydantic = {extras = ["email"], version = "^1.8.2"} -Faker = "^10.0.0" -python-multipart = "^0.0.5" -opencdms = {git = "https://github.com/opencdms/pyopencdms.git", rev = "main"} -climsoft-api = {git = "https://github.com/opencdms/climsoft-api.git", rev = "main"} -mch-api = {git = "https://github.com/opencdms/mch-api.git", rev = "main"} - -[tool.poetry.dev-dependencies] -pytest = "^6.2.5" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/requirements-old.txt b/requirements-old.txt deleted file mode 100644 index b7304fc..0000000 --- a/requirements-old.txt +++ /dev/null @@ -1,22 +0,0 @@ -mysqlclient~=2.0.3 -SQLAlchemy~=1.4.23 -uvicorn~=0.15.0 -alembic~=1.6.5 -pytest~=6.2.5 -starlette~=0.14.2 -django~=3.2.9 -django-colorfield -fastapi~=0.68.1 -fastapi-sqlalchemy -Faker~=9.8.1 -requests -passlib~=1.7.4 -python-jose[cryptography] -pydantic~=1.8.2 -pydantic[email] -git+https://github.com/opencdms/pyopencdms@main#egg=opencdms -djantic -python-multipart -pytz~=2021.3 -asgiref~=3.4.1 -git+https://github.com/opencdms/mch-api@main#egg=mch_api \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c29e3f8..33b33ad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,64 +1,65 @@ -alembic==1.6.5 -aniso8601==8.0.0 -asgiref==3.4.1 -attrs==21.2.0 -certifi==2021.10.8 -cffi==1.15.0 -charset-normalizer==2.0.8 -click==7.1.2 -cryptography==36.0.0 -Django==3.2.9 -django-colorfield==0.4.5 -djantic==0.4.1 -dnspython==2.1.0 -ecdsa==0.17.0 -email-validator==1.1.3 -Faker==9.8.4 -fastapi==0.68.2 -FastAPI-SQLAlchemy==0.2.1 -Flask==1.1.2 -Flask-MySQLdb==0.2.0 -Flask-RESTful==0.3.8 -greenlet==1.1.2 -h11==0.12.0 -idna==3.3 -inflect==5.3.0 -iniconfig==1.1.1 -itsdangerous==2.0.1 -Jinja2==2.11.2 -Mako==1.1.6 -Markdown==2.6.11 -MarkupSafe==2.0.1 -mch-api @ git+https://github.com/opencdms/mch-api@b6c625f649ec75c61353d7e329808094a5eed1f6 -mysqlclient==2.0.3 -numpy==1.21.4 -opencdms @ git+https://github.com/opencdms/pyopencdms@3aae43499a4d1000f1f56e092955a6e8b095d443 -packaging==21.3 -pandas==1.3.4 -passlib==1.7.4 -pluggy==1.0.0 -psycopg2==2.9.2 -py==1.11.0 -pyasn1==0.4.8 -pycparser==2.21 -pydantic==1.8.2 -pyparsing==3.0.6 -pytest==6.2.5 -python-dateutil==2.8.2 -python-editor==1.0.4 -python-jose==3.3.0 -python-multipart==0.0.5 -pytz==2021.3 -requests==2.26.0 -rsa==4.8 -six==1.16.0 -sqlacodegen==2.3.0 -SQLAlchemy==1.4.27 -sqlparse==0.4.2 -starlette==0.14.2 -text-unidecode==1.3 -toml==0.10.2 -typing-extensions==4.0.0 -urllib3==1.26.7 -uvicorn==0.15.0 -Werkzeug==2.0.2 +alembic +aniso8601 +asgiref +attrs +certifi +cffi +charset-normalizer +click +cryptography +Django +django-colorfield +djantic +dnspython +ecdsa +email-validator +Faker +fastapi +FastAPI-SQLAlchemy +Flask +Flask-MySQLdb +Flask-RESTful +greenlet +h11 +idna +inflect +iniconfig +itsdangerous +Jinja2 +Mako +Markdown +MarkupSafe +mch-api @ git+https://github.com/opencdms/mch-api.git@main +mysqlclient +numpy +opencdms @ git+https://github.com/opencdms/pyopencdms.git@main +climsoft_api @ git+https://github.com/faysal-ishtiaq/climsoft-api.git@package-installer +packaging +pandas +passlib +pluggy +psycopg2 +py +pyasn1 +pycparser +pydantic +pyparsing +pytest +python-dateutil +python-editor +python-jose +python-multipart +pytz +requests +rsa +six +sqlacodegen +SQLAlchemy +sqlparse +starlette +text-unidecode +toml +typing-extensions +urllib3 +uvicorn +Werkzeug diff --git a/src/opencdms_api/db.py b/src/opencdms_api/db.py index 03b39f3..02094d1 100644 --- a/src/opencdms_api/db.py +++ b/src/opencdms_api/db.py @@ -1,5 +1,5 @@ from contextlib import contextmanager -from opencdms_api.config import settings +from src.opencdms_api.config import settings from sqlalchemy.orm import sessionmaker, scoped_session, Session from sqlalchemy import create_engine from sqlalchemy.engine import Engine diff --git a/src/opencdms_api/deps.py b/src/opencdms_api/deps.py index 4541095..0e1fd0a 100644 --- a/src/opencdms_api/deps.py +++ b/src/opencdms_api/deps.py @@ -1,5 +1,5 @@ from sqlalchemy.orm.session import Session -from opencdms_api.db import SessionLocal +from src.opencdms_api.db import SessionLocal def get_session(): diff --git a/src/opencdms_api/main.py b/src/opencdms_api/main.py index 6b643a5..49ec6e3 100644 --- a/src/opencdms_api/main.py +++ b/src/opencdms_api/main.py @@ -7,13 +7,13 @@ from fastapi import FastAPI, Depends, Request from sqlalchemy.orm.session import Session from passlib.hash import django_pbkdf2_sha256 as handler -from opencdms_api.middelware import AuthMiddleWare -from opencdms_api.schema import StationSchema -from opencdms_api.deps import get_session -from opencdms_api.db import SessionLocal -from opencdms_api import models -from opencdms_api.router import router -from opencdms_api.config import settings +from src.opencdms_api.middelware import AuthMiddleWare +from src.opencdms_api.schema import StationSchema +from src.opencdms_api.deps import get_session +from src.opencdms_api.db import SessionLocal +from src.opencdms_api import models +from src.opencdms_api.router import router +from src.opencdms_api.config import settings from fastapi.templating import Jinja2Templates from fastapi.responses import HTMLResponse from pathlib import Path diff --git a/src/opencdms_api/middelware.py b/src/opencdms_api/middelware.py index 2f5917e..af44562 100644 --- a/src/opencdms_api/middelware.py +++ b/src/opencdms_api/middelware.py @@ -6,9 +6,9 @@ from jose.exceptions import JWTError from starlette.types import Scope, Receive, Send, ASGIApp from jose import jwt -from opencdms_api import models -from opencdms_api.config import settings -from opencdms_api.db import db_session_scope +from src.opencdms_api import models +from src.opencdms_api.config import settings +from src.opencdms_api.db import db_session_scope class AuthMiddleWare: diff --git a/src/opencdms_api/models.py b/src/opencdms_api/models.py index abf4d7e..c63cb47 100644 --- a/src/opencdms_api/models.py +++ b/src/opencdms_api/models.py @@ -1,5 +1,5 @@ from sqlalchemy.sql.sqltypes import Boolean -from opencdms_api.db import Base +from src.opencdms_api.db import Base from sqlalchemy import Sequence, Column, Integer, String, DateTime, func diff --git a/src/opencdms_api/router.py b/src/opencdms_api/router.py index 22db96b..a3a37d0 100644 --- a/src/opencdms_api/router.py +++ b/src/opencdms_api/router.py @@ -4,13 +4,13 @@ from fastapi.exceptions import HTTPException from sqlalchemy.orm.session import Session from passlib.hash import django_pbkdf2_sha256 as handler -from opencdms_api import deps, models -from opencdms_api.schema import ( +from src.opencdms_api import deps, models +from src.opencdms_api.schema import ( UserCreateSchema, AuthenticationSchema, TokenSchema, ) -from opencdms_api.config import settings +from src.opencdms_api.config import settings from jose import jwt router = APIRouter() From 527f40089e67d58c8508952113dacc3b69b04783 Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Wed, 2 Feb 2022 01:15:17 +0600 Subject: [PATCH 5/9] add opencdms process using pygeoapi --- docker-compose.prod.yml | 3 ++ docker-compose.test.yml | 3 ++ docker-compose.yml | 2 ++ dockerfile | 5 ++- entrypoint.sh | 1 + pygeoapi-config.yml | 75 ++++++++++++++++++++++++++++++++++++++++ requirements.txt | 4 ++- src/opencdms_api/main.py | 3 ++ 8 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 pygeoapi-config.yml diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index c76a37e..83ff53f 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -52,6 +52,8 @@ services: - surfacedb - mchdb environment: + - PYGEOAPI_CONFIG=/code/pygeoapi-config.yml + - PYGEOAPI_OPENAPI=/code/pygeoapi-openapi.yml - PYTHONPATH=/code/surface/api - CLIMSOFT_DATABASE_URI=mysql+mysqldb://root:password@climsoftdb:3306/climsoft - CLIMSOFT_SECRET_KEY=6v(n93zuas7&k^-zcvkp5kq*3hw49t%ra0nt6!_3(0&4! @@ -123,6 +125,7 @@ services: - MCH_API_ENABLED=true - DEFAULT_USERNAME=admin - DEFAULT_PASSWORD=password123 + labels: - "traefik.enable=true" - "traefik.http.routers.fastapi.rule=Host(`api.opencdms.org`)" diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 11b7b70..75231f0 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -9,6 +9,8 @@ services: expose: - "5000" environment: + - PYGEOAPI_CONFIG=/code/pygeoapi-config.yml + - PYGEOAPI_OPENAPI=/code/pygeoapi-openapi.yml - PYTHONPATH=/code/surface/api - TIMESCALEDB_TELEMETRY=off - PGDATA=/var/lib/postgresql/data/pgdata @@ -80,6 +82,7 @@ services: - MCH_API_ENABLED=true - DEFAULT_USERNAME=admin - DEFAULT_PASSWORD=password123 + depends_on: - test_opencdms_surface_db - test_opencdms_mch_db diff --git a/docker-compose.yml b/docker-compose.yml index 94a059d..7aad8bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,8 @@ services: env_file: - .env environment: + - PYGEOAPI_CONFIG=/code/pygeoapi-config.yml + - PYGEOAPI_OPENAPI=/code/pygeoapi-openapi.yml - PYTHONPATH=/code/surface/api - CLIMSOFT_DATABASE_URI=mysql+mysqldb://root:password@opencdms_climsoftdb:3306/climsoft - CLIMSOFT_SECRET_KEY=climsoft-secret-key diff --git a/dockerfile b/dockerfile index 5ade39d..af4d1c2 100644 --- a/dockerfile +++ b/dockerfile @@ -9,8 +9,9 @@ ENV PYTHONFAULTHANDLER=1 \ PIP_NO_CACHE_DIR=1 RUN apt-get update --fix-missing -RUN apt-get install -y g++ libgdal-dev libpq-dev libgeos-dev libproj-dev openjdk-17-jre vim wait-for-it +RUN apt-get install -y g++ libgdal-dev libpq-dev libgeos-dev libproj-dev openjdk-17-jre vim wait-for-it r-base-core libmagick++-dev RUN apt-get install -y curl git && pip install --upgrade pip +RUN R -e "install.packages('magick')" WORKDIR /code @@ -33,6 +34,8 @@ RUN useradd -m opencdms_api_user && chown -R opencdms_api_user /code RUN ["chmod", "+x", "/code/scripts/load_initial_surface_data.sh"] +COPY ["pygeoapi-config.yml", "/code"] + USER opencdms_api_user ENTRYPOINT [ "/bin/sh", "entrypoint.sh" ] diff --git a/entrypoint.sh b/entrypoint.sh index 6e8d033..6c6d181 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -3,4 +3,5 @@ python surface/api/manage.py migrate python init_climsoft_db.py ./scripts/load_initial_surface_data.sh +pygeoapi openapi generate /code/pygeoapi-config.yml >| /code/pygeoapi-openapi.yml exec $@ diff --git a/pygeoapi-config.yml b/pygeoapi-config.yml new file mode 100644 index 0000000..038604b --- /dev/null +++ b/pygeoapi-config.yml @@ -0,0 +1,75 @@ +server: + bind: + host: 0.0.0.0 + port: 5070 + url: http://localhost:5070/pygeoapi/ + mimetype: application/json; charset=UTF-8 + encoding: utf-8 + gzip: false + languages: + # First language is the default language + - en-US + - fr-CA + cors: true + pretty_print: true + limit: 10 + # templates: /path/to/templates + map: + url: https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png + attribution: 'Wikimedia maps | Map data © OpenStreetMap contributors' + manager: + name: TinyDB + connection: /tmp/pygeoapi-test-process-manager.db + output_dir: /tmp + +logging: + level: ERROR + #logfile: /tmp/pygeoapi.log + +metadata: + identification: + title: + en: pygeoapi default instance + fr: instance par défaut de pygeoapi + description: + en: pygeoapi provides an API to geospatial data + fr: pygeoapi fournit une API aux données géospatiales + keywords: + en: + - geospatial + - data + - api + fr: + - géospatiale + - données + - api + keywords_type: theme + terms_of_service: https://creativecommons.org/licenses/by/4.0/ + url: http://example.org + license: + name: CC-BY 4.0 license + url: https://creativecommons.org/licenses/by/4.0/ + provider: + name: Organization Name + url: https://pygeoapi.io + contact: + name: Lastname, Firstname + position: Position Title + address: Mailing Address + city: City + stateorprovince: Administrative Area + postalcode: Zip or Postal Code + country: Country + phone: +xx-xxx-xxx-xxxx + fax: +xx-xxx-xxx-xxxx + email: you@example.org + url: Contact URL + hours: Hours of Service + instructions: During hours of service. Off on weekends. + role: pointOfContact + +resources: + windrose-generator: + type: process + processor: + name: opencdms_process.process.climatol.windrose_generator.WindroseProcessor \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 33b33ad..bf4b776 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,7 +33,7 @@ mch-api @ git+https://github.com/opencdms/mch-api.git@main mysqlclient numpy opencdms @ git+https://github.com/opencdms/pyopencdms.git@main -climsoft_api @ git+https://github.com/faysal-ishtiaq/climsoft-api.git@package-installer +climsoft_api @ git+https://github.com/opencdms/climsoft-api.git@main packaging pandas passlib @@ -63,3 +63,5 @@ typing-extensions urllib3 uvicorn Werkzeug +Flask-Cors +opencdms_process @ git+https://github.com/opencdms/opencdms-process.git@main diff --git a/src/opencdms_api/main.py b/src/opencdms_api/main.py index 49ec6e3..40b71de 100644 --- a/src/opencdms_api/main.py +++ b/src/opencdms_api/main.py @@ -17,6 +17,7 @@ from fastapi.templating import Jinja2Templates from fastapi.responses import HTMLResponse from pathlib import Path +from pygeoapi.flask_app import APP as pygeoapi_app # load controllers @@ -31,6 +32,8 @@ def get_app(): app.mount("/mch", AuthMiddleWare(WSGIMiddleware(mch_api_application))) if settings.CLIMSOFT_API_ENABLED is True: app.mount("/climsoft", AuthMiddleWare(climsoft_app)) + app.mount("/pygeoapi", AuthMiddleWare(WSGIMiddleware(pygeoapi_app))) + app.include_router(router) @app.on_event("startup") From 683739762a50f246ccfc493962c1445b91daa8dd Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Wed, 2 Feb 2022 01:24:10 +0600 Subject: [PATCH 6/9] add pygeoapi link on homepage --- src/opencdms_api/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opencdms_api/main.py b/src/opencdms_api/main.py index 40b71de..c5222bf 100644 --- a/src/opencdms_api/main.py +++ b/src/opencdms_api/main.py @@ -81,7 +81,7 @@ def fetch_stations(session: Session = Depends(get_session)): @app.get("/", response_class=HTMLResponse) def root(request: Request): - supported_apis = [] + supported_apis = [{"title": "Pygeoapi", "url": "/pygeoapi"}] if settings.SURFACE_API_ENABLED: supported_apis.append({"title": "Surface API", "url": "/surface"}) if settings.CLIMSOFT_API_ENABLED: From 6f5ed3cf069fa0f72e5f7cb0ddb281b5670394f6 Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Wed, 2 Feb 2022 01:41:57 +0600 Subject: [PATCH 7/9] update readme --- README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d41dbf..f2b5e60 100644 --- a/README.md +++ b/README.md @@ -91,4 +91,48 @@ To run the tests, you just need to run `docker-compose -f docker-compose.test.ym Check the logs for error. -### How to access surface, climsoft or mch API +### How to access surface, climsoft, pygeoapi or mch API + +OpenCDMS API server is a FastAPI application. surface, climsoft, pygeoapi, mch servers are +mounted to this FastAPI application. When mounting these child applications, we also have +enforced an Auth Middleware. So, if you want to access the endpoints on these child applications, +you have to make authenticated request. + +To get an access token using default username and password: + +```bash +$ curl -X 'POST' \ + 'http://localhost:5070/auth' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "username": "admin", + "password": "password123" +}' +``` + +Say, it returns + +```bash +{ + "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTY0MzgzMDUzMiwidG9rZW5fdHlwZSI6ImFjY2VzcyIsImp0aSI6ImEzM2Q4OWMyLTNlNmEtNDJlYS04MGZjLWViZjEzNTcyZjU5MSIsInVzZXJfaWQiOjF9.dp_wPSDZwL4HAN8JWCWyGRlL0s8gRvWKASUeDPQQygY" +} +``` + +Now you can make request to protected endpoints using this access token as `Bearer` token. + +Here is an example: + +```bash +$ curl -X 'GET' \ + 'http://localhost:5070/climsoft/v1/acquisition-types/?limit=25&offset=0' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MTY0MzgzMDUzMiwidG9rZW5fdHlwZSI6ImFjY2VzcyIsImp0aSI6ImEzM2Q4OWMyLTNlNmEtNDJlYS04MGZjLWViZjEzNTcyZjU5MSIsInVzZXJfaWQiOjF9.dp_wPSDZwL4HAN8JWCWyGRlL0s8gRvWKASUeDPQQygY' +``` + +which will return something like this: + +```bash +{"message":"Successfully fetched acquisition types.","status":"success","result":[]} +``` + From 95895433a1418372a30db46e9c1b49e3e955cd2f Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Wed, 2 Feb 2022 01:43:16 +0600 Subject: [PATCH 8/9] suggest postman --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f2b5e60..f90d5d0 100644 --- a/README.md +++ b/README.md @@ -136,3 +136,4 @@ which will return something like this: {"message":"Successfully fetched acquisition types.","status":"success","result":[]} ``` +You can use Postman to make this requests easily. \ No newline at end of file From c7a9bf229c604f652c6fd4574130c32dc1810589 Mon Sep 17 00:00:00 2001 From: Faysal Ishtiaq Date: Wed, 2 Feb 2022 16:26:45 +0600 Subject: [PATCH 9/9] refactor github actions --- .../{ci_cd.yml => deploy_latest.yml} | 7 +++-- .github/workflows/deploy_stable.yml | 29 +++++++++++++++++++ docker-compose.prod.yml | 2 +- pygeoapi-config.yml | 8 ++--- 4 files changed, 37 insertions(+), 9 deletions(-) rename .github/workflows/{ci_cd.yml => deploy_latest.yml} (77%) create mode 100644 .github/workflows/deploy_stable.yml diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/deploy_latest.yml similarity index 77% rename from .github/workflows/ci_cd.yml rename to .github/workflows/deploy_latest.yml index 136711b..a215448 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/deploy_latest.yml @@ -1,4 +1,4 @@ -name: Deploy on EC2 +name: Deploy on EC2 - Latest on: push: @@ -11,9 +11,10 @@ jobs: - uses: actions/checkout@v2 - name: Deploy in EC2 env: - PRIVATE_KEY: ${{secrets.AWS_PRIVATE_KEY}} - HOSTNAME : ${{secrets.HOSTNAME}} + PRIVATE_KEY: ${{secrets.AWS_PRIVATE_KEY_LATEST}} + HOSTNAME : ${{secrets.HOSTNAME_LATEST}} USERNAME : ${{secrets.USERNAME}} + HOST_FQDN: ${{secrets.LATEST_HOST_FQDN}} run: | echo "$PRIVATE_KEY" > private_key && chmod 600 private_key diff --git a/.github/workflows/deploy_stable.yml b/.github/workflows/deploy_stable.yml new file mode 100644 index 0000000..d17f0c8 --- /dev/null +++ b/.github/workflows/deploy_stable.yml @@ -0,0 +1,29 @@ +name: Deploy on EC2 - Stable + +on: + release: + types: + - published + +jobs: + Deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Deploy in EC2 + env: + PRIVATE_KEY: ${{secrets.AWS_PRIVATE_KEY_STABLE}} + HOSTNAME : ${{secrets.HOSTNAME_STABLE}} + USERNAME : ${{secrets.USERNAME}} + HOST_FQDN: ${{secrets.STABLE_HOST_FQDN}} + + run: | + echo "$PRIVATE_KEY" > private_key && chmod 600 private_key + ssh -o StrictHostKeyChecking=no -i private_key ${USERNAME}@${HOSTNAME} ' + cd /home/ubuntu/opencdms-api + git pull origin main + docker-compose -f docker-compose.prod.yml build + docker-compose -f docker-compose.prod.yml stop opencdms-api + sleep 30 + docker-compose -f docker-compose.prod.yml up -d --build + ' \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 83ff53f..e3b6d1b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -128,7 +128,7 @@ services: labels: - "traefik.enable=true" - - "traefik.http.routers.fastapi.rule=Host(`api.opencdms.org`)" + - "traefik.http.routers.fastapi.rule=Host(`$HOST_FQDN`)" - "traefik.http.routers.fastapi.tls=true" - "traefik.http.routers.fastapi.tls.certresolver=letsencrypt" command: diff --git a/pygeoapi-config.yml b/pygeoapi-config.yml index 038604b..db26879 100644 --- a/pygeoapi-config.yml +++ b/pygeoapi-config.yml @@ -1,19 +1,18 @@ server: bind: host: 0.0.0.0 - port: 5070 - url: http://localhost:5070/pygeoapi/ + port: 443 + url: https://${HOST_FQDN}/pygeoapi/ mimetype: application/json; charset=UTF-8 encoding: utf-8 gzip: false languages: - # First language is the default language - en-US - fr-CA cors: true pretty_print: true limit: 10 - # templates: /path/to/templates + map: url: https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png attribution: 'Wikimedia maps | Map data © OpenStreetMap contributors' @@ -24,7 +23,6 @@ server: logging: level: ERROR - #logfile: /tmp/pygeoapi.log metadata: identification: