diff --git a/.gitignore b/.gitignore index e69de29..d0e5913 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/wheel-0.22.0.tar.gz diff --git a/pydist-schema.json b/pydist-schema.json new file mode 100644 index 0000000..fc350bf --- /dev/null +++ b/pydist-schema.json @@ -0,0 +1,341 @@ +{ + "id": "http://www.python.org/dev/peps/pep-0426/", + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Metadata for Python Software Packages 2.0", + "type": "object", + "properties": { + "metadata_version": { + "description": "Version of the file format", + "type": "string", + "pattern": "^(\\d+(\\.\\d+)*)$" + }, + "generator": { + "description": "Name and version of the program that produced this file.", + "type": "string", + "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])( \\(.*\\))?$" + }, + "name": { + "description": "The name of the distribution.", + "type": "string", + "$ref": "#/definitions/distribution_name" + }, + "version": { + "description": "The distribution's public version identifier", + "type": "string", + "pattern": "^(\\d+(\\.\\d+)*)((a|b|c|rc)(\\d+))?(\\.(post)(\\d+))?(\\.(dev)(\\d+))?$" + }, + "source_label": { + "description": "A constrained identifying text string", + "type": "string", + "pattern": "^[0-9a-z_.-+]+$" + }, + "source_url": { + "description": "A string containing a full URL where the source for this specific version of the distribution can be downloaded.", + "type": "string", + "format": "uri" + }, + "summary": { + "description": "A one-line summary of what the distribution does.", + "type": "string" + }, + "document_names": { + "description": "Names of supporting metadata documents", + "type": "object", + "properties": { + "description": { + "type": "string", + "$ref": "#/definitions/document_name" + }, + "changelog": { + "type": "string", + "$ref": "#/definitions/document_name" + }, + "license": { + "type": "string", + "$ref": "#/definitions/document_name" + } + }, + "additionalProperties": false + }, + "keywords": { + "description": "A list of additional keywords to be used to assist searching for the distribution in a larger catalog.", + "type": "array", + "items": { + "type": "string" + } + }, + "license": { + "description": "A string indicating the license covering the distribution.", + "type": "string" + }, + "classifiers": { + "description": "A list of strings, with each giving a single classification value for the distribution.", + "type": "array", + "items": { + "type": "string" + } + }, + "contacts": { + "description": "A list of contributor entries giving the recommended contact points for getting more information about the project.", + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/contact" + } + }, + "contributors": { + "description": "A list of contributor entries for other contributors not already listed as current project points of contact.", + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/contact" + } + }, + "project_urls": { + "description": "A mapping of arbitrary text labels to additional URLs relevant to the project.", + "type": "object" + }, + "extras": { + "description": "A list of optional sets of dependencies that may be used to define conditional dependencies in \"may_require\" and similar fields.", + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/extra_name" + } + }, + "meta_requires": { + "description": "A list of subdistributions made available through this metadistribution.", + "type": "array", + "$ref": "#/definitions/dependencies" + }, + "run_requires": { + "description": "A list of other distributions needed to run this distribution.", + "type": "array", + "$ref": "#/definitions/dependencies" + }, + "test_requires": { + "description": "A list of other distributions needed when this distribution is tested.", + "type": "array", + "$ref": "#/definitions/dependencies" + }, + "build_requires": { + "description": "A list of other distributions needed when this distribution is built.", + "type": "array", + "$ref": "#/definitions/dependencies" + }, + "dev_requires": { + "description": "A list of other distributions needed when this distribution is developed.", + "type": "array", + "$ref": "#/definitions/dependencies" + }, + "provides": { + "description": "A list of strings naming additional dependency requirements that are satisfied by installing this distribution. These strings must be of the form Name or Name (Version)", + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/provides_declaration" + } + }, + "modules": { + "description": "A list of modules and/or packages available for import after installing this distribution.", + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/qualified_name" + } + }, + "namespaces": { + "description": "A list of namespace packages this distribution contributes to", + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/qualified_name" + } + }, + "commands": { + "description": "Command line interfaces provided by this distribution", + "type": "object", + "$ref": "#/definitions/commands" + }, + "exports": { + "description": "Other exported interfaces provided by this distribution", + "type": "object", + "$ref": "#/definitions/exports" + }, + "obsoleted_by": { + "description": "A string that indicates that this project is no longer being developed. The named project provides a substitute or replacement.", + "type": "string", + "$ref": "#/definitions/requirement" + }, + "supports_environments": { + "description": "A list of strings specifying the environments that the distribution explicitly supports.", + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/environment_marker" + } + }, + "install_hooks": { + "description": "The install_hooks field is used to define various operations that may be invoked on a distribution in a platform independent manner.", + "type": "object", + "properties": { + "postinstall": { + "type": "string", + "$ref": "#/definitions/export_specifier" + }, + "preuninstall": { + "type": "string", + "$ref": "#/definitions/export_specifier" + } + } + }, + "extensions": { + "description": "Extensions to the metadata may be present in a mapping under the 'extensions' key.", + "type": "object", + "$ref": "#/definitions/extensions" + } + }, + + "required": ["metadata_version", "name", "version", "summary"], + "additionalProperties": false, + + "definitions": { + "contact": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "url": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + }, + "dependencies": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/dependency" + } + }, + "dependency": { + "type": "object", + "properties": { + "extra": { + "type": "string", + "$ref": "#/definitions/extra_name" + }, + "environment": { + "type": "string", + "$ref": "#/definitions/environment_marker" + }, + "requires": { + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/requirement" + } + } + }, + "required": ["requires"], + "additionalProperties": false + }, + "commands": { + "type": "object", + "properties": { + "wrap_console": { + "type": "object", + "$ref": "#/definitions/command_map" + }, + "wrap_gui": { + "type": "object", + "$ref": "#/definitions/command_map" + }, + "prebuilt": { + "type": "array", + "items": { + "type": "string", + "$ref": "#/definitions/relative_path" + } + } + }, + "additionalProperties": false + }, + "exports": { + "type": "object", + "patternProperties": { + "^[A-Za-z][0-9A-Za-z_]*([.][0-9A-Za-z_]*)*$": { + "type": "object", + "patternProperties": { + ".": { + "type": "string", + "$ref": "#/definitions/export_specifier" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "extensions": { + "type": "object", + "patternProperties": { + "^[A-Za-z][0-9A-Za-z_]*([.][0-9A-Za-z_]*)*$": {} + }, + "additionalProperties": false + }, + "command_map": { + "type": "object", + "patternProperties": { + "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$": { + "type": "string", + "$ref": "#/definitions/export_specifier" + } + }, + "additionalProperties": false + }, + "distribution_name": { + "type": "string", + "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$" + }, + "requirement": { + "type": "string" + }, + "provides_declaration": { + "type": "string" + }, + "environment_marker": { + "type": "string" + }, + "document_name": { + "type": "string" + }, + "extra_name" : { + "type": "string", + "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$" + }, + "relative_path" : { + "type": "string" + }, + "export_specifier": { + "type": "string", + "pattern": "^([A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*)(:[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*)?(\\[[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?\\])?$" + }, + "qualified_name" : { + "type": "string", + "pattern": "^[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*$" + }, + "prefixed_name" : { + "type": "string", + "pattern": "^[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_0-9]*)*$" + } + } +} diff --git a/python-wheel.spec b/python-wheel.spec new file mode 100644 index 0000000..0cd57ae --- /dev/null +++ b/python-wheel.spec @@ -0,0 +1,142 @@ +# Created by pyp2rpm-1.0.1 +%global pypi_name wheel +%global with_python3 1 + +Name: python-%{pypi_name} +Version: 0.22.0 +Release: 1%{?dist} +Summary: A built-package format for Python + +License: MIT +URL: http://bitbucket.org/dholth/wheel/ +Source0: https://pypi.python.org/packages/source/w/%{pypi_name}/%{pypi_name}-%{version}.tar.gz +# Some test files are not present in tarball, so we include them separately. +# Upstream pull request to include the files in tarball: +# https://bitbucket.org/dholth/wheel/pull-request/34 (Patch0 below) +# (version 0.22 doesn't have a tag, so we're using commit hash to point to the +# correct testing wheel) +Source1: https://bitbucket.org/dholth/wheel/src/099352e/wheel/test/test-1.0-py2.py3-none-win32.whl +Source2: https://bitbucket.org/dholth/wheel/raw/099352e/wheel/test/pydist-schema.json +Patch0: wheel-0.22-add-test-files-to-manifest.path +Patch1: wheel-0.22-legacy-keyring-compatibility.patch +Patch2: wheel-0.22-fix-tests-broken-by-keyring-fix.patch +BuildArch: noarch + +BuildRequires: python-devel +BuildRequires: python-setuptools + +BuildRequires: pytest +BuildRequires: python-jsonschema +BuildRequires: python-keyring + +%if %{?with_python3} +BuildRequires: python3-devel +BuildRequires: python3-setuptools +%endif # if with_python3 + + +%description +A built-package format for Python. + +A wheel is a ZIP-format archive with a specially formatted filename and the +.whl extension. It is designed to contain all the files for a PEP 376 +compatible install in a way that is very close to the on-disk format. + +%if 0%{?with_python3} +%package -n python3-%{pypi_name} +Summary: A built-package format for Python + +%description -n python3-%{pypi_name} +A built-package format for Python. + +A wheel is a ZIP-format archive with a specially formatted filename and the +.whl extension. It is designed to contain all the files for a PEP 376 +compatible install in a way that is very close to the on-disk format. + +This is package contains Python 3 version of the package. +%endif # with_python3 + + +%prep +%setup -q -n %{pypi_name}-%{version} + +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 + +# copy test files in place +cp %{SOURCE1} %{pypi_name}/test/ +cp %{SOURCE2} %{pypi_name}/test/ +# header files just has to be there, even empty +touch %{pypi_name}/test/headers.dist/header.h + +# remove unneeded shebangs +sed -ie '1d' %{pypi_name}/{egg2wheel,wininst2wheel}.py + +%if 0%{?with_python3} +rm -rf %{py3dir} +cp -a . %{py3dir} +%endif # with_python3 + + +%build +%{__python} setup.py build + +%if 0%{?with_python3} +pushd %{py3dir} +%{__python3} setup.py build +popd +%endif # with_python3 + + +%install +# Must do the subpackages' install first because the scripts in /usr/bin are +# overwritten with every setup.py install (and we want the python2 version +# to be the default for now). +%if 0%{?with_python3} +pushd %{py3dir} +%{__python3} setup.py install --skip-build --root %{buildroot} +popd +pushd %{buildroot}%{_bindir} +for f in $(ls); do mv $f python3-$f; done +popd +%endif # with_python3 + +%{__python} setup.py install --skip-build --root %{buildroot} + + +%check +# remove setup.cfg that makes pytest require pytest-cov (unnecessary dep) +rm setup.cfg +py.test --ignore build +# no test for Python 3, no python3-jsonschema yet +%if 0 +pushd %{py3dir} +rm setup.cfg +py.test-%{python3_version} --ignore build +popd +%endif # with_python3 + + +%files +%doc LICENSE.txt CHANGES.txt README.txt +%{_bindir}/egg2wheel +%{_bindir}/wheel +%{_bindir}/wininst2wheel +%{python_sitelib}/%{pypi_name}* +%exclude %{python_sitelib}/%{pypi_name}/test +%if 0%{?with_python3} + +%files -n python3-%{pypi_name} +%doc LICENSE.txt CHANGES.txt README.txt +%{_bindir}/python3-egg2wheel +%{_bindir}/python3-wheel +%{_bindir}/python3-wininst2wheel +%{python3_sitelib}/%{pypi_name}* +%exclude %{python3_sitelib}/%{pypi_name}/test +%endif # with_python3 + + +%changelog +* Thu Nov 28 2013 Bohuslav Kabrda - 0.22.0-1 +- Initial package. diff --git a/sources b/sources index e69de29..ffb19c8 100644 --- a/sources +++ b/sources @@ -0,0 +1 @@ +16bb8eb3bdd3d93813295463bb949705 wheel-0.22.0.tar.gz diff --git a/test-1.0-py2.py3-none-win32.whl b/test-1.0-py2.py3-none-win32.whl new file mode 100644 index 0000000..dfd3070 Binary files /dev/null and b/test-1.0-py2.py3-none-win32.whl differ diff --git a/wheel-0.22-add-test-files-to-manifest.path b/wheel-0.22-add-test-files-to-manifest.path new file mode 100644 index 0000000..2f10a21 --- /dev/null +++ b/wheel-0.22-add-test-files-to-manifest.path @@ -0,0 +1,11 @@ +diff -r e59e807a91a8 MANIFEST.in +--- a/MANIFEST.in Mon Sep 23 10:46:53 2013 +0200 ++++ b/MANIFEST.in Thu Nov 28 12:47:15 2013 +0100 +@@ -1,4 +1,7 @@ + include wheel/*.txt *.txt *.sh + recursive-include wheel/test *.py ++include wheel/test/test-1.0-py2.py3-none-win32.whl ++include wheel/test/headers.dist/header.h ++include wheel/test/pydist-schema.json + prune wheel/test/*/dist + prune wheel/test/*/build diff --git a/wheel-0.22-fix-tests-broken-by-keyring-fix.patch b/wheel-0.22-fix-tests-broken-by-keyring-fix.patch new file mode 100644 index 0000000..2a61c49 --- /dev/null +++ b/wheel-0.22-fix-tests-broken-by-keyring-fix.patch @@ -0,0 +1,19 @@ +diff -r e59e807a91a8 wheel/test/test_tool.py +--- a/wheel/test/test_tool.py Mon Sep 23 10:46:53 2013 +0200 ++++ b/wheel/test/test_tool.py Thu Nov 28 13:38:04 2013 +0100 +@@ -3,13 +3,14 @@ + def test_keygen(): + def get_keyring(): + WheelKeys, keyring = tool.get_keyring() +- + class WheelKeysTest(WheelKeys): + def save(self): + pass + + class keyringTest: + backend = keyring.backend ++ class backends: ++ file = keyring.backends.file + @classmethod + def get_keyring(cls): + class keyringTest2: diff --git a/wheel-0.22-legacy-keyring-compatibility.patch b/wheel-0.22-legacy-keyring-compatibility.patch new file mode 100644 index 0000000..219915d --- /dev/null +++ b/wheel-0.22-legacy-keyring-compatibility.patch @@ -0,0 +1,19 @@ +changeset: 313:e59e807a91a8 +tag: tip +user: Pierre Jaury +date: Mon Sep 23 10:46:53 2013 +0200 +summary: Fix #85 regarding backward compatibility with python-keyring <= 3.0 + +diff -r bae6c45073bd -r e59e807a91a8 wheel/tool/__init__.py +--- a/wheel/tool/__init__.py Sun Sep 15 18:08:42 2013 -0400 ++++ b/wheel/tool/__init__.py Mon Sep 23 10:46:53 2013 +0200 +@@ -47,7 +47,7 @@ + kr = keyring.get_keyring() + kr.set_password("wheel", vk, sk) + sys.stdout.write("Created Ed25519 keypair with vk={0}\n".format(vk)) +- if isinstance(kr, keyring.backend.BasicFileKeyring): ++ if isinstance(kr, keyring.backends.file.BaseKeyring): + sys.stdout.write("in {0}\n".format(kr.file_path)) + else: + sys.stdout.write("in %r\n" % kr.__class__) +