| # 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 |