owlplanner 2025.2.24__tar.gz → 2025.2.25__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 (101) hide show
  1. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/PKG-INFO +1 -1
  2. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/case_jack+jill.toml +1 -1
  3. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/case_joe.toml +1 -1
  4. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/case_john+sally.toml +1 -1
  5. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/case_jon+jane.toml +1 -1
  6. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/case_kim+sam-bequest.toml +1 -1
  7. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/case_kim+sam-spending.toml +1 -1
  8. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/pyproject.toml +1 -1
  9. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/plan.py +4 -0
  10. owlplanner-2025.2.25/src/owlplanner/version.py +1 -0
  11. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Documentation.py +11 -4
  12. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/requirements.txt +1 -1
  13. owlplanner-2025.2.24/src/owlplanner/version.py +0 -1
  14. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/.devcontainer/devcontainer.json +0 -0
  15. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/.flake8 +0 -0
  16. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/.gitattributes +0 -0
  17. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/.github/workflows/github-actions-runtests.yml +0 -0
  18. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/.gitignore +0 -0
  19. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/INSTALL.md +0 -0
  20. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/LICENSE +0 -0
  21. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/README.md +0 -0
  22. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/USER_GUIDE.md +0 -0
  23. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docker/Dockerfile +0 -0
  24. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docker/README.md +0 -0
  25. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docker/docker-compose.yml +0 -0
  26. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docker/fastentrypoint.sh +0 -0
  27. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/AD-taxDef.png +0 -0
  28. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/AD-taxFree.png +0 -0
  29. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/AD-taxable.png +0 -0
  30. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/Hist_Bequest.png +0 -0
  31. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/Hist_Spending.png +0 -0
  32. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/MC-tutorial2a.png +0 -0
  33. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/MC-tutorial2b.png +0 -0
  34. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/OwlUI.png +0 -0
  35. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/allocations.png +0 -0
  36. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/owl.png +0 -0
  37. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/profile.png +0 -0
  38. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/ratesCorrelations.png +0 -0
  39. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/ratesPlot.png +0 -0
  40. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/savingsPlot.png +0 -0
  41. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/sourcesPlot.png +0 -0
  42. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/spendingPlot.png +0 -0
  43. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/taxIncomePlot.png +0 -0
  44. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/images/taxesPlot.png +0 -0
  45. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/owl.pdf +0 -0
  46. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/docs/owl.tex +0 -0
  47. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/jack+jill.xlsx +0 -0
  48. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/joe.xlsx +0 -0
  49. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/john+sally.xlsx +0 -0
  50. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/jon+jane.xlsx +0 -0
  51. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/examples/template.xlsx +0 -0
  52. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/notebooks/john+sally.ipynb +0 -0
  53. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/notebooks/kim+sam.ipynb +0 -0
  54. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/notebooks/template.ipynb +0 -0
  55. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/notebooks/tutorial_1.ipynb +0 -0
  56. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/notebooks/tutorial_2.ipynb +0 -0
  57. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/notebooks/tutorial_3.ipynb +0 -0
  58. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/owlplanner.cmd +0 -0
  59. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/owlplanner.sh +0 -0
  60. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/requirements.txt +0 -0
  61. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/__init__.py +0 -0
  62. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/abcapi.py +0 -0
  63. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/config.py +0 -0
  64. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/data/__init__.py +0 -0
  65. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/data/rates.csv +0 -0
  66. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/logging.py +0 -0
  67. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/progress.py +0 -0
  68. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/rates.py +0 -0
  69. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/tax2025.py +0 -0
  70. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/timelists.py +0 -0
  71. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/src/owlplanner/utils.py +0 -0
  72. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/tests/test_logger.py +0 -0
  73. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/tests/test_regressions.py +0 -0
  74. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/tests/test_repro.py +0 -0
  75. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/tests/test_toml_cases.py +0 -0
  76. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/tests/test_units.py +0 -0
  77. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ttt.py +0 -0
  78. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/About_Owl.py +0 -0
  79. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Asset_Allocation.py +0 -0
  80. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Assets.py +0 -0
  81. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Create_Case.py +0 -0
  82. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Fixed_Income.py +0 -0
  83. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Graphs.py +0 -0
  84. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Historical_Range.py +0 -0
  85. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Logs.py +0 -0
  86. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Monte_Carlo.py +0 -0
  87. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Optimization_Parameters.py +0 -0
  88. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Output_Files.py +0 -0
  89. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Quick_Start.py +0 -0
  90. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/README.md +0 -0
  91. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Rates_Selection.py +0 -0
  92. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Settings.py +0 -0
  93. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Wages_And_Contributions.py +0 -0
  94. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/Worksheets.py +0 -0
  95. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/main+fonts.py +0 -0
  96. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/main.py +0 -0
  97. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/owlbridge.py +0 -0
  98. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/plots.py +0 -0
  99. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/progress.py +0 -0
  100. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/sskeys.py +0 -0
  101. {owlplanner-2025.2.24 → owlplanner-2025.2.25}/ui/style.css +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.2.24
3
+ Version: 2025.2.25
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
@@ -1,5 +1,5 @@
1
1
  "Plan Name" = "jack+jill"
2
- Description = "This example case is for Jack and Jill, a married couple."
2
+ Description = "This example case aims to demonstrate some of Owl's capabilities. Jack and Jill are a married couple a few years from retirement. A wages and contributions file called 'jack+jill.xlsx' is associated with this case."
3
3
 
4
4
  ["Basic Info"]
5
5
  Status = "married"
@@ -1,5 +1,5 @@
1
1
  "Plan Name" = "joe"
2
- Description = "This example case is for Joe, a single individual."
2
+ Description = "This is an example of a case involving a single individual. Joe is single and will retire in a few years. His wages and contributions are contained in the 'joe.xlsx' spreadsheet."
3
3
 
4
4
  ["Basic Info"]
5
5
  Status = "single"
@@ -1,5 +1,5 @@
1
1
  "Plan Name" = "john+sally"
2
- Description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak."
2
+ Description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak. This case can be used to compare the heuristic strategy of surfing a tax bracket for performing Roth conversions to a solution optimized by linear programming. The former is a good approach when one assumes fixed rates. When rates are varying, and the market drops, an optimized solution shows that it is sometime advantageous to convert above the target tax bracket. File 'john+sally.xlsx' contains wages and contributions associated with this case. Run this case with different rates to see the effect on Roth conversions."
3
3
 
4
4
  ["Basic Info"]
5
5
  Status = "married"
@@ -1,5 +1,5 @@
1
1
  "Plan Name" = "Jon+Jane"
2
- Description = "The case of Jon and Jane was the base case discussed by i-orp."
2
+ Description = "This case is similar to a case discussed by i-orp. It involve Jon and Jane close to retirement, and assumes a base case of optimistic returns of 10% with an inflation of 3.5%. A wages and contributions file called 'jon+jane.xlsx' is associated with this case."
3
3
 
4
4
  ["Basic Info"]
5
5
  Status = "married"
@@ -1,5 +1,5 @@
1
1
  "Plan Name" = "kim+sam-bequest"
2
- Description = "Kim and Sam is an example case for optimizing bequest and Roth conversions."
2
+ Description = "This is the case of Kim and Sam used as an example case for optimizing bequest and Roth conversions. No wages and contributions file is associated with this case."
3
3
 
4
4
  ["Basic Info"]
5
5
  Status = "married"
@@ -1,5 +1,5 @@
1
1
  "Plan Name" = "kim+sam-spending"
2
- Description = "Kim and Sam is an example case for optimizing spending and Roth conversions."
2
+ Description = "This is the case of Kim and Sam used as an example case for optimizing spending and Roth conversions. No wages and contributions is associated with this case."
3
3
 
4
4
  ["Basic Info"]
5
5
  Status = "married"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "owlplanner"
7
- version = "2025.02.24"
7
+ version = "2025.02.25"
8
8
  authors = [
9
9
  { name="Martin-D. Lacasse", email="martin.d.lacasse@gmail.com" },
10
10
  ]
@@ -34,6 +34,10 @@ from owlplanner import logging
34
34
  from owlplanner import progress
35
35
 
36
36
 
37
+ # This makes all graphs appear have the same height.
38
+ plt.rcParams.update({'figure.autolayout': True})
39
+
40
+
37
41
  def _genGamma_n(tau):
38
42
  """
39
43
  Utility function to generate a cumulative inflation multiplier
@@ -0,0 +1 @@
1
+ __version__ = "2025.02.25"
@@ -135,14 +135,21 @@ The wages and contributions data contains 9 columns titled as follows:
135
135
  | ... | | | | | | | | |
136
136
  |20XX | | | | | | | | |
137
137
 
138
- Here, 20XX represents the last row which could be the last year based on the life expectancy values provided.
138
+ Here, 20XX represents the last row which could be the last year based on the life
139
+ expectancy values provided.
139
140
  While loading an Excel workbook, missing years or empty cells will be filled with zero values,
140
141
  while years outside the time span of the plan will be ignored.
141
142
  For the columns, *anticipated wages* is the annual amount
142
- (gross minus tax-deferred contributions) that you anticipate to receive from employment or other sources
143
- (not including dividends from your taxable investment accounts). Note that column names are case sensitive
144
- and all entries must be in lower case. The easiest way to start this process is to use the template
143
+ (gross minus tax-deferred contributions) that you anticipate to receive from employment
144
+ or other sources (e.g. rentals).
145
+ This column does not include dividends from your taxable investment accounts,
146
+ as they will be calculated based on your return rate assumptions.
147
+
148
+ Note that column names are case sensitive and all entries must be in lower case.
149
+ The easiest way to complete the process of filling this file is either to start from the template
145
150
  file provided [here](https://raw.github.com/mdlacasse/Owl/main/examples/template.xlsx).
151
+ Values can also be filled in the user interface, but this approach does not have
152
+ Excel capabilities for cross-column calculations.
146
153
 
147
154
  For the purpose of planning, there is no clear definition of retirement age. There will be a year,
148
155
  however, from which you will stop having anticipated income, or diminished income due to decreasing your
@@ -7,4 +7,4 @@ scipy
7
7
  streamlit
8
8
  toml
9
9
  # --extra-index-url https://test.pypi.org/simple
10
- owlplanner >= 2025.02.24
10
+ owlplanner >= 2025.02.25
@@ -1 +0,0 @@
1
- __version__ = "2025.02.23"
File without changes
File without changes
File without changes
File without changes