diff --git a/.github/workflows/app-pacakge-build-client-python.yml b/.github/workflows/app-pacakge-build-client-python.yml new file mode 100644 index 0000000..10f1a3c --- /dev/null +++ b/.github/workflows/app-pacakge-build-client-python.yml @@ -0,0 +1,125 @@ +# This workflow will install Python dependencies, run tests and lint with a single version of Python +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Unity-app-package-client Python Build + +# Do Run if we push anything changes in /libs/app-package-build-client to the main branch +# Run on an PR if it includes unity-py changes OR if the schema in health are changed. +on: + push: + branches: + - main + paths: + - 'libs/app-package-build-client/**' + pull_request: + branches: + - main + paths: + - 'libs/app-package-build-client/**' + +jobs: + build: + defaults: + run: + working-directory: ./libs/app-package-build-client + strategy: + fail-fast: false + max-parallel: 2 + matrix: + python-version: [ "3.8", "3.9", "3.10" ] + poetry-version: [ "1.5.1" ] + # os: [ ubuntu-18.04, macos-latest, windows-latest ] + os: [ ubuntu-22.04, macos-latest ] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + uses: abatilo/actions-poetry@v2.0.0 + with: + poetry-version: ${{ matrix.poetry-version }} + #- uses: dorny/paths-filter@v3 + # id: changes + # with: + # filters: | + # src: + # - 'libs/unity-py/**' + - name: Software Version Check + if: steps.filter.outputs.src == 'true' + run: | + proposed_version=`poetry version -s` + echo "curl -s -o /dev/null -w \"%{http_code}\" https://pypi.org/project/unity-sds-apgs-client/$proposed_version/" + status_code=`curl -s -o /dev/null -w "%{http_code}" https://pypi.org/project/unity-sds-apgs-client/$proposed_version/` + echo "Received status code of $status_code" + if ((status_code == 200)); then + echo "Version already exists." + exit 1 + fi + - name: Install dependencies + run: | + poetry install + # This is good practice, but because these are autogenerated libraries, we will forgo the linting. + #- name: Lint with flake8 + # run: | + # # stop the build if there are Python syntax errors or undefined names + # poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + # poetry run flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + poetry run pytest --cov-report=lcov --cov=unity_sds_apgs_client -o log_cli=true --log-cli-level=DEBUG + - name: Coveralls + uses: coverallsapp/github-action@v2.3.0 + version: + needs: build + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./libs/app-package-build-client + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.UNITY_BUILD_PAT }} + - name: Set up Python + uses: actions/setup-python@v2 + - name: Install Poetry + uses: abatilo/actions-poetry@v2.0.0 + with: + poetry-version: "1.5.1" + # Commented out the version bump code. Will publish new version to pypi on push to main. + # This means we are always releasing. This will fail if the version already exists in Pypi. + # We must ensure that the version has been updated. + # ADded version check above. + # Future work: set PR test to ensure the version has been updated. + + # - name: version-bump + # run: | + # poetry version prerelease + # - name: Commit Version Bump + # run: | + # git config --global user.name 'mdps bot' + # git config --global user.email 'mdps@noreply.github.com' + # git commit -am "development version bump. [skip actions]" + # git push + - name: Install dependencies + run: | + poetry install + - name: build + run: | + poetry build + - name: Get version + id: get-version + run: | + echo "::set-output name=current_version::$(poetry version | awk '{print $2}')" + - name: Publish a Python distribution to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + password: ${{ secrets.PYPI_API_TOKEN }} + packages-dir: ./libs/app-package-build-client/dist + outputs: + publishedVersion: ${{ steps.get-version.outputs.current_version }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f7838f3..c14bd63 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,11 +22,12 @@ repos: - --allow-missing-credentials - id: check-toml # Checks toml files for parsable syntax. # unity-py markdown lint + # Ignored because it caused exceptions with no clear indication as to the problem #- repo: https://github.com/igorshubovych/markdownlint-cli # rev: "v0.39.0" # hooks: # - id: markdownlint - # # args: ["--config", ".markdownlintrc", "--ignore", "libs/unity-py/CHANGELOG.md"] + # args: ["--config", ".markdownlintrc", "--ignore", "**/CHANGELOG.md"] - repo: https://github.com/PyCQA/isort rev: 5.13.2 diff --git a/libs/app-package-build-client/.openapi-generator-ignore b/libs/app-package-build-client/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/libs/app-package-build-client/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/libs/app-package-build-client/.openapi-generator/FILES b/libs/app-package-build-client/.openapi-generator/FILES new file mode 100644 index 0000000..e0697d2 --- /dev/null +++ b/libs/app-package-build-client/.openapi-generator/FILES @@ -0,0 +1,26 @@ +.github/workflows/python.yml +.gitignore +.gitlab-ci.yml +.travis.yml +README.md +docs/AdsAcbMcpCloneGet200Response.md +docs/DefaultApi.md +git_push.sh +pyproject.toml +requirements.txt +setup.cfg +setup.py +test-requirements.txt +test/__init__.py +tox.ini +unity_sds_apgs_client/__init__.py +unity_sds_apgs_client/api/__init__.py +unity_sds_apgs_client/api/default_api.py +unity_sds_apgs_client/api_client.py +unity_sds_apgs_client/api_response.py +unity_sds_apgs_client/configuration.py +unity_sds_apgs_client/exceptions.py +unity_sds_apgs_client/models/__init__.py +unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py +unity_sds_apgs_client/py.typed +unity_sds_apgs_client/rest.py diff --git a/libs/app-package-build-client/.openapi-generator/VERSION b/libs/app-package-build-client/.openapi-generator/VERSION new file mode 100644 index 0000000..1985849 --- /dev/null +++ b/libs/app-package-build-client/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.7.0 diff --git a/libs/app-package-build-client/CHANGELOG.md b/libs/app-package-build-client/CHANGELOG.md new file mode 100644 index 0000000..38d5a30 --- /dev/null +++ b/libs/app-package-build-client/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2024-08-05 + +### Added +- Added Schema and built application client code, including github workflows +### Changed +### Deprecated +### Removed +### Fixed +### Security diff --git a/libs/app-package-build-client/README.md b/libs/app-package-build-client/README.md new file mode 100644 index 0000000..4bcac94 --- /dev/null +++ b/libs/app-package-build-client/README.md @@ -0,0 +1,116 @@ +# unity-sds-apgs-client +Service for application package generation + +This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0 +- Package version: 1.0.0 +- Generator version: 7.7.0 +- Build package: org.openapitools.codegen.languages.PythonClientCodegen + +## Requirements. + +Python 3.7+ + +## Installation & Usage +### pip install + +If the python package is hosted on a repository, you can install directly using: + +```sh +pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git +``` +(you may need to run `pip` with root permission: `sudo pip install git+https://github.com/GIT_USER_ID/GIT_REPO_ID.git`) + +Then import the package: +```python +import unity_sds_apgs_client +``` + +### 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 unity_sds_apgs_client +``` + +### Tests + +Execute `pytest` to run the tests. + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```python + +import unity_sds_apgs_client +from unity_sds_apgs_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://api.dev.mdps.mcp.nasa.gov +# See configuration.py for a list of all supported configuration parameters. +configuration = unity_sds_apgs_client.Configuration( + host = "http://api.dev.mdps.mcp.nasa.gov" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +# Configure Bearer authorization: bearerAuth +configuration = unity_sds_apgs_client.Configuration( + access_token = os.environ["BEARER_TOKEN"] +) + + +# Enter a context with an instance of the API client +with unity_sds_apgs_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = unity_sds_apgs_client.DefaultApi(api_client) + clone_url = 'clone_url_example' # str | + + try: + # Begins the MCP Clone process + api_response = api_instance.ads_acb_mcp_clone_get(clone_url) + print("The response of DefaultApi->ads_acb_mcp_clone_get:\n") + pprint(api_response) + except ApiException as e: + print("Exception when calling DefaultApi->ads_acb_mcp_clone_get: %s\n" % e) + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://api.dev.mdps.mcp.nasa.gov* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*DefaultApi* | [**ads_acb_mcp_clone_get**](docs/DefaultApi.md#ads_acb_mcp_clone_get) | **GET** /ads-acb/mcp-clone | Begins the MCP Clone process + + +## Documentation For Models + + - [AdsAcbMcpCloneGet200Response](docs/AdsAcbMcpCloneGet200Response.md) + + + +## Documentation For Authorization + + +Authentication schemes defined for the API: + +### bearerAuth + +- **Type**: Bearer authentication + + +## Author diff --git a/libs/app-package-build-client/coverage.lcov b/libs/app-package-build-client/coverage.lcov new file mode 100644 index 0000000..dc193e7 --- /dev/null +++ b/libs/app-package-build-client/coverage.lcov @@ -0,0 +1,852 @@ +TN: +SF:unity_sds_apgs_client/__init__.py +DA:5,1,1+9wdnNK6ERHmSA06tdyPQ +DA:17,1,wsMlrTn33AvDPsz2kJoFzw +DA:20,1,O4fPLUss4TuiS0JV7PK6Ig +DA:23,1,Fg4K8TjB1w77+/CSfwjjAg +DA:24,1,ZXbBlWI+PR/Wh0aFSPpogw +DA:25,1,ZCyhYz0Inf6pAKsEACH07w +DA:26,1,V5CUECXCAJTNFTGoxSdY/A +DA:27,1,k4mk/BSywZc3vFl7rykamA +DA:28,1,83f7lgTrCGbihhO7XEl2Kw +DA:29,1,P8+lNspe4CkuTy0FxtCxvA +DA:30,1,qFDEBDkO7OgaxcvMZSOi/g +DA:31,1,MgjE1jx3p0JLVvOgoVHQ0Q +DA:34,1,n+S4Q3M2X5b4GGJfzMpw6w +LF:12 +LH:12 +end_of_record +TN: +SF:unity_sds_apgs_client/api/__init__.py +DA:4,1,O4fPLUss4TuiS0JV7PK6Ig +LF:1 +LH:1 +end_of_record +TN: +SF:unity_sds_apgs_client/api/default_api.py +DA:3,1,1+9wdnNK6ERHmSA06tdyPQ +DA:14,1,uqQzsyLE2snBclOsmsd0qA +DA:15,1,kpbjQTY8X43PSh14EOmyhw +DA:16,1,JunjvWP6TTs7gV7iVxi/UQ +DA:17,1,FL2e1W6bq78fvUH1aLz4Xg +DA:19,1,/a8547GzlL2Sm4dQamqNMw +DA:20,1,n+S4Q3M2X5b4GGJfzMpw6w +DA:22,1,CVJGDFJDT523s5SvGsbAOg +DA:23,1,Fg4K8TjB1w77+/CSfwjjAg +DA:24,1,T67nnKn3EAg0ltY0WdFNRA +DA:27,1,VrcwdlZEOLKxyTgYAARz3w +DA:28,1,RAN1UGYPLOLKS3esTJJ6ZA +DA:34,1,IT4kqGUJSBpKAm0pi/i4pQ +DA:35,1,vErEKWfEZVuY0nxcu+wplQ +DA:36,1,L7d6YQ1IEZkdQyUQyxnAwg +DA:37,1,Ie8cxi2kaGzbCTrlcLl0KQ +DA:40,1,AjisgRRMc8scFWicLmjSdQ +DA:41,1,GamwTOpDGoANWQnfW9/LhA +DA:106,1,AjisgRRMc8scFWicLmjSdQ +DA:107,1,kScYxn9RmXLSKgwIwLkW6A +DA:172,1,AjisgRRMc8scFWicLmjSdQ +DA:173,1,VL4vHHtFsQBGSumFAWQGoA +DA:234,1,ZMATpNVoweWpftTlhYVlBA +DA:84,0,2cmiycDTYgzO2vT2ncv/Ow +DA:92,0,HySOsJ9gZWrzVMsr1/hDNw +DA:95,0,xVmsq2otHaabXYiKmKfHRg +DA:99,0,mc8sSiUjUQ0ZVszybckhVA +DA:100,0,Tl0irD+4FzhOnKLYC/fkwg +DA:150,0,2cmiycDTYgzO2vT2ncv/Ow +DA:158,0,HySOsJ9gZWrzVMsr1/hDNw +DA:161,0,xVmsq2otHaabXYiKmKfHRg +DA:165,0,mc8sSiUjUQ0ZVszybckhVA +DA:166,0,Tl0irD+4FzhOnKLYC/fkwg +DA:216,0,2cmiycDTYgzO2vT2ncv/Ow +DA:224,0,HySOsJ9gZWrzVMsr1/hDNw +DA:227,0,xVmsq2otHaabXYiKmKfHRg +DA:231,0,Jf0ZtawpspLOL5bwtEW/Ag +DA:243,0,GdGRwbt/y/4QnnAXg2mCGg +DA:245,0,Ch/CetksBAPNy8VNGnxs1w +DA:248,0,4KT8Y7afhNY/oagXBeN8XA +DA:249,0,PaehIcOUt5JYXGauVMJnRQ +DA:250,0,m4iEZ5wF7BJSCzaMXSNE/g +DA:251,0,P6Fsw8IzfYO8kt/mTOc3+Q +DA:252,0,mNq3pObSFRuuDJrKyv9K9Q +DA:253,0,FRBdNvpYeqrDa1GxNXCSkw +DA:258,0,xLakscK5SkqoOwxuIPEVrw +DA:259,0,zDfdEy55VqcWGw0qlVoWVQ +DA:265,0,SbvafVPBbx4eTatUOSBCJg +DA:266,0,aagE1Nf/+7+11HPGGoryXA +DA:274,0,RpnctquVq/dNfvM9mZTb7Q +DA:278,0,D8sasEMaU5oofPf6sOrG/Q +LF:49 +LH:21 +end_of_record +TN: +SF:unity_sds_apgs_client/api_client.py +DA:3,1,1+9wdnNK6ERHmSA06tdyPQ +DA:15,1,L/jqrDHxbfUd/SDMFGHfTA +DA:16,1,8IQnfsOg8QP1j6xtCxez8A +DA:17,1,gRHjawkciFUavd6j4zLvOw +DA:18,1,OaTlemF3bXMi5MP7Db8vkQ +DA:19,1,S+QG4QhjTlJVZy3CzoUeLw +DA:20,1,7Z9Lj4ed27Wf2hBX6jooEA +DA:21,1,p7hNY1S5rX9QtYADf+cK4g +DA:22,1,5hwPtyw5fWMOX90GeC1WXw +DA:24,1,/9j88LWsDOfeMPFsLqmQlQ +DA:25,1,3E/n8fPDewkUsVO2LdwZ4A +DA:26,1,hPmmdyR8p6B0qSlKjTineg +DA:28,1,ZCyhYz0Inf6pAKsEACH07w +DA:29,1,elMzElYIbXA8kYFGvoRdpg +DA:30,1,a5aYupcnafWoOlHrRXyGrA +DA:31,1,F2oAzBzI53tZjsA6ssHtMw +DA:32,1,+82OetNlrLdYpATcvPfM6g +DA:42,1,bvgiEkADpDNVBbjHkfmPkQ +DA:44,1,T5e9V1wqwX4wl/f8yTyhFA +DA:45,1,RWNwHOzmCDa8/CNLM0uZSA +DA:60,1,B6OfmLZS8dR/xgp41eX6Qg +DA:61,1,b6GYh7NaX34vs5f8TwQEXA +DA:71,1,RcEwuguk7XGdR+woMBnqdg +DA:73,1,4LgMgWBGno1n5MNJ8WRFsQ +DA:81,1,8p5UUpNfVPivYU8uMU+xOw +DA:82,1,aOdxCy/5fAlFiJ1h0sSVKA +DA:83,1,CaIGIDuesj+7+ilrTuM2Tw +DA:85,1,AZcJIvGRC5YIw1devDm0pg +DA:86,1,uqeFwN6OIUF4T3INhN8PuA +DA:87,1,1GHgMyZvaxbxg298gyORBQ +DA:89,1,GRka5VBX0Mpf3vd2WUkt5Q +DA:91,1,10jKWSScUtwtcRG0/xHhbQ +DA:92,1,yo4ymP0yijW37S2YGgUGvw +DA:94,1,mnoV0T4hEkr2W8HjAfJidA +DA:97,1,X7Jctv7Y9ipZV+LU0Dd22Q +DA:100,1,HmADa1g/W1C2Vo9Wm4sNNA +DA:101,1,ypArBlZxcx6r25dxNXTl3g +DA:105,1,WE4WLKG8C21p5ChibiY1Iw +DA:106,1,1bc0jMsA50Ih+vS89vfxrQ +DA:107,1,wsRgeZL31aaARy0EujfQ6A +DA:109,1,mQ8i1DUZClSVAWoriBZScQ +DA:113,1,DMrmzAbOJlkXgq6rUeaYlA +DA:115,1,Nnqu9X+lU2lagW39QNhFWA +DA:116,1,sL59D/BjjwWVMqKu9HkeTw +DA:125,1,sQ7Ma5M/TpG+U9Ms3noBjg +DA:126,1,GsUMmn1YxtuQKRrAYK9nNA +DA:127,1,0Y1+B1TSmbfSRzQ9pMUTHA +DA:129,1,Nnqu9X+lU2lagW39QNhFWA +DA:130,1,vkjAkPD8Ao5elLqVslDIcw +DA:139,1,yRoDES/2Q+zM0Fx5DnQbDA +DA:248,1,tthkdDrEm15qnNO7g867jA +DA:283,1,K154voObD7ZMYRuZGTQwLw +DA:333,1,oFk4/LXQsnfV3s7yGDIDKg +DA:385,1,TqC6pt9k/KF3oa00wld4lw +DA:417,1,IkXOcrtk1HS5qEunMWEk5Q +DA:462,1,5WuCrhft5eDtavIvR5P2wA +DA:492,1,Ck7hqKzpTB7t61NJHrwIRw +DA:531,1,s1+20R2NwP5NOmBAVjKKwQ +DA:557,1,i9DN/ESvXsne2v+/yfB9vQ +DA:572,1,Fin1TeQsPt9tRT7FgUQT4g +DA:587,1,3RAjC8fZi5I+/KlyMtgqIQ +DA:634,1,Hcm43rH1gjEOi68sQji2bA +DA:665,1,kG56jYdSh5PEJfk36h7uNw +DA:696,1,2awQ2pFPV/egn3oJxxbmxg +DA:711,1,HQLucIU2XZRdHr51Ku5A8Q +DA:718,1,Wx/cXNJHnaDI2u+3wmOQGg +DA:734,1,bMlvFTQDiYXd3MflSu0rVQ +DA:755,1,9BUGTnGi/ZliN/CAZ+iajw +DA:773,1,bTAwRnXaK4Wa20kPDLGKSg +DA:88,0,Yb8gdxBoPLEii5OU9iFfwA +DA:95,0,ackOWdJx2/IgtB/ELuvQJg +DA:98,0,wWvyVCzDRWfTVXhFZNNl1w +DA:103,0,om4nRigaE6pgcpmLzmdF0Q +DA:110,0,spr+4axVYDaRG2yt7Z/d5w +DA:137,0,TKy196zT//FvROowc6G68w +DA:176,0,Wv8av44cMriVyynmGYIZ+Q +DA:179,0,OJCKTMwKWT9oA7Sg0dONLg +DA:180,0,sDJfAZAL8qWpOElxDvBP9A +DA:181,0,TpJKA38uij5z4XqDsO2Nng +DA:182,0,4zRUgNAnoxKS4ZhzrJ/m7A +DA:183,0,CT1/BUzWx9XBDYaojDAFKw +DA:184,0,gabIDNRI6UszC9H5dMxvUg +DA:185,0,TEqSKYhHmm/2HF8RhamUGw +DA:190,0,Xs6nEGgRJ5ugyLDWWVdTTA +DA:191,0,WoZbRVV58B65RzFwmY+Dkg +DA:192,0,xjCSp71/CkkHjP3yJR17PA +DA:196,0,9xWuHscjiMOxdom+2Zqckw +DA:198,0,qolm1WHjEZzTckpyc+/rEQ +DA:204,0,vDfJPNwnCmeCF9bk+vyCBg +DA:205,0,I3tqjGTZsr22UHaBW9W/zQ +DA:206,0,79R8t27hx3nBoicW/eXI2A +DA:207,0,P8eFp6qdHkwWKdQpulQE4g +DA:211,0,tn1HD2bOfhyhrHM4FK3kiA +DA:212,0,RwTcgbi0zpYQpHuDUDzU/A +DA:215,0,3vAZVhWMwNRY4WvdY4hlRQ +DA:226,0,EwboNcMWRQ2eAhV98aHUBA +DA:227,0,XbEJrbsBRy/IVemCVgIL+g +DA:230,0,841sOT5iWdZN3Y43+UXLOA +DA:231,0,t/8E5bQvu3NHwzSUzNOYmw +DA:234,0,1t6nQfOMNGE248MJuGnrSQ +DA:237,0,Gx5tZGYoMcf7nPW9vei7SA +DA:238,0,R9vUBW85FQkcpFTs4gNP8Q +DA:239,0,tLLLhMLYRh6deyNLAELKBw +DA:243,0,lrlvsn3SKpolZoPsDL9ITg +DA:245,0,nO4AniocSOtViaoKYrN34A +DA:269,0,xjcDBnSwra0OiNOAYAwoHA +DA:271,0,TAIxg2RToZ8iBXNiWOEaKg +DA:278,0,+oG1IqMT8gjQJNwrTZVSzg +DA:279,0,rqOSYv65nziWPZcVBXpkDg +DA:281,0,6Gn8Crfk1W1RGgnhaX7dAw +DA:294,0,DqjC5e7q/cMO5RMWN3IMMA +DA:295,0,JX95Hdz0mzdrmJrpwoha5Q +DA:297,0,KiqEa42jbDahaapgV2051g +DA:298,0,NVWldSQdkKEzq650fMq9bA +DA:300,0,c+oDkFKrLEyxV7x/+wLy+w +DA:303,0,zYr51ajArgGHf6FcEpeduw +DA:304,0,9gfHvYWoFOSMkGxjd/Zspw +DA:305,0,xjcDBnSwra0OiNOAYAwoHA +DA:306,0,Tt+Tyj9xhsgG+wsunfT7Fw +DA:307,0,2meXSwd+hK9QVRM5HcilCA +DA:308,0,5U14NKQ+5LMVs0MHymCjOw +DA:309,0,uP+Es/AcaWmKdb5GXptcOQ +DA:310,0,aFu8HBbDdLHEf1bAObCdnw +DA:311,0,OStFJlCallgcf3EY95aOqA +DA:312,0,v30xjw/rKYGYIVodBqkq8A +DA:313,0,p6KFk8382pBRfR+Eb3d4QA +DA:314,0,2x14VNJAvG31+SPUDRUNHg +DA:315,0,1K9XwnYNnsmyzrtCI55RNQ +DA:316,0,XlNgPsllXGGo9La2a4X4vw +DA:317,0,o/SVDlpUdCv4KDJ1cojtWw +DA:319,0,m55rD7lKWeNMYhCTw7Ik0g +DA:320,0,SLg7Thv47Bna4SIVm+pLFg +DA:326,0,0YvuNA670iPFW1IAejtnlg +DA:348,0,EGNruTy0X+Kp9Jkg/flHiw +DA:349,0,Dwjd91USmMoWKfkSCVg/jg +DA:350,0,NIhhOU4A6h8X1cFk44V50w +DA:351,0,RppjTUHFwty27m2xWGe8og +DA:352,0,0uyOO2npFjxcvNnpW0sunQ +DA:353,0,fgoceC6jFgAkJRMmUi+Xig +DA:354,0,uZaxC41qMM1FB82UbGveDg +DA:355,0,egeGH0WCFDrynfdYasf3dA +DA:356,0,rjDmmHsUHGBi/QarAVwPiw +DA:357,0,xFrbOGpTPq98OhW9uFmMjw +DA:360,0,R7EOIltGxPCV81tIJh9ZIw +DA:361,0,lppJvAiWalj/RP10Wpe+HA +DA:364,0,XI8OKj9s9UucwCJ4B06imw +DA:365,0,FccZ2ChaWzzSU8p6U9/1AQ +DA:367,0,dDIZx3PEi72u0ePx6phP3A +DA:368,0,nVwE7nxJMZNcdhf0XdNJeQ +DA:375,0,0Bu7+DUnO1Z+CoPoNd579A +DA:376,0,5TA52XsRp4ShGyxFrrpw6A +DA:378,0,LDfEkePt3N7EGLu6PX19YA +DA:380,0,xD//Fkn+kpQyWk8pVb3isQ +DA:397,0,lklPr4aNpzYQs3DI4bNH2g +DA:398,0,xvWIcpcyNr0gyGcTkdMxXw +DA:399,0,iIyXRVBiY0CS13SplFH8WA +DA:400,0,73DqMM/tqQHuZOmnv6mLRw +DA:401,0,1glSez1X9YSxeAtB6KUm7g +DA:402,0,7EL02RozWKr+XwuMvn+poQ +DA:403,0,CxG4YD21CZKEDuLszDARSg +DA:404,0,GWa++x2hrM1/aA/9kSS/wA +DA:406,0,iIyXRVBiY0CS13SplFH8WA +DA:407,0,ctI1Z+DJgeWVu0OzJoeDTA +DA:408,0,3b7eW6a/SHDvWzBiJ0a/Ag +DA:410,0,hg+bivYKQiyujzy35su5Xw +DA:415,0,gT31KA1yCDrekSyi7/nejA +DA:425,0,aNO6RD05+QROmqa+SuJhkQ +DA:426,0,Dwjd91USmMoWKfkSCVg/jg +DA:428,0,eWcj2QbDPJ+BxNvzZjZ2lA +DA:429,0,MdtykzmqmhOC+qblyrKwMg +DA:430,0,R2utgrlIwYwHERHxaK7pCQ +DA:431,0,P5TU1lICbMn6p2TpBCzhLA +DA:432,0,tX+4Vs34/ldUBSSLV1XFPg +DA:433,0,xJJwCtMukItXhXos+kYJbA +DA:436,0,Cr5q+o/r83p5DavMXyIGRw +DA:437,0,oz02lksDR7sGMOQ/pDeh1w +DA:438,0,T7FlvJYB/FlQal4fknhQCA +DA:439,0,nzU/Q8rUHaOuvi8TprRxTw +DA:440,0,QhqwzWsLdsep5dSNGJsKkA +DA:444,0,NxYcS7ZF0HEVeCrBUwAB/Q +DA:445,0,Gxcxt44bjUmYEupJJUb9UA +DA:447,0,kvK3I+eoDqZZBjlSiaEC2w +DA:449,0,Akrojtv3gnMS3dIN5imzCQ +DA:450,0,rrWUlBb0pCPhkXzowigZgw +DA:451,0,LVvDIpM60yV/7lWk2lAvOA +DA:452,0,2Yxx2z2+GLysG4aIbuW7gQ +DA:453,0,sXQNrY7Qh3E06VlXr/L/Nw +DA:454,0,JwVnJAfTTJ+op26EJpjFjg +DA:455,0,Ac9KZa1mD7tUU8yxxlJ/MQ +DA:456,0,ITJM17mjxAmUHh41P/YawA +DA:457,0,RypuDorEFeGqprALXFyzJQ +DA:458,0,a6l9bUWFP124h80vW+QOLg +DA:460,0,wZKVg3rXDW4Rh2fr5c7GCA +DA:469,0,4lF0OWAyi0pjm3I+Ex4C/A +DA:470,0,8dJf82NLTBNLgn9Jrhpwzg +DA:471,0,9gYpi3zNLir2AM9L2JfvtQ +DA:472,0,bWxEwZ63NJSBBh/CMkWluw +DA:473,0,sVuvcM+1XCINJ/OK2wR6cw +DA:474,0,VFMLJQJGDgjsMkhIwfTvJA +DA:475,0,1jxINXoq4uLI3sYXdgiYwg +DA:476,0,oMf9aAuEY60io7dNZVCRVA +DA:478,0,Z3l02J7Izwk4JFefvgO1+w +DA:479,0,foTB5CT/+2AfeZp8f+7yrQ +DA:480,0,iO8WugfhJWeSQcTom+8Zaw +DA:481,0,R17UHoCo0WzHZZsd4eIVDg +DA:482,0,3B3SbEGdGufJDNNZPPPdRg +DA:483,0,N7GEaO9w7UTiIqfIqI5NUQ +DA:485,0,l4ilPojsMliexEuGg8R0Zg +DA:486,0,NEhP1cNcesXJM6BSNQbS9g +DA:489,0,CBrjRRu+CXDBgDumfGBWLw +DA:490,0,zVUJP7QvufiHi3EIYi3YvQ +DA:499,0,4lF0OWAyi0pjm3I+Ex4C/A +DA:500,0,8dJf82NLTBNLgn9Jrhpwzg +DA:501,0,9gYpi3zNLir2AM9L2JfvtQ +DA:502,0,bWxEwZ63NJSBBh/CMkWluw +DA:503,0,tFGHM8lZncoGaf3B7gXKXw +DA:504,0,GHpb33qqwWRX89JpmsJg8w +DA:505,0,tfMZfxX3NFu5VJ8AWWXhtg +DA:506,0,EkGkfI4JAgxBUiEFv85jEA +DA:507,0,nCXmjEcgHTA9FTBsceB4NA +DA:508,0,1aGk4agkDqxlnAOv1yqHIw +DA:510,0,sVuvcM+1XCINJ/OK2wR6cw +DA:511,0,VFMLJQJGDgjsMkhIwfTvJA +DA:512,0,1jxINXoq4uLI3sYXdgiYwg +DA:513,0,3iskCdRbxeVa9h9fSQEwzg +DA:515,0,Z3l02J7Izwk4JFefvgO1+w +DA:516,0,foTB5CT/+2AfeZp8f+7yrQ +DA:517,0,iO8WugfhJWeSQcTom+8Zaw +DA:518,0,R17UHoCo0WzHZZsd4eIVDg +DA:519,0,3B3SbEGdGufJDNNZPPPdRg +DA:520,0,N7GEaO9w7UTiIqfIqI5NUQ +DA:522,0,l4ilPojsMliexEuGg8R0Zg +DA:523,0,NEhP1cNcesXJM6BSNQbS9g +DA:527,0,KdBcb6c275aGyrixBteLwg +DA:529,0,X4nIL5HDN0uDVlEbyOWEZQ +DA:537,0,V9kmgqLJA48/+mY9r/ff7Q +DA:538,0,DrfO4azYNfu50X2Oeiw/Mg +DA:539,0,QP0FJCIzxuyiOVRMCZXPUw +DA:540,0,fg3qitju69EAXdqoZos04Q +DA:541,0,U4BsvtP+mJC/r8QHid1cXg +DA:542,0,T9Ynw4scG0XZBqY30hTxXw +DA:543,0,fmduHTQOHtDomjbLp2RABA +DA:544,0,qS25FdKz+GuagBapla5Ivg +DA:545,0,BKEzIo72mt2H6JzmuqBc3A +DA:547,0,D5TgPr65+dt7zyPaGR5Z1Q +DA:548,0,e0AJc2jEk0x/FHu7Qy8iDg +DA:552,0,sZ/ac+KVdF75gkKsC4xiHw +DA:555,0,WoGK0qntVcds/C51IQHxJw +DA:563,0,aHIsKrAPO5vmDFqfL9jGiA +DA:564,0,Dwjd91USmMoWKfkSCVg/jg +DA:566,0,j3smpybyknKJUlBA578+dg +DA:567,0,VwQB9rl5yZRFvWkWy0zBCw +DA:568,0,8kDQlqIGymhynsJElvb00Q +DA:570,0,pB87FoWPqbNTTGCDOqtMBg +DA:578,0,RdHTUiaTjbxhfYw5DDDjWw +DA:579,0,Dwjd91USmMoWKfkSCVg/jg +DA:581,0,DjeIjI8hjG6cQ2dBbWE/Gg +DA:582,0,/jWE/++vMEKhrQiQApdumw +DA:583,0,oT/2TEx+eI9IgkpYunyddg +DA:585,0,DEYv7SPkZeJGz8NDBuhrrQ +DA:609,0,MbH+0IPBGioiEUoX1xmUMw +DA:610,0,MnzpXe1veqpfA7nIMRo0OA +DA:612,0,XYLs/rVBa8qWx0Ph8VeRYg +DA:613,0,jf/NmKBWJforyMcTEC81HA +DA:622,0,ixZg6JmPlT0K257WPSYcfA +DA:623,0,2LCD+nb7NNGKjlKlwyys/w +DA:624,0,jPJfX3lHs8eCSiWwtbrpKw +DA:625,0,nsNX9dS9vUaOlHRtpxqvtw +DA:653,0,Sm6K1Oh/PKxMt218HG8j4A +DA:654,0,cdyFQSBcw+5aeQ0XJYcvNQ +DA:655,0,HZaGaOT2FP0PkOZsqMve3A +DA:656,0,EFnI1Awg/z9hpBYVY2uMrg +DA:657,0,Mj4g+KnNyNcDkFJcZ2FDOg +DA:658,0,firc+/LWBHMgt93xjez7jQ +DA:659,0,iDSNqNdB8QBy6UF5Gl4JhQ +DA:661,0,6KHR6FDiuAE2BVhl29sOlw +DA:677,0,jrMN71i85a5hJ8yalbV3OQ +DA:678,0,FM34FbW7xhCMAgn8OnwZbg +DA:679,0,WRiEjBdRivHF7N2Ed+v2lQ +DA:681,0,lsMJzFschYtuWVwm6dnG8w +DA:682,0,pKtejcsC1aTMD+rTix9+2A +DA:683,0,9KgTBXcHpNKro1POyGfi+A +DA:687,0,yCS93V1TuYDsG+kV3/Lt5g +DA:688,0,MkFf4sYKInDZ9rUrEmj7Uw +DA:689,0,tVeNEe9gaJMiVsaMnb0WIA +DA:691,0,wOsNFB3x9Dq5pUH9me7KJw +DA:692,0,+2N30rheXKKfadZGfT7KTg +DA:694,0,OK9BqPPDg6dfVMYLBOqu/w +DA:704,0,xjcDBnSwra0OiNOAYAwoHA +DA:705,0,7n5aww2pywrHZFcMrGwuKQ +DA:706,0,nUtFHaBFN584vqRZ7rVM7g +DA:707,0,86LfS4vT8U3haozGFONIZQ +DA:708,0,aG8hzM939a6klmerpUAbhg +DA:709,0,mbMGZ7Kf4AGNvBHXcFByzg +DA:716,0,BorTe+0HQpcr3zDD5zth5A +DA:724,0,xjcDBnSwra0OiNOAYAwoHA +DA:725,0,8s4f50fq5ArODS7XV/QvPg +DA:726,0,c8nwtmEW1t5MtspOQSB7Mw +DA:727,0,gdTm4L+Bvxgdi0hTn2UeOQ +DA:728,0,MQAw7ryZXIqoa+XVvQuYKQ +DA:729,0,c0NG1XIKlE20nx8isJHYNQ +DA:742,0,xjcDBnSwra0OiNOAYAwoHA +DA:743,0,oBMYiqiv+yZbk5Y6ebSrzQ +DA:744,0,c8nwtmEW1t5MtspOQSB7Mw +DA:745,0,gdTm4L+Bvxgdi0hTn2UeOQ +DA:746,0,MQAw7ryZXIqoa+XVvQuYKQ +DA:747,0,c0NG1XIKlE20nx8isJHYNQ +DA:762,0,xjcDBnSwra0OiNOAYAwoHA +DA:763,0,7n5aww2pywrHZFcMrGwuKQ +DA:764,0,MQAw7ryZXIqoa+XVvQuYKQ +DA:765,0,c0NG1XIKlE20nx8isJHYNQ +DA:781,0,NQXiHTAyW9mlX69LYHBJVQ +LF:310 +LH:67 +end_of_record +TN: +SF:unity_sds_apgs_client/api_response.py +DA:1,1,up+Jk05WkkQnoJhVkj27OA +DA:3,1,ydCxunymauVRdfWlNGpIBA +DA:4,1,trcK9pAnALwbUj2tcqRG7Q +DA:5,1,fTXi/pFa83SZXpkpXScO1A +DA:7,1,S0pcSKxIVyyS+9/ideA+Rg +DA:9,1,YA7coXH2j9gOGLjDSln6ug +DA:10,1,/ZvqiDY7XVzMiSFdpC6ZCg +DA:14,1,MFJW7qUKL3t+H+r3NQXr9w +DA:15,1,QbRx49DKLxfX6VS8ghGuQQ +DA:16,1,39Gkr2hgZIwsvXIzK0W7gw +DA:17,1,Hdaeo7jllUyvddO4n/yNvA +DA:19,1,o8YiORjaN3FnkCYNuskH+A +LF:10 +LH:10 +end_of_record +TN: +SF:unity_sds_apgs_client/configuration.py +DA:3,1,1+9wdnNK6ERHmSA06tdyPQ +DA:15,1,2/+ysJB2BBzVWbseKUaEjQ +DA:16,1,EZEzNmL93PY96zsSuI0PfQ +DA:17,1,ApjyhS1U2PZboEP6WIl26g +DA:18,1,e0T+vIAAj5hu0lfCvp+CwA +DA:19,1,mUDsnWRiqW9R9nTILGKIZg +DA:20,1,jEc91tz0B1b2beSYnS+UDQ +DA:21,1,QVi7pppJimfL+FuMB26y3g +DA:23,1,gRGiH0xKWcl1MUDxeAyFxQ +DA:25,1,yLtMsMY+g07zAtRo30NIww +DA:31,1,9SHf7BWQgIEdLXlK/mOPPw +DA:32,1,bETK/dBaTqmmsnjda7wiLw +DA:65,1,DMrmzAbOJlkXgq6rUeaYlA +DA:67,1,0/kqPmTb34yEvKFi6WDrRA +DA:81,1,XMhQzU65+tXwKRjrTg/UeA +DA:82,1,D/PuF7edTaxXpN++0a6LTA +DA:84,1,WU8NAx3MDGqSUKjlTwY+Ww +DA:85,1,1dKnbRqoSOcGPEN0mQK/aw +DA:86,1,zBdCALLUDP7ShyU3ziBp4A +DA:88,1,uaCufJNfbrevdhXHSjtYaw +DA:89,1,FIfTQa9Rr8itHWQh+uun9A +DA:90,1,gsGkDzjafRE81bW9gHgl5A +DA:92,1,ig00G5iMAR2iJyhB4Gq3YQ +DA:93,1,mV/Mmds9Ts1karYBODHwmg +DA:95,1,eC3Efx7ho0KZFZIm7IbLFA +DA:96,1,ueLLTo38ndF7ROs5hlInQQ +DA:99,1,0Xe32FEP2rHCm0AWWvJRRQ +DA:100,1,H2hUN6AL/7TX5C7mzvYvGQ +DA:102,1,Xpabhl/imUBsket/A8u84w +DA:104,1,VYj+WTs/42VZ1kiX1HnGAQ +DA:105,1,w4LsAQ8iwPiNsTBPUKMXJg +DA:107,1,1BC3Clpvt8DiT9UrmUSSYA +DA:109,1,CSLA9AM+hnBObmOMJ2i26Q +DA:110,1,cY/juQbBHwZ6mWDqX+HKCw +DA:112,1,dtqlV9mtrgmwcabvHVUC7w +DA:113,1,As9v4OZ1zdF2b6DLtKksNQ +DA:115,1,wJEzWn/+AHNiTZbyYxuzCQ +DA:116,1,73950BxIKDzPB3nfXHrg+w +DA:118,1,Dp+OqmwMeiPWgLUguGaMIw +DA:119,1,XGdi2Ac2MZJe4i+OKZsbfg +DA:121,1,P1JZBb+3wUwyh9r71MeZVA +DA:122,1,OAM9kusvEFjgbAopQTGmLQ +DA:124,1,8V379MqX/5YigGd+OR/sJA +DA:125,1,AP3EyNkaV302fAG7ucVyLw +DA:126,1,wl67DKalM/HKZEg3bx873g +DA:127,1,WJ7wbaQoZ5cIt8UO3OaNkQ +DA:129,1,9yosVe7KFDBja1qIo0cM+Q +DA:130,1,d56KecOu1b/q1NBCSimcAQ +DA:132,1,wKL1vwuXbxqAuRWdJ+tjdA +DA:133,1,nu7hmqg+xi+4BvyCn+vxDw +DA:135,1,5LnEmGLCVA7Ui3XLKMHlnQ +DA:136,1,TgxNKI9ymiCO6ijKm6EckQ +DA:138,1,FewkYiE1g2QgF+l7KdSYqA +DA:141,1,bwedKwS4IYQzb6J/judo0A +DA:142,1,FnaZmhd3tNlG5jSDMIVZig +DA:145,1,lSUmZlf2pGZGYmUbnqG69g +DA:146,1,GGPvZ+kfEQr7zWviDgffxQ +DA:150,1,YnzxGK0LSqXOew4WnsYhkw +DA:151,1,9h62xiZyc6DxtNgo5GFhxA +DA:153,1,LOC/MscP01vo2WTl9sS9Mg +DA:154,1,Vayj6XOK/+md+rLAP9WMZA +DA:156,1,xG/XPDkq0JNExjZK3Qsvwg +DA:157,1,BkhlMZ5M0GlECrGyBVB64A +DA:159,1,4VeDbyQl8cSnNgwxTjd2Hg +DA:160,1,vWpPWXQ5W+rYVVb36gRaqA +DA:162,1,PWLof3Tn30tnMtwsHyBOlQ +DA:163,1,mFrOMcxBJGBgR/6L+A6dYw +DA:167,1,pfEai2kLQ+6T9JcSAhQI8w +DA:168,1,0O/fpmqzhpgG3wT3fcsLSA +DA:175,1,whlASy0+ZxGpeU10dXZloQ +DA:176,1,sCqZHbfzaCjOddLV0ANOPA +DA:178,1,8n5B7wWNIoBOMForoFI/Yg +DA:179,1,Kn7jdEUi8mtM06zU/dBhuA +DA:181,1,VzlmRzT5DpHM89IH/y3nCA +DA:182,1,lQ/xdOGdksfFu5I1LBmrVg +DA:184,1,/zEe1eGdUmXhfVib26NUuw +DA:185,1,ddD1bWKzvcZDW4xYNcOHEg +DA:188,1,wqle25EaOttxUvuvw6I34w +DA:190,1,urLQNQJF0YTngXqXz+9oEA +DA:191,1,ydGPIDNzHr3hxUFKOXXpiw +DA:194,1,oGuYTPmGnNKUfdVsFKqcHA +DA:195,1,dFL1jtnqvn9C4QZyfBzchA +DA:198,1,eYD3cFJS0OLZ3qvqVg2LJg +DA:199,1,v5tVlr4QC29Er+qU/EeGQg +DA:202,1,4vC9EH6AHm/qB4DbkXW/Tw +DA:216,1,I+QmhWa5Q7im42yIpxqpPQ +DA:217,1,ems2/YaTbIpGDg2mCtJmPQ +DA:219,1,Nnqu9X+lU2lagW39QNhFWA +DA:220,1,vkjAkPD8Ao5elLqVslDIcw +DA:230,1,Nnqu9X+lU2lagW39QNhFWA +DA:231,1,cQnyKYB68+TSV6jzHAyimg +DA:240,1,Nnqu9X+lU2lagW39QNhFWA +DA:241,1,sL59D/BjjwWVMqKu9HkeTw +DA:250,1,sQ7Ma5M/TpG+U9Ms3noBjg +DA:251,1,ecsGUULdZs6QsnqlwkEpEQ +DA:252,1,0Y1+B1TSmbfSRzQ9pMUTHA +DA:254,1,HmADa1g/W1C2Vo9Wm4sNNA +DA:255,1,wQcF+BlRmffGTMhWXKDqNQ +DA:266,1,ILf/c8Zs5iYYx07OH0nuKQ +DA:267,1,4E4ddAEOyTNnHy1Po73Nxg +DA:276,1,ag2O7hpY1CjS0x0z9aT7Nw +DA:277,1,UCkDGS65Y/lKQigddm8ekw +DA:285,1,HmADa1g/W1C2Vo9Wm4sNNA +DA:286,1,2xjAAxN/7rvv7BjRp/XZlA +DA:294,1,tFJS0TR6KFLAZLmm6SSQVw +DA:295,1,tyEe8A4HYWf4gEBnRDII+g +DA:316,1,HmADa1g/W1C2Vo9Wm4sNNA +DA:317,1,iXRjPXMOLX88HcHwWh5Rhw +DA:327,1,K7qORmtTlNLX9tIwUTT+CQ +DA:328,1,j5GjaB889DQIlCwY3PB1VQ +DA:336,1,/e0+sl3H9AbA6ZrJ3aaJ4A +DA:337,1,tYgNJGdmbz5EV6XeiXavjA +DA:339,1,GBtbGcik0ea6QRkHjkp1DA +DA:356,1,IV7BH03RMG32CjMv1+/kUw +DA:371,1,4/TNrZwPONo/ZjXuE9bPsQ +DA:386,1,MyMpoohJ7KCbwm1TJ0z+xQ +DA:398,1,ed8qRHI3jKtz2B2jEnGNfg +DA:410,1,P1cl8jUQqinQGMcQIaYvSQ +DA:449,1,HmADa1g/W1C2Vo9Wm4sNNA +DA:450,1,AcGjNe5E9EmUckQD5Soxmg +DA:454,1,YZ8yIOKiHnZFpW7ejEdb3w +DA:455,1,E11tgscORnHXrTNm9Z7oWQ +DA:101,0,917WzSHYynLIG3ULZbM0Uw +DA:106,0,C25xwUEGQqTo3j7yHJ8yRQ +DA:139,0,02CqaKuB1TpwSkVc/WI3zA +DA:203,0,hNFF5LpKMcgq4m4z5uAS/A +DA:204,0,MWYsKUS7ZNGi/K71D7qqww +DA:205,0,PL+a0Kql8zQumpn5MJhnQA +DA:206,0,ycAOsyo5cYFXyee5da9/mA +DA:207,0,i0wxLbipYdyTdyjtPKOQcQ +DA:208,0,EsrTAX49nWvNPxzDJWrtdw +DA:210,0,8UEJx5pE2TanfeMOlcjBEg +DA:212,0,rSRhnepGJE7HIc4EuW0cMg +DA:213,0,4dho/cFO0QJoy1bD/9ii8A +DA:214,0,cPa3dAsIk+eSRfSpgwNsyg +DA:228,0,TKy196zT//FvROowc6G68w +DA:238,0,BUVrq/8MLsPvH3G/ddg02A +DA:264,0,Ji4bnpGHGmtoA5IE/gIi9w +DA:280,0,Y4mezam8yRvT6haHvZOqTw +DA:281,0,M6f3V/0S+sc4LMXPNZy6ag +DA:282,0,jhvIkcEUl01aNDe6f0O22Q +DA:283,0,WPSps+ZXHw6cdDDH5Kl9aA +DA:292,0,nKYrkkmqO1Cz9opHN8yf5A +DA:301,0,JVNHaLoQsMQHD/Uyrf71kA +DA:302,0,7yxLbHj4VsKezqNd+JslMw +DA:304,0,jhvIkcEUl01aNDe6f0O22Q +DA:305,0,6HdNxxqmXZ26kGjxwfEMug +DA:307,0,rk0z9h/7Ftmw7N/vZLmTdg +DA:311,0,jhvIkcEUl01aNDe6f0O22Q +DA:312,0,dRi2ADrgMstzeuEl4TK/4g +DA:314,0,eB5GPshMRAQ8r4f5I5a93A +DA:325,0,gGsrAzxnyja+UYD1t1pqWg +DA:346,0,llv4NEclY79/iim2Ll1V9Q +DA:347,0,p99aGwfNcMbUZSkMVpjSuA +DA:348,0,iQ/ztY4ZqZEFi0TfcOVfOQ +DA:349,0,E0Ndr5PCSkZOfV73eqo0sw +DA:350,0,yuTmlCiCpJLtfz6jlqkK5w +DA:351,0,yxYLIA92QDdY4b4cIIeikw +DA:352,0,s+FK8qx/dd1iPDP6fwTwIA +DA:354,0,LgnVCa03m5XbN1tmtKgu4w +DA:361,0,ckzJ8wNg70aaAtSXJWXKCQ +DA:362,0,U/DHDtHRPNCgNt0M4f1f7Q +DA:363,0,HNRe6sNF2R1LWbcfVOiajg +DA:364,0,B2RaMAUnyzeDYYw6+SztkA +DA:365,0,F8U+sGLPv2J+9oBdO3F3qg +DA:366,0,/5unPpzrGCUTzwJJJKSsLw +DA:367,0,oij/ORAgk7QFqeE0DmScvA +DA:376,0,SrTMHHoRni8LljRBaxzadg +DA:377,0,hOc4OdVwR/1OXSTzn99Deg +DA:378,0,UWlRSp3BOR09o5g7HBC/Zg +DA:384,0,4/99OhkFYfONvW6TMHKkkw +DA:391,0,Mw3mMBZyTcsNdb13r3j7UQ +DA:403,0,R+8InUbBHLa2qQoc7tpflA +DA:417,0,gLA3UQFzu/18BkmlaF2C1w +DA:418,0,HY8rxZH6NAkIEniShIsv0g +DA:420,0,b8ZHf9F5PQej94rC0DDglA +DA:421,0,8d1ggOMwbd3if8iaoktAOw +DA:423,0,xjcDBnSwra0OiNOAYAwoHA +DA:424,0,0oQ69SHoVq5Oux7oZBwMeA +DA:425,0,eDv4sdo0P607swGYhjlu+g +DA:426,0,HVyrBJ61ni9ux6MdUIeaUA +DA:430,0,nC2HKF0jNQqtkLd0Zr/Grw +DA:433,0,qOSYl1LXfYVUQAnBRX3xZQ +DA:434,0,YRji6eOztkxDW8gThERpBA +DA:437,0,2OQMZoCv5WGqeMAN84J4Fw +DA:439,0,ziMwbdP43Yl2rkv+Iw0+Vg +DA:445,0,8TMGHyvhJtkVh0TZUelGOA +DA:447,0,eQ78iCu++712trFyNCkbOw +DA:452,0,Te/8+PcVdD3j5yNyxjw1WA +DA:457,0,Qv2gFcUZ/h2wBRoVY5nPvw +DA:458,0,uq1xzSyEuruXSkzKOlsBUA +LF:189 +LH:120 +end_of_record +TN: +SF:unity_sds_apgs_client/exceptions.py +DA:3,1,1+9wdnNK6ERHmSA06tdyPQ +DA:14,1,8d2CrmlOB2GQqBsCmpM3Nw +DA:15,1,Gm7xNPPVXMJm0wNNsliqzg +DA:17,1,+qK/dgkPP7FRtz7i2ryNog +DA:18,1,S2HgRmv0Ow9GrxhmUtFydA +DA:21,1,D0VDayUMb4bMWkioH9VUlA +DA:22,1,TGd5SpYlW8PUUW4tQRg5iw +DA:50,1,A7a34wfUNyh9efmu3rIKuw +DA:51,1,7y30HRK4bIrZ2vfBm5iW9Q +DA:68,1,3GOrGhC2lA7yYHSKYFR99g +DA:69,1,7y30HRK4bIrZ2vfBm5iW9Q +DA:87,1,rCECrPVBqXv2w4Cj3uXpAQ +DA:88,1,7y30HRK4bIrZ2vfBm5iW9Q +DA:104,1,xMlzPlPiPvo41t2H4K9hog +DA:106,1,4LgMgWBGno1n5MNJ8WRFsQ +DA:133,1,Nnqu9X+lU2lagW39QNhFWA +DA:134,1,NoKVGBt2ITeHF804GBAb5A +DA:157,1,j+CcxAIEiLeqjzkbiEHnZA +DA:171,1,zUVFsXXIKTAmd1jNiamk+w +DA:172,1,PdeqDqr4bOft68ON3+/7kg +DA:175,1,f26v4zfuD7DKQU9tfEGRug +DA:176,1,PdeqDqr4bOft68ON3+/7kg +DA:179,1,rxNLt0JC9RNRtoSLWTxEug +DA:180,1,PdeqDqr4bOft68ON3+/7kg +DA:183,1,fH9uK155ISef36YwOldADw +DA:184,1,PdeqDqr4bOft68ON3+/7kg +DA:187,1,mYAy+3lbtI3yhVNkyq4F9A +DA:188,1,PdeqDqr4bOft68ON3+/7kg +DA:191,1,E5HgcJAAC7YVcLYO1lmTOw +DA:41,0,Meyj1ZLtUuJT6F8UymDXdA +DA:42,0,7noN3G27K5LBKcMeqcrTOw +DA:43,0,lsGkYc4VhYpSiWnBOSJwog +DA:44,0,EPFS6GjP/JcMyhBhti99Xg +DA:45,0,YkYthLaUL5O/5cgVTSuhkg +DA:46,0,O6TNssveCmGOpapsrTkHUQ +DA:47,0,Qx96k2am58lVFLMGbWgfmw +DA:61,0,Meyj1ZLtUuJT6F8UymDXdA +DA:62,0,EPFS6GjP/JcMyhBhti99Xg +DA:63,0,YkYthLaUL5O/5cgVTSuhkg +DA:64,0,O6TNssveCmGOpapsrTkHUQ +DA:65,0,vXnIf8jNZZz1QRh7MAaKPQ +DA:80,0,Meyj1ZLtUuJT6F8UymDXdA +DA:81,0,EPFS6GjP/JcMyhBhti99Xg +DA:82,0,YkYthLaUL5O/5cgVTSuhkg +DA:83,0,O6TNssveCmGOpapsrTkHUQ +DA:84,0,3QtXI9hAIkEk7LePQYX2Vw +DA:97,0,Meyj1ZLtUuJT6F8UymDXdA +DA:98,0,EPFS6GjP/JcMyhBhti99Xg +DA:99,0,YkYthLaUL5O/5cgVTSuhkg +DA:100,0,O6TNssveCmGOpapsrTkHUQ +DA:101,0,BYCpPE5roTgVVuJXu+mlGA +DA:115,0,PN+KRWNonp3KhxxgmVMKbA +DA:116,0,aTkl1CfTifV7VgIM032vPA +DA:117,0,ChYK08AXc/WCk02UFyfCnQ +DA:118,0,4VPuoQvINcH8KOXzptY2nw +DA:119,0,UyHgYCi2lHuojylwSm/nqQ +DA:121,0,NFhxaiFYLHATZDvRAvBnpQ +DA:122,0,4nUUJAcqMmssmWxcTCNLrw +DA:123,0,BgZ66HpvJ7rL1ARDxImvcg +DA:124,0,dX45pKZZ6NJtOeq6o8G1pg +DA:125,0,c1HV8gUKy7vOsffhdY89+g +DA:126,0,jabyabswK1zeTVBcq/S5QQ +DA:127,0,Uk1iEqLYWHwxE4nbWtF0CQ +DA:128,0,sSRhPbJQZIwq6s5Y0/4wZQ +DA:129,0,jcUcrUlQLqPE/0vq4Sa+DA +DA:130,0,Mit16hMNcznEd8lSMy284Q +DA:131,0,NDOAeZ+LrM2H0NljkEqLag +DA:141,0,vCJUBkD2IQTVUgSt8zNlig +DA:142,0,ROMPvS4JS/prAfF64KT7EQ +DA:144,0,6TRYBc/3ymLC5BJjQHc5kQ +DA:145,0,lp4GRTFfD0sgGqcSwfKqIg +DA:147,0,mybssFZ8ngsVk+OxHSimBQ +DA:148,0,wFCVd9IBRlw9/bfPv5+NXA +DA:150,0,Qs0pyRa+tKGNlXZ0Z/cF4Q +DA:151,0,nJLCObJUiCl2SHFw0I1lWw +DA:153,0,alIs3GOisA5JbQuIkmQomw +DA:154,0,xfbNwWoTsuHYiua+fbNorg +DA:155,0,xmiAhxXhybhf+78+W6uzcg +DA:159,0,wNMX0I8PqqzcKJzOB6jZug +DA:161,0,LupmvhaVVENvp7dJ/IzXiw +DA:162,0,5brQM357jFMEJGTjzl9u1g +DA:165,0,Nkw44MmhcfzI2orFVtGw1g +DA:166,0,HJJwJQUlTgxRtyOl3hNhkw +DA:168,0,cwteFA87TpN6lMO8cQdjrA +DA:193,0,bpi85sy3v1hut4GKjJMUfQ +DA:194,0,dMxG7NwxKBWK38sfMaFroQ +DA:195,0,zijjefz/T3PrL2/G3Y2Esg +DA:196,0,EaiM0FlsjYtAgO8WIXlcvQ +DA:198,0,KFWPep8ItMNVBxdy+426Yg +DA:199,0,BJBlZsSWstphiTlZImt1kA +LF:88 +LH:27 +end_of_record +TN: +SF:unity_sds_apgs_client/models/__init__.py +DA:4,1,1+9wdnNK6ERHmSA06tdyPQ +DA:17,1,n+S4Q3M2X5b4GGJfzMpw6w +LF:1 +LH:1 +end_of_record +TN: +SF:unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py +DA:3,1,1+9wdnNK6ERHmSA06tdyPQ +DA:15,1,ydCxunymauVRdfWlNGpIBA +DA:16,1,jXQwuRSnDQOG8XUCnnsycg +DA:17,1,XqRs0Xj9sy25/MIkviDZHQ +DA:18,1,OaTlemF3bXMi5MP7Db8vkQ +DA:20,1,3/4e3Gk5GuXaAGIZyPy68A +DA:21,1,sZix1rjvO0gehaS1PuKJGA +DA:22,1,eCP3SKU2HjSYjxO/cM1gVg +DA:23,1,Gm7xNPPVXMJm0wNNsliqzg +DA:25,1,jcpYJdG1gxP68ljG6m4ATw +DA:26,1,/ZvqiDY7XVzMiSFdpC6ZCg +DA:29,1,dzjgBukp3jnI6syjxYFR3Q +DA:30,1,p2Xl3AuXk3iewvxG1CAiBg +DA:31,1,5qU4IJ+FxPVKO0iwXRJJDg +DA:33,1,bQAOMJFe1pWWTg/kwhNW/A +DA:40,1,/kjMWq9hoYpwQrxEoNOLew +DA:44,1,FB1dSNddycsxSk1O60gL1A +DA:49,1,Nnqu9X+lU2lagW39QNhFWA +DA:50,1,a2YFU5AlYpFZ6Mxyye5TuQ +DA:54,1,CmdSuZgKibi/6SRT5iiW+Q +DA:74,1,Nnqu9X+lU2lagW39QNhFWA +DA:75,1,/HioYpvxXRQC9N2op74xWg +DA:42,0,plYnTYc7gEFe96pURv6cbw +DA:47,0,gaOQut2NlOQY2tXDuV59sQ +DA:52,0,8lKaozUZbEqH+sj7nP/6qA +DA:64,0,rlmslO5YBQF4z1s8K/qqYA +DA:67,0,W1SSuJlGnxKEWEidVqysVw +DA:72,0,5KOm6Sqlb3KyDijt4F7/hQ +DA:77,0,EGNruTy0X+Kp9Jkg/flHiw +DA:78,0,Dwjd91USmMoWKfkSCVg/jg +DA:80,0,lPttVqCMv7zxaWYa8hWY+Q +DA:81,0,OUlaMoKwBpPNewY7kUJl7g +DA:83,0,2Gl3e1gIl+Vpf5KJXIXLRg +DA:87,0,JCCYeaAOoRG6YyUo+YRpWw +LF:32 +LH:20 +end_of_record +TN: +SF:unity_sds_apgs_client/rest.py +DA:3,1,1+9wdnNK6ERHmSA06tdyPQ +DA:15,1,xmMLoYBW1BFhJ6Xn+A/vug +DA:16,1,OaTlemF3bXMi5MP7Db8vkQ +DA:17,1,p7hNY1S5rX9QtYADf+cK4g +DA:18,1,Ndg2bsTwQL/bjJU7FIwX/A +DA:20,1,QVi7pppJimfL+FuMB26y3g +DA:22,1,0Z0We7wRnyAJFxE866dvbg +DA:24,1,VTyiTX+A4jxK7+DP9vGhlg +DA:25,1,29NyqZ3QR7VkiCK1vXZW+A +DA:28,1,P7F1ehu7C/pPJnuYPbqSOg +DA:38,1,DMTW2hL+B51QdzJkFuux3g +DA:40,1,rmh/ukvI9V2p08g6F/tGYg +DA:46,1,kWXAxjzMoxa0AQWM6k7EKw +DA:51,1,x/cN6njhV4/DacArAt4WyQ +DA:55,1,eIH44Cd8M4w5kwYV1PvaUA +DA:60,1,VBb9w5M4Syi/7lyKfOMAcQ +DA:62,1,lWyW2VceismbjNeNX9YNXA +DA:69,1,lbnToKP9wcjEWGvgGR6DRg +DA:70,1,WBk46j2eAb7wYlzHta4GyA +DA:74,1,DmFFmJhnngKJKvOigkdoDw +DA:80,1,5pGnHSHFYjrpo08LkFXMTQ +DA:85,1,MhRHcmWGeMZG7XdKKk0Sew +DA:88,1,PPSF5eUUWIJMyX1CwSwh8w +DA:92,1,3GiR00oDQMSMe+bTvsnXPA +DA:95,1,dYoT58IlnWW9Whs5sDC4vQ +DA:96,1,3AaPbUdbydTp0lZPJ1DdLA +DA:99,1,b7HSsH0UhycuFnB4N2K5fg +DA:101,1,VW2lacJK1j/8OLP76EvNQw +DA:112,1,DjSPaEzz5sjrShCk2q4/WQ +DA:114,1,f+GgTfAi/pnPH4nsKhUaKQ +DA:29,0,BYAykC7R+NQWgDN+HDo3zA +DA:30,0,W/g8GJDAYJkSSurt59Mzfw +DA:31,0,+pQlDmZ80H1u4f7oz2H4cg +DA:32,0,UAHh9L53QqIuZAm3Ow0WLw +DA:33,0,W/g8GJDAYJkSSurt59Mzfw +DA:35,0,2VP69puJhwo4Nbqq0MGgng +DA:41,0,ZpSXVITclVoV5EstKeUevg +DA:42,0,1/MN5bnmNMeb03TzJIUh9Q +DA:43,0,bDb6OYObJEuszVuUs8JclQ +DA:44,0,nD6IqmVnfgwLaLjYGRQZ+g +DA:47,0,ZwwgrV0YK3jr7cUg0vt9Sw +DA:48,0,yB3uHHOTbI9YvWykjp9vRg +DA:49,0,vKBm9gBluxtcdhl4eyVhhg +DA:53,0,BZWqBE0FsYkdm6JQw0POMQ +DA:57,0,L7t5L9DZQKhEFBlTeiVMZA +DA:72,0,KglTpPWbFCmJ9JrwYUQEqA +DA:81,0,PzztaR1uOym3wfKC16aa8w +DA:86,0,dX7rCSlW+J/qSwANu2V+ag +DA:89,0,5uhHt7HOQE/uFiOC0dEVNg +DA:93,0,YGCXLnsusHN5pdPTbyAsiw +DA:102,0,+DrXDyQTkC+5Fe5Uk/920A +DA:103,0,ZcEuVq0m4QUoJwEjw+gJ2w +DA:104,0,9HYIGyhFXirrJBJoeyeZCA +DA:105,0,6SAOj2Dd/kUq32DAlzABLQ +DA:106,0,v3wUQDcgazcpQ8YuP8I3JA +DA:108,0,9HYIGyhFXirrJBJoeyeZCA +DA:109,0,hhPpRQVUrZrZQWFpeH+7sg +DA:110,0,oodQ7gjARxsiZh9aeIFmRQ +DA:137,0,ekw+Yxd0oOYIxTvl0R8U9w +DA:138,0,d87v2C/v567I1due5ICT3w +DA:148,0,9yAX/ZDULSv+pwMl/TlA4w +DA:149,0,6KHR6FDiuAE2BVhl29sOlw +DA:153,0,ZOsUn9L8Behy+XPfu4C76A +DA:154,0,/rvErLdPVPhlxc+S2/drOA +DA:156,0,qzOxFK2A3ccNd5zIgC0lbA +DA:157,0,6VcFy/iAsA6V/rsPlv7JMg +DA:158,0,Cx7iv9kh3d15w7VD4JuWEg +DA:159,0,siMvQbwxTcEK4jIlVtpYZQ +DA:160,0,A5mEjdFdMnwzkdLOxB4lUA +DA:164,0,sWqEbJ/uqHBYG/trAcFjYg +DA:169,0,xjcDBnSwra0OiNOAYAwoHA +DA:171,0,wulkt29eBaw7/8Dlb+4dBg +DA:174,0,PJetmWd4Grzf2f3Ezghy0w +DA:175,0,D+AUVEp5jwmNg4l4Plltwg +DA:179,0,i6RJ1Ueh/0qVRtvEZCEo7g +DA:180,0,Gp5o00fX64m9WkaKGh9tKQ +DA:181,0,7GiMgCidvgUf+3Hi67gnIA +DA:182,0,Dmdi1JXr/4Hsr+whCTvIww +DA:190,0,jlDeHtK+vyyEz2Nlo0Ldcg +DA:191,0,Dmdi1JXr/4Hsr+whCTvIww +DA:200,0,bRv1Fbyi8zsLEAZn4b2new +DA:204,0,kfk1yfF61ngCCv6Mis9LCg +DA:206,0,CqTo2nciOlSDVFzNtd7d5w +DA:207,0,Dmdi1JXr/4Hsr+whCTvIww +DA:219,0,YRjhErd8n13LKkcerBZO9g +DA:220,0,Dmdi1JXr/4Hsr+whCTvIww +DA:228,0,e5ZTIw1vQK0Tx6qS2rkaDw +DA:229,0,VEVGfU3vz1cCZ0SAmJFQxA +DA:230,0,Dmdi1JXr/4Hsr+whCTvIww +DA:239,0,bVK2ScyURZDvhPNzDvqcfA +DA:242,0,yC/4o/w1DcDxnSBdebS60Q +DA:245,0,e4FpGTJN4X18FKYplVGhfg +DA:253,0,J8JY+CgoelHIdCcIk6Dqtw +DA:254,0,5DsgE4/9yEYPV5TN4bPnVg +DA:255,0,Ead/nB45NOM2ipoOt9Gl7g +DA:257,0,9esNaSvxdVZ8fy4tThCBOQ +LF:95 +LH:29 +end_of_record diff --git a/libs/app-package-build-client/docs/AdsAcbMcpCloneGet200Response.md b/libs/app-package-build-client/docs/AdsAcbMcpCloneGet200Response.md new file mode 100644 index 0000000..d0ee11f --- /dev/null +++ b/libs/app-package-build-client/docs/AdsAcbMcpCloneGet200Response.md @@ -0,0 +1,28 @@ +# AdsAcbMcpCloneGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**clone_url** | **str** | | [optional] +**log_group_name** | **str** | | [optional] + +## Example + +```python +from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import AdsAcbMcpCloneGet200Response + +# TODO update the JSON string below +json = "{}" +# create an instance of AdsAcbMcpCloneGet200Response from a JSON string +ads_acb_mcp_clone_get200_response_instance = AdsAcbMcpCloneGet200Response.from_json(json) +# print the JSON string representation of the object +print(AdsAcbMcpCloneGet200Response.to_json()) + +# convert the object into a dict +ads_acb_mcp_clone_get200_response_dict = ads_acb_mcp_clone_get200_response_instance.to_dict() +# create an instance of AdsAcbMcpCloneGet200Response from a dict +ads_acb_mcp_clone_get200_response_from_dict = AdsAcbMcpCloneGet200Response.from_dict(ads_acb_mcp_clone_get200_response_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/libs/app-package-build-client/docs/DefaultApi.md b/libs/app-package-build-client/docs/DefaultApi.md new file mode 100644 index 0000000..f1f6459 --- /dev/null +++ b/libs/app-package-build-client/docs/DefaultApi.md @@ -0,0 +1,84 @@ +# unity_sds_apgs_client.DefaultApi + +All URIs are relative to *http://api.dev.mdps.mcp.nasa.gov* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**ads_acb_mcp_clone_get**](DefaultApi.md#ads_acb_mcp_clone_get) | **GET** /ads-acb/mcp-clone | Begins the MCP Clone process + + +# **ads_acb_mcp_clone_get** +> AdsAcbMcpCloneGet200Response ads_acb_mcp_clone_get(clone_url) + +Begins the MCP Clone process + +### Example + +* Bearer Authentication (bearerAuth): + +```python +import unity_sds_apgs_client +from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import AdsAcbMcpCloneGet200Response +from unity_sds_apgs_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://api.dev.mdps.mcp.nasa.gov +# See configuration.py for a list of all supported configuration parameters. +configuration = unity_sds_apgs_client.Configuration( + host = "http://api.dev.mdps.mcp.nasa.gov" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +# Configure Bearer authorization: bearerAuth +configuration = unity_sds_apgs_client.Configuration( + access_token = os.environ["BEARER_TOKEN"] +) + +# Enter a context with an instance of the API client +with unity_sds_apgs_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = unity_sds_apgs_client.DefaultApi(api_client) + clone_url = 'clone_url_example' # str | + + try: + # Begins the MCP Clone process + api_response = api_instance.ads_acb_mcp_clone_get(clone_url) + print("The response of DefaultApi->ads_acb_mcp_clone_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->ads_acb_mcp_clone_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **clone_url** | **str**| | + +### Return type + +[**AdsAcbMcpCloneGet200Response**](AdsAcbMcpCloneGet200Response.md) + +### Authorization + +[bearerAuth](../README.md#bearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successfully submitted a job | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/libs/app-package-build-client/git_push.sh b/libs/app-package-build-client/git_push.sh new file mode 100644 index 0000000..f53a75d --- /dev/null +++ b/libs/app-package-build-client/git_push.sh @@ -0,0 +1,57 @@ +#!/bin/sh +# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ +# +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" + +git_user_id=$1 +git_repo_id=$2 +release_note=$3 +git_host=$4 + +if [ "$git_host" = "" ]; then + git_host="github.com" + echo "[INFO] No command line input provided. Set \$git_host to $git_host" +fi + +if [ "$git_user_id" = "" ]; then + git_user_id="GIT_USER_ID" + echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" +fi + +if [ "$git_repo_id" = "" ]; then + git_repo_id="GIT_REPO_ID" + echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" +fi + +if [ "$release_note" = "" ]; then + release_note="Minor update" + echo "[INFO] No command line input provided. Set \$release_note to $release_note" +fi + +# Initialize the local directory as a Git repository +git init + +# Adds the files in the local repository and stages them for commit. +git add . + +# Commits the tracked changes and prepares them to be pushed to a remote repository. +git commit -m "$release_note" + +# Sets the new remote +git_remote=$(git remote) +if [ "$git_remote" = "" ]; then # git remote not defined + + if [ "$GIT_TOKEN" = "" ]; then + echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." + git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git + else + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git + fi + +fi + +git pull origin master + +# Pushes (Forces) the changes in the local repository up to the remote repository +echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" +git push origin master 2>&1 | grep -v 'To https' diff --git a/libs/app-package-build-client/poetry.lock b/libs/app-package-build-client/poetry.lock new file mode 100644 index 0000000..53db2d1 --- /dev/null +++ b/libs/app-package-build-client/poetry.lock @@ -0,0 +1,644 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + +[[package]] +name = "cachetools" +version = "5.4.0" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, +] + +[[package]] +name = "chardet" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.6.1" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.15.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mypy" +version = "1.4.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mypy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:566e72b0cd6598503e48ea610e0052d1b8168e60a46e0bfd34b3acf2d57f96a8"}, + {file = "mypy-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca637024ca67ab24a7fd6f65d280572c3794665eaf5edcc7e90a866544076878"}, + {file = "mypy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dde1d180cd84f0624c5dcaaa89c89775550a675aff96b5848de78fb11adabcd"}, + {file = "mypy-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8c4d8e89aa7de683e2056a581ce63c46a0c41e31bd2b6d34144e2c80f5ea53dc"}, + {file = "mypy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:bfdca17c36ae01a21274a3c387a63aa1aafe72bff976522886869ef131b937f1"}, + {file = "mypy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7549fbf655e5825d787bbc9ecf6028731973f78088fbca3a1f4145c39ef09462"}, + {file = "mypy-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:98324ec3ecf12296e6422939e54763faedbfcc502ea4a4c38502082711867258"}, + {file = "mypy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141dedfdbfe8a04142881ff30ce6e6653c9685b354876b12e4fe6c78598b45e2"}, + {file = "mypy-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8207b7105829eca6f3d774f64a904190bb2231de91b8b186d21ffd98005f14a7"}, + {file = "mypy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:16f0db5b641ba159eff72cff08edc3875f2b62b2fa2bc24f68c1e7a4e8232d01"}, + {file = "mypy-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:470c969bb3f9a9efcedbadcd19a74ffb34a25f8e6b0e02dae7c0e71f8372f97b"}, + {file = "mypy-1.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5952d2d18b79f7dc25e62e014fe5a23eb1a3d2bc66318df8988a01b1a037c5b"}, + {file = "mypy-1.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:190b6bab0302cec4e9e6767d3eb66085aef2a1cc98fe04936d8a42ed2ba77bb7"}, + {file = "mypy-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9d40652cc4fe33871ad3338581dca3297ff5f2213d0df345bcfbde5162abf0c9"}, + {file = "mypy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01fd2e9f85622d981fd9063bfaef1aed6e336eaacca00892cd2d82801ab7c042"}, + {file = "mypy-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2460a58faeea905aeb1b9b36f5065f2dc9a9c6e4c992a6499a2360c6c74ceca3"}, + {file = "mypy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2746d69a8196698146a3dbe29104f9eb6a2a4d8a27878d92169a6c0b74435b6"}, + {file = "mypy-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ae704dcfaa180ff7c4cfbad23e74321a2b774f92ca77fd94ce1049175a21c97f"}, + {file = "mypy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:43d24f6437925ce50139a310a64b2ab048cb2d3694c84c71c3f2a1626d8101dc"}, + {file = "mypy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c482e1246726616088532b5e964e39765b6d1520791348e6c9dc3af25b233828"}, + {file = "mypy-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43b592511672017f5b1a483527fd2684347fdffc041c9ef53428c8dc530f79a3"}, + {file = "mypy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34a9239d5b3502c17f07fd7c0b2ae6b7dd7d7f6af35fbb5072c6208e76295816"}, + {file = "mypy-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5703097c4936bbb9e9bce41478c8d08edd2865e177dc4c52be759f81ee4dd26c"}, + {file = "mypy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e02d700ec8d9b1859790c0475df4e4092c7bf3272a4fd2c9f33d87fac4427b8f"}, + {file = "mypy-1.4.1-py3-none-any.whl", hash = "sha256:45d32cec14e7b97af848bddd97d85ea4f0db4d5a149ed9676caa4eb2f7402bb4"}, + {file = "mypy-1.4.1.tar.gz", hash = "sha256:9bbcd9ab8ea1f2e1c8031c21445b511442cc45c89951e49bbf852cbb70755b1b"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] + +[[package]] +name = "pydantic" +version = "2.8.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] + +[[package]] +name = "pyproject-api" +version = "1.7.1" +description = "API to interact with the python pyproject.toml based projects" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyproject_api-1.7.1-py3-none-any.whl", hash = "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb"}, + {file = "pyproject_api-1.7.1.tar.gz", hash = "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827"}, +] + +[package.dependencies] +packaging = ">=24.1" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2024.5.6)", "sphinx-autodoc-typehints (>=2.2.1)"] +testing = ["covdefaults (>=2.3)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "setuptools (>=70.1)"] + +[[package]] +name = "pytest" +version = "8.3.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tox" +version = "4.16.0" +description = "tox is a generic virtualenv management and test command line tool" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tox-4.16.0-py3-none-any.whl", hash = "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0"}, + {file = "tox-4.16.0.tar.gz", hash = "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748"}, +] + +[package.dependencies] +cachetools = ">=5.3.3" +chardet = ">=5.2" +colorama = ">=0.4.6" +filelock = ">=3.15.4" +packaging = ">=24.1" +platformdirs = ">=4.2.2" +pluggy = ">=1.5" +pyproject-api = ">=1.7.1" +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +virtualenv = ">=20.26.3" + +[package.extras] +docs = ["furo (>=2024.5.6)", "sphinx (>=7.3.7)", "sphinx-argparse-cli (>=1.16)", "sphinx-autodoc-typehints (>=2.2.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] +testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=9.1)", "distlib (>=0.3.8)", "flaky (>=3.8.1)", "hatch-vcs (>=0.4)", "hatchling (>=1.25)", "psutil (>=6)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-xdist (>=3.6.1)", "re-assert (>=1.1)", "setuptools (>=70.2)", "time-machine (>=2.14.2)", "wheel (>=0.43)"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240316" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.26.3" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.8" +content-hash = "2812b12ccaa6cd9fd89b97054aba22a0f2b8c8e2db8fa632298af918cf3285a1" diff --git a/libs/app-package-build-client/pyproject.toml b/libs/app-package-build-client/pyproject.toml new file mode 100644 index 0000000..d4f7587 --- /dev/null +++ b/libs/app-package-build-client/pyproject.toml @@ -0,0 +1,76 @@ +[tool.poetry] +name = "unity-sds-apgs-client" +version = "0.1.0" +description = "App Package API" +authors = ["OpenAPI Generator Community "] +license = "NoLicense" +readme = "README.md" +repository = "https://github.com/GIT_USER_ID/GIT_REPO_ID" +keywords = ["OpenAPI", "OpenAPI-Generator", "App Package API"] +include = ["unity_sds_apgs_client/py.typed"] + +[tool.isort] +profile = "black" + +[tool.poetry.dependencies] +python = "^3.8" + +urllib3 = ">= 1.25.3" +python-dateutil = ">=2.8.2" +pydantic = ">=2" +typing-extensions = ">=4.7.1" + +[tool.poetry.dev-dependencies] +pytest = ">=7.2.1" +tox = ">=3.9.0" +flake8 = ">=4.0.0" +types-python-dateutil = ">=2.8.19.14" +mypy = "1.4.1" +coverage = "^7.3.1" +pytest-cov = "^4.1.0" + + +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[tool.pylint.'MESSAGES CONTROL'] +extension-pkg-whitelist = "pydantic" + +[tool.mypy] +files = [ + "unity_sds_apgs_client", + #"test", # auto-generated tests + "tests", # hand-written tests +] +# TODO: enable "strict" once all these individual checks are passing +# strict = true + +# List from: https://mypy.readthedocs.io/en/stable/existing_code.html#introduce-stricter-options +warn_unused_configs = true +warn_redundant_casts = true +warn_unused_ignores = true + +## Getting these passing should be easy +strict_equality = true +strict_concatenate = true + +## Strongly recommend enabling this one as soon as you can +check_untyped_defs = true + +## These shouldn't be too much additional work, but may be tricky to +## get passing if you use a lot of untyped libraries +disallow_subclassing_any = true +disallow_untyped_decorators = true +disallow_any_generics = true + +### These next few are various gradations of forcing use of type annotations +#disallow_untyped_calls = true +#disallow_incomplete_defs = true +#disallow_untyped_defs = true +# +### This one isn't too hard to get passing, but return on investment is lower +#no_implicit_reexport = true +# +### This one can be tricky to get passing if you use a lot of untyped libraries +#warn_return_any = true diff --git a/libs/app-package-build-client/requirements.txt b/libs/app-package-build-client/requirements.txt new file mode 100644 index 0000000..80776ee --- /dev/null +++ b/libs/app-package-build-client/requirements.txt @@ -0,0 +1,5 @@ +pydantic >= 2 +python_dateutil >= 2.5.3 +setuptools >= 21.0.0 +typing-extensions >= 4.7.1 +urllib3 >= 1.25.3, < 2.1.0 diff --git a/libs/app-package-build-client/setup.cfg b/libs/app-package-build-client/setup.cfg new file mode 100644 index 0000000..11433ee --- /dev/null +++ b/libs/app-package-build-client/setup.cfg @@ -0,0 +1,2 @@ +[flake8] +max-line-length=99 diff --git a/libs/app-package-build-client/setup.py b/libs/app-package-build-client/setup.py new file mode 100644 index 0000000..f6ea4f0 --- /dev/null +++ b/libs/app-package-build-client/setup.py @@ -0,0 +1,49 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from setuptools import find_packages, setup # noqa: H301 + +# To install the library, run the following +# +# python setup.py install +# +# prerequisite: setuptools +# http://pypi.python.org/pypi/setuptools +NAME = "unity-sds-apgs-client" +VERSION = "1.0.0" +PYTHON_REQUIRES = ">=3.7" +REQUIRES = [ + "urllib3 >= 1.25.3, < 2.1.0", + "python-dateutil", + "pydantic >= 2", + "typing-extensions >= 4.7.1", +] + +setup( + name=NAME, + version=VERSION, + description="App Package API", + author="OpenAPI Generator community", + author_email="team@openapitools.org", + url="", + keywords=["OpenAPI", "OpenAPI-Generator", "App Package API"], + install_requires=REQUIRES, + packages=find_packages(exclude=["test", "tests"]), + include_package_data=True, + long_description_content_type="text/markdown", + long_description="""\ + Service for application package generation + """, # noqa: E501 + package_data={"unity_sds_apgs_client": ["py.typed"]}, +) diff --git a/libs/app-package-build-client/test-requirements.txt b/libs/app-package-build-client/test-requirements.txt new file mode 100644 index 0000000..9c375f0 --- /dev/null +++ b/libs/app-package-build-client/test-requirements.txt @@ -0,0 +1,5 @@ +mypy>=1.4.1 +pytest~=7.1.3 +pytest-cov>=2.8.1 +pytest-randomly>=3.12.0 +types-python-dateutil>=2.8.19 diff --git a/libs/app-package-build-client/test/__init__.py b/libs/app-package-build-client/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/libs/app-package-build-client/test/test_ads_acb_mcp_clone_get200_response.py b/libs/app-package-build-client/test/test_ads_acb_mcp_clone_get200_response.py new file mode 100644 index 0000000..40cdf11 --- /dev/null +++ b/libs/app-package-build-client/test/test_ads_acb_mcp_clone_get200_response.py @@ -0,0 +1,56 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import ( + AdsAcbMcpCloneGet200Response, +) + + +class TestAdsAcbMcpCloneGet200Response(unittest.TestCase): + """AdsAcbMcpCloneGet200Response unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> AdsAcbMcpCloneGet200Response: + """Test AdsAcbMcpCloneGet200Response + include_optional is a boolean, when False only required + params are included, when True both required and + optional params are included""" + # uncomment below to create an instance of `AdsAcbMcpCloneGet200Response` + """ + model = AdsAcbMcpCloneGet200Response() + if include_optional: + return AdsAcbMcpCloneGet200Response( + clone_url = '', + log_group_name = '' + ) + else: + return AdsAcbMcpCloneGet200Response( + ) + """ + + def testAdsAcbMcpCloneGet200Response(self): + """Test AdsAcbMcpCloneGet200Response""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + + +if __name__ == "__main__": + unittest.main() diff --git a/libs/app-package-build-client/test/test_default_api.py b/libs/app-package-build-client/test/test_default_api.py new file mode 100644 index 0000000..330c17f --- /dev/null +++ b/libs/app-package-build-client/test/test_default_api.py @@ -0,0 +1,38 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from unity_sds_apgs_client.api.default_api import DefaultApi + + +class TestDefaultApi(unittest.TestCase): + """DefaultApi unit test stubs""" + + def setUp(self) -> None: + self.api = DefaultApi() + + def tearDown(self) -> None: + pass + + def test_ads_acb_mcp_clone_get(self) -> None: + """Test case for ads_acb_mcp_clone_get + + Begins the MCP Clone process + """ + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/libs/app-package-build-client/tox.ini b/libs/app-package-build-client/tox.ini new file mode 100644 index 0000000..09ae02a --- /dev/null +++ b/libs/app-package-build-client/tox.ini @@ -0,0 +1,9 @@ +[tox] +envlist = py3 + +[testenv] +deps=-r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt + +commands= + pytest --cov=unity_sds_apgs_client diff --git a/libs/app-package-build-client/unity_sds_apgs_client/__init__.py b/libs/app-package-build-client/unity_sds_apgs_client/__init__.py new file mode 100644 index 0000000..4f46ff9 --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/__init__.py @@ -0,0 +1,38 @@ +# coding: utf-8 + +# flake8: noqa + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +__version__ = "1.0.0" + +# import apis into sdk package +from unity_sds_apgs_client.api.default_api import DefaultApi +from unity_sds_apgs_client.api_client import ApiClient + +# import ApiClient +from unity_sds_apgs_client.api_response import ApiResponse +from unity_sds_apgs_client.configuration import Configuration +from unity_sds_apgs_client.exceptions import ( + ApiAttributeError, + ApiException, + ApiKeyError, + ApiTypeError, + ApiValueError, + OpenApiException, +) + +# import models into sdk package +from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import ( + AdsAcbMcpCloneGet200Response, +) diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api/__init__.py b/libs/app-package-build-client/unity_sds_apgs_client/api/__init__.py new file mode 100644 index 0000000..a14f630 --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/api/__init__.py @@ -0,0 +1,4 @@ +# flake8: noqa + +# import apis into api package +from unity_sds_apgs_client.api.default_api import DefaultApi diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api/default_api.py b/libs/app-package-build-client/unity_sds_apgs_client/api/default_api.py new file mode 100644 index 0000000..04267b0 --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/api/default_api.py @@ -0,0 +1,274 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + +from typing import Any, Dict, List, Optional, Tuple, Union + +from pydantic import Field, StrictFloat, StrictInt, StrictStr, validate_call +from typing_extensions import Annotated + +from unity_sds_apgs_client.api_client import ApiClient, RequestSerialized +from unity_sds_apgs_client.api_response import ApiResponse +from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import ( + AdsAcbMcpCloneGet200Response, +) +from unity_sds_apgs_client.rest import RESTResponseType + + +class DefaultApi: + """NOTE: This class is auto generated by OpenAPI Generator + Ref: https://openapi-generator.tech + + Do not edit the class manually. + """ + + def __init__(self, api_client=None) -> None: + if api_client is None: + api_client = ApiClient.get_default() + self.api_client = api_client + + @validate_call + def ads_acb_mcp_clone_get( + self, + clone_url: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> AdsAcbMcpCloneGet200Response: + """Begins the MCP Clone process + + + :param clone_url: (required) + :type clone_url: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._ads_acb_mcp_clone_get_serialize( + clone_url=clone_url, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = { + "200": "AdsAcbMcpCloneGet200Response", + } + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def ads_acb_mcp_clone_get_with_http_info( + self, + clone_url: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[AdsAcbMcpCloneGet200Response]: + """Begins the MCP Clone process + + + :param clone_url: (required) + :type clone_url: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._ads_acb_mcp_clone_get_serialize( + clone_url=clone_url, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = { + "200": "AdsAcbMcpCloneGet200Response", + } + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def ads_acb_mcp_clone_get_without_preload_content( + self, + clone_url: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)] + ], + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Begins the MCP Clone process + + + :param clone_url: (required) + :type clone_url: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._ads_acb_mcp_clone_get_serialize( + clone_url=clone_url, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index, + ) + + _response_types_map: Dict[str, Optional[str]] = { + "200": "AdsAcbMcpCloneGet200Response", + } + response_data = self.api_client.call_api( + *_param, _request_timeout=_request_timeout + ) + return response_data.response + + def _ads_acb_mcp_clone_get_serialize( + self, + clone_url, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = {} + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[str, Union[str, bytes]] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + if clone_url is not None: + _header_params["clone_url"] = clone_url + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + ["application/json"] + ) + + # authentication setting + _auth_settings: List[str] = ["bearerAuth"] + + return self.api_client.param_serialize( + method="GET", + resource_path="/ads-acb/mcp-clone", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth, + ) diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api_client.py b/libs/app-package-build-client/unity_sds_apgs_client/api_client.py new file mode 100644 index 0000000..da82cf3 --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/api_client.py @@ -0,0 +1,728 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import datetime +import json +import mimetypes +import os +import re +import tempfile +from enum import Enum +from typing import Dict, List, Optional, Tuple, Union +from urllib.parse import quote + +from dateutil.parser import parse +from pydantic import SecretStr + +import unity_sds_apgs_client.models +from unity_sds_apgs_client import rest +from unity_sds_apgs_client.api_response import ApiResponse +from unity_sds_apgs_client.api_response import T as ApiResponseT +from unity_sds_apgs_client.configuration import Configuration +from unity_sds_apgs_client.exceptions import ApiException, ApiValueError + +RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]] + + +class ApiClient: + """Generic API client for OpenAPI client library builds. + + OpenAPI generic API client. This client handles the client- + server communication, and is invariant across implementations. Specifics of + the methods and models for each application are generated from the OpenAPI + templates. + + :param configuration: .Configuration object for this client + :param header_name: a header to pass when making calls to the API. + :param header_value: a header value to pass when making calls to + the API. + :param cookie: a cookie to include in the header when making calls + to the API + """ + + PRIMITIVE_TYPES = (float, bool, bytes, str, int) + NATIVE_TYPES_MAPPING = { + "int": int, + "long": int, # TODO remove as only py3 is supported? + "float": float, + "str": str, + "bool": bool, + "date": datetime.date, + "datetime": datetime.datetime, + "object": object, + } + _pool = None + + def __init__( + self, configuration=None, header_name=None, header_value=None, cookie=None + ) -> None: + # use default configuration if none is provided + if configuration is None: + configuration = Configuration.get_default() + self.configuration = configuration + + self.rest_client = rest.RESTClientObject(configuration) + self.default_headers = {} + if header_name is not None: + self.default_headers[header_name] = header_value + self.cookie = cookie + # Set default User-Agent. + self.user_agent = "OpenAPI-Generator/1.0.0/python" + self.client_side_validation = configuration.client_side_validation + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def user_agent(self): + """User agent for this API client""" + return self.default_headers["User-Agent"] + + @user_agent.setter + def user_agent(self, value): + self.default_headers["User-Agent"] = value + + def set_default_header(self, header_name, header_value): + self.default_headers[header_name] = header_value + + _default = None + + @classmethod + def get_default(cls): + """Return new instance of ApiClient. + + This method returns newly created, based on default constructor, + object of ApiClient class or returns a copy of default + ApiClient. + + :return: The ApiClient object. + """ + if cls._default is None: + cls._default = ApiClient() + return cls._default + + @classmethod + def set_default(cls, default): + """Set default instance of ApiClient. + + It stores default ApiClient. + + :param default: object of ApiClient. + """ + cls._default = default + + def param_serialize( + self, + method, + resource_path, + path_params=None, + query_params=None, + header_params=None, + body=None, + post_params=None, + files=None, + auth_settings=None, + collection_formats=None, + _host=None, + _request_auth=None, + ) -> RequestSerialized: + """Builds the HTTP request params needed by the request. + :param method: Method to call. + :param resource_path: Path to method endpoint. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the authentication + in the spec for a single request. + :return: tuple of form (path, http_method, query_params, header_params, + body, post_params, files) + """ + + config = self.configuration + + # header parameters + header_params = header_params or {} + header_params.update(self.default_headers) + if self.cookie: + header_params["Cookie"] = self.cookie + if header_params: + header_params = self.sanitize_for_serialization(header_params) + header_params = dict( + self.parameters_to_tuples(header_params, collection_formats) + ) + + # path parameters + if path_params: + path_params = self.sanitize_for_serialization(path_params) + path_params = self.parameters_to_tuples(path_params, collection_formats) + for k, v in path_params: + # specified safe chars, encode everything + resource_path = resource_path.replace( + "{%s}" % k, quote(str(v), safe=config.safe_chars_for_path_param) + ) + + # post parameters + if post_params or files: + post_params = post_params if post_params else [] + post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples(post_params, collection_formats) + if files: + post_params.extend(self.files_parameters(files)) + + # auth setting + self.update_params_for_auth( + header_params, + query_params, + auth_settings, + resource_path, + method, + body, + request_auth=_request_auth, + ) + + # body + if body: + body = self.sanitize_for_serialization(body) + + # request url + if _host is None or self.configuration.ignore_operation_servers: + url = self.configuration.host + resource_path + else: + # use server/host defined in path or operation instead + url = _host + resource_path + + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + url_query = self.parameters_to_url_query(query_params, collection_formats) + url += "?" + url_query + + return method, url, header_params, body, post_params + + def call_api( + self, + method, + url, + header_params=None, + body=None, + post_params=None, + _request_timeout=None, + ) -> rest.RESTResponse: + """Makes the HTTP request (synchronous) + :param method: Method to call. + :param url: Path to method endpoint. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param _request_timeout: timeout setting for this request. + :return: RESTResponse + """ + + try: + # perform request and return response + response_data = self.rest_client.request( + method, + url, + headers=header_params, + body=body, + post_params=post_params, + _request_timeout=_request_timeout, + ) + + except ApiException as e: + raise e + + return response_data + + def response_deserialize( + self, + response_data: rest.RESTResponse, + response_types_map: Optional[Dict[str, ApiResponseT]] = None, + ) -> ApiResponse[ApiResponseT]: + """Deserializes response into an object. + :param response_data: RESTResponse object to be deserialized. + :param response_types_map: dict of response types. + :return: ApiResponse + """ + + msg = "RESTResponse.read() must be called before passing it to response_deserialize()" + assert response_data.data is not None, msg + + response_type = response_types_map.get(str(response_data.status), None) + if ( + not response_type + and isinstance(response_data.status, int) + and 100 <= response_data.status <= 599 + ): + # if not found, look for '1XX', '2XX', etc. + response_type = response_types_map.get( + str(response_data.status)[0] + "XX", None + ) + + # deserialize response data + response_text = None + return_data = None + try: + if response_type == "bytearray": + return_data = response_data.data + elif response_type == "file": + return_data = self.__deserialize_file(response_data) + elif response_type is not None: + match = None + content_type = response_data.getheader("content-type") + if content_type is not None: + match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) + encoding = match.group(1) if match else "utf-8" + response_text = response_data.data.decode(encoding) + return_data = self.deserialize( + response_text, response_type, content_type + ) + finally: + if not 200 <= response_data.status <= 299: + raise ApiException.from_response( + http_resp=response_data, + body=response_text, + data=return_data, + ) + + return ApiResponse( + status_code=response_data.status, + data=return_data, + headers=response_data.getheaders(), + raw_data=response_data.data, + ) + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is SecretStr, return obj.get_secret_value() + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is OpenAPI model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + elif isinstance(obj, Enum): + return obj.value + elif isinstance(obj, SecretStr): + return obj.get_secret_value() + elif isinstance(obj, self.PRIMITIVE_TYPES): + return obj + elif isinstance(obj, list): + return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj] + elif isinstance(obj, tuple): + return tuple(self.sanitize_for_serialization(sub_obj) for sub_obj in obj) + elif isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + + elif isinstance(obj, dict): + obj_dict = obj + else: + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + if hasattr(obj, "to_dict") and callable(getattr(obj, "to_dict")): + obj_dict = obj.to_dict() + else: + obj_dict = obj.__dict__ + + return { + key: self.sanitize_for_serialization(val) for key, val in obj_dict.items() + } + + def deserialize( + self, response_text: str, response_type: str, content_type: Optional[str] + ): + """Deserializes response into an object. + + :param response: RESTResponse object to be deserialized. + :param response_type: class literal for + deserialized object, or string of class name. + :param content_type: content type of response. + + :return: deserialized object. + """ + + # fetch data from response object + if content_type is None: + try: + data = json.loads(response_text) + except ValueError: + data = response_text + elif content_type.startswith("application/json"): + if response_text == "": + data = "" + else: + data = json.loads(response_text) + elif content_type.startswith("text/plain"): + data = response_text + else: + raise ApiException( + status=0, reason="Unsupported content type: {0}".format(content_type) + ) + + return self.__deserialize(data, response_type) + + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. + """ + if data is None: + return None + + if isinstance(klass, str): + if klass.startswith("List["): + m = re.match(r"List\[(.*)]", klass) + assert m is not None, "Malformed List type definition" + sub_kls = m.group(1) + return [self.__deserialize(sub_data, sub_kls) for sub_data in data] + + if klass.startswith("Dict["): + m = re.match(r"Dict\[([^,]*), (.*)]", klass) + assert m is not None, "Malformed Dict type definition" + sub_kls = m.group(2) + return {k: self.__deserialize(v, sub_kls) for k, v in data.items()} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + else: + klass = getattr(unity_sds_apgs_client.models, klass) + + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + elif klass == object: + return self.__deserialize_object(data) + elif klass == datetime.date: + return self.__deserialize_date(data) + elif klass == datetime.datetime: + return self.__deserialize_datetime(data) + elif issubclass(klass, Enum): + return self.__deserialize_enum(data, klass) + else: + return self.__deserialize_model(data, klass) + + def parameters_to_tuples(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params: List[Tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == "multi": + new_params.extend((k, value) for value in v) + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + new_params.append((k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + + def parameters_to_url_query(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: URL query string (e.g. a=Hello%20World&b=123) + """ + new_params: List[Tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if isinstance(v, bool): + v = str(v).lower() + if isinstance(v, (int, float)): + v = str(v) + if isinstance(v, dict): + v = json.dumps(v) + + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == "multi": + new_params.extend((k, str(value)) for value in v) + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + new_params.append( + (k, delimiter.join(quote(str(value)) for value in v)) + ) + else: + new_params.append((k, quote(str(v)))) + + return "&".join(["=".join(map(str, item)) for item in new_params]) + + def files_parameters(self, files: Dict[str, Union[str, bytes]]): + """Builds form parameters. + + :param files: File parameters. + :return: Form parameters with files. + """ + params = [] + for k, v in files.items(): + if isinstance(v, str): + with open(v, "rb") as f: + filename = os.path.basename(f.name) + filedata = f.read() + elif isinstance(v, bytes): + filename = k + filedata = v + else: + raise ValueError("Unsupported file value") + mimetype = mimetypes.guess_type(filename)[0] or "application/octet-stream" + params.append(tuple([k, tuple([filename, filedata, mimetype])])) + return params + + def select_header_accept(self, accepts: List[str]) -> Optional[str]: + """Returns `Accept` based on an array of accepts provided. + + :param accepts: List of headers. + :return: Accept (e.g. application/json). + """ + if not accepts: + return None + + for accept in accepts: + if re.search("json", accept, re.IGNORECASE): + return accept + + return accepts[0] + + def select_header_content_type(self, content_types): + """Returns `Content-Type` based on an array of content_types provided. + + :param content_types: List of content-types. + :return: Content-Type (e.g. application/json). + """ + if not content_types: + return None + + for content_type in content_types: + if re.search("json", content_type, re.IGNORECASE): + return content_type + + return content_types[0] + + def update_params_for_auth( + self, + headers, + queries, + auth_settings, + resource_path, + method, + body, + request_auth=None, + ) -> None: + """Updates header and query params based on authentication setting. + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :param auth_settings: Authentication setting identifiers list. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param request_auth: if set, the provided settings will + override the token in the configuration. + """ + if not auth_settings: + return + + if request_auth: + self._apply_auth_params( + headers, queries, resource_path, method, body, request_auth + ) + else: + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + self._apply_auth_params( + headers, queries, resource_path, method, body, auth_setting + ) + + def _apply_auth_params( + self, headers, queries, resource_path, method, body, auth_setting + ) -> None: + """Updates the request parameters based on a single auth_setting + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param auth_setting: auth settings for the endpoint + """ + if auth_setting["in"] == "cookie": + headers["Cookie"] = auth_setting["value"] + elif auth_setting["in"] == "header": + if auth_setting["type"] != "http-signature": + headers[auth_setting["key"]] = auth_setting["value"] + elif auth_setting["in"] == "query": + queries.append((auth_setting["key"], auth_setting["value"])) + else: + raise ApiValueError("Authentication token must be in `query` or `header`") + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + handle file downloading + save response body into a tmp file and return the instance + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + m = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?', content_disposition) + assert m is not None, "Unexpected 'content-disposition' header value" + filename = m.group(1) + path = os.path.join(os.path.dirname(path), filename) + + with open(path, "wb") as f: + f.write(response.data) + + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return str(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return an original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, reason="Failed to parse `{0}` as date object".format(string) + ) + + def __deserialize_datetime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=("Failed to parse `{0}` as datetime object".format(string)), + ) + + def __deserialize_enum(self, data, klass): + """Deserializes primitive type to enum. + + :param data: primitive type. + :param klass: class literal. + :return: enum value. + """ + try: + return klass(data) + except ValueError: + raise rest.ApiException( + status=0, reason=("Failed to parse `{0}` as `{1}`".format(data, klass)) + ) + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + + return klass.from_dict(data) diff --git a/libs/app-package-build-client/unity_sds_apgs_client/api_response.py b/libs/app-package-build-client/unity_sds_apgs_client/api_response.py new file mode 100644 index 0000000..ca801da --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/api_response.py @@ -0,0 +1,22 @@ +"""API response object.""" + +from __future__ import annotations + +from typing import Generic, Mapping, Optional, TypeVar + +from pydantic import BaseModel, Field, StrictBytes, StrictInt + +T = TypeVar("T") + + +class ApiResponse(BaseModel, Generic[T]): + """ + API response object + """ + + status_code: StrictInt = Field(description="HTTP status code") + headers: Optional[Mapping[str, str]] = Field(None, description="HTTP headers") + data: T = Field(description="Deserialized data given the data type") + raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") + + model_config = {"arbitrary_types_allowed": True} diff --git a/libs/app-package-build-client/unity_sds_apgs_client/configuration.py b/libs/app-package-build-client/unity_sds_apgs_client/configuration.py new file mode 100644 index 0000000..36dd0ed --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/configuration.py @@ -0,0 +1,476 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import copy +import http.client as httplib +import logging +import multiprocessing +import sys +from logging import FileHandler +from typing import Optional + +import urllib3 + +JSON_SCHEMA_VALIDATION_KEYWORDS = { + "multipleOf", + "maximum", + "exclusiveMaximum", + "minimum", + "exclusiveMinimum", + "maxLength", + "minLength", + "pattern", + "maxItems", + "minItems", +} + + +class Configuration: + """This class contains various settings of the API client. + + :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. + :param api_key: Dict to store API key(s). + Each entry in the dict specifies an API key. + The dict key is the name of the security scheme in the OAS specification. + The dict value is the API key secret. + :param api_key_prefix: Dict to store API prefix (e.g. Bearer). + The dict key is the name of the security scheme in the OAS specification. + The dict value is an API key prefix when generating the auth data. + :param username: Username for HTTP basic authentication. + :param password: Password for HTTP basic authentication. + :param access_token: Access token. + :param server_index: Index to servers configuration. + :param server_variables: Mapping with string values to replace variables in + templated server configuration. The validation of enums is performed for + variables with defined enum values before. + :param server_operation_index: Mapping from operation ID to an index to server + configuration. + :param server_operation_variables: Mapping from operation ID to a mapping with + string values to replace variables in templated server configuration. + The validation of enums is performed for variables with defined enum + values before. + :param ssl_ca_cert: str - the path to a file of concatenated CA certificates + in PEM format. + :param retries: Number of retries for API requests. + + :Example: + """ + + _default = None + + def __init__( + self, + host=None, + api_key=None, + api_key_prefix=None, + username=None, + password=None, + access_token=None, + server_index=None, + server_variables=None, + server_operation_index=None, + server_operation_variables=None, + ignore_operation_servers=False, + ssl_ca_cert=None, + retries=None, + *, + debug: Optional[bool] = None + ) -> None: + """Constructor""" + self._base_path = "http://api.dev.mdps.mcp.nasa.gov" if host is None else host + """Default Base url + """ + self.server_index = 0 if server_index is None and host is None else server_index + self.server_operation_index = server_operation_index or {} + """Default server index + """ + self.server_variables = server_variables or {} + self.server_operation_variables = server_operation_variables or {} + """Default server variables + """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ + self.temp_folder_path = None + """Temp file folder for downloading files + """ + # Authentication Settings + self.api_key = {} + if api_key: + self.api_key = api_key + """dict to store API key(s) + """ + self.api_key_prefix = {} + if api_key_prefix: + self.api_key_prefix = api_key_prefix + """dict to store API prefix (e.g. Bearer) + """ + self.refresh_api_key_hook = None + """function hook to refresh API key if expired + """ + self.username = username + """Username for HTTP basic authentication + """ + self.password = password + """Password for HTTP basic authentication + """ + self.access_token = access_token + """Access token + """ + self.logger = {} + """Logging Settings + """ + self.logger["package_logger"] = logging.getLogger("unity_sds_apgs_client") + self.logger["urllib3_logger"] = logging.getLogger("urllib3") + self.logger_format = "%(asctime)s %(levelname)s %(message)s" + """Log format + """ + self.logger_stream_handler = None + """Log stream handler + """ + self.logger_file_handler: Optional[FileHandler] = None + """Log file handler + """ + self.logger_file = None + """Debug file location + """ + if debug is not None: + self.debug = debug + else: + self.__debug = False + """Debug switch + """ + + self.verify_ssl = True + """SSL/TLS verification + Set this to false to skip verifying SSL certificate when calling API + from https server. + """ + self.ssl_ca_cert = ssl_ca_cert + """Set this to customize the certificate file to verify the peer. + """ + self.cert_file = None + """client certificate file + """ + self.key_file = None + """client key file + """ + self.assert_hostname = None + """Set this to True/False to enable/disable SSL hostname verification. + """ + self.tls_server_name = None + """SSL/TLS Server Name Indication (SNI) + Set this to the SNI value expected by the server. + """ + + self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 + """urllib3 connection pool's maximum number of connections saved + per pool. urllib3 uses 1 connection as default value, but this is + not the best value when you are making a lot of possibly parallel + requests to the same host, which is often the case here. + cpu_count * 5 is used as default value to increase performance. + """ + + self.proxy: Optional[str] = None + """Proxy URL + """ + self.proxy_headers = None + """Proxy headers + """ + self.safe_chars_for_path_param = "" + """Safe chars for path_param + """ + self.retries = retries + """Adding retries to override urllib3 default value 3 + """ + # Enable client side validation + self.client_side_validation = True + + self.socket_options = None + """Options to pass down to the underlying urllib3 socket + """ + + self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" + """datetime format + """ + + self.date_format = "%Y-%m-%d" + """date format + """ + + def __deepcopy__(self, memo): + cls = self.__class__ + result = cls.__new__(cls) + memo[id(self)] = result + for k, v in self.__dict__.items(): + if k not in ("logger", "logger_file_handler"): + setattr(result, k, copy.deepcopy(v, memo)) + # shallow copy of loggers + result.logger = copy.copy(self.logger) + # use setters to configure loggers + result.logger_file = self.logger_file + result.debug = self.debug + return result + + def __setattr__(self, name, value): + object.__setattr__(self, name, value) + + @classmethod + def set_default(cls, default): + """Set default instance of configuration. + + It stores default configuration, which can be + returned by get_default_copy method. + + :param default: object of Configuration + """ + cls._default = default + + @classmethod + def get_default_copy(cls): + """Deprecated. Please use `get_default` instead. + + Deprecated. Please use `get_default` instead. + + :return: The configuration object. + """ + return cls.get_default() + + @classmethod + def get_default(cls): + """Return the default configuration. + + This method returns newly created, based on default constructor, + object of Configuration class or returns a copy of default + configuration. + + :return: The configuration object. + """ + if cls._default is None: + cls._default = Configuration() + return cls._default + + @property + def logger_file(self): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + return self.__logger_file + + @logger_file.setter + def logger_file(self, value): + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + self.__logger_file = value + if self.__logger_file: + # If set logging file, + # then add file handler and remove stream handler. + self.logger_file_handler = logging.FileHandler(self.__logger_file) + self.logger_file_handler.setFormatter(self.logger_formatter) + for _, logger in self.logger.items(): + logger.addHandler(self.logger_file_handler) + + @property + def debug(self): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + return self.__debug + + @debug.setter + def debug(self, value): + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + self.__debug = value + if self.__debug: + # if debug status is True, turn on debug logging + for _, logger in self.logger.items(): + logger.setLevel(logging.DEBUG) + # turn on httplib debug + httplib.HTTPConnection.debuglevel = 1 + else: + # if debug status is False, turn off debug logging, + # setting log level to default `logging.WARNING` + for _, logger in self.logger.items(): + logger.setLevel(logging.WARNING) + # turn off httplib debug + httplib.HTTPConnection.debuglevel = 0 + + @property + def logger_format(self): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + return self.__logger_format + + @logger_format.setter + def logger_format(self, value): + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + self.__logger_format = value + self.logger_formatter = logging.Formatter(self.__logger_format) + + def get_api_key_with_prefix(self, identifier, alias=None): + """Gets API key (with prefix if set). + + :param identifier: The identifier of apiKey. + :param alias: The alternative identifier of apiKey. + :return: The token for api key authentication. + """ + if self.refresh_api_key_hook is not None: + self.refresh_api_key_hook(self) + key = self.api_key.get( + identifier, self.api_key.get(alias) if alias is not None else None + ) + if key: + prefix = self.api_key_prefix.get(identifier) + if prefix: + return "%s %s" % (prefix, key) + else: + return key + + def get_basic_auth_token(self): + """Gets HTTP basic authentication header (string). + + :return: The token for basic HTTP authentication. + """ + username = "" + if self.username is not None: + username = self.username + password = "" + if self.password is not None: + password = self.password + return urllib3.util.make_headers(basic_auth=username + ":" + password).get( + "authorization" + ) + + def auth_settings(self): + """Gets Auth Settings dict for api client. + + :return: The Auth Settings information dict. + """ + auth = {} + if self.access_token is not None: + auth["bearerAuth"] = { + "type": "bearer", + "in": "header", + "key": "Authorization", + "value": "Bearer " + self.access_token, + } + return auth + + def to_debug_report(self): + """Gets the essential information for debugging. + + :return: The report for debugging. + """ + return ( + "Python SDK Debug Report:\n" + "OS: {env}\n" + "Python Version: {pyversion}\n" + "Version of the API: 1.0.0\n" + "SDK Package Version: 1.0.0".format(env=sys.platform, pyversion=sys.version) + ) + + def get_host_settings(self): + """Gets an array of host settings + + :return: An array of host settings + """ + return [ + { + "url": "api.dev.mdps.mcp.nasa.gov", + "description": "No description provided", + } + ] + + def get_host_from_settings(self, index, variables=None, servers=None): + """Gets host URL based on the index and variables + :param index: array index of the host settings + :param variables: hash of variable and the corresponding value + :param servers: an array of host settings or None + :return: URL based on host settings + """ + if index is None: + return self._base_path + + variables = {} if variables is None else variables + servers = self.get_host_settings() if servers is None else servers + + try: + server = servers[index] + except IndexError: + raise ValueError( + "Invalid index {0} when selecting the host settings. " + "Must be less than {1}".format(index, len(servers)) + ) + + url = server["url"] + + # go through variables and replace placeholders + for variable_name, variable in server.get("variables", {}).items(): + used_value = variables.get(variable_name, variable["default_value"]) + + if "enum_values" in variable and used_value not in variable["enum_values"]: + raise ValueError( + "The variable `{0}` in the host URL has invalid value " + "{1}. Must be {2}.".format( + variable_name, variables[variable_name], variable["enum_values"] + ) + ) + + url = url.replace("{" + variable_name + "}", used_value) + + return url + + @property + def host(self): + """Return generated host.""" + return self.get_host_from_settings( + self.server_index, variables=self.server_variables + ) + + @host.setter + def host(self, value): + """Fix base path.""" + self._base_path = value + self.server_index = None diff --git a/libs/app-package-build-client/unity_sds_apgs_client/exceptions.py b/libs/app-package-build-client/unity_sds_apgs_client/exceptions.py new file mode 100644 index 0000000..66e65ee --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/exceptions.py @@ -0,0 +1,200 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + +from typing import Any, Optional + +from typing_extensions import Self + + +class OpenApiException(Exception): + """The base exception class for all OpenAPIExceptions""" + + +class ApiTypeError(OpenApiException, TypeError): + def __init__( + self, msg, path_to_item=None, valid_classes=None, key_type=None + ) -> None: + """Raises an exception for TypeErrors + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list): a list of keys an indices to get to the + current_item + None if unset + valid_classes (tuple): the primitive classes that current item + should be an instance of + None if unset + key_type (bool): False if our value is a value in a dict + True if it is a key in a dict + False if our item is an item in a list + None if unset + """ + self.path_to_item = path_to_item + self.valid_classes = valid_classes + self.key_type = key_type + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiTypeError, self).__init__(full_msg) + + +class ApiValueError(OpenApiException, ValueError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list) the path to the exception in the + received_data dict. None if unset + """ + + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiValueError, self).__init__(full_msg) + + +class ApiAttributeError(OpenApiException, AttributeError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Raised when an attribute reference or assignment fails. + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiAttributeError, self).__init__(full_msg) + + +class ApiKeyError(OpenApiException, KeyError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiKeyError, self).__init__(full_msg) + + +class ApiException(OpenApiException): + + def __init__( + self, + status=None, + reason=None, + http_resp=None, + *, + body: Optional[str] = None, + data: Optional[Any] = None, + ) -> None: + self.status = status + self.reason = reason + self.body = body + self.data = data + self.headers = None + + if http_resp: + if self.status is None: + self.status = http_resp.status + if self.reason is None: + self.reason = http_resp.reason + if self.body is None: + try: + self.body = http_resp.data.decode("utf-8") + except Exception: + pass + self.headers = http_resp.getheaders() + + @classmethod + def from_response( + cls, + *, + http_resp, + body: Optional[str], + data: Optional[Any], + ) -> Self: + if http_resp.status == 400: + raise BadRequestException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 401: + raise UnauthorizedException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 403: + raise ForbiddenException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 404: + raise NotFoundException(http_resp=http_resp, body=body, data=data) + + if 500 <= http_resp.status <= 599: + raise ServiceException(http_resp=http_resp, body=body, data=data) + raise ApiException(http_resp=http_resp, body=body, data=data) + + def __str__(self): + """Custom error messages for exception""" + error_message = "({0})\n" "Reason: {1}\n".format(self.status, self.reason) + if self.headers: + error_message += "HTTP response headers: {0}\n".format(self.headers) + + if self.data or self.body: + error_message += "HTTP response body: {0}\n".format(self.data or self.body) + + return error_message + + +class BadRequestException(ApiException): + pass + + +class NotFoundException(ApiException): + pass + + +class UnauthorizedException(ApiException): + pass + + +class ForbiddenException(ApiException): + pass + + +class ServiceException(ApiException): + pass + + +def render_path(path_to_item): + """Returns a string representation of a path""" + result = "" + for pth in path_to_item: + if isinstance(pth, int): + result += "[{0}]".format(pth) + else: + result += "['{0}']".format(pth) + return result diff --git a/libs/app-package-build-client/unity_sds_apgs_client/models/__init__.py b/libs/app-package-build-client/unity_sds_apgs_client/models/__init__.py new file mode 100644 index 0000000..ea680ed --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/models/__init__.py @@ -0,0 +1,19 @@ +# coding: utf-8 + +# flake8: noqa +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +# import models into model package +from unity_sds_apgs_client.models.ads_acb_mcp_clone_get200_response import ( + AdsAcbMcpCloneGet200Response, +) diff --git a/libs/app-package-build-client/unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py b/libs/app-package-build-client/unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py new file mode 100644 index 0000000..8c9749d --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/models/ads_acb_mcp_clone_get200_response.py @@ -0,0 +1,89 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Dict, List, Optional, Set + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing_extensions import Self + + +class AdsAcbMcpCloneGet200Response(BaseModel): + """ + AdsAcbMcpCloneGet200Response + """ # noqa: E501 + + clone_url: Optional[StrictStr] = None + log_group_name: Optional[StrictStr] = None + __properties: ClassVar[List[str]] = ["clone_url", "log_group_name"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AdsAcbMcpCloneGet200Response from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AdsAcbMcpCloneGet200Response from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + { + "clone_url": obj.get("clone_url"), + "log_group_name": obj.get("log_group_name"), + } + ) + return _obj diff --git a/libs/app-package-build-client/unity_sds_apgs_client/py.typed b/libs/app-package-build-client/unity_sds_apgs_client/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/libs/app-package-build-client/unity_sds_apgs_client/rest.py b/libs/app-package-build-client/unity_sds_apgs_client/rest.py new file mode 100644 index 0000000..328b8d4 --- /dev/null +++ b/libs/app-package-build-client/unity_sds_apgs_client/rest.py @@ -0,0 +1,244 @@ +# coding: utf-8 + +""" + App Package API + + Service for application package generation + + The version of the OpenAPI document: 1.0.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import io +import json +import re +import ssl + +import urllib3 + +from unity_sds_apgs_client.exceptions import ApiException, ApiValueError + +SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"} +RESTResponseType = urllib3.HTTPResponse + + +def is_socks_proxy_url(url): + if url is None: + return False + split_section = url.split("://") + if len(split_section) < 2: + return False + else: + return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES + + +class RESTResponse(io.IOBase): + + def __init__(self, resp) -> None: + self.response = resp + self.status = resp.status + self.reason = resp.reason + self.data = None + + def read(self): + if self.data is None: + self.data = self.response.data + return self.data + + def getheaders(self): + """Returns a dictionary of the response headers.""" + return self.response.headers + + def getheader(self, name, default=None): + """Returns a given response header.""" + return self.response.headers.get(name, default) + + +class RESTClientObject: + + def __init__(self, configuration) -> None: + # urllib3.PoolManager will pass all kw parameters to connectionpool + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 + # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 + + # cert_reqs + if configuration.verify_ssl: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + + pool_args = { + "cert_reqs": cert_reqs, + "ca_certs": configuration.ssl_ca_cert, + "cert_file": configuration.cert_file, + "key_file": configuration.key_file, + } + if configuration.assert_hostname is not None: + pool_args["assert_hostname"] = configuration.assert_hostname + + if configuration.retries is not None: + pool_args["retries"] = configuration.retries + + if configuration.tls_server_name: + pool_args["server_hostname"] = configuration.tls_server_name + + if configuration.socket_options is not None: + pool_args["socket_options"] = configuration.socket_options + + if configuration.connection_pool_maxsize is not None: + pool_args["maxsize"] = configuration.connection_pool_maxsize + + # https pool manager + self.pool_manager: urllib3.PoolManager + + if configuration.proxy: + if is_socks_proxy_url(configuration.proxy): + from urllib3.contrib.socks import SOCKSProxyManager + + pool_args["proxy_url"] = configuration.proxy + pool_args["headers"] = configuration.proxy_headers + self.pool_manager = SOCKSProxyManager(**pool_args) + else: + pool_args["proxy_url"] = configuration.proxy + pool_args["proxy_headers"] = configuration.proxy_headers + self.pool_manager = urllib3.ProxyManager(**pool_args) + else: + self.pool_manager = urllib3.PoolManager(**pool_args) + + def request( + self, + method, + url, + headers=None, + body=None, + post_params=None, + _request_timeout=None, + ): + """Perform requests. + + :param method: http request method + :param url: http request url + :param headers: http request headers + :param body: request json body, for `application/json` + :param post_params: request post parameters, + `application/x-www-form-urlencoded` + and `multipart/form-data` + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + """ + method = method.upper() + assert method in ["GET", "HEAD", "DELETE", "POST", "PUT", "PATCH", "OPTIONS"] + + if post_params and body: + raise ApiValueError( + "body parameter cannot be used with post_params parameter." + ) + + post_params = post_params or {} + headers = headers or {} + + timeout = None + if _request_timeout: + if isinstance(_request_timeout, (int, float)): + timeout = urllib3.Timeout(total=_request_timeout) + elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2: + timeout = urllib3.Timeout( + connect=_request_timeout[0], read=_request_timeout[1] + ) + + try: + # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` + if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]: + + # no content type provided or payload is json + content_type = headers.get("Content-Type") + if not content_type or re.search("json", content_type, re.IGNORECASE): + request_body = None + if body is not None: + request_body = json.dumps(body) + r = self.pool_manager.request( + method, + url, + body=request_body, + timeout=timeout, + headers=headers, + preload_content=False, + ) + elif content_type == "application/x-www-form-urlencoded": + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=False, + timeout=timeout, + headers=headers, + preload_content=False, + ) + elif content_type == "multipart/form-data": + # must del headers['Content-Type'], or the correct + # Content-Type which generated by urllib3 will be + # overwritten. + del headers["Content-Type"] + # Ensures that dict objects are serialized + post_params = [ + (a, json.dumps(b)) if isinstance(b, dict) else (a, b) + for a, b in post_params + ] + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=True, + timeout=timeout, + headers=headers, + preload_content=False, + ) + # Pass a `string` parameter directly in the body to support + # other content types than JSON when `body` argument is + # provided in serialized form. + elif isinstance(body, str) or isinstance(body, bytes): + r = self.pool_manager.request( + method, + url, + body=body, + timeout=timeout, + headers=headers, + preload_content=False, + ) + elif headers["Content-Type"] == "text/plain" and isinstance(body, bool): + request_body = "true" if body else "false" + r = self.pool_manager.request( + method, + url, + body=request_body, + preload_content=False, + timeout=timeout, + headers=headers, + ) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided + arguments. Please check that your arguments match + declared content type.""" + raise ApiException(status=0, reason=msg) + # For `GET`, `HEAD` + else: + r = self.pool_manager.request( + method, + url, + fields={}, + timeout=timeout, + headers=headers, + preload_content=False, + ) + except urllib3.exceptions.SSLError as e: + msg = "\n".join([type(e).__name__, str(e)]) + raise ApiException(status=0, reason=msg) + + return RESTResponse(r) diff --git a/schemas/app-package-service/.openapi-generator-ignore b/schemas/app-package-service/.openapi-generator-ignore new file mode 100644 index 0000000..7484ee5 --- /dev/null +++ b/schemas/app-package-service/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/schemas/app-package-service/.openapi-generator/FILES b/schemas/app-package-service/.openapi-generator/FILES new file mode 100644 index 0000000..69e43c4 --- /dev/null +++ b/schemas/app-package-service/.openapi-generator/FILES @@ -0,0 +1,29 @@ +.github/workflows/python.yml +.gitignore +.gitlab-ci.yml +.openapi-generator-ignore +.travis.yml +README.md +docs/AdsAcbMcpCloneGet200Response.md +docs/DefaultApi.md +git_push.sh +openapi_client/__init__.py +openapi_client/api/__init__.py +openapi_client/api/default_api.py +openapi_client/api_client.py +openapi_client/api_response.py +openapi_client/configuration.py +openapi_client/exceptions.py +openapi_client/models/__init__.py +openapi_client/models/ads_acb_mcp_clone_get200_response.py +openapi_client/py.typed +openapi_client/rest.py +pyproject.toml +requirements.txt +setup.cfg +setup.py +test-requirements.txt +test/__init__.py +test/test_ads_acb_mcp_clone_get200_response.py +test/test_default_api.py +tox.ini diff --git a/schemas/app-package-service/.openapi-generator/VERSION b/schemas/app-package-service/.openapi-generator/VERSION new file mode 100644 index 0000000..1985849 --- /dev/null +++ b/schemas/app-package-service/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.7.0 diff --git a/schemas/app-package-service/README.md b/schemas/app-package-service/README.md new file mode 100644 index 0000000..acb61ce --- /dev/null +++ b/schemas/app-package-service/README.md @@ -0,0 +1,5 @@ +# Build Instructions +``` +openapi-generator generate -i app-package.api.yaml -g python -o ../../libs/app-package-build-client --package-name unity_sds_apgs_client + +``` diff --git a/schemas/app-package-service/app-package.api.yaml b/schemas/app-package-service/app-package.api.yaml new file mode 100644 index 0000000..8086b03 --- /dev/null +++ b/schemas/app-package-service/app-package.api.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: App Package API + description: Service for application package generation + +components: + securitySchemes: + bearerAuth: # arbitrary name for the security scheme + type: http + scheme: bearer + +security: + - bearerAuth: [] + +servers: + - url: api.dev.mdps.mcp.nasa.gov + +paths: + /ads-acb/mcp-clone: + get: + summary: Begins the MCP Clone process + parameters: + - in: header + name: clone_url + schema: + type: string + required: true + + responses: + '200': + description: Successfully submitted a job + content: + application/json: + schema: + type: object + properties: + clone_url: + type: string + log_group_name: + type: string