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 = [