flopy icon indicating copy to clipboard operation
flopy copied to clipboard

refactor(datafile): ignore "text" parameter, add attributes from file

Open mwtoews opened this issue 1 year ago • 4 comments

This PR ignores the text= parameter from HeadFile, HeadUFile and UcnFile, since this should be read from the file and is constant for all records. This PR adds these attributes:

  • obj.text_bytes, the 16-byte char bytes obtained from the file
  • obj.text, a str version of this field, .e.g., used by flopy.export for NetCDF variable names

There are instances where other binary files can be attempted to be read (e.g. "mt3d_test/mf96mt3d/P01/case1b/MT3D001.UCN" with HeadFile), but these are now caught with exceptions raised. Warnings are raised if the text records are inconsistent, which shouldn't happen (unless I've misunderstood something!)

mwtoews avatar Jun 14 '24 01:06 mwtoews

This does have a breaking change, where previously the obj.text attribute was bytes, and now changed to str. For instance:

Before:

>>> pth = example_data_path / "unstructured/headu.githds"
>>> obj = flopy.utils.binaryfile.HeadUFile(pth)
>>> obj.text
b'headu'

After:

>>> obj = flopy.utils.binaryfile.HeadUFile(pth)
>>> obj.text
'headu'
>>> obj.text_bytes
b'           HEADU'

if this is a deal-breaker, then obj.text can be kept as the modified bytes (possibly raising a deprecation message if accessed), and the str version of the attribute instead stored at obj.text_str.

Also, I should note that this PR does not change FormattedHeadFile, since further refactoring may be needed.

mwtoews avatar Jun 14 '24 02:06 mwtoews

Codecov Report

Attention: Patch coverage is 63.15789% with 7 lines in your changes missing coverage. Please review.

Project coverage is 70.8%. Comparing base (e2a85a3) to head (fb14357).

Additional details and impacted files
@@            Coverage Diff            @@
##           develop   #2231     +/-   ##
=========================================
- Coverage     70.8%   70.8%   -0.1%     
=========================================
  Files          294     294             
  Lines        59026   59029      +3     
=========================================
- Hits         41832   41804     -28     
- Misses       17194   17225     +31     
Files Coverage Δ
flopy/export/vtk.py 78.0% <100.0%> (-0.1%) :arrow_down:
flopy/utils/binaryfile.py 81.7% <100.0%> (+0.1%) :arrow_up:
flopy/utils/datafile.py 73.6% <100.0%> (+0.3%) :arrow_up:
flopy/mf6/utils/binaryfile_utils.py 10.6% <0.0%> (ø)
flopy/export/utils.py 59.0% <16.6%> (-2.4%) :arrow_down:

... and 6 files with indirect coverage changes

codecov[bot] avatar Jun 14 '24 03:06 codecov[bot]

Thanks @langevin-usgs for the info, I'll create and add a mixed text example to test, e.g. head/drawdown. The text parameter can be changed to optional, which would default to read the first text header, and warn if more than one found.

mwtoews avatar Jun 14 '24 18:06 mwtoews

Confirmed I can create the mixed-text file with older MF versions, and testing current and ancient versions of flopy I can see this feature has never worked. I'll superseded this PR with a fix after a few other related refactors that use the .headers data frame property.

mwtoews avatar Jun 14 '24 21:06 mwtoews