From 19ad30aa41bc4c2a2249998dc58c5792f4cadd8d Mon Sep 17 00:00:00 2001 From: Bartosz Blizniak Date: Mon, 24 Aug 2026 12:12:48 +0100 Subject: [PATCH] fix: harden Python release artifacts --- .circleci/config.yml | 14 +- README.md | 2 +- bindings/python/.swagger-codegen-ignore | 2 + bindings/python/build.sh | 7 + bindings/python/deploy.sh | 8 +- bindings/python/release/pyproject.toml | 6 + bindings/python/src/.travis.yml | 14 -- bindings/python/src/LICENSE | 201 ++++++++++++++++++++++ bindings/python/src/README.md | 4 +- bindings/python/src/pyproject.toml | 6 + bindings/python/src/setup.py | 16 +- bindings/python/src/test-requirements.txt | 5 - bindings/python/src/tox.ini | 6 +- bindings/python/templates/README.mustache | 129 ++++++++++++++ bindings/python/templates/setup.mustache | 53 ++++++ bindings/python/templates/tox.mustache | 8 + 16 files changed, 436 insertions(+), 45 deletions(-) create mode 100644 bindings/python/.swagger-codegen-ignore create mode 100644 bindings/python/release/pyproject.toml delete mode 100644 bindings/python/src/.travis.yml create mode 100644 bindings/python/src/LICENSE create mode 100644 bindings/python/src/pyproject.toml delete mode 100644 bindings/python/src/test-requirements.txt create mode 100644 bindings/python/templates/README.mustache create mode 100644 bindings/python/templates/setup.mustache create mode 100644 bindings/python/templates/tox.mustache diff --git a/.circleci/config.yml b/.circleci/config.yml index 20470a6c..578cce40 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -92,23 +92,17 @@ workflows: language: ruby docker_image: cimg/ruby:2.6 - test: - name: "Test Python 2.7" - language: python - extra_env: TOXENV=py27 - docker_image: cimg/python:2.7 - - test: - name: "Test Python 3.7" + name: "Test Python 3.10" language: python extra_env: TOXENV=py3 - docker_image: cimg/python:3.7 + docker_image: cimg/python:3.10 - deploy_bindings: requires: - - "Test Python 2.7" - - "Test Python 3.7" + - "Test Python 3.10" filters: branches: only: - master name: "Deploy Python" language: python - docker_image: cimg/python:3.7 + docker_image: cimg/python:3.10 diff --git a/README.md b/README.md index abb2f27b..9e71a13b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cloudsmith API Bindings -[![Latest Version @ Cloudsmith](https://api-prd.cloudsmith.io/badges/version/cloudsmith/api/python/cloudsmith-api/latest/xf=bdist_wheel;xn=cloudsmith-api;xv=py2.py3/?render=true)](https://cloudsmith.io/~cloudsmith/repos/api/packages/detail/python/cloudsmith-api/latest/xf=bdist_wheel;xn=cloudsmith-api;xv=py2.py3/) +[![Latest Version @ Cloudsmith](https://api-prd.cloudsmith.io/badges/version/cloudsmith/api/python/cloudsmith-api/latest/xf=bdist_wheel;xn=cloudsmith-api;xv=py3/?render=true)](https://cloudsmith.io/~cloudsmith/repos/api/packages/detail/python/cloudsmith-api/latest/xf=bdist_wheel;xn=cloudsmith-api;xv=py3/) The [Cloudsmith](https://cloudsmith.io) API (Application Programmatic Interface) bindings provide libraries in different languages for accessing the service programmatically. The API is fully compliant with the [OpenAPI 2.0 Specification](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md) and the clients are *generated* using [swagger-codegen-cli](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen-cli) from the [Swagger Project](https://swagger.io/). diff --git a/bindings/python/.swagger-codegen-ignore b/bindings/python/.swagger-codegen-ignore new file mode 100644 index 00000000..0a86125e --- /dev/null +++ b/bindings/python/.swagger-codegen-ignore @@ -0,0 +1,2 @@ +src/.travis.yml +src/test-requirements.txt diff --git a/bindings/python/build.sh b/bindings/python/build.sh index 2eb8ba07..cfc8cf30 100755 --- a/bindings/python/build.sh +++ b/bindings/python/build.sh @@ -9,6 +9,7 @@ root_dir=$(readlink -f "$self_dir/../..") src_dir="$self_dir/src" build_json="$src_dir/build.json" template_dir="$self_dir/templates" +python_requires=">=3.10" rm -rf $src_dir mkdir -p $src_dir @@ -30,4 +31,10 @@ docker container run --rm --user "${codegen_run_user:?}" -v $self_dir:/local "${ -l python \ -o /local/src \ -t /local/templates \ + --ignore-file-override /local/.swagger-codegen-ignore \ + --additional-properties "pythonRequires=$python_requires" \ $common_codegen_options + +# Restore release metadata after clean regeneration. +cp "$root_dir/LICENSE" "$src_dir/LICENSE" +cp "$self_dir/release/pyproject.toml" "$src_dir/pyproject.toml" diff --git a/bindings/python/deploy.sh b/bindings/python/deploy.sh index dd823769..1fc1ba89 100755 --- a/bindings/python/deploy.sh +++ b/bindings/python/deploy.sh @@ -9,13 +9,15 @@ root_dir=$(readlink -f "$self_dir/../..") src_dir="$self_dir/src" install_dependencies() { - pip install --upgrade --user twine + pip install --upgrade --user build twine export PATH="$HOME/.local/bin:$PATH" } build_distribution() { echo "Building distribution ..." - python setup.py sdist bdist_wheel --universal + rm -rf build dist ./*.egg-info + python -m build + twine check dist/* } upload_to_pypi() { @@ -32,7 +34,7 @@ upload_to_pypi() { upload_to_cloudsmith() { echo "Uploading to Cloudsmith ..." - distribution_filepath="dist/${project_underscore}-${package_version}-py2.py3-none-any.whl" + distribution_filepath="dist/${project_underscore}-${package_version}-py3-none-any.whl" # no-wait-for-sync necessary to prevent upload from failing due to sync failure cloudsmith push python ${cloudsmith_repo_api} "${distribution_filepath}" --skip-errors --no-wait-for-sync diff --git a/bindings/python/release/pyproject.toml b/bindings/python/release/pyproject.toml new file mode 100644 index 00000000..fca019ca --- /dev/null +++ b/bindings/python/release/pyproject.toml @@ -0,0 +1,6 @@ +[build-system] +requires = [ + "setuptools>=77", + "wheel>=0.45", +] +build-backend = "setuptools.build_meta" diff --git a/bindings/python/src/.travis.yml b/bindings/python/src/.travis.yml deleted file mode 100644 index 86211e2d..00000000 --- a/bindings/python/src/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -# ref: https://docs.travis-ci.com/user/languages/python -language: python -python: - - "2.7" - - "3.2" - - "3.3" - - "3.4" - - "3.5" - #- "3.5-dev" # 3.5 development branch - #- "nightly" # points to the latest development branch e.g. 3.6-dev -# command to install dependencies -install: "pip install -r requirements.txt" -# command to run tests -script: nosetests diff --git a/bindings/python/src/LICENSE b/bindings/python/src/LICENSE new file mode 100644 index 00000000..202a0a1a --- /dev/null +++ b/bindings/python/src/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Cloudsmith Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/bindings/python/src/README.md b/bindings/python/src/README.md index 022e7747..33af304a 100644 --- a/bindings/python/src/README.md +++ b/bindings/python/src/README.md @@ -10,7 +10,7 @@ For more information, please visit [https://help.cloudsmith.io](https://help.clo ## Requirements. -Python 2.7 and 3.4+ +Python >=3.10 ## Installation & Usage ### pip install @@ -24,7 +24,7 @@ pip install git+https://github.com/cloudsmith-io/cloudsmith-api.git Then import the package: ```python -import cloudsmith_api +import cloudsmith_api ``` ### Setuptools diff --git a/bindings/python/src/pyproject.toml b/bindings/python/src/pyproject.toml new file mode 100644 index 00000000..fca019ca --- /dev/null +++ b/bindings/python/src/pyproject.toml @@ -0,0 +1,6 @@ +[build-system] +requires = [ + "setuptools>=77", + "wheel>=0.45", +] +build-backend = "setuptools.build_meta" diff --git a/bindings/python/src/setup.py b/bindings/python/src/setup.py index 9485ecf9..1da2be72 100644 --- a/bindings/python/src/setup.py +++ b/bindings/python/src/setup.py @@ -11,7 +11,7 @@ """ -from setuptools import setup, find_packages # noqa: H301 +from setuptools import find_packages, setup # noqa: H301 NAME = "cloudsmith_api" VERSION = "2.0.31" @@ -26,21 +26,25 @@ "certifi>=2017.4.17", "python-dateutil>=2.1", "six>=1.10", - "urllib3>=1.23" + "urllib3>=1.23", ] - + setup( name=NAME, version=VERSION, description="Cloudsmith API (v1)", author_email="support@cloudsmith.io", - url="https://api.cloudsmith.io/?format=openapi", + url="https://api.cloudsmith.io/?format=openapi", + license="Apache-2.0", + license_files=["LICENSE"], + python_requires=">=3.10", keywords=["Swagger", "Cloudsmith API (v1)"], install_requires=REQUIRES, - packages=find_packages(), + packages=find_packages(exclude=("test", "test.*")), include_package_data=True, long_description="""\ The API to the Cloudsmith Service # noqa: E501 - """ + """, + long_description_content_type="text/plain", ) diff --git a/bindings/python/src/test-requirements.txt b/bindings/python/src/test-requirements.txt deleted file mode 100644 index 2702246c..00000000 --- a/bindings/python/src/test-requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -coverage>=4.0.3 -nose>=1.3.7 -pluggy>=0.3.1 -py>=1.4.31 -randomize>=0.13 diff --git a/bindings/python/src/tox.ini b/bindings/python/src/tox.ini index 3d0be613..c5e96352 100644 --- a/bindings/python/src/tox.ini +++ b/bindings/python/src/tox.ini @@ -1,10 +1,8 @@ [tox] -envlist = py27, py3 +envlist = py3 [testenv] deps=-r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt commands= - nosetests \ - [] + python -m unittest discover -s test diff --git a/bindings/python/templates/README.mustache b/bindings/python/templates/README.mustache new file mode 100644 index 00000000..566daad2 --- /dev/null +++ b/bindings/python/templates/README.mustache @@ -0,0 +1,129 @@ +# {{{projectName}}} +{{#appDescription}} +{{{appDescription}}} +{{/appDescription}} + +This Python package is automatically generated by the [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) project: + +- API version: {{appVersion}} +- Package version: {{packageVersion}} +{{^hideGenerationTimestamp}} +- Build date: {{generatedDate}} +{{/hideGenerationTimestamp}} +- Build package: {{generatorClass}} +{{#infoUrl}} +For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}}) +{{/infoUrl}} + +## Requirements. + +Python {{{pythonRequires}}} + +## Installation & Usage +### pip install + +If the python package is hosted on Github, you can install directly from Github + +```sh +pip install git+https://github.com/{{{gitUserId}}}/{{{gitRepoId}}}.git +``` +(you may need to run `pip` with root permission: `sudo pip install git+https://github.com/{{{gitUserId}}}/{{{gitRepoId}}}.git`) + +Then import the package: +```python +import {{{packageName}}} +``` + +### Setuptools + +Install via [Setuptools](http://pypi.python.org/pypi/setuptools). + +```sh +python setup.py install --user +``` +(or `sudo python setup.py install` to install the package for all users) + +Then import the package: +```python +import {{{packageName}}} +``` + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```python +from __future__ import print_function +import time +import {{{packageName}}} +from {{{packageName}}}.rest import ApiException +from pprint import pprint +{{#apiInfo}}{{#apis}}{{#-first}}{{#operations}}{{#operation}}{{#-first}}{{#hasAuthMethods}}{{#authMethods}}{{#isBasic}} +# Configure HTTP basic authorization: {{{name}}} +configuration = {{{packageName}}}.Configuration() +configuration.username = 'YOUR_USERNAME' +configuration.password = 'YOUR_PASSWORD'{{/isBasic}}{{#isApiKey}} +# Configure API key authorization: {{{name}}} +configuration = {{{packageName}}}.Configuration() +configuration.api_key['{{{keyParamName}}}'] = 'YOUR_API_KEY' +# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed +# configuration.api_key_prefix['{{{keyParamName}}}'] = 'Bearer'{{/isApiKey}}{{#isOAuth}} +# Configure OAuth2 access token for authorization: {{{name}}} +configuration = {{{packageName}}}.Configuration() +configuration.access_token = 'YOUR_ACCESS_TOKEN'{{/isOAuth}}{{/authMethods}} +{{/hasAuthMethods}} + +# create an instance of the API class +api_instance = {{{packageName}}}.{{{classname}}}({{{packageName}}}.ApiClient(configuration)) +{{#allParams}}{{paramName}} = {{{example}}} # {{{dataType}}} | {{{description}}}{{^required}} (optional){{/required}}{{#defaultValue}} (default to {{{.}}}){{/defaultValue}} +{{/allParams}} + +try: +{{#summary}} # {{{.}}} +{{/summary}} {{#returnType}}api_response = {{/returnType}}api_instance.{{{operationId}}}({{#allParams}}{{#required}}{{paramName}}{{/required}}{{^required}}{{paramName}}={{paramName}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}){{#returnType}} + pprint(api_response){{/returnType}} +except ApiException as e: + print("Exception when calling {{classname}}->{{operationId}}: %s\n" % e) +{{/-first}}{{/operation}}{{/operations}}{{/-first}}{{/apis}}{{/apiInfo}} +``` + +## Documentation for API Endpoints + +All URIs are relative to *{{basePath}}* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | [**{{operationId}}**]({{apiDocPath}}{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{summary}}{{/summary}} +{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} + +## Documentation For Models + +{{#models}}{{#model}} - [{{{classname}}}]({{modelDocPath}}{{{classname}}}.md) +{{/model}}{{/models}} + +## Documentation For Authorization + +{{^authMethods}} All endpoints do not require authorization. +{{/authMethods}}{{#authMethods}}{{#last}} Authentication schemes defined for the API:{{/last}}{{/authMethods}} +{{#authMethods}}## {{{name}}} + +{{#isApiKey}}- **Type**: API key +- **API key parameter name**: {{{keyParamName}}} +- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}} +{{/isApiKey}} +{{#isBasic}}- **Type**: HTTP basic authentication +{{/isBasic}} +{{#isOAuth}}- **Type**: OAuth +- **Flow**: {{{flow}}} +- **Authorization URL**: {{{authorizationUrl}}} +- **Scopes**: {{^scopes}}N/A{{/scopes}} +{{#scopes}} - **{{{scope}}}**: {{{description}}} +{{/scopes}} +{{/isOAuth}} + +{{/authMethods}} + +## Author + +{{#apiInfo}}{{#apis}}{{^hasMore}}{{infoEmail}} +{{/hasMore}}{{/apis}}{{/apiInfo}} diff --git a/bindings/python/templates/setup.mustache b/bindings/python/templates/setup.mustache new file mode 100644 index 00000000..beebf6bb --- /dev/null +++ b/bindings/python/templates/setup.mustache @@ -0,0 +1,53 @@ +# coding: utf-8 + +{{>partial_header}} + +from setuptools import find_packages, setup # noqa: H301 + +NAME = "{{{projectName}}}" +VERSION = "{{packageVersion}}" +# To install the library, run the following +# +# python setup.py install +# +# prerequisite: setuptools +# http://pypi.python.org/pypi/setuptools + +{{#apiInfo}} +{{#apis}} +{{^hasMore}} +REQUIRES = [ + "certifi>=2017.4.17", + "python-dateutil>=2.1", + "six>=1.10", + "urllib3>=1.23", +] + +{{#asyncio}} +REQUIRES.append("aiohttp") +{{/asyncio}} +{{#tornado}} +REQUIRES.append("tornado") +{{/tornado}} + +setup( + name=NAME, + version=VERSION, + description="{{appName}}", + author_email="{{infoEmail}}", + url="{{{packageUrl}}}", + license="Apache-2.0", + license_files=["LICENSE"], + python_requires="{{{pythonRequires}}}", + keywords=["Swagger", "{{appName}}"], + install_requires=REQUIRES, + packages=find_packages(exclude=("test", "test.*")), + include_package_data=True, + long_description="""\ + {{appDescription}} # noqa: E501 + """, + long_description_content_type="text/plain", +) +{{/hasMore}} +{{/apis}} +{{/apiInfo}} diff --git a/bindings/python/templates/tox.mustache b/bindings/python/templates/tox.mustache new file mode 100644 index 00000000..c5e96352 --- /dev/null +++ b/bindings/python/templates/tox.mustache @@ -0,0 +1,8 @@ +[tox] +envlist = py3 + +[testenv] +deps=-r{toxinidir}/requirements.txt + +commands= + python -m unittest discover -s test