diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1c7178..4e760a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,8 +15,11 @@ jobs: strategy: matrix: os: [ubuntu-20.04] - python-version: ['3.8'] - toxenv: [quality, django32, django42] + python-version: + - '3.8' + - '3.11' + - '3.12' + toxenv: [quality, django42] steps: - uses: actions/checkout@v4 - name: setup python diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d9e7605..5a89376 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -17,6 +17,10 @@ Unreleased ---------- * Nothing +[5.7.0] +-------- +feat: Adding python 3.11 and 3.12 support. Dropped django32 support. + [5.6.0] -------- chore: Update Requirements diff --git a/Makefile b/Makefile index da65ed7..3e98ce8 100644 --- a/Makefile +++ b/Makefile @@ -17,23 +17,38 @@ requirements: ## install development environment requirements test: tox -# Define PIP_COMPILE_OPTS=-v to get more information during make upgrade. -PIP_COMPILE = pip-compile --upgrade $(PIP_COMPILE_OPTS) +piptools: + pip install -q -r requirements/pip-tools.txt -upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade -upgrade: ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in - pip install -qr requirements/pip-tools.txt +define COMMON_CONSTRAINTS_TEMP_COMMENT +# This is a temporary solution to override the real common_constraints.txt\n# In edx-lint, until the pyjwt constraint in edx-lint has been removed.\n# See BOM-2721 for more details.\n# Below is the copied and edited version of common_constraints\n +endef + +COMMON_CONSTRAINTS_TXT=requirements/common_constraints.txt +.PHONY: $(COMMON_CONSTRAINTS_TXT) +$(COMMON_CONSTRAINTS_TXT): + wget -O "$(@)" https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt || touch "$(@)" + echo "$(COMMON_CONSTRAINTS_TEMP_COMMENT)" | cat - $(@) > temp && mv temp $(@) + +export CUSTOM_COMPILE_COMMAND = make upgrade +upgrade: piptools $(COMMON_CONSTRAINTS_TXT) ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in # Make sure to compile files after any other files they include! - $(PIP_COMPILE) --allow-unsafe --rebuild -o requirements/pip.txt requirements/pip.in - $(PIP_COMPILE) -o requirements/pip-tools.txt requirements/pip-tools.in + sed '/^importlib-metadata requirements/common_constraints.tmp + mv requirements/common_constraints.tmp requirements/common_constraints.txt + pip-compile --upgrade --allow-unsafe --rebuild -o requirements/pip.txt requirements/pip.in + pip-compile --upgrade --allow-unsafe --verbose --rebuild -o requirements/pip-tools.txt requirements/pip-tools.in pip install -qr requirements/pip.txt pip install -qr requirements/pip-tools.txt - $(PIP_COMPILE) -o requirements/base.txt requirements/base.in - $(PIP_COMPILE) -o requirements/test.txt requirements/test.in - $(PIP_COMPILE) -o requirements/ci.txt requirements/ci.in - $(PIP_COMPILE) -o requirements/dev.txt requirements/dev.in - # Let tox control the Django version for tests - sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp - mv requirements/test.tmp requirements/test.txt + sed 's/Django<4.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp + mv requirements/common_constraints.tmp requirements/common_constraints.txt + pip-compile --upgrade --allow-unsafe --verbose --rebuild -o requirements/base.txt requirements/base.in + pip-compile --upgrade --allow-unsafe --verbose --rebuild -o requirements/dev.txt requirements/dev.in + pip-compile --upgrade --allow-unsafe --verbose --rebuild -o requirements/test.txt requirements/test.in + pip-compile --upgrade --allow-unsafe --verbose --rebuild -o requirements/pip-tools.txt requirements/pip-tools.in + pip-compile --upgrade --allow-unsafe --verbose --rebuild -o requirements/ci.txt requirements/ci.in + # Let tox control the Django and DRF versions for tests + sed -i.tmp '/^django==/d' requirements/test.txt + sed -i.tmp '/^djangorestframework==/d' requirements/test.txt + rm requirements/test.txt.tmp validate: test quality diff --git a/edx_rest_api_client/__version__.py b/edx_rest_api_client/__version__.py index 2c06c79..dd9e76c 100644 --- a/edx_rest_api_client/__version__.py +++ b/edx_rest_api_client/__version__.py @@ -1 +1 @@ -__version__ = '5.6.1' +__version__ = '5.7.0' diff --git a/requirements/base.txt b/requirements/base.txt index 1d4fd53..3a69d40 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -4,8 +4,12 @@ # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via django +backports-zoneinfo==0.2.1 ; python_version < "3.9" + # via + # -c requirements/constraints.txt + # django certifi==2024.2.2 # via requests cffi==1.16.0 @@ -14,9 +18,9 @@ charset-normalizer==3.3.2 # via requests click==8.1.7 # via edx-django-utils -django==3.2.24 +django==4.2.11 # via - # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt + # -c requirements/common_constraints.txt # django-crum # django-waffle # edx-django-utils @@ -24,30 +28,31 @@ django-crum==0.7.9 # via edx-django-utils django-waffle==4.1.0 # via edx-django-utils -edx-django-utils==5.10.1 +edx-django-utils==5.12.0 # via -r requirements/base.in idna==3.6 # via requests -newrelic==9.7.0 +newrelic==9.8.0 # via edx-django-utils pbr==6.0.0 # via stevedore psutil==5.9.8 # via edx-django-utils -pycparser==2.21 +pycparser==2.22 # via cffi pyjwt==2.8.0 # via -r requirements/base.in pynacl==1.5.0 # via edx-django-utils -pytz==2024.1 - # via django requests==2.31.0 # via + # -c requirements/constraints.txt # -r requirements/base.in # slumber slumber==0.7.1 - # via -r requirements/base.in + # via + # -c requirements/constraints.txt + # -r requirements/base.in sqlparse==0.4.4 # via django stevedore==5.2.0 diff --git a/requirements/ci.txt b/requirements/ci.txt index 88a39ff..60c1628 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -12,12 +12,13 @@ colorama==0.4.6 # via tox distlib==0.3.8 # via virtualenv -filelock==3.13.1 +filelock==3.13.3 # via # tox # virtualenv packaging==23.2 # via + # -c requirements/constraints.txt # pyproject-api # tox platformdirs==4.2.0 @@ -32,7 +33,7 @@ tomli==2.0.1 # via # pyproject-api # tox -tox==4.13.0 +tox==4.14.2 # via -r requirements/ci.in virtualenv==20.25.1 # via tox diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt new file mode 100644 index 0000000..22beac8 --- /dev/null +++ b/requirements/common_constraints.txt @@ -0,0 +1,36 @@ +# This is a temporary solution to override the real common_constraints.txt +# In edx-lint, until the pyjwt constraint in edx-lint has been removed. +# See BOM-2721 for more details. +# Below is the copied and edited version of common_constraints + +# A central location for most common version constraints +# (across edx repos) for pip-installation. +# +# Similar to other constraint files this file doesn't install any packages. +# It specifies version constraints that will be applied if a package is needed. +# When pinning something here, please provide an explanation of why it is a good +# idea to pin this package across all edx repos, Ideally, link to other information +# that will help people in the future to remove the pin when possible. +# Writing an issue against the offending project and linking to it here is good. +# +# Note: Changes to this file will automatically be used by other repos, referencing +# this file from Github directly. It does not require packaging in edx-lint. + + +# using LTS django version +Django<5.0 + +# elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. +# elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html +elasticsearch<7.14.0 + +# django-simple-history>3.0.0 adds indexing and causes a lot of migrations to be affected +django-simple-history==3.0.0 + +# opentelemetry requires version 6.x at the moment: +# https://github.com/open-telemetry/opentelemetry-python/issues/3570 +# Normally this could be added as a constraint in edx-django-utils, where we're +# adding the opentelemetry dependency. However, when we compile pip-tools.txt, +# that uses version 7.x, and then there's no undoing that when compiling base.txt. +# So we need to pin it globally, for now. +# Ticket for unpinning: https://github.com/openedx/edx-lint/issues/407 diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 7fe9cbd..d584296 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -9,5 +9,13 @@ # linking to it here is good. # Common constraints for edx repos --c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt - \ No newline at end of file +-c common_constraints.txt + +backports.zoneinfo;python_version<"3.9" + +# Temporary pins to avoid conflicts +packaging==23.2 +requests==2.31.0 +slumber==0.7.1 +twine==5.0.0 +zipp==3.17.0 diff --git a/requirements/dev.txt b/requirements/dev.txt index e369f56..a5f4e1c 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,7 +4,7 @@ # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/test.txt # django @@ -13,7 +13,12 @@ astroid==3.1.0 # -r requirements/test.txt # pylint # pylint-celery -build==1.0.3 +backports-zoneinfo==0.2.1 ; python_version < "3.9" + # via + # -c requirements/constraints.txt + # -r requirements/test.txt + # django +build==1.2.1 # via # -r requirements/pip-tools.txt # pip-tools @@ -28,7 +33,6 @@ certifi==2024.2.2 cffi==1.16.0 # via # -r requirements/test.txt - # cryptography # pynacl chardet==5.2.0 # via @@ -51,7 +55,7 @@ click-log==0.4.0 # via # -r requirements/test.txt # edx-lint -code-annotations==1.6.0 +code-annotations==1.7.0 # via # -r requirements/test.txt # edx-lint @@ -59,14 +63,10 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.4.3 +coverage[toml]==7.4.4 # via # -r requirements/test.txt # pytest-cov -cryptography==42.0.5 - # via - # -r requirements/test.txt - # secretstorage ddt==1.7.2 # via -r requirements/test.txt dill==0.3.8 @@ -77,10 +77,9 @@ distlib==0.3.8 # via # -r requirements/ci.txt # virtualenv -django==3.2.24 +django==4.2.11 # via - # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt - # -r requirements/test.txt + # -c requirements/common_constraints.txt # django-crum # django-waffle # edx-django-utils @@ -96,7 +95,7 @@ docutils==0.20.1 # via # -r requirements/test.txt # readme-renderer -edx-django-utils==5.10.1 +edx-django-utils==5.12.0 # via -r requirements/test.txt edx-lint==5.3.6 # via -r requirements/test.txt @@ -104,7 +103,7 @@ exceptiongroup==1.2.0 # via # -r requirements/test.txt # pytest -filelock==3.13.1 +filelock==3.13.3 # via # -r requirements/ci.txt # tox @@ -115,14 +114,14 @@ idna==3.6 # via # -r requirements/test.txt # requests -importlib-metadata==7.0.1 +importlib-metadata==7.1.0 # via # -r requirements/pip-tools.txt # -r requirements/test.txt # build # keyring # twine -importlib-resources==6.1.2 +importlib-resources==6.4.0 # via # -r requirements/test.txt # keyring @@ -134,20 +133,23 @@ isort==5.13.2 # via # -r requirements/test.txt # pylint -jaraco-classes==3.3.1 +jaraco-classes==3.4.0 + # via + # -r requirements/test.txt + # keyring +jaraco-context==4.3.0 # via # -r requirements/test.txt # keyring -jeepney==0.8.0 +jaraco-functools==4.0.0 # via # -r requirements/test.txt # keyring - # secretstorage jinja2==3.1.3 # via # -r requirements/test.txt # code-annotations -keyring==24.3.0 +keyring==25.0.0 # via # -r requirements/test.txt # twine @@ -171,16 +173,18 @@ more-itertools==10.2.0 # via # -r requirements/test.txt # jaraco-classes -newrelic==9.7.0 + # jaraco-functools +newrelic==9.8.0 # via # -r requirements/test.txt # edx-django-utils -nh3==0.2.15 +nh3==0.2.17 # via # -r requirements/test.txt # readme-renderer packaging==23.2 # via + # -c requirements/constraints.txt # -r requirements/ci.txt # -r requirements/pip-tools.txt # -r requirements/test.txt @@ -192,9 +196,9 @@ pbr==6.0.0 # via # -r requirements/test.txt # stevedore -pip-tools==7.4.0 +pip-tools==7.4.1 # via -r requirements/pip-tools.txt -pkginfo==1.9.6 +pkginfo==1.10.0 # via # -r requirements/test.txt # twine @@ -217,7 +221,7 @@ psutil==5.9.8 # edx-django-utils pycodestyle==2.11.1 # via -r requirements/test.txt -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi @@ -261,16 +265,16 @@ pyproject-hooks==1.0.0 # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.0.2 +pytest==8.1.1 # via # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.txt pytest-django==4.8.0 # via -r requirements/test.txt -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # -r requirements/test.txt # freezegun @@ -278,10 +282,6 @@ python-slugify==8.0.4 # via # -r requirements/test.txt # code-annotations -pytz==2024.1 - # via - # -r requirements/test.txt - # django pyyaml==6.0.1 # via # -r requirements/test.txt @@ -293,6 +293,7 @@ readme-renderer==43.0 # twine requests==2.31.0 # via + # -c requirements/constraints.txt # -r requirements/test.txt # requests-toolbelt # responses @@ -308,21 +309,19 @@ rfc3986==2.0.0 # via # -r requirements/test.txt # twine -rich==13.7.0 +rich==13.7.1 # via # -r requirements/test.txt # twine -secretstorage==3.3.3 - # via - # -r requirements/test.txt - # keyring six==1.16.0 # via # -r requirements/test.txt # edx-lint # python-dateutil slumber==0.7.1 - # via -r requirements/test.txt + # via + # -c requirements/constraints.txt + # -r requirements/test.txt sqlparse==0.4.4 # via # -r requirements/test.txt @@ -353,10 +352,12 @@ tomlkit==0.12.4 # via # -r requirements/test.txt # pylint -tox==4.13.0 +tox==4.14.2 # via -r requirements/ci.txt twine==5.0.0 - # via -r requirements/test.txt + # via + # -c requirements/constraints.txt + # -r requirements/test.txt typing-extensions==4.10.0 # via # -r requirements/test.txt @@ -374,17 +375,24 @@ virtualenv==20.25.1 # via # -r requirements/ci.txt # tox -wheel==0.42.0 +wheel==0.43.0 # via # -r requirements/pip-tools.txt # pip-tools zipp==3.17.0 # via + # -c requirements/constraints.txt # -r requirements/pip-tools.txt # -r requirements/test.txt # importlib-metadata # importlib-resources # The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools +pip==24.0 + # via + # -r requirements/pip-tools.txt + # pip-tools +setuptools==69.2.0 + # via + # -r requirements/pip-tools.txt + # pip-tools diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 44c48d9..5d7aa34 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -4,15 +4,17 @@ # # make upgrade # -build==1.0.3 +build==1.2.1 # via pip-tools click==8.1.7 # via pip-tools -importlib-metadata==7.0.1 +importlib-metadata==7.1.0 # via build packaging==23.2 - # via build -pip-tools==7.4.0 + # via + # -c requirements/constraints.txt + # build +pip-tools==7.4.1 # via -r requirements/pip-tools.in pyproject-hooks==1.0.0 # via @@ -23,11 +25,15 @@ tomli==2.0.1 # build # pip-tools # pyproject-hooks -wheel==0.42.0 +wheel==0.43.0 # via pip-tools zipp==3.17.0 - # via importlib-metadata + # via + # -c requirements/constraints.txt + # importlib-metadata # The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools +pip==24.0 + # via pip-tools +setuptools==69.2.0 + # via pip-tools diff --git a/requirements/pip.txt b/requirements/pip.txt index 6665603..cf44902 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -4,11 +4,11 @@ # # make upgrade # -wheel==0.42.0 +wheel==0.43.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: pip==24.0 # via -r requirements/pip.in -setuptools==69.1.1 +setuptools==69.2.0 # via -r requirements/pip.in diff --git a/requirements/test.txt b/requirements/test.txt index 3a8d3c1..5f5ec73 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,7 +4,7 @@ # # make upgrade # -asgiref==3.7.2 +asgiref==3.8.1 # via # -r requirements/base.txt # django @@ -12,6 +12,11 @@ astroid==3.1.0 # via # pylint # pylint-celery +backports-zoneinfo==0.2.1 ; python_version < "3.9" + # via + # -c requirements/constraints.txt + # -r requirements/base.txt + # django certifi==2024.2.2 # via # -r requirements/base.txt @@ -19,7 +24,6 @@ certifi==2024.2.2 cffi==1.16.0 # via # -r requirements/base.txt - # cryptography # pynacl charset-normalizer==3.3.2 # via @@ -34,18 +38,16 @@ click==8.1.7 # edx-lint click-log==0.4.0 # via edx-lint -code-annotations==1.6.0 +code-annotations==1.7.0 # via edx-lint -coverage[toml]==7.4.3 +coverage[toml]==7.4.4 # via pytest-cov -cryptography==42.0.5 - # via secretstorage ddt==1.7.2 # via -r requirements/test.in dill==0.3.8 # via pylint # via - # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt + # -c requirements/common_constraints.txt # -r requirements/base.txt # django-crum # django-waffle @@ -60,7 +62,7 @@ django-waffle==4.1.0 # edx-django-utils docutils==0.20.1 # via readme-renderer -edx-django-utils==5.10.1 +edx-django-utils==5.12.0 # via -r requirements/base.txt edx-lint==5.3.6 # via -r requirements/test.in @@ -72,25 +74,25 @@ idna==3.6 # via # -r requirements/base.txt # requests -importlib-metadata==7.0.1 +importlib-metadata==7.1.0 # via # keyring # twine -importlib-resources==6.1.2 +importlib-resources==6.4.0 # via keyring iniconfig==2.0.0 # via pytest isort==5.13.2 # via pylint -jaraco-classes==3.3.1 +jaraco-classes==3.4.0 + # via keyring +jaraco-context==4.3.0 + # via keyring +jaraco-functools==4.0.0 # via keyring -jeepney==0.8.0 - # via - # keyring - # secretstorage jinja2==3.1.3 # via code-annotations -keyring==24.3.0 +keyring==25.1.0 # via twine markdown-it-py==3.0.0 # via rich @@ -101,20 +103,24 @@ mccabe==0.7.0 mdurl==0.1.2 # via markdown-it-py more-itertools==10.2.0 - # via jaraco-classes -newrelic==9.7.0 + # via + # jaraco-classes + # jaraco-functools +newrelic==9.8.0 # via # -r requirements/base.txt # edx-django-utils -nh3==0.2.15 +nh3==0.2.17 # via readme-renderer packaging==23.2 - # via pytest + # via + # -c requirements/constraints.txt + # pytest pbr==6.0.0 # via # -r requirements/base.txt # stevedore -pkginfo==1.9.6 +pkginfo==1.10.0 # via twine platformdirs==4.2.0 # via pylint @@ -126,7 +132,7 @@ psutil==5.9.8 # edx-django-utils pycodestyle==2.11.1 # via -r requirements/test.in -pycparser==2.21 +pycparser==2.22 # via # -r requirements/base.txt # cffi @@ -154,22 +160,18 @@ pynacl==1.5.0 # via # -r requirements/base.txt # edx-django-utils -pytest==8.0.2 +pytest==8.1.1 # via # pytest-cov # pytest-django -pytest-cov==4.1.0 +pytest-cov==5.0.0 # via -r requirements/test.in pytest-django==4.8.0 # via -r requirements/test.in -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via freezegun python-slugify==8.0.4 # via code-annotations -pytz==2024.1 - # via - # -r requirements/base.txt - # django pyyaml==6.0.1 # via # code-annotations @@ -178,6 +180,7 @@ readme-renderer==43.0 # via twine requests==2.31.0 # via + # -c requirements/constraints.txt # -r requirements/base.txt # requests-toolbelt # responses @@ -189,16 +192,16 @@ responses==0.25.0 # via -r requirements/test.in rfc3986==2.0.0 # via twine -rich==13.7.0 +rich==13.7.1 # via twine -secretstorage==3.3.3 - # via keyring six==1.16.0 # via # edx-lint # python-dateutil slumber==0.7.1 - # via -r requirements/base.txt + # via + # -c requirements/constraints.txt + # -r requirements/base.txt sqlparse==0.4.4 # via # -r requirements/base.txt @@ -218,7 +221,9 @@ tomli==2.0.1 tomlkit==0.12.4 # via pylint twine==5.0.0 - # via -r requirements/test.in + # via + # -c requirements/constraints.txt + # -r requirements/test.in typing-extensions==4.10.0 # via # -r requirements/base.txt @@ -234,5 +239,6 @@ urllib3==2.2.1 # twine zipp==3.17.0 # via + # -c requirements/constraints.txt # importlib-metadata # importlib-resources diff --git a/setup.py b/setup.py index 58569a0..dcf88c0 100644 --- a/setup.py +++ b/setup.py @@ -91,7 +91,8 @@ def is_requirement(line): 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3.8', - 'Framework :: Django :: 3.2', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Framework :: Django :: 4.2', 'Topic :: Internet', 'Intended Audience :: Developers', diff --git a/tox.ini b/tox.ini index 14f3bea..16ba433 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py38-django{32,42}, quality +envlist = py{38, 311, 312}-django{42}, quality [pytest] DJANGO_SETTINGS_MODULE = test_settings @@ -7,18 +7,19 @@ addopts = --cov edx_rest_api_client --cov-report term-missing --cov-report xml norecursedirs = .* docs requirements [testenv] -deps = - django32: Django>=3.2,<4.0 +deps = + setuptools + wheel django42: Django>=4.2,<4.3 -r{toxinidir}/requirements/test.txt -commands = +commands = pytest {posargs} [testenv:quality] -setenv = +setenv = DJANGO_SETTINGS_MODULE = test_settings PYTHONPATH = . -commands = +commands = pycodestyle --config=.pep8 edx_rest_api_client pylint --rcfile=pylintrc edx_rest_api_client python setup.py bdist_wheel