{"id":1990605,"url":"https://github.com/cloudify-cosmo/wagon","last_synced_at":"2026-04-06T00:05:48.820Z","repository":{"id":29660384,"uuid":"33202327","full_name":"cloudify-cosmo/wagon","owner":"cloudify-cosmo","description":"Creates Wheel based archives to allow portable offline installation of Python packages and their dependencies","archived":false,"fork":false,"pushed_at":"2026-01-18T13:16:54.000Z","size":395,"stargazers_count":120,"open_issues_count":6,"forks_count":15,"subscribers_count":38,"default_branch":"master","last_synced_at":"2026-01-18T20:49:50.415Z","etag":null,"topics":["packaging","python","python-wheel","wagon","wheel","wheels"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cloudify-cosmo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-03-31T18:26:56.000Z","updated_at":"2026-01-18T13:16:58.000Z","dependencies_parsed_at":"2024-01-20T15:54:23.790Z","dependency_job_id":"54980bd2-9e99-4851-b4e1-ec3c3facd918","html_url":"https://github.com/cloudify-cosmo/wagon","commit_stats":{"total_commits":153,"total_committers":19,"mean_commits":8.052631578947368,"dds":0.4444444444444444,"last_synced_commit":"17e55c90cffecc6f821a4f8f60f6f4407d01c8f4"},"previous_names":["cloudify-cosmo/wheelr"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/cloudify-cosmo/wagon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Fwagon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Fwagon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Fwagon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Fwagon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudify-cosmo","download_url":"https://codeload.github.com/cloudify-cosmo/wagon/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudify-cosmo%2Fwagon/sbom","scorecard":{"id":292984,"data":{"date":"2025-08-11","repo":{"name":"github.com/cloudify-cosmo/wagon","commit":"85769ca060d7440e2b73479fc9bdc46f6e9c45b4"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.8,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T18:45:56.056Z","repository_id":29660384,"created_at":"2025-08-17T18:45:56.057Z","updated_at":"2025-08-17T18:45:56.057Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31454200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T21:22:52.476Z","status":"ssl_error","status_checked_at":"2026-04-05T21:22:51.943Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["packaging","python","python-wheel","wagon","wheel","wheels"],"created_at":"2024-01-20T15:37:54.711Z","updated_at":"2026-04-06T00:05:48.802Z","avatar_url":"https://github.com/cloudify-cosmo.png","language":"Python","readme":"# Wagon\n\n[![Build Status](https://travis-ci.org/cloudify-cosmo/wagon.svg?branch=master)](https://travis-ci.org/cloudify-cosmo/wagon)\n[![Build status](https://ci.appveyor.com/api/projects/status/xf1hp1bekf3qhtr8/branch/master?svg=true)](https://ci.appveyor.com/project/Cloudify/wagon/branch/master)\n[![PyPI version](http://img.shields.io/pypi/v/wagon.svg)](https://pypi.python.org/pypi/wagon)\n[![Supported Python Versions](https://img.shields.io/pypi/pyversions/wagon.svg)](https://img.shields.io/pypi/pyversions/wagon.svg)\n[![Requirements Status](https://requires.io/github/cloudify-cosmo/wagon/requirements.svg?branch=master)](https://requires.io/github/cloudify-cosmo/wagon/requirements/?branch=master)\n[![Code Coverage](https://codecov.io/github/cloudify-cosmo/wagon/coverage.svg?branch=master)](https://codecov.io/github/cloudify-cosmo/wagon?branch=master)\n[![Code Quality](https://landscape.io/github/cloudify-cosmo/wagon/master/landscape.svg?style=flat)](https://landscape.io/github/cloudify-cosmo/wagon)\n[![Is Wheel](https://img.shields.io/pypi/wheel/wagon.svg?style=flat)](https://pypi.python.org/pypi/wagon)\n\n\nA wagon (also spelt waggon in British and Commonwealth English) is a heavy four-wheeled vehicle pulled by draught animals, used for transporting goods, commodities, agricultural materials, supplies, and sometimes people. Wagons are distinguished from carts, which have two wheels, and from lighter four-wheeled vehicles primarily for carrying people, such as carriages.\n\nor.. it is just a set of (Python) Wheels.\n\nNOTE: To accommodate for the inconsistencies between wagon and pip, and to allow for additional required functionality, we will have to perform breaking changes until we can release v1.0.0. Please make sure you hardcode your wagon versions up until then.\n\n## Incentive\n\nCloudify Plugins are packaged as sets of Python [Wheels](https://packaging.python.org/en/latest/distributing.html#wheels) in tar.gz/zip archives and so we needed a tool to create such entities; hence, Wagon.\n\n\n## Requirements\n\n* Wagon requires pip 1.4+ to work as this is the first version of pip to support Wheels.\n* Wagon supports Linux, Windows and OSX on Python 2.7 and 3.4+. Python 2.5 will not be supported as it is not supported by pip. Python 2.6.x is not longer supported as wheel itself doesn't support it.\n* Wagon is currently tested on both Linux and Windows (via Travis and AppVeyor).\n* To be able to create Wagons of Wheels which include C extensions on Windows, you must have the [C++ Compiler for Python](http://www.microsoft.com/en-us/download/details.aspx?id=44266) installed.\n* To be able to create Wagons of Wheels which include C extensions on Linux or OSX, you must have the required compiler installed depending on your base distro. Usually:\n    * RHEL based required `gcc` and `python-devel`.\n    * Debian based require `gcc` and `python-dev`.\n    * Other linux distributions will usually require `gcc` but might require additional packages.\n    * OSX requires `gcc`.\n\n\n## Installation\n\n```shell\npip install wagon\n\n# latest development version\npip install http://github.com/cloudify-cosmo/wagon/archive/master.tar.gz\n```\n\n### Backward Compatilibity\n\nNOTE: pip 10.x breaks wagon\u003c=0.7.0 due to the removal of the `--use-wheel`. If you're using pip\u003e=10.x, please make sure you use wagon\u003e=0.8.0. Also, if you're using pip\u003c=7.x, use wagon\u003c=0.7.0.\n\nNOTE: wagon\u003e=0.7.0 drops support for Python 2.6, 3.2 and 3.3 since Wheel itself no longer supports these versions. Please use wagon\u003c=0.6.1 if you still need to support those versions.\n\n\n## Usage\n\nNOTE: Currently, Wagon allows to pass arbitrary args to `pip wheel` and `pip install`. The way in which this is implemented is inconsistent with pip's implementation (wagon just allows passing a `-a` flag for all args.) This will be changed in the future to correspond to pip's implementation. See https://github.com/cloudify-cosmo/wagon/issues/70 for more information.\n\n```bash\n$ wagon\nusage: wagon [-h] [-v] {create,install,validate,show,repair} ...\n\nCreate and install wheel based packages with their dependencies\n\npositional arguments:\n  {create,install,validate,show,repair}\n    create              Create a Wagon archive\n    install             Install a Wagon archive\n    validate            Validate a wagon archive\n    show                Print out the metadata of a wagon\n    repair              Repair a Wagon archive\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -v, --verbose         Set verbose logging level (default: False)\n\n...\n```\n\n\n### Create Packages\n\n```bash\n$ wagon create flask\n...\n\nCreating archive for flask...\nRetrieving source...\nSource is: Flask\nDownloading Wheels for Flask...\nCollecting Flask\nUsing cached Flask-0.12-py2.py3-none-any.whl\nSaved /tmp/tmpcYHwh0/Flask/wheels/Flask-0.12-py2.py3-none-any.whl\nCollecting itsdangerous\u003e=0.21 (from Flask)\nSaved /tmp/tmpcYHwh0/Flask/wheels/itsdangerous-0.24-cp27-none-any.whl\nCollecting click\u003e=2.0 (from Flask)\nUsing cached click-6.7-py2.py3-none-any.whl\nSaved /tmp/tmpcYHwh0/Flask/wheels/click-6.7-py2.py3-none-any.whl\n...\nSkipping MarkupSafe, due to already being wheel.\nPlatform is: linux_x86_64\nGenerating Metadata...\nWriting metadata to file: /tmp/tmpcYHwh0/Flask/package.json\nCreating tgz archive: ./Flask-0.12-py27-none-linux_x86_64.wgn...\nRemoving work directory...\nWagon created successfully at: ./Flask-0.12-py27-none-linux_x86_64.wgn\n\n...\n```\n\n#### Requirement Files\n\nNOTE: Beginning with `Wagon 0.5.0`, Wagon no longer looks up requirement files within archives or in the local directory when creating wagons. You must expclitly specify requirement files.\n\nYou can provide multiple requirement files to be resolved by using the `-r` flag (multiple times).\n\n#### Editable Mode\n\nWagon doesn't currently provide a way for packaging packages that are in editable mode.\nSo, for instance, providing a `dev-requirements` file which contains a `-e DEPENDENCY` requirement will not be taken into consideration. This is not related to wagon but rather to the default `pip wheel` implementation stating that it will be \"Skipping bdist_wheel for #PACKAGE#, due to being editable\".\n\n\n### Install Packages\n\n```bash\n$ wagon install Flask-0.12-py27-none-linux_x86_64.wgn\n...\n\nInstalling Flask-0.12-py27-none-linux_x86_64.wgn\nRetrieving source...\nExtracting tgz Flask-0.12-py27-none-linux_x86_64.wgn to /tmp/tmplXv6Fi...\nSource is: /tmp/tmplXv6Fi/Flask\nValidating Platform linux_x86_64 is supported...\nInstalling Flask...\nInstalling within current virtualenv\nCollecting Flask\nCollecting itsdangerous\u003e=0.21 (from Flask)\n...\nInstalling collected packages: itsdangerous, Werkzeug, Flask\nSuccessfully installed Flask-0.12 Werkzeug-0.11.15 itsdangerous-0.24\n\n...\n```\n\nNOTE: `--pre` is appended to the installation command to enable installation of prerelease versions.\n\n#### Installing Manually\n\nWhile wagon provides a generic way of installing wagon created archives, you might not want to use the installer as you might not wish to install wagon on your application servers. Installing the package manually via pip is as easy as running (for example):\n\n```bash\n# For Linux (Windows wagon archives are zip files)\ntar -xzvf ./Flask-0.12-py27-none-linux_x86_64.wgn\npip install --no-index --find-links Flask/wheels flask\n```\n\n\n### Validate Packages\n\nThe `validate` function provides shallow validation of a Wagon archive. Basically, that all required wheels for a package are present and that the package is installable.\n\nThis shallow validation should, at the very least, verify that a Wagon archive is not corrupted. Note that the `--validate` flag provided with the `create` function uses this same validation method. Also note that validation must take place only on an OS distribution which supports the wagon archive if it contains C extensions. For instance, a win32 specific wagon archive will fail to validate on a Linux machine.\n\n`venv` Python's stdlib module must be installed for Wagon to be able to validate an archive to not pollute the current environment.\n\n```bash\n$ wagon validate Flask-0.12-py27-none-linux_x86_64.wgn\n...\n\nValidating Flask-0.12-py27-none-linux_x86_64.wgn\nRetrieving source...\nExtracting tgz Flask-0.12-py27-none-linux_x86_64.wgn to /tmp/tmp2gqpy1...\nSource is: /tmp/tmp2gqpy1/Flask\nVerifying that all required files exist...\nTesting package installation...\nCreating Virtualenv /tmp/tmpdPNDIi...\nUsing real prefix '/usr'\nNew python executable in /tmp/tmpdPNDIi/bin/python2\nAlso creating executable in /tmp/tmpdPNDIi/bin/python\nInstalling setuptools, pip, wheel...done.\nInstalling /tmp/tmp2gqpy1/Flask\nRetrieving source...\nSource is: /tmp/tmp2gqpy1/Flask\nValidating Platform linux_x86_64 is supported...\nInstalling Flask...\nCollecting Flask\n...\nInstalling collected packages: itsdangerous, click, MarkupSafe, Jinja2, Werkzeug, Flask\nSuccessfully installed Flask-0.12 Jinja2-2.9.2 MarkupSafe-0.23 Werkzeug-0.11.15 click-6.7 itsdangerous-0.24\nPackage Flask is installed in /tmp/tmpdPNDIi\nValidation Passed!\n\n...\n```\n\n\n### Show Metadata\n\nGiven a Wagon archive, this will print its metadata.\n\n```bash\n$ wagon show Flask-0.12-py27-none-linux_x86_64.wgn\n...\n\n{\n    \"archive_name\": \"Flask-0.12-py27-none-linux_x86_64.wgn\",\n    \"build_server_os_properties\": {\n        \"distribution\": \"antergos\",\n        \"distribution_release\": \"archcode\",\n        \"distribution_version\": \"\"\n    },\n    \"created_by_wagon_version\": \"0.6.0\",\n    \"package_name\": \"Flask\",\n    \"package_source\": \"flask\",\n    \"package_version\": \"0.12\",\n    \"supported_platform\": \"linux_x86_64\",\n    \"supported_python_versions\": [\n        \"py27\"\n    ],\n    \"wheels\": [\n        \"MarkupSafe-0.23-cp27-cp27mu-linux_x86_64.whl\",\n        \"Werkzeug-0.11.15-py2.py3-none-any.whl\",\n        \"Jinja2-2.9.2-py2.py3-none-any.whl\",\n        \"click-6.7-py2.py3-none-any.whl\",\n        \"itsdangerous-0.24-cp27-none-any.whl\",\n        \"Flask-0.12-py2.py3-none-any.whl\"\n    ]\n}\n\n...\n```\n\n### Repair Wagon\n\n`auditwheel` is a tool (currently under development) provided by pypa to \"repair\" wheels to support multiple linux distributions. Information on auditwheel is provided [here](https://github.com/pypa/auditwheel).\n\nWagon provides a way to repair a wagon by iterating over its wheels and fixing all of them.\n\nNOTE! The repair command is EXPERIMENTAL in Wagon. It isn't fully tested and relies on `auditwheel`, which is, in itself, somewhat experimental. Read [https://www.python.org/dev/peps/pep-0513/](https://www.python.org/dev/peps/pep-0513/) for more info.\n\nFor more information, see [Linux Support for compiled wheels](#linux-support-for-compiled-wheels) below.\n\nThe following example was executed on a container provided for wheel-auditing purposes which you can be run like so:\n\n```bash\n$ docker run -it -v `pwd`:/io quay.io/pypa/manylinux1_x86_64 /bin/bash\n```\n\n```bash\n$ /opt/python/cp27-cp27m/bin/pip install wagon\n...\n\n$ /opt/python/cp27-cp27m/bin/wagon repair cloudify-4.0a10-py27-none-linux_x86_64.wgn -v\n...\n\nRepairing: cloudify-4.0a10-py27-none-linux_x86_64.wgn\nRetrieving source...\nExtracting tgz cloudify-4.0a10-py27-none-linux_x86_64.wgn to /tmp/tmpDZ4kNC...\nSource is: /tmp/tmpDZ4kNC/cloudify\nRepairing PyYAML-3.10-cp27-cp27m-linux_x86_64.whl\nPrevious filename tags: linux_x86_64\nNew filename tags: manylinux1_x86_64\nPrevious WHEEL info tags: cp27-cp27m-linux_x86_64\nNew WHEEL info tags: cp27-cp27m-manylinux1_x86_64\n...\nGenerating Metadata...\nWriting metadata to file: /tmp/tmpDZ4kNC/cloudify/package.json\nCreating tgz archive: /cloudify-4.0a10-py27-none-manylinux1_x86_64.wgn...\nWagon created successfully at: /cloudify-4.0a10-py27-none-manylinux1_x86_64.wgn\n\n...\n```\n\n## Naming and Versioning\n\n### Source: PyPI\n\nWhen providing a PyPI source, it can either be supplied as `PACKAGE_NAME==PACKAGE_VERSION` after which wagon then applies the correct name and version to the archive according to the two parameters; or `PACKAGE_NAME`, after which the `PACKAGE_VERSION` will be extracted from the downloaded wheel.\n\n### Source: Else\n\nFor local path and URL sources, the name and version are automatically extracted from the setup.py file.\n\nNOTE: This means that when supplying a local path, you must supply a path to the root of where your setup.py file resides.\n\nNOTE: If using a URL, it must be a URL to a tar.gz/zip file structured like a GitHub tar.gz/zip archive (e.g. https://github.com/cloudify-cosmo/cloudify-script-plugin/archive/master.tar.gz)\n\n\n## Metadata File and Wheels\n\nA Metadata file is generated for the archive and looks somewhat like this:\n\n```\n{\n    \"archive_name\": \"cloudify_script_plugin-1.2-py27-none-linux_x86_64.wgn\",\n    \"build_server_os_properties\": {\n        \"distribution\": \"ubuntu\",\n        \"distribution_release\": \"trusty\",\n        \"distribution_version\": \"14.04\"\n    },\n    \"package_name\": \"cloudify-script-plugin\",\n    \"package_source\": \"cloudify-script-plugin==1.2\",\n    \"package_version\": \"1.2\",\n    \"supported_platform\": \"any\",\n    \"supported_python_versions\": [\n        \"py26\",\n        \"py27\"\n    ],\n    \"wheels\": [\n        \"proxy_tools-0.1.0-py2-none-any.whl\",\n        \"pyzmq-14.7.0-cp27-none-linux_x86_64.whl\",\n        \"bottle-0.12.7-py2-none-any.whl\",\n        \"networkx-1.8.1-py2-none-any.whl\",\n        \"requests-2.5.1-py2.py3-none-any.whl\",\n        \"PyYAML-3.10-cp27-none-linux_x86_64.whl\",\n        \"pika-0.9.13-py2-none-any.whl\",\n        \"jsonschema-2.3.0-py2.py3-none-any.whl\",\n        \"cloudify_dsl_parser-3.2-py2-none-any.whl\",\n        \"cloudify_rest_client-3.2-py2-none-any.whl\",\n        \"cloudify_script_plugin-1.2-py2-none-any.whl\"\n    ]\n}\n```\n\n* The wheels to be installed reside in the zip file under 'wheels/*.whl'.\n* The Metadata file resides in the archive file under 'package.json'.\n* The installer uses the metadata file to check that the platform fits the machine the package is being installed on.\n* OS Properties only appear when creating compiled Linux packages (see Linux Distributions section). In case of a non-linux platform (e.g. win32, any), null values will be supplied for OS properties.\n* The distribution identification is done using `platform.linux_distribution`, which is deprecated and will be removed in Python 3.7. `https://github.com/nir0s/distro` is a successor of that functionality and can be installed by running `pip install wagon[dist]`. We currently use distro only if it is instsalled. In later versions of wagon, we will stop using `platform.linux_distribution` altogether.\n\n\n## Archive naming convention and Platform\n\nThe archive is named according to the Wheel naming convention described in [PEP0491](https://www.python.org/dev/peps/pep-0491/#file-name-convention).\n\nExample Output Archive: `cloudify_aws_plugin-1.4.3-py27-none-any.wgn`\n\n\n* `{python tag}`: The Python version is set by the Python running the packaging process. That means that while a package might run on both py27 and py33 (for example), since the packaging process took place using Python 2.7, only py27 will be appended to the name. A user can also explicitly provide the supported Python versions for the package via the `pyver` flag.\n* `{platform tag}`: Normally, the platform (e.g. `linux_x86_64`, `win32`) is set for each specific wheel. To know which platform the package with its dependencies can be installed on, all wheels are checked. If a specific wheel has a platform property other than `any`, that platform will be used as the platform of the package. Of course, we assume that there can't be wheels downloaded or created on a specific machine platform that belongs to two different platforms.\n* `{abi tag}`: Note that the ABI tag is currently ignored and will always be `none`. This might be changed in the future to support providing an ABI tag.\n\n\n## Linux Support for compiled wheels\n\nExample Output Archive: `cloudify_fabric_plugin-1.2.1-py27-none-linux_x86_64.wgn`\n\nWheels which require compilation of C-extensions and are compiled on Linux are not uploaded to PyPI due to variations between compilation environments on different distributions and links to varying system libraries.\n\nTo overcome that (partially), when running Wagon on Linux and the package requires compilation, the metadata provides the distribution, version and release name of the OS that the archive was created on (via `platform.linux_distribution()` and `https://github.com/nir0s/distro`). Statistically speaking, this should provide the user with the information they need to know which OS the package can be installed on. Obviously, this is not true for cases where non-generic compilation methods are used on the creating OS but otherwise should work, and should specifically always work when both compilation environment and Python version are similar on the creating and installing OS - which, we generally recommend.\n\nWhat this practically means, is that in most cases using the metadata to compare the distro, distro version, and the Python version under which the package is installed would allow a user to use Wagon rather safely. Of course, Wagon provides no guarantee whatsoever as to whether this will actually work or not and users must test their archives.\n\nThat being said, Wagon is completely safe for creating and installing Pure-Python package archives for any platform, and, due to the nature of Wheels, packages compiled for OS X or Windows on corresponding architectures.\n\n\n## Python API\n\nWagon provides an easy to use API.\nYou can pass a `verbose` True/False flag to each of these functions.\n\n### Create\n\n```python\n\nimport wagon\n\nsource = 'flask==0.10.1'\n\nwagon.set_verbose(True)\n\narchive_path = wagon.create(\n    source,\n    requirement_files=None,\n    force=False,\n    keep_wheels=False,\n    archive_destination_dir='.',\n    python_versions=None,\n    validate_archive=False,\n    wheel_args='',\n    archive_format='tar.gz')\n```\n\n### Install\n\n```python\n\nimport wagon\n\nsource = 'http://my-wagons.com/Flask-0.10.1-py27-none-linux_x86_64.wgn'\n\nwagon.install(\n    source,\n    venv=None,\n    requirement_files=None,\n    upgrade=False,\n    ignore_platform=False,\n    install_args='')\n```\n\n### Validate\n\n```python\n\nimport wagon\n\nsource = 'http://my-wagons.com/Flask-0.10.1-py27-none-linux_x86_64.wgn'\n\nresult = wagon.validate(source=source)  # True if validation successful, else False\n```\n\n### Showmeta\n\n```python\n\nimport wagon\n\nsource = 'http://my-wagons.com/Flask-0.10.1-py27-none-linux_x86_64.wgn'\n\nmetadata = wagon.show(source=source)\nprint(metadata)\n```\n\n\n### Repair\n\n```python\n\nimport wagon\n\nsource = 'http://my-wagons.com/Flask-0.10.1-py27-none-linux_x86_64.wgn'\nrepaired_archive_path = wagon.repair(source=source, validate=True)\n```\n\n\n## Testing\n\nNOTE: Running the tests require an internet connection\nNOTE: Some tests check if the `CI` env var is set. If not, they will not run.\n\n```shell\ngit clone git@github.com:cloudify-cosmo/wagon.git\ncd wagon\npip install tox\ntox\n```\n\n## Contributions..\n\n..are always welcome. We're looking to:\n\n* Provide the most statistically robust way of identification and installation of Linux compiled Wheels.\n\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudify-cosmo%2Fwagon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudify-cosmo%2Fwagon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudify-cosmo%2Fwagon/lists"}