From 53617b2624eccce97543449697c127ae98e981bc Mon Sep 17 00:00:00 2001 From: Manuel Barkhau Date: Fri, 11 Feb 2022 22:33:16 +0000 Subject: [PATCH] fix: gh#172 use default date values When parsing the current version, if it doesn't specify anyt date part, (such as is the case for e.g. SemVer), then use the current date to populate default parts. This enables updating YYYY patterns in copyright headers even for projects that don't use a CalVer pattern. --- src/bumpver/cli.py | 26 +++++++++---------- src/bumpver/v1version.py | 16 ++++++------ src/bumpver/v2version.py | 54 ++++++++++++++++++++++++---------------- test/test_cli.py | 2 +- 4 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/bumpver/cli.py b/src/bumpver/cli.py index dd37fe0..9f1d1e2 100755 --- a/src/bumpver/cli.py +++ b/src/bumpver/cli.py @@ -281,7 +281,7 @@ def test( raw_pattern = pattern # use internal naming convention _validate_flags(raw_pattern, major, minor, patch) - _date = _validate_date(date, pin_date) + maybe_date = _validate_date(date, pin_date) if set_version is None: new_version = incr_dispatch( @@ -293,7 +293,7 @@ def test( tag=tag, tag_num=tag_num, pin_date=pin_date, - date=_date, + maybe_date=maybe_date, ) else: new_version = set_version @@ -522,13 +522,13 @@ def incr_dispatch( old_version: str, raw_pattern: str, *, - major : bool = False, - minor : bool = False, - patch : bool = False, - tag : str = None, - tag_num : bool = False, - pin_date: bool = False, - date : typ.Optional[dt.date] = None, + major : bool = False, + minor : bool = False, + patch : bool = False, + tag : str = None, + tag_num : bool = False, + pin_date : bool = False, + maybe_date: typ.Optional[dt.date] = None, ) -> typ.Optional[str]: v1_parts = list(v1patterns.PART_PATTERNS) + list(v1patterns.FULL_PART_FORMATS) has_v1_part = any("{" + part + "}" in raw_pattern for part in v1_parts) @@ -552,7 +552,7 @@ def incr_dispatch( tag=tag, tag_num=tag_num, pin_date=pin_date, - date=date, + maybe_date=maybe_date, ) else: return v2version.incr( @@ -564,7 +564,7 @@ def incr_dispatch( tag=tag, tag_num=tag_num, pin_date=pin_date, - date=date, + maybe_date=maybe_date, ) @@ -762,7 +762,7 @@ def update( verbose = max(_VERBOSE, verbose) _configure_logging(verbose) _validate_release_tag(tag) - _date = _validate_date(date, pin_date) + maybe_date = _validate_date(date, pin_date) _, cfg = config.init(project_path=".") @@ -789,7 +789,7 @@ def update( tag=tag, tag_num=tag_num, pin_date=pin_date, - date=_date, + maybe_date=maybe_date, ) else: new_version = set_version diff --git a/src/bumpver/v1version.py b/src/bumpver/v1version.py index 67176b5..8c25c1e 100644 --- a/src/bumpver/v1version.py +++ b/src/bumpver/v1version.py @@ -381,13 +381,13 @@ def incr( old_version: str, raw_pattern: str = "{pycalver}", *, - major : bool = False, - minor : bool = False, - patch : bool = False, - tag : typ.Optional[str] = None, - tag_num : bool = False, - pin_date: bool = False, - date : typ.Optional[dt.date] = None, + major : bool = False, + minor : bool = False, + patch : bool = False, + tag : typ.Optional[str] = None, + tag_num : bool = False, + pin_date : bool = False, + maybe_date: typ.Optional[dt.date] = None, ) -> typ.Optional[str]: """Increment version string. @@ -399,6 +399,8 @@ def incr( logger.error(str(ex)) return None + date = version.TODAY if maybe_date is None else maybe_date + cur_cinfo = _ver_to_cal_info(old_vinfo) if pin_date else cal_info(date) if _is_cal_gt(old_vinfo, cur_cinfo): diff --git a/src/bumpver/v2version.py b/src/bumpver/v2version.py index e591117..f68fc78 100644 --- a/src/bumpver/v2version.py +++ b/src/bumpver/v2version.py @@ -35,20 +35,6 @@ def _is_cal_gt(left: CalInfo, right: CalInfo) -> bool: return lvals > rvals -def _ver_to_cal_info(vinfo: version.V2VersionInfo) -> version.V2CalendarInfo: - return version.V2CalendarInfo( - vinfo.year_y, - vinfo.year_g, - vinfo.quarter, - vinfo.month, - vinfo.dom, - vinfo.doy, - vinfo.week_w, - vinfo.week_u, - vinfo.week_v, - ) - - def cal_info(date: dt.date = None) -> version.V2CalendarInfo: """Generate calendar components for current date. @@ -88,6 +74,21 @@ def cal_info(date: dt.date = None) -> version.V2CalendarInfo: return version.V2CalendarInfo(**kwargs) +def _ver_to_cal_info(vinfo: version.V2VersionInfo) -> version.V2CalendarInfo: + defaults = cal_info(version.TODAY) + return version.V2CalendarInfo( + vinfo.year_y or defaults.year_y, + vinfo.year_g or defaults.year_g, + vinfo.quarter or defaults.quarter, + vinfo.month or defaults.month, + vinfo.dom or defaults.dom, + vinfo.doy or defaults.doy, + vinfo.week_w or defaults.week_w, + vinfo.week_u or defaults.week_u, + vinfo.week_v or defaults.week_v, + ) + + VALID_FIELD_KEYS = set(version.V2VersionInfo._fields) | {'version'} MaybeInt = typ.Optional[int] @@ -151,8 +152,14 @@ def parse_field_values_to_cinfo(field_values: FieldValues) -> version.V2Calendar if year_y and month and dom: date = dt.date(year_y, month, dom) + # Use of defaults is an all or nothing affair. + # We don't to mix anything from TODAY with stuff + # that was actually parsed from a string. + if not any((date, year_y, year_g, month, dom, doy, week_w, week_u, week_v)): + date = version.TODAY + + # derive all fields from other previous values if date: - # derive all fields from other previous values year_y = int(date.strftime("%Y"), base=10) year_g = int(date.strftime("%G"), base=10) month = int(date.strftime("%m"), base=10) @@ -725,13 +732,13 @@ def incr( old_version: str, raw_pattern: str = "vYYYY0M.BUILD[-TAG]", *, - major : bool = False, - minor : bool = False, - patch : bool = False, - tag : typ.Optional[str] = None, - tag_num : bool = False, - pin_date: bool = False, - date : typ.Optional[dt.date] = None, + major : bool = False, + minor : bool = False, + patch : bool = False, + tag : typ.Optional[str] = None, + tag_num : bool = False, + pin_date : bool = False, + maybe_date: typ.Optional[dt.date] = None, ) -> typ.Optional[str]: """Increment version string. @@ -740,6 +747,8 @@ def incr( if not is_valid_week_pattern(raw_pattern): return None + date = version.TODAY if maybe_date is None else maybe_date + try: old_vinfo = parse_version_info(old_version, raw_pattern) except version.PatternError as ex: @@ -772,6 +781,7 @@ def incr( ) new_version = format_version(cur_vinfo, raw_pattern) + if new_version == old_version: logger.error("Invalid arguments or pattern, version did not change.") return None diff --git a/test/test_cli.py b/test/test_cli.py index 7c8ffeb..a177d06 100644 --- a/test/test_cli.py +++ b/test/test_cli.py @@ -1200,7 +1200,7 @@ def test_multimatch_file_patterns(config_text, runner): def _kwargs(year, month, minor=False): - return {'date': dt.date(year, month, 1), 'minor': minor} + return {'maybe_date': dt.date(year, month, 1), 'minor': minor} ROLLOVER_TEST_CASES = [