gea-program 0.30.1__tar.gz → 0.32.0__tar.gz

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.
Files changed (282) hide show
  1. {gea_program-0.30.1/gea_program.egg-info → gea_program-0.32.0}/PKG-INFO +39 -4
  2. {gea_program-0.30.1 → gea_program-0.32.0}/README.md +38 -3
  3. {gea_program-0.30.1 → gea_program-0.32.0}/gea/__init__.py +1 -1
  4. {gea_program-0.30.1 → gea_program-0.32.0}/gea/__main__.py +115 -4
  5. {gea_program-0.30.1 → gea_program-0.32.0}/gea/acceptance_tests.py +316 -0
  6. {gea_program-0.30.1 → gea_program-0.32.0}/gea/gamma.py +2 -2
  7. gea_program-0.32.0/gea/help/setup.md +11 -0
  8. gea_program-0.32.0/gea/help/tools.md +11 -0
  9. {gea_program-0.30.1 → gea_program-0.32.0}/gea/helplib.py +3 -2
  10. {gea_program-0.30.1 → gea_program-0.32.0}/gea/osdu.py +5 -5
  11. {gea_program-0.30.1 → gea_program-0.32.0}/gea/ppdm.py +7 -1
  12. gea_program-0.32.0/gea/reference/tool_sources.json +3046 -0
  13. {gea_program-0.30.1 → gea_program-0.32.0}/gea/service.py +62 -2
  14. gea_program-0.32.0/gea/setup_checklist.py +256 -0
  15. {gea_program-0.30.1 → gea_program-0.32.0}/gea/sra.py +1 -1
  16. gea_program-0.32.0/gea/tool_taxonomy.py +905 -0
  17. {gea_program-0.30.1 → gea_program-0.32.0}/gea/web/app.html +176 -4
  18. {gea_program-0.30.1 → gea_program-0.32.0}/gea/workspace.py +16 -2
  19. {gea_program-0.30.1 → gea_program-0.32.0/gea_program.egg-info}/PKG-INFO +39 -4
  20. {gea_program-0.30.1 → gea_program-0.32.0}/gea_program.egg-info/SOURCES.txt +4 -0
  21. {gea_program-0.30.1 → gea_program-0.32.0}/pyproject.toml +1 -1
  22. gea_program-0.30.1/gea/help/tools.md +0 -11
  23. {gea_program-0.30.1 → gea_program-0.32.0}/LICENSE +0 -0
  24. {gea_program-0.30.1 → gea_program-0.32.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  25. {gea_program-0.30.1 → gea_program-0.32.0}/gea/accuracy_statement.py +0 -0
  26. {gea_program-0.30.1 → gea_program-0.32.0}/gea/alarm_engine.py +0 -0
  27. {gea_program-0.30.1 → gea_program-0.32.0}/gea/backup.py +0 -0
  28. {gea_program-0.30.1 → gea_program-0.32.0}/gea/bench.py +0 -0
  29. {gea_program-0.30.1 → gea_program-0.32.0}/gea/blind_harness.py +0 -0
  30. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  31. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  32. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  33. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  34. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  35. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  36. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  37. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  38. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  39. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  40. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  41. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  42. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  43. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  44. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  45. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  46. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  47. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  48. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  49. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  50. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  51. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  52. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  53. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  54. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  55. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  56. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  57. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  58. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  59. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  60. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  61. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  62. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  63. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  64. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  65. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  66. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  67. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  68. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  69. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  70. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  71. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  72. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  73. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  74. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  75. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  76. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  77. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  78. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  79. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  80. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  81. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  82. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  83. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  84. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  85. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  86. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  87. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  88. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  89. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  90. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  91. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  92. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  93. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  94. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  95. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  96. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  97. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/med_160_sapropels.txt +0 -0
  98. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  99. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  100. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  101. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  102. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  103. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  104. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  105. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  106. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  107. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  108. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  109. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  110. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  111. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  112. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  113. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  114. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  115. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  116. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  117. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  118. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  119. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  120. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  121. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  122. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  123. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  124. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  125. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  126. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  127. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  128. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  129. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  130. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  131. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  132. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  133. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  134. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog_map.py +0 -0
  135. {gea_program-0.30.1 → gea_program-0.32.0}/gea/catalog_register.py +0 -0
  136. {gea_program-0.30.1 → gea_program-0.32.0}/gea/certificates.py +0 -0
  137. {gea_program-0.30.1 → gea_program-0.32.0}/gea/cli.py +0 -0
  138. {gea_program-0.30.1 → gea_program-0.32.0}/gea/client_reports.py +0 -0
  139. {gea_program-0.30.1 → gea_program-0.32.0}/gea/config_versioning.py +0 -0
  140. {gea_program-0.30.1 → gea_program-0.32.0}/gea/conformance.py +0 -0
  141. {gea_program-0.30.1 → gea_program-0.32.0}/gea/correlation.py +0 -0
  142. {gea_program-0.30.1 → gea_program-0.32.0}/gea/dashboard.py +0 -0
  143. {gea_program-0.30.1 → gea_program-0.32.0}/gea/deviation.py +0 -0
  144. {gea_program-0.30.1 → gea_program-0.32.0}/gea/dlis.py +0 -0
  145. {gea_program-0.30.1 → gea_program-0.32.0}/gea/dnp3.py +0 -0
  146. {gea_program-0.30.1 → gea_program-0.32.0}/gea/doctor.py +0 -0
  147. {gea_program-0.30.1 → gea_program-0.32.0}/gea/downhole_engine.py +0 -0
  148. {gea_program-0.30.1 → gea_program-0.32.0}/gea/drift_monitor.py +0 -0
  149. {gea_program-0.30.1 → gea_program-0.32.0}/gea/earth_model.py +0 -0
  150. {gea_program-0.30.1 → gea_program-0.32.0}/gea/edr.py +0 -0
  151. {gea_program-0.30.1 → gea_program-0.32.0}/gea/elevation.py +0 -0
  152. {gea_program-0.30.1 → gea_program-0.32.0}/gea/etp.py +0 -0
  153. {gea_program-0.30.1 → gea_program-0.32.0}/gea/etp12_schemas.json +0 -0
  154. {gea_program-0.30.1 → gea_program-0.32.0}/gea/example_register_map.json +0 -0
  155. {gea_program-0.30.1 → gea_program-0.32.0}/gea/fat_sat.py +0 -0
  156. {gea_program-0.30.1 → gea_program-0.32.0}/gea/files.py +0 -0
  157. {gea_program-0.30.1 → gea_program-0.32.0}/gea/fixtures/README.md +0 -0
  158. {gea_program-0.30.1 → gea_program-0.32.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  159. {gea_program-0.30.1 → gea_program-0.32.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  160. {gea_program-0.30.1 → gea_program-0.32.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  161. {gea_program-0.30.1 → gea_program-0.32.0}/gea/follower.py +0 -0
  162. {gea_program-0.30.1 → gea_program-0.32.0}/gea/forward_model.py +0 -0
  163. {gea_program-0.30.1 → gea_program-0.32.0}/gea/friction_priors.py +0 -0
  164. {gea_program-0.30.1 → gea_program-0.32.0}/gea/gauge_aging.py +0 -0
  165. {gea_program-0.30.1 → gea_program-0.32.0}/gea/gauge_specs.py +0 -0
  166. {gea_program-0.30.1 → gea_program-0.32.0}/gea/geodesy.py +0 -0
  167. {gea_program-0.30.1 → gea_program-0.32.0}/gea/gravity_reference.py +0 -0
  168. {gea_program-0.30.1 → gea_program-0.32.0}/gea/hartip.py +0 -0
  169. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/TESTER_GUIDE.md +0 -0
  170. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/alarms.md +0 -0
  171. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/audit-update.md +0 -0
  172. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/backup.md +0 -0
  173. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/catalog.md +0 -0
  174. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/conformance.md +0 -0
  175. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/data-in.md +0 -0
  176. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/dlis.md +0 -0
  177. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/doctor.md +0 -0
  178. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/drift.md +0 -0
  179. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/edr.md +0 -0
  180. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/etp.md +0 -0
  181. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/field-ports.md +0 -0
  182. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/files.md +0 -0
  183. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/historian.md +0 -0
  184. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/instruments.md +0 -0
  185. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/interval.md +0 -0
  186. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/month-end.md +0 -0
  187. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/notifications.md +0 -0
  188. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/osdu.md +0 -0
  189. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/patches.md +0 -0
  190. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/ppdm.md +0 -0
  191. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/quakeml.md +0 -0
  192. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/quality.md +0 -0
  193. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/seedlink.md +0 -0
  194. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/seismic.md +0 -0
  195. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/site.md +0 -0
  196. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/sites.md +0 -0
  197. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/slip.md +0 -0
  198. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/soak.md +0 -0
  199. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/sra.md +0 -0
  200. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/start.md +0 -0
  201. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/structure.md +0 -0
  202. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/transients.md +0 -0
  203. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/upkeep.md +0 -0
  204. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/vibration.md +0 -0
  205. {gea_program-0.30.1 → gea_program-0.32.0}/gea/help/well-tests.md +0 -0
  206. {gea_program-0.30.1 → gea_program-0.32.0}/gea/housekeeping.py +0 -0
  207. {gea_program-0.30.1 → gea_program-0.32.0}/gea/interval.py +0 -0
  208. {gea_program-0.30.1 → gea_program-0.32.0}/gea/inverse_engine.py +0 -0
  209. {gea_program-0.30.1 → gea_program-0.32.0}/gea/jobs.py +0 -0
  210. {gea_program-0.30.1 → gea_program-0.32.0}/gea/live_ports.py +0 -0
  211. {gea_program-0.30.1 → gea_program-0.32.0}/gea/loadtest.py +0 -0
  212. {gea_program-0.30.1 → gea_program-0.32.0}/gea/matplotlib_demo.py +0 -0
  213. {gea_program-0.30.1 → gea_program-0.32.0}/gea/modbus.py +0 -0
  214. {gea_program-0.30.1 → gea_program-0.32.0}/gea/modbus_rtu.py +0 -0
  215. {gea_program-0.30.1 → gea_program-0.32.0}/gea/model_card.py +0 -0
  216. {gea_program-0.30.1 → gea_program-0.32.0}/gea/month_end.py +0 -0
  217. {gea_program-0.30.1 → gea_program-0.32.0}/gea/mqtt_port.py +0 -0
  218. {gea_program-0.30.1 → gea_program-0.32.0}/gea/notify.py +0 -0
  219. {gea_program-0.30.1 → gea_program-0.32.0}/gea/opcua_port.py +0 -0
  220. {gea_program-0.30.1 → gea_program-0.32.0}/gea/operator_app.py +0 -0
  221. {gea_program-0.30.1 → gea_program-0.32.0}/gea/patches.py +0 -0
  222. {gea_program-0.30.1 → gea_program-0.32.0}/gea/permits.py +0 -0
  223. {gea_program-0.30.1 → gea_program-0.32.0}/gea/piwebapi.py +0 -0
  224. {gea_program-0.30.1 → gea_program-0.32.0}/gea/ports.py +0 -0
  225. {gea_program-0.30.1 → gea_program-0.32.0}/gea/profile_catalog.py +0 -0
  226. {gea_program-0.30.1 → gea_program-0.32.0}/gea/project.py +0 -0
  227. {gea_program-0.30.1 → gea_program-0.32.0}/gea/qt6_downhole_app.py +0 -0
  228. {gea_program-0.30.1 → gea_program-0.32.0}/gea/quakeml.py +0 -0
  229. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reconciler.py +0 -0
  230. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  231. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  232. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  233. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  234. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  235. {gea_program-0.30.1 → gea_program-0.32.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  236. {gea_program-0.30.1 → gea_program-0.32.0}/gea/rock_inventory.py +0 -0
  237. {gea_program-0.30.1 → gea_program-0.32.0}/gea/sample_record.py +0 -0
  238. {gea_program-0.30.1 → gea_program-0.32.0}/gea/sample_well_profile.csv +0 -0
  239. {gea_program-0.30.1 → gea_program-0.32.0}/gea/sbom.py +0 -0
  240. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seedlink.py +0 -0
  241. {gea_program-0.30.1 → gea_program-0.32.0}/gea/segy.py +0 -0
  242. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic.py +0 -0
  243. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_array.py +0 -0
  244. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_assoc.py +0 -0
  245. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_detect.py +0 -0
  246. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_film.py +0 -0
  247. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_harmonic.py +0 -0
  248. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_qc.py +0 -0
  249. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_response.py +0 -0
  250. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_signature.py +0 -0
  251. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_track.py +0 -0
  252. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_uncertainty.py +0 -0
  253. {gea_program-0.30.1 → gea_program-0.32.0}/gea/seismic_unlisted.py +0 -0
  254. {gea_program-0.30.1 → gea_program-0.32.0}/gea/sensor_swap.py +0 -0
  255. {gea_program-0.30.1 → gea_program-0.32.0}/gea/service_life.py +0 -0
  256. {gea_program-0.30.1 → gea_program-0.32.0}/gea/shapefile.py +0 -0
  257. {gea_program-0.30.1 → gea_program-0.32.0}/gea/shell.py +0 -0
  258. {gea_program-0.30.1 → gea_program-0.32.0}/gea/shut_in.py +0 -0
  259. {gea_program-0.30.1 → gea_program-0.32.0}/gea/sla_report.py +0 -0
  260. {gea_program-0.30.1 → gea_program-0.32.0}/gea/slip.py +0 -0
  261. {gea_program-0.30.1 → gea_program-0.32.0}/gea/soak.py +0 -0
  262. {gea_program-0.30.1 → gea_program-0.32.0}/gea/store_forward.py +0 -0
  263. {gea_program-0.30.1 → gea_program-0.32.0}/gea/strata_join.py +0 -0
  264. {gea_program-0.30.1 → gea_program-0.32.0}/gea/structure.py +0 -0
  265. {gea_program-0.30.1 → gea_program-0.32.0}/gea/supervisor.py +0 -0
  266. {gea_program-0.30.1 → gea_program-0.32.0}/gea/survey_cmd.py +0 -0
  267. {gea_program-0.30.1 → gea_program-0.32.0}/gea/survey_view.py +0 -0
  268. {gea_program-0.30.1 → gea_program-0.32.0}/gea/telemetry.py +0 -0
  269. {gea_program-0.30.1 → gea_program-0.32.0}/gea/tool_catalog.py +0 -0
  270. {gea_program-0.30.1 → gea_program-0.32.0}/gea/tool_library.py +0 -0
  271. {gea_program-0.30.1 → gea_program-0.32.0}/gea/transient.py +0 -0
  272. {gea_program-0.30.1 → gea_program-0.32.0}/gea/vibration.py +0 -0
  273. {gea_program-0.30.1 → gea_program-0.32.0}/gea/well_assembler.py +0 -0
  274. {gea_program-0.30.1 → gea_program-0.32.0}/gea/well_test_validation.py +0 -0
  275. {gea_program-0.30.1 → gea_program-0.32.0}/gea/wits0.py +0 -0
  276. {gea_program-0.30.1 → gea_program-0.32.0}/gea/witsml.py +0 -0
  277. {gea_program-0.30.1 → gea_program-0.32.0}/gea_program.egg-info/dependency_links.txt +0 -0
  278. {gea_program-0.30.1 → gea_program-0.32.0}/gea_program.egg-info/entry_points.txt +0 -0
  279. {gea_program-0.30.1 → gea_program-0.32.0}/gea_program.egg-info/requires.txt +0 -0
  280. {gea_program-0.30.1 → gea_program-0.32.0}/gea_program.egg-info/top_level.txt +0 -0
  281. {gea_program-0.30.1 → gea_program-0.32.0}/setup.cfg +0 -0
  282. {gea_program-0.30.1 → gea_program-0.32.0}/tests/test_acceptance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gea-program
3
- Version: 0.30.1
3
+ Version: 0.32.0
4
4
  Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
5
5
  Author: Daniel T. Murphy
6
6
  License: MPL-2.0
@@ -125,7 +125,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
125
125
  gea client-report --report accuracy --out client_report
126
126
  gea model-cards --out model_cards
127
127
  gea sbom --out sbom
128
- gea accept # the product gate (377 checks)
128
+ gea accept # the product gate (383 checks)
129
129
  gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
130
130
  gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
131
131
  gea gui # the desktop window (pip install "gea-program[desktop]")
@@ -648,10 +648,45 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
648
648
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
649
649
  `rtserve.iris.washington.edu:18000`, network `TX`.
650
650
 
651
+ ### The setup checklist
652
+
653
+ The Setup tab (`#/setup`, `gea checklist --workspace C:\site`) says what a
654
+ workspace still needs before its reports can be handed over, read from the
655
+ workspace as it stands: an administrator, the wells, a site record naming
656
+ the client, a backup folder off the machine, a current backup, the daily
657
+ schedule, current reports, and for each well its surface location and
658
+ datum, its reference elevation with its source, and its US Well Number.
659
+ Each item carries its own form or button - declare the position, take the
660
+ ground level from USGS 3DEP to check, create the site, back up now - and,
661
+ where every value is already known, the command to paste. The tab's badge
662
+ counts the required items still to do and the Home page names the next
663
+ one. A drilling record's depth events are confirmed by a person against
664
+ the daily drilling reports, with a note; the confirmation stops counting
665
+ if the record changes. `gea checklist` exits 0 when everything required is
666
+ done. `gea help setup`.
667
+
651
668
  ### Tools and ports
652
669
 
653
- The Tools & ports tab (`#/tools`, `gea tools`) is the program's two
654
- registers in one place: the tool library - every downhole and surface tool
670
+ The Tools & ports tab (`#/tools`, `gea tools`) opens on the **downhole tool
671
+ library**: every class of downhole tool in use across the industry - bits
672
+ and hole openers, motors and rotary steerable systems, MWD and LWD, the drill
673
+ string and its subs, casing and cementing equipment, completion and
674
+ artificial lift, wireline and cased-hole tools, fishing and milling, test
675
+ tools - ninety-six classes in nine categories. Point at a tool, or Tab to
676
+ it, for a one-line description; click, tap or press Enter for its tutorial:
677
+ what it is, where it runs, how it works, what it shows in the data, what to
678
+ watch, and what this program does with it, with the published figures
679
+ quoted from the pages they cite and the pages themselves. The tutorials
680
+ carry no numbers of their own; a figure on a tool's card is the cited page's
681
+ words, most often one maker's product, never a limit for the class. Your
682
+ **fleet** - the tools you actually run - goes in beside the classes, each
683
+ with its maker, model, serial and the datasheet that rates it
684
+ (`gea tools --action fleet-add --workspace C:\site --class pdm_motor
685
+ --maker ... --model ... --datasheet ...`, or from the tutorial), kept in the
686
+ workspace and audited. `gea tools --action classes`, `--action tutorial
687
+ --class drilling_jar`.
688
+
689
+ Below it are the program's two registers: the gauge library - every gauge
655
690
  with its source citation, ratings, what it measures, the telemetry interface
656
691
  it declares and its datasheet aging rate where the vendor published one -
657
692
  and the ports, the file formats read and the eleven live protocols spoken,
@@ -86,7 +86,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
86
86
  gea client-report --report accuracy --out client_report
87
87
  gea model-cards --out model_cards
88
88
  gea sbom --out sbom
89
- gea accept # the product gate (377 checks)
89
+ gea accept # the product gate (383 checks)
90
90
  gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
91
91
  gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
92
92
  gea gui # the desktop window (pip install "gea-program[desktop]")
@@ -609,10 +609,45 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
609
609
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
610
610
  `rtserve.iris.washington.edu:18000`, network `TX`.
611
611
 
612
+ ### The setup checklist
613
+
614
+ The Setup tab (`#/setup`, `gea checklist --workspace C:\site`) says what a
615
+ workspace still needs before its reports can be handed over, read from the
616
+ workspace as it stands: an administrator, the wells, a site record naming
617
+ the client, a backup folder off the machine, a current backup, the daily
618
+ schedule, current reports, and for each well its surface location and
619
+ datum, its reference elevation with its source, and its US Well Number.
620
+ Each item carries its own form or button - declare the position, take the
621
+ ground level from USGS 3DEP to check, create the site, back up now - and,
622
+ where every value is already known, the command to paste. The tab's badge
623
+ counts the required items still to do and the Home page names the next
624
+ one. A drilling record's depth events are confirmed by a person against
625
+ the daily drilling reports, with a note; the confirmation stops counting
626
+ if the record changes. `gea checklist` exits 0 when everything required is
627
+ done. `gea help setup`.
628
+
612
629
  ### Tools and ports
613
630
 
614
- The Tools & ports tab (`#/tools`, `gea tools`) is the program's two
615
- registers in one place: the tool library - every downhole and surface tool
631
+ The Tools & ports tab (`#/tools`, `gea tools`) opens on the **downhole tool
632
+ library**: every class of downhole tool in use across the industry - bits
633
+ and hole openers, motors and rotary steerable systems, MWD and LWD, the drill
634
+ string and its subs, casing and cementing equipment, completion and
635
+ artificial lift, wireline and cased-hole tools, fishing and milling, test
636
+ tools - ninety-six classes in nine categories. Point at a tool, or Tab to
637
+ it, for a one-line description; click, tap or press Enter for its tutorial:
638
+ what it is, where it runs, how it works, what it shows in the data, what to
639
+ watch, and what this program does with it, with the published figures
640
+ quoted from the pages they cite and the pages themselves. The tutorials
641
+ carry no numbers of their own; a figure on a tool's card is the cited page's
642
+ words, most often one maker's product, never a limit for the class. Your
643
+ **fleet** - the tools you actually run - goes in beside the classes, each
644
+ with its maker, model, serial and the datasheet that rates it
645
+ (`gea tools --action fleet-add --workspace C:\site --class pdm_motor
646
+ --maker ... --model ... --datasheet ...`, or from the tutorial), kept in the
647
+ workspace and audited. `gea tools --action classes`, `--action tutorial
648
+ --class drilling_jar`.
649
+
650
+ Below it are the program's two registers: the gauge library - every gauge
616
651
  with its source citation, ratings, what it measures, the telemetry interface
617
652
  it declares and its datasheet aging rate where the vendor published one -
618
653
  and the ports, the file formats read and the eleven live protocols spoken,
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.30.1"
126
+ __version__ = "0.32.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -285,6 +285,17 @@ def main(argv=None) -> int:
285
285
  p_tl.add_argument("--station", type=str, action="append", default=None, help="a station as DEPTH_FT:TOOL, e.g. 9850:quartz_pt_geoq177_16k")
286
286
  p_tl.add_argument("--surface-temp-f", type=float, default=75.0); p_tl.add_argument("--temp-gradient-f-ft", type=float, default=0.018)
287
287
  p_tl.add_argument("--surface-pressure-psi", type=float, default=14.7); p_tl.add_argument("--pressure-gradient-psi-ft", type=float, default=0.465)
288
+ p_tl.add_argument("--action", choices=["classes", "tutorial", "fleet", "fleet-add", "fleet-remove"], default=None,
289
+ help="the downhole tool classes in use across the industry: classes (--category, --find), tutorial --class ID, and the workspace's own fleet (fleet, fleet-add, fleet-remove)")
290
+ p_tl.add_argument("--category", type=str, default=None, help="classes: one category (bits, drive, measure, bha, casing, completion, logging, fishing, testing)")
291
+ p_tl.add_argument("--find", type=str, default="", help="classes: words to look for in the name and description")
292
+ p_tl.add_argument("--class", dest="class_id", type=str, default=None, help="tutorial / fleet-add: the tool class id, e.g. pdm_motor")
293
+ p_tl.add_argument("--workspace", type=str, default=None, help="fleet actions: the workspace folder")
294
+ p_tl.add_argument("--maker", type=str, default=""); p_tl.add_argument("--model", type=str, default="")
295
+ p_tl.add_argument("--datasheet", type=str, default="", help="fleet-add: the datasheet that rates the tool - title and revision, or its URL (required)")
296
+ p_tl.add_argument("--serial", type=str, default=""); p_tl.add_argument("--od-in", type=float, default=None); p_tl.add_argument("--note", type=str, default="")
297
+ p_tl.add_argument("--id", type=str, default=None, help="fleet-remove: the fleet tool id (gea tools --action fleet lists them)")
298
+ p_tl.add_argument("--actor", type=str, default="cli")
288
299
  p_cc = sub.add_parser("comcat", help="USGS ComCat / any FDSN event service: --lat --lon --radius-km --start --end prints the text-format query to open; --file reads the export it returns")
289
300
  p_cc.add_argument("--lat", type=float, default=None); p_cc.add_argument("--lon", type=float, default=None); p_cc.add_argument("--radius-km", type=float, default=25.0)
290
301
  p_cc.add_argument("--start", type=str, default=None); p_cc.add_argument("--end", type=str, default=None); p_cc.add_argument("--min-mag", type=float, default=1.0)
@@ -457,6 +468,13 @@ def main(argv=None) -> int:
457
468
  p_ws.add_argument("--sat", action="store_true", help="refresh: also run the SAT protocol")
458
469
  p_ws.add_argument("--outage", action="append", default=None, help="refresh: outage window start/end (ISO), repeatable")
459
470
 
471
+ p_ck = sub.add_parser("checklist", help="the setup checklist: what this workspace still needs before its reports can be handed over - read from the workspace as it stands")
472
+ p_ck.add_argument("--workspace", type=str, default=None, help="the workspace folder, e.g. C:\\site")
473
+ p_ck.add_argument("--json", action="store_true")
474
+ p_ck.add_argument("--confirm", type=str, default=None, help="record a person's check of a confirmation item, e.g. events:Well-30636033")
475
+ p_ck.add_argument("--note", type=str, default="", help="--confirm: what it was checked against (required)")
476
+ p_ck.add_argument("--actor", type=str, default="cli")
477
+
460
478
  p_sv = sub.add_parser("serve", help="serve the dashboard over a workspace: the page, the reports and the JSON API (standard library HTTP)")
461
479
  p_sv.add_argument("--workspace", type=str, required=True, help="the workspace folder (gea workspace --action init)")
462
480
  p_sv.add_argument("--host", type=str, default="127.0.0.1", help="bind address; 0.0.0.0 exposes it on the site network (put TLS in front)")
@@ -1879,6 +1897,31 @@ def main(argv=None) -> int:
1879
1897
  elif a.cmd == "update":
1880
1898
  from .doctor import update as _update
1881
1899
  return _update(check_only=a.check, extras=a.extras, as_json=a.json)
1900
+ elif a.cmd == "checklist":
1901
+ import json as _json
1902
+ from . import setup_checklist as _SC
1903
+ from .cli import _safe_stdout
1904
+ from .workspace import Workspace, WorkspaceError
1905
+ _safe_stdout()
1906
+ if not a.workspace:
1907
+ raise SystemExit("checklist needs --workspace, e.g. --workspace C:\\site")
1908
+ try:
1909
+ ws = Workspace(a.workspace)
1910
+ except WorkspaceError as e:
1911
+ raise SystemExit(f"checklist: {e}")
1912
+ if a.confirm:
1913
+ try:
1914
+ rec = _SC.confirm(ws, a.confirm, a.actor, a.note)
1915
+ except ValueError as e:
1916
+ raise SystemExit(f"checklist: {e}")
1917
+ print(f"confirmed {a.confirm} by {rec['by']} at {rec['utc']}: {rec['note']}")
1918
+ return 0
1919
+ r = _SC.checklist(ws)
1920
+ if a.json:
1921
+ print(_json.dumps(r, indent=1))
1922
+ else:
1923
+ print(_SC.text(r))
1924
+ return 0 if r["ready"] else 2
1882
1925
  elif a.cmd == "serve":
1883
1926
  from .service import Service
1884
1927
  from .workspace import WorkspaceError
@@ -2067,16 +2110,19 @@ def main(argv=None) -> int:
2067
2110
  print(f"3DEP ground elevation {r['elev_ft']:,.2f} ft ({r['source']})")
2068
2111
  elif a.ref_elev_ft is not None or a.ref_elev_datum or a.ref_elev_source:
2069
2112
  surface["elevation"] = {"ft": a.ref_elev_ft, "datum": a.ref_elev_datum, "source": a.ref_elev_source}
2070
- disposal = {k: v for k, v in {"api_number": a.api, "uic_number": a.uic, "depth_tier": a.depth_tier, "formation_basis": a.formation,
2113
+ identity = {"api_number": a.api} if a.api else {}
2114
+ disposal = {k: v for k, v in {"uic_number": a.uic, "depth_tier": a.depth_tier, "formation_basis": a.formation,
2071
2115
  "channel_pressure": a.channel_pressure, "channel_rate": a.channel_rate, "rate_unit": a.rate_unit,
2072
2116
  "bhp_method": a.bhp_method, "channel_bhp": a.channel_bhp, "top_interval_ft": a.top_interval_ft,
2073
2117
  "base_interval_ft": a.base_interval_ft, "depth_reference": a.depth_ref,
2074
2118
  "gradient_psi_ft": a.gradient_psi_ft}.items() if v is not None}
2075
- if not surface and not disposal:
2119
+ if a.api and (disposal or (ws.well(a.well).get("disposal") or {})):
2120
+ disposal["api_number"] = a.api # a disposal well keeps its number in the block the SRA packet reads too
2121
+ if not surface and not disposal and not identity:
2076
2122
  raise SystemExit("set-well: nothing to declare (give --lat/--lon, --ref-elev-ft, or any of --api --uic --depth-tier --top-interval-ft ...)")
2077
2123
  surface = surface or None
2078
- w = ws.set_well(a.well, surface=surface, disposal=disposal or None, actor=a.actor)
2079
- print(f"well {a.well}: surface {w.get('surface')}; disposal {w.get('disposal')}"); return 0
2124
+ w = ws.set_well(a.well, surface=surface, disposal=disposal or None, identity=identity or None, actor=a.actor)
2125
+ print(f"well {a.well}: surface {w.get('surface')}; identity {w.get('identity')}; disposal {w.get('disposal')}"); return 0
2080
2126
  elif a.action == "sra-define":
2081
2127
  if not a.site or not a.name or a.lat is None or a.lon is None or a.radius_km is None or not a.plan_date:
2082
2128
  raise SystemExit("sra-define needs --site, --name, --lat, --lon, --radius-km and --plan-date")
@@ -2374,6 +2420,71 @@ def main(argv=None) -> int:
2374
2420
  elif a.cmd == "tools":
2375
2421
  import json as _json
2376
2422
  from . import tool_catalog as _TC
2423
+ if a.action:
2424
+ from . import tool_taxonomy as _TX
2425
+ from .cli import _safe_stdout
2426
+ _safe_stdout() # the cited figures carry fractions and degree signs
2427
+ if a.action == "classes":
2428
+ cs = _TX.classes(a.category, a.find)
2429
+ if a.category and a.category not in _TX.CATEGORY_NAMES:
2430
+ raise SystemExit(f"tools: no category {a.category!r}; one of {', '.join(_TX.CATEGORY_NAMES)}")
2431
+ if a.json:
2432
+ print(_json.dumps(cs, indent=1)); return 0
2433
+ sm = _TX.summary()
2434
+ print(f"{len(cs)} of {sm['classes']} tool classes; {sm['sources']} pages checked (fetched {sm['sources_fetched']}); {sm['figures']} published figures, each quoted from its page")
2435
+ last = None
2436
+ for t in cs:
2437
+ if t["category"] != last:
2438
+ print(f"\n{t['category_name']}"); last = t["category"]
2439
+ print(f" {t['id']:<24s} {t['name']}")
2440
+ print(f" {t['one_line']}")
2441
+ print("\n`gea tools --action tutorial --class ID` opens one.")
2442
+ return 0
2443
+ if a.action == "tutorial":
2444
+ if not a.class_id:
2445
+ raise SystemExit("tools: tutorial needs --class, e.g. --class pdm_motor (gea tools --action classes lists them)")
2446
+ try:
2447
+ if a.json:
2448
+ print(_json.dumps(_TX.tool_class(a.class_id), indent=1)); return 0
2449
+ print(_TX.tutorial_text(a.class_id))
2450
+ except KeyError as e:
2451
+ raise SystemExit(f"tools: {e.args[0]}")
2452
+ return 0
2453
+ if not a.workspace:
2454
+ raise SystemExit(f"tools: --action {a.action} needs --workspace, e.g. --workspace C:\\site")
2455
+ from .workspace import Workspace, WorkspaceError
2456
+ try:
2457
+ ws = Workspace(a.workspace)
2458
+ except WorkspaceError as e:
2459
+ raise SystemExit(f"tools: {e}")
2460
+ if a.action == "fleet":
2461
+ fl = _TX.fleet_list(ws.path)
2462
+ if a.json:
2463
+ print(_json.dumps(fl, indent=1)); return 0
2464
+ if not fl:
2465
+ print("the fleet is empty: gea tools --action fleet-add --workspace ... --class pdm_motor --maker ... --model ... --datasheet ...")
2466
+ for t in fl:
2467
+ print(f"{t['id']:<32s} {t['class_name']} - {t['maker']} {t['model']}" + (f" s/n {t['serial']}" if t['serial'] else '') + (f", {t['od_in']:g} in OD" if t['od_in'] else ''))
2468
+ print(f" datasheet: {t['datasheet']}")
2469
+ return 0
2470
+ if a.action == "fleet-add":
2471
+ try:
2472
+ rec = _TX.fleet_add(ws.path, a.class_id or "", a.maker, a.model, a.datasheet, serial=a.serial, od_in=a.od_in, note=a.note, actor=a.actor)
2473
+ except ValueError as e:
2474
+ raise SystemExit(f"tools: {e}")
2475
+ ws.audit(a.actor, 'fleet.add', {'id': rec['id'], 'class': rec['class_id'], 'datasheet': rec['datasheet']})
2476
+ print(f"added {rec['id']}: {rec['maker']} {rec['model']} ({rec['class_name']}); datasheet {rec['datasheet']}")
2477
+ return 0
2478
+ if a.action == "fleet-remove":
2479
+ if not a.id:
2480
+ raise SystemExit("tools: fleet-remove needs --id (gea tools --action fleet lists them)")
2481
+ try:
2482
+ rec = _TX.fleet_remove(ws.path, a.id)
2483
+ except ValueError as e:
2484
+ raise SystemExit(f"tools: {e}")
2485
+ ws.audit(a.actor, 'fleet.remove', {'id': rec['id'], 'class': rec['class_id']})
2486
+ print(f"removed {rec['id']}")
2487
+ return 0
2377
2488
  if a.rating or a.station:
2378
2489
  stations = []
2379
2490
  for spec in (a.station or []):