owlplanner 2025.2.21__tar.gz → 2025.2.22__tar.gz
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-2025.2.21 → owlplanner-2025.2.22}/PKG-INFO +1 -1
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/case_jack+jill.toml +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/case_joe.toml +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/case_john+sally.toml +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/case_jon+jane.toml +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/case_kim+sam-bequest.toml +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/case_kim+sam-spending.toml +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/pyproject.toml +1 -1
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/config.py +2 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/plan.py +9 -0
- owlplanner-2025.2.22/src/owlplanner/version.py +1 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Create_Case.py +4 -1
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/owlbridge.py +6 -1
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/requirements.txt +1 -1
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/sskeys.py +2 -1
- owlplanner-2025.2.21/src/owlplanner/version.py +0 -1
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/.flake8 +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/.gitattributes +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/.gitignore +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/INSTALL.md +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/LICENSE +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/README.md +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/USER_GUIDE.md +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docker/Dockerfile +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docker/README.md +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/allocations.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/owl.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/profile.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/owl.pdf +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/docs/owl.tex +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/joe.xlsx +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/examples/template.xlsx +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/notebooks/template.ipynb +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/owlplanner.cmd +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/owlplanner.sh +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/requirements.txt +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/abcapi.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/logging.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/tax2025.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/tests/test_logger.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/tests/test_regressions.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/tests/test_repro.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/tests/test_units.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ttt.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/About_Owl.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Assets.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Documentation.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Graphs.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Logs.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Optimization_Parameters.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Output_Files.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Quick_Start.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/README.md +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Rates_Selection.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Settings.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Wages_And_Contributions.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/Worksheets.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/main+fonts.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/main.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/plots.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/progress.py +0 -0
- {owlplanner-2025.2.21 → owlplanner-2025.2.22}/ui/style.css +0 -0
|
@@ -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"] = {
|
|
@@ -185,6 +186,7 @@ def readConfig(file, *, verbose=True, logstreams=None, readContributions=True):
|
|
|
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 = {}
|
|
@@ -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])
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2025.02.22"
|
|
@@ -40,7 +40,6 @@ else:
|
|
|
40
40
|
on_change=kz.renameCase,
|
|
41
41
|
args=["caseNewName"],
|
|
42
42
|
key="_caseNewName",
|
|
43
|
-
placeholder="Enter a name",
|
|
44
43
|
help=helpmsg,
|
|
45
44
|
)
|
|
46
45
|
|
|
@@ -61,6 +60,10 @@ else:
|
|
|
61
60
|
horizontal=True,
|
|
62
61
|
)
|
|
63
62
|
|
|
63
|
+
kz.initKey("description", "")
|
|
64
|
+
helpmsg = "Provide a short distinguishing description of the case."
|
|
65
|
+
description = kz.getText("Brief description", "description", help=helpmsg)
|
|
66
|
+
|
|
64
67
|
col1, col2 = st.columns(2, gap="large", vertical_alignment="top")
|
|
65
68
|
with col1:
|
|
66
69
|
kz.initKey("iname0", "")
|
|
@@ -98,6 +98,7 @@ def prepareRun(plan):
|
|
|
98
98
|
st.error(f"Failed setting beneficiary fractions: {e}")
|
|
99
99
|
return
|
|
100
100
|
|
|
101
|
+
plan.setDescription(kz.getKey("description"))
|
|
101
102
|
plan.setHeirsTaxRate(kz.getKey("heirsTx"))
|
|
102
103
|
plan.setLongTermCapitalTaxRate(kz.getKey("gainTx"))
|
|
103
104
|
plan.setDividendRate(kz.getKey("divRate"))
|
|
@@ -422,8 +423,11 @@ def plotSingleResults(plan):
|
|
|
422
423
|
st.write("##### Assets Distribution")
|
|
423
424
|
morecols = st.columns(3, gap="small")
|
|
424
425
|
for fig in figs:
|
|
425
|
-
if fig
|
|
426
|
+
if fig:
|
|
426
427
|
morecols[c].pyplot(fig)
|
|
428
|
+
else:
|
|
429
|
+
morecols[c].write("#\n<div style='text-align: center'> This plot is empty </div>",
|
|
430
|
+
unsafe_allow_html=True)
|
|
427
431
|
c = (c + 1) % 3
|
|
428
432
|
|
|
429
433
|
|
|
@@ -558,6 +562,7 @@ def genDic(plan):
|
|
|
558
562
|
dic = {}
|
|
559
563
|
dic["plan"] = plan
|
|
560
564
|
dic["name"] = plan._name
|
|
565
|
+
dic["description"] = plan._description
|
|
561
566
|
dic["summary"] = ""
|
|
562
567
|
dic["casetoml"] = ""
|
|
563
568
|
dic["caseStatus"] = "new"
|
|
@@ -438,7 +438,7 @@ def getNum(
|
|
|
438
438
|
)
|
|
439
439
|
|
|
440
440
|
|
|
441
|
-
def getText(text, nkey, disabled=False, callback=setpull, placeholder=None):
|
|
441
|
+
def getText(text, nkey, disabled=False, callback=setpull, placeholder=None, help=None):
|
|
442
442
|
return st.text_input(
|
|
443
443
|
text,
|
|
444
444
|
value=getKey(nkey),
|
|
@@ -447,6 +447,7 @@ def getText(text, nkey, disabled=False, callback=setpull, placeholder=None):
|
|
|
447
447
|
args=[nkey],
|
|
448
448
|
key="_" + nkey,
|
|
449
449
|
placeholder=placeholder,
|
|
450
|
+
help=help,
|
|
450
451
|
)
|
|
451
452
|
|
|
452
453
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2025.02.21"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|