gea-program 0.33.0__tar.gz → 0.34.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 (287) hide show
  1. {gea_program-0.33.0/gea_program.egg-info → gea_program-0.34.0}/PKG-INFO +18 -2
  2. {gea_program-0.33.0 → gea_program-0.34.0}/README.md +17 -1
  3. {gea_program-0.33.0 → gea_program-0.34.0}/gea/__init__.py +1 -1
  4. {gea_program-0.33.0 → gea_program-0.34.0}/gea/acceptance_tests.py +145 -0
  5. gea_program-0.34.0/gea/help/map.md +11 -0
  6. {gea_program-0.33.0 → gea_program-0.34.0}/gea/helplib.py +2 -1
  7. gea_program-0.34.0/gea/reference/us_outline.json +1 -0
  8. gea_program-0.34.0/gea/reference/us_outline.provenance.json +22 -0
  9. {gea_program-0.33.0 → gea_program-0.34.0}/gea/service.py +28 -0
  10. gea_program-0.34.0/gea/site_map.py +295 -0
  11. {gea_program-0.33.0 → gea_program-0.34.0}/gea/web/app.html +114 -1
  12. {gea_program-0.33.0 → gea_program-0.34.0/gea_program.egg-info}/PKG-INFO +18 -2
  13. {gea_program-0.33.0 → gea_program-0.34.0}/gea_program.egg-info/SOURCES.txt +4 -0
  14. {gea_program-0.33.0 → gea_program-0.34.0}/pyproject.toml +1 -1
  15. {gea_program-0.33.0 → gea_program-0.34.0}/LICENSE +0 -0
  16. {gea_program-0.33.0 → gea_program-0.34.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  17. {gea_program-0.33.0 → gea_program-0.34.0}/gea/__main__.py +0 -0
  18. {gea_program-0.33.0 → gea_program-0.34.0}/gea/accuracy_statement.py +0 -0
  19. {gea_program-0.33.0 → gea_program-0.34.0}/gea/alarm_engine.py +0 -0
  20. {gea_program-0.33.0 → gea_program-0.34.0}/gea/backup.py +0 -0
  21. {gea_program-0.33.0 → gea_program-0.34.0}/gea/bench.py +0 -0
  22. {gea_program-0.33.0 → gea_program-0.34.0}/gea/blind_harness.py +0 -0
  23. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  24. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  25. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  26. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  27. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  28. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  29. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  30. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  31. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  32. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  33. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  34. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  35. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  36. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  37. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  38. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  39. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  40. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  41. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  42. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  43. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  44. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  45. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  46. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  47. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  48. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  49. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  50. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  51. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  52. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  53. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  54. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  55. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  56. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  57. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  58. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  59. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  60. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  61. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  62. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  63. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  64. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  65. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  66. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  67. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  68. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  69. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  70. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  71. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  72. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  73. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  74. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  75. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  76. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  77. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  78. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  79. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  80. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  81. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  82. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  83. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  84. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  85. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  86. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  87. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  88. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  89. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  90. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/med_160_sapropels.txt +0 -0
  91. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  92. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  93. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  94. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  95. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  96. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  97. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  98. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  99. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  100. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  101. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  102. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  103. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  104. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  105. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  106. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  107. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  108. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  109. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  110. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  111. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  112. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  113. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  114. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  115. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  116. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  117. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  118. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  119. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  120. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  121. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  122. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  123. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  124. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  125. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  126. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  127. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog_map.py +0 -0
  128. {gea_program-0.33.0 → gea_program-0.34.0}/gea/catalog_register.py +0 -0
  129. {gea_program-0.33.0 → gea_program-0.34.0}/gea/certificates.py +0 -0
  130. {gea_program-0.33.0 → gea_program-0.34.0}/gea/cli.py +0 -0
  131. {gea_program-0.33.0 → gea_program-0.34.0}/gea/client_reports.py +0 -0
  132. {gea_program-0.33.0 → gea_program-0.34.0}/gea/config_versioning.py +0 -0
  133. {gea_program-0.33.0 → gea_program-0.34.0}/gea/conformance.py +0 -0
  134. {gea_program-0.33.0 → gea_program-0.34.0}/gea/correlation.py +0 -0
  135. {gea_program-0.33.0 → gea_program-0.34.0}/gea/dashboard.py +0 -0
  136. {gea_program-0.33.0 → gea_program-0.34.0}/gea/deviation.py +0 -0
  137. {gea_program-0.33.0 → gea_program-0.34.0}/gea/dlis.py +0 -0
  138. {gea_program-0.33.0 → gea_program-0.34.0}/gea/dnp3.py +0 -0
  139. {gea_program-0.33.0 → gea_program-0.34.0}/gea/doctor.py +0 -0
  140. {gea_program-0.33.0 → gea_program-0.34.0}/gea/downhole_engine.py +0 -0
  141. {gea_program-0.33.0 → gea_program-0.34.0}/gea/drift_monitor.py +0 -0
  142. {gea_program-0.33.0 → gea_program-0.34.0}/gea/earth_model.py +0 -0
  143. {gea_program-0.33.0 → gea_program-0.34.0}/gea/edr.py +0 -0
  144. {gea_program-0.33.0 → gea_program-0.34.0}/gea/elevation.py +0 -0
  145. {gea_program-0.33.0 → gea_program-0.34.0}/gea/etp.py +0 -0
  146. {gea_program-0.33.0 → gea_program-0.34.0}/gea/etp12_schemas.json +0 -0
  147. {gea_program-0.33.0 → gea_program-0.34.0}/gea/example_register_map.json +0 -0
  148. {gea_program-0.33.0 → gea_program-0.34.0}/gea/fat_sat.py +0 -0
  149. {gea_program-0.33.0 → gea_program-0.34.0}/gea/files.py +0 -0
  150. {gea_program-0.33.0 → gea_program-0.34.0}/gea/fixtures/README.md +0 -0
  151. {gea_program-0.33.0 → gea_program-0.34.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  152. {gea_program-0.33.0 → gea_program-0.34.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  153. {gea_program-0.33.0 → gea_program-0.34.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  154. {gea_program-0.33.0 → gea_program-0.34.0}/gea/follower.py +0 -0
  155. {gea_program-0.33.0 → gea_program-0.34.0}/gea/forward_model.py +0 -0
  156. {gea_program-0.33.0 → gea_program-0.34.0}/gea/friction_priors.py +0 -0
  157. {gea_program-0.33.0 → gea_program-0.34.0}/gea/gamma.py +0 -0
  158. {gea_program-0.33.0 → gea_program-0.34.0}/gea/gauge_aging.py +0 -0
  159. {gea_program-0.33.0 → gea_program-0.34.0}/gea/gauge_specs.py +0 -0
  160. {gea_program-0.33.0 → gea_program-0.34.0}/gea/geodesy.py +0 -0
  161. {gea_program-0.33.0 → gea_program-0.34.0}/gea/gravity_reference.py +0 -0
  162. {gea_program-0.33.0 → gea_program-0.34.0}/gea/hartip.py +0 -0
  163. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/TESTER_GUIDE.md +0 -0
  164. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/alarms.md +0 -0
  165. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/audit-update.md +0 -0
  166. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/backup.md +0 -0
  167. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/catalog.md +0 -0
  168. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/charts.md +0 -0
  169. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/conformance.md +0 -0
  170. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/data-in.md +0 -0
  171. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/dlis.md +0 -0
  172. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/doctor.md +0 -0
  173. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/drift.md +0 -0
  174. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/edr.md +0 -0
  175. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/etp.md +0 -0
  176. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/field-ports.md +0 -0
  177. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/files.md +0 -0
  178. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/historian.md +0 -0
  179. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/instruments.md +0 -0
  180. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/interval.md +0 -0
  181. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/month-end.md +0 -0
  182. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/notifications.md +0 -0
  183. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/osdu.md +0 -0
  184. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/patches.md +0 -0
  185. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/ppdm.md +0 -0
  186. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/quakeml.md +0 -0
  187. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/quality.md +0 -0
  188. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/seedlink.md +0 -0
  189. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/seismic.md +0 -0
  190. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/setup.md +0 -0
  191. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/site.md +0 -0
  192. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/sites.md +0 -0
  193. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/slip.md +0 -0
  194. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/soak.md +0 -0
  195. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/sra.md +0 -0
  196. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/start.md +0 -0
  197. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/structure.md +0 -0
  198. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/tools.md +0 -0
  199. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/transients.md +0 -0
  200. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/upkeep.md +0 -0
  201. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/vibration.md +0 -0
  202. {gea_program-0.33.0 → gea_program-0.34.0}/gea/help/well-tests.md +0 -0
  203. {gea_program-0.33.0 → gea_program-0.34.0}/gea/housekeeping.py +0 -0
  204. {gea_program-0.33.0 → gea_program-0.34.0}/gea/interval.py +0 -0
  205. {gea_program-0.33.0 → gea_program-0.34.0}/gea/inverse_engine.py +0 -0
  206. {gea_program-0.33.0 → gea_program-0.34.0}/gea/jobs.py +0 -0
  207. {gea_program-0.33.0 → gea_program-0.34.0}/gea/live_ports.py +0 -0
  208. {gea_program-0.33.0 → gea_program-0.34.0}/gea/loadtest.py +0 -0
  209. {gea_program-0.33.0 → gea_program-0.34.0}/gea/matplotlib_demo.py +0 -0
  210. {gea_program-0.33.0 → gea_program-0.34.0}/gea/modbus.py +0 -0
  211. {gea_program-0.33.0 → gea_program-0.34.0}/gea/modbus_rtu.py +0 -0
  212. {gea_program-0.33.0 → gea_program-0.34.0}/gea/model_card.py +0 -0
  213. {gea_program-0.33.0 → gea_program-0.34.0}/gea/month_end.py +0 -0
  214. {gea_program-0.33.0 → gea_program-0.34.0}/gea/mqtt_port.py +0 -0
  215. {gea_program-0.33.0 → gea_program-0.34.0}/gea/notify.py +0 -0
  216. {gea_program-0.33.0 → gea_program-0.34.0}/gea/opcua_port.py +0 -0
  217. {gea_program-0.33.0 → gea_program-0.34.0}/gea/operator_app.py +0 -0
  218. {gea_program-0.33.0 → gea_program-0.34.0}/gea/osdu.py +0 -0
  219. {gea_program-0.33.0 → gea_program-0.34.0}/gea/patches.py +0 -0
  220. {gea_program-0.33.0 → gea_program-0.34.0}/gea/permits.py +0 -0
  221. {gea_program-0.33.0 → gea_program-0.34.0}/gea/piwebapi.py +0 -0
  222. {gea_program-0.33.0 → gea_program-0.34.0}/gea/ports.py +0 -0
  223. {gea_program-0.33.0 → gea_program-0.34.0}/gea/ppdm.py +0 -0
  224. {gea_program-0.33.0 → gea_program-0.34.0}/gea/profile_catalog.py +0 -0
  225. {gea_program-0.33.0 → gea_program-0.34.0}/gea/project.py +0 -0
  226. {gea_program-0.33.0 → gea_program-0.34.0}/gea/qt6_downhole_app.py +0 -0
  227. {gea_program-0.33.0 → gea_program-0.34.0}/gea/quakeml.py +0 -0
  228. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reconciler.py +0 -0
  229. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  230. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  231. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  232. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  233. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  234. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  235. {gea_program-0.33.0 → gea_program-0.34.0}/gea/reference/tool_sources.json +0 -0
  236. {gea_program-0.33.0 → gea_program-0.34.0}/gea/rock_inventory.py +0 -0
  237. {gea_program-0.33.0 → gea_program-0.34.0}/gea/sample_record.py +0 -0
  238. {gea_program-0.33.0 → gea_program-0.34.0}/gea/sample_well_profile.csv +0 -0
  239. {gea_program-0.33.0 → gea_program-0.34.0}/gea/sbom.py +0 -0
  240. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seedlink.py +0 -0
  241. {gea_program-0.33.0 → gea_program-0.34.0}/gea/segy.py +0 -0
  242. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic.py +0 -0
  243. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_array.py +0 -0
  244. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_assoc.py +0 -0
  245. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_detect.py +0 -0
  246. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_film.py +0 -0
  247. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_harmonic.py +0 -0
  248. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_qc.py +0 -0
  249. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_response.py +0 -0
  250. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_signature.py +0 -0
  251. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_track.py +0 -0
  252. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_uncertainty.py +0 -0
  253. {gea_program-0.33.0 → gea_program-0.34.0}/gea/seismic_unlisted.py +0 -0
  254. {gea_program-0.33.0 → gea_program-0.34.0}/gea/sensor_swap.py +0 -0
  255. {gea_program-0.33.0 → gea_program-0.34.0}/gea/series_cache.py +0 -0
  256. {gea_program-0.33.0 → gea_program-0.34.0}/gea/service_life.py +0 -0
  257. {gea_program-0.33.0 → gea_program-0.34.0}/gea/setup_checklist.py +0 -0
  258. {gea_program-0.33.0 → gea_program-0.34.0}/gea/shapefile.py +0 -0
  259. {gea_program-0.33.0 → gea_program-0.34.0}/gea/shell.py +0 -0
  260. {gea_program-0.33.0 → gea_program-0.34.0}/gea/shut_in.py +0 -0
  261. {gea_program-0.33.0 → gea_program-0.34.0}/gea/sla_report.py +0 -0
  262. {gea_program-0.33.0 → gea_program-0.34.0}/gea/slip.py +0 -0
  263. {gea_program-0.33.0 → gea_program-0.34.0}/gea/soak.py +0 -0
  264. {gea_program-0.33.0 → gea_program-0.34.0}/gea/sra.py +0 -0
  265. {gea_program-0.33.0 → gea_program-0.34.0}/gea/store_forward.py +0 -0
  266. {gea_program-0.33.0 → gea_program-0.34.0}/gea/strata_join.py +0 -0
  267. {gea_program-0.33.0 → gea_program-0.34.0}/gea/structure.py +0 -0
  268. {gea_program-0.33.0 → gea_program-0.34.0}/gea/supervisor.py +0 -0
  269. {gea_program-0.33.0 → gea_program-0.34.0}/gea/survey_cmd.py +0 -0
  270. {gea_program-0.33.0 → gea_program-0.34.0}/gea/survey_view.py +0 -0
  271. {gea_program-0.33.0 → gea_program-0.34.0}/gea/telemetry.py +0 -0
  272. {gea_program-0.33.0 → gea_program-0.34.0}/gea/tool_catalog.py +0 -0
  273. {gea_program-0.33.0 → gea_program-0.34.0}/gea/tool_library.py +0 -0
  274. {gea_program-0.33.0 → gea_program-0.34.0}/gea/tool_taxonomy.py +0 -0
  275. {gea_program-0.33.0 → gea_program-0.34.0}/gea/transient.py +0 -0
  276. {gea_program-0.33.0 → gea_program-0.34.0}/gea/vibration.py +0 -0
  277. {gea_program-0.33.0 → gea_program-0.34.0}/gea/well_assembler.py +0 -0
  278. {gea_program-0.33.0 → gea_program-0.34.0}/gea/well_test_validation.py +0 -0
  279. {gea_program-0.33.0 → gea_program-0.34.0}/gea/wits0.py +0 -0
  280. {gea_program-0.33.0 → gea_program-0.34.0}/gea/witsml.py +0 -0
  281. {gea_program-0.33.0 → gea_program-0.34.0}/gea/workspace.py +0 -0
  282. {gea_program-0.33.0 → gea_program-0.34.0}/gea_program.egg-info/dependency_links.txt +0 -0
  283. {gea_program-0.33.0 → gea_program-0.34.0}/gea_program.egg-info/entry_points.txt +0 -0
  284. {gea_program-0.33.0 → gea_program-0.34.0}/gea_program.egg-info/requires.txt +0 -0
  285. {gea_program-0.33.0 → gea_program-0.34.0}/gea_program.egg-info/top_level.txt +0 -0
  286. {gea_program-0.33.0 → gea_program-0.34.0}/setup.cfg +0 -0
  287. {gea_program-0.33.0 → gea_program-0.34.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.33.0
3
+ Version: 0.34.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 (386 checks)
128
+ gea accept # the product gate (389 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,6 +648,22 @@ 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 site map
652
+
653
+ The Map tab puts everything in the workspace that has a position in one
654
+ WGS84 frame: the wells at their declared surface positions (a NAD27
655
+ declaration moved by its datum shift, the shift shown), the structure layers
656
+ - faults and folds, formation contours, areas, points - each drawn at the
657
+ detail the view needs without a vertex moved, the World Stress Map's SHmax
658
+ directions, the seismic stations and the Seismicity Response Areas, over the
659
+ outline of the US states and counties. The outline ships with the program
660
+ (US Census Bureau 2017 cartographic boundaries by way of us-atlas, with its
661
+ provenance), so the map needs no network. A well without a declared position
662
+ is listed as not placed and is never drawn. Drag, the wheel or the keys pan
663
+ and zoom; click anywhere for what every layer says about that spot and the
664
+ distance to every placed well; rings draw distance circles around the wells.
665
+ `gea help map`.
666
+
651
667
  ### The charts
652
668
 
653
669
  A well's page carries the Charts card: up to four channels stacked on one
@@ -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 (386 checks)
89
+ gea accept # the product gate (389 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,6 +609,22 @@ 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 site map
613
+
614
+ The Map tab puts everything in the workspace that has a position in one
615
+ WGS84 frame: the wells at their declared surface positions (a NAD27
616
+ declaration moved by its datum shift, the shift shown), the structure layers
617
+ - faults and folds, formation contours, areas, points - each drawn at the
618
+ detail the view needs without a vertex moved, the World Stress Map's SHmax
619
+ directions, the seismic stations and the Seismicity Response Areas, over the
620
+ outline of the US states and counties. The outline ships with the program
621
+ (US Census Bureau 2017 cartographic boundaries by way of us-atlas, with its
622
+ provenance), so the map needs no network. A well without a declared position
623
+ is listed as not placed and is never drawn. Drag, the wheel or the keys pan
624
+ and zoom; click anywhere for what every layer says about that spot and the
625
+ distance to every placed well; rings draw distance circles around the wells.
626
+ `gea help map`.
627
+
612
628
  ### The charts
613
629
 
614
630
  A well's page carries the Charts card: up to four channels stacked on one
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.33.0"
126
+ __version__ = "0.34.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -8304,6 +8304,150 @@ def section_cb_charts(tmp: str) -> None:
8304
8304
  "kept while a window loads, the drilling progress chart with one colour per well in a fixed order in both themes; the help page"
8305
8305
  + (f" [failed: {', '.join(failed3)}]" if failed3 else ""))
8306
8306
 
8307
+
8308
+ def section_cc_site_map(tmp: str) -> None:
8309
+ """Section CC - the site map: the shipped state and county outline with its provenance, every positioned thing in one
8310
+ WGS84 frame (a NAD27 well moved by its datum shift and saying so, a well without a position never drawn), a layer
8311
+ thinned to the view's pixel without a vertex moved, what every layer says about a spot, the page."""
8312
+ import hashlib as _hl
8313
+ import http.cookiejar
8314
+ import math as _m
8315
+ import urllib.request
8316
+ import urllib.error
8317
+ from . import edr as E
8318
+ from . import helplib as H
8319
+ from . import shapefile as SF
8320
+ from . import site_map as SM
8321
+ from .workspace import Workspace
8322
+ from .service import Service, Users
8323
+ pkg = Path(__file__).parent
8324
+ d = Path(tmp, "cc"); d.mkdir()
8325
+
8326
+ ol = SM.outline_data()
8327
+ prov = json.loads((pkg / "reference" / "us_outline.provenance.json").read_text(encoding="utf-8"))
8328
+ cul = [c for c in ol["counties"] if c["name"] == "Culberson"]
8329
+ wide = SM.outline_view([-110.0, 25.0, -90.0, 37.0], 0.02)
8330
+ near = SM.outline_view([-105.2, 31.0, -104.0, 32.0], 0.002)
8331
+ c1 = {
8332
+ "outline": len(ol["counties"]) == 3231 and ol["states"].get("48") == "Texas" and cul and cul[0]["fips"] == "48109"
8333
+ and abs(cul[0]["label"][0] + 104.65) < 0.2 and abs(cul[0]["label"][1] - 31.47) < 0.2,
8334
+ "provenance": prov["sha256"] == _hl.sha256((pkg / "reference" / "us_outline.json").read_bytes()).hexdigest() and prov["package_license"] == "ISC"
8335
+ and "Copyright 2013-2019 Michael Bostock" in prov["package_license_text"] and "public domain" in prov["original_source"]
8336
+ and prov["counts"]["counties"] == 3231,
8337
+ "detail": all(a["s"] == 1 for a in wide["arcs"]) and not wide["labels"] and any(a["s"] == 0 for a in near["arcs"])
8338
+ and "Culberson" in [x["name"] for x in near["labels"]],
8339
+ }
8340
+ failed1 = [k for k, v in c1.items() if not v]
8341
+ ok(not failed1,
8342
+ "CC1 the outline ships with the program: the US Census Bureau's 2017 cartographic counties by way of us-atlas 3.0.1, 3,231 counties, the "
8343
+ "provenance with its hash, the package's ISC notice and the public-domain source; state lines only in a wide view, county lines and names "
8344
+ "once the view is close (Culberson, FIPS 48109)"
8345
+ + (f" [failed: {', '.join(failed1)}]" if failed1 else ""))
8346
+
8347
+ lat1, lon1 = 31.42, -104.10
8348
+ kmlon = 1.0 / (111.195 * _m.cos(_m.radians(lat1)))
8349
+ faults = [([[(lon1 - 0.2 + 0.01 * i, lat1 - 0.3 + 0.0002 * j) for j in range(3001)]], {"TYPE": "normal fault", "NAME": f"F{i}"}) for i in range(0, 40, 8)]
8350
+ SF.write(str(d / "Faults"), "PolyLine", faults, [("TYPE", "C", 20, 0), ("NAME", "C", 10, 0)], SF.NAD83_GEOGCS)
8351
+ ctr = [([[(lon1 + (i - 1.5) * 4 * kmlon + 0.001 * k, lat1 - 0.3 + 0.006 * k) for k in range(100)]], {"ElevTop_ft": -8500.0 + 500.0 * i}) for i in range(4)]
8352
+ SF.write(str(d / "Top_A"), "PolyLine", ctr, [("ElevTop_ft", "F", 10, 1)], SF.NAD83_GEOGCS)
8353
+ SF.write(str(d / "Picks"), "Point", [([[(lon1 + 0.0001 * i, lat1 + 0.00005 * i)]], {"NAME": f"P{i}"}) for i in range(6000)], [("NAME", "C", 10, 0)], SF.NAD83_GEOGCS)
8354
+ with open(d / "wsm.csv", "w", encoding="utf-8") as f:
8355
+ f.write("ID,LAT,LON,AZI,TYPE,DEPTH,QUALITY,REGIME,LOCALITY\n")
8356
+ for i in range(40):
8357
+ f.write(f"W{i},{lat1 - 0.1 + 0.005 * i:.4f},{lon1 - 0.05:.4f},{60 + i},BO,2.5,{'DCBA'[i % 4]},NF,test\n")
8358
+ wsp = str(d / "ws"); ws = Workspace.create(wsp, "Pad 3", actor="tester")
8359
+ empty_view = SM.overview(ws)["view"]
8360
+ ws.add_layer(str(d / "Faults.shp"), "Basement faults", actor="tester", citation="test")
8361
+ ws.add_layer(str(d / "Top_A.shp"), "Wolfcamp top", actor="tester", formation="Wolfcamp", role="top", citation="test")
8362
+ ws.add_layer(str(d / "Picks.shp"), "Picks", actor="tester", citation="test")
8363
+ ws.add_stress_map(str(d / "wsm.csv"), actor="tester", citation="test WSM")
8364
+ layer_view0 = SM.overview(ws)["view"]
8365
+ a = E.selftest(str(d)); b = E.selftest_events(str(d))
8366
+ wa = ws.add_well_file(a["path"], display="Well A", actor="tester"); wb = ws.add_well_file(b["path"], display="Well B", actor="tester")
8367
+ wc = ws.add_well_file(a["path"], display="Well C", actor="tester")
8368
+ ws.set_well(wa["id"], surface={"lat": 31.41, "lon": -104.12, "datum": "NAD27"}, actor="tester")
8369
+ ws.set_well(wb["id"], surface={"lat": 31.43, "lon": -104.08, "datum": "NAD83"}, actor="tester")
8370
+ o = SM.overview(ws)
8371
+ wl = {w["id"]: w for w in o["wells"]}
8372
+ view = o["view"]["bbox"]
8373
+ fine = SM.layer_view(ws, "Basement-faults", [-105, 30, -103, 32], 0.0)
8374
+ coarse = SM.layer_view(ws, "Basement-faults", [-105, 30, -103, 32], 0.01)
8375
+ raw = SM._layer(ws, "Basement-faults")
8376
+ src_pts = {(round(float(x), 5), round(float(y), 5)) for f in raw["feats"] for pp in f["parts"] for x, y in pp}
8377
+ moved = [p for f in coarse["features"] for pp in f["parts"] for p in pp if (p[0], p[1]) not in src_pts]
8378
+ ends_kept = all(f["parts"][0][0] == fine["features"][k]["parts"][0][0] and f["parts"][0][-1] == fine["features"][k]["parts"][0][-1] for k, f in enumerate(coarse["features"]))
8379
+ pts = SM.layer_view(ws, "Picks", [-105, 30, -103, 32], 0.0, max_points=1000)
8380
+ wh = SM.what_here(ws, 31.42, -104.10)
8381
+ sv = SM.stress_view(ws, [-104.3, 31.2, -103.9, 31.6])
8382
+ c2 = {
8383
+ "frame": "WGS84" in o["frame"] and o["view"]["why"] == "the placed wells" and empty_view["why"].startswith("nothing in the workspace")
8384
+ and layer_view0["why"].startswith("the area most of the layers cover (the median extent of 3 of the 3)"),
8385
+ "wells": wl[wa["id"]]["placed"] and 30.0 < wl[wa["id"]]["shift_m"] < 90.0 and wl[wa["id"]]["declared"]["datum"] == "NAD27"
8386
+ and wl[wb["id"]]["placed"] and wl[wb["id"]]["shift_m"] == 0.0 and not wl[wc["id"]]["placed"] and "lat" not in wl[wc["id"]]
8387
+ and view[0] < -104.12 < view[2] and view[1] < 31.43 < view[3],
8388
+ "layers": [(l["id"], l["kind"]) for l in o["layers"]] == [("Basement-faults", "structure"), ("Wolfcamp-top", "contours"), ("Picks", "points")]
8389
+ and o["layers"][0]["classes"] == ["fault"] and o["layers"][0]["n_points"] == 5 * 3001 and o["stress_map"]["n_records"] == 40,
8390
+ "thinning": fine["vertices"] == 5 * 3001 and coarse["vertices"] < fine["vertices"] / 10 and not moved and ends_kept
8391
+ and all(f.get("cls") == "fault" for f in coarse["features"]),
8392
+ "points": pts["in_view"] == 6000 and pts["shown"] == 1000 and pts["kind"] == "points",
8393
+ "what_here": wh["answered"] >= 2 and any("Nearest mapped fault" in ln for l_ in wh["layers"] for ln in (l_["lines"] or []))
8394
+ and any("contours" in ln for l_ in wh["layers"] for ln in (l_["lines"] or []))
8395
+ and [w["id"] for w in wh["wells"]] == sorted([wa["id"], wb["id"]], key=lambda i: next(x["distance_km"] for x in wh["wells"] if x["id"] == i))
8396
+ and len(wh["wells"]) == 2,
8397
+ "stress": sv["n_in_view"] == 40 and sv["records"][0]["quality"] == "A" and sv["records"][-1]["quality"] == "D" and sv["citation"] == "test WSM",
8398
+ }
8399
+ failed2 = [k for k, v in c2.items() if not v]
8400
+ ok(not failed2,
8401
+ "CC2 one frame: a well declared on NAD27 moved to WGS84 by its datum shift and the shift kept with it, a well declared on NAD83 not moved, a "
8402
+ "well with no position never placed; the map opens on the placed wells (else the area most layers cover, else Texas, said so); a layer "
8403
+ "thinned to the view's pixel keeps its ends and moves no vertex, points sampled evenly past the limit; each layer's own statement for a spot "
8404
+ "and the distance to every placed well; the stress records in view, best quality first"
8405
+ + (f" [failed: {', '.join(failed2)}]" if failed2 else ""))
8406
+
8407
+ Users(str(Path(wsp, "users.json"))).add("v", "viewer-pass-1", "viewer")
8408
+ svc = Service(wsp, port=0, scheduler=False).start()
8409
+ base_url = svc.url.rstrip("/")
8410
+ op = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
8411
+
8412
+ def call(path):
8413
+ req = urllib.request.Request(base_url + path, method="GET")
8414
+ try:
8415
+ with op.open(req, timeout=120) as rr_:
8416
+ return rr_.status, json.loads(rr_.read())
8417
+ except urllib.error.HTTPError as e:
8418
+ return e.code, json.loads(e.read())
8419
+ try:
8420
+ lreq = urllib.request.Request(base_url + "/api/login", method="POST", data=json.dumps({"name": "v", "password": "viewer-pass-1"}).encode())
8421
+ lreq.add_header("Content-Type", "application/json"); lreq.add_header("X-GEA-Action", "1"); op.open(lreq, timeout=30)
8422
+ bb = ",".join(f"{x:.5f}" for x in view)
8423
+ st_o, ov = call("/api/map")
8424
+ st_l, lv = call(f"/api/map/layer/Wolfcamp-top?bbox={bb}&tol=0.001")
8425
+ st_ol, olv = call(f"/api/map/outline?bbox={bb}&tol=0.001")
8426
+ st_s, svv = call(f"/api/map/stress?bbox={bb}")
8427
+ st_a, at = call("/api/map/at?lat=31.42&lon=-104.10")
8428
+ st_bad, _ = call("/api/map/layer/Wolfcamp-top?bbox=1,2,3")
8429
+ st_nol, _ = call(f"/api/map/layer/no-such-layer?bbox={bb}")
8430
+ st_noll, _ = call("/api/map/at?lat=x")
8431
+ finally:
8432
+ svc.stop()
8433
+ page_src = (pkg / "web" / "app.html").read_text(encoding="utf-8")
8434
+ help_md = (pkg / "help" / "map.md").read_text(encoding="utf-8")
8435
+ c3 = {
8436
+ "api": st_o == 200 and len(ov["wells"]) == 3 and st_l == 200 and lv["kind"] == "contours" and all("value" in f for f in lv["features"])
8437
+ and st_ol == 200 and st_s == 200 and st_a == 200 and len(at["wells"]) == 2 and st_bad == 400 and st_nol == 404 and st_noll == 400,
8438
+ "page": all(x in page_src for x in ("VIEWS.map", "['#/map', 'Map']", "/api/map/layer/", "/api/map/outline", "/api/map/stress", "/api/map/at",
8439
+ "Not placed", "declare it", "data-fit", "mpRings", "ArrowUp", "'Home' || k === 'Escape'", "scale bar", "'wheel'",
8440
+ "What is at", "setPointerCapture")),
8441
+ "help": any(t["topic"] == "map" for t in H.topics()) and not H.check("map") and H.VIEW_TOPIC.get("map") == "map"
8442
+ and "never moved" in help_md.split("will not call a measurement")[1],
8443
+ }
8444
+ failed3 = [k for k, v in c3.items() if not v]
8445
+ ok(not failed3,
8446
+ "CC3 the API (the contents, a layer with its contour values, the outline, the stress records, what is at a spot; a malformed box, an unknown "
8447
+ "layer and a missing position named) and the Map tab: pan and zoom by pointer, wheel and keys, layer toggles and fit, distance rings, a scale "
8448
+ "bar, the not-placed wells with the way to place them, what is at a click; the help page"
8449
+ + (f" [failed: {', '.join(failed3)}]" if failed3 else ""))
8450
+
8307
8451
  def main() -> int:
8308
8452
  print("GEA-Program - ACCEPTANCE SUITE (the product gate)")
8309
8453
  # a handle a job subprocess still holds at the end must not turn a finished gate into a traceback on Windows:
@@ -8387,6 +8531,7 @@ def main() -> int:
8387
8531
  section_bz_tool_library(tmp)
8388
8532
  section_ca_setup_checklist(tmp)
8389
8533
  section_cb_charts(tmp)
8534
+ section_cc_site_map(tmp)
8390
8535
  if _FAILS:
8391
8536
  print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
8392
8537
  for f in _FAILS:
@@ -0,0 +1,11 @@
1
+ # The site map
2
+
3
+ > Everything in the workspace that has a position, in one frame: the wells where their surface positions were declared, the structure layers the site brought (faults and folds, formation contours, areas, points), the World Stress Map's SHmax directions, the seismic stations, the Seismicity Response Areas, and the outline of the US states and counties underneath. A well without a declared position is listed as not placed and is never drawn anywhere. Click the map for what every layer says about that spot.
4
+
5
+ **The command**: the Map tab. Drag to pan, the wheel or + − to zoom, Home to return to where the map opened (the placed wells, else the response area, else the area most of the layers cover). Tick a layer to draw it, "fit" to zoom to it; Rings draws distance circles around every placed well. Point at the map for the position (WGS84) and the nearest placed well; click it - or press Enter for the centre - for each layer's own statement there: the nearest fault and its distance and bearing, the contours it lies between, the area it falls in, the nearest points, and the distance and bearing to every placed well. The keyboard does the same once the map has focus: arrows pan, + and − zoom, Home returns. A well's marker opens its page; "declare it" beside a not-placed well opens the setup checklist.
6
+
7
+ **What it writes**: nothing. The map reads the workspace: each well's declared surface position, each layer's shapefile (read once per run of the program and again when it changes), the stress map, the stations and the response areas. The outline is shipped with the program (`reference/us_outline.json`, from the US Census Bureau's 2017 cartographic boundary files by way of the us-atlas package, with its provenance beside it), so the map needs no network.
8
+
9
+ **The number to check**: a placed well against its survey plat - its marker is drawn at the declared latitude and longitude moved from the declared datum to WGS84, and the move is printed beside it (about fifty metres for NAD27 in West Texas); a layer's line against the map it came from, at the scale that map was made.
10
+
11
+ **What this page will not call a measurement**: a well's position - it is the operator's declaration, drawn where it was declared; a line drawn at this zoom as the line in the file - a vertex that would fall in the same screen cell as the one before it is left out of the drawing (never moved), and the full line is what "what is here" measures against; the outline as a survey - it is the Census Bureau's cartographic generalisation, good to a few hundred metres; a distance to a mapped fault as a hazard - it is a fact of the map.
@@ -43,6 +43,7 @@ INDEX: List[tuple] = [
43
43
  ('edr', 'The drilling recorder', 'the rig\'s one-second EDR export read as delivered - sections, depths, hours on bottom, the rate of penetration, the recorder\'s MD-TVD table - and what the record will not say'),
44
44
  ('dlis', 'The DLIS log', 'a well log as it is delivered (API RP66 V1), read as the standard lays it out: the frames, the channels, what was skipped; into the strata survey'),
45
45
  ('historian', 'The historian pull', 'an operator\'s gauge history out of the PI System through PI Web API, read-only, every value with its archive time and flags'),
46
+ ('map', 'The site map', 'everything with a position in one frame: the placed wells, the structure layers, the stress directions, the stations and response areas over the state and county outline; what every layer says about any spot'),
46
47
  ('charts', 'The charts', 'a well\'s channels stacked on one axis with a linked cursor, zoom and pan from every sample, time or depth for a drilling recorder, the depth events marked, and the drilling progress of every well'),
47
48
  ('setup', 'The setup checklist', 'what this workspace still needs before its reports can be handed over - each well\'s location, elevation and number, the client site, the backup, the reports - read from the workspace as it stands, each with its form or button'),
48
49
  ('tools', 'Tools and ports', 'every class of downhole tool in use across the industry with a hover description and a pop-open tutorial, your own fleet with its datasheets, the gauges this program reads with their citations and ratings, the formats and protocols that bring readings in, and the rating check on a tool string'),
@@ -70,7 +71,7 @@ REQUIRED_LINES = ('**The command**', '**What it writes**', '**The number to chec
70
71
  VIEW_TOPIC: Dict[str, str] = {
71
72
  'home': 'start', 'wells': 'data-in', 'well': 'drift', 'live': 'patches', 'patch': 'patches', 'files': 'files', 'alarms': 'alarms',
72
73
  'approvals': 'well-tests', 'config': 'site', 'reports': 'drift', 'verify': 'start', 'survey': 'data-in', 'jobs': 'site',
73
- 'admin': 'site', 'prefs': 'site', 'search': 'start', 'welcome': 'start', 'seismic': 'seismic', 'seismic_station': 'seismic', 'track': 'seismic', 'sar': 'seismic', 'sites': 'sites', 'setup': 'setup', 'audit': 'audit-update', 'tools': 'tools', 'catalog': 'catalog',
74
+ 'admin': 'site', 'prefs': 'site', 'search': 'start', 'welcome': 'start', 'seismic': 'seismic', 'seismic_station': 'seismic', 'track': 'seismic', 'sar': 'seismic', 'sites': 'sites', 'setup': 'setup', 'map': 'map', 'audit': 'audit-update', 'tools': 'tools', 'catalog': 'catalog',
74
75
  }
75
76
 
76
77