solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solarwindpy might be problematic. Click here for more details.
- 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.1.dist-info/METADATA +181 -0
- solarwindpy-0.1.1.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.1.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,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
|