diff options
Diffstat (limited to 'python-pydpkg.spec')
| -rw-r--r-- | python-pydpkg.spec | 914 |
1 files changed, 914 insertions, 0 deletions
diff --git a/python-pydpkg.spec b/python-pydpkg.spec new file mode 100644 index 0000000..67e6a68 --- /dev/null +++ b/python-pydpkg.spec @@ -0,0 +1,914 @@ +%global _empty_manifest_terminate_build 0 +Name: python-pydpkg +Version: 1.9.2 +Release: 1 +Summary: A python library for parsing debian package control headers and version strings +License: Apache-2.0 +URL: https://github.com/memory/python-dpkg +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/07/b6/f5669bb9137ee8bf784a209fe53e3966478f79c0c91f3ae46b897e7ad6bc/pydpkg-1.9.2.tar.gz +BuildArch: noarch + +Requires: python3-arpy +Requires: python3-six +Requires: python3-PGPy +Requires: python3-zstandard +Requires: python3-cryptography + +%description +# python-dpkg + +This library can be used to: + +1. read and extract control data from Debian-format package files, even + on platforms that generally lack a native implementation of dpkg + +2. compare dpkg version strings, using a pure Python implementation of + the algorithm described in section 5.6.12 of the debian-policy manual: + https://www.debian.org/doc/debian-policy/ch-controlfields.html#version + +3. Parse debian source description (dsc) files, inspect their contents + and verify that their source files are present and checksums are + correct. + +This is primarily intended for use on platforms that do not normally +ship [python-apt](http://apt.alioth.debian.org/python-apt-doc/) due to +licensing restrictions or the lack of a native libapt.so (e.g. macOS) + +Currently only tested on CPython 3.x, but at least in theory should run +on any python distribution that can install the [arpy](https://pypi.python.org/pypi/arpy/) +library. + +Note: python 2.7 compatibility was removed in version 1.4.0 and the v1.3 +branch is no longer being maintained. This means that among other issues, +support for zstandard-compressed deb packages will not be available on +py27 -- consider this impetus to upgrade if you have not already. + +## Installing + +Install the 'pydpkg' package from [PyPi](https://pypi.python.org) using +the [pip](https://packaging.python.org/installing/) tool: + + $ pip install pydpkg + Collecting pydpkg + Downloading pydpkg-1.1-py2-none-any.whl + Installing collected packages: pydpkg + Successfully installed pydpkg-1.1 + +## Developing + +python-dpkg uses [Poetry](https://python-poetry.org/) to manage its dependencies. + +The [Makefile](Makefile) will attempt to set up a reasonable build/test +environment on both macOS/Darwin and more traditional unixes (linux, freebsd, +etc), but relies on the existence of [pyenv](https://github.com/pyenv/pyenv), +[pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) everywhere and +[Homebrew](https://brew.sh) on macOS. You don't _need_ to use the workflow +that the makefile enforces (modern versions of [pip](https://pypi.org/project/pip/) +will happily digest `pyproject.toml` files and you can run the test commands +manually) but please ensure all tests pass before submitting PRs. + +## Usage + +### Binary Packages + +#### Read and extract headers + + >>> from pydpkg import Dpkg + >>> dp = Dpkg('/tmp/testdeb_1:0.0.0-test_all.deb') + + >>> dp.headers + {'maintainer': u'Climate Corp Engineering <no-reply@climate.com>', 'description': u'testdeb\n a bogus debian package for testing dpkg builds', 'package': u'testdeb', 'section': u'base', 'priority': u'extra', 'installed-size': u'0', 'version': u'1:0.0.0-test', 'architecture': u'all'} + + >>> print(dp) + Package: testdeb + Version: 1:0.0.0-test + Section: base + Priority: extra + Architecture: all + Installed-Size: 0 + Maintainer: Climate Corp Engineering <no-reply@climate.com> + Description: testdeb + a bogus debian package for testing dpkg builds + +#### Interact directly with the package control message + + >>> dp.message + <email.message.Message instance at 0x10895c6c8> + >>> dp.message.get_content_type() + 'text/plain' + +#### Get package file fingerprints + + >>> dp.fileinfo + {'sha256': '547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f', 'sha1': 'a5d28ae2f23e726a797349d7dd5f21baf8aa02b4', 'filesize': 910, 'md5': '149e61536a9fe36374732ec95cf7945d'} + >>> dp.md5 + '149e61536a9fe36374732ec95cf7945d' + >>> dp.sha1 + 'a5d28ae2f23e726a797349d7dd5f21baf8aa02b4' + >>> dp.sha256 + '547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f' + >>> dp.filesize + 910 + +#### Get the components of the package version + + >>> d.epoch + 1 + >>> d.upstream_version + u'0.0.0' + >>> d.debian_revision + u'test' + +#### Get an arbitrary control header, case-independent + + >>> d.version + u'1:0.0.0-test' + + >>> d.VERSION + u'1:0.0.0-test' + + >>> d.description + u'testdeb\n a bogus debian package for testing dpkg builds' + + >>> d.get('nosuchheader', 'default') + 'default' + +#### Compare current version to a candidate version + + >>> dp.compare_version_with('1.0') + 1 + + >>> dp.compare_version_with('1:1.0') + -1 + +#### Compare two arbitrary version strings + + >>> from pydpkg import Dpkg + >>> ver_1 = '0:1.0-test1' + >>> ver_2 = '0:1.0-test2' + >>> Dpkg.compare_versions(ver_1, ver_2) + -1 + +#### Use as a key function to sort a list of version strings + + >>> from pydpkg import Dpkg + >>> sorted(['0:1.0-test1', '1:0.0-test0', '0:1.0-test2'] , key=Dpkg.compare_versions_key) + ['0:1.0-test1', '0:1.0-test2', '1:0.0-test0'] + +#### Use the `dpkg-inspect` script to inspect packages + + $ dpkg-inspect ~/testdeb*deb + Filename: /Home/n/testdeb_1:0.0.0-test_all.deb + Size: 910 + MD5: 149e61536a9fe36374732ec95cf7945d + SHA1: a5d28ae2f23e726a797349d7dd5f21baf8aa02b4 + SHA256: 547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f + Headers: + Package: testdeb + Version: 1:0.0.0-test + Section: base + Priority: extra + Architecture: all + Installed-Size: 0 + Maintainer: Nathan Mehl <n@climate.com> + Description: testdeb + a bogus debian package for testing dpkg builds + +### Source Packages + +#### Read and extract headers + + >>> from pydpkg import Dsc + >>> dsc = Dsc('testdeb_0.0.0.dsc') + >>> dsc.standards_version + '3.9.6' + >>> dsc.format + '3.0 (quilt)' + >>> x.build_depends + 'python (>= 2.6.6-3), debhelper (>= 9)' + +#### Get the full set of dsc headers as a dictionary + + >>> dsc.headers + {'Architecture': 'all', + 'Binary': 'testdeb', + 'Build-Depends': 'python (>= 2.6.6-3), debhelper (>= 9)', + 'Checksums-Sha1': ' f250ac0a426b31df24fc2c98050f4fab90e456cd 280 testdeb_0.0.0.orig.tar.gz\n cb3474ff94053018957ebcf1d8a2b45f75dda449 232 testdeb_0.0.0-1.debian.tar.xz\n 80cd7b01014a269d445c63b037b885d6002cf533 841 testdeb_0.0.0.dsc', + 'Checksums-Sha256': ' aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7 280 testdeb_0.0.0.orig.tar.gz\n 1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858 232 testdeb_0.0.0-1.debian.tar.xz\n b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a 841 testdeb_0.0.0.dsc', + 'Files': ' 142ca7334ed1f70302b4504566e0c233 280 testdeb_0.0.0.orig.tar.gz\n fc80e6e7f1c1a08b78a674aaee6c1548 232 testdeb_0.0.0-1.debian.tar.xz\n 893d13a2ef13f7409c9521e8ab1dbccb 841 testdeb_0.0.0.dsc', + 'Format': '3.0 (quilt)', + 'Homepage': 'https://github.com/TheClimateCorporation', + 'Maintainer': 'Nathan J. Mehl <n@climate.com>', + 'Package-List': 'testdeb', + 'Source': 'testdeb', + 'Standards-Version': '3.9.6', + 'Uploaders': 'Nathan J. Mehl <n@climate.com>', + 'Version': '0.0.0-1'} + +#### Interact directly with the dsc message + + >>> dsc.message + <email.message.Message instance at 0x106fedea8> + >>> dsc.message.get_content_type() + 'text/plain' + >>> dsc.message.get('uploaders') + 'Nathan J. Mehl <n@climate.com>' + +#### Render the dsc message as a string + + >>> print(dsc) + Format: 3.0 (quilt) + Source: testdeb + Binary: testdeb + Architecture: all + Version: 0.0.0-1 + Maintainer: Nathan J. Mehl <n@climate.com> + Uploaders: Nathan J. Mehl <n@climate.com> + Homepage: https://github.com/TheClimateCorporation + Standards-Version: 3.9.6 + Build-Depends: python (>= 2.6.6-3), debhelper (>= 9) + Package-List: testdeb + Checksums-Sha1: + f250ac0a426b31df24fc2c98050f4fab90e456cd 280 testdeb_0.0.0.orig.tar.gz + cb3474ff94053018957ebcf1d8a2b45f75dda449 232 testdeb_0.0.0-1.debian.tar.xz + 80cd7b01014a269d445c63b037b885d6002cf533 841 testdeb_0.0.0.dsc + Checksums-Sha256: + aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7 280 testdeb_0.0.0.orig.tar.gz + 1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858 232 testdeb_0.0.0-1.debian.tar.xz + b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a 841 testdeb_0.0.0.dsc + Files: + 142ca7334ed1f70302b4504566e0c233 280 testdeb_0.0.0.orig.tar.gz + fc80e6e7f1c1a08b78a674aaee6c1548 232 testdeb_0.0.0-1.debian.tar.xz + 893d13a2ef13f7409c9521e8ab1dbccb 841 testdeb_0.0.0.dsc + +#### List the package source files from the dsc + + >>> dsc.source_files + ['/tmp/testdeb_0.0.0.orig.tar.gz', + '/tmp/testdeb_0.0.0-1.debian.tar.xz', + '/tmp/testdeb_0.0.0.dsc' ] + +#### Validate that the package source files are present + + >>> dsc.missing_files + [] + >>> dsc.all_files_present + True + >>> dsc.validate() + >>> + + >>> bad = Dsc('testdeb_1.1.1-bad.dsc') + >>> bad.missing_files + ['/tmp/testdeb_1.1.1.orig.tar.gz', '/tmp/testdeb_1.1.1-1.debian.tar.xz'] + >>> bad.all_files_present + False + >>> bad.validate() + pydpkg.DscMissingFileError: ['/tmp/testdeb_1.1.1.orig.tar.gz', '/tmp/testdeb_1.1.1-1.debian.tar.xz'] + +#### Inspect the source file checksums from the dsc + + >>> pp(dsc.checksums) + {'md5': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'fc80e6e7f1c1a08b78a674aaee6c1548', + '/tmp/testdeb_0.0.0.dsc': '893d13a2ef13f7409c9521e8ab1dbccb', + '/tmp/testdeb_0.0.0.orig.tar.gz': '142ca7334ed1f70302b4504566e0c233'}, + 'sha1': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', + '/tmp/testdeb_0.0.0.dsc': '80cd7b01014a269d445c63b037b885d6002cf533', + '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'}, + 'sha256': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', + '/tmp/testdeb_0.0.0.dsc': 'b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a', + '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}} + +#### Validate that all source file checksums are correct + + >>> dsc.corrected_checksums + {} + >>> dsc.all_checksums_correct + True + >>> dsc.validate() + >>> + + >>> bad = Dsc('testdeb_0.0.0-badchecksums.dsc') + >>> bad.corrected_checksums + {'sha256': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}), 'sha1': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'})} + >>> bad.all_checksums_correct + False + >>> bad.validate() + pydpkg.DscBadChecksumsError: {'sha256': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}), 'sha1': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'})} + + +%package -n python3-pydpkg +Summary: A python library for parsing debian package control headers and version strings +Provides: python-pydpkg +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-pydpkg +# python-dpkg + +This library can be used to: + +1. read and extract control data from Debian-format package files, even + on platforms that generally lack a native implementation of dpkg + +2. compare dpkg version strings, using a pure Python implementation of + the algorithm described in section 5.6.12 of the debian-policy manual: + https://www.debian.org/doc/debian-policy/ch-controlfields.html#version + +3. Parse debian source description (dsc) files, inspect their contents + and verify that their source files are present and checksums are + correct. + +This is primarily intended for use on platforms that do not normally +ship [python-apt](http://apt.alioth.debian.org/python-apt-doc/) due to +licensing restrictions or the lack of a native libapt.so (e.g. macOS) + +Currently only tested on CPython 3.x, but at least in theory should run +on any python distribution that can install the [arpy](https://pypi.python.org/pypi/arpy/) +library. + +Note: python 2.7 compatibility was removed in version 1.4.0 and the v1.3 +branch is no longer being maintained. This means that among other issues, +support for zstandard-compressed deb packages will not be available on +py27 -- consider this impetus to upgrade if you have not already. + +## Installing + +Install the 'pydpkg' package from [PyPi](https://pypi.python.org) using +the [pip](https://packaging.python.org/installing/) tool: + + $ pip install pydpkg + Collecting pydpkg + Downloading pydpkg-1.1-py2-none-any.whl + Installing collected packages: pydpkg + Successfully installed pydpkg-1.1 + +## Developing + +python-dpkg uses [Poetry](https://python-poetry.org/) to manage its dependencies. + +The [Makefile](Makefile) will attempt to set up a reasonable build/test +environment on both macOS/Darwin and more traditional unixes (linux, freebsd, +etc), but relies on the existence of [pyenv](https://github.com/pyenv/pyenv), +[pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) everywhere and +[Homebrew](https://brew.sh) on macOS. You don't _need_ to use the workflow +that the makefile enforces (modern versions of [pip](https://pypi.org/project/pip/) +will happily digest `pyproject.toml` files and you can run the test commands +manually) but please ensure all tests pass before submitting PRs. + +## Usage + +### Binary Packages + +#### Read and extract headers + + >>> from pydpkg import Dpkg + >>> dp = Dpkg('/tmp/testdeb_1:0.0.0-test_all.deb') + + >>> dp.headers + {'maintainer': u'Climate Corp Engineering <no-reply@climate.com>', 'description': u'testdeb\n a bogus debian package for testing dpkg builds', 'package': u'testdeb', 'section': u'base', 'priority': u'extra', 'installed-size': u'0', 'version': u'1:0.0.0-test', 'architecture': u'all'} + + >>> print(dp) + Package: testdeb + Version: 1:0.0.0-test + Section: base + Priority: extra + Architecture: all + Installed-Size: 0 + Maintainer: Climate Corp Engineering <no-reply@climate.com> + Description: testdeb + a bogus debian package for testing dpkg builds + +#### Interact directly with the package control message + + >>> dp.message + <email.message.Message instance at 0x10895c6c8> + >>> dp.message.get_content_type() + 'text/plain' + +#### Get package file fingerprints + + >>> dp.fileinfo + {'sha256': '547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f', 'sha1': 'a5d28ae2f23e726a797349d7dd5f21baf8aa02b4', 'filesize': 910, 'md5': '149e61536a9fe36374732ec95cf7945d'} + >>> dp.md5 + '149e61536a9fe36374732ec95cf7945d' + >>> dp.sha1 + 'a5d28ae2f23e726a797349d7dd5f21baf8aa02b4' + >>> dp.sha256 + '547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f' + >>> dp.filesize + 910 + +#### Get the components of the package version + + >>> d.epoch + 1 + >>> d.upstream_version + u'0.0.0' + >>> d.debian_revision + u'test' + +#### Get an arbitrary control header, case-independent + + >>> d.version + u'1:0.0.0-test' + + >>> d.VERSION + u'1:0.0.0-test' + + >>> d.description + u'testdeb\n a bogus debian package for testing dpkg builds' + + >>> d.get('nosuchheader', 'default') + 'default' + +#### Compare current version to a candidate version + + >>> dp.compare_version_with('1.0') + 1 + + >>> dp.compare_version_with('1:1.0') + -1 + +#### Compare two arbitrary version strings + + >>> from pydpkg import Dpkg + >>> ver_1 = '0:1.0-test1' + >>> ver_2 = '0:1.0-test2' + >>> Dpkg.compare_versions(ver_1, ver_2) + -1 + +#### Use as a key function to sort a list of version strings + + >>> from pydpkg import Dpkg + >>> sorted(['0:1.0-test1', '1:0.0-test0', '0:1.0-test2'] , key=Dpkg.compare_versions_key) + ['0:1.0-test1', '0:1.0-test2', '1:0.0-test0'] + +#### Use the `dpkg-inspect` script to inspect packages + + $ dpkg-inspect ~/testdeb*deb + Filename: /Home/n/testdeb_1:0.0.0-test_all.deb + Size: 910 + MD5: 149e61536a9fe36374732ec95cf7945d + SHA1: a5d28ae2f23e726a797349d7dd5f21baf8aa02b4 + SHA256: 547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f + Headers: + Package: testdeb + Version: 1:0.0.0-test + Section: base + Priority: extra + Architecture: all + Installed-Size: 0 + Maintainer: Nathan Mehl <n@climate.com> + Description: testdeb + a bogus debian package for testing dpkg builds + +### Source Packages + +#### Read and extract headers + + >>> from pydpkg import Dsc + >>> dsc = Dsc('testdeb_0.0.0.dsc') + >>> dsc.standards_version + '3.9.6' + >>> dsc.format + '3.0 (quilt)' + >>> x.build_depends + 'python (>= 2.6.6-3), debhelper (>= 9)' + +#### Get the full set of dsc headers as a dictionary + + >>> dsc.headers + {'Architecture': 'all', + 'Binary': 'testdeb', + 'Build-Depends': 'python (>= 2.6.6-3), debhelper (>= 9)', + 'Checksums-Sha1': ' f250ac0a426b31df24fc2c98050f4fab90e456cd 280 testdeb_0.0.0.orig.tar.gz\n cb3474ff94053018957ebcf1d8a2b45f75dda449 232 testdeb_0.0.0-1.debian.tar.xz\n 80cd7b01014a269d445c63b037b885d6002cf533 841 testdeb_0.0.0.dsc', + 'Checksums-Sha256': ' aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7 280 testdeb_0.0.0.orig.tar.gz\n 1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858 232 testdeb_0.0.0-1.debian.tar.xz\n b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a 841 testdeb_0.0.0.dsc', + 'Files': ' 142ca7334ed1f70302b4504566e0c233 280 testdeb_0.0.0.orig.tar.gz\n fc80e6e7f1c1a08b78a674aaee6c1548 232 testdeb_0.0.0-1.debian.tar.xz\n 893d13a2ef13f7409c9521e8ab1dbccb 841 testdeb_0.0.0.dsc', + 'Format': '3.0 (quilt)', + 'Homepage': 'https://github.com/TheClimateCorporation', + 'Maintainer': 'Nathan J. Mehl <n@climate.com>', + 'Package-List': 'testdeb', + 'Source': 'testdeb', + 'Standards-Version': '3.9.6', + 'Uploaders': 'Nathan J. Mehl <n@climate.com>', + 'Version': '0.0.0-1'} + +#### Interact directly with the dsc message + + >>> dsc.message + <email.message.Message instance at 0x106fedea8> + >>> dsc.message.get_content_type() + 'text/plain' + >>> dsc.message.get('uploaders') + 'Nathan J. Mehl <n@climate.com>' + +#### Render the dsc message as a string + + >>> print(dsc) + Format: 3.0 (quilt) + Source: testdeb + Binary: testdeb + Architecture: all + Version: 0.0.0-1 + Maintainer: Nathan J. Mehl <n@climate.com> + Uploaders: Nathan J. Mehl <n@climate.com> + Homepage: https://github.com/TheClimateCorporation + Standards-Version: 3.9.6 + Build-Depends: python (>= 2.6.6-3), debhelper (>= 9) + Package-List: testdeb + Checksums-Sha1: + f250ac0a426b31df24fc2c98050f4fab90e456cd 280 testdeb_0.0.0.orig.tar.gz + cb3474ff94053018957ebcf1d8a2b45f75dda449 232 testdeb_0.0.0-1.debian.tar.xz + 80cd7b01014a269d445c63b037b885d6002cf533 841 testdeb_0.0.0.dsc + Checksums-Sha256: + aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7 280 testdeb_0.0.0.orig.tar.gz + 1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858 232 testdeb_0.0.0-1.debian.tar.xz + b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a 841 testdeb_0.0.0.dsc + Files: + 142ca7334ed1f70302b4504566e0c233 280 testdeb_0.0.0.orig.tar.gz + fc80e6e7f1c1a08b78a674aaee6c1548 232 testdeb_0.0.0-1.debian.tar.xz + 893d13a2ef13f7409c9521e8ab1dbccb 841 testdeb_0.0.0.dsc + +#### List the package source files from the dsc + + >>> dsc.source_files + ['/tmp/testdeb_0.0.0.orig.tar.gz', + '/tmp/testdeb_0.0.0-1.debian.tar.xz', + '/tmp/testdeb_0.0.0.dsc' ] + +#### Validate that the package source files are present + + >>> dsc.missing_files + [] + >>> dsc.all_files_present + True + >>> dsc.validate() + >>> + + >>> bad = Dsc('testdeb_1.1.1-bad.dsc') + >>> bad.missing_files + ['/tmp/testdeb_1.1.1.orig.tar.gz', '/tmp/testdeb_1.1.1-1.debian.tar.xz'] + >>> bad.all_files_present + False + >>> bad.validate() + pydpkg.DscMissingFileError: ['/tmp/testdeb_1.1.1.orig.tar.gz', '/tmp/testdeb_1.1.1-1.debian.tar.xz'] + +#### Inspect the source file checksums from the dsc + + >>> pp(dsc.checksums) + {'md5': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'fc80e6e7f1c1a08b78a674aaee6c1548', + '/tmp/testdeb_0.0.0.dsc': '893d13a2ef13f7409c9521e8ab1dbccb', + '/tmp/testdeb_0.0.0.orig.tar.gz': '142ca7334ed1f70302b4504566e0c233'}, + 'sha1': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', + '/tmp/testdeb_0.0.0.dsc': '80cd7b01014a269d445c63b037b885d6002cf533', + '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'}, + 'sha256': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', + '/tmp/testdeb_0.0.0.dsc': 'b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a', + '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}} + +#### Validate that all source file checksums are correct + + >>> dsc.corrected_checksums + {} + >>> dsc.all_checksums_correct + True + >>> dsc.validate() + >>> + + >>> bad = Dsc('testdeb_0.0.0-badchecksums.dsc') + >>> bad.corrected_checksums + {'sha256': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}), 'sha1': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'})} + >>> bad.all_checksums_correct + False + >>> bad.validate() + pydpkg.DscBadChecksumsError: {'sha256': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}), 'sha1': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'})} + + +%package help +Summary: Development documents and examples for pydpkg +Provides: python3-pydpkg-doc +%description help +# python-dpkg + +This library can be used to: + +1. read and extract control data from Debian-format package files, even + on platforms that generally lack a native implementation of dpkg + +2. compare dpkg version strings, using a pure Python implementation of + the algorithm described in section 5.6.12 of the debian-policy manual: + https://www.debian.org/doc/debian-policy/ch-controlfields.html#version + +3. Parse debian source description (dsc) files, inspect their contents + and verify that their source files are present and checksums are + correct. + +This is primarily intended for use on platforms that do not normally +ship [python-apt](http://apt.alioth.debian.org/python-apt-doc/) due to +licensing restrictions or the lack of a native libapt.so (e.g. macOS) + +Currently only tested on CPython 3.x, but at least in theory should run +on any python distribution that can install the [arpy](https://pypi.python.org/pypi/arpy/) +library. + +Note: python 2.7 compatibility was removed in version 1.4.0 and the v1.3 +branch is no longer being maintained. This means that among other issues, +support for zstandard-compressed deb packages will not be available on +py27 -- consider this impetus to upgrade if you have not already. + +## Installing + +Install the 'pydpkg' package from [PyPi](https://pypi.python.org) using +the [pip](https://packaging.python.org/installing/) tool: + + $ pip install pydpkg + Collecting pydpkg + Downloading pydpkg-1.1-py2-none-any.whl + Installing collected packages: pydpkg + Successfully installed pydpkg-1.1 + +## Developing + +python-dpkg uses [Poetry](https://python-poetry.org/) to manage its dependencies. + +The [Makefile](Makefile) will attempt to set up a reasonable build/test +environment on both macOS/Darwin and more traditional unixes (linux, freebsd, +etc), but relies on the existence of [pyenv](https://github.com/pyenv/pyenv), +[pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) everywhere and +[Homebrew](https://brew.sh) on macOS. You don't _need_ to use the workflow +that the makefile enforces (modern versions of [pip](https://pypi.org/project/pip/) +will happily digest `pyproject.toml` files and you can run the test commands +manually) but please ensure all tests pass before submitting PRs. + +## Usage + +### Binary Packages + +#### Read and extract headers + + >>> from pydpkg import Dpkg + >>> dp = Dpkg('/tmp/testdeb_1:0.0.0-test_all.deb') + + >>> dp.headers + {'maintainer': u'Climate Corp Engineering <no-reply@climate.com>', 'description': u'testdeb\n a bogus debian package for testing dpkg builds', 'package': u'testdeb', 'section': u'base', 'priority': u'extra', 'installed-size': u'0', 'version': u'1:0.0.0-test', 'architecture': u'all'} + + >>> print(dp) + Package: testdeb + Version: 1:0.0.0-test + Section: base + Priority: extra + Architecture: all + Installed-Size: 0 + Maintainer: Climate Corp Engineering <no-reply@climate.com> + Description: testdeb + a bogus debian package for testing dpkg builds + +#### Interact directly with the package control message + + >>> dp.message + <email.message.Message instance at 0x10895c6c8> + >>> dp.message.get_content_type() + 'text/plain' + +#### Get package file fingerprints + + >>> dp.fileinfo + {'sha256': '547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f', 'sha1': 'a5d28ae2f23e726a797349d7dd5f21baf8aa02b4', 'filesize': 910, 'md5': '149e61536a9fe36374732ec95cf7945d'} + >>> dp.md5 + '149e61536a9fe36374732ec95cf7945d' + >>> dp.sha1 + 'a5d28ae2f23e726a797349d7dd5f21baf8aa02b4' + >>> dp.sha256 + '547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f' + >>> dp.filesize + 910 + +#### Get the components of the package version + + >>> d.epoch + 1 + >>> d.upstream_version + u'0.0.0' + >>> d.debian_revision + u'test' + +#### Get an arbitrary control header, case-independent + + >>> d.version + u'1:0.0.0-test' + + >>> d.VERSION + u'1:0.0.0-test' + + >>> d.description + u'testdeb\n a bogus debian package for testing dpkg builds' + + >>> d.get('nosuchheader', 'default') + 'default' + +#### Compare current version to a candidate version + + >>> dp.compare_version_with('1.0') + 1 + + >>> dp.compare_version_with('1:1.0') + -1 + +#### Compare two arbitrary version strings + + >>> from pydpkg import Dpkg + >>> ver_1 = '0:1.0-test1' + >>> ver_2 = '0:1.0-test2' + >>> Dpkg.compare_versions(ver_1, ver_2) + -1 + +#### Use as a key function to sort a list of version strings + + >>> from pydpkg import Dpkg + >>> sorted(['0:1.0-test1', '1:0.0-test0', '0:1.0-test2'] , key=Dpkg.compare_versions_key) + ['0:1.0-test1', '0:1.0-test2', '1:0.0-test0'] + +#### Use the `dpkg-inspect` script to inspect packages + + $ dpkg-inspect ~/testdeb*deb + Filename: /Home/n/testdeb_1:0.0.0-test_all.deb + Size: 910 + MD5: 149e61536a9fe36374732ec95cf7945d + SHA1: a5d28ae2f23e726a797349d7dd5f21baf8aa02b4 + SHA256: 547500652257bac6f6bc83f0667d0d66c8abd1382c776c4de84b89d0f550ab7f + Headers: + Package: testdeb + Version: 1:0.0.0-test + Section: base + Priority: extra + Architecture: all + Installed-Size: 0 + Maintainer: Nathan Mehl <n@climate.com> + Description: testdeb + a bogus debian package for testing dpkg builds + +### Source Packages + +#### Read and extract headers + + >>> from pydpkg import Dsc + >>> dsc = Dsc('testdeb_0.0.0.dsc') + >>> dsc.standards_version + '3.9.6' + >>> dsc.format + '3.0 (quilt)' + >>> x.build_depends + 'python (>= 2.6.6-3), debhelper (>= 9)' + +#### Get the full set of dsc headers as a dictionary + + >>> dsc.headers + {'Architecture': 'all', + 'Binary': 'testdeb', + 'Build-Depends': 'python (>= 2.6.6-3), debhelper (>= 9)', + 'Checksums-Sha1': ' f250ac0a426b31df24fc2c98050f4fab90e456cd 280 testdeb_0.0.0.orig.tar.gz\n cb3474ff94053018957ebcf1d8a2b45f75dda449 232 testdeb_0.0.0-1.debian.tar.xz\n 80cd7b01014a269d445c63b037b885d6002cf533 841 testdeb_0.0.0.dsc', + 'Checksums-Sha256': ' aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7 280 testdeb_0.0.0.orig.tar.gz\n 1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858 232 testdeb_0.0.0-1.debian.tar.xz\n b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a 841 testdeb_0.0.0.dsc', + 'Files': ' 142ca7334ed1f70302b4504566e0c233 280 testdeb_0.0.0.orig.tar.gz\n fc80e6e7f1c1a08b78a674aaee6c1548 232 testdeb_0.0.0-1.debian.tar.xz\n 893d13a2ef13f7409c9521e8ab1dbccb 841 testdeb_0.0.0.dsc', + 'Format': '3.0 (quilt)', + 'Homepage': 'https://github.com/TheClimateCorporation', + 'Maintainer': 'Nathan J. Mehl <n@climate.com>', + 'Package-List': 'testdeb', + 'Source': 'testdeb', + 'Standards-Version': '3.9.6', + 'Uploaders': 'Nathan J. Mehl <n@climate.com>', + 'Version': '0.0.0-1'} + +#### Interact directly with the dsc message + + >>> dsc.message + <email.message.Message instance at 0x106fedea8> + >>> dsc.message.get_content_type() + 'text/plain' + >>> dsc.message.get('uploaders') + 'Nathan J. Mehl <n@climate.com>' + +#### Render the dsc message as a string + + >>> print(dsc) + Format: 3.0 (quilt) + Source: testdeb + Binary: testdeb + Architecture: all + Version: 0.0.0-1 + Maintainer: Nathan J. Mehl <n@climate.com> + Uploaders: Nathan J. Mehl <n@climate.com> + Homepage: https://github.com/TheClimateCorporation + Standards-Version: 3.9.6 + Build-Depends: python (>= 2.6.6-3), debhelper (>= 9) + Package-List: testdeb + Checksums-Sha1: + f250ac0a426b31df24fc2c98050f4fab90e456cd 280 testdeb_0.0.0.orig.tar.gz + cb3474ff94053018957ebcf1d8a2b45f75dda449 232 testdeb_0.0.0-1.debian.tar.xz + 80cd7b01014a269d445c63b037b885d6002cf533 841 testdeb_0.0.0.dsc + Checksums-Sha256: + aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7 280 testdeb_0.0.0.orig.tar.gz + 1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858 232 testdeb_0.0.0-1.debian.tar.xz + b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a 841 testdeb_0.0.0.dsc + Files: + 142ca7334ed1f70302b4504566e0c233 280 testdeb_0.0.0.orig.tar.gz + fc80e6e7f1c1a08b78a674aaee6c1548 232 testdeb_0.0.0-1.debian.tar.xz + 893d13a2ef13f7409c9521e8ab1dbccb 841 testdeb_0.0.0.dsc + +#### List the package source files from the dsc + + >>> dsc.source_files + ['/tmp/testdeb_0.0.0.orig.tar.gz', + '/tmp/testdeb_0.0.0-1.debian.tar.xz', + '/tmp/testdeb_0.0.0.dsc' ] + +#### Validate that the package source files are present + + >>> dsc.missing_files + [] + >>> dsc.all_files_present + True + >>> dsc.validate() + >>> + + >>> bad = Dsc('testdeb_1.1.1-bad.dsc') + >>> bad.missing_files + ['/tmp/testdeb_1.1.1.orig.tar.gz', '/tmp/testdeb_1.1.1-1.debian.tar.xz'] + >>> bad.all_files_present + False + >>> bad.validate() + pydpkg.DscMissingFileError: ['/tmp/testdeb_1.1.1.orig.tar.gz', '/tmp/testdeb_1.1.1-1.debian.tar.xz'] + +#### Inspect the source file checksums from the dsc + + >>> pp(dsc.checksums) + {'md5': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'fc80e6e7f1c1a08b78a674aaee6c1548', + '/tmp/testdeb_0.0.0.dsc': '893d13a2ef13f7409c9521e8ab1dbccb', + '/tmp/testdeb_0.0.0.orig.tar.gz': '142ca7334ed1f70302b4504566e0c233'}, + 'sha1': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', + '/tmp/testdeb_0.0.0.dsc': '80cd7b01014a269d445c63b037b885d6002cf533', + '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'}, + 'sha256': {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', + '/tmp/testdeb_0.0.0.dsc': 'b5ad1591349eb48db65e6865be506ad7dbd21931902a71addee5b1db9ae1ac2a', + '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}} + +#### Validate that all source file checksums are correct + + >>> dsc.corrected_checksums + {} + >>> dsc.all_checksums_correct + True + >>> dsc.validate() + >>> + + >>> bad = Dsc('testdeb_0.0.0-badchecksums.dsc') + >>> bad.corrected_checksums + {'sha256': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}), 'sha1': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'})} + >>> bad.all_checksums_correct + False + >>> bad.validate() + pydpkg.DscBadChecksumsError: {'sha256': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': '1ddb2a7336a99bc1d203f3ddb59f6fa2d298e90cb3e59cccbe0c84e359979858', '/tmp/testdeb_0.0.0.orig.tar.gz': 'aa57ba8f29840383f5a96c5c8f166a9e6da7a484151938643ce2618e82bfeea7'}), 'sha1': defaultdict(None, {'/tmp/testdeb_0.0.0-1.debian.tar.xz': 'cb3474ff94053018957ebcf1d8a2b45f75dda449', '/tmp/testdeb_0.0.0.orig.tar.gz': 'f250ac0a426b31df24fc2c98050f4fab90e456cd'})} + + +%prep +%autosetup -n pydpkg-1.9.2 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-pydpkg -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Mon May 29 2023 Python_Bot <Python_Bot@openeuler.org> - 1.9.2-1 +- Package Spec generated |
