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.

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