Skip to content

Commit 555a971

Browse files
committed
add fiscal year versioning
1 parent 0f9810e commit 555a971

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

dcpy/test/utils/test_versions.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ def test_parsing_valid_versions(self):
2424
format=versions.DateVersionFormat.quarter,
2525
),
2626
],
27+
[
28+
"FY2020",
29+
versions.Date(
30+
date=date(2020, 1, 1),
31+
format=versions.DateVersionFormat.fiscal_year,
32+
),
33+
],
2734
[
2835
"26prelim",
2936
versions.CapitalBudget(
@@ -62,6 +69,8 @@ def test_parsing_invalid_version(self):
6269
versions.parse("23v")
6370
with self.assertRaises(Exception):
6471
versions.parse("2v12")
72+
with self.assertRaises(Exception):
73+
versions.parse("FY26")
6574
with self.assertRaises(Exception):
6675
versions.parse("20231212")
6776
with self.assertRaises(Exception):
@@ -158,6 +167,7 @@ def test_sort_invalid_versions(self):
158167
def test_is_newer_valid_versions(self):
159168
for version_1, version_2, bool_expected in [
160169
["23v2", "22v3.4", True],
170+
["FY2019", "FY2020", False],
161171
["23Q1", "23Q2", False],
162172
["23v2.0.1", "23v2", True],
163173
["23Q1.1", "23Q1", True],
@@ -182,6 +192,7 @@ def test_bumping_versions(self):
182192
["major", None, "23v2.1", "23v3"],
183193
["minor", None, "23v2", "23v2.1"],
184194
["minor", None, "23v2.1", "23v2.2"],
195+
[None, 1, "FY2020", "FY2021"],
185196
[None, 1, "23Q1", "23Q2"],
186197
[None, 2, "23Q4", "24Q2"],
187198
[None, 7, "23Q2", "25Q1"],

dcpy/utils/versions.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
class DateVersionFormat(StrEnum):
13+
fiscal_year = "Fiscal Year"
1314
quarter = "Quarter"
1415
month = "Month"
1516
date = "Date"
@@ -159,6 +160,13 @@ class Date(Version):
159160
@property
160161
def label(self) -> str:
161162
match self.format:
163+
case DateVersionFormat.fiscal_year:
164+
if self.patch == 0:
165+
return (
166+
f"FY{self.date.strftime('%Y')}"
167+
)
168+
else:
169+
return f"FY{self.date.strftime('%Y')}.{self.patch}"
162170
case DateVersionFormat.quarter:
163171
if self.patch == 0:
164172
return (
@@ -176,6 +184,8 @@ def label(self) -> str:
176184
return self.date.strftime("%Y-%m-%d")
177185
else:
178186
return f"{self.date.strftime('%Y-%m-%d')}.{self.patch}"
187+
case _:
188+
raise ValueError(f"Unsupported DateVersionFormat '{self.format}'")
179189

180190
def __lt__(self, other) -> bool:
181191
match other:
@@ -253,6 +263,11 @@ def parse(v: str) -> Version:
253263
return MajorMinor(
254264
year=int(m[1]), major=int(m[2]), minor=int(m[3]), patch=int(m[4])
255265
)
266+
case r"^FY(\d{4})$" as m:
267+
return Date(
268+
date(int(m[1]), 1, 1),
269+
format=DateVersionFormat.fiscal_year,
270+
)
256271
case r"^(\d{2})Q(\d)$" as m:
257272
return Date(
258273
date(2000 + int(m[1]), int(m[2]) * 3 - 2, 1),
@@ -403,6 +418,11 @@ def bump(
403418
minor=previous_version.minor,
404419
patch=previous_version.patch + bump_by,
405420
)
421+
case Date(format=DateVersionFormat.fiscal_year), None:
422+
return Date(
423+
date=previous_version.date + relativedelta(years=bump_by),
424+
format=previous_version.format,
425+
)
406426
case Date(format=DateVersionFormat.quarter), None:
407427
return Date(
408428
date=previous_version.date + relativedelta(months=bump_by * 3),

0 commit comments

Comments
 (0)