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.
This commit is contained in:
Manuel Barkhau 2022-02-11 22:33:16 +00:00
parent 028d77751b
commit 53617b2624
4 changed files with 55 additions and 43 deletions

View file

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

View file

@ -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):

View file

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

View file

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