gea-program 0.58.0__tar.gz → 0.59.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 (371) hide show
  1. {gea_program-0.58.0/gea_program.egg-info → gea_program-0.59.0}/PKG-INFO +15 -1
  2. {gea_program-0.58.0 → gea_program-0.59.0}/README.md +14 -0
  3. {gea_program-0.58.0 → gea_program-0.59.0}/gea/__init__.py +1 -1
  4. {gea_program-0.58.0 → gea_program-0.59.0}/gea/__main__.py +7 -4
  5. {gea_program-0.58.0 → gea_program-0.59.0}/gea/acceptance_tests.py +137 -0
  6. {gea_program-0.58.0 → gea_program-0.59.0}/gea/declarations.py +371 -0
  7. gea_program-0.59.0/gea/help/declare.md +13 -0
  8. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/hydraulics.md +1 -1
  9. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/torque-drag.md +1 -1
  10. {gea_program-0.58.0 → gea_program-0.59.0}/gea/hydraulics.py +50 -11
  11. {gea_program-0.58.0 → gea_program-0.59.0}/gea/service.py +9 -0
  12. {gea_program-0.58.0 → gea_program-0.59.0}/gea/torque_drag.py +16 -6
  13. {gea_program-0.58.0 → gea_program-0.59.0}/gea/web/app.html +6 -4
  14. {gea_program-0.58.0 → gea_program-0.59.0/gea_program.egg-info}/PKG-INFO +15 -1
  15. {gea_program-0.58.0 → gea_program-0.59.0}/pyproject.toml +1 -1
  16. gea_program-0.58.0/gea/help/declare.md +0 -13
  17. {gea_program-0.58.0 → gea_program-0.59.0}/LICENSE +0 -0
  18. {gea_program-0.58.0 → gea_program-0.59.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  19. {gea_program-0.58.0 → gea_program-0.59.0}/gea/accuracy_statement.py +0 -0
  20. {gea_program-0.58.0 → gea_program-0.59.0}/gea/alarm_engine.py +0 -0
  21. {gea_program-0.58.0 → gea_program-0.59.0}/gea/alerts.py +0 -0
  22. {gea_program-0.58.0 → gea_program-0.59.0}/gea/backup.py +0 -0
  23. {gea_program-0.58.0 → gea_program-0.59.0}/gea/bench.py +0 -0
  24. {gea_program-0.58.0 → gea_program-0.59.0}/gea/blind_harness.py +0 -0
  25. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  26. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  27. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  28. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  29. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  30. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  31. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  32. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  33. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  34. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  35. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  36. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  37. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  38. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  39. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  40. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  41. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  42. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  43. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  44. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  45. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  46. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  47. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  48. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  49. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  50. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  51. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  52. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  53. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  54. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  55. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  56. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  57. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  58. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  59. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  60. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  61. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  62. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  63. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  64. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  65. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  66. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  67. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  68. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  69. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  70. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  71. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  72. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  73. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  74. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  75. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  76. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  77. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  78. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  79. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  80. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  81. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  82. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  83. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  84. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  85. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  86. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  87. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  88. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  89. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  90. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  91. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  92. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/med_160_sapropels.txt +0 -0
  93. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  94. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  95. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  96. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  97. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  98. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  99. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  100. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  101. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  102. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  103. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  104. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  105. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  106. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  107. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  108. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  109. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  110. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  111. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  112. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  113. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  114. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  115. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  116. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  117. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  118. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  119. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  120. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  121. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  122. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  123. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  124. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  125. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  126. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  127. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  128. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  129. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog_map.py +0 -0
  130. {gea_program-0.58.0 → gea_program-0.59.0}/gea/catalog_register.py +0 -0
  131. {gea_program-0.58.0 → gea_program-0.59.0}/gea/certificates.py +0 -0
  132. {gea_program-0.58.0 → gea_program-0.59.0}/gea/cli.py +0 -0
  133. {gea_program-0.58.0 → gea_program-0.59.0}/gea/client_reports.py +0 -0
  134. {gea_program-0.58.0 → gea_program-0.59.0}/gea/collision.py +0 -0
  135. {gea_program-0.58.0 → gea_program-0.59.0}/gea/config_versioning.py +0 -0
  136. {gea_program-0.58.0 → gea_program-0.59.0}/gea/conformance.py +0 -0
  137. {gea_program-0.58.0 → gea_program-0.59.0}/gea/control_room.py +0 -0
  138. {gea_program-0.58.0 → gea_program-0.59.0}/gea/correlation.py +0 -0
  139. {gea_program-0.58.0 → gea_program-0.59.0}/gea/dashboard.py +0 -0
  140. {gea_program-0.58.0 → gea_program-0.59.0}/gea/decline.py +0 -0
  141. {gea_program-0.58.0 → gea_program-0.59.0}/gea/deviation.py +0 -0
  142. {gea_program-0.58.0 → gea_program-0.59.0}/gea/dlis.py +0 -0
  143. {gea_program-0.58.0 → gea_program-0.59.0}/gea/dnp3.py +0 -0
  144. {gea_program-0.58.0 → gea_program-0.59.0}/gea/doctor.py +0 -0
  145. {gea_program-0.58.0 → gea_program-0.59.0}/gea/dossier.py +0 -0
  146. {gea_program-0.58.0 → gea_program-0.59.0}/gea/dossier_verify.py +0 -0
  147. {gea_program-0.58.0 → gea_program-0.59.0}/gea/downhole_engine.py +0 -0
  148. {gea_program-0.58.0 → gea_program-0.59.0}/gea/drift_monitor.py +0 -0
  149. {gea_program-0.58.0 → gea_program-0.59.0}/gea/drill_string.py +0 -0
  150. {gea_program-0.58.0 → gea_program-0.59.0}/gea/earth_model.py +0 -0
  151. {gea_program-0.58.0 → gea_program-0.59.0}/gea/economics.py +0 -0
  152. {gea_program-0.58.0 → gea_program-0.59.0}/gea/ed25519.py +0 -0
  153. {gea_program-0.58.0 → gea_program-0.59.0}/gea/edr.py +0 -0
  154. {gea_program-0.58.0 → gea_program-0.59.0}/gea/elevation.py +0 -0
  155. {gea_program-0.58.0 → gea_program-0.59.0}/gea/etp.py +0 -0
  156. {gea_program-0.58.0 → gea_program-0.59.0}/gea/etp12_schemas.json +0 -0
  157. {gea_program-0.58.0 → gea_program-0.59.0}/gea/example_register_map.json +0 -0
  158. {gea_program-0.58.0 → gea_program-0.59.0}/gea/fat_sat.py +0 -0
  159. {gea_program-0.58.0 → gea_program-0.59.0}/gea/files.py +0 -0
  160. {gea_program-0.58.0 → gea_program-0.59.0}/gea/fixtures/README.md +0 -0
  161. {gea_program-0.58.0 → gea_program-0.59.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  162. {gea_program-0.58.0 → gea_program-0.59.0}/gea/fixtures/comcat_mahoning_1990-2026.txt +0 -0
  163. {gea_program-0.58.0 → gea_program-0.59.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  164. {gea_program-0.58.0 → gea_program-0.59.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  165. {gea_program-0.58.0 → gea_program-0.59.0}/gea/follower.py +0 -0
  166. {gea_program-0.58.0 → gea_program-0.59.0}/gea/forward_model.py +0 -0
  167. {gea_program-0.58.0 → gea_program-0.59.0}/gea/frac_hits.py +0 -0
  168. {gea_program-0.58.0 → gea_program-0.59.0}/gea/friction_priors.py +0 -0
  169. {gea_program-0.58.0 → gea_program-0.59.0}/gea/gamma.py +0 -0
  170. {gea_program-0.58.0 → gea_program-0.59.0}/gea/gauge_aging.py +0 -0
  171. {gea_program-0.58.0 → gea_program-0.59.0}/gea/gauge_specs.py +0 -0
  172. {gea_program-0.58.0 → gea_program-0.59.0}/gea/geodesy.py +0 -0
  173. {gea_program-0.58.0 → gea_program-0.59.0}/gea/geomag.py +0 -0
  174. {gea_program-0.58.0 → gea_program-0.59.0}/gea/gravity_reference.py +0 -0
  175. {gea_program-0.58.0 → gea_program-0.59.0}/gea/hartip.py +0 -0
  176. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/IT_SECURITY.md +0 -0
  177. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/TESTER_GUIDE.md +0 -0
  178. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/alarms.md +0 -0
  179. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/alerts.md +0 -0
  180. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/audit-update.md +0 -0
  181. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/backup.md +0 -0
  182. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/catalog.md +0 -0
  183. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/charts.md +0 -0
  184. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/collision.md +0 -0
  185. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/company-sign-in.md +0 -0
  186. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/conformance.md +0 -0
  187. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/control-room.md +0 -0
  188. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/data-in.md +0 -0
  189. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/decline.md +0 -0
  190. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/dlis.md +0 -0
  191. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/doctor.md +0 -0
  192. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/dossier.md +0 -0
  193. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/drift.md +0 -0
  194. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/drillstring.md +0 -0
  195. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/economics.md +0 -0
  196. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/edr.md +0 -0
  197. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/etp.md +0 -0
  198. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/field-ports.md +0 -0
  199. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/files.md +0 -0
  200. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/frac-hits.md +0 -0
  201. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/historian.md +0 -0
  202. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/https.md +0 -0
  203. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/instruments.md +0 -0
  204. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/interval.md +0 -0
  205. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/invoice-check.md +0 -0
  206. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/map.md +0 -0
  207. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/month-end.md +0 -0
  208. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/notifications.md +0 -0
  209. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/opseis.md +0 -0
  210. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/osdu.md +0 -0
  211. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/pad-summary.md +0 -0
  212. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/patches.md +0 -0
  213. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/penetrator.md +0 -0
  214. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/plan.md +0 -0
  215. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/pore-pressure.md +0 -0
  216. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/ppdm.md +0 -0
  217. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/quakeml.md +0 -0
  218. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/quality.md +0 -0
  219. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/report-history.md +0 -0
  220. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/rig-time.md +0 -0
  221. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/seedlink.md +0 -0
  222. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/seismic.md +0 -0
  223. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/setup.md +0 -0
  224. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/simulation.md +0 -0
  225. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/site.md +0 -0
  226. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/sites.md +0 -0
  227. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/slip.md +0 -0
  228. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/soak.md +0 -0
  229. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/sra.md +0 -0
  230. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/start.md +0 -0
  231. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/structure.md +0 -0
  232. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/tools.md +0 -0
  233. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/transients.md +0 -0
  234. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/upkeep.md +0 -0
  235. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/vibration.md +0 -0
  236. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/well-report.md +0 -0
  237. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/well-tests.md +0 -0
  238. {gea_program-0.58.0 → gea_program-0.59.0}/gea/help/well3d.md +0 -0
  239. {gea_program-0.58.0 → gea_program-0.59.0}/gea/helplib.py +0 -0
  240. {gea_program-0.58.0 → gea_program-0.59.0}/gea/housekeeping.py +0 -0
  241. {gea_program-0.58.0 → gea_program-0.59.0}/gea/interval.py +0 -0
  242. {gea_program-0.58.0 → gea_program-0.59.0}/gea/inverse_engine.py +0 -0
  243. {gea_program-0.58.0 → gea_program-0.59.0}/gea/invoice_check.py +0 -0
  244. {gea_program-0.58.0 → gea_program-0.59.0}/gea/jobs.py +0 -0
  245. {gea_program-0.58.0 → gea_program-0.59.0}/gea/live_ports.py +0 -0
  246. {gea_program-0.58.0 → gea_program-0.59.0}/gea/loadtest.py +0 -0
  247. {gea_program-0.58.0 → gea_program-0.59.0}/gea/matplotlib_demo.py +0 -0
  248. {gea_program-0.58.0 → gea_program-0.59.0}/gea/modbus.py +0 -0
  249. {gea_program-0.58.0 → gea_program-0.59.0}/gea/modbus_rtu.py +0 -0
  250. {gea_program-0.58.0 → gea_program-0.59.0}/gea/model_card.py +0 -0
  251. {gea_program-0.58.0 → gea_program-0.59.0}/gea/month_end.py +0 -0
  252. {gea_program-0.58.0 → gea_program-0.59.0}/gea/mqtt_port.py +0 -0
  253. {gea_program-0.58.0 → gea_program-0.59.0}/gea/notify.py +0 -0
  254. {gea_program-0.58.0 → gea_program-0.59.0}/gea/oidc.py +0 -0
  255. {gea_program-0.58.0 → gea_program-0.59.0}/gea/oidc_mock.py +0 -0
  256. {gea_program-0.58.0 → gea_program-0.59.0}/gea/op_seismicity.py +0 -0
  257. {gea_program-0.58.0 → gea_program-0.59.0}/gea/opcua_port.py +0 -0
  258. {gea_program-0.58.0 → gea_program-0.59.0}/gea/operator_app.py +0 -0
  259. {gea_program-0.58.0 → gea_program-0.59.0}/gea/osdu.py +0 -0
  260. {gea_program-0.58.0 → gea_program-0.59.0}/gea/pad_summary.py +0 -0
  261. {gea_program-0.58.0 → gea_program-0.59.0}/gea/patches.py +0 -0
  262. {gea_program-0.58.0 → gea_program-0.59.0}/gea/pdf_report.py +0 -0
  263. {gea_program-0.58.0 → gea_program-0.59.0}/gea/penetrator.py +0 -0
  264. {gea_program-0.58.0 → gea_program-0.59.0}/gea/permits.py +0 -0
  265. {gea_program-0.58.0 → gea_program-0.59.0}/gea/piwebapi.py +0 -0
  266. {gea_program-0.58.0 → gea_program-0.59.0}/gea/pore_pressure.py +0 -0
  267. {gea_program-0.58.0 → gea_program-0.59.0}/gea/ports.py +0 -0
  268. {gea_program-0.58.0 → gea_program-0.59.0}/gea/ppdm.py +0 -0
  269. {gea_program-0.58.0 → gea_program-0.59.0}/gea/profile_catalog.py +0 -0
  270. {gea_program-0.58.0 → gea_program-0.59.0}/gea/project.py +0 -0
  271. {gea_program-0.58.0 → gea_program-0.59.0}/gea/qt6_downhole_app.py +0 -0
  272. {gea_program-0.58.0 → gea_program-0.59.0}/gea/quakeml.py +0 -0
  273. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reconciler.py +0 -0
  274. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  275. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  276. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/WMM2025.COF +0 -0
  277. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/eia_henry_hub_daily.csv.gz +0 -0
  278. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/eia_prices.provenance.json +0 -0
  279. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/eia_wti_daily.csv.gz +0 -0
  280. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/iscwsa_rev4_example.json +0 -0
  281. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/iscwsa_rev5_example.json +0 -0
  282. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/l0701_sonic_gr.las.gz +0 -0
  283. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/l0701_sonic_gr.provenance.json +0 -0
  284. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  285. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  286. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  287. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  288. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/mahoning_example.json +0 -0
  289. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/mud_motor_specs.json +0 -0
  290. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/owsg_tool_models.json +0 -0
  291. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/penetrator_ratings.json +0 -0
  292. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/seismicity_protocols.json +0 -0
  293. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/tool_sources.json +0 -0
  294. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/us_outline.json +0 -0
  295. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/us_outline.provenance.json +0 -0
  296. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_3d.provenance.json +0 -0
  297. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_f4_interpretation.las.gz +0 -0
  298. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_f4_logs.provenance.json +0 -0
  299. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_f4_lwd.las.gz +0 -0
  300. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_surfaces.json.gz +0 -0
  301. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_traj_F-10.xml.gz +0 -0
  302. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_traj_F-4.xml.gz +0 -0
  303. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
  304. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
  305. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
  306. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
  307. {gea_program-0.58.0 → gea_program-0.59.0}/gea/reference/volve_well_picks.csv.gz +0 -0
  308. {gea_program-0.58.0 → gea_program-0.59.0}/gea/report_history.py +0 -0
  309. {gea_program-0.58.0 → gea_program-0.59.0}/gea/rig_state.py +0 -0
  310. {gea_program-0.58.0 → gea_program-0.59.0}/gea/rock_inventory.py +0 -0
  311. {gea_program-0.58.0 → gea_program-0.59.0}/gea/sample_record.py +0 -0
  312. {gea_program-0.58.0 → gea_program-0.59.0}/gea/sample_well_profile.csv +0 -0
  313. {gea_program-0.58.0 → gea_program-0.59.0}/gea/sbom.py +0 -0
  314. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seedlink.py +0 -0
  315. {gea_program-0.58.0 → gea_program-0.59.0}/gea/segy.py +0 -0
  316. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic.py +0 -0
  317. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_array.py +0 -0
  318. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_assoc.py +0 -0
  319. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_detect.py +0 -0
  320. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_film.py +0 -0
  321. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_harmonic.py +0 -0
  322. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_qc.py +0 -0
  323. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_response.py +0 -0
  324. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_signature.py +0 -0
  325. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_track.py +0 -0
  326. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_uncertainty.py +0 -0
  327. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_unlisted.py +0 -0
  328. {gea_program-0.58.0 → gea_program-0.59.0}/gea/seismic_watch.py +0 -0
  329. {gea_program-0.58.0 → gea_program-0.59.0}/gea/sensor_swap.py +0 -0
  330. {gea_program-0.58.0 → gea_program-0.59.0}/gea/series_cache.py +0 -0
  331. {gea_program-0.58.0 → gea_program-0.59.0}/gea/service_life.py +0 -0
  332. {gea_program-0.58.0 → gea_program-0.59.0}/gea/setup_checklist.py +0 -0
  333. {gea_program-0.58.0 → gea_program-0.59.0}/gea/shapefile.py +0 -0
  334. {gea_program-0.58.0 → gea_program-0.59.0}/gea/shell.py +0 -0
  335. {gea_program-0.58.0 → gea_program-0.59.0}/gea/shut_in.py +0 -0
  336. {gea_program-0.58.0 → gea_program-0.59.0}/gea/simulation.py +0 -0
  337. {gea_program-0.58.0 → gea_program-0.59.0}/gea/site_map.py +0 -0
  338. {gea_program-0.58.0 → gea_program-0.59.0}/gea/sla_report.py +0 -0
  339. {gea_program-0.58.0 → gea_program-0.59.0}/gea/slip.py +0 -0
  340. {gea_program-0.58.0 → gea_program-0.59.0}/gea/soak.py +0 -0
  341. {gea_program-0.58.0 → gea_program-0.59.0}/gea/sra.py +0 -0
  342. {gea_program-0.58.0 → gea_program-0.59.0}/gea/store_forward.py +0 -0
  343. {gea_program-0.58.0 → gea_program-0.59.0}/gea/strata_join.py +0 -0
  344. {gea_program-0.58.0 → gea_program-0.59.0}/gea/structure.py +0 -0
  345. {gea_program-0.58.0 → gea_program-0.59.0}/gea/supervisor.py +0 -0
  346. {gea_program-0.58.0 → gea_program-0.59.0}/gea/survey_cmd.py +0 -0
  347. {gea_program-0.58.0 → gea_program-0.59.0}/gea/survey_view.py +0 -0
  348. {gea_program-0.58.0 → gea_program-0.59.0}/gea/telemetry.py +0 -0
  349. {gea_program-0.58.0 → gea_program-0.59.0}/gea/tls.py +0 -0
  350. {gea_program-0.58.0 → gea_program-0.59.0}/gea/tool_catalog.py +0 -0
  351. {gea_program-0.58.0 → gea_program-0.59.0}/gea/tool_library.py +0 -0
  352. {gea_program-0.58.0 → gea_program-0.59.0}/gea/tool_taxonomy.py +0 -0
  353. {gea_program-0.58.0 → gea_program-0.59.0}/gea/transient.py +0 -0
  354. {gea_program-0.58.0 → gea_program-0.59.0}/gea/vibration.py +0 -0
  355. {gea_program-0.58.0 → gea_program-0.59.0}/gea/well3d.py +0 -0
  356. {gea_program-0.58.0 → gea_program-0.59.0}/gea/well_assembler.py +0 -0
  357. {gea_program-0.58.0 → gea_program-0.59.0}/gea/well_report.py +0 -0
  358. {gea_program-0.58.0 → gea_program-0.59.0}/gea/well_test_validation.py +0 -0
  359. {gea_program-0.58.0 → gea_program-0.59.0}/gea/wellplan.py +0 -0
  360. {gea_program-0.58.0 → gea_program-0.59.0}/gea/wellpos.py +0 -0
  361. {gea_program-0.58.0 → gea_program-0.59.0}/gea/wits0.py +0 -0
  362. {gea_program-0.58.0 → gea_program-0.59.0}/gea/witsml.py +0 -0
  363. {gea_program-0.58.0 → gea_program-0.59.0}/gea/workspace.py +0 -0
  364. {gea_program-0.58.0 → gea_program-0.59.0}/gea/xlsx_read.py +0 -0
  365. {gea_program-0.58.0 → gea_program-0.59.0}/gea_program.egg-info/SOURCES.txt +0 -0
  366. {gea_program-0.58.0 → gea_program-0.59.0}/gea_program.egg-info/dependency_links.txt +0 -0
  367. {gea_program-0.58.0 → gea_program-0.59.0}/gea_program.egg-info/entry_points.txt +0 -0
  368. {gea_program-0.58.0 → gea_program-0.59.0}/gea_program.egg-info/requires.txt +0 -0
  369. {gea_program-0.58.0 → gea_program-0.59.0}/gea_program.egg-info/top_level.txt +0 -0
  370. {gea_program-0.58.0 → gea_program-0.59.0}/setup.cfg +0 -0
  371. {gea_program-0.58.0 → gea_program-0.59.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.58.0
3
+ Version: 0.59.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
@@ -659,6 +659,20 @@ EIA) or a declared price, with the net revenue interest, severance tax and
659
659
  operating cost declared. A forecast is not a reserves report, and the page
660
660
  says so. The **Decline curves** tab, `gea decline`, `gea help decline`.
661
661
 
662
+ ### The declarations workbook
663
+
664
+ Everything the operator declares about a pad goes in through one sheet -
665
+ `gea declare --workspace C:\site --template pad3.xlsx` writes it as an
666
+ Excel workbook already filled with what is declared; `gea declare
667
+ --workspace C:\site --file pad3.xlsx` checks it row by row and `--apply`
668
+ writes it. Beside the wells, rates, runs and casing, it carries the
669
+ engineering: the survey program and plans, pore pressure and measured
670
+ pressures, the torque-and-drag string, the hydraulics (string, hole, mud,
671
+ viscometer, nozzles), frac stage tables and monitored wells, production
672
+ and the decline terms. A well with no directional survey is read on the
673
+ drilling recorder's own Interpolated TVD where one is needed, labelled as
674
+ the recorder's interpolation. `gea help declare`.
675
+
662
676
  ### Hydraulics and ECD
663
677
 
664
678
  The pressures the mud makes while it circulates, from the six-speed
@@ -620,6 +620,20 @@ EIA) or a declared price, with the net revenue interest, severance tax and
620
620
  operating cost declared. A forecast is not a reserves report, and the page
621
621
  says so. The **Decline curves** tab, `gea decline`, `gea help decline`.
622
622
 
623
+ ### The declarations workbook
624
+
625
+ Everything the operator declares about a pad goes in through one sheet -
626
+ `gea declare --workspace C:\site --template pad3.xlsx` writes it as an
627
+ Excel workbook already filled with what is declared; `gea declare
628
+ --workspace C:\site --file pad3.xlsx` checks it row by row and `--apply`
629
+ writes it. Beside the wells, rates, runs and casing, it carries the
630
+ engineering: the survey program and plans, pore pressure and measured
631
+ pressures, the torque-and-drag string, the hydraulics (string, hole, mud,
632
+ viscometer, nozzles), frac stage tables and monitored wells, production
633
+ and the decline terms. A well with no directional survey is read on the
634
+ drilling recorder's own Interpolated TVD where one is needed, labelled as
635
+ the recorder's interpolation. `gea help declare`.
636
+
623
637
  ### Hydraulics and ECD
624
638
 
625
639
  The pressures the mud makes while it circulates, from the six-speed
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.58.0"
126
+ __version__ = "0.59.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -533,11 +533,11 @@ def main(argv=None) -> int:
533
533
  p_ds.add_argument("--actor", type=str, default="cli")
534
534
  p_ds.add_argument("--json", action="store_true")
535
535
 
536
- p_dc = sub.add_parser("declare", help="the declarations sheet: wells' identity, position and elevation, surveys, rates, items and AFEs, fleet tools, drill-string runs, ESP penetrators and drives - one CSV, checked against the workspace before anything is written")
536
+ p_dc = sub.add_parser("declare", help="the declarations sheet: wells' identity, position and elevation, surveys, rates, items and AFEs, fleet tools, drill-string runs, ESP penetrators and drives, the survey program and plans, pore pressure, torque and drag, hydraulics, frac stages, production - one CSV or Excel workbook, checked against the workspace before anything is written")
537
537
  p_dc.add_argument("--workspace", type=str, required=True)
538
538
  p_dc.add_argument("--file", type=str, default=None, help="the sheet (CSV); every row is planned NEW, CHANGE or SAME and nothing is written without --apply")
539
539
  p_dc.add_argument("--apply", action="store_true", help="write the NEW and CHANGE rows (only when the sheet has no error)")
540
- p_dc.add_argument("--template", type=str, default=None, help="write the sheet for this workspace, filled with what is already declared, to this path")
540
+ p_dc.add_argument("--template", type=str, default=None, help="write the sheet for this workspace, filled with what is already declared, to this path (.xlsx: an Excel workbook; otherwise CSV)")
541
541
  p_dc.add_argument("--actor", type=str, default="cli")
542
542
  p_dc.add_argument("--json", action="store_true")
543
543
 
@@ -2352,8 +2352,11 @@ def main(argv=None) -> int:
2352
2352
  except WorkspaceError as e:
2353
2353
  raise SystemExit(f"declare: {e}")
2354
2354
  if a.template:
2355
- with open(a.template, "w", encoding="utf-8", newline="") as f:
2356
- f.write(_DC.template(ws))
2355
+ if a.template.lower().endswith(".xlsx"):
2356
+ _DC.template_xlsx(ws, a.template)
2357
+ else:
2358
+ with open(a.template, "w", encoding="utf-8", newline="") as f:
2359
+ f.write(_DC.template(ws))
2357
2360
  print(f"wrote {a.template}: fill in the blanks, then gea declare --workspace {a.workspace} --file {a.template}")
2358
2361
  return 0
2359
2362
  if not a.file:
@@ -13002,6 +13002,142 @@ def section_da_hydraulics(tmp: str) -> None:
13002
13002
  + (f" [failed: {', '.join(failed4)}]" if failed4 else ""))
13003
13003
 
13004
13004
 
13005
+ def section_db_declarations_engineering(tmp: str) -> None:
13006
+ """Section DB - the declarations sheet carries the engineering: the survey program, a plan, the pore-pressure
13007
+ settings and a measured pressure, the torque-and-drag string, the hydraulics, a frac stage table and its monitor,
13008
+ production and the decline terms - planned NEW, written, then SAME on a second import and from the template; every
13009
+ malformed row refused with nothing written; the sheet as an Excel workbook; a well with no survey read on the
13010
+ drilling recorder's own TVD, labelled so."""
13011
+ import csv as _csv
13012
+ import io as _io
13013
+ import shutil as _sh
13014
+ import subprocess as _sp
13015
+ from . import __version__ as _ver
13016
+ from . import declarations as DC
13017
+ from . import decline as DCA
13018
+ from . import edr as E
13019
+ from . import frac_hits as FH
13020
+ from . import helplib as H
13021
+ from . import hydraulics as HY
13022
+ from . import pore_pressure as PPF
13023
+ from . import torque_drag as TND
13024
+ from . import wellplan as WPL
13025
+ from . import xlsx_read as XR
13026
+ from .workspace import Workspace
13027
+ pkg = Path(__file__).parent
13028
+ d = Path(tmp, "declare_eng"); d.mkdir()
13029
+ hy = HY.selftest_files(str(d / "hy"))
13030
+ fh = FH.selftest_files(str(d / "fh"))
13031
+ dc = DCA.selftest_files(str(d / "dc"))
13032
+ wsp = str(d / "ws"); ws = Workspace.create(wsp, "Pad 3", actor="tester")
13033
+ w1 = ws.add_well_file(hy["record"], display="HY-1", actor="tester")["id"]
13034
+ w2 = ws.add_well_file(fh["gauge"], display="MON-1", actor="tester")["id"]
13035
+ sheet_dir = d / "sheet"; sheet_dir.mkdir()
13036
+ _sh.copy(hy["survey"], sheet_dir / "plan.csv"); _sh.copy(fh["stages"], sheet_dir / "stages.csv"); _sh.copy(dc["path"], sheet_dir / "production.csv")
13037
+ rows = [
13038
+ ["[survey_program]", "well", "program", "source"], ["", "HY-1", "0-1000:MWD+SRGM, 1000-:MWD+IFR1", "survey program rev 1 (test)"],
13039
+ ["[plans]", "well", "file", "azimuth_reference", "md_unit", "source"], ["", "HY-1", "plan.csv", "true", "ft", "well plan rev 2 (test)"],
13040
+ ["[pore_pressure]", "well", "indicator", "bit_in", "nct_top_m", "nct_bottom_m", "source"], ["", "HY-1", "dexponent", "8.75", "1300", "2000", "drilling program (test)"],
13041
+ ["[pressures]", "well", "depth_m", "depth_kind", "value", "unit", "kind", "source"], ["", "HY-1", "2100", "tvd", "13.5", "ppg", "lot", "LOT at the 9-5/8 shoe (test)"],
13042
+ ["[torque_drag]", "well", "string", "mud_ppg", "mu_cased", "mu_open", "source"], ["", "HY-1", "BHA:350:6.75:95:6.75; drill pipe::5:22.6:6.625", "11", "0.2", "0.28", "BHA report (test)"],
13043
+ ["[hydraulics]", "well", "string", "hole", "mw_ppg", "fann", "flow_gpm", "nozzles_32", "bit_in", "tools_psi", "pp_ppg", "fg_ppg", "source"],
13044
+ ["", "HY-1", "BHA:350:6.75:2.875; drill pipe::5:4.276", "9-5/8 casing:3500:8.681; open hole::8.75", "11", "600=60 300=38 100=21 6=7 3=6", "500",
13045
+ "14 14 14 14 14", "8.75", "400", "9.5", "14.5", "mud report (test)"],
13046
+ ["[frac_stages]", "well", "file", "depth_unit", "source"], ["", "HY-1", "stages.csv", "ft", "post-job report (test)"],
13047
+ ["[frac_monitors]", "well", "channel"], ["", "MON-1", "P_gauge_psi"],
13048
+ ["[production]", "well", "file", "source"], ["", "HY-1", "production.csv", "monthly report (test)"],
13049
+ ["[decline_terms]", "well", "terminal_decline", "price_basis", "oil_price", "gas_price", "opex_month", "source"], ["", "HY-1", "0.08", "flat", "70", "3", "9000", "budget deck (test)"],
13050
+ ]
13051
+ buf = _io.StringIO(); _csv.writer(buf, lineterminator="\n").writerows(rows); text = buf.getvalue()
13052
+ p1 = DC.apply(ws, text, "tester", str(sheet_dir))
13053
+ a1 = DC.apply(ws, text, "tester", str(sheet_dir), write=True)
13054
+ p2 = DC.apply(ws, text, "tester", str(sheet_dir))
13055
+ tpl = DC.template(ws)
13056
+ pt = DC.apply(ws, tpl, "tester", str(sheet_dir))
13057
+ hcfg, tcfg, pcfg = HY.well_config(ws, w1), TND.well_config(ws, w1), PPF.well_config(ws, w1)
13058
+ meas = (PPF._load(ws).get("measured") or {}).get(w1) or []
13059
+ c1 = {
13060
+ "planned": not p1["errors"] and p1["counts"]["NEW"] == 10 and p1["counts"]["CHANGE"] == 0 and sorted({s["table"] for s in p1["steps"]}) == sorted(DC.ENG_ORDER),
13061
+ "written": a1["applied"] and len(a1["written"]) == 10,
13062
+ "landed": WPL.well_settings(ws, w1)["program"] == [{"to_md_m": 1000.0, "model": "MWD+SRGM"}, {"to_md_m": None, "model": "MWD+IFR1"}]
13063
+ and bool(ws.well(w1).get("plan")) and pcfg["indicator"] == "dexponent" and pcfg["bit_in"] == 8.75
13064
+ and meas and meas[0]["kind"] == "lot" and meas[0]["unit"] == "ppg" and len(tcfg["string"]) == 2 and tcfg["mu_open"] == 0.28
13065
+ and hcfg["fann"] == {"600": 60.0, "300": 38.0, "100": 21.0, "6": 7.0, "3": 6.0} and hcfg["nozzles_32"] == [14.0] * 5 and len(hcfg["hole"]) == 2
13066
+ and FH.stages(ws).get(w1, {}).get("stages") == 6 and FH.settings(ws)["monitors"].get(w2, {}).get("channel") == "P_gauge_psi"
13067
+ and DCA.production(ws, w1) and DCA.well_config(ws, w1)["oil_price"] == 70.0,
13068
+ "again": not p2["errors"] and p2["counts"]["NEW"] == 0 and p2["counts"]["CHANGE"] == 0 and p2["counts"]["SAME"] == 10,
13069
+ "template": not pt["errors"] and pt["counts"]["NEW"] == 0 and pt["counts"]["CHANGE"] == 0 and all(f"[{t}]" in tpl for t in DC.ENG_ORDER),
13070
+ }
13071
+ failed1 = [k for k, v in c1.items() if not v]
13072
+ ok(not failed1,
13073
+ "DB1 one sheet carries the engineering - the survey program, a plan, the pore-pressure settings and a leak-off test, the torque-and-drag string, "
13074
+ "the hydraulics (string, hole, mud, viscometer, nozzles), a frac stage table and its monitored well, production and the decline terms: ten rows "
13075
+ "planned NEW, written through each tab's own function, SAME on a second import; the template lists every table and carries what is declared, "
13076
+ "so importing it writes nothing" + (f" [failed: {', '.join(failed1)}]" if failed1 else ""))
13077
+
13078
+ # -- DB2 every malformed row refused, nothing written ---------------------------------------------------------------------
13079
+ bad = {
13080
+ "survey_program": ["", "HY-1", "0-1000:NO-SUCH-TOOL", "x"], "plans": ["", "HY-1", "missing.csv", "true", "ft", "x"],
13081
+ "pore_pressure": ["", "HY-1", "dexponent", "99", "1300", "2000", "x"], "pressures": ["", "HY-1", "2100", "tvd", "13.5", "ppg", "guess", "x"],
13082
+ "torque_drag": ["", "HY-1", "BHA:350", "11", "0.2", "0.28", "x"],
13083
+ "hydraulics": ["", "HY-1", "", "", "11", "600:60", "500", "40 40", "8.75", "400", "9.5", "14.5", "x"],
13084
+ "frac_stages": ["", "HY-1", "stages.csv", "yards", "x"], "decline_terms": ["", "HY-1", "0.08", "spot", "70", "3", "9000", "x"],
13085
+ }
13086
+ errs = {}
13087
+ for t, r in bad.items():
13088
+ hdr = next(x for x in rows if x[0] == f"[{t}]")
13089
+ b_ = _io.StringIO(); _csv.writer(b_, lineterminator="\n").writerows([hdr, r]); bp = DC.apply(ws, b_.getvalue(), "tester", str(sheet_dir), write=True)
13090
+ errs[t] = (len(bp["errors"]) == 1 and not bp["written"] and not bp["applied"])
13091
+ mixed = rows[:2] + [["[pressures]", "well", "depth_m", "value", "kind", "source"], ["", "HY-1", "-5", "13", "pore", "x"]]
13092
+ b_ = _io.StringIO(); _csv.writer(b_, lineterminator="\n").writerows(mixed); mp = DC.apply(ws, b_.getvalue(), "tester", str(sheet_dir), write=True)
13093
+ ok(all(errs.values()) and len(mp["errors"]) == 1 and not mp["written"],
13094
+ "DB2 a tool model that does not exist, a plan file that is not there, a bit size out of range, a pressure of no known kind, a string section "
13095
+ "short of its figures, a viscometer pair without '=' and nozzles over 32/32, a depth unit of yards, a price basis of 'spot' - each refused with "
13096
+ "its row named; a sheet with one bad row writes none of its good rows"
13097
+ + (f" [failed: {', '.join(k for k, v in errs.items() if not v)}]" if not all(errs.values()) else ""))
13098
+
13099
+ # -- DB3 the sheet as an Excel workbook --------------------------------------------------------------------------------
13100
+ xp = str(d / "declarations.xlsx")
13101
+ DC.template_xlsx(ws, xp)
13102
+ xb = Path(xp).read_bytes()
13103
+ px = DC.apply(ws, XR.text_of(xb), "tester", str(sheet_dir))
13104
+ cli_t = _sp.run([sys.executable, "-m", "gea", "declare", "--workspace", wsp, "--template", str(d / "t2.xlsx")], capture_output=True, text=True, cwd=str(pkg.parent))
13105
+ cli_p = _sp.run([sys.executable, "-m", "gea", "declare", "--workspace", wsp, "--file", str(d / "t2.xlsx")], capture_output=True, text=True, cwd=str(pkg.parent))
13106
+ ok(XR.is_xlsx(xb) and not px["errors"] and px["counts"]["NEW"] == 0 and px["counts"]["CHANGE"] == 0 and px["counts"]["SAME"] >= 10
13107
+ and cli_t.returncode == 0 and XR.is_xlsx(Path(d / "t2.xlsx").read_bytes()) and cli_p.returncode == 0 and "nothing to write" in cli_p.stdout,
13108
+ "DB3 the template as an Excel workbook (gea declare --template declarations.xlsx, and the Download on the Setup page): a workbook the import "
13109
+ "reads back to the same plan - nothing new to write")
13110
+
13111
+ # -- DB4 no survey: the recorder's own TVD -------------------------------------------------------------------------------
13112
+ st = E.read(hy["record"])
13113
+ out = Path(ws.reports_dir, "wells", w1); out.mkdir(parents=True, exist_ok=True)
13114
+ E.write_record(st, str(out), _ver)
13115
+ rp = HY.recorder_path(ws, w1)
13116
+ r_h = HY.page(ws, "workspace", w1)["result"]
13117
+ TND.set_well(ws, "tester", w1, "BHA report (test)", TND.parse_string("BHA:350:6.75:95:6.75; drill pipe::5:22.6:6.625"), 11)
13118
+ r_t = TND.page(ws, "workspace", w1)["result"]
13119
+ from . import well3d as W
13120
+ W.attach_trajectory(ws, w1, "s.csv", Path(hy["survey"]).read_bytes(), "tester", "true", "ft", None, None, None, "test survey")
13121
+ r_s = HY.page(ws, "workspace", w1)["result"]
13122
+ help_txt = H.page("declare") or ""
13123
+ page_src = (pkg / "web" / "app.html").read_text(encoding="utf-8")
13124
+ c4 = {
13125
+ "path": rp and rp["md_ft"][0] == 0.0 and abs(max(rp["tvd_ft"]) - 7480.0) < 30.0 and max(rp["inc_deg"]) <= 61.0 and "not a survey" in rp["source"],
13126
+ "hydraulics": r_h and r_h["path_from"] == "recorder" and "Interpolated TVD" in r_h["how"] and abs(r_h["record"]["median_difference_psi"] - hy["offset_psi"]) <= 10.0
13127
+ and abs(r_h["tvd_td_ft"] - r_s["tvd_td_ft"]) < 30.0,
13128
+ "torque_drag": r_t and r_t["path_from"] == "recorder" and "one vertical plane" in r_t["how"] and 55.0 <= r_t["max_inc_deg"] <= 61.0,
13129
+ "survey_first": r_s["path_from"] == "survey",
13130
+ "help": not H.check("declare") and all(f"[{t}]" in help_txt for t in DC.ENG_ORDER) and "Interpolated TVD" in (H.page("hydraulics") or "")
13131
+ and "/api/declare/template?format=xlsx" in page_src,
13132
+ }
13133
+ failed4 = [k for k, v in c4.items() if not v]
13134
+ ok(not failed4,
13135
+ "DB4 a well with no survey attached is read on the drilling recorder's own Interpolated TVD, labelled as the recorder's interpolation and not a "
13136
+ "survey: the hydraulics' TVDs within 30 ft of the survey's and the standpipe offset recovered the same; torque and drag on an inclination-only path "
13137
+ "in one vertical plane, said so; a survey, once attached, is used instead; the help names every table"
13138
+ + (f" [failed: {', '.join(failed4)}]" if failed4 else ""))
13139
+
13140
+
13005
13141
  def PR_read_ok(path) -> bool:
13006
13142
  from . import pdf_report as PR
13007
13143
  try:
@@ -13118,6 +13254,7 @@ def main() -> int:
13118
13254
  section_cy_company_sign_in(tmp)
13119
13255
  section_cz_it_review(tmp)
13120
13256
  section_da_hydraulics(tmp)
13257
+ section_db_declarations_engineering(tmp)
13121
13258
  if _FAILS:
13122
13259
  print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
13123
13260
  for f in _FAILS: