solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.1__py3-none-any.whl

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.

Potentially problematic release.


This version of solarwindpy might be problematic. Click here for more details.

Files changed (412) hide show
  1. plans/.velocity/metrics.json +96 -0
  2. plans/0-overview-template.md +268 -0
  3. plans/N-phase-template.md +106 -0
  4. plans/PLAN_AUDIT_SUMMARY.md +173 -0
  5. plans/TEMPLATE-USAGE-GUIDE.md +198 -0
  6. plans/__init__.py +1 -0
  7. plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
  8. plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
  9. plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
  10. plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
  11. plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
  12. plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
  13. plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
  14. plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
  15. plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
  16. plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
  17. plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
  18. plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
  19. plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
  20. plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
  21. plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
  22. plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
  23. plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
  24. plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
  25. plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
  26. plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
  27. plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
  28. plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
  29. plans/cicd-architecture-redesign/0-Overview.md +193 -0
  30. plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
  31. plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
  32. plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
  33. plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
  34. plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
  35. plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
  36. plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
  37. plans/cicd-architecture-redesign/8-Documentation.md +285 -0
  38. plans/cicd-architecture-redesign/Closeout.md +225 -0
  39. plans/closeout-template.md +259 -0
  40. plans/completed/circular-import-audit/0-Overview.md +152 -0
  41. plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
  42. plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
  43. plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
  44. plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
  45. plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
  46. plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
  47. plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
  48. plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
  49. plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
  50. plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
  51. plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
  52. plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
  53. plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
  54. plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
  55. plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
  56. plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
  57. plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
  58. plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
  59. plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
  60. plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
  61. plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
  62. plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
  63. plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
  64. plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
  65. plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
  66. plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
  67. plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
  68. plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
  69. plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
  70. plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
  71. plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
  72. plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
  73. plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
  74. plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
  75. plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
  76. plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
  77. plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
  78. plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
  79. plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
  80. plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
  81. plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
  82. plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
  83. plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
  84. plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
  85. plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
  86. plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
  87. plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
  88. plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
  89. plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
  90. plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
  91. plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
  92. plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
  93. plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
  94. plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
  95. plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
  96. plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
  97. plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
  98. plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
  99. plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
  100. plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
  101. plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
  102. plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
  103. plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
  104. plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
  105. plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
  106. plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
  107. plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
  108. plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
  109. plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
  110. plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
  111. plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
  112. plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
  113. plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
  114. plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
  115. plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
  116. plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
  117. plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
  118. plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
  119. plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
  120. plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
  121. plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
  122. plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
  123. plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
  124. plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
  125. plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
  126. plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
  127. plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
  128. plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
  129. plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
  130. plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
  131. plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
  132. plans/completed/pr-review-remediation/0-Overview.md +138 -0
  133. plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
  134. plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
  135. plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
  136. plans/completed/pr-review-remediation/compacted_state.md +66 -0
  137. plans/completed/python-310-migration/0-Overview.md +390 -0
  138. plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
  139. plans/completed/python-310-migration/2-Implementation.md +256 -0
  140. plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
  141. plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
  142. plans/completed/python-310-migration/5-Closeout.md +252 -0
  143. plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
  144. plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
  145. plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
  146. plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
  147. plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
  148. plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
  149. plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
  150. plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
  151. plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
  152. plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
  153. plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
  154. plans/completed/test-directory-consolidation/0-Overview.md +51 -0
  155. plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
  156. plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
  157. plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
  158. plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
  159. plans/completed/test-directory-consolidation/5-Validation.md +152 -0
  160. plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
  161. plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
  162. plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
  163. plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
  164. plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
  165. plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
  166. plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
  167. plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
  168. plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
  169. plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
  170. plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
  171. plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
  172. plans/documentation-code-audit/0-Overview.md +393 -0
  173. plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
  174. plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
  175. plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
  176. plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
  177. plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
  178. plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
  179. plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
  180. plans/documentation-code-audit/8-Closeout.md +456 -0
  181. plans/documentation-rebuild-session/compacted_state.md +109 -0
  182. plans/documentation-rendering-fixes/0-Overview.md +104 -0
  183. plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
  184. plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
  185. plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
  186. plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
  187. plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
  188. plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
  189. plans/documentation-rendering-fixes/compacted_state.md +132 -0
  190. plans/documentation-template-fix/0-Overview.md +197 -0
  191. plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
  192. plans/documentation-template-fix/2-Template-Modification.md +609 -0
  193. plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
  194. plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
  195. plans/documentation-template-fix/5-Documentation-Training.md +602 -0
  196. plans/documentation-workflow-fix/0-Overview.md +222 -0
  197. plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
  198. plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
  199. plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
  200. plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
  201. plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
  202. plans/duplicate-object-warnings-fix-plan.md +130 -0
  203. plans/github-issues-migration/0-Overview.md +510 -0
  204. plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
  205. plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
  206. plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
  207. plans/github-issues-migration/4-Validated-Migration.md +252 -0
  208. plans/github-issues-migration/5-Documentation-Training.md +171 -0
  209. plans/github-issues-migration/6-Closeout.md +179 -0
  210. plans/github-workflows-repair/repair-plan.md +299 -0
  211. plans/issues_from_plans.py +342 -0
  212. plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
  213. plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
  214. plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
  215. plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
  216. plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
  217. plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
  218. plans/python-310-migration/0-Overview.md +390 -0
  219. plans/python-310-migration/1-Planning-Setup.md +164 -0
  220. plans/python-310-migration/2-Implementation.md +256 -0
  221. plans/python-310-migration/3-Testing-Validation.md +335 -0
  222. plans/python-310-migration/4-Documentation-Release.md +274 -0
  223. plans/python-310-migration/5-Closeout.md +252 -0
  224. plans/readthedocs-simplified/0-Overview.md +243 -0
  225. plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
  226. plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
  227. plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
  228. plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
  229. plans/readthedocs-simplified/5-Closeout.md +231 -0
  230. plans/readthedocs-simplified/compacted_state.md +127 -0
  231. plans/session-compaction-2025-08-12/compacted_state.md +114 -0
  232. plans/session-compaction-2025-08-13/compacted_state.md +145 -0
  233. plans/session-continuity-protocol/0-Overview.md +35 -0
  234. plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
  235. plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
  236. plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
  237. plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
  238. plans/sphinx-warnings-analysis.md +222 -0
  239. plans/systemprompt-optimization/0-Overview.md +447 -0
  240. plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
  241. plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
  242. plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
  243. plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
  244. plans/systemprompt-optimization/9-Closeout.md +165 -0
  245. plans/systemprompt-optimization/compacted_state.md +143 -0
  246. plans/template-value-propositions/0-Overview.md +357 -0
  247. plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
  248. plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
  249. plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
  250. plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
  251. plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
  252. plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
  253. plans/tests-audit/0-Overview.md +410 -0
  254. plans/tests-audit/1-Discovery-Inventory.md +170 -0
  255. plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
  256. plans/tests-audit/3-Architecture-Compliance.md +195 -0
  257. plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
  258. plans/tests-audit/5-Documentation-Enhancement.md +220 -0
  259. plans/tests-audit/6-Audit-Deliverables.md +220 -0
  260. plans/tests-audit/7-Closeout.md +252 -0
  261. plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
  262. plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
  263. plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
  264. plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
  265. plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
  266. plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
  267. plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
  268. plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
  269. plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
  270. plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
  271. plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
  272. plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
  273. plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
  274. plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
  275. plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
  276. plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
  277. plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
  278. plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
  279. plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
  280. plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
  281. plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
  282. plans/tests-audit/artifacts/test_parser.py +395 -0
  283. solarwindpy/README.md +3 -0
  284. solarwindpy/Untitled.ipynb +54 -0
  285. solarwindpy/__init__.py +74 -0
  286. solarwindpy/core/__init__.py +23 -0
  287. solarwindpy/core/alfvenic_turbulence.py +804 -0
  288. solarwindpy/core/base.py +267 -0
  289. solarwindpy/core/ions.py +309 -0
  290. solarwindpy/core/plasma.py +2133 -0
  291. solarwindpy/core/spacecraft.py +256 -0
  292. solarwindpy/core/tensor.py +90 -0
  293. solarwindpy/core/units_constants.py +199 -0
  294. solarwindpy/core/vector.py +328 -0
  295. solarwindpy/fitfunctions/__init__.py +20 -0
  296. solarwindpy/fitfunctions/core.py +734 -0
  297. solarwindpy/fitfunctions/exponentials.py +188 -0
  298. solarwindpy/fitfunctions/gaussians.py +264 -0
  299. solarwindpy/fitfunctions/lines.py +116 -0
  300. solarwindpy/fitfunctions/moyal.py +71 -0
  301. solarwindpy/fitfunctions/plots.py +751 -0
  302. solarwindpy/fitfunctions/power_laws.py +209 -0
  303. solarwindpy/fitfunctions/tex_info.py +568 -0
  304. solarwindpy/fitfunctions/trend_fits.py +482 -0
  305. solarwindpy/instabilities/__init__.py +16 -0
  306. solarwindpy/instabilities/beta_ani.py +82 -0
  307. solarwindpy/instabilities/verscharen2016.py +631 -0
  308. solarwindpy/plotting/__init__.py +33 -0
  309. solarwindpy/plotting/agg_plot.py +489 -0
  310. solarwindpy/plotting/base.py +465 -0
  311. solarwindpy/plotting/hist1d.py +405 -0
  312. solarwindpy/plotting/hist2d.py +1035 -0
  313. solarwindpy/plotting/histograms.py +1845 -0
  314. solarwindpy/plotting/labels/__init__.py +104 -0
  315. solarwindpy/plotting/labels/base.py +686 -0
  316. solarwindpy/plotting/labels/chemistry.py +19 -0
  317. solarwindpy/plotting/labels/composition.py +100 -0
  318. solarwindpy/plotting/labels/datetime.py +235 -0
  319. solarwindpy/plotting/labels/elemental_abundance.py +73 -0
  320. solarwindpy/plotting/labels/special.py +794 -0
  321. solarwindpy/plotting/orbits.py +515 -0
  322. solarwindpy/plotting/scatter.py +99 -0
  323. solarwindpy/plotting/select_data_from_figure.py +329 -0
  324. solarwindpy/plotting/spiral.py +980 -0
  325. solarwindpy/plotting/tools.py +434 -0
  326. solarwindpy/scripts/__init__.py +1 -0
  327. solarwindpy/scripts/logs/.gitignore +1 -0
  328. solarwindpy/solar_activity/__init__.py +53 -0
  329. solarwindpy/solar_activity/base.py +605 -0
  330. solarwindpy/solar_activity/lisird/__init__.py +3 -0
  331. solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
  332. solarwindpy/solar_activity/lisird/lisird.py +319 -0
  333. solarwindpy/solar_activity/plots.py +116 -0
  334. solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
  335. solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
  336. solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
  337. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
  338. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
  339. solarwindpy/tools/__init__.py +162 -0
  340. solarwindpy-0.1.1.dist-info/METADATA +181 -0
  341. solarwindpy-0.1.1.dist-info/RECORD +409 -0
  342. {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
  343. solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
  344. solarwindpy-0.1.1.dist-info/top_level.txt +3 -0
  345. tests/__init__.py +1 -0
  346. tests/conftest.py +10 -0
  347. tests/core/__init__.py +1 -0
  348. tests/core/test_alfvenic_turbulence.py +544 -0
  349. tests/core/test_base.py +112 -0
  350. tests/core/test_base_head_tail.py +29 -0
  351. tests/core/test_base_mi_tuples.py +11 -0
  352. tests/core/test_core_verify_datetimeindex.py +32 -0
  353. tests/core/test_ions.py +325 -0
  354. tests/core/test_plasma.py +2581 -0
  355. tests/core/test_plasma_io.py +12 -0
  356. tests/core/test_quantities.py +507 -0
  357. tests/core/test_spacecraft.py +210 -0
  358. tests/core/test_units_constants.py +22 -0
  359. tests/data/epoch.csv +4 -0
  360. tests/data/plasma.csv +4 -0
  361. tests/data/spacecraft.csv +4 -0
  362. tests/fitfunctions/conftest.py +60 -0
  363. tests/fitfunctions/test_core.py +193 -0
  364. tests/fitfunctions/test_exponentials.py +342 -0
  365. tests/fitfunctions/test_gaussians.py +142 -0
  366. tests/fitfunctions/test_lines.py +349 -0
  367. tests/fitfunctions/test_moyal.py +258 -0
  368. tests/fitfunctions/test_plots.py +258 -0
  369. tests/fitfunctions/test_power_laws.py +365 -0
  370. tests/fitfunctions/test_tex_info.py +183 -0
  371. tests/fitfunctions/test_trend_fit_properties.py +31 -0
  372. tests/fitfunctions/test_trend_fits.py +244 -0
  373. tests/plotting/__init__.py +1 -0
  374. tests/plotting/labels/__init__.py +1 -0
  375. tests/plotting/labels/test_chemistry.py +243 -0
  376. tests/plotting/labels/test_composition.py +345 -0
  377. tests/plotting/labels/test_datetime.py +445 -0
  378. tests/plotting/labels/test_elemental_abundance.py +366 -0
  379. tests/plotting/labels/test_init.py +66 -0
  380. tests/plotting/labels/test_labels_base.py +347 -0
  381. tests/plotting/labels/test_special.py +550 -0
  382. tests/plotting/test_agg_plot.py +602 -0
  383. tests/plotting/test_base.py +752 -0
  384. tests/plotting/test_fixtures_utilities.py +775 -0
  385. tests/plotting/test_histograms.py +546 -0
  386. tests/plotting/test_integration.py +675 -0
  387. tests/plotting/test_orbits.py +435 -0
  388. tests/plotting/test_performance.py +708 -0
  389. tests/plotting/test_scatter.py +752 -0
  390. tests/plotting/test_select_data_from_figure.py +1209 -0
  391. tests/plotting/test_spiral.py +573 -0
  392. tests/plotting/test_tools.py +607 -0
  393. tests/plotting/test_visual_validation.py +465 -0
  394. tests/solar_activity/__init__.py +1 -0
  395. tests/solar_activity/lisird/__init__.py +1 -0
  396. tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
  397. tests/solar_activity/lisird/test_lisird_id.py +187 -0
  398. tests/solar_activity/sunspot_number/__init__.py +1 -0
  399. tests/solar_activity/sunspot_number/test_init.py +399 -0
  400. tests/solar_activity/sunspot_number/test_sidc.py +465 -0
  401. tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
  402. tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
  403. tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
  404. tests/solar_activity/test_base.py +656 -0
  405. tests/solar_activity/test_init.py +396 -0
  406. tests/solar_activity/test_plots.py +371 -0
  407. tests/test_circular_imports.py +408 -0
  408. tests/test_issue_titles.py +25 -0
  409. tests/test_statusline.py +298 -0
  410. solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
  411. solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
  412. solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
@@ -0,0 +1,183 @@
1
+ import warnings
2
+
3
+ from types import SimpleNamespace
4
+
5
+ import matplotlib
6
+ import pytest
7
+ from solarwindpy.fitfunctions.tex_info import TeXinfo
8
+
9
+ matplotlib.use("Agg")
10
+ warnings.filterwarnings("ignore")
11
+
12
+
13
+ @pytest.fixture
14
+ def texinfo():
15
+ popt = {"a": 1.23, "b": 4.56}
16
+ psigma = {"a": 0.01, "b": 0.02}
17
+ func = "f(x)=a x + b"
18
+ chisq = SimpleNamespace(linear=1.0, robust=2.0)
19
+ rsq = 0.99
20
+ initial_guess_info = {
21
+ "a": SimpleNamespace(p0=0.5, bounds=(-1, 1)),
22
+ "b": SimpleNamespace(p0=2.0, bounds=(0, 5)),
23
+ }
24
+ tex = TeXinfo(popt, psigma, func, chisq, rsq, initial_guess_info, 10)
25
+ tex.set_TeX_argnames(a="\\alpha", b="\\beta")
26
+ return tex
27
+
28
+
29
+ def test_properties_and_str(texinfo):
30
+ assert texinfo.popt == {"a": 1.23, "b": 4.56}
31
+ assert texinfo.psigma == {"a": 0.01, "b": 0.02}
32
+ assert texinfo.chisq_dof.linear == 1.0
33
+ assert texinfo.rsq == 0.99
34
+ assert texinfo.npts == 10
35
+ assert texinfo.TeX_function == "f(x)=a x + b"
36
+ assert texinfo.TeX_argnames == {"a": "\\alpha", "b": "\\beta"}
37
+ assert "\\alpha" in texinfo.initial_guess_info
38
+ assert texinfo.TeX_popt["\\alpha"].startswith("1.23")
39
+ assert "\\sigma(X)/X" in texinfo.TeX_relative_error
40
+ info = texinfo.build_info(rsq=True, npts=True)
41
+ assert "R^2 = 0.99" in info
42
+ assert str(texinfo) == info
43
+
44
+
45
+ def test_constructor_and_setters_errors():
46
+ with pytest.raises(ValueError):
47
+ TeXinfo({"a": 1}, {"b": 1}, "f", SimpleNamespace(), 0, None, None)
48
+ with pytest.raises(TypeError):
49
+ TeXinfo({"a": 1}, {"a": 1}, "f", SimpleNamespace(), 0, "bad", None)
50
+ tex = TeXinfo({"a": 1}, {"a": 1}, "f", SimpleNamespace(), 0, None, None)
51
+ with pytest.raises(TypeError):
52
+ tex.set_npts("ten")
53
+ with pytest.raises(TypeError):
54
+ tex.set_initial_guess_info("bad")
55
+ with pytest.raises(ValueError):
56
+ tex.set_TeX_argnames(c="\\gamma")
57
+
58
+
59
+ def test_set_popt_psigma_errors(texinfo):
60
+ with pytest.raises(
61
+ ValueError
62
+ ): # Function actually raises ValueError when iterating over string
63
+ texinfo.set_popt_psigma("bad", {"a": 1})
64
+ with pytest.raises(AttributeError): # String doesn't have .items() method
65
+ texinfo.set_popt_psigma({"a": 1}, "bad")
66
+ with pytest.raises(ValueError):
67
+ texinfo.set_popt_psigma({"a": 1}, {"b": 1})
68
+
69
+
70
+ def test_set_chisq_dof_type_error(texinfo):
71
+ # The function doesn't actually do type checking, just sets the value
72
+ texinfo.set_chisq_dof("bad") # This should succeed
73
+ assert texinfo._chisq_dof == "bad"
74
+
75
+
76
+ def test_set_rsq_type_error(texinfo):
77
+ # The function doesn't actually do type checking, just sets the value
78
+ texinfo.set_rsq("bad") # This should succeed
79
+ assert texinfo._rsq == "bad"
80
+
81
+
82
+ def test_set_TeX_function_type_error(texinfo):
83
+ # The function doesn't actually do type checking, just sets the value
84
+ texinfo.set_TeX_function(5) # This should succeed
85
+ assert texinfo._TeX_function == 5
86
+
87
+
88
+ def test_check_and_add_math_escapes():
89
+ f = TeXinfo._check_and_add_math_escapes
90
+ assert f("x") == "$x$"
91
+ assert f("$x$") == "$x$"
92
+ with pytest.raises(ValueError):
93
+ f("$x$$")
94
+
95
+
96
+ def test_calc_precision():
97
+ f = TeXinfo._calc_precision
98
+ assert f(0.00123) == -3
99
+ assert f(123.0) == 2
100
+
101
+
102
+ def test_simplify_for_paper():
103
+ assert TeXinfo._simplify_for_paper(["$a=1.2300$", "$text$"]) == [
104
+ "a = 1.23",
105
+ "text",
106
+ ]
107
+
108
+
109
+ def test_add_additional_info_with_str(texinfo):
110
+ base = "base"
111
+ result = texinfo._add_additional_info(base, "extra")
112
+ # The function actually returns "base\nextra" format
113
+ assert "extra" in result
114
+ assert "base" in result
115
+
116
+
117
+ def test_add_additional_info(texinfo):
118
+ base = "base"
119
+ result = texinfo._add_additional_info(base, ["x", "y"])
120
+ assert "$x$" in result and "$y$" in result
121
+ with pytest.raises(TypeError):
122
+ texinfo._add_additional_info(base, 5)
123
+
124
+
125
+ def test_build_fit_parameter_info(texinfo):
126
+ info = texinfo._build_fit_parameter_info(
127
+ chisq_dof=True,
128
+ rsq=True,
129
+ convert_pow_10=True,
130
+ strip_uncertainties=True,
131
+ simplify_info_for_paper=True,
132
+ npts=True,
133
+ relative_error=True,
134
+ )
135
+ assert "chi" in info and "R^2" in info
136
+ assert "N_\\mathrm{pts}" in info and "sigma(X)/X" in info
137
+
138
+
139
+ def test_build_fit_parameter_info_errors(texinfo):
140
+ """_build_fit_parameter_info should reject unknown kwargs."""
141
+ with pytest.raises(
142
+ TypeError
143
+ ): # Function actually raises TypeError for unknown kwargs
144
+ texinfo._build_fit_parameter_info(bogus=True)
145
+
146
+
147
+ def test_annotate_info(texinfo):
148
+ import matplotlib.pyplot as plt
149
+
150
+ fig, ax = plt.subplots()
151
+ texinfo.annotate_info(ax)
152
+ assert texinfo.info in ax.texts[0].get_text()
153
+ plt.close(fig)
154
+
155
+
156
+ def test_build_info_and_val_uncert(texinfo):
157
+ info = texinfo.build_info(additional_info="extra")
158
+ assert "extra" in info
159
+ with pytest.raises(ValueError):
160
+ texinfo.build_info(bogus=True)
161
+ s = texinfo.val_uncert_2_string(1.234, 0.01)
162
+ assert "\\pm" in s and s.startswith("1.23")
163
+
164
+
165
+ def test_build_info_with_initial_guess(texinfo):
166
+ info = texinfo.build_info(add_initial_guess=True)
167
+ assert "\\alpha" in info and "5.000e-01" in info
168
+ assert str(texinfo) == info
169
+
170
+
171
+ def test_build_info_relative_error_e_format(texinfo):
172
+ info = texinfo.build_info(relative_error=True, convert_pow_10=False)
173
+ assert "sigma(X)/X" in info and "e+00" in info
174
+ assert "10^" not in info
175
+ assert str(texinfo) == info
176
+
177
+
178
+ def test_build_info_strip_uncert_simplify(texinfo):
179
+ info = texinfo.build_info(strip_uncertainties=True, simplify_info_for_paper=True)
180
+ assert "\\pm" not in info
181
+ assert "\\alpha = 1.23" in info
182
+ assert "e+" not in info
183
+ assert str(texinfo) == info
@@ -0,0 +1,31 @@
1
+ import numpy as np
2
+ import pandas as pd
3
+ import pytest
4
+
5
+ from solarwindpy.fitfunctions import trend_fits, lines
6
+
7
+
8
+ @pytest.fixture
9
+ def agged():
10
+ xbins = pd.interval_range(0, 5, periods=5)
11
+ ybins = pd.interval_range(0, 2, periods=2)
12
+ data = {
13
+ ybins[0]: np.array([1, 2, 3, 4, 5]),
14
+ ybins[1]: np.array([2, 3, 4, 5, 6]),
15
+ }
16
+ return pd.DataFrame(data, index=xbins)
17
+
18
+
19
+ def test_popt1d_keys_property(agged):
20
+ trend_fit = trend_fits.TrendFit(agged, lines.Line)
21
+ assert trend_fit.popt1d_keys == trend_fits.Popt1DKeys("mu", "sigma")
22
+
23
+
24
+ def test_trend_logx_true_make_trend_func(agged):
25
+ """Ensure ``trend_logx`` propagates to the trend function."""
26
+ trend_fit = trend_fits.TrendFit(agged, lines.Line, trend_logx=True)
27
+ assert trend_fit.trend_logx is True
28
+ trend_fit.make_ffunc1ds()
29
+ trend_fit.make_1dfits()
30
+ trend_fit.make_trend_func()
31
+ assert isinstance(trend_fit.trend_func, lines.Line)
@@ -0,0 +1,244 @@
1
+ import warnings
2
+ from types import SimpleNamespace
3
+
4
+ import numpy as np
5
+ import pandas as pd
6
+ import pytest
7
+ from scipy.optimize import OptimizeWarning
8
+
9
+ from solarwindpy.fitfunctions import core, gaussians, trend_fits, lines
10
+ from solarwindpy.fitfunctions.plots import AxesLabels
11
+
12
+
13
+ @pytest.fixture
14
+ def agged():
15
+ xbins = pd.interval_range(0, 5, periods=5)
16
+ ybins = pd.interval_range(0, 2, periods=2)
17
+ data = {
18
+ ybins[0]: np.array([1, 2, 3, 4, 5]),
19
+ ybins[1]: np.array([2, 3, 4, 5, 6]),
20
+ }
21
+ return pd.DataFrame(data, index=xbins)
22
+
23
+
24
+ @pytest.fixture
25
+ def agged_empty():
26
+ xbins = pd.interval_range(0, 5, periods=5)
27
+ return pd.DataFrame({}, index=xbins)
28
+
29
+
30
+ @pytest.fixture
31
+ def trend_fit(agged):
32
+ tf = trend_fits.TrendFit(agged, lines.Line)
33
+ tf.make_ffunc1ds()
34
+ tf.make_1dfits()
35
+ tf.make_trend_func()
36
+ with warnings.catch_warnings():
37
+ warnings.filterwarnings("ignore", category=OptimizeWarning)
38
+ tf.trend_func.make_fit()
39
+ return tf
40
+
41
+
42
+ @pytest.fixture
43
+ def trend_fit_all_ffuncs(monkeypatch, agged):
44
+ tf = trend_fits.TrendFit(agged, lines.Line)
45
+ tf.make_ffunc1ds()
46
+ tf.make_1dfits()
47
+ tf.make_trend_func()
48
+ with warnings.catch_warnings():
49
+ warnings.filterwarnings("ignore", category=OptimizeWarning)
50
+ tf.trend_func.make_fit()
51
+ monkeypatch.setattr(
52
+ tf.trend_func.plotter,
53
+ "_labels",
54
+ SimpleNamespace(x=SimpleNamespace(tex="", units="")),
55
+ )
56
+ calls = {}
57
+ hax = SimpleNamespace(legend_=SimpleNamespace(set_title=lambda *_: None))
58
+ rax = SimpleNamespace()
59
+ for k, ff in tf.ffuncs.items():
60
+
61
+ def stub(*_, _key=k, **__):
62
+ calls[_key] = calls.get(_key, 0) + 1
63
+ return hax, rax
64
+
65
+ monkeypatch.setattr(ff.plotter, "plot_raw_used_fit_resid", stub)
66
+ return tf, calls, hax, rax
67
+
68
+
69
+ def test_type_enforcement_and_properties(agged):
70
+ tf = trend_fits.TrendFit(agged, lines.Line)
71
+ assert tf.agged.equals(agged)
72
+ assert tf.ffunc1d_class is gaussians.Gaussian
73
+ assert tf.trendfunc_class is lines.Line
74
+ assert str(tf) == "TrendFit"
75
+ with pytest.raises(TypeError):
76
+ trend_fits.TrendFit(agged, int)
77
+ with pytest.raises(TypeError):
78
+ tf.set_fitfunctions(int, lines.Line)
79
+ with pytest.raises(TypeError):
80
+ tf.set_fitfunctions(gaussians.Gaussian, int)
81
+
82
+
83
+ def test_make_ffunc1ds_make_1dfits(agged):
84
+ tf = trend_fits.TrendFit(agged, lines.Line)
85
+ tf.make_ffunc1ds()
86
+ assert isinstance(tf.ffuncs.iloc[0], gaussians.Gaussian)
87
+ tf.make_1dfits()
88
+ assert tf.bad_fits.empty
89
+ assert not tf.popt_1d.empty
90
+ assert not tf.psigma_1d.empty
91
+
92
+
93
+ def test_make_1dfits_moves_bad_fit(monkeypatch):
94
+ xbins = pd.interval_range(0, 5, periods=5)
95
+ ybins = pd.interval_range(0, 2, periods=2)
96
+ data = {
97
+ ybins[0]: np.array([1, 2, 3, 4, 5]),
98
+ ybins[1]: np.array([np.nan, np.nan, np.nan, 5, 6]),
99
+ }
100
+ agged = pd.DataFrame(data, index=xbins)
101
+ tf = trend_fits.TrendFit(agged, lines.Line)
102
+ tf.make_ffunc1ds()
103
+
104
+ orig_make_fit = gaussians.Gaussian.make_fit
105
+
106
+ def fail_on_small_n(self, *args, **kwargs):
107
+ if self.nobs < len(self.argnames):
108
+ return ValueError("insufficient data")
109
+ return orig_make_fit(self, *args, **kwargs)
110
+
111
+ monkeypatch.setattr(gaussians.Gaussian, "make_fit", fail_on_small_n)
112
+ tf.make_1dfits()
113
+ bad_bin = ybins[1]
114
+ assert bad_bin in tf.bad_fits.index
115
+ assert bad_bin not in tf.ffuncs.index
116
+
117
+
118
+ def test_make_trend_func_success_and_failure(trend_fit, agged_empty):
119
+ assert isinstance(trend_fit.trend_func, lines.Line)
120
+ tf = trend_fits.TrendFit(agged_empty, lines.Line)
121
+ tf.make_ffunc1ds()
122
+ with pytest.raises(ValueError):
123
+ tf.make_trend_func()
124
+
125
+
126
+ def test_plotting_methods_return_axes(monkeypatch, trend_fit):
127
+ class DummyAx:
128
+ def set_xscale(self, *_):
129
+ pass
130
+
131
+ def errorbar(self, *_, **__):
132
+ line = SimpleNamespace(set_linestyle=lambda *_: None)
133
+ return "pl", "cl", [line]
134
+
135
+ def legend(self, *_, **__):
136
+ pass
137
+
138
+ def plot(self, *args, **kwargs):
139
+ return None
140
+
141
+ def fill_between(self, *args, **kwargs):
142
+ return None
143
+
144
+ ax1, ax2 = DummyAx(), DummyAx()
145
+ monkeypatch.setattr(
146
+ trend_fit.trend_func.plotter,
147
+ "plot_raw_used_fit_resid",
148
+ lambda *_, **__: (ax1, ax2),
149
+ )
150
+ h, r = trend_fit.plot_trend_fit_resid()
151
+ assert h is ax1 and r is ax2
152
+
153
+ monkeypatch.setattr(trend_fit, "plot_all_popt_1d", lambda *_, **__: (1, 2, 3))
154
+ h2, r2 = trend_fit.plot_trend_and_resid_on_ffuncs()
155
+ assert h2 is ax1 and r2 is ax2
156
+
157
+ monkeypatch.setattr(
158
+ trend_fit.trend_func.plotter, "plot_raw_used_fit", lambda *_, **__: None
159
+ )
160
+ monkeypatch.setattr(
161
+ trend_fits, "subplots", lambda *_, **__: (None, DummyAx())
162
+ )
163
+ ax = trend_fit.plot_1d_popt_and_trend()
164
+ assert isinstance(ax, DummyAx)
165
+
166
+
167
+ def test_plot_all_popt_1d_returns_errorbar_artists(agged):
168
+ class StubAx:
169
+ def __init__(self):
170
+ self.calls = {}
171
+ line = SimpleNamespace(set_linestyle=lambda *_: None)
172
+ self.ret = ("pl", "cl", [line])
173
+
174
+ def errorbar(self, *args, **kwargs):
175
+ self.calls["errorbar"] = {"args": args, "kwargs": kwargs}
176
+ return self.ret
177
+
178
+ def set_xscale(self, *args, **kwargs): # pragma: no cover - not used here
179
+ self.calls["set_xscale"] = {"args": args, "kwargs": kwargs}
180
+
181
+ def plot(self, *args, **kwargs):
182
+ self.calls["plot"] = {"args": args, "kwargs": kwargs}
183
+ return None
184
+
185
+ def fill_between(self, *args, **kwargs):
186
+ self.calls["fill_between"] = {"args": args, "kwargs": kwargs}
187
+ return None
188
+
189
+ tf = trend_fits.TrendFit(agged, lines.Line)
190
+ tf.make_ffunc1ds()
191
+ tf.make_1dfits()
192
+ tf.make_trend_func()
193
+
194
+ ax = StubAx()
195
+ pl, cl, bl = tf.plot_all_popt_1d(ax, color="magenta", label="1D Fits", plot_window=False)
196
+
197
+ assert (pl, cl, bl) == ax.ret
198
+
199
+ kwargs = ax.calls["errorbar"]["kwargs"]
200
+ expected_x = pd.IntervalIndex(tf.popt_1d.index).mid
201
+ np.testing.assert_allclose(kwargs["x"], expected_x)
202
+ ykey, wkey = tf.popt1d_keys
203
+ assert kwargs["y"] == ykey
204
+ assert kwargs["yerr"] == wkey
205
+ assert kwargs["color"] == "magenta"
206
+ assert kwargs["linestyle"] == "--" # Default linestyle
207
+ assert kwargs["label"] == "1D Fits"
208
+ pd.testing.assert_frame_equal(kwargs["data"], tf.popt_1d)
209
+
210
+
211
+ def test_plot_all_ffuncs(trend_fit_all_ffuncs):
212
+ tf, calls, hax, rax = trend_fit_all_ffuncs
213
+ axes = tf.plot_all_ffuncs()
214
+ assert isinstance(axes, pd.DataFrame)
215
+ for key in tf.ffuncs.index:
216
+ assert axes.loc[key, "hax"] is hax
217
+ assert axes.loc[key, "rax"] is rax
218
+ assert calls[key] == 1
219
+
220
+
221
+ def test_set_agged_set_fitfunctions_set_shared_labels(trend_fit, agged):
222
+ new_agged = agged * 2
223
+ trend_fit.set_agged(new_agged)
224
+ assert trend_fit.agged.equals(new_agged)
225
+ trend_fit.set_fitfunctions(gaussians.GaussianNormalized, lines.Line)
226
+ assert trend_fit.ffunc1d_class is gaussians.GaussianNormalized
227
+ trend_fit.set_fitfunctions(gaussians.Gaussian, lines.Line)
228
+ trend_fit.set_shared_labels(x="time", y="density", z="counts")
229
+ assert trend_fit.trend_func.plotter.labels.x == "time"
230
+ first_ff = trend_fit.ffuncs.iloc[0]
231
+ assert first_ff.plotter.labels.x == "density"
232
+ assert first_ff.plotter.labels.y == "counts"
233
+
234
+
235
+ def test_set_agged_rejects_non_dataframe(trend_fit):
236
+ with pytest.raises(AssertionError):
237
+ trend_fit.set_agged(42)
238
+
239
+
240
+ def test_labels_instance_and_update(trend_fit):
241
+ # Labels are stored in the trend_func's plotter, not in TrendFit itself
242
+ assert isinstance(trend_fit.trend_func.plotter.labels, AxesLabels)
243
+ trend_fit.set_shared_labels(x="time", y="density", z="counts")
244
+ assert trend_fit.trend_func.plotter.labels == AxesLabels("time", "density", "counts")
@@ -0,0 +1 @@
1
+ # Plotting module tests
@@ -0,0 +1 @@
1
+ # Plotting labels tests