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,445 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from solarwindpy.plotting.labels import datetime as datetime_labels
|
|
4
|
+
from solarwindpy.plotting.labels.special import ArbitraryLabel
|
|
5
|
+
from solarwindpy.plotting.labels.base import Base
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_timedelta_latex_and_path():
|
|
9
|
+
"""Verify ``Timedelta`` LaTeX and path string."""
|
|
10
|
+
td = datetime_labels.Timedelta("2h")
|
|
11
|
+
assert str(td.path) in ("dt-2h", "dt-2H")
|
|
12
|
+
assert str(td) in (
|
|
13
|
+
"$\\Delta t \\; [2 \\; \\mathrm{h}]$",
|
|
14
|
+
"$\\Delta t \\; [2 \\; \\mathrm{H}]$",
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_datetime_label():
|
|
19
|
+
"""Verify ``DateTime`` label formatting."""
|
|
20
|
+
dt = datetime_labels.DateTime("Day of Year")
|
|
21
|
+
assert str(dt.path) == "day-of-year"
|
|
22
|
+
assert str(dt) == "$\\mathrm{Day \\; of \\; Year}$"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_epoch_label():
|
|
26
|
+
"""Verify ``Epoch`` label formatting."""
|
|
27
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
28
|
+
assert str(epoch.path) == "Hour-of-Day"
|
|
29
|
+
assert str(epoch) == "$\\mathrm{Hour \\, of \\, Day}$"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_frequency_label():
|
|
33
|
+
"""Validate ``Frequency`` label output."""
|
|
34
|
+
freq = datetime_labels.Frequency("1h")
|
|
35
|
+
assert str(freq.path) in (
|
|
36
|
+
"frequency_of_(1 \\; \\mathrm{h})^-1",
|
|
37
|
+
"frequency_of_(1 \\; \\mathrm{H})^-1",
|
|
38
|
+
)
|
|
39
|
+
assert str(freq) in (
|
|
40
|
+
"$\\mathrm{Frequency} \\; [(1 \\; \\mathrm{h})^-1]$",
|
|
41
|
+
"$\\mathrm{Frequency} \\; [(1 \\; \\mathrm{H})^-1]$",
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_january1st_label():
|
|
46
|
+
"""Validate ``January1st`` label output."""
|
|
47
|
+
jan = datetime_labels.January1st()
|
|
48
|
+
assert str(jan.path) == "January-1st-of-Year"
|
|
49
|
+
assert str(jan) == "$\\mathrm{January \\; 1^{st} \\; of \\; Year}$"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class TestTimedelta:
|
|
53
|
+
"""Test Timedelta class functionality."""
|
|
54
|
+
|
|
55
|
+
def test_timedelta_inheritance(self):
|
|
56
|
+
"""Test that Timedelta inherits from ArbitraryLabel."""
|
|
57
|
+
td = datetime_labels.Timedelta("1h")
|
|
58
|
+
assert isinstance(td, ArbitraryLabel)
|
|
59
|
+
assert isinstance(td, Base)
|
|
60
|
+
|
|
61
|
+
def test_timedelta_various_offsets(self):
|
|
62
|
+
"""Test Timedelta with various pandas offsets."""
|
|
63
|
+
test_cases = ["1h", "2H", "30min", "1d", "5s", "10ms", "1M", "1Y", "1W", "1Q"]
|
|
64
|
+
|
|
65
|
+
for offset in test_cases:
|
|
66
|
+
td = datetime_labels.Timedelta(offset)
|
|
67
|
+
assert td.offset is not None
|
|
68
|
+
assert isinstance(td.path, Path)
|
|
69
|
+
assert r"\Delta t" in td.tex
|
|
70
|
+
|
|
71
|
+
def test_timedelta_tex_property(self):
|
|
72
|
+
"""Test TeX property of Timedelta."""
|
|
73
|
+
td = datetime_labels.Timedelta("1h")
|
|
74
|
+
assert td.tex == r"\Delta t"
|
|
75
|
+
|
|
76
|
+
def test_timedelta_invalid_offset(self):
|
|
77
|
+
"""Test Timedelta with invalid offset."""
|
|
78
|
+
td = datetime_labels.Timedelta("invalid_offset")
|
|
79
|
+
assert str(td.path) == "dt-UNK"
|
|
80
|
+
assert "???" in td.units
|
|
81
|
+
|
|
82
|
+
def test_timedelta_path_generation(self):
|
|
83
|
+
"""Test path generation for different offsets."""
|
|
84
|
+
td_hour = datetime_labels.Timedelta("1h")
|
|
85
|
+
td_day = datetime_labels.Timedelta("1d")
|
|
86
|
+
|
|
87
|
+
# Paths should be different
|
|
88
|
+
assert td_hour.path != td_day.path
|
|
89
|
+
assert "dt-" in str(td_hour.path)
|
|
90
|
+
assert "dt-" in str(td_day.path)
|
|
91
|
+
|
|
92
|
+
def test_timedelta_units_formatting(self):
|
|
93
|
+
"""Test units formatting."""
|
|
94
|
+
td = datetime_labels.Timedelta("2h")
|
|
95
|
+
units = td.units
|
|
96
|
+
assert "2" in units
|
|
97
|
+
assert "mathrm" in units
|
|
98
|
+
|
|
99
|
+
def test_timedelta_string_representation(self):
|
|
100
|
+
"""Test string representation."""
|
|
101
|
+
td = datetime_labels.Timedelta("1d")
|
|
102
|
+
str_repr = str(td)
|
|
103
|
+
assert str_repr.startswith("$")
|
|
104
|
+
assert str_repr.endswith("$")
|
|
105
|
+
assert r"\Delta t" in str_repr
|
|
106
|
+
|
|
107
|
+
def test_timedelta_with_units_property(self):
|
|
108
|
+
"""Test with_units property."""
|
|
109
|
+
td = datetime_labels.Timedelta("1h")
|
|
110
|
+
with_units = td.with_units
|
|
111
|
+
assert r"\Delta t" in with_units
|
|
112
|
+
assert "[" in with_units
|
|
113
|
+
assert "]" in with_units
|
|
114
|
+
|
|
115
|
+
def test_timedelta_set_offset(self):
|
|
116
|
+
"""Test set_offset method."""
|
|
117
|
+
td = datetime_labels.Timedelta("1h")
|
|
118
|
+
original_offset = td.offset
|
|
119
|
+
|
|
120
|
+
# Test setting new offset
|
|
121
|
+
td.set_offset("2d")
|
|
122
|
+
assert td.offset != original_offset
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class TestDateTime:
|
|
126
|
+
"""Test DateTime class functionality."""
|
|
127
|
+
|
|
128
|
+
def test_datetime_inheritance(self):
|
|
129
|
+
"""Test that DateTime inherits from ArbitraryLabel."""
|
|
130
|
+
dt = datetime_labels.DateTime("Year")
|
|
131
|
+
assert isinstance(dt, ArbitraryLabel)
|
|
132
|
+
assert isinstance(dt, Base)
|
|
133
|
+
|
|
134
|
+
def test_datetime_various_kinds(self):
|
|
135
|
+
"""Test DateTime with various kinds."""
|
|
136
|
+
test_cases = [
|
|
137
|
+
"Year",
|
|
138
|
+
"Month",
|
|
139
|
+
"Day",
|
|
140
|
+
"Hour",
|
|
141
|
+
"Minute",
|
|
142
|
+
"Second",
|
|
143
|
+
"Day of Year",
|
|
144
|
+
"Hour of Day",
|
|
145
|
+
"Fractional Day",
|
|
146
|
+
]
|
|
147
|
+
|
|
148
|
+
for kind in test_cases:
|
|
149
|
+
dt = datetime_labels.DateTime(kind)
|
|
150
|
+
assert dt.kind == kind
|
|
151
|
+
assert isinstance(dt.path, Path)
|
|
152
|
+
assert r"\mathrm{" in dt.tex
|
|
153
|
+
|
|
154
|
+
def test_datetime_tex_formatting(self):
|
|
155
|
+
"""Test TeX formatting with spaces."""
|
|
156
|
+
dt = datetime_labels.DateTime("Day of Year")
|
|
157
|
+
expected_tex = r"\mathrm{Day \; of \; Year}"
|
|
158
|
+
assert dt.tex == expected_tex
|
|
159
|
+
|
|
160
|
+
def test_datetime_path_generation(self):
|
|
161
|
+
"""Test path generation."""
|
|
162
|
+
dt = datetime_labels.DateTime("Day of Year")
|
|
163
|
+
assert str(dt.path) == "day-of-year"
|
|
164
|
+
|
|
165
|
+
dt_simple = datetime_labels.DateTime("Year")
|
|
166
|
+
assert str(dt_simple.path) == "year"
|
|
167
|
+
|
|
168
|
+
def test_datetime_string_representation(self):
|
|
169
|
+
"""Test string representation."""
|
|
170
|
+
dt = datetime_labels.DateTime("Month")
|
|
171
|
+
str_repr = str(dt)
|
|
172
|
+
assert str_repr.startswith("$")
|
|
173
|
+
assert str_repr.endswith("$")
|
|
174
|
+
assert "Month" in str_repr
|
|
175
|
+
|
|
176
|
+
def test_datetime_set_kind(self):
|
|
177
|
+
"""Test set_kind method."""
|
|
178
|
+
dt = datetime_labels.DateTime("Year")
|
|
179
|
+
assert dt.kind == "Year"
|
|
180
|
+
|
|
181
|
+
dt.set_kind("Month")
|
|
182
|
+
assert dt.kind == "Month"
|
|
183
|
+
|
|
184
|
+
def test_datetime_with_units_property(self):
|
|
185
|
+
"""Test with_units property."""
|
|
186
|
+
dt = datetime_labels.DateTime("Year")
|
|
187
|
+
with_units = dt.with_units
|
|
188
|
+
assert with_units == str(dt)
|
|
189
|
+
assert "$" in with_units
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class TestEpoch:
|
|
193
|
+
"""Test Epoch class functionality."""
|
|
194
|
+
|
|
195
|
+
def test_epoch_inheritance(self):
|
|
196
|
+
"""Test that Epoch inherits from ArbitraryLabel."""
|
|
197
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
198
|
+
assert isinstance(epoch, ArbitraryLabel)
|
|
199
|
+
assert isinstance(epoch, Base)
|
|
200
|
+
|
|
201
|
+
def test_epoch_basic_properties(self):
|
|
202
|
+
"""Test basic Epoch properties."""
|
|
203
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
204
|
+
assert epoch.smaller == "Hour"
|
|
205
|
+
assert epoch.larger == "Day"
|
|
206
|
+
assert epoch.space == r"\,"
|
|
207
|
+
|
|
208
|
+
def test_epoch_case_conversion(self):
|
|
209
|
+
"""Test case conversion for smaller and larger."""
|
|
210
|
+
epoch = datetime_labels.Epoch("hour", "day")
|
|
211
|
+
assert epoch.smaller == "Hour"
|
|
212
|
+
assert epoch.larger == "Day"
|
|
213
|
+
|
|
214
|
+
def test_epoch_tex_formatting(self):
|
|
215
|
+
"""Test TeX formatting."""
|
|
216
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
217
|
+
expected_tex = r"\mathrm{Hour \, of \, Day}"
|
|
218
|
+
assert epoch.tex == expected_tex
|
|
219
|
+
|
|
220
|
+
def test_epoch_path_generation(self):
|
|
221
|
+
"""Test path generation."""
|
|
222
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
223
|
+
assert str(epoch.path) == "Hour-of-Day"
|
|
224
|
+
|
|
225
|
+
epoch2 = datetime_labels.Epoch("Minute", "Hour")
|
|
226
|
+
assert str(epoch2.path) == "Minute-of-Hour"
|
|
227
|
+
|
|
228
|
+
def test_epoch_different_spacing(self):
|
|
229
|
+
"""Test different spacing options."""
|
|
230
|
+
spaces = [" ", r"\,", r"\;", r"\:"]
|
|
231
|
+
|
|
232
|
+
for space in spaces:
|
|
233
|
+
epoch = datetime_labels.Epoch("Hour", "Day", space=space)
|
|
234
|
+
assert epoch.space == space
|
|
235
|
+
assert space in epoch.tex
|
|
236
|
+
|
|
237
|
+
def test_epoch_invalid_space(self):
|
|
238
|
+
"""Test invalid space raises ValueError."""
|
|
239
|
+
with pytest.raises(ValueError, match="Unrecognized Space"):
|
|
240
|
+
datetime_labels.Epoch("Hour", "Day", space="invalid")
|
|
241
|
+
|
|
242
|
+
def test_epoch_string_representation(self):
|
|
243
|
+
"""Test string representation."""
|
|
244
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
245
|
+
str_repr = str(epoch)
|
|
246
|
+
assert str_repr.startswith("$")
|
|
247
|
+
assert str_repr.endswith("$")
|
|
248
|
+
assert "Hour" in str_repr
|
|
249
|
+
assert "Day" in str_repr
|
|
250
|
+
|
|
251
|
+
def test_epoch_setter_methods(self):
|
|
252
|
+
"""Test setter methods."""
|
|
253
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
254
|
+
|
|
255
|
+
epoch.set_smaller("minute")
|
|
256
|
+
assert epoch.smaller == "Minute"
|
|
257
|
+
|
|
258
|
+
epoch.set_larger("year")
|
|
259
|
+
assert epoch.larger == "Year"
|
|
260
|
+
|
|
261
|
+
epoch.set_space(r"\;")
|
|
262
|
+
assert epoch.space == r"\;"
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class TestFrequency:
|
|
266
|
+
"""Test Frequency class functionality."""
|
|
267
|
+
|
|
268
|
+
def test_frequency_inheritance(self):
|
|
269
|
+
"""Test that Frequency inherits from ArbitraryLabel."""
|
|
270
|
+
freq = datetime_labels.Frequency("1h")
|
|
271
|
+
assert isinstance(freq, ArbitraryLabel)
|
|
272
|
+
assert isinstance(freq, Base)
|
|
273
|
+
|
|
274
|
+
def test_frequency_with_string_offset(self):
|
|
275
|
+
"""Test Frequency with string offset."""
|
|
276
|
+
freq = datetime_labels.Frequency("1h")
|
|
277
|
+
assert isinstance(freq.other, datetime_labels.Timedelta)
|
|
278
|
+
assert r"\mathrm{Frequency}" in freq.tex
|
|
279
|
+
|
|
280
|
+
def test_frequency_with_timedelta_object(self):
|
|
281
|
+
"""Test Frequency with Timedelta object."""
|
|
282
|
+
td = datetime_labels.Timedelta("2d")
|
|
283
|
+
freq = datetime_labels.Frequency(td)
|
|
284
|
+
assert freq.other == td
|
|
285
|
+
|
|
286
|
+
def test_frequency_tex_property(self):
|
|
287
|
+
"""Test TeX property."""
|
|
288
|
+
freq = datetime_labels.Frequency("1h")
|
|
289
|
+
assert freq.tex == r"\mathrm{Frequency}"
|
|
290
|
+
|
|
291
|
+
def test_frequency_units_property(self):
|
|
292
|
+
"""Test units property."""
|
|
293
|
+
freq = datetime_labels.Frequency("1h")
|
|
294
|
+
units = freq.units
|
|
295
|
+
assert units.endswith("^-1") # Fixed - uses ^-1 not ^{-1}
|
|
296
|
+
assert "(" in units
|
|
297
|
+
assert ")" in units
|
|
298
|
+
|
|
299
|
+
def test_frequency_path_generation(self):
|
|
300
|
+
"""Test path generation."""
|
|
301
|
+
freq = datetime_labels.Frequency("1h")
|
|
302
|
+
path_str = str(freq.path)
|
|
303
|
+
assert "frequency_of_" in path_str
|
|
304
|
+
|
|
305
|
+
def test_frequency_with_invalid_offset(self):
|
|
306
|
+
"""Test Frequency with invalid offset."""
|
|
307
|
+
freq = datetime_labels.Frequency("invalid")
|
|
308
|
+
path_str = str(freq.path)
|
|
309
|
+
assert "UNK" in path_str or "???" in path_str
|
|
310
|
+
|
|
311
|
+
def test_frequency_string_representation(self):
|
|
312
|
+
"""Test string representation."""
|
|
313
|
+
freq = datetime_labels.Frequency("1d")
|
|
314
|
+
str_repr = str(freq)
|
|
315
|
+
assert str_repr.startswith("$")
|
|
316
|
+
assert str_repr.endswith("$")
|
|
317
|
+
assert "Frequency" in str_repr
|
|
318
|
+
assert "[" in str_repr
|
|
319
|
+
assert "]" in str_repr
|
|
320
|
+
|
|
321
|
+
def test_frequency_set_other(self):
|
|
322
|
+
"""Test set_other method."""
|
|
323
|
+
freq = datetime_labels.Frequency("1h")
|
|
324
|
+
original_other = freq.other
|
|
325
|
+
|
|
326
|
+
freq.set_other("2d")
|
|
327
|
+
assert freq.other != original_other
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
class TestJanuary1st:
|
|
331
|
+
"""Test January1st class functionality."""
|
|
332
|
+
|
|
333
|
+
def test_january1st_inheritance(self):
|
|
334
|
+
"""Test that January1st inherits from ArbitraryLabel."""
|
|
335
|
+
jan = datetime_labels.January1st()
|
|
336
|
+
assert isinstance(jan, ArbitraryLabel)
|
|
337
|
+
assert isinstance(jan, Base)
|
|
338
|
+
|
|
339
|
+
def test_january1st_tex_property(self):
|
|
340
|
+
"""Test TeX property."""
|
|
341
|
+
jan = datetime_labels.January1st()
|
|
342
|
+
expected_tex = r"\mathrm{January \; 1^{st} \; of \; Year}"
|
|
343
|
+
assert jan.tex == expected_tex
|
|
344
|
+
|
|
345
|
+
def test_january1st_path_property(self):
|
|
346
|
+
"""Test path property."""
|
|
347
|
+
jan = datetime_labels.January1st()
|
|
348
|
+
assert str(jan.path) == "January-1st-of-Year"
|
|
349
|
+
|
|
350
|
+
def test_january1st_string_representation(self):
|
|
351
|
+
"""Test string representation."""
|
|
352
|
+
jan = datetime_labels.January1st()
|
|
353
|
+
str_repr = str(jan)
|
|
354
|
+
assert str_repr.startswith("$")
|
|
355
|
+
assert str_repr.endswith("$")
|
|
356
|
+
assert "January" in str_repr
|
|
357
|
+
assert "1^{st}" in str_repr
|
|
358
|
+
assert "Year" in str_repr
|
|
359
|
+
|
|
360
|
+
def test_january1st_with_units_property(self):
|
|
361
|
+
"""Test with_units property."""
|
|
362
|
+
jan = datetime_labels.January1st()
|
|
363
|
+
with_units = jan.with_units
|
|
364
|
+
assert with_units == str(jan)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
class TestDateTimeModule:
|
|
368
|
+
"""Test module-level functionality."""
|
|
369
|
+
|
|
370
|
+
def test_module_classes(self):
|
|
371
|
+
"""Test that module has expected classes."""
|
|
372
|
+
expected_classes = ["Timedelta", "DateTime", "Epoch", "Frequency", "January1st"]
|
|
373
|
+
|
|
374
|
+
for class_name in expected_classes:
|
|
375
|
+
assert hasattr(datetime_labels, class_name)
|
|
376
|
+
cls = getattr(datetime_labels, class_name)
|
|
377
|
+
assert isinstance(cls, type)
|
|
378
|
+
|
|
379
|
+
def test_class_inheritance_chain(self):
|
|
380
|
+
"""Test inheritance chain for all classes."""
|
|
381
|
+
classes = [
|
|
382
|
+
datetime_labels.Timedelta,
|
|
383
|
+
datetime_labels.DateTime,
|
|
384
|
+
datetime_labels.Epoch,
|
|
385
|
+
datetime_labels.Frequency,
|
|
386
|
+
datetime_labels.January1st,
|
|
387
|
+
]
|
|
388
|
+
|
|
389
|
+
for cls in classes:
|
|
390
|
+
# All should inherit from ArbitraryLabel
|
|
391
|
+
assert issubclass(cls, ArbitraryLabel)
|
|
392
|
+
# All should ultimately inherit from Base
|
|
393
|
+
assert issubclass(cls, Base)
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
class TestDateTimeIntegration:
|
|
397
|
+
"""Test integration between datetime classes."""
|
|
398
|
+
|
|
399
|
+
def test_timedelta_in_frequency(self):
|
|
400
|
+
"""Test using Timedelta in Frequency."""
|
|
401
|
+
td = datetime_labels.Timedelta("1h")
|
|
402
|
+
freq = datetime_labels.Frequency(td)
|
|
403
|
+
assert freq.other == td
|
|
404
|
+
|
|
405
|
+
def test_different_epoch_combinations(self):
|
|
406
|
+
"""Test different epoch combinations."""
|
|
407
|
+
epochs = [
|
|
408
|
+
("Hour", "Day"),
|
|
409
|
+
("Minute", "Hour"),
|
|
410
|
+
("Day", "Month"),
|
|
411
|
+
("Month", "Year"),
|
|
412
|
+
]
|
|
413
|
+
|
|
414
|
+
for smaller, larger in epochs:
|
|
415
|
+
epoch = datetime_labels.Epoch(smaller, larger)
|
|
416
|
+
assert epoch.smaller == smaller
|
|
417
|
+
assert epoch.larger == larger
|
|
418
|
+
assert f"{smaller}-of-{larger}" == str(epoch.path)
|
|
419
|
+
|
|
420
|
+
def test_label_uniqueness(self):
|
|
421
|
+
"""Test that different labels generate unique paths."""
|
|
422
|
+
labels = [
|
|
423
|
+
datetime_labels.Timedelta("1h"),
|
|
424
|
+
datetime_labels.DateTime("Hour"),
|
|
425
|
+
datetime_labels.Epoch("Hour", "Day"),
|
|
426
|
+
datetime_labels.Frequency("1h"),
|
|
427
|
+
datetime_labels.January1st(),
|
|
428
|
+
]
|
|
429
|
+
|
|
430
|
+
paths = [str(label.path) for label in labels]
|
|
431
|
+
assert len(paths) == len(set(paths)) # All unique
|
|
432
|
+
|
|
433
|
+
def test_scientific_accuracy(self):
|
|
434
|
+
"""Test that labels represent scientifically accurate concepts."""
|
|
435
|
+
# Test time delta representation
|
|
436
|
+
td = datetime_labels.Timedelta("1h")
|
|
437
|
+
assert r"\Delta t" in td.tex
|
|
438
|
+
|
|
439
|
+
# Test frequency units
|
|
440
|
+
freq = datetime_labels.Frequency("1h")
|
|
441
|
+
assert "^-1" in freq.units
|
|
442
|
+
|
|
443
|
+
# Test epoch relationships
|
|
444
|
+
epoch = datetime_labels.Epoch("Hour", "Day")
|
|
445
|
+
assert "of" in epoch.tex
|