diff --git a/bumpversion/__init__.py b/bumpversion/__init__.py index e0e5099..44389af 100644 --- a/bumpversion/__init__.py +++ b/bumpversion/__init__.py @@ -3,13 +3,17 @@ from __future__ import unicode_literals try: - from configparser import RawConfigParser, NoOptionError + # Python 3 or pip-installed "configparser" on Python 2 + from configparser import RawConfigParser, ConfigParser, NoOptionError except ImportError: - from ConfigParser import RawConfigParser, NoOptionError + # On Py2, "SafeConfigParser" is the same as "ConfigParser" on Py3 + from ConfigParser import RawConfigParser, SafeConfigParser as ConfigParser, NoOptionError try: + # Python 2 from StringIO import StringIO -except: +except ImportError: + # Python 3 from io import StringIO import argparse @@ -614,13 +618,6 @@ def main(original_args=None): if 'current_version' in vcs_info: defaults['current_version'] = vcs_info['current_version'] - config = RawConfigParser('') - - # don't transform keys to lowercase (which would be the default) - config.optionxform = lambda option: option - - config.add_section('bumpversion') - explicit_config = hasattr(known_args, 'config_file') if explicit_config: @@ -631,6 +628,17 @@ def main(original_args=None): else: config_file = '.bumpversion.cfg' + # setup.cfg supports interpolation - for compatibility we must do the same. + if os.path.basename(config_file) == 'setup.cfg': + config = ConfigParser('') + else: + config = RawConfigParser('') + + # don't transform keys to lowercase (which would be the default) + config.optionxform = lambda option: option + + config.add_section('bumpversion') + config_file_exists = os.path.exists(config_file) part_configs = {} diff --git a/tests/test_cli.py b/tests/test_cli.py index d8e1049..f65200e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -11,12 +11,13 @@ import six import subprocess -from os import environ +from datetime import datetime +from os import curdir, makedirs, chdir, environ +from os.path import join, curdir, dirname from shlex import split as shlex_split from textwrap import dedent from functools import partial - from bumpversion import main, DESCRIPTION, WorkingDirectoryIsDirtyException, \ split_args_in_optional_and_positional @@ -1947,6 +1948,36 @@ def test_regression_new_version_cli_in_files(tmpdir, capsys): assert "__version__ = '0.9.3'" == tmpdir.join("myp___init__.py").read() assert "current_version = 0.9.3" in tmpdir.join(".bumpversion.cfg").read() +def test_correct_interpolation_for_setup_cfg_files(tmpdir, configfile): + ''' + Reported here: https://github.com/c4urself/bump2version/issues/21 + ''' + tmpdir.chdir() + tmpdir.join("file.py").write("XX-XX-XXXX v. X.X.X") + tmpdir.chdir() + + if configfile == "setup.cfg": + tmpdir.join(configfile).write(dedent(""" + [bumpversion] + current_version = 0.7.2 + files = file.py + search = XX-XX-XXXX v. X.X.X + replace = {now:%%m-%%d-%%Y} v. {new_version} + """).strip()) + else: + tmpdir.join(configfile).write(dedent(""" + [bumpversion] + current_version = 0.7.2 + files = file.py + search = XX-XX-XXXX v. X.X.X + replace = {now:%m-%d-%Y} v. {new_version} + """).strip()) + + main(["major"]) + + assert datetime.now().strftime('%m-%d-%Y') + ' v. 1.0.0' == tmpdir.join("file.py").read() + assert "current_version = 1.0.0" in tmpdir.join(configfile).read() + class TestSplitArgsInOptionalAndPositional: def test_all_optional(self):