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,366 @@
1
+ """Test suite for elemental abundance label functionality."""
2
+
3
+ import pytest
4
+ import warnings
5
+ from pathlib import Path
6
+ from unittest.mock import patch
7
+
8
+ from solarwindpy.plotting.labels.elemental_abundance import ElementalAbundance
9
+
10
+
11
+ class TestElementalAbundanceInitialization:
12
+ """Test ElementalAbundance class initialization."""
13
+
14
+ def test_basic_initialization(self):
15
+ """Test basic ElementalAbundance initialization."""
16
+ abundance = ElementalAbundance("He", "H")
17
+ assert abundance.species == "He"
18
+ assert abundance.reference_species == "H"
19
+ assert not abundance.pct_unit
20
+ assert abundance.photospheric
21
+
22
+ def test_initialization_with_options(self):
23
+ """Test initialization with all options."""
24
+ abundance = ElementalAbundance("Fe", "H", pct_unit=True, photospheric=False)
25
+ assert abundance.species == "Fe"
26
+ assert abundance.reference_species == "H"
27
+ assert abundance.pct_unit
28
+ assert not abundance.photospheric
29
+
30
+ def test_species_case_conversion(self):
31
+ """Test species names are converted to title case."""
32
+ abundance = ElementalAbundance("he", "h")
33
+ assert abundance.species == "He"
34
+ assert abundance.reference_species == "H"
35
+
36
+ def test_initialization_boolean_conversion(self):
37
+ """Test boolean parameters are properly converted."""
38
+ abundance = ElementalAbundance("C", "H", pct_unit="true", photospheric=0)
39
+ assert abundance.pct_unit is True
40
+ assert abundance.photospheric is False
41
+
42
+
43
+ class TestElementalAbundanceProperties:
44
+ """Test ElementalAbundance property access."""
45
+
46
+ def test_species_property(self):
47
+ """Test species property returns correct value."""
48
+ abundance = ElementalAbundance("Fe", "O")
49
+ assert abundance.species == "Fe"
50
+
51
+ def test_reference_species_property(self):
52
+ """Test reference_species property returns correct value."""
53
+ abundance = ElementalAbundance("Fe", "O")
54
+ assert abundance.reference_species == "O"
55
+
56
+ def test_photospheric_property(self):
57
+ """Test photospheric property returns correct value."""
58
+ abundance1 = ElementalAbundance("C", "H", photospheric=True)
59
+ abundance2 = ElementalAbundance("C", "H", photospheric=False)
60
+ assert abundance1.photospheric is True
61
+ assert abundance2.photospheric is False
62
+
63
+ def test_pct_unit_property(self):
64
+ """Test pct_unit property returns correct value."""
65
+ abundance1 = ElementalAbundance("C", "H", pct_unit=True)
66
+ abundance2 = ElementalAbundance("C", "H", pct_unit=False)
67
+ assert abundance1.pct_unit is True
68
+ assert abundance2.pct_unit is False
69
+
70
+
71
+ class TestElementalAbundanceUnits:
72
+ """Test ElementalAbundance units property."""
73
+
74
+ def test_units_dimensionless(self):
75
+ """Test units property with dimensionless numbers."""
76
+ abundance = ElementalAbundance("He", "H", pct_unit=False)
77
+ assert abundance.units == r"\#"
78
+
79
+ def test_units_percentage(self):
80
+ """Test units property with percentage."""
81
+ abundance = ElementalAbundance("He", "H", pct_unit=True)
82
+ assert abundance.units == r"\%"
83
+
84
+
85
+ class TestElementalAbundanceTeX:
86
+ """Test ElementalAbundance TeX formatting."""
87
+
88
+ def test_tex_basic_ratio(self):
89
+ """Test basic ratio TeX formatting."""
90
+ abundance = ElementalAbundance("He", "H", photospheric=False)
91
+ tex = abundance.tex
92
+ assert r"\mathrm{He}" in tex
93
+ assert r"\mathrm{H}" in tex
94
+ assert "/" in tex
95
+
96
+ def test_tex_photospheric_ratio(self):
97
+ """Test photospheric ratio TeX formatting."""
98
+ abundance = ElementalAbundance("He", "H", photospheric=True)
99
+ tex = abundance.tex
100
+ assert r"\mathrm{He}" in tex
101
+ assert r"\mathrm{H}" in tex
102
+ assert r"\mathrm{photo}" in tex
103
+ assert ":" in tex
104
+
105
+ def test_tex_with_known_species(self):
106
+ """Test TeX formatting with known species translations."""
107
+ abundance = ElementalAbundance("He", "H")
108
+ tex = abundance.tex
109
+ # Should translate to LaTeX representations
110
+ assert "He" in tex
111
+ assert "H" in tex
112
+
113
+ def test_tex_with_unknown_species(self):
114
+ """Test TeX formatting with unknown species."""
115
+ with warnings.catch_warnings():
116
+ warnings.simplefilter("ignore")
117
+ abundance = ElementalAbundance("Xx", "Yy")
118
+ tex = abundance.tex
119
+ # Should use species names directly when not in translation dict
120
+ assert "Xx" in tex or "Yy" in tex
121
+
122
+
123
+ class TestElementalAbundancePath:
124
+ """Test ElementalAbundance path generation."""
125
+
126
+ def test_path_basic_ratio(self):
127
+ """Test path generation for basic ratio."""
128
+ abundance = ElementalAbundance("He", "H", photospheric=False)
129
+ path = abundance.path
130
+ assert isinstance(path, Path)
131
+ assert "He-OV-H" in str(path)
132
+
133
+ def test_path_photospheric_ratio(self):
134
+ """Test path generation for photospheric ratio."""
135
+ abundance = ElementalAbundance("He", "H", photospheric=True)
136
+ path = abundance.path
137
+ assert isinstance(path, Path)
138
+ assert "He-OV-H" in str(path)
139
+ assert "photospheric-ratio" in str(path)
140
+
141
+ def test_path_special_characters(self):
142
+ """Test path generation handles special characters."""
143
+ with warnings.catch_warnings():
144
+ warnings.simplefilter("ignore")
145
+ abundance = ElementalAbundance("C/N", "H", photospheric=False)
146
+ path = abundance.path
147
+ # Path should contain separator
148
+ assert "C/N-OV-H" in str(path)
149
+
150
+
151
+ class TestElementalAbundanceSetMethods:
152
+ """Test ElementalAbundance setter methods."""
153
+
154
+ def test_set_species_basic(self):
155
+ """Test set_species method with valid species."""
156
+ abundance = ElementalAbundance("He", "H")
157
+ abundance.set_species("Fe", "O")
158
+ assert abundance.species == "Fe"
159
+ assert abundance.reference_species == "O"
160
+
161
+ def test_set_species_case_conversion(self):
162
+ """Test set_species converts to title case."""
163
+ abundance = ElementalAbundance("He", "H")
164
+ abundance.set_species("fe", "o")
165
+ assert abundance.species == "Fe"
166
+ assert abundance.reference_species == "O"
167
+
168
+ def test_set_species_unknown_warning(self):
169
+ """Test set_species warns for unknown species."""
170
+ abundance = ElementalAbundance("He", "H")
171
+ with patch("logging.getLogger") as mock_logger:
172
+ mock_log = mock_logger.return_value
173
+ abundance.set_species("Unknown", "H")
174
+ mock_log.warning.assert_called()
175
+
176
+ def test_set_species_unknown_reference_warning(self):
177
+ """Test set_species warns for unknown reference species."""
178
+ abundance = ElementalAbundance("He", "H")
179
+ with patch("logging.getLogger") as mock_logger:
180
+ mock_log = mock_logger.return_value
181
+ abundance.set_species("He", "Unknown")
182
+ mock_log.warning.assert_called()
183
+
184
+
185
+ class TestElementalAbundanceInheritance:
186
+ """Test ElementalAbundance inheritance from Base."""
187
+
188
+ def test_inheritance_from_base(self):
189
+ """Test ElementalAbundance inherits from Base."""
190
+ from solarwindpy.plotting.labels.base import Base
191
+
192
+ abundance = ElementalAbundance("He", "H")
193
+ assert isinstance(abundance, Base)
194
+
195
+ def test_string_representation(self):
196
+ """Test string representation uses with_units property."""
197
+ abundance = ElementalAbundance("He", "H")
198
+ str_repr = str(abundance)
199
+ assert "$" in str_repr # LaTeX formatting
200
+ assert r"\left[" in str_repr # Units formatting
201
+
202
+ def test_comparison_operators(self):
203
+ """Test comparison operators work correctly."""
204
+ abundance1 = ElementalAbundance("He", "H")
205
+ abundance2 = ElementalAbundance("He", "H")
206
+ abundance3 = ElementalAbundance("Fe", "H")
207
+
208
+ assert abundance1 == abundance2
209
+ assert abundance1 != abundance3
210
+
211
+ def test_hash_functionality(self):
212
+ """Test ElementalAbundance objects are hashable."""
213
+ abundance = ElementalAbundance("He", "H")
214
+ hash_value = hash(abundance)
215
+ assert isinstance(hash_value, int)
216
+
217
+
218
+ class TestElementalAbundanceKnownSpecies:
219
+ """Test known species functionality."""
220
+
221
+ def test_known_species_import(self):
222
+ """Test known_species is properly imported."""
223
+ from solarwindpy.plotting.labels.elemental_abundance import known_species
224
+
225
+ assert isinstance(known_species, tuple)
226
+ assert "H" in known_species
227
+ assert "He" in known_species
228
+ assert "X" in known_species # Special case
229
+
230
+ def test_known_species_validation(self):
231
+ """Test validation against known species."""
232
+ # Should not warn for known species
233
+ with warnings.catch_warnings(record=True) as w:
234
+ warnings.simplefilter("always")
235
+ ElementalAbundance("He", "H")
236
+ # Filter out unrelated warnings
237
+ relevant_warnings = [
238
+ warning for warning in w if "not recognized" in str(warning.message)
239
+ ]
240
+ assert len(relevant_warnings) == 0
241
+
242
+ def test_unknown_species_validation(self):
243
+ """Test validation warns for unknown species."""
244
+ import logging
245
+
246
+ with patch("logging.getLogger") as mock_logger:
247
+ mock_log = mock_logger.return_value
248
+ ElementalAbundance("Unknown", "H")
249
+ # Should have warning for unknown species
250
+ mock_log.warning.assert_called()
251
+
252
+
253
+ class TestElementalAbundanceIntegration:
254
+ """Test ElementalAbundance integration scenarios."""
255
+
256
+ def test_common_abundance_ratios(self):
257
+ """Test common abundance ratios used in solar wind."""
258
+ # He/H ratio
259
+ he_h = ElementalAbundance("He", "H")
260
+ assert "He" in he_h.tex
261
+ assert "H" in he_h.tex
262
+
263
+ # Fe/O ratio
264
+ fe_o = ElementalAbundance("Fe", "O")
265
+ assert "Fe" in fe_o.tex
266
+ assert "O" in fe_o.tex
267
+
268
+ def test_photospheric_vs_solar_wind(self):
269
+ """Test photospheric vs solar wind abundance comparison."""
270
+ photospheric = ElementalAbundance("He", "H", photospheric=True)
271
+ solar_wind = ElementalAbundance("He", "H", photospheric=False)
272
+
273
+ assert r"\mathrm{photo}" in photospheric.tex
274
+ assert r"\mathrm{photo}" not in solar_wind.tex
275
+ assert "photospheric-ratio" in str(photospheric.path)
276
+ assert "photospheric-ratio" not in str(solar_wind.path)
277
+
278
+ def test_percentage_vs_ratio_units(self):
279
+ """Test percentage vs ratio unit formatting."""
280
+ percentage = ElementalAbundance("He", "H", pct_unit=True)
281
+ ratio = ElementalAbundance("He", "H", pct_unit=False)
282
+
283
+ assert percentage.units == r"\%"
284
+ assert ratio.units == r"\#"
285
+
286
+ def test_multiple_abundance_uniqueness(self):
287
+ """Test multiple abundance objects maintain uniqueness."""
288
+ he_h = ElementalAbundance("He", "H")
289
+ fe_h = ElementalAbundance("Fe", "H")
290
+ c_o = ElementalAbundance("C", "O")
291
+
292
+ # All should have different paths
293
+ paths = [str(ab.path) for ab in [he_h, fe_h, c_o]]
294
+ assert len(set(paths)) == 3
295
+
296
+ # All should have different tex representations
297
+ tex_reprs = [ab.tex for ab in [he_h, fe_h, c_o]]
298
+ assert len(set(tex_reprs)) == 3
299
+
300
+ def test_scientific_accuracy(self):
301
+ """Test scientific accuracy of abundance representations."""
302
+ # Standard solar wind abundance ratio
303
+ he_h = ElementalAbundance("He", "H", photospheric=True)
304
+
305
+ # Should show ratio format for abundance comparison
306
+ assert ":" in he_h.tex # Comparison format
307
+ assert "/" in he_h.tex # Ratio format
308
+
309
+ # Units should be dimensionless for abundance ratios
310
+ ratio_abundance = ElementalAbundance("He", "H", pct_unit=False)
311
+ assert ratio_abundance.units == r"\#"
312
+
313
+
314
+ class TestElementalAbundanceEdgeCases:
315
+ """Test ElementalAbundance edge cases and error handling."""
316
+
317
+ def test_same_species_ratio(self):
318
+ """Test abundance ratio of same species."""
319
+ with warnings.catch_warnings():
320
+ warnings.simplefilter("ignore")
321
+ abundance = ElementalAbundance("H", "H")
322
+
323
+ assert abundance.species == "H"
324
+ assert abundance.reference_species == "H"
325
+ # Should still generate valid TeX
326
+ assert r"\mathrm{H}" in abundance.tex
327
+
328
+ def test_empty_string_species(self):
329
+ """Test handling of empty string species."""
330
+ with warnings.catch_warnings():
331
+ warnings.simplefilter("ignore")
332
+ abundance = ElementalAbundance("", "H")
333
+
334
+ assert abundance.species == ""
335
+ assert abundance.reference_species == "H"
336
+
337
+ def test_numeric_species_names(self):
338
+ """Test handling of numeric species names."""
339
+ with warnings.catch_warnings():
340
+ warnings.simplefilter("ignore")
341
+ abundance = ElementalAbundance("3He", "4He")
342
+
343
+ assert abundance.species == "3He"
344
+ assert abundance.reference_species == "4He"
345
+ # Should handle isotope notation (3He becomes ^{3}\mathrm{He})
346
+ tex = abundance.tex
347
+ assert "He" in tex # Base element should be present
348
+ assert "3" in tex # Mass number should be present
349
+ assert "4" in tex # Mass number should be present
350
+
351
+
352
+ def test_module_all_attribute():
353
+ """Test module __all__ attribute is correctly defined."""
354
+ from solarwindpy.plotting.labels import elemental_abundance
355
+
356
+ assert hasattr(elemental_abundance, "__all__")
357
+ assert "ElementalAbundance" in elemental_abundance.__all__
358
+
359
+
360
+ def test_module_imports():
361
+ """Test module can be imported correctly."""
362
+ from solarwindpy.plotting.labels.elemental_abundance import ElementalAbundance
363
+ from solarwindpy.plotting.labels.elemental_abundance import known_species
364
+
365
+ assert ElementalAbundance is not None
366
+ assert known_species is not None
@@ -0,0 +1,66 @@
1
+ import importlib.util
2
+ import sys
3
+ import types
4
+ from pathlib import Path
5
+
6
+
7
+ def _load_labels_module():
8
+ """Load the labels module without importing the full package."""
9
+ pkg_root = (
10
+ Path(__file__).resolve().parents[3] / "solarwindpy" / "plotting" / "labels"
11
+ )
12
+ root_pkg = types.ModuleType("swlabels")
13
+ root_pkg.__path__ = [str(pkg_root)]
14
+ sys.modules["swlabels"] = root_pkg
15
+
16
+ for name in (
17
+ "base",
18
+ "composition",
19
+ "chemistry",
20
+ "datetime",
21
+ "elemental_abundance",
22
+ "special",
23
+ ):
24
+ spec = importlib.util.spec_from_file_location(
25
+ f"swlabels.{name}", pkg_root / f"{name}.py"
26
+ )
27
+ module = importlib.util.module_from_spec(spec)
28
+ module.__package__ = "swlabels"
29
+ sys.modules[f"swlabels.{name}"] = module
30
+ spec.loader.exec_module(module)
31
+
32
+ spec = importlib.util.spec_from_file_location("swlabels", pkg_root / "__init__.py")
33
+ labels = importlib.util.module_from_spec(spec)
34
+ labels.__package__ = "swlabels"
35
+ sys.modules["swlabels"] = labels
36
+ spec.loader.exec_module(labels)
37
+ return labels
38
+
39
+
40
+ def test_clean_str_list_for_printing():
41
+ """Test grouping produced by ``_clean_str_list_for_printing``."""
42
+ labels = _load_labels_module()
43
+ data = ["beta", "alpha", "gamma", "Charlie"]
44
+ result = labels._clean_str_list_for_printing(data)
45
+ assert result.splitlines() == ["Charlie", "alpha", "beta", "gamma"]
46
+
47
+
48
+ def test_available_labels_output(capsys):
49
+ """Check that ``available_labels`` prints all major sections.
50
+
51
+ Parameters
52
+ ----------
53
+ capsys : pytest.CaptureFixture
54
+ Pytest fixture used to capture standard output.
55
+ """
56
+ labels = _load_labels_module()
57
+ labels.available_labels()
58
+ captured = capsys.readouterr().out
59
+ for section in (
60
+ "TeXlabel knows",
61
+ "Measurements",
62
+ "Components",
63
+ "Species",
64
+ "Special",
65
+ ):
66
+ assert section in captured