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.
- plans/.velocity/metrics.json +96 -0
- plans/0-overview-template.md +268 -0
- plans/N-phase-template.md +106 -0
- plans/PLAN_AUDIT_SUMMARY.md +173 -0
- plans/TEMPLATE-USAGE-GUIDE.md +198 -0
- plans/__init__.py +1 -0
- plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
- plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
- plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
- plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
- plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
- plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
- plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
- plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
- plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
- plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
- plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
- plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
- plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
- plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
- plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
- plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
- plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
- plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
- plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
- plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
- plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
- plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
- plans/cicd-architecture-redesign/0-Overview.md +193 -0
- plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
- plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
- plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
- plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
- plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
- plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
- plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
- plans/cicd-architecture-redesign/8-Documentation.md +285 -0
- plans/cicd-architecture-redesign/Closeout.md +225 -0
- plans/closeout-template.md +259 -0
- plans/completed/circular-import-audit/0-Overview.md +152 -0
- plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
- plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
- plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
- plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
- plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
- plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
- plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
- plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
- plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
- plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
- plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
- plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
- plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
- plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
- plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
- plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
- plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
- plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
- plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
- plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
- plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
- plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
- plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
- plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
- plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
- plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
- plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
- plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
- plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
- plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
- plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
- plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
- plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
- plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
- plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
- plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
- plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
- plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
- plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
- plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
- plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
- plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
- plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
- plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
- plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
- plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
- plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
- plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
- plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
- plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
- plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
- plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
- plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
- plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
- plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
- plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
- plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
- plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
- plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
- plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
- plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
- plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
- plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
- plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
- plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
- plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
- plans/completed/pr-review-remediation/0-Overview.md +138 -0
- plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
- plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
- plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
- plans/completed/pr-review-remediation/compacted_state.md +66 -0
- plans/completed/python-310-migration/0-Overview.md +390 -0
- plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
- plans/completed/python-310-migration/2-Implementation.md +256 -0
- plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
- plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
- plans/completed/python-310-migration/5-Closeout.md +252 -0
- plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
- plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
- plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
- plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
- plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
- plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
- plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
- plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
- plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
- plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
- plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
- plans/completed/test-directory-consolidation/0-Overview.md +51 -0
- plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
- plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
- plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
- plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
- plans/completed/test-directory-consolidation/5-Validation.md +152 -0
- plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
- plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
- plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
- plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
- plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
- plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
- plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
- plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
- plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
- plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
- plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
- plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
- plans/documentation-code-audit/0-Overview.md +393 -0
- plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
- plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
- plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
- plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
- plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
- plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
- plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
- plans/documentation-code-audit/8-Closeout.md +456 -0
- plans/documentation-rebuild-session/compacted_state.md +109 -0
- plans/documentation-rendering-fixes/0-Overview.md +104 -0
- plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
- plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
- plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
- plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
- plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
- plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
- plans/documentation-rendering-fixes/compacted_state.md +132 -0
- plans/documentation-template-fix/0-Overview.md +197 -0
- plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
- plans/documentation-template-fix/2-Template-Modification.md +609 -0
- plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
- plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
- plans/documentation-template-fix/5-Documentation-Training.md +602 -0
- plans/documentation-workflow-fix/0-Overview.md +222 -0
- plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
- plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
- plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
- plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
- plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
- plans/duplicate-object-warnings-fix-plan.md +130 -0
- plans/github-issues-migration/0-Overview.md +510 -0
- plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
- plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
- plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
- plans/github-issues-migration/4-Validated-Migration.md +252 -0
- plans/github-issues-migration/5-Documentation-Training.md +171 -0
- plans/github-issues-migration/6-Closeout.md +179 -0
- plans/github-workflows-repair/repair-plan.md +299 -0
- plans/issues_from_plans.py +342 -0
- plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
- plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
- plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
- plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
- plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
- plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
- plans/python-310-migration/0-Overview.md +390 -0
- plans/python-310-migration/1-Planning-Setup.md +164 -0
- plans/python-310-migration/2-Implementation.md +256 -0
- plans/python-310-migration/3-Testing-Validation.md +335 -0
- plans/python-310-migration/4-Documentation-Release.md +274 -0
- plans/python-310-migration/5-Closeout.md +252 -0
- plans/readthedocs-simplified/0-Overview.md +243 -0
- plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
- plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
- plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
- plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
- plans/readthedocs-simplified/5-Closeout.md +231 -0
- plans/readthedocs-simplified/compacted_state.md +127 -0
- plans/session-compaction-2025-08-12/compacted_state.md +114 -0
- plans/session-compaction-2025-08-13/compacted_state.md +145 -0
- plans/session-continuity-protocol/0-Overview.md +35 -0
- plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
- plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
- plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
- plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
- plans/sphinx-warnings-analysis.md +222 -0
- plans/systemprompt-optimization/0-Overview.md +447 -0
- plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
- plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
- plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
- plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
- plans/systemprompt-optimization/9-Closeout.md +165 -0
- plans/systemprompt-optimization/compacted_state.md +143 -0
- plans/template-value-propositions/0-Overview.md +357 -0
- plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
- plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
- plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
- plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
- plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
- plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
- plans/tests-audit/0-Overview.md +410 -0
- plans/tests-audit/1-Discovery-Inventory.md +170 -0
- plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
- plans/tests-audit/3-Architecture-Compliance.md +195 -0
- plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
- plans/tests-audit/5-Documentation-Enhancement.md +220 -0
- plans/tests-audit/6-Audit-Deliverables.md +220 -0
- plans/tests-audit/7-Closeout.md +252 -0
- plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
- plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
- plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
- plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
- plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
- plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
- plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
- plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
- plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
- plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
- plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
- plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
- plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
- plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
- plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
- plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
- plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
- plans/tests-audit/artifacts/test_parser.py +395 -0
- solarwindpy/README.md +3 -0
- solarwindpy/Untitled.ipynb +54 -0
- solarwindpy/__init__.py +74 -0
- solarwindpy/core/__init__.py +23 -0
- solarwindpy/core/alfvenic_turbulence.py +804 -0
- solarwindpy/core/base.py +267 -0
- solarwindpy/core/ions.py +309 -0
- solarwindpy/core/plasma.py +2133 -0
- solarwindpy/core/spacecraft.py +256 -0
- solarwindpy/core/tensor.py +90 -0
- solarwindpy/core/units_constants.py +199 -0
- solarwindpy/core/vector.py +328 -0
- solarwindpy/fitfunctions/__init__.py +20 -0
- solarwindpy/fitfunctions/core.py +734 -0
- solarwindpy/fitfunctions/exponentials.py +188 -0
- solarwindpy/fitfunctions/gaussians.py +264 -0
- solarwindpy/fitfunctions/lines.py +116 -0
- solarwindpy/fitfunctions/moyal.py +71 -0
- solarwindpy/fitfunctions/plots.py +751 -0
- solarwindpy/fitfunctions/power_laws.py +209 -0
- solarwindpy/fitfunctions/tex_info.py +568 -0
- solarwindpy/fitfunctions/trend_fits.py +482 -0
- solarwindpy/instabilities/__init__.py +16 -0
- solarwindpy/instabilities/beta_ani.py +82 -0
- solarwindpy/instabilities/verscharen2016.py +631 -0
- solarwindpy/plotting/__init__.py +33 -0
- solarwindpy/plotting/agg_plot.py +489 -0
- solarwindpy/plotting/base.py +465 -0
- solarwindpy/plotting/hist1d.py +405 -0
- solarwindpy/plotting/hist2d.py +1035 -0
- solarwindpy/plotting/histograms.py +1845 -0
- solarwindpy/plotting/labels/__init__.py +104 -0
- solarwindpy/plotting/labels/base.py +686 -0
- solarwindpy/plotting/labels/chemistry.py +19 -0
- solarwindpy/plotting/labels/composition.py +100 -0
- solarwindpy/plotting/labels/datetime.py +235 -0
- solarwindpy/plotting/labels/elemental_abundance.py +73 -0
- solarwindpy/plotting/labels/special.py +794 -0
- solarwindpy/plotting/orbits.py +515 -0
- solarwindpy/plotting/scatter.py +99 -0
- solarwindpy/plotting/select_data_from_figure.py +329 -0
- solarwindpy/plotting/spiral.py +980 -0
- solarwindpy/plotting/tools.py +434 -0
- solarwindpy/scripts/__init__.py +1 -0
- solarwindpy/scripts/logs/.gitignore +1 -0
- solarwindpy/solar_activity/__init__.py +53 -0
- solarwindpy/solar_activity/base.py +605 -0
- solarwindpy/solar_activity/lisird/__init__.py +3 -0
- solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
- solarwindpy/solar_activity/lisird/lisird.py +319 -0
- solarwindpy/solar_activity/plots.py +116 -0
- solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
- solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
- solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
- solarwindpy/tools/__init__.py +162 -0
- solarwindpy-0.1.0.dist-info/METADATA +181 -0
- solarwindpy-0.1.0.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.0.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.0.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.0.dist-info/top_level.txt +3 -0
- tests/__init__.py +1 -0
- tests/conftest.py +10 -0
- tests/core/__init__.py +1 -0
- tests/core/test_alfvenic_turbulence.py +544 -0
- tests/core/test_base.py +112 -0
- tests/core/test_base_head_tail.py +29 -0
- tests/core/test_base_mi_tuples.py +11 -0
- tests/core/test_core_verify_datetimeindex.py +32 -0
- tests/core/test_ions.py +325 -0
- tests/core/test_plasma.py +2581 -0
- tests/core/test_plasma_io.py +12 -0
- tests/core/test_quantities.py +507 -0
- tests/core/test_spacecraft.py +210 -0
- tests/core/test_units_constants.py +22 -0
- tests/data/epoch.csv +4 -0
- tests/data/plasma.csv +4 -0
- tests/data/spacecraft.csv +4 -0
- tests/fitfunctions/conftest.py +60 -0
- tests/fitfunctions/test_core.py +193 -0
- tests/fitfunctions/test_exponentials.py +342 -0
- tests/fitfunctions/test_gaussians.py +142 -0
- tests/fitfunctions/test_lines.py +349 -0
- tests/fitfunctions/test_moyal.py +258 -0
- tests/fitfunctions/test_plots.py +258 -0
- tests/fitfunctions/test_power_laws.py +365 -0
- tests/fitfunctions/test_tex_info.py +183 -0
- tests/fitfunctions/test_trend_fit_properties.py +31 -0
- tests/fitfunctions/test_trend_fits.py +244 -0
- tests/plotting/__init__.py +1 -0
- tests/plotting/labels/__init__.py +1 -0
- tests/plotting/labels/test_chemistry.py +243 -0
- tests/plotting/labels/test_composition.py +345 -0
- tests/plotting/labels/test_datetime.py +445 -0
- tests/plotting/labels/test_elemental_abundance.py +366 -0
- tests/plotting/labels/test_init.py +66 -0
- tests/plotting/labels/test_labels_base.py +347 -0
- tests/plotting/labels/test_special.py +550 -0
- tests/plotting/test_agg_plot.py +602 -0
- tests/plotting/test_base.py +752 -0
- tests/plotting/test_fixtures_utilities.py +775 -0
- tests/plotting/test_histograms.py +546 -0
- tests/plotting/test_integration.py +675 -0
- tests/plotting/test_orbits.py +435 -0
- tests/plotting/test_performance.py +708 -0
- tests/plotting/test_scatter.py +752 -0
- tests/plotting/test_select_data_from_figure.py +1209 -0
- tests/plotting/test_spiral.py +573 -0
- tests/plotting/test_tools.py +607 -0
- tests/plotting/test_visual_validation.py +465 -0
- tests/solar_activity/__init__.py +1 -0
- tests/solar_activity/lisird/__init__.py +1 -0
- tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
- tests/solar_activity/lisird/test_lisird_id.py +187 -0
- tests/solar_activity/sunspot_number/__init__.py +1 -0
- tests/solar_activity/sunspot_number/test_init.py +399 -0
- tests/solar_activity/sunspot_number/test_sidc.py +465 -0
- tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
- tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
- tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
- tests/solar_activity/test_base.py +656 -0
- tests/solar_activity/test_init.py +396 -0
- tests/solar_activity/test_plots.py +371 -0
- tests/test_circular_imports.py +408 -0
- tests/test_issue_titles.py +25 -0
- tests/test_statusline.py +298 -0
- solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
- solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
- solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Test solar_activity package entry point (__init__.py).
|
|
3
|
+
|
|
4
|
+
This module tests the `get_all_indices()` function which aggregates solar activity
|
|
5
|
+
indices from multiple sources (LISIRD and SIDC).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
import pandas as pd
|
|
10
|
+
import numpy as np
|
|
11
|
+
from unittest.mock import Mock, patch, MagicMock
|
|
12
|
+
|
|
13
|
+
import solarwindpy.solar_activity as sa
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestGetAllIndices:
|
|
17
|
+
"""Test the get_all_indices() aggregation function."""
|
|
18
|
+
|
|
19
|
+
@pytest.fixture
|
|
20
|
+
def mock_lisird_data(self):
|
|
21
|
+
"""Create mock LISIRD data structures for testing."""
|
|
22
|
+
# Create synthetic Lalpha data
|
|
23
|
+
dates = pd.date_range("2020-01-01", periods=100, freq="D")
|
|
24
|
+
lalpha_data = pd.DataFrame(
|
|
25
|
+
{"irradiance": np.random.uniform(0.001, 0.005, 100)}, index=dates
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
# Create synthetic CaK data with extra milliseconds column
|
|
29
|
+
cak_data = pd.DataFrame(
|
|
30
|
+
{
|
|
31
|
+
"irradiance": np.random.uniform(1000, 2000, 100),
|
|
32
|
+
"milliseconds": np.zeros(100), # This should be dropped
|
|
33
|
+
},
|
|
34
|
+
index=dates,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Create synthetic MgII data
|
|
38
|
+
mgii_data = pd.DataFrame(
|
|
39
|
+
{"mg_index": np.random.uniform(0.25, 0.30, 100)}, index=dates
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
return {"Lalpha": lalpha_data, "CaK": cak_data, "MgII": mgii_data}
|
|
43
|
+
|
|
44
|
+
@pytest.fixture
|
|
45
|
+
def mock_sidc_data(self):
|
|
46
|
+
"""Create mock SIDC data structure for testing."""
|
|
47
|
+
dates = pd.date_range("2020-01-01", periods=100, freq="D")
|
|
48
|
+
sidc_data = pd.DataFrame({"ssn": np.random.uniform(0, 200, 100)}, index=dates)
|
|
49
|
+
return sidc_data
|
|
50
|
+
|
|
51
|
+
@pytest.fixture
|
|
52
|
+
def dummy_lisird_class(self, mock_lisird_data):
|
|
53
|
+
"""Create a dummy LISIRD class that returns mock data."""
|
|
54
|
+
|
|
55
|
+
class DummyLISIRD:
|
|
56
|
+
def __init__(self, key):
|
|
57
|
+
self.key = key
|
|
58
|
+
self._data = mock_lisird_data[key].copy()
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def data(self):
|
|
62
|
+
return self._data
|
|
63
|
+
|
|
64
|
+
return DummyLISIRD
|
|
65
|
+
|
|
66
|
+
@pytest.fixture
|
|
67
|
+
def dummy_sidc_class(self, mock_sidc_data):
|
|
68
|
+
"""Create a dummy SIDC class that returns mock data."""
|
|
69
|
+
|
|
70
|
+
class DummySIDC:
|
|
71
|
+
def __init__(self, key):
|
|
72
|
+
self.key = key
|
|
73
|
+
self._data = mock_sidc_data.copy()
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def data(self):
|
|
77
|
+
return self._data
|
|
78
|
+
|
|
79
|
+
return DummySIDC
|
|
80
|
+
|
|
81
|
+
def test_get_all_indices_structure(self, dummy_lisird_class, dummy_sidc_class):
|
|
82
|
+
"""Test that get_all_indices() returns correct structure and columns."""
|
|
83
|
+
# Mock the LISIRD and SIDC classes
|
|
84
|
+
with patch(
|
|
85
|
+
"solarwindpy.solar_activity.lisird.lisird.LISIRD", dummy_lisird_class
|
|
86
|
+
):
|
|
87
|
+
with patch(
|
|
88
|
+
"solarwindpy.solar_activity.sunspot_number.sidc.SIDC", dummy_sidc_class
|
|
89
|
+
):
|
|
90
|
+
result = sa.get_all_indices()
|
|
91
|
+
|
|
92
|
+
# Check that result is a DataFrame
|
|
93
|
+
assert isinstance(result, pd.DataFrame)
|
|
94
|
+
|
|
95
|
+
# Check expected columns are present (sorted alphabetically)
|
|
96
|
+
expected_columns = ["CaK", "Lalpha", "MgII", "ssn"]
|
|
97
|
+
assert list(
|
|
98
|
+
result.columns.get_level_values(0).unique().sort_values()
|
|
99
|
+
) == sorted(expected_columns)
|
|
100
|
+
|
|
101
|
+
# Check index type is DatetimeIndex
|
|
102
|
+
assert isinstance(result.index, pd.DatetimeIndex)
|
|
103
|
+
|
|
104
|
+
def test_get_all_indices_columns_exact(self, dummy_lisird_class, dummy_sidc_class):
|
|
105
|
+
"""Test exact column structure matches expected format."""
|
|
106
|
+
with patch(
|
|
107
|
+
"solarwindpy.solar_activity.lisird.lisird.LISIRD", dummy_lisird_class
|
|
108
|
+
):
|
|
109
|
+
with patch(
|
|
110
|
+
"solarwindpy.solar_activity.sunspot_number.sidc.SIDC", dummy_sidc_class
|
|
111
|
+
):
|
|
112
|
+
result = sa.get_all_indices()
|
|
113
|
+
|
|
114
|
+
# Extract top-level column names
|
|
115
|
+
top_level_columns = result.columns.get_level_values(0).unique()
|
|
116
|
+
assert "CaK" in top_level_columns
|
|
117
|
+
assert "Lalpha" in top_level_columns
|
|
118
|
+
assert "MgII" in top_level_columns
|
|
119
|
+
assert "ssn" in top_level_columns
|
|
120
|
+
|
|
121
|
+
def test_get_all_indices_datetime_index(self, dummy_lisird_class, dummy_sidc_class):
|
|
122
|
+
"""Test that result index is properly formatted DatetimeIndex."""
|
|
123
|
+
with patch(
|
|
124
|
+
"solarwindpy.solar_activity.lisird.lisird.LISIRD", dummy_lisird_class
|
|
125
|
+
):
|
|
126
|
+
with patch(
|
|
127
|
+
"solarwindpy.solar_activity.sunspot_number.sidc.SIDC", dummy_sidc_class
|
|
128
|
+
):
|
|
129
|
+
result = sa.get_all_indices()
|
|
130
|
+
|
|
131
|
+
# Verify index type
|
|
132
|
+
assert isinstance(result.index, pd.DatetimeIndex)
|
|
133
|
+
|
|
134
|
+
# Verify index is sorted
|
|
135
|
+
assert result.index.is_monotonic_increasing
|
|
136
|
+
|
|
137
|
+
# Verify reasonable date range
|
|
138
|
+
assert result.index.min() >= pd.Timestamp("2019-01-01")
|
|
139
|
+
assert result.index.max() <= pd.Timestamp("2025-01-01")
|
|
140
|
+
|
|
141
|
+
def test_get_all_indices_data_aggregation(
|
|
142
|
+
self, dummy_lisird_class, dummy_sidc_class
|
|
143
|
+
):
|
|
144
|
+
"""Test that data from different sources is properly aggregated."""
|
|
145
|
+
with patch(
|
|
146
|
+
"solarwindpy.solar_activity.lisird.lisird.LISIRD", dummy_lisird_class
|
|
147
|
+
):
|
|
148
|
+
with patch(
|
|
149
|
+
"solarwindpy.solar_activity.sunspot_number.sidc.SIDC", dummy_sidc_class
|
|
150
|
+
):
|
|
151
|
+
result = sa.get_all_indices()
|
|
152
|
+
|
|
153
|
+
# Check that data is not empty
|
|
154
|
+
assert len(result) > 0
|
|
155
|
+
|
|
156
|
+
# Check that each column has some non-null data
|
|
157
|
+
assert not result["Lalpha"].isna().all().all()
|
|
158
|
+
assert not result["ssn"].isna().all().all()
|
|
159
|
+
assert not result["MgII"].isna().all().all()
|
|
160
|
+
|
|
161
|
+
# CaK should have milliseconds column dropped
|
|
162
|
+
if hasattr(result, "CaK"):
|
|
163
|
+
cak_columns = [col for col in result.columns if col[0] == "CaK"]
|
|
164
|
+
assert len(cak_columns) >= 1
|
|
165
|
+
# Verify no 'milliseconds' subcolumn
|
|
166
|
+
subcolumns = [col[1] for col in cak_columns if col[0] == "CaK"]
|
|
167
|
+
assert "milliseconds" not in subcolumns
|
|
168
|
+
|
|
169
|
+
def test_get_all_indices_mgii_date_conversion(
|
|
170
|
+
self, dummy_lisird_class, dummy_sidc_class
|
|
171
|
+
):
|
|
172
|
+
"""Test that MgII data index is properly converted to date-only."""
|
|
173
|
+
# Create MgII data with timestamp index
|
|
174
|
+
dates_with_time = pd.date_range("2020-01-01 12:30:45", periods=50, freq="D")
|
|
175
|
+
mgii_data_with_time = pd.DataFrame(
|
|
176
|
+
{"mg_index": np.random.uniform(0.25, 0.30, 50)}, index=dates_with_time
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
class DummyLISIRDWithTime:
|
|
180
|
+
def __init__(self, key):
|
|
181
|
+
self.key = key
|
|
182
|
+
if key == "MgII":
|
|
183
|
+
self._data = mgii_data_with_time
|
|
184
|
+
else:
|
|
185
|
+
# Use simplified mock data for other keys
|
|
186
|
+
dates = pd.date_range("2020-01-01", periods=50, freq="D")
|
|
187
|
+
if key == "Lalpha":
|
|
188
|
+
self._data = pd.DataFrame(
|
|
189
|
+
{"irradiance": np.random.uniform(0.001, 0.005, 50)},
|
|
190
|
+
index=dates,
|
|
191
|
+
)
|
|
192
|
+
else: # CaK
|
|
193
|
+
self._data = pd.DataFrame(
|
|
194
|
+
{
|
|
195
|
+
"irradiance": np.random.uniform(1000, 2000, 50),
|
|
196
|
+
"milliseconds": np.zeros(50),
|
|
197
|
+
},
|
|
198
|
+
index=dates,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def data(self):
|
|
203
|
+
return self._data
|
|
204
|
+
|
|
205
|
+
with patch(
|
|
206
|
+
"solarwindpy.solar_activity.lisird.lisird.LISIRD", DummyLISIRDWithTime
|
|
207
|
+
):
|
|
208
|
+
with patch(
|
|
209
|
+
"solarwindpy.solar_activity.sunspot_number.sidc.SIDC", dummy_sidc_class
|
|
210
|
+
):
|
|
211
|
+
result = sa.get_all_indices()
|
|
212
|
+
|
|
213
|
+
# Verify that the result index only contains dates (no time component)
|
|
214
|
+
assert all(
|
|
215
|
+
timestamp.time() == pd.Timestamp("00:00:00").time()
|
|
216
|
+
for timestamp in result.index[:5]
|
|
217
|
+
) # Check first 5 entries
|
|
218
|
+
|
|
219
|
+
def test_get_all_indices_error_handling(self):
|
|
220
|
+
"""Test error handling when mocked classes raise exceptions."""
|
|
221
|
+
|
|
222
|
+
class BrokenLISIRD:
|
|
223
|
+
def __init__(self, key):
|
|
224
|
+
raise ValueError(f"Failed to initialize LISIRD with key {key}")
|
|
225
|
+
|
|
226
|
+
with patch("solarwindpy.solar_activity.lisird.lisird.LISIRD", BrokenLISIRD):
|
|
227
|
+
with pytest.raises(ValueError, match="Failed to initialize LISIRD"):
|
|
228
|
+
sa.get_all_indices()
|
|
229
|
+
|
|
230
|
+
def test_imports_available(self):
|
|
231
|
+
"""Test that necessary imports are available in the module."""
|
|
232
|
+
# Test that submodules are accessible
|
|
233
|
+
assert hasattr(sa, "lisird")
|
|
234
|
+
assert hasattr(sa, "sunspot_number")
|
|
235
|
+
assert hasattr(sa, "ssn")
|
|
236
|
+
assert hasattr(sa, "plots")
|
|
237
|
+
|
|
238
|
+
# Test that ssn is an alias for sunspot_number
|
|
239
|
+
assert sa.ssn is sa.sunspot_number
|
|
240
|
+
|
|
241
|
+
def test_get_all_indices_function_exists(self):
|
|
242
|
+
"""Test that get_all_indices function is available."""
|
|
243
|
+
assert hasattr(sa, "get_all_indices")
|
|
244
|
+
assert callable(sa.get_all_indices)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
class TestPackageStructure:
|
|
248
|
+
"""Test package-level structure and imports."""
|
|
249
|
+
|
|
250
|
+
def test_package_all_exports(self):
|
|
251
|
+
"""Test that __all__ exports are correct."""
|
|
252
|
+
# Check __all__ contains expected items
|
|
253
|
+
expected_all = ["sunspot_number", "ssn", "lisird", "plots"]
|
|
254
|
+
assert hasattr(sa, "__all__")
|
|
255
|
+
|
|
256
|
+
# Check that all items in __all__ are actually available
|
|
257
|
+
for item in sa.__all__:
|
|
258
|
+
assert hasattr(sa, item), f"Item '{item}' in __all__ but not available"
|
|
259
|
+
|
|
260
|
+
def test_ssn_alias(self):
|
|
261
|
+
"""Test that ssn is properly aliased to sunspot_number."""
|
|
262
|
+
assert sa.ssn is sa.sunspot_number
|
|
263
|
+
|
|
264
|
+
def test_submodule_imports(self):
|
|
265
|
+
"""Test that required submodules are imported."""
|
|
266
|
+
# These should be available due to import statements
|
|
267
|
+
assert hasattr(sa, "lisird")
|
|
268
|
+
assert hasattr(sa, "sunspot_number")
|
|
269
|
+
assert hasattr(sa, "plots")
|
|
270
|
+
|
|
271
|
+
# Test that they are modules
|
|
272
|
+
import types
|
|
273
|
+
|
|
274
|
+
assert isinstance(sa.lisird, types.ModuleType)
|
|
275
|
+
assert isinstance(sa.sunspot_number, types.ModuleType)
|
|
276
|
+
assert isinstance(sa.plots, types.ModuleType)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class TestMockingIntegration:
|
|
280
|
+
"""Test the mocking setup for external dependencies."""
|
|
281
|
+
|
|
282
|
+
def test_lisird_mocking_pattern(self):
|
|
283
|
+
"""Test that LISIRD can be properly mocked."""
|
|
284
|
+
mock_lisird = Mock()
|
|
285
|
+
mock_lisird.return_value.data = pd.DataFrame(
|
|
286
|
+
{"irradiance": [0.002, 0.003, 0.004]},
|
|
287
|
+
index=pd.date_range("2020-01-01", periods=3),
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
with patch("solarwindpy.solar_activity.lisird.lisird.LISIRD", mock_lisird):
|
|
291
|
+
# This should work without errors
|
|
292
|
+
sa.lisird.lisird.LISIRD("Lalpha")
|
|
293
|
+
|
|
294
|
+
# Verify mock was called
|
|
295
|
+
mock_lisird.assert_called_with("Lalpha")
|
|
296
|
+
|
|
297
|
+
def test_sidc_mocking_pattern(self):
|
|
298
|
+
"""Test that SIDC can be properly mocked."""
|
|
299
|
+
mock_sidc = Mock()
|
|
300
|
+
mock_sidc.return_value.data = pd.DataFrame(
|
|
301
|
+
{"ssn": [50, 75, 100]}, index=pd.date_range("2020-01-01", periods=3)
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
with patch("solarwindpy.solar_activity.sunspot_number.sidc.SIDC", mock_sidc):
|
|
305
|
+
# This should work without errors
|
|
306
|
+
sa.sunspot_number.sidc.SIDC("m13")
|
|
307
|
+
|
|
308
|
+
# Verify mock was called
|
|
309
|
+
mock_sidc.assert_called_with("m13")
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class TestRealWorldIntegration:
|
|
313
|
+
"""Test integration patterns that mirror real usage."""
|
|
314
|
+
|
|
315
|
+
@pytest.fixture
|
|
316
|
+
def dummy_lisird_class(self):
|
|
317
|
+
"""Create a dummy LISIRD class for integration testing."""
|
|
318
|
+
dates = pd.date_range("2020-01-01", periods=100, freq="D")
|
|
319
|
+
mock_data = {
|
|
320
|
+
"Lalpha": pd.DataFrame(
|
|
321
|
+
{"irradiance": np.random.uniform(0.001, 0.005, 100)}, index=dates
|
|
322
|
+
),
|
|
323
|
+
"CaK": pd.DataFrame(
|
|
324
|
+
{
|
|
325
|
+
"irradiance": np.random.uniform(1000, 2000, 100),
|
|
326
|
+
"milliseconds": np.zeros(100),
|
|
327
|
+
},
|
|
328
|
+
index=dates,
|
|
329
|
+
),
|
|
330
|
+
"MgII": pd.DataFrame(
|
|
331
|
+
{"mg_index": np.random.uniform(0.25, 0.30, 100)}, index=dates
|
|
332
|
+
),
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
class DummyLISIRD:
|
|
336
|
+
def __init__(self, key):
|
|
337
|
+
self.key = key
|
|
338
|
+
self._data = mock_data[key].copy()
|
|
339
|
+
|
|
340
|
+
@property
|
|
341
|
+
def data(self):
|
|
342
|
+
return self._data
|
|
343
|
+
|
|
344
|
+
return DummyLISIRD
|
|
345
|
+
|
|
346
|
+
@pytest.fixture
|
|
347
|
+
def dummy_sidc_class(self):
|
|
348
|
+
"""Create a dummy SIDC class for integration testing."""
|
|
349
|
+
dates = pd.date_range("2020-01-01", periods=100, freq="D")
|
|
350
|
+
sidc_data = pd.DataFrame({"ssn": np.random.uniform(0, 200, 100)}, index=dates)
|
|
351
|
+
|
|
352
|
+
class DummySIDC:
|
|
353
|
+
def __init__(self, key):
|
|
354
|
+
self.key = key
|
|
355
|
+
self._data = sidc_data.copy()
|
|
356
|
+
|
|
357
|
+
@property
|
|
358
|
+
def data(self):
|
|
359
|
+
return self._data
|
|
360
|
+
|
|
361
|
+
return DummySIDC
|
|
362
|
+
|
|
363
|
+
def test_complete_get_all_indices_workflow(
|
|
364
|
+
self, dummy_lisird_class, dummy_sidc_class
|
|
365
|
+
):
|
|
366
|
+
"""Test complete workflow from start to finish."""
|
|
367
|
+
with patch(
|
|
368
|
+
"solarwindpy.solar_activity.lisird.lisird.LISIRD", dummy_lisird_class
|
|
369
|
+
):
|
|
370
|
+
with patch(
|
|
371
|
+
"solarwindpy.solar_activity.sunspot_number.sidc.SIDC", dummy_sidc_class
|
|
372
|
+
):
|
|
373
|
+
# Call the main function
|
|
374
|
+
result = sa.get_all_indices()
|
|
375
|
+
|
|
376
|
+
# Verify comprehensive results
|
|
377
|
+
assert isinstance(result, pd.DataFrame)
|
|
378
|
+
assert len(result) > 0
|
|
379
|
+
assert isinstance(result.index, pd.DatetimeIndex)
|
|
380
|
+
|
|
381
|
+
# Check column structure
|
|
382
|
+
expected_top_level = ["CaK", "Lalpha", "MgII", "ssn"]
|
|
383
|
+
actual_top_level = list(result.columns.get_level_values(0).unique())
|
|
384
|
+
for expected_col in expected_top_level:
|
|
385
|
+
assert (
|
|
386
|
+
expected_col in actual_top_level
|
|
387
|
+
), f"Missing column: {expected_col}"
|
|
388
|
+
|
|
389
|
+
# Verify data types are reasonable
|
|
390
|
+
for col in result.columns:
|
|
391
|
+
assert result[col].dtype in [
|
|
392
|
+
np.float64,
|
|
393
|
+
np.float32,
|
|
394
|
+
np.int64,
|
|
395
|
+
np.int32,
|
|
396
|
+
], f"Unexpected dtype for column {col}: {result[col].dtype}"
|