From 46e45b0286998765f4f285f7fbd095077b76175c Mon Sep 17 00:00:00 2001 From: Seth M Morton Date: Sun, 19 Aug 2018 22:39:28 -0700 Subject: [PATCH 1/4] Add interpolation when reading setup.cfg. Setuptools uses the default ConfigParser object when reading setup.cfg which does interpolation. To be consistent with that format bumpversion must do the same. This will close issue #21. --- bumpversion/__init__.py | 22 +++++++++++++--------- tests/test_cli.py | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/bumpversion/__init__.py b/bumpversion/__init__.py index e0e5099..ac7eed7 100644 --- a/bumpversion/__init__.py +++ b/bumpversion/__init__.py @@ -3,9 +3,9 @@ from __future__ import unicode_literals try: - from configparser import RawConfigParser, NoOptionError + from configparser import RawConfigParser, ConfigParser, NoOptionError except ImportError: - from ConfigParser import RawConfigParser, NoOptionError + from ConfigParser import RawConfigParser, SafeConfigParser as ConfigParser, NoOptionError try: from StringIO import StringIO @@ -614,13 +614,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 +624,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): From 51b30047abcbd1b459989107c0f0291ec7fb6e1a Mon Sep 17 00:00:00 2001 From: Seth M Morton Date: Fri, 24 Aug 2018 21:31:41 -0700 Subject: [PATCH 2/4] Add clarifying comment on configparser import. --- bumpversion/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bumpversion/__init__.py b/bumpversion/__init__.py index ac7eed7..d258d9f 100644 --- a/bumpversion/__init__.py +++ b/bumpversion/__init__.py @@ -3,8 +3,10 @@ from __future__ import unicode_literals try: + # Python 3 or pip-installed "configparser" on Python 2 from configparser import RawConfigParser, ConfigParser, NoOptionError except ImportError: + # On Py2, "SafeConfigParser" is the same as "ConfigParser" on Py3 from ConfigParser import RawConfigParser, SafeConfigParser as ConfigParser, NoOptionError try: From 85a3c9f9c80b5340f95ad9580f1bf4911acd26c1 Mon Sep 17 00:00:00 2001 From: Seth M Morton Date: Fri, 24 Aug 2018 21:33:01 -0700 Subject: [PATCH 3/4] Add clarifying comment in StringIO import. --- bumpversion/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bumpversion/__init__.py b/bumpversion/__init__.py index d258d9f..efb3678 100644 --- a/bumpversion/__init__.py +++ b/bumpversion/__init__.py @@ -10,8 +10,10 @@ from ConfigParser import RawConfigParser, SafeConfigParser as ConfigParser, NoOptionError try: + # Python 2 from StringIO import StringIO except: + # Python 3 from io import StringIO import argparse From e5688dc7d5aeaab1d35801506585e151c9cbf93a Mon Sep 17 00:00:00 2001 From: Seth M Morton Date: Fri, 24 Aug 2018 21:34:01 -0700 Subject: [PATCH 4/4] Specify exception on StringIO import. Leaving things better than I found it :) --- bumpversion/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bumpversion/__init__.py b/bumpversion/__init__.py index efb3678..44389af 100644 --- a/bumpversion/__init__.py +++ b/bumpversion/__init__.py @@ -12,7 +12,7 @@ try: # Python 2 from StringIO import StringIO -except: +except ImportError: # Python 3 from io import StringIO