owlplanner 2025.4.2__tar.gz → 2025.4.7__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.
Files changed (113) hide show
  1. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/PKG-INFO +4 -2
  2. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/README.md +3 -1
  3. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/pyproject.toml +1 -1
  4. owlplanner-2025.4.7/reponse.txt +20 -0
  5. owlplanner-2025.4.7/src/owlplanner/version.py +1 -0
  6. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/About_Owl.py +3 -1
  7. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Documentation.py +3 -0
  8. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Historical_Range.py +1 -1
  9. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Wages_And_Contributions.py +9 -3
  10. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/owlbridge.py +2 -1
  11. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/requirements.txt +1 -1
  12. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/sskeys.py +6 -3
  13. owlplanner-2025.4.2/src/owlplanner/version.py +0 -1
  14. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/.devcontainer/devcontainer.json +0 -0
  15. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/.flake8 +0 -0
  16. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/.gitattributes +0 -0
  17. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/.github/workflows/github-actions-runtests.yml +0 -0
  18. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/.gitignore +0 -0
  19. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/INSTALL.md +0 -0
  20. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/LICENSE +0 -0
  21. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
  22. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
  23. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +0 -0
  24. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
  25. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
  26. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/bv_cvxbook.pdf +0 -0
  27. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/Papers/s10436-006-0062-y.pdf +0 -0
  28. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/USER_GUIDE.md +0 -0
  29. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docker/Dockerfile +0 -0
  30. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docker/README.md +0 -0
  31. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docker/docker-compose.yml +0 -0
  32. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docker/fastentrypoint.sh +0 -0
  33. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/AD-taxDef.png +0 -0
  34. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/AD-taxFree.png +0 -0
  35. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/AD-taxable.png +0 -0
  36. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/Hist_Bequest.png +0 -0
  37. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/Hist_Spending.png +0 -0
  38. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/MC-tutorial2a.png +0 -0
  39. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/MC-tutorial2b.png +0 -0
  40. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/OwlUI.png +0 -0
  41. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/allocations.png +0 -0
  42. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/owl.png +0 -0
  43. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/profile.png +0 -0
  44. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/ratesCorrelations.png +0 -0
  45. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/ratesPlot.png +0 -0
  46. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/savingsPlot.png +0 -0
  47. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/sourcesPlot.png +0 -0
  48. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/spendingPlot.png +0 -0
  49. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/taxIncomePlot.png +0 -0
  50. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/images/taxesPlot.png +0 -0
  51. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/owl.pdf +0 -0
  52. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/docs/owl.tex +0 -0
  53. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/case_jack+jill.toml +0 -0
  54. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/case_joe.toml +0 -0
  55. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/case_john+sally.toml +0 -0
  56. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/case_jon+jane.toml +0 -0
  57. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/case_kim+sam-bequest.toml +0 -0
  58. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/case_kim+sam-spending.toml +0 -0
  59. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/jack+jill.xlsx +0 -0
  60. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/joe.xlsx +0 -0
  61. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/john+sally.xlsx +0 -0
  62. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/jon+jane.xlsx +0 -0
  63. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/examples/template.xlsx +0 -0
  64. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/notebooks/john+sally.ipynb +0 -0
  65. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/notebooks/kim+sam.ipynb +0 -0
  66. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/notebooks/template.ipynb +0 -0
  67. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/notebooks/tutorial_1.ipynb +0 -0
  68. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/notebooks/tutorial_2.ipynb +0 -0
  69. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/notebooks/tutorial_3.ipynb +0 -0
  70. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/owlplanner.cmd +0 -0
  71. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/owlplanner.sh +0 -0
  72. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/requirements.txt +0 -0
  73. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/__init__.py +0 -0
  74. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/abcapi.py +0 -0
  75. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/config.py +0 -0
  76. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/data/__init__.py +0 -0
  77. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/data/rates.csv +0 -0
  78. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/logging.py +0 -0
  79. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/plan.py +0 -0
  80. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/progress.py +0 -0
  81. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/rates.py +0 -0
  82. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/tax2025.py +0 -0
  83. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/timelists.py +0 -0
  84. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/src/owlplanner/utils.py +0 -0
  85. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/tests/test_logger.py +0 -0
  86. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/tests/test_regressions.py +0 -0
  87. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/tests/test_repro.py +0 -0
  88. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/tests/test_toml_cases.py +0 -0
  89. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/tests/test_units.py +0 -0
  90. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ttt.py +0 -0
  91. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ttt2.py +0 -0
  92. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ttt3.py +0 -0
  93. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Asset_Allocation.py +0 -0
  94. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Create_Case.py +0 -0
  95. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Current_Assets.py +0 -0
  96. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Fixed_Income.py +0 -0
  97. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Graphs.py +0 -0
  98. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Logs.py +0 -0
  99. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Monte_Carlo.py +0 -0
  100. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Optimization_Parameters.py +0 -0
  101. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Output_Files.py +0 -0
  102. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Quick_Start.py +0 -0
  103. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/README.md +0 -0
  104. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Rates_Selection.py +0 -0
  105. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Settings.py +0 -0
  106. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/Worksheets.py +0 -0
  107. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/main+fonts.py +0 -0
  108. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/main.py +0 -0
  109. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/plots.py +0 -0
  110. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/progress.py +0 -0
  111. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/sskeys.py.color +0 -0
  112. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/style.css +0 -0
  113. {owlplanner-2025.4.2 → owlplanner-2025.4.7}/ui/tomlexamples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.4.2
3
+ Version: 2025.4.7
4
4
  Summary: Owl: Retirement planner with great wisdom
5
5
  Project-URL: HomePage, https://github.com/mdlacasse/owl
6
6
  Project-URL: Repository, https://github.com/mdlacasse/owl
@@ -885,7 +885,9 @@ assets to support, even with no estate being left.
885
885
  - Image from [freepik](https://freepik.com)
886
886
  - Optimization solver from [HiGHS](https://highs.dev)
887
887
  - Streamlit Community Cloud [Streamlit](https://streamlit.io)
888
- - Contributors: Josh (noimjosh@gmail.com) for Docker image code
888
+ - Contributors: Josh (noimjosh@gmail.com) for Docker image code,
889
+ Dale Seng (sengsational) for great insights and suggestions,
890
+ Robert E. Anderson (NH-RedAnt) for bug fixes and suggestions.
889
891
 
890
892
  ---------------------------------------------------------------------
891
893
 
@@ -182,7 +182,9 @@ assets to support, even with no estate being left.
182
182
  - Image from [freepik](https://freepik.com)
183
183
  - Optimization solver from [HiGHS](https://highs.dev)
184
184
  - Streamlit Community Cloud [Streamlit](https://streamlit.io)
185
- - Contributors: Josh (noimjosh@gmail.com) for Docker image code
185
+ - Contributors: Josh (noimjosh@gmail.com) for Docker image code,
186
+ Dale Seng (sengsational) for great insights and suggestions,
187
+ Robert E. Anderson (NH-RedAnt) for bug fixes and suggestions.
186
188
 
187
189
  ---------------------------------------------------------------------
188
190
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "owlplanner"
7
- version = "2025.04.02"
7
+ version = "2025.04.07"
8
8
  authors = [
9
9
  { name="Martin-D. Lacasse", email="martin.d.lacasse@gmail.com" },
10
10
  ]
@@ -0,0 +1,20 @@
1
+
2
+ Hi Mike,
3
+
4
+ Thank you so much for the income tax preparation. I have a few questions after reviewing the return:
5
+
6
+ - Roth conversion was made as an in-plan conversion from a 401k to a Roth-401k. Do we still need form 8606?
7
+ - Out of curiosity, Roth conversion was for $240,000.00 with 0.79 deamed coming from a designated Roth contribution. Why was the $1 been added as a taxable item in statement 4? This is a minor point (and therefore can stay as is). Just curiosity as I said.
8
+ - How do I pay your fees?
9
+
10
+ Questions for the future:
11
+ - You mentioned that the 2023 filing has to be corrected. Is it to my benefit or against it?
12
+ - I am planning to stop my consulting job at the end of May. Would it still be worth creating a Corporation for 5 months?
13
+ - I will probably move to FL later this year (I was in Atlanta for my daughter - she will likely move to CA shortly). I am planning to perform another large Roth conversion this year (preventing large RMDs). I will need your advice as to when to proceed.
14
+
15
+
16
+ I submitted signed form 8879 through your portal.
17
+
18
+ Thanks again,
19
+
20
+ Martin
@@ -0,0 +1 @@
1
+ __version__ = "2025.04.07"
@@ -33,7 +33,9 @@ Copyright © 2024 - Martin-D. Lacasse
33
33
  [odfpy](https://https://pypi.org/project/odfpy),
34
34
  [toml](https://toml.io),
35
35
  and [Streamlit](https://streamlit.io) for the front-end
36
- - Contributors: Josh (noimjosh@gmail.com) for Docker image code.
36
+ - Contributors: Josh (noimjosh@gmail.com) for Docker image code,
37
+ Dale Seng (sengsational) for great insights and suggestions,
38
+ Robert E. Anderson (NH-RedAnt) for bug fixes and suggestions.
37
39
 
38
40
  #### :orange[Bugs and Feature Requests]
39
41
  - Please submit bugs and feature requests through
@@ -406,6 +406,9 @@ when considering Monte Carlo simulations, consider:
406
406
  #### Logs
407
407
  Messages coming from the underlying Owl calculation engine are displayed on this page.
408
408
 
409
+ #### Quick Start
410
+ Landing page of the application. This page describes how to quickly get started by using an example case file.
411
+
409
412
  #### Documentation
410
413
  These very pages.
411
414
 
@@ -11,7 +11,7 @@ if ret is None or kz.caseHasNoPlan():
11
11
  else:
12
12
  kz.initKey("hyfrm", owb.FROM)
13
13
  kz.initKey("hyto", owb.TO)
14
- kz.initKey("histoplot", None)
14
+ kz.initKey("histoPlot", None)
15
15
  kz.initKey("histoSummary", None)
16
16
 
17
17
  st.write(
@@ -47,10 +47,16 @@ else:
47
47
  st.divider()
48
48
  for i in range(n):
49
49
  st.write("##### " + kz.getKey("iname" + str(i)) + "'s timetable")
50
- colfor = {"year": st.column_config.NumberColumn(None, format="%d")}
50
+ df = kz.getKey("timeList" + str(i))
51
+ formatdic = {"year": st.column_config.NumberColumn(None, format="%d", disabled=True)}
52
+ cols = list(df.columns)
53
+ for col in cols[1:-1]:
54
+ formatdic[col] = st.column_config.NumberColumn(None, min_value=0.0, format="accounting")
55
+ formatdic[cols[-1]] = st.column_config.NumberColumn(None, format="accounting")
56
+
51
57
  newdf = st.data_editor(
52
- kz.getKey("timeList" + str(i)),
53
- column_config=colfor,
58
+ df,
59
+ column_config=formatdic,
54
60
  hide_index=True,
55
61
  key=kz.currentCaseName() + "_wages" + str(i),
56
62
  )
@@ -492,7 +492,7 @@ def showWorkbook(plan):
492
492
  colfor[col] = st.column_config.NumberColumn(None, format="%d", width="small")
493
493
  else:
494
494
  # colfor[col] = st.column_config.NumberColumn(None, format="$ %,.0f")
495
- colfor[col] = st.column_config.NumberColumn(None, step=1)
495
+ colfor[col] = st.column_config.NumberColumn(None, format="accounting", step=1)
496
496
  else:
497
497
  colfor = {}
498
498
  for col in df.columns:
@@ -695,6 +695,7 @@ def backYearsMAGI(plan):
695
695
  for i in range(plan.N_i):
696
696
  if thisyear - plan.yobs[i] >= 65:
697
697
  backyears[0] = thisyear - 2
698
+ backyears[1] = thisyear - 1
698
699
  elif thisyear - plan.yobs[i] >= 64:
699
700
  backyears[1] = thisyear - 1
700
701
 
@@ -8,4 +8,4 @@ scipy
8
8
  streamlit
9
9
  toml
10
10
  # --extra-index-url https://test.pypi.org/simple
11
- owlplanner >= 2025.04.02
11
+ owlplanner >= 2025.04.07
@@ -177,8 +177,11 @@ def duplicateCase():
177
177
  ss.cases[ss.currentCase]["plan"] = None
178
178
  ss.cases[dupname] = copy.deepcopy(ss.cases[ss.currentCase])
179
179
  ss.cases[ss.currentCase]["plan"] = currentPlan
180
+
180
181
  ss.cases[dupname]["name"] = dupname
181
- ss.cases[dupname]["summaryDf"] = None
182
+ for key in ["summaryDf", "histoPlot", "histoSummary", "monteCarloPlot", "monteCarloSummary"]:
183
+ ss.cases[dupname][key] = None
184
+
182
185
  ss.cases[dupname]["duplicate"] = True
183
186
  refreshCase(ss.cases[dupname])
184
187
  ss.currentCase = dupname
@@ -409,11 +412,11 @@ def getAccountAllocationRatios():
409
412
 
410
413
 
411
414
  def getPreviousMAGIs():
412
- backMAGIs = [0, 0]
415
+ backMAGIs = [0., 0.]
413
416
  for ii in range(2):
414
417
  val = getKey(f"MAGI{ii}")
415
418
  if val:
416
- backMAGIs[ii] = val
419
+ backMAGIs[ii] = float(val)
417
420
 
418
421
  return backMAGIs
419
422
 
@@ -1 +0,0 @@
1
- __version__ = "2025.04.02"
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