solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.0__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.0.dist-info/METADATA +181 -0
  341. solarwindpy-0.1.0.dist-info/RECORD +409 -0
  342. {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.0.dist-info}/WHEEL +1 -1
  343. solarwindpy-0.1.0.dist-info/licenses/LICENSE.rst +32 -0
  344. solarwindpy-0.1.0.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,465 @@
1
+ """Visual validation tests for plotting functionality.
2
+
3
+ This module provides visual validation framework for matplotlib plots to ensure
4
+ consistent rendering and detect visual regressions.
5
+ """
6
+
7
+ import pytest
8
+ import numpy as np
9
+ import matplotlib
10
+ import matplotlib.pyplot as plt
11
+ from matplotlib.testing.decorators import image_comparison
12
+ import warnings
13
+
14
+ # Configure matplotlib for testing
15
+ matplotlib.use("Agg") # Non-interactive backend
16
+ plt.ioff() # Turn off interactive mode
17
+
18
+
19
+ class TestVisualValidationFramework:
20
+ """Test the visual validation framework infrastructure."""
21
+
22
+ def test_matplotlib_backend(self):
23
+ """Test matplotlib backend is properly configured."""
24
+ backend = matplotlib.get_backend()
25
+ assert backend == "Agg", f"Expected Agg backend, got {backend}"
26
+
27
+ def test_matplotlib_interactive_mode(self):
28
+ """Test matplotlib interactive mode is disabled."""
29
+ assert (
30
+ not plt.isinteractive()
31
+ ), "Interactive mode should be disabled for testing"
32
+
33
+ def test_figure_creation(self):
34
+ """Test basic figure creation works in test environment."""
35
+ fig, ax = plt.subplots()
36
+ assert fig is not None
37
+ assert ax is not None
38
+ plt.close(fig)
39
+
40
+ def test_plot_generation(self):
41
+ """Test basic plot generation works."""
42
+ fig, ax = plt.subplots()
43
+ x = np.linspace(0, 10, 100)
44
+ y = np.sin(x)
45
+ ax.plot(x, y)
46
+ ax.set_xlabel("X Label")
47
+ ax.set_ylabel("Y Label")
48
+ ax.set_title("Test Plot")
49
+
50
+ # Verify plot has expected elements
51
+ assert len(ax.lines) == 1
52
+ assert ax.get_xlabel() == "X Label"
53
+ assert ax.get_ylabel() == "Y Label"
54
+ assert ax.get_title() == "Test Plot"
55
+
56
+ plt.close(fig)
57
+
58
+
59
+ class TestBasicPlotVisualValidation:
60
+ """Basic visual validation tests for common plot types."""
61
+
62
+ def setup_method(self):
63
+ """Set up test data for plotting."""
64
+ self.x = np.linspace(0, 10, 100)
65
+ self.y_sin = np.sin(self.x)
66
+ self.y_cos = np.cos(self.x)
67
+
68
+ def teardown_method(self):
69
+ """Clean up after each test."""
70
+ plt.close("all")
71
+
72
+ def test_line_plot_visual(self):
73
+ """Test basic line plot visual output."""
74
+ fig, ax = plt.subplots(figsize=(8, 6))
75
+ ax.plot(self.x, self.y_sin, label="sin(x)", linewidth=2)
76
+ ax.plot(self.x, self.y_cos, label="cos(x)", linewidth=2, linestyle="--")
77
+ ax.set_xlabel("X values")
78
+ ax.set_ylabel("Y values")
79
+ ax.set_title("Line Plot Test")
80
+ ax.legend()
81
+ ax.grid(True, alpha=0.3)
82
+
83
+ # Basic validation - plot should have expected elements
84
+ assert len(ax.lines) == 2
85
+ assert ax.legend_ is not None
86
+ assert ax.get_xlabel() == "X values"
87
+
88
+ plt.tight_layout()
89
+ # Note: For actual visual validation, would use @image_comparison decorator
90
+ # This serves as a framework test
91
+
92
+ def test_scatter_plot_visual(self):
93
+ """Test scatter plot visual output."""
94
+ fig, ax = plt.subplots(figsize=(8, 6))
95
+
96
+ # Generate scatter data
97
+ np.random.seed(42)
98
+ x_scatter = np.random.randn(100)
99
+ y_scatter = np.random.randn(100)
100
+ colors = np.random.rand(100)
101
+
102
+ scatter = ax.scatter(x_scatter, y_scatter, c=colors, alpha=0.7, cmap="viridis")
103
+ ax.set_xlabel("X values")
104
+ ax.set_ylabel("Y values")
105
+ ax.set_title("Scatter Plot Test")
106
+
107
+ # Add colorbar
108
+ plt.colorbar(scatter, ax=ax, label="Color Value")
109
+
110
+ # Validation
111
+ assert len(ax.collections) == 1 # Scatter collection
112
+ assert ax.get_xlabel() == "X values"
113
+
114
+ plt.tight_layout()
115
+
116
+ def test_histogram_visual(self):
117
+ """Test histogram visual output."""
118
+ fig, ax = plt.subplots(figsize=(8, 6))
119
+
120
+ # Generate histogram data
121
+ np.random.seed(42)
122
+ data = np.random.normal(0, 1, 1000)
123
+
124
+ n, bins, patches = ax.hist(
125
+ data, bins=30, alpha=0.7, color="skyblue", edgecolor="black", linewidth=0.5
126
+ )
127
+ ax.set_xlabel("Value")
128
+ ax.set_ylabel("Frequency")
129
+ ax.set_title("Histogram Test")
130
+ ax.grid(True, alpha=0.3, axis="y")
131
+
132
+ # Validation
133
+ assert len(patches) == 30 # Number of bins
134
+ assert len(n) == 30
135
+ assert len(bins) == 31 # n+1 bin edges
136
+
137
+ plt.tight_layout()
138
+
139
+
140
+ class TestSolarWindPyPlottingVisualValidation:
141
+ """Visual validation tests for SolarWindPy plotting components."""
142
+
143
+ def setup_method(self):
144
+ """Set up test data for SolarWindPy plotting."""
145
+ # Create synthetic plasma data
146
+ self.time = np.arange(100)
147
+ self.density = 10 + 2 * np.sin(self.time / 10) + np.random.normal(0, 0.5, 100)
148
+ self.velocity = 400 + 50 * np.sin(self.time / 15) + np.random.normal(0, 10, 100)
149
+ self.temperature = (
150
+ 1e5 + 2e4 * np.sin(self.time / 8) + np.random.normal(0, 5e3, 100)
151
+ )
152
+
153
+ def teardown_method(self):
154
+ """Clean up after each test."""
155
+ plt.close("all")
156
+
157
+ def test_time_series_plot_visual(self):
158
+ """Test time series plotting visual output."""
159
+ fig, axes = plt.subplots(3, 1, figsize=(10, 8), sharex=True)
160
+
161
+ # Density plot
162
+ axes[0].plot(self.time, self.density, "b-", linewidth=1.5)
163
+ axes[0].set_ylabel("Density (cm⁻³)")
164
+ axes[0].set_title("Solar Wind Time Series")
165
+ axes[0].grid(True, alpha=0.3)
166
+
167
+ # Velocity plot
168
+ axes[1].plot(self.time, self.velocity, "r-", linewidth=1.5)
169
+ axes[1].set_ylabel("Velocity (km/s)")
170
+ axes[1].grid(True, alpha=0.3)
171
+
172
+ # Temperature plot
173
+ axes[2].plot(self.time, self.temperature, "g-", linewidth=1.5)
174
+ axes[2].set_ylabel("Temperature (K)")
175
+ axes[2].set_xlabel("Time")
176
+ axes[2].grid(True, alpha=0.3)
177
+
178
+ plt.tight_layout()
179
+
180
+ # Validation
181
+ for ax in axes:
182
+ assert len(ax.lines) == 1
183
+ assert ax.get_ylabel() != ""
184
+
185
+ def test_correlation_plot_visual(self):
186
+ """Test correlation/scatter plot visual output."""
187
+ fig, ax = plt.subplots(figsize=(8, 6))
188
+
189
+ # Create correlation plot
190
+ scatter = ax.scatter(
191
+ self.velocity, self.temperature, c=self.density, alpha=0.7, cmap="plasma"
192
+ )
193
+ ax.set_xlabel("Velocity (km/s)")
194
+ ax.set_ylabel("Temperature (K)")
195
+ ax.set_title("Velocity-Temperature Correlation")
196
+
197
+ # Add colorbar with scientific notation
198
+ cbar = plt.colorbar(scatter, ax=ax)
199
+ cbar.set_label("Density (cm⁻³)")
200
+
201
+ # Add trend line
202
+ z = np.polyfit(self.velocity, self.temperature, 1)
203
+ p = np.poly1d(z)
204
+ ax.plot(self.velocity, p(self.velocity), "r--", alpha=0.8, linewidth=2)
205
+
206
+ plt.tight_layout()
207
+
208
+ # Validation
209
+ assert len(ax.collections) == 1 # Scatter collection
210
+ assert len(ax.lines) == 1 # Trend line
211
+
212
+ def test_distribution_plot_visual(self):
213
+ """Test distribution plotting visual output."""
214
+ fig, axes = plt.subplots(2, 2, figsize=(12, 10))
215
+
216
+ # Density histogram
217
+ axes[0, 0].hist(
218
+ self.density,
219
+ bins=20,
220
+ alpha=0.7,
221
+ color="blue",
222
+ edgecolor="black",
223
+ density=True,
224
+ )
225
+ axes[0, 0].set_xlabel("Density (cm⁻³)")
226
+ axes[0, 0].set_ylabel("Probability Density")
227
+ axes[0, 0].set_title("Density Distribution")
228
+ axes[0, 0].grid(True, alpha=0.3)
229
+
230
+ # Velocity histogram
231
+ axes[0, 1].hist(
232
+ self.velocity,
233
+ bins=20,
234
+ alpha=0.7,
235
+ color="red",
236
+ edgecolor="black",
237
+ density=True,
238
+ )
239
+ axes[0, 1].set_xlabel("Velocity (km/s)")
240
+ axes[0, 1].set_ylabel("Probability Density")
241
+ axes[0, 1].set_title("Velocity Distribution")
242
+ axes[0, 1].grid(True, alpha=0.3)
243
+
244
+ # Temperature histogram
245
+ axes[1, 0].hist(
246
+ self.temperature,
247
+ bins=20,
248
+ alpha=0.7,
249
+ color="green",
250
+ edgecolor="black",
251
+ density=True,
252
+ )
253
+ axes[1, 0].set_xlabel("Temperature (K)")
254
+ axes[1, 0].set_ylabel("Probability Density")
255
+ axes[1, 0].set_title("Temperature Distribution")
256
+ axes[1, 0].grid(True, alpha=0.3)
257
+
258
+ # Combined box plot
259
+ data_for_box = [
260
+ self.density / np.mean(self.density),
261
+ self.velocity / np.mean(self.velocity),
262
+ self.temperature / np.mean(self.temperature),
263
+ ]
264
+ box_plot = axes[1, 1].boxplot(
265
+ data_for_box, labels=["Density", "Velocity", "Temperature"]
266
+ )
267
+ axes[1, 1].set_ylabel("Normalized Value")
268
+ axes[1, 1].set_title("Parameter Distributions")
269
+ axes[1, 1].grid(True, alpha=0.3)
270
+
271
+ plt.tight_layout()
272
+
273
+ # Validation
274
+ for ax in axes.flat[:-1]: # All except box plot
275
+ assert len(ax.patches) > 0 # Histogram bars
276
+ assert len(axes[1, 1].lines) > 0 # Box plot lines
277
+
278
+
279
+ class TestPlotLayoutValidation:
280
+ """Test plot layout and formatting validation."""
281
+
282
+ def teardown_method(self):
283
+ """Clean up after each test."""
284
+ plt.close("all")
285
+
286
+ def test_subplot_layout_visual(self):
287
+ """Test subplot layout and spacing."""
288
+ fig = plt.figure(figsize=(12, 8))
289
+
290
+ # Create different subplot layouts
291
+ ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
292
+ ax2 = plt.subplot2grid((3, 3), (0, 2))
293
+ ax3 = plt.subplot2grid((3, 3), (1, 0))
294
+ ax4 = plt.subplot2grid((3, 3), (1, 1), colspan=2)
295
+ ax5 = plt.subplot2grid((3, 3), (2, 0), colspan=3)
296
+
297
+ # Add content to each subplot
298
+ x = np.linspace(0, 10, 100)
299
+
300
+ ax1.plot(x, np.sin(x), "b-")
301
+ ax1.set_title("Sin Wave")
302
+ ax1.grid(True, alpha=0.3)
303
+
304
+ ax2.plot(x, np.cos(x), "r-")
305
+ ax2.set_title("Cos Wave")
306
+ ax2.grid(True, alpha=0.3)
307
+
308
+ ax3.hist(np.random.randn(1000), bins=30, alpha=0.7)
309
+ ax3.set_title("Histogram")
310
+
311
+ ax4.scatter(np.random.randn(100), np.random.randn(100), alpha=0.7)
312
+ ax4.set_title("Scatter Plot")
313
+ ax4.grid(True, alpha=0.3)
314
+
315
+ ax5.plot(x, np.tan(x), "g-")
316
+ ax5.set_ylim(-5, 5)
317
+ ax5.set_title("Tan Wave")
318
+ ax5.set_xlabel("X values")
319
+ ax5.grid(True, alpha=0.3)
320
+
321
+ plt.tight_layout()
322
+
323
+ # Validation
324
+ assert len(fig.axes) == 5
325
+ for ax in fig.axes:
326
+ assert ax.get_title() != ""
327
+
328
+ def test_colorbar_layout_visual(self):
329
+ """Test colorbar layout and positioning."""
330
+ fig, axes = plt.subplots(2, 2, figsize=(10, 8))
331
+
332
+ x = np.linspace(0, 10, 50)
333
+ y = np.linspace(0, 10, 50)
334
+ X, Y = np.meshgrid(x, y)
335
+ Z = np.sin(X) * np.cos(Y)
336
+
337
+ # Different colorbar layouts
338
+ im1 = axes[0, 0].contourf(X, Y, Z, levels=20, cmap="viridis")
339
+ plt.colorbar(im1, ax=axes[0, 0], shrink=0.8)
340
+ axes[0, 0].set_title("Contour with Colorbar")
341
+
342
+ im2 = axes[0, 1].imshow(Z, extent=[0, 10, 0, 10], cmap="plasma")
343
+ plt.colorbar(im2, ax=axes[0, 1], orientation="horizontal", pad=0.1)
344
+ axes[0, 1].set_title("Image with Horizontal Colorbar")
345
+
346
+ im3 = axes[1, 0].pcolormesh(X, Y, Z, cmap="coolwarm")
347
+ plt.colorbar(im3, ax=axes[1, 0], fraction=0.046, pad=0.04)
348
+ axes[1, 0].set_title("Pcolormesh with Colorbar")
349
+
350
+ # Shared colorbar
351
+ im4 = axes[1, 1].contour(X, Y, Z, levels=10, cmap="jet")
352
+ axes[1, 1].set_title("Contour Lines")
353
+
354
+ plt.tight_layout()
355
+
356
+ # Validation - check that colorbars were created
357
+ # Note: This is a basic structural test
358
+ assert len(fig.axes) >= 4 # At least the 4 main axes
359
+
360
+
361
+ class TestErrorHandlingVisualValidation:
362
+ """Test error handling in visual validation framework."""
363
+
364
+ def teardown_method(self):
365
+ """Clean up after each test."""
366
+ plt.close("all")
367
+
368
+ def test_invalid_data_handling(self):
369
+ """Test handling of invalid data in plots."""
370
+ fig, ax = plt.subplots()
371
+
372
+ # Data with NaN values
373
+ x = np.linspace(0, 10, 100)
374
+ y = np.sin(x)
375
+ y[50:60] = np.nan # Insert NaN values
376
+
377
+ with warnings.catch_warnings():
378
+ warnings.simplefilter("ignore") # Suppress NaN warnings
379
+ ax.plot(x, y, "b-")
380
+
381
+ ax.set_xlabel("X")
382
+ ax.set_ylabel("Y")
383
+ ax.set_title("Plot with NaN Values")
384
+
385
+ # Should still create a valid plot
386
+ assert len(ax.lines) == 1
387
+
388
+ plt.close(fig)
389
+
390
+ def test_empty_data_handling(self):
391
+ """Test handling of empty data."""
392
+ fig, ax = plt.subplots()
393
+
394
+ # Empty arrays
395
+ x = np.array([])
396
+ y = np.array([])
397
+
398
+ ax.plot(x, y, "b-")
399
+ ax.set_xlabel("X")
400
+ ax.set_ylabel("Y")
401
+ ax.set_title("Empty Plot")
402
+
403
+ # Should create plot without error
404
+ assert len(ax.lines) == 1
405
+
406
+ plt.close(fig)
407
+
408
+
409
+ def test_visual_validation_framework_availability():
410
+ """Test that visual validation framework components are available."""
411
+ # Test matplotlib testing decorators
412
+ from matplotlib.testing.decorators import image_comparison
413
+
414
+ assert image_comparison is not None
415
+
416
+ # Test that we can create baseline directory path
417
+ import os
418
+
419
+ baseline_dir = os.path.join(os.path.dirname(__file__), "baseline_images")
420
+ # Directory doesn't need to exist yet, but path should be valid
421
+ assert isinstance(baseline_dir, str)
422
+
423
+
424
+ def test_reproducible_random_plots():
425
+ """Test that plots with random data are reproducible with seed."""
426
+ # First plot
427
+ np.random.seed(42)
428
+ fig1, ax1 = plt.subplots()
429
+ x1 = np.random.randn(100)
430
+ y1 = np.random.randn(100)
431
+ ax1.scatter(x1, y1)
432
+
433
+ # Second plot with same seed
434
+ np.random.seed(42)
435
+ fig2, ax2 = plt.subplots()
436
+ x2 = np.random.randn(100)
437
+ y2 = np.random.randn(100)
438
+ ax2.scatter(x2, y2)
439
+
440
+ # Data should be identical
441
+ np.testing.assert_array_equal(x1, x2)
442
+ np.testing.assert_array_equal(y1, y2)
443
+
444
+ plt.close(fig1)
445
+ plt.close(fig2)
446
+
447
+
448
+ # Example of how to implement actual image comparison test
449
+ # (Commented out as it requires baseline images)
450
+ """
451
+ @image_comparison(baseline_images=['example_plot'],
452
+ extensions=['png'],
453
+ tol=0.1)
454
+ def test_example_image_comparison():
455
+ '''Example of actual image comparison test.'''
456
+ fig, ax = plt.subplots()
457
+ x = np.linspace(0, 10, 100)
458
+ y = np.sin(x)
459
+ ax.plot(x, y, 'b-', linewidth=2)
460
+ ax.set_xlabel('X')
461
+ ax.set_ylabel('Y')
462
+ ax.set_title('Example Plot')
463
+ ax.grid(True)
464
+ return fig
465
+ """
@@ -0,0 +1 @@
1
+ """Tests for the solar_activity module."""
@@ -0,0 +1 @@
1
+ # Tests for LISIRD sub-package