goad-toolkit 0.2.9__tar.gz → 0.2.11__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 (112) hide show
  1. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/PKG-INFO +1 -1
  2. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/03-plot-composition.md +4 -2
  3. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/08-api-reference.md +2 -1
  4. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/pyproject.toml +1 -1
  5. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/config.py +1 -1
  6. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/visualizer.py +5 -3
  7. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/tests/test_visualizer.py +24 -0
  8. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/uv.lock +1 -1
  9. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/settings.local.json +0 -0
  10. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/.claude/settings.local.json +0 -0
  11. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/.gitignore +0 -0
  12. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/.python-version +0 -0
  13. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/CHANGELOG.md +0 -0
  14. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/MCP_SERVER.md +0 -0
  15. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/README.md +0 -0
  16. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/demo/linear.py +0 -0
  17. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/01-goal-oriented-analysis.md +0 -0
  18. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/02-pipelines.md +0 -0
  19. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/03-plot-composition.md +0 -0
  20. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/04-five-families.md +0 -0
  21. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/05-distributions.md +0 -0
  22. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/06-models-and-residuals.md +0 -0
  23. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/07-visual-critique.md +0 -0
  24. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/08-api-reference.md +0 -0
  25. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/09-analysis-method.md +0 -0
  26. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/10-teaching-path.md +0 -0
  27. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/docs/README.md +0 -0
  28. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/goad_mcp.py +0 -0
  29. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/img/distribution_fit.png +0 -0
  30. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/img/goaded.png +0 -0
  31. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/img/linear_results.png +0 -0
  32. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/img/null-distribution.png +0 -0
  33. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/img/residuals.png +0 -0
  34. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/img/zscores.png +0 -0
  35. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/pyproject.toml +0 -0
  36. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/__init__.py +0 -0
  37. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/analytics.py +0 -0
  38. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/cli.py +0 -0
  39. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/config.py +0 -0
  40. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/dataprocessor.py +0 -0
  41. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/datatransforms.py +0 -0
  42. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/distributions.py +0 -0
  43. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/filehandler.py +0 -0
  44. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/models.py +0 -0
  45. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/src/goad_toolkit/visualizer.py +0 -0
  46. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/tests/test_cli.py +0 -0
  47. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/tests/test_datatransforms.py +0 -0
  48. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/tests/test_distributions.py +0 -0
  49. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/tests/test_filehandler.py +0 -0
  50. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/tests/test_nulldistribution.py +0 -0
  51. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/tests/test_visualizer.py +0 -0
  52. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.claude/worktrees/quizzical-solomon-b62511/uv.lock +0 -0
  53. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.gitignore +0 -0
  54. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.python-version +0 -0
  55. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/.gitignore +0 -0
  56. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/archive.md +0 -0
  57. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/autonomous/save-104759.log +0 -0
  58. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/autonomous/save-195516.log +0 -0
  59. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/autonomous/save-195720.log +0 -0
  60. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/autonomous/save-195933.log +0 -0
  61. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/autonomous/save-200831.log +0 -0
  62. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/autonomous/save-201034.log +0 -0
  63. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/hook-errors.log +0 -0
  64. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/memory-2026-08-10.log +0 -0
  65. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/logs/memory-2026-08-12.log +0 -0
  66. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/now.md +0 -0
  67. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/recent.md +0 -0
  68. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/capture-alive +0 -0
  69. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/capture-alive.d/16b4788a-5507-4216-98ec-06bac13a9aba +0 -0
  70. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/capture-alive.d/90574e63-97cd-4c11-87e5-23b656c56fd9 +0 -0
  71. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/case-divergence +0 -0
  72. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/last-ndc.ts +0 -0
  73. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/last-save-ts +0 -0
  74. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/last-save.json +0 -0
  75. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/now-day +0 -0
  76. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/post-tool-ran +0 -0
  77. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/save-session.pid +0 -0
  78. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/tmp/session-slug +0 -0
  79. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/.remember/today-2026-08-10.done.md +0 -0
  80. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/CHANGELOG.md +0 -0
  81. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/MCP_SERVER.md +0 -0
  82. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/README.md +0 -0
  83. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/demo/linear.py +0 -0
  84. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/01-goal-oriented-analysis.md +0 -0
  85. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/02-pipelines.md +0 -0
  86. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/04-five-families.md +0 -0
  87. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/05-distributions.md +0 -0
  88. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/06-models-and-residuals.md +0 -0
  89. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/07-visual-critique.md +0 -0
  90. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/09-analysis-method.md +0 -0
  91. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/10-teaching-path.md +0 -0
  92. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/docs/README.md +0 -0
  93. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/goad_mcp.py +0 -0
  94. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/img/distribution_fit.png +0 -0
  95. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/img/goaded.png +0 -0
  96. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/img/linear_results.png +0 -0
  97. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/img/null-distribution.png +0 -0
  98. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/img/residuals.png +0 -0
  99. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/img/zscores.png +0 -0
  100. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/__init__.py +0 -0
  101. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/analytics.py +0 -0
  102. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/cli.py +0 -0
  103. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/dataprocessor.py +0 -0
  104. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/datatransforms.py +0 -0
  105. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/distributions.py +0 -0
  106. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/filehandler.py +0 -0
  107. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/src/goad_toolkit/models.py +0 -0
  108. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/tests/test_cli.py +0 -0
  109. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/tests/test_datatransforms.py +0 -0
  110. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/tests/test_distributions.py +0 -0
  111. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/tests/test_filehandler.py +0 -0
  112. {goad_toolkit-0.2.9 → goad_toolkit-0.2.11}/tests/test_nulldistribution.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: goad-toolkit
3
- Version: 0.2.9
3
+ Version: 0.2.11
4
4
  Summary: An extensible toolkit for Goal Oriented Analysis of Data
5
5
  Project-URL: Github, https://github.com/raoulg/goad_toolkit
6
6
  Author-email: raoul grouls <Raoul.Grouls@han.nl>
@@ -81,8 +81,10 @@ The contract:
81
81
  - Return `(self.fig, self.ax)` from `build`. Callers chain on it.
82
82
 
83
83
  `create_figure(n_plots=...)` handles the layout: one axis for a single plot, otherwise a grid
84
- capped at three columns with the unused axes hidden. Labels, grid and titles are applied to
85
- every visible axis.
84
+ wrapping at `settings.max_cols` columns — three by default — with the unused axes hidden.
85
+ Labels, grid and titles are applied to every visible axis. Set `max_cols=4` for a quartet or
86
+ `max_cols=2` for a square grid; four panels at the default wrap to 3 + 1, which is rarely
87
+ what a set of four wants.
86
88
 
87
89
  ## 3.4 `plot_on`: layering
88
90
 
@@ -11,7 +11,7 @@ Pydantic settings objects. Both have a readable `__repr__`.
11
11
 
12
12
  ```python
13
13
  class FileConfig(BaseModel):
14
- data_dir: Path = Path.home() / ".cache/mads_datasets/covid"
14
+ data_dir: Path = Path.home() / ".cache/goad/covid"
15
15
  filename: Path = Path("covid.csv")
16
16
  url: str = "https://raw.githubusercontent.com/mzelst/covid-19/master/data/rivm_by_day.csv"
17
17
  date_column: Optional[str] = "date"
@@ -300,6 +300,7 @@ class PlotSettings:
300
300
  grid: bool = False
301
301
  grid_alpha: Optional[float] = None
302
302
  subplot_titles: List[str] = field(default_factory=list)
303
+ max_cols: int = 3 # columns before wrapping
303
304
  highlight: List[str] = field(default_factory=list) # defaults for HighlightCategory
304
305
  base_color: str = "lightgrey"
305
306
  highlight_color: str = "crimson"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "goad-toolkit"
3
- version = "0.2.9"
3
+ version = "0.2.11"
4
4
  description = "An extensible toolkit for Goal Oriented Analysis of Data"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -12,7 +12,7 @@ class FileConfig(BaseModel):
12
12
  index. The reader is picked from the file suffix (`.csv`, `.parquet`).
13
13
  """
14
14
 
15
- data_dir: Path = Path.home() / ".cache/mads_datasets/covid"
15
+ data_dir: Path = Path.home() / ".cache/goad/covid"
16
16
  filename: Path = Path("covid.csv")
17
17
  url: str = (
18
18
  "https://raw.githubusercontent.com/mzelst/covid-19/master/data/rivm_by_day.csv"
@@ -30,6 +30,7 @@ class PlotSettings:
30
30
  grid: bool = False # Added grid option
31
31
  grid_alpha: Optional[float] = None # Grid transparency
32
32
  subplot_titles: List[str] = field(default_factory=list) # Titles for subplots
33
+ max_cols: int = 3 # Columns before create_figure wraps to a new row
33
34
  highlight: List[str] = field(default_factory=list) # Categories to pick out
34
35
  base_color: str = "lightgrey" # Everything that is not highlighted
35
36
  highlight_color: str = "crimson" # The categories that are
@@ -39,8 +40,9 @@ class PlotSettings:
39
40
  f"PlotSettings(figsize={self.figsize},\n title={self.title},\n "
40
41
  f"xlabel={self.xlabel},\n ylabel={self.ylabel},\n "
41
42
  f"legend_title={self.legend_title},\n grid={self.grid},\n "
42
- f"grid_alpha={self.grid_alpha},\n highlight={self.highlight},\n "
43
- f"base_color={self.base_color},\n highlight_color={self.highlight_color}"
43
+ f"grid_alpha={self.grid_alpha},\n max_cols={self.max_cols},\n "
44
+ f"highlight={self.highlight},\n base_color={self.base_color},\n "
45
+ f"highlight_color={self.highlight_color}"
44
46
  )
45
47
 
46
48
 
@@ -72,7 +74,7 @@ class BasePlot(ABC):
72
74
  axes = [self.ax]
73
75
  else:
74
76
  # Determine grid layout
75
- grid_cols = min(3, n_plots) # Max 3 columns
77
+ grid_cols = min(self.settings.max_cols, n_plots)
76
78
  grid_rows = int(np.ceil(n_plots / grid_cols))
77
79
  # Create subplot grid
78
80
  self.fig, axes = plt.subplots(
@@ -281,6 +281,30 @@ def facecolours(ax) -> list:
281
281
  return [patch.get_facecolor() for patch in ax.patches]
282
282
 
283
283
 
284
+ def test_create_figure_wraps_at_three_columns_by_default():
285
+ host = LinePlot(PlotSettings())
286
+ fig, axes = host.create_figure(n_plots=4)
287
+
288
+ visible = [ax for ax in axes if ax.get_visible()]
289
+ assert len(visible) == 4
290
+ assert fig.axes[0].get_subplotspec().get_gridspec().get_geometry() == (2, 3)
291
+
292
+
293
+ def test_max_cols_puts_four_panels_on_one_row():
294
+ host = LinePlot(PlotSettings(max_cols=4))
295
+ fig, axes = host.create_figure(n_plots=4)
296
+
297
+ assert fig.axes[0].get_subplotspec().get_gridspec().get_geometry() == (1, 4)
298
+ assert all(ax.get_visible() for ax in axes)
299
+
300
+
301
+ def test_max_cols_of_two_gives_a_square_grid():
302
+ host = LinePlot(PlotSettings(max_cols=2))
303
+ fig, axes = host.create_figure(n_plots=4)
304
+
305
+ assert fig.axes[0].get_subplotspec().get_gridspec().get_geometry() == (2, 2)
306
+
307
+
284
308
  def test_annotate_writes_the_text_on_the_axis():
285
309
  host = LinePlot(PlotSettings())
286
310
  host.create_figure()
@@ -383,7 +383,7 @@ wheels = [
383
383
 
384
384
  [[package]]
385
385
  name = "goad-toolkit"
386
- version = "0.2.9"
386
+ version = "0.2.11"
387
387
  source = { editable = "." }
388
388
  dependencies = [
389
389
  { name = "loguru" },
File without changes
File without changes
File without changes
File without changes