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,550 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from solarwindpy.plotting.labels import special as labels_special
|
|
4
|
+
from solarwindpy.plotting.labels import base as labels_base
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@pytest.fixture()
|
|
8
|
+
def basic_texlabel():
|
|
9
|
+
"""Return a basic TeXlabel for testing special labels."""
|
|
10
|
+
return labels_base.TeXlabel(("v", "x", "p"))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.fixture()
|
|
14
|
+
def manual_label():
|
|
15
|
+
"""Return a ManualLabel instance."""
|
|
16
|
+
return labels_special.ManualLabel("V_SW", "km s^{-1}")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture()
|
|
20
|
+
def count_label():
|
|
21
|
+
"""Return a Count label instance."""
|
|
22
|
+
return labels_special.Count()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.fixture()
|
|
26
|
+
def count_label_normalized():
|
|
27
|
+
"""Return a normalized Count label instance."""
|
|
28
|
+
return labels_special.Count(norm="c")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.fixture()
|
|
32
|
+
def vsw_label():
|
|
33
|
+
"""Return a Vsw label instance."""
|
|
34
|
+
return labels_special.Vsw()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.fixture()
|
|
38
|
+
def carrington_label():
|
|
39
|
+
"""Return a CarringtonRotation label instance."""
|
|
40
|
+
return labels_special.CarringtonRotation()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TestManualLabel:
|
|
44
|
+
"""Test ManualLabel class functionality."""
|
|
45
|
+
|
|
46
|
+
def test_basic_creation(self, manual_label):
|
|
47
|
+
"""Test basic ManualLabel creation."""
|
|
48
|
+
assert manual_label.tex == "V_SW"
|
|
49
|
+
assert manual_label.unit == "km s^{-1}"
|
|
50
|
+
assert isinstance(manual_label.path, Path)
|
|
51
|
+
|
|
52
|
+
def test_string_representation(self, manual_label):
|
|
53
|
+
"""Test string representation."""
|
|
54
|
+
result = str(manual_label)
|
|
55
|
+
assert "V_SW" in result
|
|
56
|
+
assert "km s^{-1}" in result
|
|
57
|
+
assert result.startswith("$")
|
|
58
|
+
assert result.endswith("$")
|
|
59
|
+
|
|
60
|
+
def test_tex_stripping(self):
|
|
61
|
+
"""Test TeX string stripping of dollar signs."""
|
|
62
|
+
label = labels_special.ManualLabel("$V_SW$", "km s^{-1}")
|
|
63
|
+
assert label.tex == "V_SW"
|
|
64
|
+
|
|
65
|
+
def test_unit_translation(self):
|
|
66
|
+
"""Test unit translation using base._inU."""
|
|
67
|
+
label = labels_special.ManualLabel("B", "b") # 'b' should translate to nT
|
|
68
|
+
assert "nT" in label.unit
|
|
69
|
+
|
|
70
|
+
def test_path_generation(self):
|
|
71
|
+
"""Test path generation."""
|
|
72
|
+
label = labels_special.ManualLabel("Test Label", "units")
|
|
73
|
+
assert str(label.path) == "Test-Label"
|
|
74
|
+
|
|
75
|
+
def test_custom_path(self):
|
|
76
|
+
"""Test custom path specification."""
|
|
77
|
+
label = labels_special.ManualLabel("Test", "units", path="custom_path")
|
|
78
|
+
assert str(label.path) == "custom_path"
|
|
79
|
+
|
|
80
|
+
def test_empty_unit_handling(self):
|
|
81
|
+
"""Test handling of empty units."""
|
|
82
|
+
label = labels_special.ManualLabel("Test", "")
|
|
83
|
+
result = str(label)
|
|
84
|
+
assert "[]" not in result # Empty units should be removed
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class TestVsw:
|
|
88
|
+
"""Test Vsw (solar wind speed) label class."""
|
|
89
|
+
|
|
90
|
+
def test_properties(self, vsw_label):
|
|
91
|
+
"""Test Vsw label properties."""
|
|
92
|
+
assert vsw_label.tex == r"V_\mathrm{SW}"
|
|
93
|
+
assert vsw_label.units == r"\mathrm{km \, s^{-1}}"
|
|
94
|
+
assert str(vsw_label.path) == "vsw"
|
|
95
|
+
|
|
96
|
+
def test_string_representation(self, vsw_label):
|
|
97
|
+
"""Test string representation."""
|
|
98
|
+
result = str(vsw_label)
|
|
99
|
+
assert "V_\\mathrm{SW}" in result
|
|
100
|
+
assert "km" in result
|
|
101
|
+
assert "s^{-1}" in result
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class TestCarringtonRotation:
|
|
105
|
+
"""Test CarringtonRotation label class."""
|
|
106
|
+
|
|
107
|
+
def test_short_label(self, carrington_label):
|
|
108
|
+
"""Test short label format."""
|
|
109
|
+
assert carrington_label.short_label is True
|
|
110
|
+
assert carrington_label.tex == r"\mathrm{CR}"
|
|
111
|
+
|
|
112
|
+
def test_long_label(self):
|
|
113
|
+
"""Test long label format."""
|
|
114
|
+
label = labels_special.CarringtonRotation(short_label=False)
|
|
115
|
+
assert label.short_label is False
|
|
116
|
+
assert "Carrington" in label.tex
|
|
117
|
+
assert "Rotation" in label.tex
|
|
118
|
+
|
|
119
|
+
def test_string_representation(self, carrington_label):
|
|
120
|
+
"""Test string representation."""
|
|
121
|
+
result = str(carrington_label)
|
|
122
|
+
assert "CR" in result
|
|
123
|
+
assert r"[\#]" in result
|
|
124
|
+
|
|
125
|
+
def test_path(self, carrington_label):
|
|
126
|
+
"""Test path property."""
|
|
127
|
+
assert str(carrington_label.path) == "CarrRot"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class TestCount:
|
|
131
|
+
"""Test Count label class."""
|
|
132
|
+
|
|
133
|
+
def test_basic_count(self, count_label):
|
|
134
|
+
"""Test basic count label."""
|
|
135
|
+
assert count_label.tex == r"\mathrm{Count}"
|
|
136
|
+
assert count_label.units == r"\#"
|
|
137
|
+
assert count_label.axnorm is None
|
|
138
|
+
|
|
139
|
+
def test_normalized_count(self, count_label_normalized):
|
|
140
|
+
"""Test normalized count label."""
|
|
141
|
+
assert "Col." in count_label_normalized.tex
|
|
142
|
+
assert "Norm" in count_label_normalized.tex
|
|
143
|
+
assert count_label_normalized.axnorm == "c"
|
|
144
|
+
|
|
145
|
+
def test_all_normalization_types(self):
|
|
146
|
+
"""Test all normalization types."""
|
|
147
|
+
norm_types = {
|
|
148
|
+
"c": "Col.",
|
|
149
|
+
"r": "Row",
|
|
150
|
+
"t": "Total",
|
|
151
|
+
"d": "Density", # Fixed - actual string is "Density" not "Probability Density"
|
|
152
|
+
"cd": "1D", # Just check for "1D" since spaces are escaped as \,
|
|
153
|
+
"rd": "1D", # Just check for "1D" since spaces are escaped as \,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
for norm, expected in norm_types.items():
|
|
157
|
+
label = labels_special.Count(norm=norm)
|
|
158
|
+
assert expected in label.tex
|
|
159
|
+
|
|
160
|
+
def test_path_with_normalization(self):
|
|
161
|
+
"""Test path generation with normalization."""
|
|
162
|
+
label = labels_special.Count(norm="c")
|
|
163
|
+
path_str = str(label.path)
|
|
164
|
+
assert "Cnorm" in path_str
|
|
165
|
+
|
|
166
|
+
def test_invalid_normalization(self):
|
|
167
|
+
"""Test invalid normalization raises assertion."""
|
|
168
|
+
with pytest.raises(AssertionError):
|
|
169
|
+
labels_special.Count(norm="invalid")
|
|
170
|
+
|
|
171
|
+
def test_set_axnorm_case_conversion(self, count_label):
|
|
172
|
+
"""Test case conversion in set_axnorm."""
|
|
173
|
+
count_label.set_axnorm("C") # Upper case
|
|
174
|
+
assert count_label.axnorm == "c" # Should be converted to lower
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class TestPower:
|
|
178
|
+
"""Test Power spectrum label class."""
|
|
179
|
+
|
|
180
|
+
def test_properties(self):
|
|
181
|
+
"""Test Power label properties."""
|
|
182
|
+
power = labels_special.Power()
|
|
183
|
+
assert power.tex == r"\mathrm{Power}"
|
|
184
|
+
assert power.units == r"\mathrm{\#}"
|
|
185
|
+
assert str(power.path) == "power"
|
|
186
|
+
|
|
187
|
+
def test_string_representation(self):
|
|
188
|
+
"""Test string representation."""
|
|
189
|
+
power = labels_special.Power()
|
|
190
|
+
result = str(power)
|
|
191
|
+
assert "Power" in result
|
|
192
|
+
assert r"[\mathrm{\#}]" in result
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class TestProbability:
|
|
196
|
+
"""Test Probability label class."""
|
|
197
|
+
|
|
198
|
+
def test_basic_probability(self, basic_texlabel):
|
|
199
|
+
"""Test basic probability label."""
|
|
200
|
+
prob = labels_special.Probability(basic_texlabel, "> 500")
|
|
201
|
+
assert "Prob." in prob.tex
|
|
202
|
+
assert prob.units == r"\%"
|
|
203
|
+
assert prob.other_label == basic_texlabel
|
|
204
|
+
assert prob.comparison == "> 500"
|
|
205
|
+
|
|
206
|
+
def test_empty_comparison(self, basic_texlabel):
|
|
207
|
+
"""Test probability with empty comparison."""
|
|
208
|
+
prob = labels_special.Probability(basic_texlabel)
|
|
209
|
+
assert prob.comparison == ""
|
|
210
|
+
|
|
211
|
+
def test_path_generation(self, basic_texlabel):
|
|
212
|
+
"""Test path generation with comparison operators."""
|
|
213
|
+
prob = labels_special.Probability(basic_texlabel, "> 500")
|
|
214
|
+
path_str = str(prob.path)
|
|
215
|
+
assert "prob-" in path_str
|
|
216
|
+
assert "GT" in path_str # > should be converted to GT
|
|
217
|
+
|
|
218
|
+
def test_comparison_operator_conversion(self, basic_texlabel):
|
|
219
|
+
"""Test conversion of comparison operators in path."""
|
|
220
|
+
operators = {
|
|
221
|
+
">": "GT",
|
|
222
|
+
"<": "LT",
|
|
223
|
+
r"\geq": "GEQ",
|
|
224
|
+
r"\leq": "LEQ",
|
|
225
|
+
"==": "EQ",
|
|
226
|
+
"!=": "NEQ",
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
for op, expected in operators.items():
|
|
230
|
+
prob = labels_special.Probability(basic_texlabel, f"x {op} 5")
|
|
231
|
+
path_str = str(prob.path)
|
|
232
|
+
assert expected in path_str
|
|
233
|
+
|
|
234
|
+
def test_string_label(self):
|
|
235
|
+
"""Test probability with string label."""
|
|
236
|
+
# String labels need to have a .tex attribute to work
|
|
237
|
+
# So let's test with a ManualLabel instead
|
|
238
|
+
manual_label = labels_special.ManualLabel("test_label", "units")
|
|
239
|
+
prob = labels_special.Probability(manual_label, "> 0")
|
|
240
|
+
assert prob.other_label == manual_label
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class TestCountOther:
|
|
244
|
+
"""Test CountOther label class."""
|
|
245
|
+
|
|
246
|
+
def test_basic_count_other(self, basic_texlabel):
|
|
247
|
+
"""Test basic CountOther label."""
|
|
248
|
+
count = labels_special.CountOther(basic_texlabel, "> 500")
|
|
249
|
+
assert "Count." in count.tex
|
|
250
|
+
assert count.units == r"\#"
|
|
251
|
+
assert not count.new_line_for_units
|
|
252
|
+
|
|
253
|
+
def test_newline_units(self, basic_texlabel):
|
|
254
|
+
"""Test newline for units option."""
|
|
255
|
+
count = labels_special.CountOther(
|
|
256
|
+
basic_texlabel, "> 500", new_line_for_units=True
|
|
257
|
+
)
|
|
258
|
+
assert count.new_line_for_units is True
|
|
259
|
+
result = str(count)
|
|
260
|
+
assert "$\n$" in result
|
|
261
|
+
|
|
262
|
+
def test_path_generation(self, basic_texlabel):
|
|
263
|
+
"""Test path generation for CountOther."""
|
|
264
|
+
count = labels_special.CountOther(basic_texlabel, "> 500")
|
|
265
|
+
path_str = str(count.path)
|
|
266
|
+
assert "cnt-" in path_str
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class TestMathFcn:
|
|
270
|
+
"""Test MathFcn label class."""
|
|
271
|
+
|
|
272
|
+
def test_basic_math_function(self, basic_texlabel):
|
|
273
|
+
"""Test basic math function label."""
|
|
274
|
+
math_fcn = labels_special.MathFcn("log", basic_texlabel)
|
|
275
|
+
assert "log" in math_fcn.tex
|
|
276
|
+
assert math_fcn.dimensionless is True
|
|
277
|
+
assert math_fcn.units == r"\mathrm{\#}"
|
|
278
|
+
|
|
279
|
+
def test_non_dimensionless(self, basic_texlabel):
|
|
280
|
+
"""Test non-dimensionless math function."""
|
|
281
|
+
math_fcn = labels_special.MathFcn("sqrt", basic_texlabel, dimensionless=False)
|
|
282
|
+
assert math_fcn.dimensionless is False
|
|
283
|
+
assert "sqrt" in math_fcn.units
|
|
284
|
+
|
|
285
|
+
def test_newline_units(self, basic_texlabel):
|
|
286
|
+
"""Test newline for units."""
|
|
287
|
+
math_fcn = labels_special.MathFcn(
|
|
288
|
+
"log", basic_texlabel, new_line_for_units=True
|
|
289
|
+
)
|
|
290
|
+
assert math_fcn.new_line_for_units is True
|
|
291
|
+
|
|
292
|
+
def test_path_generation(self, basic_texlabel):
|
|
293
|
+
"""Test path generation for math functions."""
|
|
294
|
+
math_fcn = labels_special.MathFcn("log", basic_texlabel)
|
|
295
|
+
path_str = str(math_fcn.path)
|
|
296
|
+
assert "log-" in path_str
|
|
297
|
+
|
|
298
|
+
def test_function_path_cleaning(self, basic_texlabel):
|
|
299
|
+
"""Test function name cleaning for path."""
|
|
300
|
+
math_fcn = labels_special.MathFcn(r"\mathrm{log}", basic_texlabel)
|
|
301
|
+
path_str = str(math_fcn.path)
|
|
302
|
+
assert "mathrm" not in path_str # Should be cleaned
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class TestDistance2Sun:
|
|
306
|
+
"""Test Distance2Sun label class."""
|
|
307
|
+
|
|
308
|
+
def test_valid_units(self):
|
|
309
|
+
"""Test valid distance units."""
|
|
310
|
+
valid_units = ["rs", "re", "au", "m", "km"]
|
|
311
|
+
for unit in valid_units:
|
|
312
|
+
dist = labels_special.Distance2Sun(unit)
|
|
313
|
+
assert dist.units is not None
|
|
314
|
+
|
|
315
|
+
def test_unit_translation(self):
|
|
316
|
+
"""Test unit translation."""
|
|
317
|
+
translations = {
|
|
318
|
+
"rs": r"R_{\bigodot}",
|
|
319
|
+
"re": r"R_{\oplus}",
|
|
320
|
+
"au": r"\mathrm{AU}",
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
for input_unit, expected in translations.items():
|
|
324
|
+
dist = labels_special.Distance2Sun(input_unit)
|
|
325
|
+
assert dist.units == expected
|
|
326
|
+
|
|
327
|
+
def test_invalid_units(self):
|
|
328
|
+
"""Test invalid units raise NotImplementedError."""
|
|
329
|
+
with pytest.raises(NotImplementedError):
|
|
330
|
+
labels_special.Distance2Sun("invalid_unit")
|
|
331
|
+
|
|
332
|
+
def test_properties(self):
|
|
333
|
+
"""Test Distance2Sun properties."""
|
|
334
|
+
dist = labels_special.Distance2Sun("au")
|
|
335
|
+
assert "Distance" in dist.tex
|
|
336
|
+
assert "Sun" in dist.tex
|
|
337
|
+
assert str(dist.path) == "distance2sun"
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
class TestSSN:
|
|
341
|
+
"""Test SSN (Sunspot Number) label class."""
|
|
342
|
+
|
|
343
|
+
def test_valid_kinds(self):
|
|
344
|
+
"""Test valid SSN kinds."""
|
|
345
|
+
valid_kinds = ["M", "M13", "D", "Y", "NM", "NM13", "ND", "NY"]
|
|
346
|
+
for kind in valid_kinds:
|
|
347
|
+
ssn = labels_special.SSN(kind)
|
|
348
|
+
assert ssn.kind == kind
|
|
349
|
+
|
|
350
|
+
def test_pretty_kind_translation(self):
|
|
351
|
+
"""Test pretty kind translation."""
|
|
352
|
+
translations = {
|
|
353
|
+
"M": "Monthly",
|
|
354
|
+
"M13": "13 Month Smoothed",
|
|
355
|
+
"D": "Daily",
|
|
356
|
+
"Y": "Annual",
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
for kind, expected in translations.items():
|
|
360
|
+
ssn = labels_special.SSN(kind)
|
|
361
|
+
assert expected in ssn.pretty_kind
|
|
362
|
+
|
|
363
|
+
def test_case_conversion(self):
|
|
364
|
+
"""Test case conversion for SSN kind."""
|
|
365
|
+
ssn = labels_special.SSN("m") # lowercase
|
|
366
|
+
assert ssn.kind == "M" # Should be uppercase
|
|
367
|
+
|
|
368
|
+
def test_invalid_kind(self):
|
|
369
|
+
"""Test invalid SSN kind raises assertion."""
|
|
370
|
+
with pytest.raises(AssertionError):
|
|
371
|
+
labels_special.SSN("invalid")
|
|
372
|
+
|
|
373
|
+
def test_tex_formatting(self):
|
|
374
|
+
"""Test TeX formatting."""
|
|
375
|
+
ssn = labels_special.SSN("M")
|
|
376
|
+
assert "Monthly" in ssn.tex
|
|
377
|
+
assert "SSN" in ssn.tex
|
|
378
|
+
|
|
379
|
+
def test_path_generation(self):
|
|
380
|
+
"""Test path generation."""
|
|
381
|
+
ssn = labels_special.SSN("M13")
|
|
382
|
+
assert str(ssn.path) == "M13ssn"
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
class TestComparisonLable:
|
|
386
|
+
"""Test ComparisonLable class (note: intentional misspelling in original)."""
|
|
387
|
+
|
|
388
|
+
def test_basic_comparison(self, basic_texlabel):
|
|
389
|
+
"""Test basic comparison label."""
|
|
390
|
+
# Use same units to avoid ValueError
|
|
391
|
+
label_b = labels_base.TeXlabel(("v", "y", "p")) # Same units as basic_texlabel
|
|
392
|
+
comp = labels_special.ComparisonLable(basic_texlabel, label_b, "subtract")
|
|
393
|
+
assert comp.labelA == basic_texlabel
|
|
394
|
+
assert comp.labelB == label_b
|
|
395
|
+
|
|
396
|
+
def test_predefined_functions(self, basic_texlabel):
|
|
397
|
+
"""Test predefined comparison functions."""
|
|
398
|
+
# Use same units to avoid ValueError
|
|
399
|
+
label_b = labels_base.TeXlabel(("v", "y", "p")) # Same units as basic_texlabel
|
|
400
|
+
functions = ["subtract", "add", "multiply"]
|
|
401
|
+
|
|
402
|
+
for fcn in functions:
|
|
403
|
+
comp = labels_special.ComparisonLable(basic_texlabel, label_b, fcn)
|
|
404
|
+
assert comp.function_name == fcn
|
|
405
|
+
|
|
406
|
+
def test_custom_function(self, basic_texlabel):
|
|
407
|
+
"""Test custom function definition."""
|
|
408
|
+
# Use same units to avoid ValueError
|
|
409
|
+
label_b = labels_base.TeXlabel(("v", "y", "p")) # Same units as basic_texlabel
|
|
410
|
+
custom_fcn = r"{$labelA} / {$labelB}"
|
|
411
|
+
comp = labels_special.ComparisonLable(
|
|
412
|
+
basic_texlabel, label_b, "divide", custom_fcn
|
|
413
|
+
)
|
|
414
|
+
assert "$labelA" in comp.function
|
|
415
|
+
assert "$labelB" in comp.function
|
|
416
|
+
|
|
417
|
+
def test_invalid_function_keys(self, basic_texlabel):
|
|
418
|
+
"""Test invalid function keys raise ValueError."""
|
|
419
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
420
|
+
invalid_fcn = r"{$invalid} + {$keys}"
|
|
421
|
+
with pytest.raises(ValueError):
|
|
422
|
+
labels_special.ComparisonLable(
|
|
423
|
+
basic_texlabel, label_b, "invalid", invalid_fcn
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
def test_unit_validation(self, basic_texlabel):
|
|
427
|
+
"""Test unit validation for comparison labels."""
|
|
428
|
+
# Same units should work
|
|
429
|
+
label_b = labels_base.TeXlabel(("v", "y", "p")) # Same units as basic_texlabel
|
|
430
|
+
comp = labels_special.ComparisonLable(basic_texlabel, label_b, "subtract")
|
|
431
|
+
assert comp.units == basic_texlabel.units
|
|
432
|
+
|
|
433
|
+
def test_different_units_error(self, basic_texlabel):
|
|
434
|
+
"""Test different units raise ValueError."""
|
|
435
|
+
label_b = labels_base.TeXlabel(("n", "", "p")) # Different units
|
|
436
|
+
with pytest.raises(ValueError):
|
|
437
|
+
labels_special.ComparisonLable(basic_texlabel, label_b, "subtract")
|
|
438
|
+
|
|
439
|
+
def test_string_labels(self):
|
|
440
|
+
"""Test comparison with string labels."""
|
|
441
|
+
comp = labels_special.ComparisonLable("labelA", "labelB", "add")
|
|
442
|
+
assert comp.labelA == "labelA"
|
|
443
|
+
assert comp.labelB == "labelB"
|
|
444
|
+
|
|
445
|
+
def test_type_validation(self):
|
|
446
|
+
"""Test type validation for labels."""
|
|
447
|
+
with pytest.raises(TypeError):
|
|
448
|
+
labels_special.ComparisonLable(123, "labelB", "add")
|
|
449
|
+
|
|
450
|
+
with pytest.raises(TypeError):
|
|
451
|
+
labels_special.ComparisonLable("labelA", 456, "add")
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
class TestXcorr:
|
|
455
|
+
"""Test Xcorr (cross-correlation) label class."""
|
|
456
|
+
|
|
457
|
+
def test_basic_xcorr(self, basic_texlabel):
|
|
458
|
+
"""Test basic cross-correlation label."""
|
|
459
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
460
|
+
xcorr = labels_special.Xcorr(basic_texlabel, label_b, "pearson")
|
|
461
|
+
assert xcorr.labelA == basic_texlabel
|
|
462
|
+
assert xcorr.labelB == label_b
|
|
463
|
+
assert xcorr.method == "Pearson" # Should be title case
|
|
464
|
+
|
|
465
|
+
def test_short_tex_format(self, basic_texlabel):
|
|
466
|
+
"""Test short TeX format."""
|
|
467
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
468
|
+
xcorr = labels_special.Xcorr(basic_texlabel, label_b, "pearson", short_tex=True)
|
|
469
|
+
assert xcorr.short_tex is True
|
|
470
|
+
assert r"\rho_" in xcorr.tex
|
|
471
|
+
|
|
472
|
+
def test_long_tex_format(self, basic_texlabel):
|
|
473
|
+
"""Test long TeX format."""
|
|
474
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
475
|
+
xcorr = labels_special.Xcorr(
|
|
476
|
+
basic_texlabel, label_b, "pearson", short_tex=False
|
|
477
|
+
)
|
|
478
|
+
assert xcorr.short_tex is False
|
|
479
|
+
assert r"\mathrm{" in xcorr.tex
|
|
480
|
+
|
|
481
|
+
def test_method_title_case(self, basic_texlabel):
|
|
482
|
+
"""Test method conversion to title case."""
|
|
483
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
484
|
+
xcorr = labels_special.Xcorr(basic_texlabel, label_b, "spearman")
|
|
485
|
+
assert xcorr.method == "Spearman"
|
|
486
|
+
|
|
487
|
+
def test_units(self, basic_texlabel):
|
|
488
|
+
"""Test cross-correlation units."""
|
|
489
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
490
|
+
xcorr = labels_special.Xcorr(basic_texlabel, label_b, "pearson")
|
|
491
|
+
assert xcorr.units == r"\#"
|
|
492
|
+
|
|
493
|
+
def test_path_generation(self, basic_texlabel):
|
|
494
|
+
"""Test path generation."""
|
|
495
|
+
label_b = labels_base.TeXlabel(("n", "", "p"))
|
|
496
|
+
xcorr = labels_special.Xcorr(basic_texlabel, label_b, "pearson")
|
|
497
|
+
path_str = str(xcorr.path)
|
|
498
|
+
assert "XcorrPearson" in path_str
|
|
499
|
+
|
|
500
|
+
def test_string_labels(self):
|
|
501
|
+
"""Test cross-correlation with string labels."""
|
|
502
|
+
xcorr = labels_special.Xcorr("labelA", "labelB", "kendall")
|
|
503
|
+
assert xcorr.labelA == "labelA"
|
|
504
|
+
assert xcorr.labelB == "labelB"
|
|
505
|
+
|
|
506
|
+
def test_type_validation(self):
|
|
507
|
+
"""Test type validation for xcorr labels."""
|
|
508
|
+
with pytest.raises(TypeError):
|
|
509
|
+
labels_special.Xcorr(123, "labelB", "pearson")
|
|
510
|
+
|
|
511
|
+
with pytest.raises(TypeError):
|
|
512
|
+
labels_special.Xcorr("labelA", 456, "pearson")
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
class TestArbitraryLabel:
|
|
516
|
+
"""Test ArbitraryLabel abstract base class."""
|
|
517
|
+
|
|
518
|
+
def test_abstract_methods(self):
|
|
519
|
+
"""Test that ArbitraryLabel cannot be instantiated directly."""
|
|
520
|
+
with pytest.raises(TypeError):
|
|
521
|
+
labels_special.ArbitraryLabel()
|
|
522
|
+
|
|
523
|
+
def test_inheritance_structure(self):
|
|
524
|
+
"""Test inheritance from base.Base."""
|
|
525
|
+
# ManualLabel inherits from ArbitraryLabel
|
|
526
|
+
manual = labels_special.ManualLabel("test", "units")
|
|
527
|
+
assert hasattr(manual, "logger") # Inherited from base.Base
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
# Test integration between different label types
|
|
531
|
+
class TestLabelIntegration:
|
|
532
|
+
"""Test integration between different label types."""
|
|
533
|
+
|
|
534
|
+
def test_mixed_label_comparison(self, basic_texlabel):
|
|
535
|
+
"""Test comparison using mixed label types."""
|
|
536
|
+
manual = labels_special.ManualLabel("Custom", "units")
|
|
537
|
+
comp = labels_special.ComparisonLable(basic_texlabel, manual, "add")
|
|
538
|
+
# Should work without error
|
|
539
|
+
|
|
540
|
+
def test_probability_with_manual_label(self):
|
|
541
|
+
"""Test probability with manual label."""
|
|
542
|
+
manual = labels_special.ManualLabel("Test", "units")
|
|
543
|
+
prob = labels_special.Probability(manual, "> 0")
|
|
544
|
+
assert prob.other_label == manual
|
|
545
|
+
|
|
546
|
+
def test_math_function_with_vsw(self):
|
|
547
|
+
"""Test math function with Vsw label."""
|
|
548
|
+
vsw = labels_special.Vsw()
|
|
549
|
+
math_fcn = labels_special.MathFcn("log", vsw)
|
|
550
|
+
assert "V_\\mathrm{SW}" in math_fcn.tex
|