PKalGUM2++packageversion/__init__.pyfrom .packageversion import PackageVersion PK,mpG}pp packageversion/packageversion.pyimport subprocess import semantic_version import re class PackageVersion: def get_all(self, package_name): self._check_pip_version() out = subprocess.getoutput('pip install ' + package_name + '==invalid') m = re.search('from versions: ([^\)]*)\)', out) if m is None: return [] versions_string = m.group(1) version_list = versions_string.split(', ') return version_list def get_latest(self, package_name): version_list = self.get_all(package_name) latest_version = semantic_version.Version('0.0.0-na') for v in version_list: if not v: continue sv = semantic_version.Version.coerce(v, partial=True) if sv > latest_version: latest_version = sv return str(latest_version) def generate_next_stable(self, package_name): v = self.get_latest(package_name) version = semantic_version.Version.coerce(v, partial=True) major = 0 if version.major is None else version.major minor = version.minor if minor is None: minor = 0 if version.prerelease is None: if major == 0: return "%d.%d" % (major, minor) # version 0 -> 0.1 return "%d.%d.1" % (major, minor) # version 1 -> 1.0.1 return "%d" % major # version 1a2 -> 1 if version.patch is None and minor > 0: if version.prerelease is None: return "%d.%d.%d" % (major, minor, 1) # version 1.0 -> 1.0.1 return "%d.%d" % (major, minor) # version 1.0a2 -> 1.0 patch = 1 if version.patch is None else version.patch+1 return "%d.%d.%d" % (major, minor, patch) # version 1.0.1 -> 1.0.2 def _check_pip_version(self): out = subprocess.getoutput('pip --version') m = re.match('pip\s+([^\s]+)', out) version_text = m.group(1) version = semantic_version.Version(version_text) if semantic_version.Version('1.0.0') >= version: raise RuntimeError('Only pip versions larger than 1.0.0 is supported') PK"mpG#d)tests/test_packageversion.pyimport unittest import subprocess import semantic_version from packageversion import PackageVersion from flexmock import flexmock class VersionsTestCase(unittest.TestCase): def setUp(self): output = 'pip 1.5.3 from /virtualenv/lib/python3.5/site-packages (python 3.5)' flexmock(subprocess).should_receive('getoutput').with_args('pip --version').and_return(output) self._mock_version_list(['1.1.3', '1.1.4', '1.2', '1.8', '1.8.6', '1.9a1', '1.9b1']) def test_old_pip_version_raise_exception(self): out = 'pip 1.0.0 from /virtualenv/lib/python3.5/site-packages (python 3.5)' flexmock(subprocess).should_receive('getoutput').with_args('pip --version').and_return(out).once() pv = PackageVersion() self.assertRaises(RuntimeError, lambda: pv.get_all('Django')) def test_all_versions_returned_correctly(self): out = ( "Collecting Django==invalid\n" + " Could not find a version that satisfies the requirement Django==invalid (from versions: " + "1.1.3, 1.1.4, 1.2, 1.8, 1.8.6, 1.9a1, 1.9b1)\n" + "No matching distribution found for Django==invalid" ) flexmock(subprocess).should_receive('getoutput').with_args('pip install Django==invalid').and_return(out).once() pv = PackageVersion() versions = pv.get_all('Django') self.assertEqual(['1.1.3', '1.1.4', '1.2', '1.8', '1.8.6', '1.9a1', '1.9b1'], versions) def test_latest_version_returned_as_expected(self): self._mock_version_list(['1.1.3', '1.1.4', '1.2', '1.8', '1.8.6', '1.9a1', '1.9b1']) pv = PackageVersion() latest = pv.get_latest('Django') self.assertEqual(str(semantic_version.Version.coerce('1.9b1', partial=True)), latest) self._mock_version_list([], 'Flask') latest = pv.get_latest('Flask') self.assertEqual('0.0.0-na', latest) def test_generate_new_patch_version_returns_expected_value(self): self._mock_version_list(['1.1.3', '1.1.4', '1.2', '1.8', '1.8.6', '1.9a1', '1.9b1']) pv = PackageVersion() next_version = pv.generate_next_stable('Django') self.assertEqual('1.9', next_version) self._mock_version_list(['1'], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('1.0.1', next_version) self._mock_version_list(['1.0'], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('1.0.1', next_version) self._mock_version_list(['0'], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('0.0.1', next_version) self._mock_version_list([], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('0.0.1', next_version) self._mock_version_list(['1.9-a2'], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('1.9', next_version) self._mock_version_list(['1.9'], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('1.9.1', next_version) self._mock_version_list(['1-a2'], 'Flask') next_version = pv.generate_next_stable('Flask') self.assertEqual('1', next_version) def _mock_version_list(self, version_list, package_name='Django'): version_string = ", ".join(version_list) output = ( 'Collecting '+package_name+'==invalid'+"\n" + ' Could not find a version that satisfies the requirement '+package_name+'==invalid (from versions: ' + version_string+')' + "\n" + 'No matching distribution found for '+package_name+'==invalid' ) flexmock(subprocess).should_receive('getoutput').with_args( 'pip install '+package_name+'==invalid').and_return(output) PKzmGtests/__init__.pyPKc@qG^- /package_version-1.0.0.dist-info/DESCRIPTION.rstUNKNOWN PKc@qG,d-package_version-1.0.0.dist-info/metadata.json{"classifiers": ["License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4"], "extensions": {"python.details": {"contacts": [{"email": "jon.skarpeteig@gmail.com", "name": "Jon Skarpeteig", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/Yuav/python-package-version"}}}, "extras": [], "generator": "bdist_wheel (0.26.0)", "metadata_version": "2.0", "name": "package-version", "run_requires": [{"requires": ["flexmock", "semantic-version"]}], "summary": "Library to generate python package version for CI", "version": "1.0.0"}PKc@qGyL-package_version-1.0.0.dist-info/top_level.txtpackageversion tests PKc@qG}\\%package_version-1.0.0.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py3-none-any PKc@qG6XX(package_version-1.0.0.dist-info/METADATAMetadata-Version: 2.0 Name: package-version Version: 1.0.0 Summary: Library to generate python package version for CI Home-page: https://github.com/Yuav/python-package-version Author: Jon Skarpeteig Author-email: jon.skarpeteig@gmail.com License: UNKNOWN Platform: UNKNOWN Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Requires-Dist: flexmock Requires-Dist: semantic-version UNKNOWN PKc@qG;8dd&package_version-1.0.0.dist-info/RECORDpackage_version-1.0.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 package_version-1.0.0.dist-info/METADATA,sha256=W0d8lOPahzPjZ-gJa4_pcqndf8rxD7Cckz2YNlPBWNo,600 package_version-1.0.0.dist-info/RECORD,, package_version-1.0.0.dist-info/WHEEL,sha256=zX7PHtH_7K-lEzyK75et0UBa3Bj8egCBMXe1M4gc6SU,92 package_version-1.0.0.dist-info/metadata.json,sha256=GzONM01Jz5rsK3IehvWaTwIRF7hwGDEgYdGYBuTvJb0,750 package_version-1.0.0.dist-info/top_level.txt,sha256=Xq0nVcKd7yruE6Yz1MLDa1yjgujzspptH8aTzQN9N4I,21 packageversion/__init__.py,sha256=kDUIQF3HIy-lnO7McfeczI1LBpb4uBCa_H4w3kFetls,43 packageversion/packageversion.py,sha256=26LAirm5nYgCXn3eJzQjSAYMDNVvVHsn3Yv2FizwnAQ,2160 tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 tests/test_packageversion.py,sha256=FprbJb7zjbMMjryZajxoSa73utgYa_FYG_gsJp5Nxuc,3861 PKalGUM2++packageversion/__init__.pyPK,mpG}pp cpackageversion/packageversion.pyPK"mpG#d) tests/test_packageversion.pyPKzmG`tests/__init__.pyPKc@qG^- /package_version-1.0.0.dist-info/DESCRIPTION.rstPKc@qG,d-package_version-1.0.0.dist-info/metadata.jsonPKc@qGyL-package_version-1.0.0.dist-info/top_level.txtPKc@qG}\\%package_version-1.0.0.dist-info/WHEELPKc@qG6XX(package_version-1.0.0.dist-info/METADATAPKc@qG;8dd&package_version-1.0.0.dist-info/RECORDPK /d#