owlplanner 2025.11.2__tar.gz → 2025.11.3__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 (117) hide show
  1. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/PKG-INFO +1 -1
  2. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/pyproject.toml +1 -1
  3. owlplanner-2025.11.3/src/owlplanner/version.py +1 -0
  4. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_ui_asset_allocation.py +3 -3
  5. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_ui_compare_summaries.py +1 -1
  6. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_ui_sskeys.py +2 -2
  7. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/sskeys.py +2 -1
  8. owlplanner-2025.11.2/src/owlplanner/version.py +0 -1
  9. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.devcontainer/devcontainer.json +0 -0
  10. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.flake8 +0 -0
  11. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.gitattributes +0 -0
  12. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.github/workflows/github-actions-runtests.yml +0 -0
  13. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.gitignore +0 -0
  14. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.streamlit/config.toml +0 -0
  15. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/.streamlit/fullconfig.toml +0 -0
  16. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/INSTALL.md +0 -0
  17. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/LICENSE +0 -0
  18. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/README.md +0 -0
  19. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/RELEASE_NOTES.md +0 -0
  20. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/USER_GUIDE.md +0 -0
  21. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docker/Dockerfile.bare +0 -0
  22. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docker/Dockerfile.static +0 -0
  23. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docker/README.md +0 -0
  24. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docker/buildentrypoint.sh +0 -0
  25. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docker/docker-compose.yml +0 -0
  26. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docker/runentrypoint.sh +0 -0
  27. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/AD-taxDef.png +0 -0
  28. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/AD-taxFree.png +0 -0
  29. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/AD-taxable.png +0 -0
  30. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/Hist_Bequest.png +0 -0
  31. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/Hist_Spending.png +0 -0
  32. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/MC-tutorial2a.png +0 -0
  33. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/MC-tutorial2b.png +0 -0
  34. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/OwlUI.png +0 -0
  35. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/allocations.png +0 -0
  36. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/owl.png +0 -0
  37. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/piecewiseConstant.png +0 -0
  38. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/profile.png +0 -0
  39. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/ratesCorrelations.png +0 -0
  40. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/ratesPlot.png +0 -0
  41. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/savingsPlot.png +0 -0
  42. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/sourcesPlot.png +0 -0
  43. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/spendingPlot.png +0 -0
  44. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/taxIncomePlot.png +0 -0
  45. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/images/taxesPlot.png +0 -0
  46. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/owl.pdf +0 -0
  47. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/docs/owl.tex +0 -0
  48. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_drawdowncalc-comparison-1.toml +0 -0
  49. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_jack+jill.toml +0 -0
  50. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_joe.toml +0 -0
  51. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_john+sally.toml +0 -0
  52. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_jon+jane.toml +0 -0
  53. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_kim+sam-bequest.toml +0 -0
  54. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/case_kim+sam-spending.toml +0 -0
  55. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/jack+jill.xlsx +0 -0
  56. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/joe.xlsx +0 -0
  57. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/john+sally.xlsx +0 -0
  58. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/jon+jane.xlsx +0 -0
  59. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/kim+sam.xlsx +0 -0
  60. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/examples/template.xlsx +0 -0
  61. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/notebooks/john+sally.ipynb +0 -0
  62. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/notebooks/kim+sam.ipynb +0 -0
  63. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/notebooks/template.ipynb +0 -0
  64. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/notebooks/tutorial_1.ipynb +0 -0
  65. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/notebooks/tutorial_2.ipynb +0 -0
  66. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/notebooks/tutorial_3.ipynb +0 -0
  67. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/owlplanner.cmd +0 -0
  68. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/owlplanner.sh +0 -0
  69. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/pytest.ini +0 -0
  70. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/requirements.txt +0 -0
  71. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/__init__.py +0 -0
  72. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/abcapi.py +0 -0
  73. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/config.py +0 -0
  74. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/data/__init__.py +0 -0
  75. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/data/rates.csv +0 -0
  76. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/mylogging.py +0 -0
  77. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/plan.py +0 -0
  78. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/plotting/__init__.py +0 -0
  79. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/plotting/base.py +0 -0
  80. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/plotting/factory.py +0 -0
  81. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/plotting/matplotlib_backend.py +0 -0
  82. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/plotting/plotly_backend.py +0 -0
  83. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/progress.py +0 -0
  84. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/rates.py +0 -0
  85. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/tax2025.py +0 -0
  86. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/tax2026.py +0 -0
  87. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/timelists.py +0 -0
  88. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/src/owlplanner/utils.py +0 -0
  89. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_logger.py +0 -0
  90. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_regressions.py +0 -0
  91. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_repro.py +0 -0
  92. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_toml_cases.py +0 -0
  93. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/tests/test_units.py +0 -0
  94. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/.owlbridge.py.swo +0 -0
  95. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/About_Owl.py +0 -0
  96. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Asset_Allocation.py +0 -0
  97. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Create_Case.py +0 -0
  98. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Current_Assets.py +0 -0
  99. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Documentation.py +0 -0
  100. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Fixed_Income.py +0 -0
  101. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Graphs.py +0 -0
  102. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Historical_Range.py +0 -0
  103. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Logs.py +0 -0
  104. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Monte_Carlo.py +0 -0
  105. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Optimization_Parameters.py +0 -0
  106. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Output_Files.py +0 -0
  107. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Quick_Start.py +0 -0
  108. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/README.md +0 -0
  109. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Rates_Selection.py +0 -0
  110. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Settings.py +0 -0
  111. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Wages_and_Contributions.py +0 -0
  112. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/Worksheets.py +0 -0
  113. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/__init__.py +0 -0
  114. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/main.py +0 -0
  115. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/owlbridge.py +0 -0
  116. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/progress.py +0 -0
  117. {owlplanner-2025.11.2 → owlplanner-2025.11.3}/ui/tomlexamples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.11.2
3
+ Version: 2025.11.3
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "owlplanner"
7
- version = "2025.11.02"
7
+ version = "2025.11.03"
8
8
  authors = [
9
9
  { name="Martin-D. Lacasse", email="martin.d.lacasse@gmail.com" },
10
10
  ]
@@ -0,0 +1 @@
1
+ __version__ = "2025.11.03"
@@ -3,12 +3,12 @@ import ui.Asset_Allocation as aa
3
3
 
4
4
  def test_checkAccountAllocs_valid(monkeypatch):
5
5
  # Mock kz.getKey to return 25 for each call (4*25=100)
6
- monkeypatch.setattr(aa.kz, "getKey", lambda key: 25)
6
+ monkeypatch.setattr(aa.kz, "getCaseKey", lambda key: 25)
7
7
  assert aa.checkAccountAllocs(0, "") is True
8
8
 
9
9
 
10
10
  def test_checkAccountAllocs_invalid(monkeypatch):
11
- # Mock kz.getKey to return 20 for each call (4*20=80)
12
- monkeypatch.setattr(aa.kz, "getKey", lambda key: 20)
11
+ # Mock kz.getCaseKey to return 20 for each call (4*20=80)
12
+ monkeypatch.setattr(aa.kz, "getCaseKey", lambda key: 20)
13
13
  # Should trigger error and return False
14
14
  assert aa.checkAccountAllocs(0, "") is False
@@ -10,7 +10,7 @@ def test_compareSummaries(monkeypatch):
10
10
  "case1": {"summaryDf": df1},
11
11
  "case2": {"summaryDf": df2},
12
12
  }
13
- monkeypatch.setattr(sskeys, "getKey", lambda key: df1 if key == "summaryDf" else None)
13
+ monkeypatch.setattr(sskeys, "getCaseKey", lambda key: df1 if key == "summaryDf" else None)
14
14
  monkeypatch.setattr(sskeys, "onlyCaseNames", lambda: ["case2"])
15
15
  monkeypatch.setattr(sskeys, "currentCaseName", lambda: "case1")
16
16
  sskeys.ss = type("SS", (), {"cases": cases})()
@@ -14,11 +14,11 @@ def test_getIndex_not_found():
14
14
 
15
15
  def test_caseHasNoPlan(monkeypatch):
16
16
  # Mock getKey to return None
17
- monkeypatch.setattr(sskeys, "getKey", lambda key: None)
17
+ monkeypatch.setattr(sskeys, "getCaseKey", lambda key: None)
18
18
  assert sskeys.caseHasNoPlan() is True
19
19
 
20
20
 
21
21
  def test_caseHasPlan(monkeypatch):
22
22
  # Mock getKey to return a non-None value
23
- monkeypatch.setattr(sskeys, "getKey", lambda key: "something")
23
+ monkeypatch.setattr(sskeys, "getCaseKey", lambda key: "something")
24
24
  assert sskeys.caseHasNoPlan() is False
@@ -106,7 +106,8 @@ def resetTimeLists():
106
106
  def getIndex(item, choices):
107
107
  try:
108
108
  i = choices.index(item)
109
- except ValueError(f"Value {item} not found in {choices}."):
109
+ except ValueError:
110
+ st.error(f"Value {item} not found in {choices}.")
110
111
  return None
111
112
 
112
113
  return i
@@ -1 +0,0 @@
1
- __version__ = "2025.11.02"
File without changes
File without changes
File without changes