From 717466b01ce11fb59b9c508523d6815faf81d482 Mon Sep 17 00:00:00 2001 From: Felix Claessen <30658763+Flix6x@users.noreply.github.com> Date: Fri, 2 Apr 2021 19:47:49 +0200 Subject: [PATCH] Update dependencies (#82) Update dependencies, including a new major release of flask-security-too and a minor release of sqlalchemy. * Add developer requirements * New pip-tools formatting since 5.5.0 * Update flake8 and add hints in our yaml on where to find new version tags * make upgrade-deps * Set explicit minimum security dependency * Fix explicit minimum security dependency * Fix tests with deprecation of sqlalchemy RowProxy in 1.4 * One more upgrade * Make test after upgrading dependencies * Changelog entry * Set minimum sqlalchemy dependency * Two more recent upgrades Co-authored-by: F.N. Claessen --- .pre-commit-config.yaml | 4 +- Makefile | 1 + documentation/changelog.rst | 10 + flexmeasures/data/queries/utils.py | 27 -- flexmeasures/data/scripts/data_gen.py | 5 +- flexmeasures/data/services/resources.py | 15 +- requirements/app.in | 3 +- requirements/app.txt | 448 ++++++++++++++++++------ requirements/dev.in | 2 + requirements/dev.txt | 100 ++++-- requirements/test.txt | 131 +++++-- 11 files changed, 541 insertions(+), 205 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f4c994be1..f6535cac9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,12 +1,12 @@ repos: - repo: https://gitlab.com/pycqa/flake8 - rev: 3.8.4 + rev: 3.9.0 # New version tags can be found here: https://gitlab.com/pycqa/flake8/-/tags hooks: - id: flake8 name: flake8 (code linting) language_version: python3.8 - repo: https://github.com/psf/black - rev: 20.8b1 + rev: 20.8b1 # New version tags can be found here: https://github.com/psf/black/tags hooks: - id: black name: black (code formatting) diff --git a/Makefile b/Makefile index 5b0d11aae..dd8797f93 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,7 @@ upgrade-deps: pip-compile --upgrade -o requirements/app.txt requirements/app.in pip-compile --upgrade -o requirements/dev.txt requirements/dev.in pip-compile --upgrade -o requirements/test.txt requirements/test.in + make test # ---- Data ---- diff --git a/documentation/changelog.rst b/documentation/changelog.rst index 14aa5568a..49fb85af2 100644 --- a/documentation/changelog.rst +++ b/documentation/changelog.rst @@ -3,6 +3,16 @@ FlexMeasures Changelog ********************** +v0.2.5 | April XX, 2021 +=========================== + +Infrastructure / Support +---------------------- +* Updated dependencies, including Flask-Security-Too [see `PR #82 `_] + + + + v0.2.4 | April 2, 2021 =========================== diff --git a/flexmeasures/data/queries/utils.py b/flexmeasures/data/queries/utils.py index 0fb54a421..e2c025cba 100644 --- a/flexmeasures/data/queries/utils.py +++ b/flexmeasures/data/queries/utils.py @@ -5,7 +5,6 @@ import timely_beliefs as tb from sqlalchemy.orm import Query, Session -from sqlalchemy.engine.result import RowProxy from flexmeasures.data.config import db from flexmeasures.data.models.data_sources import DataSource @@ -158,32 +157,6 @@ def add_belief_timing_filter( return query -def parse_sqlalchemy_results(results: List[RowProxy]) -> List[dict]: - """ - Returns a list of dicts, whose keys are column names. E.g.: - - data = session.execute("Select latitude from asset;").fetchall() - for row in parse_sqlalchemy_results(data): - print("------------") - for key, val in row: - print f"{key}: {val}" - - """ - parsed_results: List[dict] = [] - - if len(results) == 0: - return parsed_results - - # results from SQLAlchemy are returned as a list of tuples; - # this procedure converts it into a list of dicts - for row_number, row in enumerate(results): - parsed_results.append({}) - for column_number, value in enumerate(row): - parsed_results[row_number][row.keys()[column_number]] = value - - return parsed_results - - def simplify_index( bdf: tb.BeliefsDataFrame, index_levels_to_columns: Optional[List[str]] = None ) -> pd.DataFrame: diff --git a/flexmeasures/data/scripts/data_gen.py b/flexmeasures/data/scripts/data_gen.py index a71a7e0b3..700838bd2 100644 --- a/flexmeasures/data/scripts/data_gen.py +++ b/flexmeasures/data/scripts/data_gen.py @@ -19,13 +19,13 @@ import inflect from flexmeasures.data.models.markets import MarketType, Market, Price +from flexmeasures.data.models.time_series import Sensor from flexmeasures.data.models.assets import AssetType, Asset, Power from flexmeasures.data.models.data_sources import DataSource from flexmeasures.data.models.weather import WeatherSensorType, WeatherSensor, Weather from flexmeasures.data.models.user import User, Role, RolesUsers from flexmeasures.data.models.forecasting import lookup_model_specs_configurator from flexmeasures.data.models.forecasting.exceptions import NotEnoughDataException -from flexmeasures.data.queries.utils import parse_sqlalchemy_results from flexmeasures.utils.time_utils import ensure_local_timezone from flexmeasures.data.transactional import as_transaction @@ -641,7 +641,7 @@ def load_tables( affected_classes = get_affected_classes(structure, data) statement = "SELECT sequence_name from information_schema.sequences;" data = db.session.execute(statement).fetchall() - sequence_names = [s["sequence_name"] for s in parse_sqlalchemy_results(data)] + sequence_names = [s.sequence_name for s in data] for c in affected_classes: file_path = "%s/%s/%s.obj" % (backup_path, backup_name, c.__tablename__) sequence_name = "%s_id_seq" % c.__tablename__ @@ -682,6 +682,7 @@ def get_affected_classes(structure: bool = True, data: bool = False) -> List: Role, User, RolesUsers, + Sensor, MarketType, Market, AssetType, diff --git a/flexmeasures/data/services/resources.py b/flexmeasures/data/services/resources.py index 6fc21eee7..f66f7fabf 100644 --- a/flexmeasures/data/services/resources.py +++ b/flexmeasures/data/services/resources.py @@ -13,6 +13,7 @@ import inflect import pandas as pd from sqlalchemy.orm import Query, Session +from sqlalchemy.engine import Row import timely_beliefs as tb from flexmeasures.data.models.assets import ( @@ -24,7 +25,7 @@ from flexmeasures.data.models.markets import Market, Price from flexmeasures.data.models.weather import Weather, WeatherSensor, WeatherSensorType from flexmeasures.data.models.user import User -from flexmeasures.data.queries.utils import simplify_index, parse_sqlalchemy_results +from flexmeasures.data.queries.utils import simplify_index from flexmeasures.data.services.time_series import aggregate_values from flexmeasures.utils.geo_utils import parse_lat_lng from flexmeasures.utils import coding_utils, time_utils @@ -207,16 +208,14 @@ def get_center_location(db: Session, user: Optional[User]) -> Tuple[float, float ) if user and not user.has_role("admin"): query += f" where owner_id = {user.id}" - locations: List[dict] = parse_sqlalchemy_results( - db.session.execute(query + ";").fetchall() - ) + locations: List[Row] = db.session.execute(query + ";").fetchall() if ( len(locations) == 0 - or locations[0]["latitude"] is None - or locations[0]["longitude"] is None + or locations[0].latitude is None + or locations[0].longitude is None ): - return (52.38, 4.88) # Amsterdam, NL - return locations[0]["latitude"], locations[0]["longitude"] + return 52.366, 4.904 # Amsterdam, NL + return locations[0].latitude, locations[0].longitude def check_cache(attribute): diff --git a/requirements/app.in b/requirements/app.in index 592ed01c5..60a3f64a5 100644 --- a/requirements/app.in +++ b/requirements/app.in @@ -36,6 +36,7 @@ timely-beliefs>=1.2.1 python-dotenv # a backport, not needed in Python3.8 importlib_metadata +sqlalchemy>=1.4.0 Flask-SSLify Flask_JSON Flask-SQLAlchemy>=2.4.3 @@ -43,7 +44,7 @@ Flask-Migrate Flask-WTF Flask-Login Flask-Mail -Flask-Security-Too +Flask-Security-Too>=4.0 Flask-Classful Flask-Marshmallow Flask-Cors diff --git a/requirements/app.txt b/requirements/app.txt index c9ed77bec..35570ffd7 100644 --- a/requirements/app.txt +++ b/requirements/app.txt @@ -4,115 +4,345 @@ # # pip-compile --output-file=requirements/app.txt requirements/app.in # -alembic==1.4.2 # via flask-migrate -altair==3.0.0 # via timely-beliefs -appdirs==1.4.4 # via pyomo -arrow==0.16.0 # via rq-dashboard -attrs==20.2.0 # via jsonschema -babel==2.8.0 # via flask-babelex -bcrypt==3.2.0 # via -r requirements/app.in -beautifulsoup4==4.9.3 # via siphon -blinker==1.4 # via flask-mail, flask-principal -bokeh==1.0.4 # via -r requirements/app.in, pandas-bokeh -certifi==2020.6.20 # via matplotlib, requests -cffi==1.14.2 # via bcrypt -cftime==1.4.1 # via netcdf4 -chardet==3.0.4 # via requests -click==7.1.2 # via -r requirements/app.in, flask, rq -colour==0.1.5 # via -r requirements/app.in -cycler==0.10.0 # via matplotlib -dnspython==2.0.0 # via email-validator -email-validator==1.1.1 # via -r requirements/app.in, flask-security-too -entrypoints==0.3 # via altair -filelock==3.0.12 # via tldextract -flask-babelex==0.9.4 # via flask-security-too -flask-classful==0.14.2 # via -r requirements/app.in -flask-cors==3.0.10 # via -r requirements/app.in -flask-json==0.3.4 # via -r requirements/app.in -flask-login==0.5.0 # via -r requirements/app.in, flask-security-too -flask-mail==0.9.1 # via -r requirements/app.in, flask-security-too -flask-marshmallow==0.13.0 # via -r requirements/app.in -flask-migrate==2.5.3 # via -r requirements/app.in -flask-principal==0.4.0 # via flask-security-too -flask-security-too==3.4.4 # via -r requirements/app.in -flask-sqlalchemy==2.4.4 # via -r requirements/app.in, flask-migrate -flask-sslify==0.1.5 # via -r requirements/app.in -flask-wtf==0.14.3 # via -r requirements/app.in, flask-security-too -flask==1.1.2 # via -r requirements/app.in, flask-babelex, flask-classful, flask-cors, flask-json, flask-login, flask-mail, flask-marshmallow, flask-migrate, flask-principal, flask-security-too, flask-sqlalchemy, flask-sslify, flask-wtf, rq-dashboard -forecastiopy==0.22 # via -r requirements/app.in -humanize==2.6.0 # via -r requirements/app.in -idna==2.10 # via email-validator, requests, tldextract -importlib-metadata==3.7.0 # via -r requirements/app.in -inflect==4.1.0 # via -r requirements/app.in -inflection==0.5.1 # via -r requirements/app.in -iso8601==0.1.12 # via -r requirements/app.in -isodate==0.6.0 # via -r requirements/app.in, timely-beliefs -itsdangerous==1.1.0 # via flask, flask-security-too, flask-wtf -jinja2==2.11.2 # via altair, bokeh, flask, flask-babelex -joblib==0.16.0 # via scikit-learn -jsonschema==3.2.0 # via altair -kiwisolver==1.2.0 # via matplotlib -mako==1.1.3 # via alembic -markupsafe==1.1.1 # via jinja2, mako, wtforms -marshmallow-sqlalchemy==0.23.1 # via -r requirements/app.in -marshmallow==3.7.1 # via flask-marshmallow, marshmallow-sqlalchemy, webargs -matplotlib==3.3.1 # via timetomodel -netcdf4==1.5.5.1 # via -r requirements/app.in -nose==1.3.7 # via pyutilib -numexpr==2.7.2 # via tables -numpy==1.19.1 # via -r requirements/app.in, altair, bokeh, cftime, matplotlib, netcdf4, numexpr, pandas, patsy, properscoring, pvlib, scikit-learn, scipy, siphon, statsmodels, tables, timely-beliefs, timetomodel -openturns==1.15 # via timely-beliefs -packaging==20.4 # via bokeh -pandas-bokeh==0.4.3 # via -r requirements/app.in -pandas==1.2.0 # via -r requirements/app.in, altair, pandas-bokeh, pvlib, siphon, statsmodels, timely-beliefs, timetomodel -passlib==1.7.2 # via flask-security-too -patsy==0.5.1 # via statsmodels -pillow==7.2.0 # via bokeh, matplotlib -ply==3.11 # via pyomo -properscoring==0.1 # via timely-beliefs -protobuf==3.14.0 # via siphon -pscript==0.7.4 # via -r requirements/app.in -psycopg2-binary==2.8.6 # via -r requirements/app.in, timely-beliefs -pvlib==0.8.1 # via -r requirements/app.in -pycparser==2.20 # via cffi -pyomo==5.7 # via -r requirements/app.in -pyparsing==2.4.7 # via matplotlib, packaging -pyrsistent==0.16.0 # via jsonschema -python-dateutil==2.8.1 # via alembic, arrow, bokeh, matplotlib, pandas, timetomodel -python-dotenv==0.14.0 # via -r requirements/app.in -python-editor==1.0.4 # via alembic -pytz==2020.1 # via -r requirements/app.in, babel, pandas, pvlib, timely-beliefs, timetomodel, tzlocal -pyutilib==6.0.0 # via pyomo -pyyaml==5.3.1 # via bokeh -redis==3.5.3 # via rq, rq-dashboard -requests-file==1.5.1 # via tldextract -requests==2.24.0 # via forecastiopy, pvlib, requests-file, siphon, tldextract -rq-dashboard==0.6.1 # via -r requirements/app.in -rq==1.5.2 # via -r requirements/app.in, rq-dashboard -scikit-learn==0.23.2 # via sklearn -scipy==1.5.2 # via properscoring, pvlib, scikit-learn, statsmodels, timely-beliefs, timetomodel -selenium==3.141.0 # via timely-beliefs -siphon==0.8.0 # via -r requirements/app.in -six==1.15.0 # via altair, bcrypt, bokeh, cycler, flask-cors, flask-marshmallow, isodate, jsonschema, packaging, patsy, protobuf, pyomo, python-dateutil, pyutilib, requests-file -sklearn==0.0 # via timetomodel -soupsieve==2.2 # via beautifulsoup4 -speaklater==1.3 # via flask-babelex -sqlalchemy==1.3.19 # via alembic, flask-sqlalchemy, marshmallow-sqlalchemy, timely-beliefs, timetomodel -statsmodels==0.12.0 # via timetomodel -tables==3.6.1 # via -r requirements/app.in -threadpoolctl==2.1.0 # via scikit-learn -timely-beliefs==1.2.1 # via -r requirements/app.in -timetomodel==0.6.8 # via -r requirements/app.in -tldextract==3.1.0 # via -r requirements/app.in -toolz==0.10.0 # via altair -tornado==6.0.4 # via bokeh -tzlocal==2.1 # via -r requirements/app.in -urllib3==1.25.10 # via requests, selenium -webargs==7.0.1 # via -r requirements/app.in -werkzeug==1.0.1 # via flask -wtforms==2.3.3 # via flask-wtf -xlrd==1.2.0 # via -r requirements/app.in -zipp==3.4.1 # via importlib-metadata +alembic==1.5.8 + # via flask-migrate +altair==3.0.0 + # via timely-beliefs +arrow==1.0.3 + # via rq-dashboard +attrs==20.3.0 + # via jsonschema +bcrypt==3.2.0 + # via -r requirements/app.in +beautifulsoup4==4.9.3 + # via siphon +blinker==1.4 + # via + # flask-mail + # flask-principal +bokeh==1.0.4 + # via + # -r requirements/app.in + # pandas-bokeh +certifi==2020.12.5 + # via requests +cffi==1.14.5 + # via bcrypt +cftime==1.4.1 + # via netcdf4 +chardet==4.0.0 + # via requests +click==7.1.2 + # via + # -r requirements/app.in + # flask + # rq +colour==0.1.5 + # via -r requirements/app.in +cycler==0.10.0 + # via matplotlib +dnspython==2.1.0 + # via email-validator +email-validator==1.1.2 + # via + # -r requirements/app.in + # flask-security-too +entrypoints==0.3 + # via altair +filelock==3.0.12 + # via tldextract +flask-classful==0.14.2 + # via -r requirements/app.in +flask-cors==3.0.10 + # via -r requirements/app.in +flask-json==0.3.4 + # via -r requirements/app.in +flask-login==0.5.0 + # via + # -r requirements/app.in + # flask-security-too +flask-mail==0.9.1 + # via -r requirements/app.in +flask-marshmallow==0.14.0 + # via -r requirements/app.in +flask-migrate==2.7.0 + # via -r requirements/app.in +flask-principal==0.4.0 + # via flask-security-too +flask-security-too==4.0.0 + # via -r requirements/app.in +flask-sqlalchemy==2.5.1 + # via + # -r requirements/app.in + # flask-migrate +flask-sslify==0.1.5 + # via -r requirements/app.in +flask-wtf==0.14.3 + # via + # -r requirements/app.in + # flask-security-too +flask==1.1.2 + # via + # -r requirements/app.in + # flask-classful + # flask-cors + # flask-json + # flask-login + # flask-mail + # flask-marshmallow + # flask-migrate + # flask-principal + # flask-security-too + # flask-sqlalchemy + # flask-sslify + # flask-wtf + # rq-dashboard +forecastiopy==0.22 + # via -r requirements/app.in +greenlet==1.0.0 + # via sqlalchemy +humanize==3.3.0 + # via -r requirements/app.in +idna==2.10 + # via + # email-validator + # requests + # tldextract +importlib-metadata==3.10.0 + # via -r requirements/app.in +inflect==5.3.0 + # via -r requirements/app.in +inflection==0.5.1 + # via -r requirements/app.in +iso8601==0.1.14 + # via -r requirements/app.in +isodate==0.6.0 + # via + # -r requirements/app.in + # timely-beliefs +itsdangerous==1.1.0 + # via + # flask + # flask-security-too + # flask-wtf +jinja2==2.11.3 + # via + # altair + # bokeh + # flask +joblib==1.0.1 + # via scikit-learn +jsonschema==3.2.0 + # via altair +kiwisolver==1.3.1 + # via matplotlib +mako==1.1.4 + # via alembic +markupsafe==1.1.1 + # via + # jinja2 + # mako + # wtforms +marshmallow-sqlalchemy==0.24.2 + # via -r requirements/app.in +marshmallow==3.11.1 + # via + # flask-marshmallow + # marshmallow-sqlalchemy + # webargs +matplotlib==3.4.1 + # via timetomodel +netcdf4==1.5.6 + # via -r requirements/app.in +nose==1.3.7 + # via pyutilib +numexpr==2.7.3 + # via tables +numpy==1.20.2 + # via + # -r requirements/app.in + # altair + # bokeh + # cftime + # matplotlib + # netcdf4 + # numexpr + # pandas + # patsy + # properscoring + # pvlib + # scikit-learn + # scipy + # siphon + # statsmodels + # tables + # timely-beliefs + # timetomodel +openturns==1.16 + # via timely-beliefs +packaging==20.9 + # via bokeh +pandas-bokeh==0.4.3 + # via -r requirements/app.in +pandas==1.2.3 + # via + # -r requirements/app.in + # altair + # pandas-bokeh + # pvlib + # siphon + # statsmodels + # timely-beliefs + # timetomodel +passlib==1.7.4 + # via flask-security-too +patsy==0.5.1 + # via statsmodels +pillow==8.2.0 + # via + # bokeh + # matplotlib +ply==3.11 + # via pyomo +properscoring==0.1 + # via timely-beliefs +protobuf==3.15.6 + # via siphon +pscript==0.7.5 + # via -r requirements/app.in +psycopg2-binary==2.8.6 + # via + # -r requirements/app.in + # timely-beliefs +pvlib==0.8.1 + # via -r requirements/app.in +pycparser==2.20 + # via cffi +pyomo==5.7.3 + # via -r requirements/app.in +pyparsing==2.4.7 + # via + # matplotlib + # packaging +pyrsistent==0.17.3 + # via jsonschema +python-dateutil==2.8.1 + # via + # alembic + # arrow + # bokeh + # matplotlib + # pandas + # timetomodel +python-dotenv==0.16.0 + # via -r requirements/app.in +python-editor==1.0.4 + # via alembic +pytz==2021.1 + # via + # -r requirements/app.in + # pandas + # pvlib + # timely-beliefs + # timetomodel + # tzlocal +pyutilib==6.0.0 + # via pyomo +pyyaml==5.4.1 + # via bokeh +redis==3.5.3 + # via + # rq + # rq-dashboard +requests-file==1.5.1 + # via tldextract +requests==2.25.1 + # via + # forecastiopy + # pvlib + # requests-file + # siphon + # tldextract +rq-dashboard==0.6.1 + # via -r requirements/app.in +rq==1.8.0 + # via + # -r requirements/app.in + # rq-dashboard +scikit-learn==0.24.1 + # via sklearn +scipy==1.6.2 + # via + # properscoring + # pvlib + # scikit-learn + # statsmodels + # timely-beliefs + # timetomodel +selenium==3.141.0 + # via timely-beliefs +siphon==0.9 + # via -r requirements/app.in +six==1.15.0 + # via + # altair + # bcrypt + # bokeh + # cycler + # flask-cors + # flask-marshmallow + # isodate + # jsonschema + # patsy + # protobuf + # pyomo + # python-dateutil + # pyutilib + # requests-file +sklearn==0.0 + # via timetomodel +soupsieve==2.2.1 + # via beautifulsoup4 +sqlalchemy==1.4.5 + # via + # -r requirements/app.in + # alembic + # flask-sqlalchemy + # marshmallow-sqlalchemy + # timely-beliefs + # timetomodel +statsmodels==0.12.2 + # via timetomodel +tables==3.6.1 + # via -r requirements/app.in +threadpoolctl==2.1.0 + # via scikit-learn +timely-beliefs==1.3.0 + # via -r requirements/app.in +timetomodel==0.6.9 + # via -r requirements/app.in +tldextract==3.1.0 + # via -r requirements/app.in +toolz==0.11.1 + # via altair +tornado==6.1 + # via bokeh +tzlocal==2.1 + # via -r requirements/app.in +urllib3==1.26.4 + # via + # requests + # selenium +webargs==7.0.1 + # via -r requirements/app.in +werkzeug==1.0.1 + # via flask +wtforms==2.3.3 + # via flask-wtf +xlrd==2.0.1 + # via -r requirements/app.in +zipp==3.4.1 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/dev.in b/requirements/dev.in index 17dc56110..840713a1a 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -6,4 +6,6 @@ black flake8 flake8-blind-except mypy +pytest-runner +setuptools_scm watchdog \ No newline at end of file diff --git a/requirements/dev.txt b/requirements/dev.txt index 9cbaeda3d..64051526a 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,31 +4,81 @@ # # pip-compile --output-file=requirements/dev.txt requirements/dev.in # -appdirs==1.4.4 # via -c requirements/app.txt, black, virtualenv -black==20.8b1 # via -r requirements/dev.in -cfgv==3.2.0 # via pre-commit -click==7.1.2 # via -c requirements/app.txt, -c requirements/test.txt, black -distlib==0.3.1 # via virtualenv -filelock==3.0.12 # via -c requirements/app.txt, virtualenv -flake8-blind-except==0.1.1 # via -r requirements/dev.in -flake8==3.8.3 # via -r requirements/dev.in -identify==1.5.0 # via pre-commit -mccabe==0.6.1 # via flake8 -mypy-extensions==0.4.3 # via black, mypy -mypy==0.782 # via -r requirements/dev.in -nodeenv==1.5.0 # via pre-commit -pathspec==0.8.0 # via black -pre-commit==2.7.1 # via -r requirements/dev.in -pycodestyle==2.6.0 # via flake8 -pyflakes==2.2.0 # via flake8 -pyyaml==5.3.1 # via -c requirements/app.txt, pre-commit -regex==2020.7.14 # via black -six==1.15.0 # via -c requirements/app.txt, -c requirements/test.txt, virtualenv -toml==0.10.1 # via -c requirements/test.txt, black, pre-commit -typed-ast==1.4.1 # via black, mypy -typing-extensions==3.7.4.3 # via black, mypy -virtualenv==20.0.31 # via pre-commit -watchdog==2.0.2 # via -r requirements/dev.in +appdirs==1.4.4 + # via + # black + # virtualenv +black==20.8b1 + # via -r requirements/dev.in +cfgv==3.2.0 + # via pre-commit +click==7.1.2 + # via + # -c requirements/app.txt + # -c requirements/test.txt + # black +distlib==0.3.1 + # via virtualenv +filelock==3.0.12 + # via + # -c requirements/app.txt + # virtualenv +flake8-blind-except==0.2.0 + # via -r requirements/dev.in +flake8==3.9.0 + # via -r requirements/dev.in +identify==2.2.2 + # via pre-commit +mccabe==0.6.1 + # via flake8 +mypy-extensions==0.4.3 + # via + # black + # mypy +mypy==0.812 + # via -r requirements/dev.in +nodeenv==1.5.0 + # via pre-commit +pathspec==0.8.1 + # via black +pre-commit==2.11.1 + # via -r requirements/dev.in +pycodestyle==2.7.0 + # via flake8 +pyflakes==2.3.1 + # via flake8 +pytest-runner==5.3.0 + # via -r requirements/dev.in +pyyaml==5.4.1 + # via + # -c requirements/app.txt + # pre-commit +regex==2021.3.17 + # via black +setuptools-scm==6.0.1 + # via -r requirements/dev.in +six==1.15.0 + # via + # -c requirements/app.txt + # -c requirements/test.txt + # virtualenv +toml==0.10.2 + # via + # -c requirements/test.txt + # black + # pre-commit +typed-ast==1.4.2 + # via + # black + # mypy +typing-extensions==3.7.4.3 + # via + # black + # mypy +virtualenv==20.4.3 + # via pre-commit +watchdog==2.0.2 + # via -r requirements/dev.in # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/test.txt b/requirements/test.txt index 6f2ff87b8..338c60126 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,34 +4,103 @@ # # pip-compile --output-file=requirements/test.txt requirements/test.in # -attrs==20.2.0 # via -c requirements/app.txt, pytest -certifi==2020.6.20 # via -c requirements/app.txt, requests -chardet==3.0.4 # via -c requirements/app.txt, requests -click==7.1.2 # via -c requirements/app.txt, flask -coverage==5.2.1 # via pytest-cov -fakeredis==1.4.3 # via -r requirements/test.in -flask==1.1.2 # via -c requirements/app.txt, pytest-flask -idna==2.10 # via -c requirements/app.txt, requests -iniconfig==1.0.1 # via pytest -itsdangerous==1.1.0 # via -c requirements/app.txt, flask -jinja2==2.11.2 # via -c requirements/app.txt, flask -lupa==1.9 # via -r requirements/test.in -markupsafe==1.1.1 # via -c requirements/app.txt, jinja2 -more-itertools==8.5.0 # via pytest -packaging==20.4 # via -c requirements/app.txt, pytest, pytest-sugar -pluggy==0.13.1 # via pytest -py==1.9.0 # via pytest -pyparsing==2.4.7 # via -c requirements/app.txt, packaging -pytest-cov==2.10.1 # via -r requirements/test.in -pytest-flask==1.0.0 # via -r requirements/test.in -pytest-sugar==0.9.4 # via -r requirements/test.in -pytest==6.0.1 # via -r requirements/test.in, pytest-cov, pytest-flask, pytest-sugar -redis==3.5.3 # via -c requirements/app.txt, fakeredis -requests-mock==1.8.0 # via -r requirements/test.in -requests==2.24.0 # via -c requirements/app.txt, -r requirements/test.in, requests-mock -six==1.15.0 # via -c requirements/app.txt, fakeredis, packaging, requests-mock -sortedcontainers==2.2.2 # via fakeredis -termcolor==1.1.0 # via pytest-sugar -toml==0.10.1 # via pytest -urllib3==1.25.10 # via -c requirements/app.txt, requests -werkzeug==1.0.1 # via -c requirements/app.txt, flask, pytest-flask +attrs==20.3.0 + # via + # -c requirements/app.txt + # pytest +certifi==2020.12.5 + # via + # -c requirements/app.txt + # requests +chardet==4.0.0 + # via + # -c requirements/app.txt + # requests +click==7.1.2 + # via + # -c requirements/app.txt + # flask +coverage==5.5 + # via pytest-cov +fakeredis==1.5.0 + # via -r requirements/test.in +flask==1.1.2 + # via + # -c requirements/app.txt + # pytest-flask +idna==2.10 + # via + # -c requirements/app.txt + # requests +iniconfig==1.1.1 + # via pytest +itsdangerous==1.1.0 + # via + # -c requirements/app.txt + # flask +jinja2==2.11.3 + # via + # -c requirements/app.txt + # flask +lupa==1.9 + # via -r requirements/test.in +markupsafe==1.1.1 + # via + # -c requirements/app.txt + # jinja2 +packaging==20.9 + # via + # -c requirements/app.txt + # pytest + # pytest-sugar +pluggy==0.13.1 + # via pytest +py==1.10.0 + # via pytest +pyparsing==2.4.7 + # via + # -c requirements/app.txt + # packaging +pytest-cov==2.11.1 + # via -r requirements/test.in +pytest-flask==1.2.0 + # via -r requirements/test.in +pytest-sugar==0.9.4 + # via -r requirements/test.in +pytest==6.2.2 + # via + # -r requirements/test.in + # pytest-cov + # pytest-flask + # pytest-sugar +redis==3.5.3 + # via + # -c requirements/app.txt + # fakeredis +requests-mock==1.8.0 + # via -r requirements/test.in +requests==2.25.1 + # via + # -c requirements/app.txt + # -r requirements/test.in + # requests-mock +six==1.15.0 + # via + # -c requirements/app.txt + # fakeredis + # requests-mock +sortedcontainers==2.3.0 + # via fakeredis +termcolor==1.1.0 + # via pytest-sugar +toml==0.10.2 + # via pytest +urllib3==1.26.4 + # via + # -c requirements/app.txt + # requests +werkzeug==1.0.1 + # via + # -c requirements/app.txt + # flask + # pytest-flask