owlplanner 2025.7.1__tar.gz → 2025.9.15__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 (131) hide show
  1. owlplanner-2025.9.15/.streamlit/config.toml +3 -0
  2. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/INSTALL.md +1 -1
  3. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/PKG-INFO +2 -2
  4. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/README.md +1 -1
  5. owlplanner-2025.9.15/RELEASE_NOTES.md +17 -0
  6. owlplanner-2025.9.15/docs/images/piecewiseConstant.png +0 -0
  7. owlplanner-2025.9.15/docs/owl.pdf +0 -0
  8. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/owl.tex +603 -442
  9. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/examples/case_drawdowncalc-comparison-1.toml +4 -3
  10. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/examples/case_jack+jill.toml +1 -1
  11. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/case_joe.toml +1 -1
  12. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/case_john+sally.toml +1 -1
  13. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/case_jon+jane.toml +2 -2
  14. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/examples/case_kim+sam-bequest.toml +1 -1
  15. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/case_kim+sam-spending.toml +1 -1
  16. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/pyproject.toml +1 -1
  17. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/requirements.txt +1 -1
  18. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/abcapi.py +1 -1
  19. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/config.py +7 -3
  20. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/mylogging.py +1 -1
  21. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/plan.py +225 -158
  22. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/progress.py +1 -1
  23. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/rates.py +1 -23
  24. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/tax2025.py +82 -36
  25. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/timelists.py +1 -1
  26. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/utils.py +1 -1
  27. owlplanner-2025.9.15/src/owlplanner/version.py +1 -0
  28. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_regressions.py +30 -30
  29. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_repro.py +11 -11
  30. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Documentation.py +50 -12
  31. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Graphs.py +2 -0
  32. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Optimization_Parameters.py +28 -4
  33. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Output_Files.py +3 -1
  34. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Quick_Start.py +18 -5
  35. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Rates_Selection.py +3 -3
  36. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Worksheets.py +2 -0
  37. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/main.py +3 -2
  38. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/owlbridge.py +10 -7
  39. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/sskeys.py +7 -2
  40. owlplanner-2025.7.1/.streamlit/config.toml +0 -2
  41. owlplanner-2025.7.1/RELEASE_NOTES.md +0 -12
  42. owlplanner-2025.7.1/docs/owl.pdf +0 -0
  43. owlplanner-2025.7.1/examples/case_joe.toml +0 -54
  44. owlplanner-2025.7.1/examples/case_john+sally.toml +0 -53
  45. owlplanner-2025.7.1/examples/case_jon+jane.toml +0 -56
  46. owlplanner-2025.7.1/examples/case_kim+sam-spending.toml +0 -56
  47. owlplanner-2025.7.1/examples/joe.xlsx +0 -0
  48. owlplanner-2025.7.1/examples/john+sally.xlsx +0 -0
  49. owlplanner-2025.7.1/examples/jon+jane.xlsx +0 -0
  50. owlplanner-2025.7.1/examples/kim+sam.xlsx +0 -0
  51. owlplanner-2025.7.1/examples/template.xlsx +0 -0
  52. owlplanner-2025.7.1/examples.new/case_drawdowncalc-comparison-1.toml +0 -56
  53. owlplanner-2025.7.1/examples.new/case_jack+jill.toml +0 -57
  54. owlplanner-2025.7.1/examples.new/case_kim+sam-bequest.toml +0 -56
  55. owlplanner-2025.7.1/examples.new/jack+jill.xlsx +0 -0
  56. owlplanner-2025.7.1/src/owlplanner/version.py +0 -1
  57. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/.devcontainer/devcontainer.json +0 -0
  58. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/.flake8 +0 -0
  59. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/.gitattributes +0 -0
  60. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/.github/workflows/github-actions-runtests.yml +0 -0
  61. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/.gitignore +0 -0
  62. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/.streamlit/fullconfig.toml +0 -0
  63. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/LICENSE +0 -0
  64. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/USER_GUIDE.md +0 -0
  65. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docker/Dockerfile.build +0 -0
  66. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docker/Dockerfile.run +0 -0
  67. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docker/README.md +0 -0
  68. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docker/buildentrypoint.sh +0 -0
  69. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docker/docker-compose.yml +0 -0
  70. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docker/runentrypoint.sh +0 -0
  71. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/AD-taxDef.png +0 -0
  72. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/AD-taxFree.png +0 -0
  73. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/AD-taxable.png +0 -0
  74. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/Hist_Bequest.png +0 -0
  75. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/Hist_Spending.png +0 -0
  76. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/MC-tutorial2a.png +0 -0
  77. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/MC-tutorial2b.png +0 -0
  78. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/OwlUI.png +0 -0
  79. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/allocations.png +0 -0
  80. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/owl.png +0 -0
  81. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/profile.png +0 -0
  82. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/ratesCorrelations.png +0 -0
  83. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/ratesPlot.png +0 -0
  84. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/savingsPlot.png +0 -0
  85. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/sourcesPlot.png +0 -0
  86. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/spendingPlot.png +0 -0
  87. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/taxIncomePlot.png +0 -0
  88. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/docs/images/taxesPlot.png +0 -0
  89. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/examples/jack+jill.xlsx +0 -0
  90. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/joe.xlsx +0 -0
  91. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/john+sally.xlsx +0 -0
  92. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/jon+jane.xlsx +0 -0
  93. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/kim+sam.xlsx +0 -0
  94. {owlplanner-2025.7.1/examples.new → owlplanner-2025.9.15/examples}/template.xlsx +0 -0
  95. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/notebooks/john+sally.ipynb +0 -0
  96. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/notebooks/kim+sam.ipynb +0 -0
  97. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/notebooks/template.ipynb +0 -0
  98. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/notebooks/tutorial_1.ipynb +0 -0
  99. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/notebooks/tutorial_2.ipynb +0 -0
  100. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/notebooks/tutorial_3.ipynb +0 -0
  101. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/owlplanner.cmd +0 -0
  102. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/owlplanner.sh +0 -0
  103. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/pytest.ini +0 -0
  104. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/__init__.py +0 -0
  105. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/data/__init__.py +0 -0
  106. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/data/rates.csv +0 -0
  107. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/plotting/__init__.py +0 -0
  108. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/plotting/base.py +0 -0
  109. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/plotting/factory.py +0 -0
  110. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/plotting/matplotlib_backend.py +0 -0
  111. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/src/owlplanner/plotting/plotly_backend.py +0 -0
  112. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_logger.py +0 -0
  113. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_toml_cases.py +0 -0
  114. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_ui_asset_allocation.py +0 -0
  115. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_ui_compare_summaries.py +0 -0
  116. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_ui_sskeys.py +0 -0
  117. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/tests/test_units.py +0 -0
  118. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/About_Owl.py +0 -0
  119. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Asset_Allocation.py +0 -0
  120. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Create_Case.py +0 -0
  121. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Current_Assets.py +0 -0
  122. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Fixed_Income.py +0 -0
  123. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Historical_Range.py +0 -0
  124. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Logs.py +0 -0
  125. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Monte_Carlo.py +0 -0
  126. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/README.md +0 -0
  127. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Settings.py +0 -0
  128. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/Wages_and_Contributions.py +0 -0
  129. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/__init__.py +0 -0
  130. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/progress.py +0 -0
  131. {owlplanner-2025.7.1 → owlplanner-2025.9.15}/ui/tomlexamples.py +0 -0
@@ -0,0 +1,3 @@
1
+ [theme]
2
+ base = "dark"
3
+ dataframeHeaderBackgroundColor = "#692f24"
@@ -27,7 +27,7 @@ Then go (`cd`) to the directory where you installed Owl.
27
27
  From the top directory of the source code run:
28
28
  The following command will install the current version of owlplanner and all its dependencies:
29
29
  ```shell
30
- pip install -r ui/requirements.txt
30
+ pip install --upgrade -r requirements.txt
31
31
  ```
32
32
 
33
33
  You can also install the Owl package directly from the [Python Package Index](http://pypi.org).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.7.1
3
+ Version: 2025.9.15
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
@@ -744,7 +744,7 @@ Look at *Basic capabilities* below for more detail.
744
744
  One can certainly have a savings plan, but due to the volatility of financial investments,
745
745
  it is impossible to have a certain asset earnings plan. This does not mean one cannot make decisions.
746
746
  These decisions need to be guided with an understanding of the sensitivity of the parameters.
747
- This is exactly where this tool fits it. Given your savings capabilities and spending desires,
747
+ This is exactly where this tool fits in. Given your savings capabilities and spending desires,
748
748
  it can generate different future realizations of
749
749
  your strategy under different market assumptions, helping to better understand your financial situation.
750
750
 
@@ -38,7 +38,7 @@ Look at *Basic capabilities* below for more detail.
38
38
  One can certainly have a savings plan, but due to the volatility of financial investments,
39
39
  it is impossible to have a certain asset earnings plan. This does not mean one cannot make decisions.
40
40
  These decisions need to be guided with an understanding of the sensitivity of the parameters.
41
- This is exactly where this tool fits it. Given your savings capabilities and spending desires,
41
+ This is exactly where this tool fits in. Given your savings capabilities and spending desires,
42
42
  it can generate different future realizations of
43
43
  your strategy under different market assumptions, helping to better understand your financial situation.
44
44
 
@@ -0,0 +1,17 @@
1
+ ### Version 2025.07.01
2
+
3
+ Added:
4
+ - Settings option for menu position thanks to Streamlit 1.46 top and sidebar capabilities. Default is top.
5
+ - Net Investment Income Tax calculations in self-consistent loop.
6
+ - Capability to load example Wages and Contributions Excel file from GitHub directly from UI.
7
+ - Constraint for 5-year maturation rule on Roth conversions.
8
+ - Extension to Wages and Contributions table 5 years in the past for tracking recent contributions to tax-free accounts and Roth conversions.
9
+ - Option in UI to turn off sticky header. This is useful for mobile or tablet use.
10
+ - A new case file allowing for direct comparison with DrawdownCalc. Both versions agree to the dollar, demonstrating that the compounding, withdrawals, and federal tax calculations are in perfect agreement despite using two completely different approaches to modeling the mixed-integer linear programming problem (direct matrix encoding vs PuLP high-level language).
11
+ - Option to use the HiGHS library through PuLP for speed comparison with DrawdownCalc. Using HiGHS directly is by far the fastest option.
12
+ - RELEASE_NOTES file.
13
+
14
+ Improvements:
15
+ - Changed color scheme in header gradient for visibility.
16
+ - Removed long-term capital tax rate from options. Rate is now automatically calculated in self-consistent loop.
17
+
Binary file