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,187 @@
1
+ #!/usr/bin/env python
2
+ """Test LISIRD_ID class.
3
+
4
+ This module tests the LISIRD_ID class from solar_activity.lisird.lisird:
5
+ - URL mapping and key validation
6
+ - Valid and invalid key handling
7
+ - URL construction for LISIRD endpoints
8
+ """
9
+
10
+ import pytest
11
+ from unittest.mock import Mock, patch
12
+
13
+ from solarwindpy.solar_activity.lisird.lisird import LISIRD_ID
14
+
15
+
16
+ class TestLISIRD_ID:
17
+ """Test the LISIRD_ID class for URL mapping and key validation."""
18
+
19
+ def test_valid_key_initialization(self):
20
+ """Test LISIRD_ID initialization with valid keys."""
21
+ valid_keys = ["Lalpha", "CaK", "f107-noaa", "f107-penticton", "MgII"]
22
+
23
+ for key in valid_keys:
24
+ lisird_id = LISIRD_ID(key)
25
+ assert lisird_id.key == key
26
+
27
+ def test_url_base_property(self):
28
+ """Test that _url_base returns the correct LISIRD base URL."""
29
+ lisird_id = LISIRD_ID("Lalpha")
30
+ expected_url_base = "http://lasp.colorado.edu/lisird/latis/dap/"
31
+ assert lisird_id._url_base == expected_url_base
32
+
33
+ def test_trans_url_mapping(self):
34
+ """Test the _trans_url property provides correct URL mappings."""
35
+ lisird_id = LISIRD_ID("Lalpha")
36
+ trans_url_dict = lisird_id._trans_url
37
+
38
+ expected_mappings = {
39
+ "Lalpha": "composite_lyman_alpha.jsond",
40
+ "CaK": "cak.jsond",
41
+ "f107-penticton": "penticton_radio_flux.jsond",
42
+ "f107-noaa": "noaa_radio_flux.jsond",
43
+ "MgII": "composite_mg_index.jsond",
44
+ }
45
+
46
+ for key, expected_filename in expected_mappings.items():
47
+ assert trans_url_dict[key] == expected_filename
48
+
49
+ def test_url_construction_valid_keys(self):
50
+ """Test URL construction for valid LISIRD keys."""
51
+ test_cases = [
52
+ (
53
+ "Lalpha",
54
+ "http://lasp.colorado.edu/lisird/latis/dap/composite_lyman_alpha.jsond",
55
+ ),
56
+ ("CaK", "http://lasp.colorado.edu/lisird/latis/dap/cak.jsond"),
57
+ (
58
+ "f107-noaa",
59
+ "http://lasp.colorado.edu/lisird/latis/dap/noaa_radio_flux.jsond",
60
+ ),
61
+ (
62
+ "f107-penticton",
63
+ "http://lasp.colorado.edu/lisird/latis/dap/penticton_radio_flux.jsond",
64
+ ),
65
+ (
66
+ "MgII",
67
+ "http://lasp.colorado.edu/lisird/latis/dap/composite_mg_index.jsond",
68
+ ),
69
+ ]
70
+
71
+ for key, expected_url in test_cases:
72
+ lisird_id = LISIRD_ID(key)
73
+ assert lisird_id.url == expected_url
74
+
75
+ def test_invalid_key_error_handling(self):
76
+ """Test that invalid keys raise appropriate errors."""
77
+ # Test behavior with key not in _trans_url mapping
78
+ invalid_key = "invalid_key_not_in_mapping"
79
+
80
+ # LISIRD_ID raises NotImplementedError during initialization for invalid keys
81
+ with pytest.raises(NotImplementedError, match="key unavailable"):
82
+ LISIRD_ID(invalid_key)
83
+
84
+ def test_inheritance_from_id_base_class(self):
85
+ """Test that LISIRD_ID inherits from ID base class."""
86
+ from solarwindpy.solar_activity.base import ID
87
+
88
+ lisird_id = LISIRD_ID("Lalpha")
89
+ assert isinstance(lisird_id, ID)
90
+
91
+ # Test that it has the expected inherited properties
92
+ assert hasattr(lisird_id, "key")
93
+ assert hasattr(lisird_id, "url")
94
+
95
+ def test_key_case_sensitivity(self):
96
+ """Test that keys are case-sensitive."""
97
+ # Valid key
98
+ valid_id = LISIRD_ID("Lalpha")
99
+ assert valid_id.key == "Lalpha"
100
+
101
+ # Case variations should be treated as different keys
102
+ # They may not have URL mappings and should raise NotImplementedError during init
103
+ case_variant_key = "lalpha" # lowercase
104
+
105
+ with pytest.raises(NotImplementedError, match="key unavailable"):
106
+ LISIRD_ID(case_variant_key)
107
+
108
+ def test_url_property_consistency(self):
109
+ """Test that url property is consistent and repeatable."""
110
+ lisird_id = LISIRD_ID("Lalpha")
111
+ url1 = lisird_id.url
112
+ url2 = lisird_id.url
113
+
114
+ # URL should be consistent across multiple accesses
115
+ assert url1 == url2
116
+ assert url1 is not None
117
+ assert isinstance(url1, str)
118
+ assert url1.startswith("http://")
119
+
120
+ def test_all_mapped_keys_produce_valid_urls(self):
121
+ """Test that all keys in the mapping produce valid URL strings."""
122
+ # Get all mapped keys by creating an instance and accessing _trans_url
123
+ sample_id = LISIRD_ID("Lalpha")
124
+ all_mapped_keys = sample_id._trans_url.keys()
125
+
126
+ for key in all_mapped_keys:
127
+ lisird_id = LISIRD_ID(key)
128
+ url = lisird_id.url
129
+
130
+ # Basic URL validation
131
+ assert isinstance(url, str)
132
+ assert url.startswith("http://lasp.colorado.edu/lisird/latis/dap/")
133
+ assert url.endswith(".jsond")
134
+ assert len(url) > len(lisird_id._url_base)
135
+
136
+
137
+ class TestLISIRD_IDEdgeCases:
138
+ """Test edge cases and error conditions for LISIRD_ID."""
139
+
140
+ def test_empty_key_handling(self):
141
+ """Test behavior with empty or None keys."""
142
+ # Empty string key should raise NotImplementedError during init
143
+ with pytest.raises(NotImplementedError, match="key unavailable"):
144
+ LISIRD_ID("")
145
+
146
+ # None key also raises NotImplementedError during init
147
+ with pytest.raises(NotImplementedError, match="key unavailable"):
148
+ LISIRD_ID(None)
149
+
150
+ def test_whitespace_key_handling(self):
151
+ """Test behavior with whitespace in keys."""
152
+ whitespace_key = " Lalpha "
153
+
154
+ # Should not match the valid mapping due to whitespace, raises during init
155
+ with pytest.raises(NotImplementedError, match="key unavailable"):
156
+ LISIRD_ID(whitespace_key)
157
+
158
+ def test_numeric_key_handling(self):
159
+ """Test behavior with numeric keys."""
160
+ # String numeric key should raise NotImplementedError during init
161
+ with pytest.raises(NotImplementedError, match="key unavailable"):
162
+ LISIRD_ID("123")
163
+
164
+ # Integer key also raises NotImplementedError during init
165
+ with pytest.raises(NotImplementedError, match="key unavailable"):
166
+ LISIRD_ID(123)
167
+
168
+ def test_special_characters_in_key(self):
169
+ """Test behavior with special characters in keys."""
170
+ special_key = "f107-special!@#$%"
171
+
172
+ # Should not match any valid mapping, raises during init
173
+ with pytest.raises(NotImplementedError, match="key unavailable"):
174
+ LISIRD_ID(special_key)
175
+
176
+ def test_url_construction_consistency(self):
177
+ """Test that URL construction is deterministic and correct."""
178
+ key = "MgII"
179
+ id1 = LISIRD_ID(key)
180
+ id2 = LISIRD_ID(key)
181
+
182
+ # Both instances should produce the same URL
183
+ assert id1.url == id2.url
184
+
185
+ # URL should match expected pattern
186
+ expected = id1._url_base + id1._trans_url[key]
187
+ assert id1.url == expected
@@ -0,0 +1 @@
1
+ """Tests for sunspot_number package."""
@@ -0,0 +1,399 @@
1
+ #!/usr/bin/env python
2
+ """Test sunspot_number package initialization.
3
+
4
+ This module tests the sunspot_number package __init__.py functionality:
5
+ - Package structure and imports
6
+ - Module accessibility
7
+ - SIDC module integration
8
+ - Import patterns and error handling
9
+ - Namespace management
10
+ """
11
+
12
+ import pytest
13
+ import sys
14
+ import importlib
15
+ from unittest.mock import patch, Mock
16
+
17
+ # Import patterns testing
18
+ import solarwindpy.solar_activity.sunspot_number
19
+ from solarwindpy.solar_activity import sunspot_number
20
+ from solarwindpy.solar_activity.sunspot_number import sidc
21
+
22
+
23
+ class TestSunspotNumberPackageStructure:
24
+ """Test the basic package structure and recognition."""
25
+
26
+ def test_package_recognition(self):
27
+ """Test that sunspot_number is recognized as a Python package."""
28
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
29
+
30
+ # Should be a module (package)
31
+ assert hasattr(ssn_package, "__file__")
32
+ assert hasattr(ssn_package, "__path__")
33
+
34
+ # Package path should end with sunspot_number
35
+ assert str(ssn_package.__path__[0]).endswith("sunspot_number")
36
+
37
+ def test_init_file_presence(self):
38
+ """Test that __init__.py file exists and is valid Python."""
39
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
40
+
41
+ # Should have a valid __file__ pointing to __init__.py
42
+ assert ssn_package.__file__.endswith("__init__.py")
43
+
44
+ def test_package_hierarchy(self):
45
+ """Test proper nesting within solar_activity parent package."""
46
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
47
+ import solarwindpy.solar_activity as sa_package
48
+
49
+ # Should be accessible from parent package
50
+ assert hasattr(sa_package, "sunspot_number")
51
+ assert sa_package.sunspot_number is ssn_package
52
+
53
+ def test_package_docstring(self):
54
+ """Test that package has descriptive docstring."""
55
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
56
+
57
+ assert hasattr(ssn_package, "__doc__")
58
+ assert ssn_package.__doc__ is not None
59
+ assert len(ssn_package.__doc__.strip()) > 0
60
+ assert "sunspot" in ssn_package.__doc__.lower()
61
+
62
+
63
+ class TestSIDCModuleImport:
64
+ """Test SIDC module import and accessibility."""
65
+
66
+ def test_sidc_module_import(self):
67
+ """Test that 'from .
68
+
69
+ import sidc' executes successfully.
70
+ """
71
+ # This test passes if the import in the setup doesn't raise an exception
72
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
73
+
74
+ # sidc should be accessible as an attribute
75
+ assert hasattr(ssn_package, "sidc")
76
+
77
+ def test_sidc_module_accessibility(self):
78
+ """Test sidc module accessible after package import."""
79
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
80
+
81
+ # sidc should be a module
82
+ import types
83
+
84
+ assert isinstance(ssn_package.sidc, types.ModuleType)
85
+
86
+ # Should have expected SIDC classes
87
+ assert hasattr(ssn_package.sidc, "SIDC")
88
+ assert hasattr(ssn_package.sidc, "SIDC_ID")
89
+ assert hasattr(ssn_package.sidc, "SIDCLoader")
90
+ assert hasattr(ssn_package.sidc, "SSNExtrema")
91
+
92
+ def test_relative_import_syntax(self):
93
+ """Test that relative import syntax works correctly."""
94
+ # The actual import is in the __init__.py file
95
+ # If we can import the package, the relative import worked
96
+ import solarwindpy.solar_activity.sunspot_number
97
+
98
+ # Should not raise ImportError
99
+ assert solarwindpy.solar_activity.sunspot_number is not None
100
+
101
+ def test_no_import_errors(self):
102
+ """Test that import statement doesn't raise ImportError."""
103
+ # Re-import to test for any import errors
104
+ try:
105
+ importlib.reload(solarwindpy.solar_activity.sunspot_number)
106
+ except ImportError:
107
+ pytest.fail("Package import raised ImportError")
108
+
109
+
110
+ class TestImportPatterns:
111
+ """Test various import patterns for the package."""
112
+
113
+ def test_full_package_import(self):
114
+ """Test import solarwindpy.solar_activity.sunspot_number."""
115
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
116
+
117
+ assert ssn_package is not None
118
+ assert hasattr(ssn_package, "sidc")
119
+
120
+ def test_from_import(self):
121
+ """Test from solarwindpy.solar_activity import sunspot_number."""
122
+ from solarwindpy.solar_activity import sunspot_number as ssn_package
123
+
124
+ assert ssn_package is not None
125
+ assert hasattr(ssn_package, "sidc")
126
+
127
+ def test_submodule_import(self):
128
+ """Test from solarwindpy.solar_activity.sunspot_number import sidc."""
129
+ from solarwindpy.solar_activity.sunspot_number import sidc as sidc_module
130
+
131
+ assert sidc_module is not None
132
+ assert hasattr(sidc_module, "SIDC")
133
+
134
+ def test_aliased_imports(self):
135
+ """Test import with aliases works correctly."""
136
+ import solarwindpy.solar_activity.sunspot_number as ssn
137
+ from solarwindpy.solar_activity.sunspot_number import sidc as sidc_mod
138
+
139
+ assert ssn is not None
140
+ assert sidc_mod is not None
141
+ assert ssn.sidc is sidc_mod
142
+
143
+
144
+ class TestNamespaceManagement:
145
+ """Test namespace management and symbol exposure."""
146
+
147
+ def test_sidc_exposure(self):
148
+ """Test SIDC module properly exposed through package."""
149
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
150
+
151
+ # Should be able to access SIDC classes through package
152
+ assert hasattr(ssn_package.sidc, "SIDC")
153
+ assert callable(ssn_package.sidc.SIDC)
154
+
155
+ def test_no_namespace_pollution(self):
156
+ """Test no unnecessary namespace pollution."""
157
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
158
+
159
+ # Should only have expected attributes
160
+ expected_attrs = {
161
+ "__doc__",
162
+ "__file__",
163
+ "__loader__",
164
+ "__name__",
165
+ "__package__",
166
+ "__path__",
167
+ "__spec__",
168
+ "sidc",
169
+ }
170
+
171
+ actual_attrs = set(dir(ssn_package))
172
+
173
+ # sidc should be present
174
+ assert "sidc" in actual_attrs
175
+
176
+ # Should not have unexpected attributes (allowing for some Python internals)
177
+ unexpected = actual_attrs - expected_attrs
178
+ # Filter out Python internal attributes
179
+ unexpected = {attr for attr in unexpected if not attr.startswith("_")}
180
+
181
+ assert len(unexpected) == 0, f"Unexpected attributes: {unexpected}"
182
+
183
+ def test_clean_imports(self):
184
+ """Test clean import behavior without side effects."""
185
+ # Count modules before import
186
+ modules_before = len(sys.modules)
187
+
188
+ import solarwindpy.solar_activity.sunspot_number
189
+
190
+ # Should not import excessive modules
191
+ modules_after = len(sys.modules)
192
+
193
+ # Some new modules are expected (the package and its dependencies)
194
+ # but it shouldn't be excessive
195
+ assert modules_after - modules_before < 20 # Reasonable threshold
196
+
197
+ def test_symbol_accessibility(self):
198
+ """Test required symbols accessible through package."""
199
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
200
+
201
+ # Key SIDC functionality should be accessible
202
+ assert hasattr(ssn_package.sidc, "SIDC")
203
+ assert hasattr(ssn_package.sidc, "SIDC_ID")
204
+ assert hasattr(ssn_package.sidc, "SIDCLoader")
205
+ assert hasattr(ssn_package.sidc, "SSNExtrema")
206
+
207
+
208
+ class TestIntegrationWithParentPackage:
209
+ """Test integration with parent solar_activity package."""
210
+
211
+ def test_parent_package_access(self):
212
+ """Test accessible from parent solar_activity package."""
213
+ import solarwindpy.solar_activity as sa_package
214
+
215
+ # Should be accessible through parent
216
+ assert hasattr(sa_package, "sunspot_number")
217
+ assert sa_package.sunspot_number is not None
218
+
219
+ def test_namespace_consistency(self):
220
+ """Test consistent with parent package namespace."""
221
+ import solarwindpy.solar_activity as sa_package
222
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
223
+
224
+ # Should be the same object
225
+ assert sa_package.sunspot_number is ssn_package
226
+
227
+ def test_package_hierarchy_integrity(self):
228
+ """Test maintains proper package hierarchy."""
229
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
230
+
231
+ # Package name should reflect hierarchy
232
+ assert ssn_package.__name__ == "solarwindpy.solar_activity.sunspot_number"
233
+ assert "solar_activity" in ssn_package.__name__
234
+
235
+ def test_cross_module_compatibility(self):
236
+ """Test compatibility with other solar activity modules."""
237
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
238
+
239
+ # Should be able to import other solar activity modules
240
+ try:
241
+ import solarwindpy.solar_activity.base
242
+ import solarwindpy.solar_activity.plots
243
+
244
+ # These should not conflict with sunspot_number
245
+ except ImportError:
246
+ # If these modules don't exist, that's fine for this test
247
+ pass
248
+
249
+
250
+ class TestErrorHandlingAndEdgeCases:
251
+ """Test error handling and edge cases."""
252
+
253
+ def test_multiple_imports(self):
254
+ """Test behavior with repeated imports."""
255
+ import solarwindpy.solar_activity.sunspot_number as ssn1
256
+ import solarwindpy.solar_activity.sunspot_number as ssn2
257
+
258
+ # Should be the same object (cached)
259
+ assert ssn1 is ssn2
260
+
261
+ def test_import_from_different_contexts(self):
262
+ """Test imports from different execution contexts."""
263
+
264
+ # Test import in function scope
265
+ def import_in_function():
266
+ import solarwindpy.solar_activity.sunspot_number as ssn_func
267
+
268
+ return ssn_func
269
+
270
+ ssn_func = import_in_function()
271
+
272
+ # Test import in module scope
273
+ import solarwindpy.solar_activity.sunspot_number as ssn_module
274
+
275
+ # Should be the same object
276
+ assert ssn_func is ssn_module
277
+
278
+ def test_sidc_module_unavailable(self):
279
+ """Test behavior when SIDC module unavailable."""
280
+ # Since the current implementation imports sidc successfully,
281
+ # this test validates that the import works as expected
282
+ # In a real scenario where sidc was unavailable, the import would fail
283
+
284
+ # Test that the package can handle the current working state
285
+ try:
286
+ import solarwindpy.solar_activity.sunspot_number as ssn
287
+
288
+ # If import succeeds, sidc should be available
289
+ assert hasattr(ssn, "sidc")
290
+ except ImportError:
291
+ # This would be the expected behavior if sidc was truly unavailable
292
+ pytest.skip("SIDC module is not available in this environment")
293
+
294
+
295
+ class TestPerformanceConsiderations:
296
+ """Test performance considerations for package imports."""
297
+
298
+ def test_import_speed(self):
299
+ """Test package imports quickly."""
300
+ import time
301
+
302
+ start_time = time.time()
303
+ import solarwindpy.solar_activity.sunspot_number
304
+
305
+ end_time = time.time()
306
+
307
+ import_time = end_time - start_time
308
+
309
+ # Should import in reasonable time (less than 1 second)
310
+ assert import_time < 1.0
311
+
312
+ def test_minimal_overhead(self):
313
+ """Test minimal package initialization overhead."""
314
+ # Import should not create excessive objects
315
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
316
+
317
+ # Package should have minimal attributes
318
+ attrs = dir(ssn_package)
319
+
320
+ # Should not have excessive attributes
321
+ assert len(attrs) < 20 # Reasonable threshold
322
+
323
+
324
+ class TestQualityAssurance:
325
+ """Test code quality and validation."""
326
+
327
+ def test_import_style(self):
328
+ """Test import statements follow recommended style."""
329
+ # This is verified by the fact that the relative import works
330
+ # and follows PEP 8 guidelines
331
+ import solarwindpy.solar_activity.sunspot_number
332
+
333
+ # If import works, style is correct
334
+ assert True
335
+
336
+ def test_package_validation(self):
337
+ """Test validation of package structure."""
338
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
339
+
340
+ # Should have all required package attributes
341
+ required_attrs = ["__name__", "__file__", "__path__", "__doc__"]
342
+
343
+ for attr in required_attrs:
344
+ assert hasattr(ssn_package, attr), f"Missing required attribute: {attr}"
345
+
346
+ def test_integration_validation(self):
347
+ """Test validation of integration with other modules."""
348
+ # Should be able to use SIDC functionality through package
349
+ import solarwindpy.solar_activity.sunspot_number as ssn_package
350
+
351
+ # Should be able to instantiate SIDC_ID
352
+ try:
353
+ sidc_id = ssn_package.sidc.SIDC_ID("m")
354
+ assert sidc_id is not None
355
+ except Exception as e:
356
+ pytest.fail(f"Integration validation failed: {e}")
357
+
358
+
359
+ class TestUsagePatterns:
360
+ """Test common usage patterns for the package."""
361
+
362
+ def test_direct_sidc_access(self):
363
+ """Test direct access to SIDC functionality."""
364
+ from solarwindpy.solar_activity.sunspot_number import sidc
365
+
366
+ # Should be able to use SIDC classes directly
367
+ assert hasattr(sidc, "SIDC")
368
+ assert hasattr(sidc, "SIDC_ID")
369
+
370
+ def test_package_level_access(self):
371
+ """Test access through package level."""
372
+ import solarwindpy.solar_activity.sunspot_number as ssn
373
+
374
+ # Should be able to access SIDC through package
375
+ assert hasattr(ssn.sidc, "SIDC")
376
+ assert hasattr(ssn.sidc, "SIDC_ID")
377
+
378
+ def test_full_import_path(self):
379
+ """Test using full import path."""
380
+ from solarwindpy.solar_activity.sunspot_number.sidc import SIDC_ID
381
+
382
+ # Should be able to import specific classes
383
+ assert SIDC_ID is not None
384
+ assert callable(SIDC_ID)
385
+
386
+ def test_compatibility_with_solar_activity_functions(self):
387
+ """Test compatibility with solar_activity level functions."""
388
+ # Test that sunspot_number integrates well with solar_activity
389
+ try:
390
+ import solarwindpy.solar_activity as sa
391
+ import solarwindpy.solar_activity.sunspot_number as ssn
392
+
393
+ # Should coexist without conflicts
394
+ assert hasattr(sa, "sunspot_number")
395
+ assert sa.sunspot_number is ssn
396
+
397
+ except ImportError:
398
+ # If solar_activity doesn't have expected structure, that's fine
399
+ pass