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.

Files changed (412) hide show
  1. plans/.velocity/metrics.json +96 -0
  2. plans/0-overview-template.md +268 -0
  3. plans/N-phase-template.md +106 -0
  4. plans/PLAN_AUDIT_SUMMARY.md +173 -0
  5. plans/TEMPLATE-USAGE-GUIDE.md +198 -0
  6. plans/__init__.py +1 -0
  7. plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
  8. plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
  9. plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
  10. plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
  11. plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
  12. plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
  13. plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
  14. plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
  15. plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
  16. plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
  17. plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
  18. plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
  19. plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
  20. plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
  21. plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
  22. plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
  23. plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
  24. plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
  25. plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
  26. plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
  27. plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
  28. plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
  29. plans/cicd-architecture-redesign/0-Overview.md +193 -0
  30. plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
  31. plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
  32. plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
  33. plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
  34. plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
  35. plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
  36. plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
  37. plans/cicd-architecture-redesign/8-Documentation.md +285 -0
  38. plans/cicd-architecture-redesign/Closeout.md +225 -0
  39. plans/closeout-template.md +259 -0
  40. plans/completed/circular-import-audit/0-Overview.md +152 -0
  41. plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
  42. plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
  43. plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
  44. plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
  45. plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
  46. plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
  47. plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
  48. plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
  49. plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
  50. plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
  51. plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
  52. plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
  53. plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
  54. plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
  55. plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
  56. plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
  57. plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
  58. plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
  59. plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
  60. plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
  61. plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
  62. plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
  63. plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
  64. plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
  65. plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
  66. plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
  67. plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
  68. plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
  69. plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
  70. plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
  71. plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
  72. plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
  73. plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
  74. plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
  75. plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
  76. plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
  77. plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
  78. plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
  79. plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
  80. plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
  81. plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
  82. plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
  83. plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
  84. plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
  85. plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
  86. plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
  87. plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
  88. plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
  89. plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
  90. plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
  91. plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
  92. plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
  93. plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
  94. plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
  95. plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
  96. plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
  97. plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
  98. plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
  99. plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
  100. plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
  101. plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
  102. plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
  103. plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
  104. plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
  105. plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
  106. plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
  107. plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
  108. plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
  109. plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
  110. plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
  111. plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
  112. plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
  113. plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
  114. plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
  115. plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
  116. plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
  117. plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
  118. plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
  119. plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
  120. plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
  121. plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
  122. plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
  123. plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
  124. plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
  125. plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
  126. plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
  127. plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
  128. plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
  129. plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
  130. plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
  131. plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
  132. plans/completed/pr-review-remediation/0-Overview.md +138 -0
  133. plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
  134. plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
  135. plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
  136. plans/completed/pr-review-remediation/compacted_state.md +66 -0
  137. plans/completed/python-310-migration/0-Overview.md +390 -0
  138. plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
  139. plans/completed/python-310-migration/2-Implementation.md +256 -0
  140. plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
  141. plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
  142. plans/completed/python-310-migration/5-Closeout.md +252 -0
  143. plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
  144. plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
  145. plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
  146. plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
  147. plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
  148. plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
  149. plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
  150. plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
  151. plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
  152. plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
  153. plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
  154. plans/completed/test-directory-consolidation/0-Overview.md +51 -0
  155. plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
  156. plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
  157. plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
  158. plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
  159. plans/completed/test-directory-consolidation/5-Validation.md +152 -0
  160. plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
  161. plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
  162. plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
  163. plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
  164. plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
  165. plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
  166. plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
  167. plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
  168. plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
  169. plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
  170. plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
  171. plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
  172. plans/documentation-code-audit/0-Overview.md +393 -0
  173. plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
  174. plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
  175. plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
  176. plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
  177. plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
  178. plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
  179. plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
  180. plans/documentation-code-audit/8-Closeout.md +456 -0
  181. plans/documentation-rebuild-session/compacted_state.md +109 -0
  182. plans/documentation-rendering-fixes/0-Overview.md +104 -0
  183. plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
  184. plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
  185. plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
  186. plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
  187. plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
  188. plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
  189. plans/documentation-rendering-fixes/compacted_state.md +132 -0
  190. plans/documentation-template-fix/0-Overview.md +197 -0
  191. plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
  192. plans/documentation-template-fix/2-Template-Modification.md +609 -0
  193. plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
  194. plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
  195. plans/documentation-template-fix/5-Documentation-Training.md +602 -0
  196. plans/documentation-workflow-fix/0-Overview.md +222 -0
  197. plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
  198. plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
  199. plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
  200. plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
  201. plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
  202. plans/duplicate-object-warnings-fix-plan.md +130 -0
  203. plans/github-issues-migration/0-Overview.md +510 -0
  204. plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
  205. plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
  206. plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
  207. plans/github-issues-migration/4-Validated-Migration.md +252 -0
  208. plans/github-issues-migration/5-Documentation-Training.md +171 -0
  209. plans/github-issues-migration/6-Closeout.md +179 -0
  210. plans/github-workflows-repair/repair-plan.md +299 -0
  211. plans/issues_from_plans.py +342 -0
  212. plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
  213. plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
  214. plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
  215. plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
  216. plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
  217. plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
  218. plans/python-310-migration/0-Overview.md +390 -0
  219. plans/python-310-migration/1-Planning-Setup.md +164 -0
  220. plans/python-310-migration/2-Implementation.md +256 -0
  221. plans/python-310-migration/3-Testing-Validation.md +335 -0
  222. plans/python-310-migration/4-Documentation-Release.md +274 -0
  223. plans/python-310-migration/5-Closeout.md +252 -0
  224. plans/readthedocs-simplified/0-Overview.md +243 -0
  225. plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
  226. plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
  227. plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
  228. plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
  229. plans/readthedocs-simplified/5-Closeout.md +231 -0
  230. plans/readthedocs-simplified/compacted_state.md +127 -0
  231. plans/session-compaction-2025-08-12/compacted_state.md +114 -0
  232. plans/session-compaction-2025-08-13/compacted_state.md +145 -0
  233. plans/session-continuity-protocol/0-Overview.md +35 -0
  234. plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
  235. plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
  236. plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
  237. plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
  238. plans/sphinx-warnings-analysis.md +222 -0
  239. plans/systemprompt-optimization/0-Overview.md +447 -0
  240. plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
  241. plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
  242. plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
  243. plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
  244. plans/systemprompt-optimization/9-Closeout.md +165 -0
  245. plans/systemprompt-optimization/compacted_state.md +143 -0
  246. plans/template-value-propositions/0-Overview.md +357 -0
  247. plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
  248. plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
  249. plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
  250. plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
  251. plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
  252. plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
  253. plans/tests-audit/0-Overview.md +410 -0
  254. plans/tests-audit/1-Discovery-Inventory.md +170 -0
  255. plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
  256. plans/tests-audit/3-Architecture-Compliance.md +195 -0
  257. plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
  258. plans/tests-audit/5-Documentation-Enhancement.md +220 -0
  259. plans/tests-audit/6-Audit-Deliverables.md +220 -0
  260. plans/tests-audit/7-Closeout.md +252 -0
  261. plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
  262. plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
  263. plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
  264. plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
  265. plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
  266. plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
  267. plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
  268. plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
  269. plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
  270. plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
  271. plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
  272. plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
  273. plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
  274. plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
  275. plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
  276. plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
  277. plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
  278. plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
  279. plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
  280. plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
  281. plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
  282. plans/tests-audit/artifacts/test_parser.py +395 -0
  283. solarwindpy/README.md +3 -0
  284. solarwindpy/Untitled.ipynb +54 -0
  285. solarwindpy/__init__.py +74 -0
  286. solarwindpy/core/__init__.py +23 -0
  287. solarwindpy/core/alfvenic_turbulence.py +804 -0
  288. solarwindpy/core/base.py +267 -0
  289. solarwindpy/core/ions.py +309 -0
  290. solarwindpy/core/plasma.py +2133 -0
  291. solarwindpy/core/spacecraft.py +256 -0
  292. solarwindpy/core/tensor.py +90 -0
  293. solarwindpy/core/units_constants.py +199 -0
  294. solarwindpy/core/vector.py +328 -0
  295. solarwindpy/fitfunctions/__init__.py +20 -0
  296. solarwindpy/fitfunctions/core.py +734 -0
  297. solarwindpy/fitfunctions/exponentials.py +188 -0
  298. solarwindpy/fitfunctions/gaussians.py +264 -0
  299. solarwindpy/fitfunctions/lines.py +116 -0
  300. solarwindpy/fitfunctions/moyal.py +71 -0
  301. solarwindpy/fitfunctions/plots.py +751 -0
  302. solarwindpy/fitfunctions/power_laws.py +209 -0
  303. solarwindpy/fitfunctions/tex_info.py +568 -0
  304. solarwindpy/fitfunctions/trend_fits.py +482 -0
  305. solarwindpy/instabilities/__init__.py +16 -0
  306. solarwindpy/instabilities/beta_ani.py +82 -0
  307. solarwindpy/instabilities/verscharen2016.py +631 -0
  308. solarwindpy/plotting/__init__.py +33 -0
  309. solarwindpy/plotting/agg_plot.py +489 -0
  310. solarwindpy/plotting/base.py +465 -0
  311. solarwindpy/plotting/hist1d.py +405 -0
  312. solarwindpy/plotting/hist2d.py +1035 -0
  313. solarwindpy/plotting/histograms.py +1845 -0
  314. solarwindpy/plotting/labels/__init__.py +104 -0
  315. solarwindpy/plotting/labels/base.py +686 -0
  316. solarwindpy/plotting/labels/chemistry.py +19 -0
  317. solarwindpy/plotting/labels/composition.py +100 -0
  318. solarwindpy/plotting/labels/datetime.py +235 -0
  319. solarwindpy/plotting/labels/elemental_abundance.py +73 -0
  320. solarwindpy/plotting/labels/special.py +794 -0
  321. solarwindpy/plotting/orbits.py +515 -0
  322. solarwindpy/plotting/scatter.py +99 -0
  323. solarwindpy/plotting/select_data_from_figure.py +329 -0
  324. solarwindpy/plotting/spiral.py +980 -0
  325. solarwindpy/plotting/tools.py +434 -0
  326. solarwindpy/scripts/__init__.py +1 -0
  327. solarwindpy/scripts/logs/.gitignore +1 -0
  328. solarwindpy/solar_activity/__init__.py +53 -0
  329. solarwindpy/solar_activity/base.py +605 -0
  330. solarwindpy/solar_activity/lisird/__init__.py +3 -0
  331. solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
  332. solarwindpy/solar_activity/lisird/lisird.py +319 -0
  333. solarwindpy/solar_activity/plots.py +116 -0
  334. solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
  335. solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
  336. solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
  337. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
  338. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
  339. solarwindpy/tools/__init__.py +162 -0
  340. solarwindpy-0.1.1.dist-info/METADATA +181 -0
  341. solarwindpy-0.1.1.dist-info/RECORD +409 -0
  342. {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
  343. solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
  344. solarwindpy-0.1.1.dist-info/top_level.txt +3 -0
  345. tests/__init__.py +1 -0
  346. tests/conftest.py +10 -0
  347. tests/core/__init__.py +1 -0
  348. tests/core/test_alfvenic_turbulence.py +544 -0
  349. tests/core/test_base.py +112 -0
  350. tests/core/test_base_head_tail.py +29 -0
  351. tests/core/test_base_mi_tuples.py +11 -0
  352. tests/core/test_core_verify_datetimeindex.py +32 -0
  353. tests/core/test_ions.py +325 -0
  354. tests/core/test_plasma.py +2581 -0
  355. tests/core/test_plasma_io.py +12 -0
  356. tests/core/test_quantities.py +507 -0
  357. tests/core/test_spacecraft.py +210 -0
  358. tests/core/test_units_constants.py +22 -0
  359. tests/data/epoch.csv +4 -0
  360. tests/data/plasma.csv +4 -0
  361. tests/data/spacecraft.csv +4 -0
  362. tests/fitfunctions/conftest.py +60 -0
  363. tests/fitfunctions/test_core.py +193 -0
  364. tests/fitfunctions/test_exponentials.py +342 -0
  365. tests/fitfunctions/test_gaussians.py +142 -0
  366. tests/fitfunctions/test_lines.py +349 -0
  367. tests/fitfunctions/test_moyal.py +258 -0
  368. tests/fitfunctions/test_plots.py +258 -0
  369. tests/fitfunctions/test_power_laws.py +365 -0
  370. tests/fitfunctions/test_tex_info.py +183 -0
  371. tests/fitfunctions/test_trend_fit_properties.py +31 -0
  372. tests/fitfunctions/test_trend_fits.py +244 -0
  373. tests/plotting/__init__.py +1 -0
  374. tests/plotting/labels/__init__.py +1 -0
  375. tests/plotting/labels/test_chemistry.py +243 -0
  376. tests/plotting/labels/test_composition.py +345 -0
  377. tests/plotting/labels/test_datetime.py +445 -0
  378. tests/plotting/labels/test_elemental_abundance.py +366 -0
  379. tests/plotting/labels/test_init.py +66 -0
  380. tests/plotting/labels/test_labels_base.py +347 -0
  381. tests/plotting/labels/test_special.py +550 -0
  382. tests/plotting/test_agg_plot.py +602 -0
  383. tests/plotting/test_base.py +752 -0
  384. tests/plotting/test_fixtures_utilities.py +775 -0
  385. tests/plotting/test_histograms.py +546 -0
  386. tests/plotting/test_integration.py +675 -0
  387. tests/plotting/test_orbits.py +435 -0
  388. tests/plotting/test_performance.py +708 -0
  389. tests/plotting/test_scatter.py +752 -0
  390. tests/plotting/test_select_data_from_figure.py +1209 -0
  391. tests/plotting/test_spiral.py +573 -0
  392. tests/plotting/test_tools.py +607 -0
  393. tests/plotting/test_visual_validation.py +465 -0
  394. tests/solar_activity/__init__.py +1 -0
  395. tests/solar_activity/lisird/__init__.py +1 -0
  396. tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
  397. tests/solar_activity/lisird/test_lisird_id.py +187 -0
  398. tests/solar_activity/sunspot_number/__init__.py +1 -0
  399. tests/solar_activity/sunspot_number/test_init.py +399 -0
  400. tests/solar_activity/sunspot_number/test_sidc.py +465 -0
  401. tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
  402. tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
  403. tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
  404. tests/solar_activity/test_base.py +656 -0
  405. tests/solar_activity/test_init.py +396 -0
  406. tests/solar_activity/test_plots.py +371 -0
  407. tests/test_circular_imports.py +408 -0
  408. tests/test_issue_titles.py +25 -0
  409. tests/test_statusline.py +298 -0
  410. solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
  411. solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
  412. 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