blob: fe37d3d475d88a08fcbc36c15841c54e230f3fe3 [file] [log] [blame]
# 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