solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solarwindpy might be problematic. Click here for more details.
- plans/.velocity/metrics.json +96 -0
- plans/0-overview-template.md +268 -0
- plans/N-phase-template.md +106 -0
- plans/PLAN_AUDIT_SUMMARY.md +173 -0
- plans/TEMPLATE-USAGE-GUIDE.md +198 -0
- plans/__init__.py +1 -0
- plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
- plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
- plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
- plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
- plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
- plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
- plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
- plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
- plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
- plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
- plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
- plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
- plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
- plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
- plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
- plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
- plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
- plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
- plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
- plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
- plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
- plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
- plans/cicd-architecture-redesign/0-Overview.md +193 -0
- plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
- plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
- plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
- plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
- plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
- plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
- plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
- plans/cicd-architecture-redesign/8-Documentation.md +285 -0
- plans/cicd-architecture-redesign/Closeout.md +225 -0
- plans/closeout-template.md +259 -0
- plans/completed/circular-import-audit/0-Overview.md +152 -0
- plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
- plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
- plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
- plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
- plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
- plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
- plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
- plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
- plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
- plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
- plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
- plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
- plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
- plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
- plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
- plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
- plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
- plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
- plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
- plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
- plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
- plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
- plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
- plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
- plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
- plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
- plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
- plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
- plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
- plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
- plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
- plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
- plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
- plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
- plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
- plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
- plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
- plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
- plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
- plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
- plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
- plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
- plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
- plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
- plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
- plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
- plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
- plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
- plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
- plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
- plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
- plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
- plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
- plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
- plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
- plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
- plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
- plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
- plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
- plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
- plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
- plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
- plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
- plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
- plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
- plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
- plans/completed/pr-review-remediation/0-Overview.md +138 -0
- plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
- plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
- plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
- plans/completed/pr-review-remediation/compacted_state.md +66 -0
- plans/completed/python-310-migration/0-Overview.md +390 -0
- plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
- plans/completed/python-310-migration/2-Implementation.md +256 -0
- plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
- plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
- plans/completed/python-310-migration/5-Closeout.md +252 -0
- plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
- plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
- plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
- plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
- plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
- plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
- plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
- plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
- plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
- plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
- plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
- plans/completed/test-directory-consolidation/0-Overview.md +51 -0
- plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
- plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
- plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
- plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
- plans/completed/test-directory-consolidation/5-Validation.md +152 -0
- plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
- plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
- plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
- plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
- plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
- plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
- plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
- plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
- plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
- plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
- plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
- plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
- plans/documentation-code-audit/0-Overview.md +393 -0
- plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
- plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
- plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
- plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
- plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
- plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
- plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
- plans/documentation-code-audit/8-Closeout.md +456 -0
- plans/documentation-rebuild-session/compacted_state.md +109 -0
- plans/documentation-rendering-fixes/0-Overview.md +104 -0
- plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
- plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
- plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
- plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
- plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
- plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
- plans/documentation-rendering-fixes/compacted_state.md +132 -0
- plans/documentation-template-fix/0-Overview.md +197 -0
- plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
- plans/documentation-template-fix/2-Template-Modification.md +609 -0
- plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
- plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
- plans/documentation-template-fix/5-Documentation-Training.md +602 -0
- plans/documentation-workflow-fix/0-Overview.md +222 -0
- plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
- plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
- plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
- plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
- plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
- plans/duplicate-object-warnings-fix-plan.md +130 -0
- plans/github-issues-migration/0-Overview.md +510 -0
- plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
- plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
- plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
- plans/github-issues-migration/4-Validated-Migration.md +252 -0
- plans/github-issues-migration/5-Documentation-Training.md +171 -0
- plans/github-issues-migration/6-Closeout.md +179 -0
- plans/github-workflows-repair/repair-plan.md +299 -0
- plans/issues_from_plans.py +342 -0
- plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
- plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
- plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
- plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
- plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
- plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
- plans/python-310-migration/0-Overview.md +390 -0
- plans/python-310-migration/1-Planning-Setup.md +164 -0
- plans/python-310-migration/2-Implementation.md +256 -0
- plans/python-310-migration/3-Testing-Validation.md +335 -0
- plans/python-310-migration/4-Documentation-Release.md +274 -0
- plans/python-310-migration/5-Closeout.md +252 -0
- plans/readthedocs-simplified/0-Overview.md +243 -0
- plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
- plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
- plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
- plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
- plans/readthedocs-simplified/5-Closeout.md +231 -0
- plans/readthedocs-simplified/compacted_state.md +127 -0
- plans/session-compaction-2025-08-12/compacted_state.md +114 -0
- plans/session-compaction-2025-08-13/compacted_state.md +145 -0
- plans/session-continuity-protocol/0-Overview.md +35 -0
- plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
- plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
- plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
- plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
- plans/sphinx-warnings-analysis.md +222 -0
- plans/systemprompt-optimization/0-Overview.md +447 -0
- plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
- plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
- plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
- plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
- plans/systemprompt-optimization/9-Closeout.md +165 -0
- plans/systemprompt-optimization/compacted_state.md +143 -0
- plans/template-value-propositions/0-Overview.md +357 -0
- plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
- plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
- plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
- plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
- plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
- plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
- plans/tests-audit/0-Overview.md +410 -0
- plans/tests-audit/1-Discovery-Inventory.md +170 -0
- plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
- plans/tests-audit/3-Architecture-Compliance.md +195 -0
- plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
- plans/tests-audit/5-Documentation-Enhancement.md +220 -0
- plans/tests-audit/6-Audit-Deliverables.md +220 -0
- plans/tests-audit/7-Closeout.md +252 -0
- plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
- plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
- plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
- plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
- plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
- plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
- plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
- plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
- plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
- plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
- plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
- plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
- plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
- plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
- plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
- plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
- plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
- plans/tests-audit/artifacts/test_parser.py +395 -0
- solarwindpy/README.md +3 -0
- solarwindpy/Untitled.ipynb +54 -0
- solarwindpy/__init__.py +74 -0
- solarwindpy/core/__init__.py +23 -0
- solarwindpy/core/alfvenic_turbulence.py +804 -0
- solarwindpy/core/base.py +267 -0
- solarwindpy/core/ions.py +309 -0
- solarwindpy/core/plasma.py +2133 -0
- solarwindpy/core/spacecraft.py +256 -0
- solarwindpy/core/tensor.py +90 -0
- solarwindpy/core/units_constants.py +199 -0
- solarwindpy/core/vector.py +328 -0
- solarwindpy/fitfunctions/__init__.py +20 -0
- solarwindpy/fitfunctions/core.py +734 -0
- solarwindpy/fitfunctions/exponentials.py +188 -0
- solarwindpy/fitfunctions/gaussians.py +264 -0
- solarwindpy/fitfunctions/lines.py +116 -0
- solarwindpy/fitfunctions/moyal.py +71 -0
- solarwindpy/fitfunctions/plots.py +751 -0
- solarwindpy/fitfunctions/power_laws.py +209 -0
- solarwindpy/fitfunctions/tex_info.py +568 -0
- solarwindpy/fitfunctions/trend_fits.py +482 -0
- solarwindpy/instabilities/__init__.py +16 -0
- solarwindpy/instabilities/beta_ani.py +82 -0
- solarwindpy/instabilities/verscharen2016.py +631 -0
- solarwindpy/plotting/__init__.py +33 -0
- solarwindpy/plotting/agg_plot.py +489 -0
- solarwindpy/plotting/base.py +465 -0
- solarwindpy/plotting/hist1d.py +405 -0
- solarwindpy/plotting/hist2d.py +1035 -0
- solarwindpy/plotting/histograms.py +1845 -0
- solarwindpy/plotting/labels/__init__.py +104 -0
- solarwindpy/plotting/labels/base.py +686 -0
- solarwindpy/plotting/labels/chemistry.py +19 -0
- solarwindpy/plotting/labels/composition.py +100 -0
- solarwindpy/plotting/labels/datetime.py +235 -0
- solarwindpy/plotting/labels/elemental_abundance.py +73 -0
- solarwindpy/plotting/labels/special.py +794 -0
- solarwindpy/plotting/orbits.py +515 -0
- solarwindpy/plotting/scatter.py +99 -0
- solarwindpy/plotting/select_data_from_figure.py +329 -0
- solarwindpy/plotting/spiral.py +980 -0
- solarwindpy/plotting/tools.py +434 -0
- solarwindpy/scripts/__init__.py +1 -0
- solarwindpy/scripts/logs/.gitignore +1 -0
- solarwindpy/solar_activity/__init__.py +53 -0
- solarwindpy/solar_activity/base.py +605 -0
- solarwindpy/solar_activity/lisird/__init__.py +3 -0
- solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
- solarwindpy/solar_activity/lisird/lisird.py +319 -0
- solarwindpy/solar_activity/plots.py +116 -0
- solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
- solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
- solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
- solarwindpy/tools/__init__.py +162 -0
- solarwindpy-0.1.0.dist-info/METADATA +181 -0
- solarwindpy-0.1.0.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.0.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.0.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.0.dist-info/top_level.txt +3 -0
- tests/__init__.py +1 -0
- tests/conftest.py +10 -0
- tests/core/__init__.py +1 -0
- tests/core/test_alfvenic_turbulence.py +544 -0
- tests/core/test_base.py +112 -0
- tests/core/test_base_head_tail.py +29 -0
- tests/core/test_base_mi_tuples.py +11 -0
- tests/core/test_core_verify_datetimeindex.py +32 -0
- tests/core/test_ions.py +325 -0
- tests/core/test_plasma.py +2581 -0
- tests/core/test_plasma_io.py +12 -0
- tests/core/test_quantities.py +507 -0
- tests/core/test_spacecraft.py +210 -0
- tests/core/test_units_constants.py +22 -0
- tests/data/epoch.csv +4 -0
- tests/data/plasma.csv +4 -0
- tests/data/spacecraft.csv +4 -0
- tests/fitfunctions/conftest.py +60 -0
- tests/fitfunctions/test_core.py +193 -0
- tests/fitfunctions/test_exponentials.py +342 -0
- tests/fitfunctions/test_gaussians.py +142 -0
- tests/fitfunctions/test_lines.py +349 -0
- tests/fitfunctions/test_moyal.py +258 -0
- tests/fitfunctions/test_plots.py +258 -0
- tests/fitfunctions/test_power_laws.py +365 -0
- tests/fitfunctions/test_tex_info.py +183 -0
- tests/fitfunctions/test_trend_fit_properties.py +31 -0
- tests/fitfunctions/test_trend_fits.py +244 -0
- tests/plotting/__init__.py +1 -0
- tests/plotting/labels/__init__.py +1 -0
- tests/plotting/labels/test_chemistry.py +243 -0
- tests/plotting/labels/test_composition.py +345 -0
- tests/plotting/labels/test_datetime.py +445 -0
- tests/plotting/labels/test_elemental_abundance.py +366 -0
- tests/plotting/labels/test_init.py +66 -0
- tests/plotting/labels/test_labels_base.py +347 -0
- tests/plotting/labels/test_special.py +550 -0
- tests/plotting/test_agg_plot.py +602 -0
- tests/plotting/test_base.py +752 -0
- tests/plotting/test_fixtures_utilities.py +775 -0
- tests/plotting/test_histograms.py +546 -0
- tests/plotting/test_integration.py +675 -0
- tests/plotting/test_orbits.py +435 -0
- tests/plotting/test_performance.py +708 -0
- tests/plotting/test_scatter.py +752 -0
- tests/plotting/test_select_data_from_figure.py +1209 -0
- tests/plotting/test_spiral.py +573 -0
- tests/plotting/test_tools.py +607 -0
- tests/plotting/test_visual_validation.py +465 -0
- tests/solar_activity/__init__.py +1 -0
- tests/solar_activity/lisird/__init__.py +1 -0
- tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
- tests/solar_activity/lisird/test_lisird_id.py +187 -0
- tests/solar_activity/sunspot_number/__init__.py +1 -0
- tests/solar_activity/sunspot_number/test_init.py +399 -0
- tests/solar_activity/sunspot_number/test_sidc.py +465 -0
- tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
- tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
- tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
- tests/solar_activity/test_base.py +656 -0
- tests/solar_activity/test_init.py +396 -0
- tests/solar_activity/test_plots.py +371 -0
- tests/test_circular_imports.py +408 -0
- tests/test_issue_titles.py +25 -0
- tests/test_statusline.py +298 -0
- solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
- solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
- solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import importlib.util
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
import pytest
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@pytest.fixture(scope="module")
|
|
8
|
+
def labels_base():
|
|
9
|
+
"""Load :mod:`solarwindpy.plotting.labels.base` without side effects."""
|
|
10
|
+
path = (
|
|
11
|
+
Path(__file__).resolve().parents[3]
|
|
12
|
+
/ "solarwindpy"
|
|
13
|
+
/ "plotting"
|
|
14
|
+
/ "labels"
|
|
15
|
+
/ "base.py"
|
|
16
|
+
)
|
|
17
|
+
spec = importlib.util.spec_from_file_location("swp_labels_base", path)
|
|
18
|
+
module = importlib.util.module_from_spec(spec)
|
|
19
|
+
spec.loader.exec_module(module)
|
|
20
|
+
return module
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture()
|
|
24
|
+
def texlabel_basic(labels_base):
|
|
25
|
+
"""Return a typical :class:`TeXlabel` instance."""
|
|
26
|
+
return labels_base.TeXlabel(("v", "x", "p"))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.fixture()
|
|
30
|
+
def texlabel_ratio(labels_base):
|
|
31
|
+
"""Return a ratio :class:`TeXlabel` instance."""
|
|
32
|
+
return labels_base.TeXlabel(("v", "x", "p"), ("n", "", "p"))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@pytest.fixture()
|
|
36
|
+
def texlabel_with_axnorm(labels_base):
|
|
37
|
+
"""Return a :class:`TeXlabel` instance with axis normalization."""
|
|
38
|
+
return labels_base.TeXlabel(("n", "", "p"), axnorm="c")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture()
|
|
42
|
+
def texlabel_with_error(labels_base):
|
|
43
|
+
"""Return a :class:`TeXlabel` instance with error measurement."""
|
|
44
|
+
return labels_base.TeXlabel(("v_err", "x", "p"))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.fixture()
|
|
48
|
+
def texlabel_newline_units(labels_base):
|
|
49
|
+
"""Return a :class:`TeXlabel` instance with newline for units."""
|
|
50
|
+
return labels_base.TeXlabel(("T", "", "p"), new_line_for_units=True)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_run_species_substitution(labels_base):
|
|
54
|
+
"""Verify direct species substitution helper."""
|
|
55
|
+
cases = {
|
|
56
|
+
"p": ("p", 1),
|
|
57
|
+
"p1+p2": ("p_1+p_2", 2),
|
|
58
|
+
"a+p1": ("\\alpha+p_1", 2),
|
|
59
|
+
"Fe": ("\\mathrm{Fe}", 1),
|
|
60
|
+
}
|
|
61
|
+
for pattern, expected in cases.items():
|
|
62
|
+
assert labels_base._run_species_substitution(pattern) == expected
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_texlabel_attributes(texlabel_basic):
|
|
66
|
+
"""Check attributes of a typical :class:`TeXlabel`."""
|
|
67
|
+
assert texlabel_basic.tex == "{v}_{{X};{p}}"
|
|
68
|
+
assert texlabel_basic.units == "\\mathrm{km \\; s^{-1}}"
|
|
69
|
+
assert texlabel_basic.path == Path("v_x_p")
|
|
70
|
+
assert (
|
|
71
|
+
texlabel_basic.with_units
|
|
72
|
+
== "${v}_{{X};{p}} \\; \\left[\\mathrm{km \\; s^{-1}}\\right]$"
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_texlabel_ratio_attributes(texlabel_ratio):
|
|
77
|
+
"""Check attributes of a ratio :class:`TeXlabel`."""
|
|
78
|
+
assert texlabel_ratio.tex == "{v}_{{X};{p}}/n_{p}"
|
|
79
|
+
assert texlabel_ratio.units == "\\mathrm{km \\; s^{-1}}/\\mathrm{cm}^{-3}"
|
|
80
|
+
assert texlabel_ratio.path == Path("v_x_p-OV-n_p")
|
|
81
|
+
assert (
|
|
82
|
+
texlabel_ratio.with_units
|
|
83
|
+
== "${v}_{{X};{p}}/n_{p} \\; \\left[\\mathrm{km \\; s^{-1}}/\\mathrm{cm}^{-3}\\right]$"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_texlabel_equality_and_hash(texlabel_basic, texlabel_ratio, labels_base):
|
|
88
|
+
"""Ensure equality and hashing are based on ``str``."""
|
|
89
|
+
same_basic = labels_base.TeXlabel(("v", "x", "p"))
|
|
90
|
+
same_ratio = labels_base.TeXlabel(("v", "x", "p"), ("n", "", "p"))
|
|
91
|
+
|
|
92
|
+
assert texlabel_basic == same_basic
|
|
93
|
+
assert hash(texlabel_basic) == hash(same_basic)
|
|
94
|
+
|
|
95
|
+
assert texlabel_ratio == same_ratio
|
|
96
|
+
assert hash(texlabel_ratio) == hash(same_ratio)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_texlabel_comparison_operators(texlabel_basic, labels_base):
|
|
100
|
+
"""Test comparison operators for TeXlabel objects."""
|
|
101
|
+
label_a = labels_base.TeXlabel(("a", "x", "p")) # Alphabetically first
|
|
102
|
+
label_z = labels_base.TeXlabel(("z", "x", "p")) # Alphabetically last
|
|
103
|
+
|
|
104
|
+
assert label_a < label_z
|
|
105
|
+
assert label_a <= label_z
|
|
106
|
+
assert label_z > label_a
|
|
107
|
+
assert label_z >= label_a
|
|
108
|
+
assert label_a != label_z
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_texlabel_axnorm_types(labels_base):
|
|
112
|
+
"""Test different axis normalization types."""
|
|
113
|
+
test_cases = [
|
|
114
|
+
("c", "Col."),
|
|
115
|
+
("r", "Row"),
|
|
116
|
+
("t", "Total"),
|
|
117
|
+
("d", "Density"),
|
|
118
|
+
(None, ""),
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
for axnorm, expected_prefix in test_cases:
|
|
122
|
+
label = labels_base.TeXlabel(("n", "", "p"), axnorm=axnorm)
|
|
123
|
+
if axnorm:
|
|
124
|
+
assert expected_prefix in label.tex
|
|
125
|
+
assert label.units == "\\#"
|
|
126
|
+
else:
|
|
127
|
+
assert label.units == "\\mathrm{cm}^{-3}"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_texlabel_error_measurement(texlabel_with_error):
|
|
131
|
+
"""Test error measurement handling."""
|
|
132
|
+
assert "\\sigma" in texlabel_with_error.tex
|
|
133
|
+
assert "{v}_{{X};{p}}" in texlabel_with_error.tex
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def test_texlabel_newline_units(texlabel_newline_units):
|
|
137
|
+
"""Test newline separation for units."""
|
|
138
|
+
assert "$\n$" in texlabel_newline_units.with_units
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_species_substitution_comprehensive(labels_base):
|
|
142
|
+
"""Test comprehensive species substitution patterns."""
|
|
143
|
+
test_cases = {
|
|
144
|
+
"p": ("p", 1),
|
|
145
|
+
"p1": ("p_1", 1),
|
|
146
|
+
"p2": ("p_2", 1),
|
|
147
|
+
"a": ("\\alpha", 1),
|
|
148
|
+
"a1": ("\\alpha_1", 1),
|
|
149
|
+
"a2": ("\\alpha_2", 1),
|
|
150
|
+
"e": ("e^-", 1),
|
|
151
|
+
"he": ("\\mathrm{He}", 1),
|
|
152
|
+
"Fe": ("\\mathrm{Fe}", 1),
|
|
153
|
+
"3He": ("^{3}\\mathrm{He}", 1),
|
|
154
|
+
"16O": ("^{16}\\mathrm{O}", 1),
|
|
155
|
+
"p1+p2": ("p_1+p_2", 2),
|
|
156
|
+
"a+Fe": ("\\alpha+\\mathrm{Fe}", 2),
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
for pattern, expected in test_cases.items():
|
|
160
|
+
result = labels_base._run_species_substitution(pattern)
|
|
161
|
+
assert result == expected, f"Failed for pattern '{pattern}'"
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_measurement_translation(labels_base):
|
|
165
|
+
"""Test measurement translation."""
|
|
166
|
+
test_cases = {
|
|
167
|
+
("beta", "", "p"): "\\beta",
|
|
168
|
+
("theta", "", "p"): "\\theta",
|
|
169
|
+
("pth", "", "p"): "P",
|
|
170
|
+
("dv", "", "p"): "\\Delta v",
|
|
171
|
+
("qhat", "", "p"): "\\widehat{q}",
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for mcs, expected_tex_part in test_cases.items():
|
|
175
|
+
label = labels_base.TeXlabel(mcs)
|
|
176
|
+
assert expected_tex_part in label.tex
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def test_component_translation(labels_base):
|
|
180
|
+
"""Test component translation."""
|
|
181
|
+
test_cases = {
|
|
182
|
+
("v", "x", "p"): "X",
|
|
183
|
+
("v", "y", "p"): "Y",
|
|
184
|
+
("v", "z", "p"): "Z",
|
|
185
|
+
("v", "r", "p"): "R",
|
|
186
|
+
("v", "per", "p"): "\\perp",
|
|
187
|
+
("v", "par", "p"): "\\parallel",
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
for mcs, expected_component in test_cases.items():
|
|
191
|
+
label = labels_base.TeXlabel(mcs)
|
|
192
|
+
assert expected_component in label.tex
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def test_units_translation(labels_base):
|
|
196
|
+
"""Test units translation."""
|
|
197
|
+
test_cases = {
|
|
198
|
+
("v", "x", "p"): "\\mathrm{km \\; s^{-1}}",
|
|
199
|
+
("n", "", "p"): "\\mathrm{cm}^{-3}",
|
|
200
|
+
("b", "x", ""): "\\mathrm{nT}",
|
|
201
|
+
("T", "", "p"): "10^5 \\, \\mathrm{K}",
|
|
202
|
+
("beta", "", "p"): "\\mathrm{\\#}",
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
for mcs, expected_units in test_cases.items():
|
|
206
|
+
label = labels_base.TeXlabel(mcs)
|
|
207
|
+
assert label.units == expected_units
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def test_path_generation(labels_base):
|
|
211
|
+
"""Test path generation for different inputs."""
|
|
212
|
+
test_cases = {
|
|
213
|
+
("v", "x", "p"): "v_x_p",
|
|
214
|
+
("n", "", "p"): "n_p",
|
|
215
|
+
("b", "x", ""): "b_x", # Fixed - empty strings are stripped
|
|
216
|
+
("beta", "", ""): "beta",
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
for mcs, expected_path in test_cases.items():
|
|
220
|
+
label = labels_base.TeXlabel(mcs)
|
|
221
|
+
assert str(label.path) == expected_path
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def test_ratio_label_same_units(labels_base):
|
|
225
|
+
"""Test ratio labels with same units become dimensionless."""
|
|
226
|
+
# Same measurement, different components - same units
|
|
227
|
+
label = labels_base.TeXlabel(("v", "x", "p"), ("v", "y", "p"))
|
|
228
|
+
assert label.units == "\\#"
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def test_ratio_label_different_units(labels_base):
|
|
232
|
+
"""Test ratio labels with different units."""
|
|
233
|
+
# Different measurements - different units
|
|
234
|
+
label = labels_base.TeXlabel(("v", "x", "p"), ("n", "", "p"))
|
|
235
|
+
expected_units = "\\mathrm{km \\; s^{-1}}/\\mathrm{cm}^{-3}"
|
|
236
|
+
assert label.units == expected_units
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def test_template_substitution(labels_base):
|
|
240
|
+
"""Test template substitution for complex measurements."""
|
|
241
|
+
# Test specific template
|
|
242
|
+
label = labels_base.TeXlabel(("cs", "", "p"))
|
|
243
|
+
assert "C_{s;p}" in label.tex
|
|
244
|
+
|
|
245
|
+
# Test default template
|
|
246
|
+
label = labels_base.TeXlabel(("unknown_measurement", "x", "p"))
|
|
247
|
+
assert "{unknown_measurement}_{{X};{p}}" in label.tex
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def test_tex_cleanup(labels_base):
|
|
251
|
+
"""Test TeX string cleanup operations."""
|
|
252
|
+
# Test empty component cleanup
|
|
253
|
+
label = labels_base.TeXlabel(("v", "", "p"))
|
|
254
|
+
assert "{}" not in label.tex
|
|
255
|
+
assert "()" not in label.tex
|
|
256
|
+
|
|
257
|
+
# Test empty species cleanup
|
|
258
|
+
label = labels_base.TeXlabel(("v", "x", ""))
|
|
259
|
+
assert "_;{}" not in label.tex
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def test_base_class_properties(labels_base):
|
|
263
|
+
"""Test Base class properties and methods."""
|
|
264
|
+
base_instance = labels_base.TeXlabel(("v", "x", "p"))
|
|
265
|
+
|
|
266
|
+
# Test logger
|
|
267
|
+
assert hasattr(base_instance, "logger")
|
|
268
|
+
assert isinstance(base_instance.logger, logging.Logger)
|
|
269
|
+
|
|
270
|
+
# Test string representations
|
|
271
|
+
assert str(base_instance) == base_instance.with_units
|
|
272
|
+
assert repr(base_instance) == str(base_instance.tex)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def test_mcs_namedtuple(labels_base):
|
|
276
|
+
"""Test MCS namedtuple functionality."""
|
|
277
|
+
mcs = labels_base.MCS("v", "x", "p")
|
|
278
|
+
assert mcs.m == "v"
|
|
279
|
+
assert mcs.c == "x"
|
|
280
|
+
assert mcs.s == "p"
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def test_texlabel_set_methods(labels_base):
|
|
284
|
+
"""Test TeXlabel setter methods."""
|
|
285
|
+
label = labels_base.TeXlabel(("v", "x", "p"))
|
|
286
|
+
|
|
287
|
+
# Test set_axnorm
|
|
288
|
+
label.set_axnorm("r")
|
|
289
|
+
assert label.axnorm == "r"
|
|
290
|
+
|
|
291
|
+
label.set_axnorm("C") # Test case conversion
|
|
292
|
+
assert label.axnorm == "c"
|
|
293
|
+
|
|
294
|
+
# Test set_new_line_for_units
|
|
295
|
+
label.set_new_line_for_units(True)
|
|
296
|
+
assert label.new_line_for_units is True
|
|
297
|
+
|
|
298
|
+
label.set_new_line_for_units(0) # Test bool conversion
|
|
299
|
+
assert label.new_line_for_units is False
|
|
300
|
+
|
|
301
|
+
# Test set_mcs
|
|
302
|
+
label.set_mcs(("n", "", "p"), ("T", "", "p"))
|
|
303
|
+
assert label.mcs0.m == "n"
|
|
304
|
+
assert label.mcs1.m == "T"
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def test_axnorm_validation(labels_base):
|
|
308
|
+
"""Test axis normalization validation."""
|
|
309
|
+
valid_values = [None, "c", "r", "t", "d"]
|
|
310
|
+
|
|
311
|
+
for val in valid_values:
|
|
312
|
+
label = labels_base.TeXlabel(("v", "x", "p"), axnorm=val)
|
|
313
|
+
assert label.axnorm == val
|
|
314
|
+
|
|
315
|
+
# Test invalid axnorm
|
|
316
|
+
with pytest.raises(AssertionError):
|
|
317
|
+
labels_base.TeXlabel(("v", "x", "p"), axnorm="invalid")
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def test_path_special_characters(labels_base):
|
|
321
|
+
"""Test path handling with special characters."""
|
|
322
|
+
# Test forward slash replacement
|
|
323
|
+
label = labels_base.TeXlabel(("test/measurement", "x", "p"))
|
|
324
|
+
assert "-OV-" in str(label.path)
|
|
325
|
+
|
|
326
|
+
# Test comma and dot removal
|
|
327
|
+
label = labels_base.TeXlabel(("test.measurement", "x", "p,ion"))
|
|
328
|
+
path_str = str(label.path)
|
|
329
|
+
assert "." not in path_str
|
|
330
|
+
assert "," not in path_str
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def test_empty_string_handling(labels_base):
|
|
334
|
+
"""Test handling of empty strings in MCS components."""
|
|
335
|
+
cases = [
|
|
336
|
+
("", "x", "p"), # Empty measurement
|
|
337
|
+
("v", "", "p"), # Empty component
|
|
338
|
+
("v", "x", ""), # Empty species
|
|
339
|
+
("", "", ""), # All empty
|
|
340
|
+
]
|
|
341
|
+
|
|
342
|
+
for mcs in cases:
|
|
343
|
+
# Should not raise exception
|
|
344
|
+
label = labels_base.TeXlabel(mcs)
|
|
345
|
+
assert hasattr(label, "tex")
|
|
346
|
+
assert hasattr(label, "units")
|
|
347
|
+
assert hasattr(label, "path")
|