89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
|
# coding: utf-8
|
||
|
from __future__ import unicode_literals, division, absolute_import, print_function
|
||
|
|
||
|
import codecs
|
||
|
import os
|
||
|
import re
|
||
|
|
||
|
from . import package_root, package_name, has_tests_package
|
||
|
|
||
|
|
||
|
run_args = [
|
||
|
{
|
||
|
'name': 'pep440_version',
|
||
|
'required': True
|
||
|
},
|
||
|
]
|
||
|
|
||
|
|
||
|
def run(new_version):
|
||
|
"""
|
||
|
Updates the package version in the various locations
|
||
|
|
||
|
:param new_version:
|
||
|
A unicode string of the new library version as a PEP 440 version
|
||
|
|
||
|
:return:
|
||
|
A bool - if the version number was successfully bumped
|
||
|
"""
|
||
|
|
||
|
# We use a restricted form of PEP 440 versions
|
||
|
version_match = re.match(
|
||
|
r'(\d+)\.(\d+)\.(\d)+(?:\.((?:dev|a|b|rc)\d+))?$',
|
||
|
new_version
|
||
|
)
|
||
|
if not version_match:
|
||
|
raise ValueError('Invalid PEP 440 version: %s' % new_version)
|
||
|
|
||
|
new_version_info = (
|
||
|
int(version_match.group(1)),
|
||
|
int(version_match.group(2)),
|
||
|
int(version_match.group(3)),
|
||
|
)
|
||
|
if version_match.group(4):
|
||
|
new_version_info += (version_match.group(4),)
|
||
|
|
||
|
version_path = os.path.join(package_root, package_name, 'version.py')
|
||
|
setup_path = os.path.join(package_root, 'setup.py')
|
||
|
setup_tests_path = os.path.join(package_root, 'tests', 'setup.py')
|
||
|
tests_path = os.path.join(package_root, 'tests', '__init__.py')
|
||
|
|
||
|
file_paths = [version_path, setup_path]
|
||
|
if has_tests_package:
|
||
|
file_paths.extend([setup_tests_path, tests_path])
|
||
|
|
||
|
for file_path in file_paths:
|
||
|
orig_source = ''
|
||
|
with codecs.open(file_path, 'r', encoding='utf-8') as f:
|
||
|
orig_source = f.read()
|
||
|
|
||
|
found = 0
|
||
|
new_source = ''
|
||
|
for line in orig_source.splitlines(True):
|
||
|
if line.startswith('__version__ = '):
|
||
|
found += 1
|
||
|
new_source += '__version__ = %r\n' % new_version
|
||
|
elif line.startswith('__version_info__ = '):
|
||
|
found += 1
|
||
|
new_source += '__version_info__ = %r\n' % (new_version_info,)
|
||
|
elif line.startswith('PACKAGE_VERSION = '):
|
||
|
found += 1
|
||
|
new_source += 'PACKAGE_VERSION = %r\n' % new_version
|
||
|
else:
|
||
|
new_source += line
|
||
|
|
||
|
if found == 0:
|
||
|
raise ValueError('Did not find any versions in %s' % file_path)
|
||
|
|
||
|
s = 's' if found > 1 else ''
|
||
|
rel_path = file_path[len(package_root) + 1:]
|
||
|
was_were = 'was' if found == 1 else 'were'
|
||
|
if new_source != orig_source:
|
||
|
print('Updated %d version%s in %s' % (found, s, rel_path))
|
||
|
with codecs.open(file_path, 'w', encoding='utf-8') as f:
|
||
|
f.write(new_source)
|
||
|
else:
|
||
|
print('%d version%s in %s %s up-to-date' % (found, s, rel_path, was_were))
|
||
|
|
||
|
return True
|