diff --git a/HISTORY.rst b/HISTORY.rst index c6d83b566f..beb97bd0be 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -73,6 +73,10 @@ Unreleased Changes table columns: ``cur_path``, ``fut_path``, and ``base_path`` are meant to be file system path strings. https://github.com/natcap/invest/issues/1455 +* HRA + * Fixed an issue preventing the HRA criteria table from loading when the + table was UTF-8 encoded with a Byte-Order Marker. + https://github.com/natcap/invest/issues/1460 * NDR * Fixing an issue where minor geometric issues in the watersheds input (such as a ring self-intersection) would raise an error in the model. diff --git a/tests/test_hra.py b/tests/test_hra.py index 9e0a7ead45..e30fd799c6 100644 --- a/tests/test_hra.py +++ b/tests/test_hra.py @@ -326,6 +326,41 @@ def test_criteria_table_parsing(self): pandas.testing.assert_frame_equal( expected_composite_dataframe, composite_dataframe) + def test_criteria_table_parsing_with_bom(self): + """HRA: criteria table - parse a BOM.""" + from natcap.invest import hra + + criteria_table_path = os.path.join(self.workspace_dir, 'criteria.csv') + with open(criteria_table_path, 'w', encoding='utf-8-sig') as criteria_table: + criteria_table.write( + textwrap.dedent( + """\ + HABITAT NAME,eelgrass,,,hardbottom,,,CRITERIA TYPE + HABITAT RESILIENCE ATTRIBUTES,RATING,DQ,WEIGHT,RATING,DQ,WEIGHT,E/C + recruitment rate,2,2,2,2,2,2,C + connectivity rate,2,2,2,2,2,2,C + ,,,,,,, + HABITAT STRESSOR OVERLAP PROPERTIES,,,,,,, + oil,RATING,DQ,WEIGHT,RATING,DQ,WEIGHT,E/C + frequency of disturbance,2,2,3,2,2,3,C + management effectiveness,2,2,1,2,2,1,E + ,,,,,,, + fishing,RATING,DQ,WEIGHT,RATING,DQ,WEIGHT,E/C + frequency of disturbance,2,2,3,2,2,3,C + management effectiveness,2,2,1,2,2,1,E + """ + )) + + # Sanity check: make sure the file has the expected BOM + # Gotta use binary mode so that python doesn't silently strip the BOM + with open(criteria_table_path, 'rb') as criteria_table: + self.assertTrue(criteria_table.read().startswith(b"\xef\xbb\xbf")) + + target_composite_csv_path = os.path.join(self.workspace_dir, + 'composite.csv') + hra._parse_criteria_table(criteria_table_path, + target_composite_csv_path) + def test_criteria_table_file_not_found(self): """HRA: criteria table - spatial file not found.""" from natcap.invest import hra