owlplanner 2025.2.20__py3-none-any.whl → 2025.2.22__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- owlplanner/config.py +8 -1
- owlplanner/plan.py +10 -1
- owlplanner/version.py +1 -1
- {owlplanner-2025.2.20.dist-info → owlplanner-2025.2.22.dist-info}/METADATA +1 -1
- {owlplanner-2025.2.20.dist-info → owlplanner-2025.2.22.dist-info}/RECORD +7 -7
- {owlplanner-2025.2.20.dist-info → owlplanner-2025.2.22.dist-info}/WHEEL +0 -0
- {owlplanner-2025.2.20.dist-info → owlplanner-2025.2.22.dist-info}/licenses/LICENSE +0 -0
owlplanner/config.py
CHANGED
|
@@ -28,6 +28,7 @@ def saveConfig(plan, file, mylog):
|
|
|
28
28
|
|
|
29
29
|
diconf = {}
|
|
30
30
|
diconf["Plan Name"] = plan._name
|
|
31
|
+
diconf["Description"] = plan._description
|
|
31
32
|
|
|
32
33
|
# Basic Info.
|
|
33
34
|
diconf["Basic Info"] = {
|
|
@@ -180,11 +181,12 @@ def readConfig(file, *, verbose=True, logstreams=None, readContributions=True):
|
|
|
180
181
|
# status = diconf['Basic Info']['Status']
|
|
181
182
|
yobs = diconf["Basic Info"]["Birth year"]
|
|
182
183
|
expectancy = diconf["Basic Info"]["Life expectancy"]
|
|
183
|
-
startDate = diconf["Basic Info"]
|
|
184
|
+
startDate = diconf["Basic Info"].get("Start date", "today")
|
|
184
185
|
icount = len(yobs)
|
|
185
186
|
s = ["", "s"][icount - 1]
|
|
186
187
|
mylog.vprint(f"Plan for {icount} individual{s}: {inames}.")
|
|
187
188
|
p = plan.Plan(inames, yobs, expectancy, name, startDate=startDate, verbose=True, logstreams=logstreams)
|
|
189
|
+
plan._description = diconf.get("Description", "")
|
|
188
190
|
|
|
189
191
|
# Assets.
|
|
190
192
|
balances = {}
|
|
@@ -295,6 +297,11 @@ def readConfig(file, *, verbose=True, logstreams=None, readContributions=True):
|
|
|
295
297
|
# Solver Options.
|
|
296
298
|
p.solverOptions = diconf["Solver Options"]
|
|
297
299
|
|
|
300
|
+
# Check consistency of noRothConversions.
|
|
301
|
+
name = p.solverOptions.get("noRothConversions", "None")
|
|
302
|
+
if name != "None" and name not in p.inames:
|
|
303
|
+
raise ValueError(f"Unknown name {name} for noRothConversions.")
|
|
304
|
+
|
|
298
305
|
# Results.
|
|
299
306
|
p.setDefaultPlots(diconf["Results"]["Default plots"])
|
|
300
307
|
|
owlplanner/plan.py
CHANGED
|
@@ -239,6 +239,7 @@ class Plan(object):
|
|
|
239
239
|
self.interpCenter = 15
|
|
240
240
|
self.interpWidth = 5
|
|
241
241
|
|
|
242
|
+
self._description = ''
|
|
242
243
|
self.defaultPlots = "nominal"
|
|
243
244
|
self.defaultSolver = "HiGHS"
|
|
244
245
|
|
|
@@ -406,6 +407,12 @@ class Plan(object):
|
|
|
406
407
|
self.mylog.vprint(f"Renaming plan {self._name} -> {newname}.")
|
|
407
408
|
self._name = newname
|
|
408
409
|
|
|
410
|
+
def setDescription(self, description):
|
|
411
|
+
"""
|
|
412
|
+
Set a text description of the plan.
|
|
413
|
+
"""
|
|
414
|
+
self._description = description
|
|
415
|
+
|
|
409
416
|
def setSpousalDepositFraction(self, eta):
|
|
410
417
|
"""
|
|
411
418
|
Set spousal deposit and withdrawal fraction. Default 0.5.
|
|
@@ -2069,6 +2076,8 @@ class Plan(object):
|
|
|
2069
2076
|
now = self.year_n[0]
|
|
2070
2077
|
dic = {}
|
|
2071
2078
|
# Results
|
|
2079
|
+
dic["Plan name"] = self._name
|
|
2080
|
+
dic["Brief description"] = self._description
|
|
2072
2081
|
dic[f"Net yearly spending basis in {now}$"] = u.d(self.g_n[0] / self.xi_n[0])
|
|
2073
2082
|
dic[f"Net yearly spending for year {now}"] = u.d(self.g_n[0] / self.yearFracLeft)
|
|
2074
2083
|
dic[f"Net spending remaining in year {now}"] = u.d(self.g_n[0])
|
|
@@ -2895,7 +2904,7 @@ def _stackPlot(x, inames, title, irange, series, snames, location, yformat="\\$k
|
|
|
2895
2904
|
|
|
2896
2905
|
if len(nonzeroSeries) == 0:
|
|
2897
2906
|
# print('Nothing to plot for', title)
|
|
2898
|
-
return None
|
|
2907
|
+
return None, None
|
|
2899
2908
|
|
|
2900
2909
|
fig, ax = plt.subplots(figsize=(6, 4))
|
|
2901
2910
|
plt.grid(visible="both")
|
owlplanner/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2025.02.
|
|
1
|
+
__version__ = "2025.02.22"
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
owlplanner/__init__.py,sha256=QqrdT0Qks20osBTg7h0vJHAxpP9lL7DA99xb0nYbtw4,254
|
|
2
2
|
owlplanner/abcapi.py,sha256=LbzW_KcNy0IeHp42MUHwGu_H67B2h_e1_vu-c2ACTkQ,6646
|
|
3
|
-
owlplanner/config.py,sha256=
|
|
3
|
+
owlplanner/config.py,sha256=yoi9dTpA-BVCPnbcDwPWO8dkTDFeMft4KRvuqZepzxA,12164
|
|
4
4
|
owlplanner/logging.py,sha256=tYMw04O-XYSzjTj36fmKJGLcE1VkK6k6oJNeqtKXzuc,2530
|
|
5
|
-
owlplanner/plan.py,sha256=
|
|
5
|
+
owlplanner/plan.py,sha256=RTkIT5tJ_Ar0hCBx0G1ScjaGLuxdsRDqwWC1eosp5po,113860
|
|
6
6
|
owlplanner/progress.py,sha256=8jlCvvtgDI89zXVNMBg1-lnEyhpPvKQS2X5oAIpoOVQ,384
|
|
7
7
|
owlplanner/rates.py,sha256=TN407qU4n-bac1oymkQ_n2QKEPwFQxy6JZVGwgIkLQU,15585
|
|
8
8
|
owlplanner/tax2025.py,sha256=B-A5eU3wxdcAaxRCbT3qI-JEKoD_ZeNbg_86XhNdQEI,7745
|
|
9
9
|
owlplanner/timelists.py,sha256=tYieZU67FT6TCcQQis36JaXGI7dT6NqD7RvdEjgJL4M,4026
|
|
10
10
|
owlplanner/utils.py,sha256=HM70W60qB41zfnbl2LltNwAuLYHyy5XYbwnbNcaa6FE,2351
|
|
11
|
-
owlplanner/version.py,sha256=
|
|
11
|
+
owlplanner/version.py,sha256=9rZICePFVRaLH3DbBPmhbkwGMbL4PJlxOgWYgOrbcGw,28
|
|
12
12
|
owlplanner/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
owlplanner/data/rates.csv,sha256=6fxg56BVVORrj9wJlUGFdGXKvOX5r7CSca8uhUbbuIU,3734
|
|
14
|
-
owlplanner-2025.2.
|
|
15
|
-
owlplanner-2025.2.
|
|
16
|
-
owlplanner-2025.2.
|
|
17
|
-
owlplanner-2025.2.
|
|
14
|
+
owlplanner-2025.2.22.dist-info/METADATA,sha256=nl-Se08p2SfUG8NbbeHQslxuaRA-VWKBvkAlI2vpid0,53506
|
|
15
|
+
owlplanner-2025.2.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
16
|
+
owlplanner-2025.2.22.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
17
|
+
owlplanner-2025.2.22.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|