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