Source: | https://github.com/ihiji/version_utils |
---|---|
PyPI: | https://pypi.python.org/pypi/version_utils |
Maintainer: | Matthew Planchard <msplanchard@gmail.com> |
License: | GPLv3 |
Table of Contents
version_utils
is designed to provide a pure Python convenience library
capable of parsing and comparing package and version strings for a variety of
packaging standards. Whenever possible, the exact logic of existing package
management comparison standards will be implemented so that users can trust that
the results are equivalent to what they would get on the command-line.
Using version_utils
ensures that packages can be compared even on systems
without access to the command line or distro-provided tools on various Linux
systems, allowing for easier and more consistent unit testing, safer
deployment to multiple distributions, and easier and quicker development due
to a well-documented API and standardized function calls.
This package is no longer being actively developed, although I will accept quality PRs and include them in new releases.
Currently, only RPM/Yum style packages are officially supported. Feel free to open a PR with support for other package formats if you are interested!
Note that the compare_versions
function in the rpm
module will probably
work for the majority of .deb
package versions. However, there are some
differences, and it will fail in certain cases. Use at your own risk unless
official support for debian version parsing is released.
This package has no dependencies, so a simple:
pip install version_utils
should suffice. Feel free to build from source as well, if you prefer.
Check the API documentation to ensure the module you are seeking to use is
present. The example below uses the rpm
module. From your application:
from subprocess import PIPE, Popen from version_utils import rpm pkg_req = 1.07 # Get a package string for an installed package out, err = Popen(['rpm', '-q', 'foo'], stdout=PIPE, stderr=PIPE).communicate() sys_pkg_str = out # Get package information sys_package = rpm.package(sys_pkg_str) sys_pkg_name = sys_package.name sys_pkg_version = sys_package.version # Compare versions result = rpm.compare_versions(pkg_req, sys_pkg_version) if result < 0: # sys_pkg was newer print('System package {0} does not satisfy requirement!'.format(sys_pkg_name))
In addition to indirectly comparing versions, a compare_packages
function is provided to directly compare package strings, using the
same logic as the package manager:
from version_utils import rpm sys_pkg = 'perl-Compress-Raw-Zlib-2.021-136.el6_6.1.x86_64' repo_pkg = 'perl-Compress-Raw-Zlib-2.021-138.el6_6.1.x86_64' result = rpm.compare_packages(repo_pkg, sys_pkg) if result > 0: # repo_pkg is newer print('Repo package is newer')
The Package
class can be used to succinctly transmit package
information. A factory function, rpm.package()
, is provided to
instantiate Package
instances:
from version_utils import rpm pkg_str = 'pkgconfig-0.23-9.1.el6.x86_64' pkg = rpm.package(pkg_str) # Get package name, epoch, version, release, and architecture as a tuple print(pkg.info) # Access the package string that was parsed to make the Package object print(pkg.package) # Access the epoch, version, and release information as a tuple print(pkg.evr) # Access name, epoch, version, release, and architecture independently print('Name: {0}, Epoch: {1}, Version: {2}, Release: {3}, Arch: {4}'.format(pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch))
Contributions to version_utils
are welcome. Feel free to fork, raise
issues, etc.
I would like to express my sincere thanks to the following GitHub users for their contributions to and assistance with this project:
- Joseph Knight (jknightihiji)
- Thomas Hoger (thoger)
- Marcus Furlong (furlongm)
- Alex (alxgu)
- Owen Taylor (@owtaylor)
Fix comparison for versions containing ~
(207a707, thanks @owtaylor!)
Updated documentation (alxgu)
Added labelCompare functionality for parity with the official rpm package
Updated tests to use py.test; added more tests
Improved test logging
Improved logging efficiency with %s formatting
Fixed issue #7 where version strings without epoch strings and with multi- digit primary version numbers would return the first digit of the primary version as the epoch and the second digit as the primary version.
Added version.py
with automatic version parsing by setup.py
Added rpm
and common
modules to __init__.py
Imported __version__
and __version_info__
information into
__init__.py
Added tox.ini
and tox integration
Improved error handling in the compare_versions
function in rpm
Bugfix release only
Added common.Package class and rpm.package method to return a Package object when parsing package strings.
Deprecated public access to the rpm.parse_package method, although the function remains unchanged for backwards compatibility.
Added VersionUtilsError and RpmError classes. RpmError is thrown if a package string cannot be parsed. All errors inherit from VersionUtilsError
Initial release