diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ffc85b5..72d367a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,49 +3,57 @@ name: Test on: [push] jobs: - linting: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install tox - - name: Lint - run: tox -e flake8 tests: - needs: linting runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.7', '3.8', '3.9', '3.10'] - env: - PYTHON: ${{ matrix.python-version }} + image: + - 'python:2.7-buster' + - 'python:3.6-bullseye' + - 'python:3.7-bookworm' + - 'python:3.8-bookworm' + - 'python:3.9-bookworm' + - 'python:3.10-bookworm' + - 'python:3.11-bookworm' + - 'python:3.12-bookworm' + container: + image: ${{ matrix.image }} steps: - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - id: setup-python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies + - name: Set environment variables run: | - python -m pip install --upgrade pip - pip install --use-pep517 tox "coverage<5" - - name: Run tests + echo "PYTHON=$(echo '${{ matrix.image }}' | sed -r 's/^python:([0-9]+)\.([0-9]+).*$/\1.\2/g')" >> $GITHUB_ENV + echo "TOXFACTOR=$(echo '${{ matrix.image }}' | sed -r 's/^python:([0-9]+)\.([0-9]+).*$/py\1\2/g')" >> $GITHUB_ENV + - name: Install psycopg2 requirements run: | - export TOXENV=$(echo "py${{ matrix.python-version }}" | sed 's/\.//g') - tox -- -p no:warnings + apt update + apt-get -y install python-dev + if: matrix.image == 'python:2.7-buster' + - name: Install psycopg2 requirements + run: | + apt update + apt-get -y install python3-dev + if: matrix.image != 'python:2.7-buster' + - name: Install importlib-metadata for older Python versions + run: pip install "importlib-metadata<3" + if: >- + matrix.image == 'python:2.7-buster' || + matrix.image == 'python:3.6-bullseye' || + matrix.image == 'python:3.7-bookworm' + - name: Install test utilities + run: pip install "tox<4" tox-factor "coverage<5" + - name: Lint with flake8 + run: tox -e flake8 + if: matrix.image == 'python:3.12-bookworm' + - name: Test via tox + run: tox -- -p no:warnings - name: Generate coverage report - run: coverage html + run: coverage xml if: ${{ success() }} - - name: Upload coverage data - uses: actions/upload-artifact@v3 + - name: Upload coverage report + uses: codecov/codecov-action@v4 with: - name: coverage - path: htmlcov - if-no-files-found: ignore + files: coverage.xml + flags: unittests + token: ${{ secrets.CODECOV_TOKEN }} if: ${{ success() }} diff --git a/.gitignore b/.gitignore index 5783e32..7332cba 100644 --- a/.gitignore +++ b/.gitignore @@ -55,10 +55,11 @@ coverage.xml # Sphinx documentation docs/_build/ +docs/_api # PyBuilder target/ # IDEs .idea/ -.vscode/ \ No newline at end of file +.vscode/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..547b043 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,116 @@ +# Changelog + +## Development + +* [#53 Python 2.7 tests are failing](https://github.com/rheinwerk-verlag/pganonymize/issues/53) + * Dropped Python 3.6, 3.7 support + * Split development requirements for Python 2 and 3 + * Use markdown for the changelog and contributing docs +* [#56 Add Trusted Publisher Management workflow](https://github.com/rheinwerk-verlag/pganonymize/issues/56) + +## 0.11.0 (2024-02-29) + +* [#52 Add update_json provider](https://github.com/rheinwerk-verlag/pganonymize/pull/52) ([bobslee](https://github.com/bobslee)) + +## 0.10.0 (2022-11-29) + +* [#49 Configure psycopg2 to support UUID objects](https://github.com/rheinwerk-verlag/pganonymize/pull/49) +* [#48 Add support for localized "Faker" data](https://github.com/rheinwerk-verlag/pganonymize/pull/48) + +## 0.9.0 (2022-11-23) + +* [#46 Broken Python 2.7 compatibility](https://github.com/rheinwerk-verlag/pganonymize/pull/46) +* [#45 Add partial masked provider](https://github.com/rheinwerk-verlag/pganonymize/pull/45) ([Tilley](https://github.com/Tilley/)) +* [#44 Pass kwargs through to faker functions from schema](https://github.com/rheinwerk-verlag/pganonymize/pull/44)([Tilley](https://github.com/Tilley>)) + +## 0.8.0 (2022-03-15) + +* [#39 Renamed project to "pganonymize"](https://github.com/rheinwerk-verlag/pganonymize/issues/39) +* [#38 Allow environment variables in schema definition](https://github.com/rheinwerk-verlag/pganonymize/pull/38) ([nurikk](https://github.com/nurikk)) + +## 0.7.0 (2021-11-30) + +* [#34 Subprocess "run" being used on Python2.7](https://github.com/rheinwerk-verlag/pganonymize/issues/34) +* [#35 parmap no longer supports Python 2.7](https://github.com/rheinwerk-verlag/pganonymize/issues/35) + * Dropped Python 3.5 support + * Pinned libraries Python 2.7 +* [#32 Fixed pg_dump arguments](https://github.com/rheinwerk-verlag/pganonymize/pull/32) ([korsar182](https://github.com/korsar182)) +* Simplified provider registration (no metaclass usage anymore) + +## 0.6.1 (2021-07-13) + +* Added missing dependencies for the `setup.py` + +## 0.6.0 (2021-07-13) + +* [#28 Add json support](https://github.com/rheinwerk-verlag/pganonymize/pull/25) ([nurikk](https://github.com/nurikk)) +* [#27 Better anonymisation](https://github.com/rheinwerk-verlag/pganonymize/pull/25) ([nurikk](https://github.com/nurikk)) +* [#25 Remove column specification for `cursor.copy_from` call](https://github.com/rheinwerk-verlag/pganonymize/pull/25) ([nurikk](https://github.com/nurikk)) + +## 0.5.0 (2021-06-30) + +* [#22 Fix table and column name quotes in `cursor.copy_from` call](https://github.com/rheinwerk-verlag/pganonymize/pull/22) ([nurikk](https://github.com/nurikk)) +* [#23 Allow uniq faker](https://github.com/rheinwerk-verlag/pganonymize/pull/23) ([nurikk](https://github.com/nurikk)) + +## 0.4.1 (2021-05-27) + +* [#19 Make chunk size in the table definition dynamic](https://github.com/rheinwerk-verlag/pganonymize/pull/19) ([halilkaya](https://github.com/halilkaya)) + +## 0.4.0 (2021-05-05) + +* [#18 Specify (SQL WHERE) search_condition, to filter the table for rows to be anonymized](https://github.com/rheinwerk-verlag/pganonymize/pull/18) (`bobslee `_) +* [#17 Fix anonymizing error if there is a JSONB column in a table](https://github.com/rheinwerk-verlag/pganonymize/pull/17) ([koptelovav](https://github.com/koptelovav)) + +## 0.3.3 (2021-04-16) + +* [#16 Preserve column and table cases during the copy process](https://github.com/rheinwerk-verlag/pganonymize/issues/16) + +## 0.3.2 (2021-01-25) + +* [#15 Fix for exclude bug](https://github.com/rheinwerk-verlag/pganonymize/pull/15) ([abhinavvaidya90](https://github.com/abhinavvaidya90)) + +## 0.3.1 (2020-12-04) + +* [#13 Fixed a syntax error if no truncated tables are defined](https://github.com/rheinwerk-verlag/pganonymize/pull/13) ([ray-man](https://github.com/ray-man)) + +## 0.3.0 (2020-02-11) + +* Use [`python-poetry`](https://github.com/python-poetry/poetry) for requirements management +* Added commandline argument to list all available providers (#4) +* Added commandline argument to create a dump file (#5) +* Execute table truncation in one statement to avoid foreign key constraint errors (thanks to [W1ldPo1nter](https://github.com/W1ldPo1nter)) + +## 0.2.4 (2020-01-03) + +* Fixed several issues with the usage of ``dict.keys`` and Python 3 + +## 0.2.3 (2020-01-02) + +* Fixed the wrong cStringIO import for Python 3 +* Removed Travis-CI file in favor of the Github actions + +## 0.2.2 (2020-01-02) + +* Hide the progressbar completely if verbose is set to ``False`` +* Restructured the requirement files and added flake8 to Travis CI + +## 0.2.1 (2019-12-20) + +* Added field based, regular expression excludes (to skip data under certain conditions). + Currently only regular expressions are supported and the exclusion affects the whole row, + not just one single column. + +## 0.2.0 (2019-12-20) + +* Added provider classes +* Added new providers: + * choice - returns a random list element + * mask - replaces the original value with a static sign + +## 0.1.1 (2019-12-18) + +Changed setup.py + +## 0.1.0 (2019-12-16) + +Initial release of the prototype diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index 65d9479..0000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,135 +0,0 @@ -Changelog -========= - -Development ------------ - -* `#56 `_: Add Trusted Publisher Management workflow - -0.11.0 (2024-02-29) -------------------- - -* `#52 `_: Add update_json provider (`bobslee `_) - -0.10.0 (2022-11-29) -------------------- - -* `#49 `_: Configure psycopg2 to support UUID objects -* `#48 `_: Add support for localized "Faker" data - -0.9.0 (2022-11-23) ------------------- - -* `#46 `_: Broken Python 2.7 compatibility -* `#45 `_: Add partial masked provider (`Tilley `_) -* `#44 `_: Pass kwargs through to faker functions from schema (`Tilley `_) - -0.8.0 (2022-03-15) ------------------- - -* `#39 `_: Renamed project to "pganonymize" -* `#38 `_: Allow environment variables in schema definition (`nurikk `_) - -0.7.0 (2021-11-30) ------------------- - -* `#34 `_: Subprocess "run" being used on Python2.7 -* `#35 `_: parmap no longer supports Python 2.7 - * Dropped Python 3.5 support - * Pinned libraries Python 2.7 -* `#32 `_: Fixed pg_dump arguments (`korsar182 `_) -* Simplified provider registration (no metaclass usage anymore) - -0.6.1 (2021-07-13) ------------------- - -* Added missing dependencies for the `setup.py` - -0.6.0 (2021-07-13) ------------------- - -* `#28 `_: Add json support (`nurikk `_) -* `#27 `_: Better anonymisation (`nurikk `_) -* `#25 `_: Remove column specification for `cursor.copy_from` call (`nurikk `_) - -0.5.0 (2021-06-30) ------------------- - -* `#22 `_: Fix table and column name quotes in `cursor.copy_from` call (`nurikk `_) -* `#23 `_: Allow uniq faker (`nurikk `_) - -0.4.1 (2021-05-27) ------------------- - -* `#19 `_: Make chunk size in the table definition dynamic (`halilkaya `_) - -0.4.0 (2021-05-05) ------------------- - -* `#18 `_: Specify (SQL WHERE) search_condition, to filter the table for rows to be anonymized (`bobslee `_) -* `#17 `_: Fix anonymizing error if there is a JSONB column in a table (`koptelovav `_) - -0.3.3 (2021-04-16) ------------------- - -* `#16 `_: Preserve column and table cases during the copy process - -0.3.2 (2021-01-25) ------------------- - -* `#15 `_: Fix for exclude bug (`abhinavvaidya90 `_) - -0.3.1 (2020-12-04) ------------------- - -* `#13 `_: Fixed a syntax error if no truncated tables are defined (`ray-man `_) - -0.3.0 (2020-02-11) ------------------- - -* Use `python-poetry `_ for requirements management -* Added commandline argument to list all available providers (#4) -* Added commandline argument to create a dump file (#5) -* Execute table truncation in one statement to avoid foreign key constraint errors (thanks to `W1ldPo1nter `_) - -0.2.4 (2020-01-03) ------------------- - -* Fixed several issues with the usage of ``dict.keys`` and Python 3 - -0.2.3 (2020-01-02) ------------------- - -* Fixed the wrong cStringIO import for Python 3 -* Removed Travis-CI file in favor of the Github actions - -0.2.2 (2020-01-02) ------------------- - -* Hide the progressbar completely if verbose is set to ``False`` -* Restructured the requirement files and added flake8 to Travis CI - -0.2.1 (2019-12-20) ------------------- - -* Added field based, regular expression excludes (to skip data under certain conditions). - Currently only regular expressions are supported and the exclusion affects the whole row, - not just one single column. - -0.2.0 (2019-12-20) ------------------- - -* Added provider classes -* Added new providers: - * choice - returns a random list element - * mask - replaces the original value with a static sign - -0.1.1 (2019-12-18) ------------------- - -Changed setup.py - -0.1.0 (2019-12-16) ------------------- - -Initial release of the prototype diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..97b11e4 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,42 @@ +# Contributing to PostgreSQL Anonymizer + +First of all: thanks for your interest in this project and taking the time to contribute. + +The following document is a small set of guidelines for contributing to this project. They are guidelines and no rules. + +## Reporting bugs + +If you have found a bug, please check the project's +[issue](https://github.com/rheinwerk-verlag/pganonymize/issues) page first and feel free to create a +[new issue](https://github.com/rheinwerk-verlag/pganonymize/issues/new), if no one else has reported it yet. + +## Making changes + +Create a fork if you want to make changes or clone the repo if you want a readonly access to the current development +version: + +```bash +$ git clone git@github.com:rheinwerk-verlag/pganonymize.git +$ cd pganonymize +``` + +For the development use a virtualenv or install the requirements directly: + +```bash +$ sudo pip install -r requirements.txt +``` + +## Coding style + +We have created an [EditorConfig](https://editorconfig.org/) file for this project that should be usable for most IDEs. +Otherwise please make sure to adhere to the specifications from the config file. + +## Creating a pull request + +Before creating a pull request make sure to check: + +* existing docstrings have been updated +* new code has valid docstrings +* whether existing [tests](https://github.com/rheinwerk-verlag/pganonymize/tree/development/tests) have to be fixed +* new tests have to be written first +* the documentation (in particular the [Sphinx documentation](https://github.com/rheinwerk-verlag/pganonymize/tree/development/docs)) has to be modified diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index ed67cb9..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,52 +0,0 @@ -Contributing to PostgreSQL Anonymizer -===================================== - -First of all: thanks for your interest in this project and taking the time to contribute. - -The following document is a small set of guidelines for contributing to this project. They are guidelines and no rules. - -Reporting bugs ---------------- - -If you have found a bug, please check the project's `issue`_ page first and feel free to create a `new issue`_, if no -one else has reported it yet. - -Making changes --------------- - -Create a fork if you want to make changes or clone the repo if you want a readonly access to the current development -version: - -.. code-block:: bash - - $ git clone git@github.com:rheinwerk-verlag/postgresql-anonymizer.git - $ cd postgresql-anonymizer - -For the development use a virtualenv or install the requirements directly: - -.. code-block:: bash - - $ sudo pip install -r requirements.txt - -Coding style ------------- - -We have created an `EditorConfig`_ file for this project that should be usable for most IDEs. Otherwise please make -sure to adhere to the specifications from the config file. - -Creating a pull request ------------------------ - -Before creating a pull request make sure to check: - -* existing docstrings have been updated -* new code has valid docstrings -* whether existing `tests`_ have to be fixed -* new tests have to be written first -* the documentation (in particular the `Sphinx documentation`_) has to be modified - -.. _issue: https://github.com/rheinwerk-verlag/postgresql-anonymizer/issues -.. _new issue: https://github.com/rheinwerk-verlag/postgresql-anonymizer/issues/new -.. _EditorConfig: https://editorconfig.org/ -.. _tests: https://github.com/rheinwerk-verlag/postgresql-anonymizer/tree/development/tests -.. _Sphinx documentation: https://github.com/rheinwerk-verlag/postgresql-anonymizer/tree/development/docs diff --git a/Dockerfile b/Dockerfile index 40ffeba..e78fe78 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ -FROM python:3.8.1-slim +FROM python:3.12.2-slim LABEL maintainer="webteam@rheinwerk-verlag.de" RUN apt-get update -y \ - && apt-get upgrade -y \ + && apt-get upgrade -y \ && apt-get install -y libpq-dev python3-pip \ && pip install -U pip \ && pip install pganonymize psycopg2-binary \ diff --git a/Makefile b/Makefile index eebb1a3..f7fbf8d 100644 --- a/Makefile +++ b/Makefile @@ -41,24 +41,61 @@ clean-pyc: ## remove Python file artifacts clean-test: ## remove test and coverage artifacts rm -fr .tox/ + rm -f .coverage + rm -fr reports/ + +test: ## run tests quickly with the default Python + python setup.py test + +test-all: ## run tests on every Python version with tox + tox + +pylint: ## run style checks and static analysis with pylint + @-mkdir -p reports/ + @-pylint $(PYTHON_PACKAGE) -r n --msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" > reports/pylint.txt + @echo "See reports/pylint.txt" + @-pylint $(PYTHON_PACKAGE) flake8: ## run style checks and static analysis with flake8 - @flake8 + @-mkdir -p reports/ + flake8 $(PYTHON_PACKAGE) $(TESTS_PACKAGE) --format='%(path)s:%(row)d: [%(code)s(%(code)s), ] %(text)s' --output-file=reports/flake8.txt --tee + +docstrings: ## check docstring presence and style conventions with pydocstyle + pydocstyle $(PYTHON_PACKAGE) + +lint: flake8 docstrings pylint + +coverage: ## check code coverage quickly with the default Python + py.test --cov-report html:reports/htmlcov --cov-report xml:reports/coverage.xml + @echo "See reports/htmlcov/index.html" + +metrics: ## print code metrics with radon + radon raw -s $(PYTHON_PACKAGE) $(TEST_PACKAGE) + radon cc -s $(PYTHON_PACKAGE) $(TEST_PACKAGE) + radon mi -s $(PYTHON_PACKAGE) $(TEST_PACKAGE) + +docs: ## generate Sphinx HTML documentation, including API docs + @if python -c 'import sys; sys.exit(sys.version_info[0]<3)'; then \ + rm -rf docs/_api; \ + sphinx-apidoc --no-toc -o docs/_api $(PYTHON_PACKAGE) "**/tests" "**/migrations" "**/south_migrations"; \ + $(MAKE) -C docs clean; \ + $(MAKE) -C docs html; \ + echo "See docs/_build/html/index.html"; \ + else \ + echo "Please build the docs using Python 3."; \ + fi + +docs-open: + $(BROWSER) docs/_build/html/index.html + +docs-all: docs docs-open release: clean ## package and upload a release - python setup.py sdist upload - python setup.py bdist_wheel upload + python setup.py release upload dist: clean ## builds source and wheel package - python setup.py sdist - python setup.py bdist_wheel + python setup.py release ls -l dist install: clean ## install the package to the active Python's site-packages python setup.py install - -test: - @pytest - -test-all: ## run tests on every Python version with tox - @tox diff --git a/README.rst b/README.rst index d06acd2..bc7c224 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,7 @@ anonymization. The tool requires a direct PostgreSQL connection to perform the a .. class:: no-web no-pdf - |python| |license| |pypi| |downloads| |build| |health| + |python| |license| |pypi| |downloads| |build| |codecov| |health| .. image:: docs/_static/demo.gif @@ -177,10 +177,13 @@ After that you can pass a schema file to the container, using Docker volumes, an :target: https://pepy.tech/project/pganonymize :alt: Download count -.. |build| image:: https://github.com/rheinwerk-verlag/postgresql-anonymizer/workflows/Test/badge.svg +.. |build| image:: https://github.com/rheinwerk-verlag/pganonymize/actions/workflows/test.yml/badge.svg :target: https://github.com/rheinwerk-verlag/pganonymize/actions +.. |codecov| image:: https://github.com/rheinwerk-verlag/pganonymize/actions/workflows/test.yml/badge.svg + :target: https://codecov.io/gh/rheinwerk-verlag/pganonymize + .. |health| image:: https://snyk.io/advisor/python/pganonymize/badge.svg - :target: https://snyk.io/advisor/python/pganonymize - :alt: pganonymize + :target: https://snyk.io/advisor/python/pganonymize + :alt: pganonymize diff --git a/docs/api.rst b/docs/api.rst index 4ac86b4..22f0faa 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -4,4 +4,4 @@ API .. toctree:: :maxdepth: 4 - pganonymize + _api/pganonymize diff --git a/docs/changelog.md b/docs/changelog.md new file mode 120000 index 0000000..04c99a5 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1 @@ +../CHANGELOG.md \ No newline at end of file diff --git a/docs/changelog.rst b/docs/changelog.rst deleted file mode 100644 index 565b052..0000000 --- a/docs/changelog.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CHANGELOG.rst diff --git a/docs/conf.py b/docs/conf.py index ef62ba3..4e1da00 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,7 +40,7 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.viewcode'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.viewcode', 'myst_parser'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -48,7 +48,7 @@ #source_parsers = {} # The suffix of source filenames. -source_suffix = ['.rst'] +source_suffix = ['.rst', '.md'] # The encoding of source files. #source_encoding = 'utf-8-sig' diff --git a/requirements-tox.txt b/requirements-tox.txt index 4aca0a6..d5c4673 100644 --- a/requirements-tox.txt +++ b/requirements-tox.txt @@ -1,5 +1,6 @@ coverage==4.5.4 mock==3.0.5 pytest-cov==2.8.1 -pytest-pythonpath==0.7.3 -six==1.12.0 +pytest-pythonpath==0.7.4 +six==1.16.0 +tqdm diff --git a/setup.py b/setup.py index b83774e..50c63c5 100755 --- a/setup.py +++ b/setup.py @@ -91,6 +91,8 @@ def run(self): 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Topic :: Database' ], packages=find_packages(include=['pganonymize*']), diff --git a/tox.ini b/tox.ini index 167f743..9546c24 100644 --- a/tox.ini +++ b/tox.ini @@ -1,32 +1,40 @@ [tox] -envlist = flake8,py27,py36,py37,py38,py39,py310 +requires = virtualenv<20.22.0 +envlist = flake8,py27,py36,py37,py38,py39,py310,py311,py312 [testenv:flake8] deps = flake8 commands = flake8 {toxinidir}/pganonymize {toxinidir}/tests [testenv] +skip_install = True setenv = PYTHONPATH = {toxinidir} deps = # faker py27: faker<4 - py{36,37,38,39,310}: faker>=9.9.0 + py{36,37,38,39,310,311,312}: faker>=9.9.0 # parmap py27: parmap==1.5.2 - py{36,37,38,39,310}: parmap>=1.5.2 - # psycopg2-binary - py27: psycopg2-binary==2.8.4 - py{36,37,38,39,310}: psycopg2-binary>=2.9.2 + py{36,37,38,39,310,311,312}: parmap>=1.5.2 # pyyaml py27: pyyaml<6 - py{36,37,38,39,310}: pyyaml>=6 + py{36,37,38,39,310,311,312}: pyyaml>=6 # pytest py27: pytest==4.0.2 py27: attrs<19.2 py27: more-itertools<8.11 - py{36,37,38,39,310}: pytest==6.2.5 + py{36,37}: pytest==6.2.5 + py{38,39,310,311,312}: pytest + # pgcopy + py{27,36,37,38,39,310,311,312}: pgcopy + # psycopg2 + py27: psycopg2 + py{36,37,38,39,310,311,312}: psycopg2>=2.9.2 # Common requirements -r{toxinidir}/requirements-tox.txt commands = py.test --basetemp={envtmpdir} {posargs} +passenv = + TOXENV + GITHUB_*