res2df 1.3.10__tar.gz → 1.3.11__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 (253) hide show
  1. {res2df-1.3.10 → res2df-1.3.11}/.github/workflows/res2df.yml +1 -1
  2. {res2df-1.3.10 → res2df-1.3.11}/.github/workflows/style.yml +1 -1
  3. {res2df-1.3.10 → res2df-1.3.11}/.github/workflows/typing.yml +1 -1
  4. {res2df-1.3.10 → res2df-1.3.11}/.pre-commit-config.yaml +1 -1
  5. {res2df-1.3.10 → res2df-1.3.11}/PKG-INFO +5 -4
  6. {res2df-1.3.10 → res2df-1.3.11}/README.md +1 -1
  7. {res2df-1.3.10 → res2df-1.3.11}/pyproject.toml +9 -3
  8. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/common.py +1 -4
  9. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/faults.py +9 -5
  10. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/fipreports.py +2 -1
  11. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/grid.py +9 -12
  12. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/gruptree.py +6 -6
  13. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/inferdims.py +2 -2
  14. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/nnc.py +2 -6
  15. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/parameters.py +2 -2
  16. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/pillars.py +1 -1
  17. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/pvt.py +1 -1
  18. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/satfunc.py +8 -9
  19. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/summary.py +2 -2
  20. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/trans.py +4 -4
  21. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/version.py +3 -3
  22. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/vfp/_vfp.py +2 -2
  23. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/vfp/_vfpcommon.py +6 -10
  24. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/vfp/_vfpinj.py +4 -3
  25. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/wellcompletiondata.py +1 -1
  26. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/wellconnstatus.py +1 -1
  27. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/PKG-INFO +5 -4
  28. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/requires.txt +2 -2
  29. {res2df-1.3.10 → res2df-1.3.11}/tests/test_equil.py +1 -1
  30. {res2df-1.3.10 → res2df-1.3.11}/tests/test_summary_restarts.py +1 -1
  31. {res2df-1.3.10 → res2df-1.3.11}/tests/test_trans.py +2 -2
  32. {res2df-1.3.10 → res2df-1.3.11}/tests/test_vfp.py +9 -9
  33. {res2df-1.3.10 → res2df-1.3.11}/.github/dependabot.yml +0 -0
  34. {res2df-1.3.10 → res2df-1.3.11}/.github/workflows/codecov.yml +0 -0
  35. {res2df-1.3.10 → res2df-1.3.11}/.github/workflows/publish.yml +0 -0
  36. {res2df-1.3.10 → res2df-1.3.11}/.gitignore +0 -0
  37. {res2df-1.3.10 → res2df-1.3.11}/CONTRIBUTING.md +0 -0
  38. {res2df-1.3.10 → res2df-1.3.11}/LICENSE +0 -0
  39. {res2df-1.3.10 → res2df-1.3.11}/SECURITY.md +0 -0
  40. {res2df-1.3.10 → res2df-1.3.11}/ci/testkomodo.sh +0 -0
  41. {res2df-1.3.10 → res2df-1.3.11}/docs/_static/equinor-logo.png +0 -0
  42. {res2df-1.3.10 → res2df-1.3.11}/docs/_static/equinor-logo2.jpg +0 -0
  43. {res2df-1.3.10 → res2df-1.3.11}/docs/_static/equinor_logo.jpg +0 -0
  44. {res2df-1.3.10 → res2df-1.3.11}/docs/_static/equinor_logo_only.jpg +0 -0
  45. {res2df-1.3.10 → res2df-1.3.11}/docs/_templates/layout.html +0 -0
  46. {res2df-1.3.10 → res2df-1.3.11}/docs/conf.py +0 -0
  47. {res2df-1.3.10 → res2df-1.3.11}/docs/contribution.rst +0 -0
  48. {res2df-1.3.10 → res2df-1.3.11}/docs/csv2res.rst +0 -0
  49. {res2df-1.3.10 → res2df-1.3.11}/docs/glossary.rst +0 -0
  50. {res2df-1.3.10 → res2df-1.3.11}/docs/history.rst +0 -0
  51. {res2df-1.3.10 → res2df-1.3.11}/docs/index.rst +0 -0
  52. {res2df-1.3.10 → res2df-1.3.11}/docs/installation.rst +0 -0
  53. {res2df-1.3.10 → res2df-1.3.11}/docs/introduction.rst +0 -0
  54. {res2df-1.3.10 → res2df-1.3.11}/docs/res2csv.rst +0 -0
  55. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/compdat.csv +0 -0
  56. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/compdat.rst +0 -0
  57. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/equil-example.csv +0 -0
  58. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/equil.rst +0 -0
  59. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/fipnum.inc +0 -0
  60. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/fipreports-example.csv +0 -0
  61. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/fipreports-example.txt +0 -0
  62. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/fipreports.rst +0 -0
  63. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/grid.csv +0 -0
  64. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/grid.rst +0 -0
  65. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/gruptree.csv +0 -0
  66. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/gruptree.rst +0 -0
  67. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/gruptreenet.csv +0 -0
  68. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/images/injectoranalysis.png +0 -0
  69. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/images/multibranch-rftanalysis.png +0 -0
  70. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/nnc.csv +0 -0
  71. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/nnc.rst +0 -0
  72. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/outflow.csv +0 -0
  73. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/pillars-dyn1-stacked.csv +0 -0
  74. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/pillars-dyn1-unstacked.csv +0 -0
  75. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/pillars-example1.csv +0 -0
  76. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/pillars.rst +0 -0
  77. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/pvt.csv +0 -0
  78. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/pvt.rst +0 -0
  79. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/rft.rst +0 -0
  80. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/rft_columns.csv +0 -0
  81. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/satfunc.csv +0 -0
  82. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/satfunc.rst +0 -0
  83. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/summary.csv +0 -0
  84. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/summary.rst +0 -0
  85. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/trans-boundaries.csv +0 -0
  86. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/trans-group.csv +0 -0
  87. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/trans.rst +0 -0
  88. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/trans1.csv +0 -0
  89. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/wcon.csv +0 -0
  90. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/wcon.rst +0 -0
  91. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/well_connection_status.csv +0 -0
  92. {res2df-1.3.10 → res2df-1.3.11}/docs/usage/wellconnstatus.rst +0 -0
  93. {res2df-1.3.10 → res2df-1.3.11}/docs/usage.rst +0 -0
  94. {res2df-1.3.10 → res2df-1.3.11}/setup.cfg +0 -0
  95. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/__init__.py +0 -0
  96. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/__version__.py +0 -0
  97. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/compdat.py +0 -0
  98. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/constants.py +0 -0
  99. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/csv2res.py +0 -0
  100. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/equil.py +0 -0
  101. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/hook_implementations/__init__.py +0 -0
  102. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/hook_implementations/forward_model_steps.py +0 -0
  103. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/BRANPROP +0 -0
  104. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/COMPDAT +0 -0
  105. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/COMPLUMP +0 -0
  106. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/COMPSEGS +0 -0
  107. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/DENSITY +0 -0
  108. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/EQLDIMS +0 -0
  109. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/EQUIL +0 -0
  110. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/FAULTS +0 -0
  111. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/GRUPNET +0 -0
  112. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/GRUPTREE +0 -0
  113. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/NODEPROP +0 -0
  114. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PBVD +0 -0
  115. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PDVD +0 -0
  116. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PVDG +0 -0
  117. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PVDO +0 -0
  118. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PVTG +0 -0
  119. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PVTO +0 -0
  120. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/PVTW +0 -0
  121. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/ROCK +0 -0
  122. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/RSVD +0 -0
  123. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/RVVD +0 -0
  124. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SGFN +0 -0
  125. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SGOF +0 -0
  126. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SGWFN +0 -0
  127. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SLGOF +0 -0
  128. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SOF2 +0 -0
  129. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SOF3 +0 -0
  130. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SWFN +0 -0
  131. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/SWOF +0 -0
  132. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/TABDIMS +0 -0
  133. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/VFPINJ +0 -0
  134. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/VFPPROD +0 -0
  135. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WCONHIST +0 -0
  136. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WCONINJE +0 -0
  137. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WCONINJH +0 -0
  138. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WCONPROD +0 -0
  139. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WELOPEN +0 -0
  140. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WELSEGS +0 -0
  141. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WELSPECS +0 -0
  142. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WLIST +0 -0
  143. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WSEGAICD +0 -0
  144. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WSEGSICD +0 -0
  145. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/WSEGVALV +0 -0
  146. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/__init__.py +0 -0
  147. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/readme +0 -0
  148. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/opmkeywords/runmetoupdate.sh +0 -0
  149. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/py.typed +0 -0
  150. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/res2csv.py +0 -0
  151. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/res2csvlogger.py +0 -0
  152. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/resdatafiles.py +0 -0
  153. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/rft.py +0 -0
  154. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/svg_color_keyword_names.txt +0 -0
  155. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/vfp/__init__.py +0 -0
  156. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/vfp/_vfpdefs.py +0 -0
  157. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/vfp/_vfpprod.py +0 -0
  158. {res2df-1.3.10 → res2df-1.3.11}/src/res2df/wcon.py +0 -0
  159. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/SOURCES.txt +0 -0
  160. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/dependency_links.txt +0 -0
  161. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/entry_points.txt +0 -0
  162. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/not-zip-safe +0 -0
  163. {res2df-1.3.10 → res2df-1.3.11}/src/res2df.egg-info/top_level.txt +0 -0
  164. {res2df-1.3.10 → res2df-1.3.11}/tests/__init__.py +0 -0
  165. {res2df-1.3.10 → res2df-1.3.11}/tests/conftest.py +0 -0
  166. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.DATA +0 -0
  167. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.EGRID +0 -0
  168. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.INIT +0 -0
  169. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.INSPEC +0 -0
  170. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.PRT +0 -0
  171. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.RFT +0 -0
  172. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.RSSPEC +0 -0
  173. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.SMSPEC +0 -0
  174. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.UNRST +0 -0
  175. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/EIGHTCELLS.UNSMRY +0 -0
  176. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.DATA +0 -0
  177. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.SMSPEC +0 -0
  178. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.UNSMRY +0 -0
  179. {res2df-1.3.10 → res2df-1.3.11}/tests/data/eightcells/zones.lyr +0 -0
  180. {res2df-1.3.10 → res2df-1.3.11}/tests/data/fipreports/TEST1.PRT +0 -0
  181. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
  182. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
  183. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
  184. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
  185. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
  186. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
  187. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
  188. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
  189. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
  190. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
  191. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
  192. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
  193. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
  194. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
  195. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
  196. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
  197. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/schedule/op6_aicd1_gp.sch +0 -0
  198. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/schedule/op6_icd1_gp.sch +0 -0
  199. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/schedule/op6_valve1_gp.sch +0 -0
  200. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
  201. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
  202. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
  203. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0-OPMFLOW.PRT +0 -0
  204. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
  205. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
  206. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
  207. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
  208. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
  209. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
  210. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
  211. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
  212. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
  213. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
  214. {res2df-1.3.10 → res2df-1.3.11}/tests/data/reek/eclipse/model/zones.lyr +0 -0
  215. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP.DATA +0 -0
  216. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP.SMSPEC +0 -0
  217. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP.UNSMRY +0 -0
  218. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_LONG.DATA +0 -0
  219. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_LONG.SMSPEC +0 -0
  220. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_LONG.UNSMRY +0 -0
  221. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.DATA +0 -0
  222. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.SMSPEC +0 -0
  223. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.UNSMRY +0 -0
  224. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.DATA +0 -0
  225. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.SMSPEC +0 -0
  226. {res2df-1.3.10 → res2df-1.3.11}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.UNSMRY +0 -0
  227. {res2df-1.3.10 → res2df-1.3.11}/tests/test_common.py +0 -0
  228. {res2df-1.3.10 → res2df-1.3.11}/tests/test_compdat.py +0 -0
  229. {res2df-1.3.10 → res2df-1.3.11}/tests/test_eclfiles.py +0 -0
  230. {res2df-1.3.10 → res2df-1.3.11}/tests/test_ert_hooks.py +0 -0
  231. {res2df-1.3.10 → res2df-1.3.11}/tests/test_faults.py +0 -0
  232. {res2df-1.3.10 → res2df-1.3.11}/tests/test_fipreports.py +0 -0
  233. {res2df-1.3.10 → res2df-1.3.11}/tests/test_grid.py +0 -0
  234. {res2df-1.3.10 → res2df-1.3.11}/tests/test_gruptree.py +0 -0
  235. {res2df-1.3.10 → res2df-1.3.11}/tests/test_hook_implementations.py +0 -0
  236. {res2df-1.3.10 → res2df-1.3.11}/tests/test_inferdims.py +0 -0
  237. {res2df-1.3.10 → res2df-1.3.11}/tests/test_init.py +0 -0
  238. {res2df-1.3.10 → res2df-1.3.11}/tests/test_integration.py +0 -0
  239. {res2df-1.3.10 → res2df-1.3.11}/tests/test_logging.py +0 -0
  240. {res2df-1.3.10 → res2df-1.3.11}/tests/test_nnc.py +0 -0
  241. {res2df-1.3.10 → res2df-1.3.11}/tests/test_parameters.py +0 -0
  242. {res2df-1.3.10 → res2df-1.3.11}/tests/test_pillars.py +0 -0
  243. {res2df-1.3.10 → res2df-1.3.11}/tests/test_pvt.py +0 -0
  244. {res2df-1.3.10 → res2df-1.3.11}/tests/test_rft.py +0 -0
  245. {res2df-1.3.10 → res2df-1.3.11}/tests/test_satfunc.py +0 -0
  246. {res2df-1.3.10 → res2df-1.3.11}/tests/test_summary.py +0 -0
  247. {res2df-1.3.10 → res2df-1.3.11}/tests/test_userapi.py +0 -0
  248. {res2df-1.3.10 → res2df-1.3.11}/tests/test_wcon.py +0 -0
  249. {res2df-1.3.10 → res2df-1.3.11}/tests/test_wellcompletiondata.py +0 -0
  250. {res2df-1.3.10 → res2df-1.3.11}/tests/test_wellconnstatus.py +0 -0
  251. {res2df-1.3.10 → res2df-1.3.11}/tests/test_welopen.py +0 -0
  252. {res2df-1.3.10 → res2df-1.3.11}/tests/test_wlist.py +0 -0
  253. {res2df-1.3.10 → res2df-1.3.11}/tests/test_zonemap.py +0 -0
@@ -21,7 +21,7 @@ jobs:
21
21
  runs-on: ubuntu-latest
22
22
  strategy:
23
23
  matrix:
24
- python-version: ['3.11', '3.12', '3.13']
24
+ python-version: ['3.11', '3.12', '3.13', '3.14']
25
25
  include:
26
26
  # For one of the Python versions we
27
27
  # install the extra dependency ert
@@ -20,7 +20,7 @@ jobs:
20
20
  runs-on: ubuntu-latest
21
21
  strategy:
22
22
  matrix:
23
- python-version: ['3.13']
23
+ python-version: ['3.14']
24
24
 
25
25
  steps:
26
26
  - uses: actions/checkout@v6
@@ -24,7 +24,7 @@ jobs:
24
24
  runs-on: ubuntu-latest
25
25
  strategy:
26
26
  matrix:
27
- python-version: ['3.13']
27
+ python-version: ['3.14']
28
28
 
29
29
  steps:
30
30
  - uses: actions/checkout@v6
@@ -11,7 +11,7 @@ repos:
11
11
  - id: trailing-whitespace
12
12
 
13
13
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
- rev: v0.14.8
14
+ rev: v0.14.10
15
15
  hooks:
16
16
  - id: ruff-check
17
17
  args: [ --fix ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: res2df
3
- Version: 1.3.10
3
+ Version: 1.3.11
4
4
  Summary: Convert reservoir simulator input and output to DataFrames
5
5
  Author-email: Håvard Berland <havb@equinor.com>
6
6
  License-Expression: GPL-3.0-only
@@ -16,6 +16,7 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Natural Language :: English
20
21
  Requires-Python: >=3.11
21
22
  Description-Content-Type: text/markdown
@@ -48,10 +49,10 @@ Requires-Dist: sphinx-autoapi; extra == "docs"
48
49
  Requires-Dist: ipython; extra == "docs"
49
50
  Requires-Dist: rstcheck; extra == "docs"
50
51
  Requires-Dist: setuptools; extra == "docs"
51
- Requires-Dist: sphinx; extra == "docs"
52
+ Requires-Dist: sphinx<9; extra == "docs"
52
53
  Requires-Dist: sphinx-argparse; extra == "docs"
53
54
  Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
54
- Requires-Dist: sphinx_rtd_theme; extra == "docs"
55
+ Requires-Dist: sphinx_rtd_theme>=3.1.0.rc1; extra == "docs"
55
56
  Provides-Extra: ert
56
57
  Requires-Dist: ert>=10.2.0b13; extra == "ert"
57
58
  Dynamic: license-file
@@ -59,7 +60,7 @@ Dynamic: license-file
59
60
  [![Publish to PyPI](https://github.com/equinor/res2df/actions/workflows/publish.yml/badge.svg)](https://github.com/equinor/res2df/actions/workflows/publish.yml)
60
61
  [![PyPI version](https://img.shields.io/pypi/v/res2df.svg)](https://pypi.org/project/res2df/)
61
62
  [![codecov](https://codecov.io/gh/equinor/res2df/graph/badge.svg?token=3sZBGGu5VG)](https://codecov.io/gh/equinor/res2df)
62
- [![Python 3.11-3.13](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13-blue.svg)](https://www.python.org)
63
+ [![Python 3.11-3.14](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13%20|%203.14-blue.svg)](https://www.python.org)
63
64
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
64
65
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
65
66
 
@@ -1,7 +1,7 @@
1
1
  [![Publish to PyPI](https://github.com/equinor/res2df/actions/workflows/publish.yml/badge.svg)](https://github.com/equinor/res2df/actions/workflows/publish.yml)
2
2
  [![PyPI version](https://img.shields.io/pypi/v/res2df.svg)](https://pypi.org/project/res2df/)
3
3
  [![codecov](https://codecov.io/gh/equinor/res2df/graph/badge.svg?token=3sZBGGu5VG)](https://codecov.io/gh/equinor/res2df)
4
- [![Python 3.11-3.13](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13-blue.svg)](https://www.python.org)
4
+ [![Python 3.11-3.14](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13%20|%203.14-blue.svg)](https://www.python.org)
5
5
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
6
6
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
7
7
 
@@ -28,6 +28,7 @@ classifiers = [
28
28
  "Programming Language :: Python :: 3.11",
29
29
  "Programming Language :: Python :: 3.12",
30
30
  "Programming Language :: Python :: 3.13",
31
+ "Programming Language :: Python :: 3.14",
31
32
  "Natural Language :: English",
32
33
  ]
33
34
 
@@ -66,10 +67,10 @@ docs = [
66
67
  "ipython",
67
68
  "rstcheck",
68
69
  "setuptools",
69
- "sphinx",
70
+ "sphinx < 9",
70
71
  "sphinx-argparse",
71
72
  "sphinx-autodoc-typehints",
72
- "sphinx_rtd_theme"
73
+ "sphinx_rtd_theme >= 3.1.0.rc1",
73
74
  ]
74
75
  ert = ["ert>=10.2.0b13"]
75
76
 
@@ -140,6 +141,11 @@ select = [
140
141
  "RUF", # ruff specific rules
141
142
  "UP", # pyupgrade
142
143
  "ANN", # flake8-annotations
144
+ "FURB", # refurb
145
+ "PERF", # perflint
146
+ "PTH", # flake8-use-pathlib
147
+ "ICN", # flake8-import-conventions
148
+ "ISC", # flake8-implicit-str-concat
143
149
  ]
144
150
  preview = true
145
151
  ignore = [
@@ -161,7 +167,7 @@ ignore = [
161
167
 
162
168
  [tool.ruff.lint.extend-per-file-ignores]
163
169
  "src/res2df/__init__.py" = ["PLC0414"]
164
- "tests/*" = ["RUF005", "ANN"]
170
+ "tests/*" = ["RUF005", "ANN", "FURB113", "PERF"]
165
171
  "docs/*" = ["ANN"]
166
172
 
167
173
  [tool.ruff.lint.pylint]
@@ -972,9 +972,6 @@ def get_wells_matching_template(template: str, wells: list[str]) -> list[str]:
972
972
  "Well template not allowed to start with a wildcard character: "
973
973
  f"Must be preceded with a \\: {template}"
974
974
  )
975
- if template.startswith("\\"):
976
- # Note that the two \\ are actually read as one and
977
- # this will return True for f.ex '\*P1'
978
- template = template[1:]
975
+ template = template.removeprefix("\\")
979
976
  regex = template.replace("*", ".*").replace("?", ".")
980
977
  return [well for well in wells if bool(re.match(regex, well))]
@@ -7,6 +7,7 @@ a DataFrame
7
7
 
8
8
  import argparse
9
9
  import logging
10
+ from itertools import product
10
11
 
11
12
  # Needed for mypy
12
13
  import opm.io
@@ -36,7 +37,7 @@ def df(deck: "ResdataFiles | opm.opmcommon_python.Deck") -> pd.DataFrame:
36
37
 
37
38
  # In[91]: list(deck['FAULTS'][0])
38
39
  # Out[91]: [[u'F1'], [36], [36], [41], [42], [1], [14], [u'I']]
39
- data = []
40
+ data: list[list[str | int]] = []
40
41
  # It is allowed in Eclipse to use the keyword FAULTS
41
42
  # as many times as needed. Thus we need to loop in some way:
42
43
  for keyword in deck:
@@ -47,10 +48,13 @@ def df(deck: "ResdataFiles | opm.opmcommon_python.Deck") -> pd.DataFrame:
47
48
  frec_dict = parse_opmio_deckrecord(rec, "FAULTS")
48
49
  faultname = frec_dict["NAME"]
49
50
  faultface = frec_dict["FACE"]
50
- for i_idx in range(frec_dict["IX1"], frec_dict["IX2"] + 1):
51
- for j_idx in range(frec_dict["IY1"], frec_dict["IY2"] + 1):
52
- for k_idx in range(frec_dict["IZ1"], frec_dict["IZ2"] + 1):
53
- data.append([faultname, i_idx, j_idx, k_idx, faultface])
51
+
52
+ indices = product(
53
+ range(frec_dict["IX1"], frec_dict["IX2"] + 1),
54
+ range(frec_dict["IY1"], frec_dict["IY2"] + 1),
55
+ range(frec_dict["IZ1"], frec_dict["IZ2"] + 1),
56
+ )
57
+ data.extend([faultname, i, j, k, faultface] for i, j, k in indices)
54
58
  dframe = pd.DataFrame(columns=COLUMNS, data=data)
55
59
  logger.info("Extracted %i faults", len(dframe["NAME"].unique()))
56
60
  return dframe
@@ -4,6 +4,7 @@ import argparse
4
4
  import datetime
5
5
  import logging
6
6
  import re
7
+ from pathlib import Path
7
8
 
8
9
  import numpy as np
9
10
  import pandas as pd
@@ -133,7 +134,7 @@ def df(prtfile: str | ResdataFiles, fipname: str = "FIPNUM") -> pd.DataFrame:
133
134
  ".+" + fipname + r"\s+REPORT\s+REGION\s+(\d+)", re.IGNORECASE
134
135
  )
135
136
 
136
- with open(prtfile, encoding="utf-8") as prt_fh:
137
+ with Path(prtfile).open(encoding="utf-8") as prt_fh:
137
138
  logger.info(
138
139
  "Parsing file %s for blocks starting with %s REPORT REGION",
139
140
  prtfile,
@@ -544,7 +544,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
544
544
  parser.add_argument(
545
545
  "DATAFILE",
546
546
  help="Name of the .DATA input file for the reservoir simulator."
547
- + " There must exist .INIT and .EGRID files with the same path and basename.",
547
+ " There must exist .INIT and .EGRID files with the same path and basename.",
548
548
  )
549
549
  parser.add_argument(
550
550
  "--vectors",
@@ -556,8 +556,8 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
556
556
  "--rstdates",
557
557
  type=str,
558
558
  help="Point in time to grab restart data from, "
559
- + "either 'first' or 'last', 'all', or a date in "
560
- + "YYYY-MM-DD format",
559
+ "either 'first' or 'last', 'all', or a date in "
560
+ "YYYY-MM-DD format",
561
561
  default="",
562
562
  )
563
563
  parser.add_argument(
@@ -610,10 +610,11 @@ def drop_constant_columns(
610
610
  if dframe.empty:
611
611
  return dframe
612
612
 
613
- columnstodelete = []
614
- for col in set(dframe.columns) - set(alwayskeep):
615
- if len(dframe[col].unique()) == 1:
616
- columnstodelete.append(col)
613
+ columnstodelete = [
614
+ col
615
+ for col in (set(dframe.columns) - set(alwayskeep))
616
+ if len(dframe[col].unique()) == 1
617
+ ]
617
618
  if columnstodelete:
618
619
  logging.info("Deleting constant columns %s", columnstodelete)
619
620
  return dframe.drop(columnstodelete, axis=1)
@@ -698,11 +699,7 @@ def df2res(
698
699
 
699
700
  res2df_header = (
700
701
  "Output file printed by "
701
- + "res2df.grid "
702
- + __version__
703
- + "\n"
704
- + " at "
705
- + str(datetime.datetime.now())
702
+ "res2df.grid " + __version__ + "\n" + " at " + str(datetime.datetime.now())
706
703
  )
707
704
 
708
705
  string = ""
@@ -67,7 +67,7 @@ def df(
67
67
  deck = deck.get_deck()
68
68
 
69
69
  edgerecords = [] # list of dict of rows containing an edge.
70
- nodedatarecords = []
70
+ nodedatarecords: list[dict[str, Any]] = []
71
71
 
72
72
  # In order for the GRUPTREE/BRANPROP keywords to accumulate, we
73
73
  # store the edges as dictionaries indexed by the edge
@@ -144,10 +144,10 @@ def df(
144
144
  renamer = (
145
145
  {"PRESSURE": "TERMINAL_PRESSURE"} if kword.name == "NODEPROP" else None
146
146
  )
147
- for rec in kword:
148
- nodedatarecords.append(
149
- parse_opmio_deckrecord(rec, kword.name, renamer=renamer)
150
- )
147
+ nodedatarecords.extend(
148
+ parse_opmio_deckrecord(rec, kword.name, renamer=renamer)
149
+ for rec in kword
150
+ )
151
151
  nodedata[kword.name] = (
152
152
  pd.DataFrame(nodedatarecords)
153
153
  .drop_duplicates(subset="NAME", keep="last")
@@ -254,7 +254,7 @@ def _merge_edges_and_nodeinfo(
254
254
 
255
255
  # Write WELSPECS edges
256
256
  welspecs_parents = set()
257
- for (child, parent), _ in wellspecsedges.items():
257
+ for child, parent in wellspecsedges: # noqa: PLE1141
258
258
  # For BRANPROP trees, only wells with a parent in the tree are added
259
259
  if (treetype == "BRANPROP" and parent in childs) or (treetype == "GRUPTREE"):
260
260
  rec_dict = {
@@ -38,7 +38,7 @@ def guess_dim(deckstring: str, dimkeyword: str, dimitem: int = 0) -> int:
38
38
  raise ValueError("Only supports TABDIMS and EQLDIMS")
39
39
  if dimkeyword == "TABDIMS" and dimitem not in [0, 1]:
40
40
  raise ValueError("Only support item 0 and 1 in TABDIMS")
41
- if dimkeyword == "EQLDIMS" and dimitem not in [0]:
41
+ if dimkeyword == "EQLDIMS" and dimitem != 0:
42
42
  raise ValueError("Only item 0 in EQLDIMS can be estimated")
43
43
 
44
44
  # A less than res2df-standard permissive opm.io, when using
@@ -112,7 +112,7 @@ def inject_dimcount(
112
112
  raise ValueError("Only supports TABDIMS and EQLDIMS")
113
113
  if dimkeyword == "TABDIMS" and dimitem not in [0, 1]:
114
114
  raise ValueError("Only support item 0 and 1 in TABDIMS")
115
- if dimkeyword == "EQLDIMS" and dimitem not in [0]:
115
+ if dimkeyword == "EQLDIMS" and dimitem != 0:
116
116
  raise ValueError("Only item 0 in EQLDIMS can be injected")
117
117
 
118
118
  if dimkeyword in deckstr:
@@ -181,7 +181,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
181
181
  parser.add_argument(
182
182
  "DATAFILE",
183
183
  help="Name of the .DATA input file for the reservoir simulator."
184
- + " There must exist .INIT and .EGRID files with the same path and basename.",
184
+ " There must exist .INIT and .EGRID files with the same path and basename.",
185
185
  )
186
186
  parser.add_argument(
187
187
  "-c",
@@ -242,11 +242,7 @@ def df2res_editnnc(
242
242
  string = ""
243
243
  res2df_header = (
244
244
  "Output file printed by res2df.nnc"
245
- + " "
246
- + __version__
247
- + "\n"
248
- + " at "
249
- + str(datetime.datetime.now())
245
+ " " + __version__ + "\n" + " at " + str(datetime.datetime.now())
250
246
  )
251
247
  if not nocomments:
252
248
  string += comment_formatter(res2df_header)
@@ -47,7 +47,7 @@ def find_parameter_files(
47
47
  filebase + ".txt",
48
48
  filebase,
49
49
  ]
50
- paths_to_check: list[Path] = [Path("."), Path(".."), Path("..") / Path("..")]
50
+ paths_to_check: list[Path] = [Path(), Path(".."), Path("..") / Path("..")]
51
51
  foundfiles = []
52
52
  for path in paths_to_check:
53
53
  for fname in files_to_lookfor:
@@ -147,7 +147,7 @@ def load(filename: str | Path) -> dict[str, Any]:
147
147
  if not params_dict:
148
148
  try:
149
149
  logger.debug("Trying to parse %s with json.load()", filename)
150
- with open(filename, encoding="utf-8") as f_handle:
150
+ with Path(filename).open(encoding="utf-8") as f_handle:
151
151
  params_dict = json.load(f_handle)
152
152
  assert isinstance(params_dict, dict)
153
153
  logger.debug(" - ok, parsed as yaml")
@@ -327,7 +327,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
327
327
  parser.add_argument(
328
328
  "DATAFILE",
329
329
  help="Name of the .DATA input file for the reservoir simulator."
330
- + " There must exist .INIT and .EGRID files with the same path and basename.",
330
+ " There must exist .INIT and .EGRID files with the same path and basename.",
331
331
  )
332
332
  parser.add_argument(
333
333
  "--region",
@@ -252,7 +252,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
252
252
  parser.add_argument(
253
253
  "DATAFILE",
254
254
  help="Name of the .DATA input file for the reservoir simulator,"
255
- + " or file with PVT keywords.",
255
+ " or file with PVT keywords.",
256
256
  )
257
257
  parser.add_argument(
258
258
  "-o",
@@ -103,15 +103,14 @@ def df(
103
103
 
104
104
  wanted_keywords = handle_wanted_keywords(keywords, deck, SUPPORTED_KEYWORDS)
105
105
 
106
- frames = []
107
- for keyword in wanted_keywords:
108
- frames.append(
109
- interpolate_defaults(
110
- keyworddata_to_df(
111
- deck, keyword, renamer=RENAMERS[keyword], recordcountername="SATNUM"
112
- ).assign(KEYWORD=keyword)
113
- )
106
+ frames = [
107
+ interpolate_defaults(
108
+ keyworddata_to_df(
109
+ deck, keyword, renamer=RENAMERS[keyword], recordcountername="SATNUM"
110
+ ).assign(KEYWORD=keyword)
114
111
  )
112
+ for keyword in wanted_keywords
113
+ ]
115
114
  nonempty_frames = [frame for frame in frames if not frame.empty]
116
115
  if nonempty_frames:
117
116
  dframe = pd.concat(nonempty_frames, axis=0, sort=False, ignore_index=True)
@@ -167,7 +166,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
167
166
  parser.add_argument(
168
167
  "DATAFILE",
169
168
  help="Name of .DATA input file for the reservoir simulator,"
170
- + " or file with saturation functions.",
169
+ " or file with saturation functions.",
171
170
  )
172
171
  parser.add_argument(
173
172
  "-o",
@@ -697,7 +697,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
697
697
  parser.add_argument(
698
698
  "DATAFILE",
699
699
  help="Name of the .DATA input file for the reservoir simulator."
700
- + " There must exist a UNSMRY file with the same path and basename.",
700
+ " There must exist a UNSMRY file with the same path and basename.",
701
701
  )
702
702
  parser.add_argument(
703
703
  "--time_index",
@@ -830,7 +830,7 @@ def summary_reverse_main(args: argparse.Namespace) -> None:
830
830
  eclbase = Path(args.output).name
831
831
 
832
832
  # Summary.fwrite() can only write to current directory:
833
- cwd = os.getcwd()
833
+ cwd = Path.cwd()
834
834
  summary = df2ressum(summary_df, eclbase)
835
835
  try:
836
836
  os.chdir(outputdir)
@@ -6,7 +6,7 @@ Extract transmissibility information from output files as Dataframes.
6
6
  import argparse
7
7
  import logging
8
8
 
9
- import networkx
9
+ import networkx as nx
10
10
  import pandas as pd
11
11
 
12
12
  from .common import write_dframe_stdout_file
@@ -221,12 +221,12 @@ def df(
221
221
  return trans_df
222
222
 
223
223
 
224
- def make_nx_graph(resdatafiles: ResdataFiles, region: str = "FIPNUM") -> networkx.Graph:
224
+ def make_nx_graph(resdatafiles: ResdataFiles, region: str = "FIPNUM") -> nx.Graph:
225
225
  """Construct a networkx graph for the transmissibilities."""
226
226
  trans_df = df(resdatafiles, vectors=[region], coords=True, group=True)
227
227
  reg1 = region + "1"
228
228
  reg2 = region + "2"
229
- graph: networkx.Graph = networkx.Graph()
229
+ graph: nx.Graph = nx.Graph()
230
230
  graph.add_weighted_edges_from(
231
231
  [tuple(row) for row in trans_df[[reg1, reg2, "TRAN"]].to_numpy()]
232
232
  )
@@ -242,7 +242,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
242
242
  parser.add_argument(
243
243
  "DATAFILE",
244
244
  help="Name of the .DATA input file for the reservoir simulator."
245
- + " There must exist INIT and EGRID files with the same path and basename.",
245
+ " There must exist INIT and EGRID files with the same path and basename.",
246
246
  )
247
247
  parser.add_argument("--vectors", nargs="+", help="Extra INIT vectors to be added")
248
248
  parser.add_argument(
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.3.10'
32
- __version_tuple__ = version_tuple = (1, 3, 10)
31
+ __version__ = version = '1.3.11'
32
+ __version_tuple__ = version_tuple = (1, 3, 11)
33
33
 
34
- __commit_id__ = commit_id = 'g7cab87127'
34
+ __commit_id__ = commit_id = 'g6a680e0c8'
@@ -7,6 +7,7 @@ output both in csv format as a pandas DataFrame or in pyarrow and pyarrow.table
7
7
  import argparse
8
8
  import logging
9
9
  import sys
10
+ from pathlib import Path
10
11
  from typing import Any
11
12
 
12
13
  import numpy as np
@@ -400,8 +401,7 @@ def df2res(
400
401
  str_vfps += "\n"
401
402
 
402
403
  if filename:
403
- with open(filename, "w", encoding="utf-8") as fout:
404
- fout.write(str_vfps)
404
+ Path(filename).write_text(str_vfps, encoding="utf-8")
405
405
 
406
406
  return str_vfps
407
407
 
@@ -30,19 +30,18 @@ def _string2intlist(list_def_str: str) -> list[int]:
30
30
  list_def_str: String defining list of int
31
31
  Format "[1,2,6:9]" to define list [1,2,6,7,8,9]
32
32
  """
33
- list = []
33
+ int_list: list[int] = []
34
34
  list_def = list_def_str.strip().strip("[").strip("]")
35
35
  if list_def.strip():
36
36
  list_items = list_def.split(",") if "," in list_def else [list_def]
37
37
  for item in list_items:
38
38
  if ":" in item:
39
39
  item_split = item.split(":")
40
- for value in item_split:
41
- list.append(int(value))
40
+ int_list.extend(int(value) for value in item_split)
42
41
  else:
43
- list.append(int(item))
42
+ int_list.append(int(item))
44
43
 
45
- return list
44
+ return int_list
46
45
 
47
46
 
48
47
  def _deckrecord2list(
@@ -128,11 +127,8 @@ def _stack_vfptable2df(
128
127
  df_vfptable.insert(i, index_names_list[i], index_values_list[i])
129
128
 
130
129
  # create multi-index for columns
131
- indextuples = []
132
- for index_name in index_names_list:
133
- indextuples.append((index_name, "DELETE"))
134
- for flowvalue in flow_values_list:
135
- indextuples.append(("TAB", str(flowvalue)))
130
+ indextuples = [(index_name, "DELETE") for index_name in index_names_list]
131
+ indextuples.extend(("TAB", str(flowvalue)) for flowvalue in flow_values_list)
136
132
 
137
133
  # Set the columns to a MultiIndex, to facilitate stacking
138
134
  df_vfptable.columns = pd.MultiIndex.from_tuples(indextuples)
@@ -395,9 +395,10 @@ def pyarrow2basic_data(pa_table: pa.Table) -> dict[str, Any]:
395
395
  """
396
396
 
397
397
  # Extract index data from colum metadata
398
- thp_indices = []
399
- for i in range(0, pa_table.num_columns):
400
- thp_indices.append(int(pa_table.schema.field(i).metadata[b"thp_idx"]))
398
+ thp_indices = [
399
+ int(pa_table.schema.field(i).metadata[b"thp_idx"])
400
+ for i in range(0, pa_table.num_columns)
401
+ ]
401
402
 
402
403
  # Extract table data as numpy.array
403
404
  bhp_data = np.array(pa_table.columns)
@@ -257,7 +257,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
257
257
  "DATAFILE",
258
258
  type=str,
259
259
  help="Name of the .DATA input file for the reservoir simulator."
260
- + " There must exist a UNSMRY file with the same path and basename",
260
+ " There must exist a UNSMRY file with the same path and basename",
261
261
  )
262
262
  parser.add_argument(
263
263
  "--zonemap",
@@ -96,7 +96,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
96
96
  "DATAFILE",
97
97
  type=str,
98
98
  help="Name of the .DATA input file for the reservoir simulator."
99
- + " There must exist a UNSMRY file with the same path and basename.",
99
+ " There must exist a UNSMRY file with the same path and basename.",
100
100
  )
101
101
  parser.add_argument(
102
102
  "-o",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: res2df
3
- Version: 1.3.10
3
+ Version: 1.3.11
4
4
  Summary: Convert reservoir simulator input and output to DataFrames
5
5
  Author-email: Håvard Berland <havb@equinor.com>
6
6
  License-Expression: GPL-3.0-only
@@ -16,6 +16,7 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Natural Language :: English
20
21
  Requires-Python: >=3.11
21
22
  Description-Content-Type: text/markdown
@@ -48,10 +49,10 @@ Requires-Dist: sphinx-autoapi; extra == "docs"
48
49
  Requires-Dist: ipython; extra == "docs"
49
50
  Requires-Dist: rstcheck; extra == "docs"
50
51
  Requires-Dist: setuptools; extra == "docs"
51
- Requires-Dist: sphinx; extra == "docs"
52
+ Requires-Dist: sphinx<9; extra == "docs"
52
53
  Requires-Dist: sphinx-argparse; extra == "docs"
53
54
  Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
54
- Requires-Dist: sphinx_rtd_theme; extra == "docs"
55
+ Requires-Dist: sphinx_rtd_theme>=3.1.0.rc1; extra == "docs"
55
56
  Provides-Extra: ert
56
57
  Requires-Dist: ert>=10.2.0b13; extra == "ert"
57
58
  Dynamic: license-file
@@ -59,7 +60,7 @@ Dynamic: license-file
59
60
  [![Publish to PyPI](https://github.com/equinor/res2df/actions/workflows/publish.yml/badge.svg)](https://github.com/equinor/res2df/actions/workflows/publish.yml)
60
61
  [![PyPI version](https://img.shields.io/pypi/v/res2df.svg)](https://pypi.org/project/res2df/)
61
62
  [![codecov](https://codecov.io/gh/equinor/res2df/graph/badge.svg?token=3sZBGGu5VG)](https://codecov.io/gh/equinor/res2df)
62
- [![Python 3.11-3.13](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13-blue.svg)](https://www.python.org)
63
+ [![Python 3.11-3.14](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13%20|%203.14-blue.svg)](https://www.python.org)
63
64
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
64
65
  [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
65
66
 
@@ -13,10 +13,10 @@ sphinx-autoapi
13
13
  ipython
14
14
  rstcheck
15
15
  setuptools
16
- sphinx
16
+ sphinx<9
17
17
  sphinx-argparse
18
18
  sphinx-autodoc-typehints
19
- sphinx_rtd_theme
19
+ sphinx_rtd_theme>=3.1.0.rc1
20
20
 
21
21
  [ert]
22
22
  ert>=10.2.0b13
@@ -551,7 +551,7 @@ def test_main_subparser(tmp_path, mocker):
551
551
  phases = "WATER\nGAS\nOIL\n\n"
552
552
  ph_equil_inc = Path("phasesequil.inc")
553
553
  ph_equil_inc.write_text(
554
- phases + Path("equil.inc", encoding="utf8").read_text(encoding="utf8"),
554
+ phases + Path("equil.inc").read_text(encoding="utf8"),
555
555
  encoding="utf8",
556
556
  )
557
557
 
@@ -154,7 +154,7 @@ def run_reservoir_simulator(eclipse_version: str, datafile: str) -> None:
154
154
  print(result.stdout.decode())
155
155
  if result.stderr:
156
156
  print(result.stderr.decode())
157
- raise RuntimeError(f"reservoir simulator failed in {os.getcwd()}")
157
+ raise RuntimeError(f"reservoir simulator failed in {Path.cwd()}")
158
158
 
159
159
 
160
160
  def eightcells_deck(
@@ -2,7 +2,7 @@
2
2
 
3
3
  from pathlib import Path
4
4
 
5
- import networkx
5
+ import networkx as nx
6
6
  import pandas as pd
7
7
 
8
8
  from res2df import ResdataFiles, res2csv, trans
@@ -79,7 +79,7 @@ def test_nx(tmp_path):
79
79
  resdatafiles = ResdataFiles(REEK)
80
80
  network = trans.make_nx_graph(resdatafiles, region="FIPNUM")
81
81
  assert network.number_of_nodes() == 6
82
- networkx.write_gexf(network, tmp_path / "reek-fipnum-trans.gxf", prettyprint=True)
82
+ nx.write_gexf(network, tmp_path / "reek-fipnum-trans.gxf", prettyprint=True)
83
83
  assert (tmp_path / "reek-fipnum-trans.gxf").is_file()
84
84
 
85
85