From e1d3980db65268b689be7237de2f5677a0b22f21 Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Mon, 16 Dec 2024 10:05:27 -0800 Subject: [PATCH 01/12] Add pre-commit config --- .pre-commit-config.yaml | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..10141221 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,44 @@ +exclude: "docs|.git|geometric_data" +default_stages: [pre-commit] +fail_fast: true + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + + # Can run individually with `pre-commit run isort --all-files` + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 + hooks: + - id: isort + exclude: "geometric_features/__init__.py" + + # Can run individually with `flynt [file]` or `flynt [source]` + - repo: https://github.com/ikamensh/flynt + rev: '1.0.1' + hooks: + - id: flynt + args: ["--fail-on-change", "--verbose"] + require_serial: true + + # Can run individually with `pre-commit run flake8 --all-files` + # Need to use flake8 GitHub mirror due to CentOS git issue with GitLab + # https://github.com/pre-commit/pre-commit/issues/1206 + - repo: https://github.com/pycqa/flake8 + rev: 7.1.1 + hooks: + - id: flake8 + args: ["--config=.flake8"] + additional_dependencies: [flake8-isort] + + # Can run individually with `pre-commit run mypy --all-files` + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.13.0 + hooks: + - id: mypy + args: ["--config=pyproject.toml", "--show-error-codes"] + verbose: true + additional_dependencies: ['types-requests', 'types-PyYAML'] From be4bc71bef6621081c559b013d7969ce446b2c7e Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Mon, 16 Dec 2024 10:41:10 -0800 Subject: [PATCH 02/12] Add flake8 configuration file --- .flake8 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..4da080b2 --- /dev/null +++ b/.flake8 @@ -0,0 +1,16 @@ +[flake8] +# https://pep8.readthedocs.io/en/latest/intro.html#error-codes +ignore = + # line break after operator + W504 +# Max width of Github code review is 79 characters +max-line-length = 79 +max-complexity = 18 +per-file-ignores = + */__init__.py: F401 +exclude = + .git, + docs, + .idea, + .mypy_cache, + .pytest_cache, From 596ff5a1cff8de607ba9eaec73e96bdc6b5828f7 Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Mon, 16 Dec 2024 10:05:39 -0800 Subject: [PATCH 03/12] Add pre-commit to deps --- dev-spec.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-spec.txt b/dev-spec.txt index 70a63441..99a6ab05 100644 --- a/dev-spec.txt +++ b/dev-spec.txt @@ -15,6 +15,7 @@ shapely>=2.0,<3.0 pip pytest setuptools>=60 +pre-commit # Documentation sphinx From 674d65b4dada3ba386cc639aa1b995fe23ceefba Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Mon, 16 Dec 2024 10:31:36 -0800 Subject: [PATCH 04/12] Fix extra spaces at end of lines --- LICENSE | 2 +- .../extract_bedmachine_coastlines.py | 2 +- feature_creation_scripts/iceshelves/polar.py | 16 +++++++------- .../ismip6_antarctic_ocean_regions/README.md | 4 ++-- .../flipOSNAP_renameArcticTransectsTag.py | 2 +- .../transport_transects/transport_sections.m | 22 +++++++++---------- geometric_features/geometric_features.py | 8 +++---- geometric_features/test/test_aggregation.py | 4 ++-- 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/LICENSE b/LICENSE index f6af5ee0..4ae179dc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ Copyright (c) 2013-2018, Los Alamos National Security, LLC (LANS) (Ocean: LA-CC-13-047; Land Ice: LA-CC-13-117) and the University Corporation for Atmospheric Research (UCAR). -All rights reserved. +All rights reserved. LANS is the operator of the Los Alamos National Laboratory under Contract No. DE-AC52-06NA25396 with the U.S. Department of Energy. UCAR manages the National diff --git a/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py b/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py index cf427ace..e34fb10e 100755 --- a/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py +++ b/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py @@ -39,7 +39,7 @@ cp feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py . ./extract_bedmachine_coastlines.py -This script takes as input the BedMachine topography data. It produces the +This script takes as input the BedMachine topography data. It produces the feature file AntarcticIceCoverage.geojson containing two features: 1) AntarcticIceCoverage contains all grounded or floating ice in Antarctica as well as all bare bedrock above sea level lying south of 60S diff --git a/feature_creation_scripts/iceshelves/polar.py b/feature_creation_scripts/iceshelves/polar.py index 422ecb25..efef8b16 100644 --- a/feature_creation_scripts/iceshelves/polar.py +++ b/feature_creation_scripts/iceshelves/polar.py @@ -14,11 +14,11 @@ def toPolar(points): sinParametricLats = numpy.sin(parametricLats) stretch = (1.0 - sinProjectionLat)/(1.0 - sinParametricLats) - - + + y = a*stretch*numpy.cos(parametricLats)*numpy.cos(lons) x = a*stretch*numpy.cos(parametricLats)*numpy.sin(lons) - + points[:,1] = y points[:,0] = x return points @@ -30,21 +30,21 @@ def fromPolar(points): latToParametricLatFactor = numpy.sqrt(1.0 - (2*f - f**2)) # sqrt(1 - e^2) projectionLat = -71.0*numpy.pi/180.0 sinProjectionLat = numpy.sin(numpy.arctan(latToParametricLatFactor*numpy.tan(projectionLat))) - - + + Lons = 180.0/numpy.pi*numpy.arctan2(points[:,0],points[:,1]) - + stretch = 1.0 for iterIndex in range(10): cosParametricLats = stretch*numpy.sqrt(points[:,0]**2+points[:,1]**2)/a sinParametricLats = -numpy.sqrt(1.0 - cosParametricLats**2) stretch = (1.0 - sinParametricLats)/(1.0 - sinProjectionLat) #print iterIndex, numpy.amax(stretch) - + mask = cosParametricLats != 0 Lats = -90.0*numpy.ones(Lons.shape) Lats[mask] = 180.0/numpy.pi*numpy.arctan(sinParametricLats[mask]/cosParametricLats[mask]/latToParametricLatFactor) - + points[:,0] = Lons points[:,1] = Lats diff --git a/feature_creation_scripts/ismip6_antarctic_ocean_regions/README.md b/feature_creation_scripts/ismip6_antarctic_ocean_regions/README.md index 5770e0ec..b0cb4794 100644 --- a/feature_creation_scripts/ismip6_antarctic_ocean_regions/README.md +++ b/feature_creation_scripts/ismip6_antarctic_ocean_regions/README.md @@ -1,7 +1,7 @@ # ISMIP6 Antarctic Ocean Regions Features used to compute regional and temporal mean temperature and salinity -for comparison with the model selection process in +for comparison with the model selection process in [Barthel et al. (2020)](https://doi.org/10.5194/tc-14-855-2020), which was - used to select CMIP5 models for + used to select CMIP5 models for [ISMIP6](http://www.climate-cryosphere.org/mips/ismip6). diff --git a/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py b/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py index 71725bb7..d2d38e9a 100644 --- a/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py +++ b/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py @@ -1,5 +1,5 @@ #!/usr/bin/env python - + import shutil from geometric_features import GeometricFeatures, FeatureCollection diff --git a/feature_creation_scripts/transport_transects/transport_sections.m b/feature_creation_scripts/transport_transects/transport_sections.m index 2d11d91e..83a6c04c 100644 --- a/feature_creation_scripts/transport_transects/transport_sections.m +++ b/feature_creation_scripts/transport_transects/transport_sections.m @@ -98,7 +98,7 @@ -64.5 -64 -55 -65.3;... % Drake -67 140 -43.5 147 ;... % Tasm-Ant -70.0 30 -31.3 30 ;... % Afri-Ant - 10.7 -63.2 18.0 -65.9;... % Antilles + 10.7 -63.2 18.0 -65.9;... % Antilles 18.4 -67.2 18.4 -68.5;... % Mona Passage 19.8 -73.4 20.1 -74.3;... % Windward Passage 23.1 -81.0 25.15 -81.0;... % Florida-Cuba @@ -111,7 +111,7 @@ % 73.7 -80.6 74.6 -81.0;... % Lancaster Sound- was not able to % get this to connect for all resolutions % 79.7 10.7 79.7 -17.7;... % Fram St - crosses 0 lon. This is not in code yet. -% 81.0 -63.5 82.0 -63.5;... % Robeson Ch - was not able to get this to connect +% 81.0 -63.5 82.0 -63.5;... % Robeson Ch - was not able to get this to connect %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -122,7 +122,7 @@ % var_name(nVars) a cell array with text for each variable to % load or compute. % var_conv_factor multiply each variable by this unit conversion. -% var_lims(nVars,3) contour line definition: min, max, interval +% var_lims(nVars,3) contour line definition: min, max, interval % Eulerian velocity from prognostic momentum equation var_name = {'avgNormalVelocity'}; @@ -169,7 +169,7 @@ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if find_edge_sections_flag + if find_edge_sections_flag [sim(iSim).sectionEdgeIndex, sim(iSim).sectionEdgeSign, sim(iSim).nEdgesInSection, ... sim(iSim).latSectionVertex,sim(iSim).lonSectionVertex, ... sim(iSim).latVertexDeg,sim(iSim).lonVertexDeg] ... @@ -183,14 +183,14 @@ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - if write_edge_sections_text_flag + if write_edge_sections_text_flag write_edge_sections_text... (sim(iSim).dir, sim(iSim).sectionEdgeIndex, ... sim(iSim).sectionEdgeSign, sim(iSim).nEdgesInSection, ... sectionText,sectionAbbreviation,sectionCoord) end - - if write_edge_sections_netcdf_flag + + if write_edge_sections_netcdf_flag write_edge_sections_netcdf... (sim(iSim).dir, sim(iSim).sectionEdgeIndex, ... sim(iSim).sectionEdgeSign, sim(iSim).nEdgesInSection, ... @@ -222,7 +222,7 @@ (wd,sim(iSim).dir,sim(iSim).netcdf_file, var_name,var_conv_factor, ... sim(iSim).sectionEdgeIndex, sim(iSim).nEdgesInSection); end - + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Compute transport through each section @@ -234,17 +234,17 @@ (wd,sim(iSim).dir,sim(iSim).netcdf_file, ... sim(iSim).sectionEdgeIndex, sim(iSim).sectionEdgeSign, sim(iSim).nEdgesInSection, ... sim(iSim).sectionData,sectionText,sectionAbbreviation); - + if iSim==1 tr_total = sim(iSim).tr_total'; else tr_total = [tr_total; sim(iSim).tr_total']; end - + end fclose(fid_latex); - + end % iSim % tr_total diff --git a/geometric_features/geometric_features.py b/geometric_features/geometric_features.py index 6cec0e8f..c6020b9a 100644 --- a/geometric_features/geometric_features.py +++ b/geometric_features/geometric_features.py @@ -80,7 +80,7 @@ def read(self, componentName, objectType, featureNames=None, tags=None, Parameters ---------- - componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', + componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', 'natural_earth', 'ocean','seaice'} The component from which to retrieve the geometric features @@ -174,7 +174,7 @@ def _download_geometric_features(self, componentName, objectType, Parameters ---------- - componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', + componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', 'natural_earth', 'ocean','seaice'} The component from which to retrieve the geometric features @@ -225,7 +225,7 @@ def _get_feature_names(self, componentName, objectType, featureNames, Parameters ---------- - componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', + componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', 'natural_earth', 'ocean','seaice'} The component from which to retrieve the geometric features @@ -301,7 +301,7 @@ def _get_file_name(componentName, objectType, featureName): Parameters ---------- - componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', + componentName : {'bedmachine', 'bedmap2', 'iceshelves', 'landice', 'natural_earth', 'ocean','seaice'} The component from which to retrieve the geometric features diff --git a/geometric_features/test/test_aggregation.py b/geometric_features/test/test_aggregation.py index 1e0fd8b6..9d955b7e 100644 --- a/geometric_features/test/test_aggregation.py +++ b/geometric_features/test/test_aggregation.py @@ -12,7 +12,7 @@ class TestAggregation(TestCase): def test_get_aggregator_by_name(self): gf = GeometricFeatures() names = ['Antarctic Regions', 'Arctic Ocean Regions', 'ISMIP6 Greenland Regions', - 'NASA Greenland Regions', 'Arctic Sea Ice Regions', 'Ocean Basins', + 'NASA Greenland Regions', 'Arctic Sea Ice Regions', 'Ocean Basins', 'Ice Shelves', 'Ocean Subbasins', 'ISMIP6 Regions', 'MOC Basins', 'Historical Sea Ice', 'Transport Transects', 'Arctic Transport Transects'] @@ -63,7 +63,7 @@ def test_arctic_transport(self): def test_qgreenland(self): gf = GeometricFeatures() qgreenland_seaice(gf) - + def test_nasa_greenland(self): gf = GeometricFeatures() nasa_greenland(gf) From 39a411aef159d58fd400a26e17c8fce85f691bea Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Mon, 16 Dec 2024 10:38:37 -0800 Subject: [PATCH 05/12] Fix newlines at end of files --- contributors/CONTRIBUTORS_HEADER | 1 - examples/README.md | 2 +- .../extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py | 2 -- .../extract_bedmap2_ice_coverage.py | 1 - feature_creation_scripts/iceshelves/README.md | 2 +- feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py | 2 -- feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py | 2 +- feature_creation_scripts/iceshelves/plot_streamline.py | 1 - feature_creation_scripts/iceshelves/polar.py | 2 +- feature_creation_scripts/iceshelves/write_basin_distances.py | 3 --- feature_creation_scripts/iceshelves/write_iceshelf_distance.py | 1 - geometric_features/test/__init__.py | 2 -- 12 files changed, 4 insertions(+), 17 deletions(-) diff --git a/contributors/CONTRIBUTORS_HEADER b/contributors/CONTRIBUTORS_HEADER index ba383df0..eee5a032 100644 --- a/contributors/CONTRIBUTORS_HEADER +++ b/contributors/CONTRIBUTORS_HEADER @@ -2,4 +2,3 @@ Data sources and authors of the regions may be updated from the repository via this [script](list_contributors.py): - diff --git a/examples/README.md b/examples/README.md index 1adf2230..b5c739ec 100644 --- a/examples/README.md +++ b/examples/README.md @@ -3,4 +3,4 @@ python package to perform various operations on the ``geometric_data`` contained in this repository. To use these scripts, you should either install the ``geometric_features`` conda package (see README.md in the root of the repo) or copy the scripts into the root directory. Each script -includes detailed comments that should help you adapt them to your own needs. \ No newline at end of file +includes detailed comments that should help you adapt them to your own needs. diff --git a/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py b/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py index 297ac7f2..0046c25d 100644 --- a/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py +++ b/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py @@ -113,5 +113,3 @@ def makeBedmap2LonLat(): ncfile.close() - - diff --git a/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py b/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py index dbec642d..47dfbdb8 100644 --- a/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py +++ b/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py @@ -153,4 +153,3 @@ def add_antemeridian(inIndex, outIndex): out_file_name = "AntarcticIceCoverage.geojson" write_all_features(features_file, out_file_name, indend=4) - diff --git a/feature_creation_scripts/iceshelves/README.md b/feature_creation_scripts/iceshelves/README.md index f600db61..f7a89aa6 100644 --- a/feature_creation_scripts/iceshelves/README.md +++ b/feature_creation_scripts/iceshelves/README.md @@ -15,4 +15,4 @@ conda install numpy scipy netcdf4 matplotlib progressbar scikit-fmm basemap \ scikit-image shapely descartes cartopy ln -s feature_creation_scripts/iceshelves/driver.bash ./driver.bash -``` \ No newline at end of file +``` diff --git a/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py b/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py index a1088334..8b1ed19d 100755 --- a/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py +++ b/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py @@ -112,5 +112,3 @@ def makeBedmap2LonLat(): ncfile.close() - - diff --git a/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py b/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py index 3293950b..fb98ada2 100755 --- a/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py +++ b/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py @@ -84,4 +84,4 @@ #plt.imshow(Mask,extent=extent,interpolation='nearest') #plt.colorbar() #plt.gca().invert_yaxis() -#plt.show() \ No newline at end of file +#plt.show() diff --git a/feature_creation_scripts/iceshelves/plot_streamline.py b/feature_creation_scripts/iceshelves/plot_streamline.py index 3cb1016f..6d2b0087 100755 --- a/feature_creation_scripts/iceshelves/plot_streamline.py +++ b/feature_creation_scripts/iceshelves/plot_streamline.py @@ -97,4 +97,3 @@ def interpVel(p,t): fig.canvas.draw() plt.savefig('streamlines.png',dpi=my_dpi) plt.close() - diff --git a/feature_creation_scripts/iceshelves/polar.py b/feature_creation_scripts/iceshelves/polar.py index efef8b16..5a7cfdbb 100644 --- a/feature_creation_scripts/iceshelves/polar.py +++ b/feature_creation_scripts/iceshelves/polar.py @@ -48,4 +48,4 @@ def fromPolar(points): points[:,0] = Lons points[:,1] = Lats - return points \ No newline at end of file + return points diff --git a/feature_creation_scripts/iceshelves/write_basin_distances.py b/feature_creation_scripts/iceshelves/write_basin_distances.py index 3a7147f4..f3b6fef9 100755 --- a/feature_creation_scripts/iceshelves/write_basin_distances.py +++ b/feature_creation_scripts/iceshelves/write_basin_distances.py @@ -81,6 +81,3 @@ def readBasinImage(name): var[basinIndex,:,:] = distance outFile.close() - - - diff --git a/feature_creation_scripts/iceshelves/write_iceshelf_distance.py b/feature_creation_scripts/iceshelves/write_iceshelf_distance.py index d0b65055..1a576dfc 100755 --- a/feature_creation_scripts/iceshelves/write_iceshelf_distance.py +++ b/feature_creation_scripts/iceshelves/write_iceshelf_distance.py @@ -70,4 +70,3 @@ var[:,:] = Y outFile.close() - diff --git a/geometric_features/test/__init__.py b/geometric_features/test/__init__.py index 878e4f9c..4cd11f75 100644 --- a/geometric_features/test/__init__.py +++ b/geometric_features/test/__init__.py @@ -81,5 +81,3 @@ def assertWarns(self, message): yield assert len(w) > 0 assert all(message in str(wi.message) for wi in w) - - From 3085de60cb4f9e585ee4663bcf9c2b563a4d3f3a Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Mon, 16 Dec 2024 10:39:48 -0800 Subject: [PATCH 06/12] Flynt replace format strings --- contributors/list_contributors.py | 3 +- examples/setup_extended_antarctic_basins.py | 4 +-- examples/setup_ice_shelves.py | 4 +-- examples/setup_ocean_region_groups.py | 15 ++++----- .../antarctic_ocean_regions.py | 6 ++-- .../arctic_ocean_regions_partI.py | 10 +++--- .../arctic_ocean_regions_partII.py | 10 +++--- .../extract_bedmachine_coastlines.py | 6 ++-- .../extract_bedmap2_ice_coverage.py | 4 +-- .../ismip6_antarctic_ocean_regions.py | 6 ++-- geometric_features/__main__.py | 32 +++++++------------ .../aggregation/ocean/ice_shelf_regions.py | 4 +-- .../aggregation/ocean/moc_basins.py | 6 ++-- .../aggregation/ocean/ocean_basins.py | 2 +- geometric_features/download.py | 23 +++++++------ geometric_features/feature_collection.py | 11 +++---- geometric_features/geometric_features.py | 10 +++--- geometric_features/plot.py | 3 +- .../test/test_feature_collection.py | 2 +- geometric_features/utils.py | 2 +- 20 files changed, 72 insertions(+), 91 deletions(-) diff --git a/contributors/list_contributors.py b/contributors/list_contributors.py index d9467cd4..0bd72ac8 100755 --- a/contributors/list_contributors.py +++ b/contributors/list_contributors.py @@ -37,8 +37,7 @@ def build_contrib_file(): shutil.copyfile(contribdir + '/CONTRIBUTORS_HEADER', contribfile) append_to_file( - 'List populated on {}:'.format( - datetime.datetime.now().strftime("%Y-%m-%d %H:%M")), + f"List populated on {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}:", contribfile) append_to_file('\n', contribfile) diff --git a/examples/setup_extended_antarctic_basins.py b/examples/setup_extended_antarctic_basins.py index a043d7a0..e19c97e7 100755 --- a/examples/setup_extended_antarctic_basins.py +++ b/examples/setup_extended_antarctic_basins.py @@ -23,8 +23,8 @@ # 27 IMBIE basin tags tags fc = FeatureCollection() for basin in range(1, 28): - print('Adding feature from IMBIE basin {:d}'.format(basin)) - basinName = 'Antarctica_IMBIE{:d}'.format(basin) + print(f'Adding feature from IMBIE basin {basin:d}') + basinName = f'Antarctica_IMBIE{basin:d}' tags = [basinName] # load the iceshelf regions for one IMBIE basin fcBasin = gf.read(componentName='iceshelves', objectType='region', diff --git a/examples/setup_ice_shelves.py b/examples/setup_ice_shelves.py index 1ec09b33..e52de1d2 100755 --- a/examples/setup_ice_shelves.py +++ b/examples/setup_ice_shelves.py @@ -125,8 +125,8 @@ nIMBIEBasins = 27 for basinNumber in range(1, nIMBIEBasins+1): - basinName = 'Antarctica_IMBIE{}'.format(basinNumber) - combinedIceShelves['IMBIE{}'.format(basinNumber)] = [basinName] + basinName = f'Antarctica_IMBIE{basinNumber}' + combinedIceShelves[f'IMBIE{basinNumber}'] = [basinName] # create a GeometricFeatures object that points to a local cache of geometric # data and knows which branch of geometric_feature to use to download diff --git a/examples/setup_ocean_region_groups.py b/examples/setup_ocean_region_groups.py index 50d18f37..7195dbbf 100755 --- a/examples/setup_ocean_region_groups.py +++ b/examples/setup_ocean_region_groups.py @@ -50,7 +50,7 @@ def build_ocean_basins(gf, plot): for oceanName in ['Atlantic', 'Pacific', 'Indian', 'Arctic', 'Southern_Ocean', 'Mediterranean']: - basinName = '{}_Basin'.format(oceanName) + basinName = f'{oceanName}_Basin' print(oceanName) print(' * merging features') @@ -111,19 +111,19 @@ def build_MOC_basins(gf): # build MOC basins from regions with the appropriate tags for basinName in MOCSubBasins: - print('{} MOC'.format(basinName)) + print(f'{basinName} MOC') print(' * merging features') - tags = ['{}_Basin'.format(basin) for basin in MOCSubBasins[basinName]] + tags = [f'{basin}_Basin' for basin in MOCSubBasins[basinName]] fcBasin = gf.read(componentName='ocean', objectType='region', tags=tags, allTags=False) print(' * combining features') - fcBasin = fcBasin.combine(featureName='{}_MOC'.format(basinName)) + fcBasin = fcBasin.combine(featureName=f'{basinName}_MOC') print(' * masking out features south of MOC region') - maskName = 'MOC mask {}'.format(MOCSouthernBoundary[basinName]) + maskName = f'MOC mask {MOCSouthernBoundary[basinName]}' fcMask = gf.read(componentName='ocean', objectType='region', featureNames=[maskName]) # mask out the region covered by the mask @@ -219,10 +219,9 @@ def remove_small_polygons(fc, minArea): if add: fcOut.add_feature(copy.deepcopy(feature)) else: - print("{} has been removed.".format( - feature['pproperties']['name'])) + print(f"{feature['pproperties']['name']} has been removed.") - print(' * Removed {} small polygons'.format(removedCount)) + print(f' * Removed {removedCount} small polygons') return fcOut diff --git a/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py b/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py index 72741700..00fb6408 100755 --- a/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py +++ b/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py @@ -26,7 +26,7 @@ def bedmap2_bin_to_netcdf(outFileName): allExist = True for field in fields: - fileName = 'bedmap2/bedmap2_bin/bedmap2_{}.flt'.format(field) + fileName = f'bedmap2/bedmap2_bin/bedmap2_{field}.flt' if not os.path.exists(fileName): allExist = False break @@ -76,7 +76,7 @@ def bedmap2_bin_to_netcdf(outFileName): # add Bedmap2 data for fieldName in fields: - fileName = 'bedmap2/bedmap2_bin/bedmap2_{}.flt'.format(fieldName) + fileName = f'bedmap2/bedmap2_bin/bedmap2_{fieldName}.flt' with open(fileName, 'r') as f: field = numpy.fromfile(f, dtype=numpy.float32).reshape(6667, 6667) # flip the y axis @@ -158,7 +158,7 @@ def stereo_to_lon_lat(x, y): fc.add_feature( {"type": "Feature", - "properties": {"name": "Contour {}".format(contourValue), + "properties": {"name": f"Contour {contourValue}", "author": author, "object": 'region', "component": 'ocean'}, diff --git a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py index 0c1c4014..66a8718b 100755 --- a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py +++ b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py @@ -86,7 +86,7 @@ def stereo_to_lon_lat(x, y): fc.add_feature( {"type": "Feature", - "properties": {"name": "Contour {}".format(contourValue), + "properties": {"name": f"Contour {contourValue}", "author": author, "object": 'region', "component": 'ocean'}, @@ -335,20 +335,20 @@ def main(): for feature in fcArcticTags.features: featureName = feature['properties']['name'] shape = shapely.geometry.shape(feature['geometry']) - print('{} is_valid: {}'.format(featureName, shape.is_valid)) + print(f'{featureName} is_valid: {shape.is_valid}') if not shape.is_valid: fixed = shape.buffer(0) - print(' Fixed? {}'.format(fixed.is_valid)) + print(f' Fixed? {fixed.is_valid}') feature['geometry'] = shapely.geometry.mapping(fixed) fcArcticNSIDCTags = gf.read(componentName='ocean', objectType='region', tags=['Arctic_NSIDC']) for feature in fcArcticNSIDCTags.features: featureName = feature['properties']['name'] shape = shapely.geometry.shape(feature['geometry']) - print('{} is_valid: {}'.format(featureName, shape.is_valid)) + print(f'{featureName} is_valid: {shape.is_valid}') if not shape.is_valid: fixed = shape.buffer(0) - print(' Fixed? {}'.format(fixed.is_valid)) + print(f' Fixed? {fixed.is_valid}') feature['geometry'] = shapely.geometry.mapping(fixed) fcArctic = fcArcticTags diff --git a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py index 778f5487..ab66a25e 100755 --- a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py +++ b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py @@ -86,7 +86,7 @@ def stereo_to_lon_lat(x, y): fc.add_feature( {"type": "Feature", - "properties": {"name": "Contour {}".format(contourValue), + "properties": {"name": f"Contour {contourValue}", "author": author, "object": 'region', "component": 'ocean'}, @@ -452,10 +452,10 @@ def main(): for feature in fcArcticTags.features: featureName = feature['properties']['name'] shape = shapely.geometry.shape(feature['geometry']) - print('{} is_valid: {}'.format(featureName, shape.is_valid)) + print(f'{featureName} is_valid: {shape.is_valid}') if not shape.is_valid: fixed = shape.buffer(0) - print(' Fixed? {}'.format(fixed.is_valid)) + print(f' Fixed? {fixed.is_valid}') feature['geometry'] = shapely.geometry.mapping(fixed) fcArcticTags.plot(projection='northpole') fcArcticTags.to_geojson('arctic_ocean_regions.geojson') @@ -465,10 +465,10 @@ def main(): for feature in fcArcticNSIDCTags.features: featureName = feature['properties']['name'] shape = shapely.geometry.shape(feature['geometry']) - print('{} is_valid: {}'.format(featureName, shape.is_valid)) + print(f'{featureName} is_valid: {shape.is_valid}') if not shape.is_valid: fixed = shape.buffer(0) - print(' Fixed? {}'.format(fixed.is_valid)) + print(f' Fixed? {fixed.is_valid}') feature['geometry'] = shapely.geometry.mapping(fixed) fcArcticNSIDCTags.plot(projection='northpole') fcArcticNSIDCTags.to_geojson('arcticNSIDC_ocean_regions.geojson') diff --git a/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py b/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py index e34fb10e..6d654c71 100755 --- a/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py +++ b/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py @@ -96,13 +96,13 @@ def add_antemeridian(iIn, iOut): distance = skfmm.distance(floatMask) print(name, 'distance', numpy.amin(distance), numpy.amax(distance)) - plt.imsave('%s_distance.png' % name, distance, vmin=-1., vmax=1., + plt.imsave(f'{name}_distance.png', distance, vmin=-1., vmax=1., origin='lower') # smooth it a little distance = gaussian_filter(distance, sigma=0.5) print(name, 'distance smoothed', numpy.amin(distance), numpy.amax(distance)) - plt.imsave('%s_distance_smoothed.png' % name, distance, vmin=-1., + plt.imsave(f'{name}_distance_smoothed.png', distance, vmin=-1., vmax=1., origin='lower') # extract contours and interpolate following @@ -136,7 +136,7 @@ def add_antemeridian(iIn, iOut): if poly.is_valid: polys.append(poly) else: - print("invalid shape with {} vertices".format(contour.shape[0])) + print(f"invalid shape with {contour.shape[0]} vertices") return mapping(unary_union(polys)) diff --git a/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py b/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py index 47dfbdb8..be2d04e7 100644 --- a/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py +++ b/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py @@ -73,12 +73,12 @@ def add_antemeridian(inIndex, outIndex): distance = skfmm.distance(floatMask) print(name, 'distance', numpy.amin(distance), numpy.amax(distance)) - pyplot.imsave('%s_distance.png'%name, distance, vmin=-1., vmax=1.,origin='lower') + pyplot.imsave(f'{name}_distance.png', distance, vmin=-1., vmax=1.,origin='lower') # smooth it a little distance = gaussian_filter(distance, sigma = 0.5) print(name, 'distance smoothed', numpy.amin(distance), numpy.amax(distance)) - pyplot.imsave('%s_distance_smoothed.png'%name, distance, vmin=-1., vmax=1., origin='lower') + pyplot.imsave(f'{name}_distance_smoothed.png', distance, vmin=-1., vmax=1., origin='lower') contourObj = cntr.Cntr(X,Y,distance) diff --git a/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py b/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py index 08609d70..cc226fc0 100755 --- a/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py +++ b/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py @@ -27,7 +27,7 @@ def bedmap2_bin_to_netcdf(outFileName): allExist = True for field in fields: - fileName = 'bedmap2/bedmap2_bin/bedmap2_{}.flt'.format(field) + fileName = f'bedmap2/bedmap2_bin/bedmap2_{field}.flt' if not os.path.exists(fileName): allExist = False break @@ -77,7 +77,7 @@ def bedmap2_bin_to_netcdf(outFileName): # add Bedmap2 data for fieldName in fields: - fileName = 'bedmap2/bedmap2_bin/bedmap2_{}.flt'.format(fieldName) + fileName = f'bedmap2/bedmap2_bin/bedmap2_{fieldName}.flt' with open(fileName, 'r') as f: field = numpy.fromfile(f, dtype=numpy.float32).reshape(6667, 6667) # flip the y axis @@ -150,7 +150,7 @@ def stereo_to_lon_lat(x, y): fc.add_feature( {"type": "Feature", - "properties": {"name": "Contour {}".format(contourValue), + "properties": {"name": f"Contour {contourValue}", "author": author, "object": 'region', "component": 'ocean'}, diff --git a/geometric_features/__main__.py b/geometric_features/__main__.py index faa06f10..e5caf911 100644 --- a/geometric_features/__main__.py +++ b/geometric_features/__main__.py @@ -27,8 +27,7 @@ def combine_features(): metavar="PATH", default="features.geojson") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -57,8 +56,7 @@ def difference_features(): metavar="PATH", default="features.geojson") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -83,8 +81,7 @@ def fix_features_at_antimeridian(): metavar="PATH", default="features.geojson") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -126,8 +123,7 @@ def merge_features(): metavar="PATH") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -172,8 +168,7 @@ def plot_features(): " (0.0 indicates skip subdivision)") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -187,7 +182,7 @@ def plot_features(): mapTypes = args.map_type.split(',') for mapType in mapTypes: - print('plot type: {}'.format(mapType)) + print(f'plot type: {mapType}') if mapType in ['cyl', 'merc', 'mill', 'mill2', 'moll', 'moll2', 'robin', 'robin2']: figsize = (12, 6) @@ -195,8 +190,7 @@ def plot_features(): figsize = (12, 9) fig = fc.plot(mapType, args.max_length, figsize) - plotFileName = '{}_{}.png'.format( - os.path.splitext(args.feature_file)[0], mapType) + plotFileName = f'{os.path.splitext(args.feature_file)[0]}_{mapType}.png' fig.savefig(plotFileName) @@ -216,8 +210,7 @@ def set_group_name(): required=True) parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -246,8 +239,7 @@ def simplify_features(): metavar="PATH", default="features.geojson") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -272,8 +264,7 @@ def split_features(): metavar="PATH", default="./geometric_data") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() @@ -302,8 +293,7 @@ def tag_features(): metavar="PATH", default="features.geojson") parser.add_argument('-v', '--version', action='version', - version='geometric_features {}'.format( - geometric_features.__version__), + version=f'geometric_features {geometric_features.__version__}', help="Show version number and exit") args = parser.parse_args() diff --git a/geometric_features/aggregation/ocean/ice_shelf_regions.py b/geometric_features/aggregation/ocean/ice_shelf_regions.py index a62c8bcb..b97f5615 100644 --- a/geometric_features/aggregation/ocean/ice_shelf_regions.py +++ b/geometric_features/aggregation/ocean/ice_shelf_regions.py @@ -131,8 +131,8 @@ def ice_shelves(gf): nIMBIEBasins = 27 for basinNumber in range(1, nIMBIEBasins + 1): - basinName = 'Antarctica_IMBIE{}'.format(basinNumber) - combinedIceShelves['IMBIE{}'.format(basinNumber)] = [basinName] + basinName = f'Antarctica_IMBIE{basinNumber}' + combinedIceShelves[f'IMBIE{basinNumber}'] = [basinName] # create a FeatureCollection containing all ice shelves and combined # ice-shelf regions diff --git a/geometric_features/aggregation/ocean/moc_basins.py b/geometric_features/aggregation/ocean/moc_basins.py index 241dd26f..9f2520c9 100644 --- a/geometric_features/aggregation/ocean/moc_basins.py +++ b/geometric_features/aggregation/ocean/moc_basins.py @@ -41,15 +41,15 @@ def moc(gf): # build MOC basins from regions with the appropriate tags for basinName in MOCSubBasins: - tags = ['{}_Basin'.format(basin) for basin in + tags = [f'{basin}_Basin' for basin in MOCSubBasins[basinName]] fcBasin = gf.read(componentName='ocean', objectType='region', tags=tags, allTags=False) - fcBasin = fcBasin.combine(featureName='{}_MOC'.format(basinName)) + fcBasin = fcBasin.combine(featureName=f'{basinName}_MOC') - maskName = 'MOC mask {}'.format(MOCSouthernBoundary[basinName]) + maskName = f'MOC mask {MOCSouthernBoundary[basinName]}' fcMask = gf.read(componentName='ocean', objectType='region', featureNames=[maskName]) # mask out the region covered by the mask diff --git a/geometric_features/aggregation/ocean/ocean_basins.py b/geometric_features/aggregation/ocean/ocean_basins.py index 46b22a3e..86e833ba 100644 --- a/geometric_features/aggregation/ocean/ocean_basins.py +++ b/geometric_features/aggregation/ocean/ocean_basins.py @@ -27,7 +27,7 @@ def basins(gf): for oceanName in ['Atlantic', 'Pacific', 'Indian', 'Arctic', 'Southern_Ocean', 'Mediterranean']: - basinName = '{}_Basin'.format(oceanName) + basinName = f'{oceanName}_Basin' print(oceanName) print(' * merging features') diff --git a/geometric_features/download.py b/geometric_features/download.py index ca77d303..d0e1e2a3 100644 --- a/geometric_features/download.py +++ b/geometric_features/download.py @@ -15,9 +15,9 @@ def sizeof_fmt(num, suffix='B'): """ for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']: if abs(num) < 1024.0: - return "%3.1f%s%s" % (num, unit, suffix) + return f"{num:3.1f}{unit}{suffix}" num /= 1024.0 - return "%.1f%s%s" % (num, 'Yi', suffix) + return f"{num:.1f}Yi{suffix}" def download_files(fileList, urlBase, outDir): @@ -39,20 +39,20 @@ def download_files(fileList, urlBase, outDir): except OSError: pass - url = '{}/{}'.format(urlBase, pathname2url(fileName)) + url = f'{urlBase}/{pathname2url(fileName)}' try: response = requests.get(url, stream=True) encoding = response.headers.get('content-encoding') totalSize = response.headers.get('content-length') except requests.exceptions.RequestException: - print(' {} could not be reached!'.format(fileName)) + print(f' {fileName} could not be reached!') continue try: response.raise_for_status() except requests.exceptions.HTTPError as e: - print('ERROR while downloading {}:'.format(fileName)) + print(f'ERROR while downloading {fileName}:') print(e) continue @@ -60,13 +60,13 @@ def download_files(fileList, urlBase, outDir): # no content length header, or not related unzipped size if not os.path.exists(outFileName): with open(outFileName, 'wb') as f: - print('Downloading {}...'.format(fileName)) + print(f'Downloading {fileName}...') try: f.write(response.content) except requests.exceptions.RequestException: - print(' {} failed!'.format(fileName)) + print(f' {fileName} failed!') else: - print(' {} done.'.format(fileName)) + print(f' {fileName} done.') else: # we can do the download in chunks and use a progress bar, yay! @@ -76,8 +76,7 @@ def download_files(fileList, urlBase, outDir): # we already have the file, so just continue continue - print('Downloading {} ({})...'.format(fileName, - sizeof_fmt(totalSize))) + print(f'Downloading {fileName} ({sizeof_fmt(totalSize)})...') widgets = [progressbar.Percentage(), ' ', progressbar.Bar(), ' ', progressbar.ETA()] bar = progressbar.ProgressBar(widgets=widgets, @@ -91,6 +90,6 @@ def download_files(fileList, urlBase, outDir): bar.update(size) bar.finish() except requests.exceptions.RequestException: - print(' {} failed!'.format(fileName)) + print(f' {fileName} failed!') else: - print(' {} done.'.format(fileName)) + print(f' {fileName} done.') diff --git a/geometric_features/feature_collection.py b/geometric_features/feature_collection.py index d00364d0..3512d44c 100644 --- a/geometric_features/feature_collection.py +++ b/geometric_features/feature_collection.py @@ -281,7 +281,7 @@ def difference(self, maskingFC, show_progress=False): for featureIndex, feature in enumerate(self.features): name = feature['properties']['name'] if show_progress: - widgets[0] = '{}: '.format(name) + widgets[0] = f'{name}: ' featureShape = shapely.geometry.shape(feature['geometry']) add = True masked = False @@ -612,12 +612,10 @@ def _validate_feature(feature): name = 'unknown' for outerKey in required: if outerKey not in feature: - raise KeyError('Feature {} missing [{}] key'.format( - name, outerKey)) + raise KeyError(f'Feature {name} missing [{outerKey}] key') for innerKey in required[outerKey]: if innerKey not in feature[outerKey]: - raise KeyError('Feature {} missing [{}][{}] key'.format( - name, outerKey, innerKey)) + raise KeyError(f'Feature {name} missing [{outerKey}][{innerKey}] key') geomType = feature['geometry']['type'] objectType = feature['properties']['object'] @@ -749,5 +747,4 @@ def _round_coords(coordinates, digits=6): elif isinstance(coordinates, tuple): return tuple([_round_coords(c, digits) for c in coordinates]) else: - raise TypeError('Unexpected type for coordinates {}'.format( - coordinates)) + raise TypeError(f'Unexpected type for coordinates {coordinates}') diff --git a/geometric_features/geometric_features.py b/geometric_features/geometric_features.py index c6020b9a..04516bae 100644 --- a/geometric_features/geometric_features.py +++ b/geometric_features/geometric_features.py @@ -260,13 +260,12 @@ def _get_feature_names(self, componentName, objectType, featureNames, # Xylar Asay-Davis if componentName not in self.allFeaturesAndTags: - raise KeyError('invalid component {}'.format(componentName)) + raise KeyError(f'invalid component {componentName}') component = self.allFeaturesAndTags[componentName] if objectType not in component: - raise KeyError('invalid object {} in component {}'.format( - objectType, componentName)) + raise KeyError(f'invalid object {objectType} in component {componentName}') availableFeaturesAndTags = component[objectType] @@ -278,8 +277,7 @@ def _get_feature_names(self, componentName, objectType, featureNames, if featureNames is not None: for featureName in featureNames: if featureName not in availableFeaturesAndTags: - raise KeyError('invalid feature {}'.format( - featureName)) + raise KeyError(f'invalid feature {featureName}') outFeatureNames.append(featureName) if tags is not None: @@ -326,6 +324,6 @@ def _get_file_name(componentName, objectType, featureName): for char in badCharacters: featureDir = featureDir.replace(char, '') fileName = os.path.join(componentName, objectType, featureDir, - '{}.geojson'.format(objectType)) + f'{objectType}.geojson') return fileName diff --git a/geometric_features/plot.py b/geometric_features/plot.py index 0ac73266..0aa14e9e 100644 --- a/geometric_features/plot.py +++ b/geometric_features/plot.py @@ -129,8 +129,7 @@ def subdivide_line_string(lineString, periodic=False): elif geomtype == 'Point': newGeometry = geometry else: - print("Warning: subdividing geometry type {} is not supported.".format( - geomtype)) + print(f"Warning: subdividing geometry type {geomtype} is not supported.") newGeometry = geometry return newGeometry diff --git a/geometric_features/test/test_feature_collection.py b/geometric_features/test/test_feature_collection.py index 1a760b60..da3aa8ed 100644 --- a/geometric_features/test/test_feature_collection.py +++ b/geometric_features/test/test_feature_collection.py @@ -169,7 +169,7 @@ def verify_groupName(destfile, groupName): with open(destfile) as f: filevals = json.load(f) assert 'groupName' in filevals, \ - 'groupName does not exist in {}'.format(destfile) + f'groupName does not exist in {destfile}' assert filevals['groupName'] == groupName, \ 'Incorrect groupName of {} specified instead of ' \ '{}.'.format(filevals['groupName'], groupName) diff --git a/geometric_features/utils.py b/geometric_features/utils.py index 08a84aa8..48a8e0d6 100644 --- a/geometric_features/utils.py +++ b/geometric_features/utils.py @@ -28,7 +28,7 @@ def write_feature_names_and_tags(cacheLocation='./geometry_data', quiet=False): # ------- # Xylar Asay-Davis outFileName = 'features_and_tags.json' - fileNames = sorted(glob.glob('{}/*/*/*/*.geojson'.format(cacheLocation))) + fileNames = sorted(glob.glob(f'{cacheLocation}/*/*/*/*.geojson')) allFeaturesAndTags = OrderedDict() for fileName in fileNames: From 0f60bb518240cab6b67bf7fafcf6f2cbae5ee676 Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Thu, 19 Dec 2024 12:39:43 -0800 Subject: [PATCH 07/12] Minor bugfix in docs workflow --- .github/workflows/docs_workflow.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs_workflow.yml b/.github/workflows/docs_workflow.yml index 9b795a6c..9b8e271c 100644 --- a/.github/workflows/docs_workflow.yml +++ b/.github/workflows/docs_workflow.yml @@ -8,6 +8,9 @@ on: release: types: [published] +env: + PYTHON_VERSION: "3.10" + jobs: publish-docs: runs-on: ubuntu-latest @@ -40,14 +43,14 @@ jobs: channels: conda-forge channel-priority: strict auto-update-conda: true - python-version: ${{ matrix.python-version }} + python-version: ${{ env.PYTHON_VERSION }} - if: ${{ steps.skip_check.outputs.should_skip != 'true' }} name: Install geometric_features run: | git config --global url."https://github.com/".insteadOf "git@github.com:" conda create -n geometric_features_dev --file dev-spec.txt \ - python=${{ matrix.python-version }} + python=${{ env.PYTHON_VERSION }} conda activate geometric_features_dev python -m pip install -vv --no-deps --no-build-isolation -e . From 7e4d714d9d6336b568e3980b2ce6a46bf30c1681 Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Thu, 19 Dec 2024 12:44:26 -0800 Subject: [PATCH 08/12] Add pre-commit to build CI workflow --- .github/workflows/build_workflow.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/build_workflow.yml b/.github/workflows/build_workflow.yml index 9316f259..f6ecd051 100644 --- a/.github/workflows/build_workflow.yml +++ b/.github/workflows/build_workflow.yml @@ -16,6 +16,34 @@ env: PATHS_IGNORE: '["**/README.md", "**/docs/**"]' jobs: + pre-commit-hooks: + name: lint with pre-commit + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - id: skip_check + uses: fkirc/skip-duplicate-actions@master + with: + cancel_others: ${{ env.CANCEL_OTHERS }} + paths_ignore: ${{ env.PATHS_IGNORE }} + + - if: ${{ steps.skip_check.outputs.should_skip != 'true' }} + name: Checkout Code Repository + uses: actions/checkout@v4 + + - if: ${{ steps.skip_check.outputs.should_skip != 'true' }} + name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - if: ${{ steps.skip_check.outputs.should_skip != 'true' }} + # Run all pre-commit hooks on all the files. + # Getting only staged files can be tricky in case a new PR is opened + # since the action is run on a branch in detached head state + name: Install and Run Pre-commit + uses: pre-commit/action@v3.0.1 + build: name: test geometric_features - python ${{ matrix.python-version }} runs-on: ubuntu-latest From 996fd5240d08718e9d1ca7a283046f03d4012673 Mon Sep 17 00:00:00 2001 From: Althea Denlinger Date: Fri, 20 Dec 2024 12:06:33 -0800 Subject: [PATCH 09/12] Isort reorder imports --- contributors/list_contributors.py | 6 ++-- examples/setup_antarctic_basins.py | 8 +++--- examples/setup_extended_antarctic_basins.py | 8 +++--- examples/setup_ice_shelves.py | 8 +++--- examples/setup_ocean_critical_passages.py | 4 +-- examples/setup_ocean_land_coverage.py | 8 +++--- examples/setup_ocean_region_groups.py | 9 +++--- ...setup_ocean_standard_transport_sections.py | 5 ++-- .../antarctic_ocean_regions.py | 16 +++++------ .../arctic_ocean_regions_partI.py | 16 +++++------ .../arctic_ocean_regions_partII.py | 16 +++++------ .../extract_bedmachine_coastlines.py | 20 ++++++------- .../bedamp2_to_netcdf.py | 7 +++-- .../extract_bedmap2_ice_coverage.py | 16 ++++------- .../iceshelves/bedmap2_to_netcdf.py | 4 +-- .../iceshelves/ice_vel_to_bedmap2.py | 6 ++-- .../iceshelves/plot_streamline.py | 8 ++---- feature_creation_scripts/iceshelves/polar.py | 1 + .../iceshelves/write_basin_distances.py | 10 +++---- .../iceshelves/write_basin_images.py | 10 +++---- .../iceshelves/write_basin_numbers.py | 3 +- .../iceshelves/write_expanded_overlaps.py | 7 +++-- .../iceshelves/write_iceshelf_distance.py | 6 ++-- .../iceshelves/write_iceshelf_features.py | 28 ++++++++----------- .../iceshelves/write_iceshelf_numbers.py | 14 ++++------ .../ismip6_antarctic_ocean_regions.py | 18 ++++++------ .../basin_masks_to_geojson_regions.py | 12 ++++---- .../transport_transects/OSNAPsections.py | 5 ++-- .../flipOSNAP_renameArcticTransectsTag.py | 3 +- geometric_features/__main__.py | 9 +++--- geometric_features/aggregation/__init__.py | 13 ++++++--- .../aggregation/landice/__init__.py | 3 +- .../aggregation/ocean/__init__.py | 14 ++++++---- .../aggregation/ocean/moc_basins.py | 3 +- geometric_features/download.py | 10 +++---- geometric_features/feature_collection.py | 17 +++++------ geometric_features/geometric_features.py | 11 +++----- geometric_features/plot.py | 8 +++--- geometric_features/test/__init__.py | 4 +-- geometric_features/test/test_aggregation.py | 13 ++++++--- .../test/test_feature_collection.py | 7 +++-- .../test/test_geometric_features.py | 3 +- geometric_features/utils.py | 10 +++---- setup.py | 3 +- 44 files changed, 202 insertions(+), 208 deletions(-) diff --git a/contributors/list_contributors.py b/contributors/list_contributors.py index 0bd72ac8..22642371 100755 --- a/contributors/list_contributors.py +++ b/contributors/list_contributors.py @@ -7,11 +7,11 @@ 02/23/2019 """ -import os -import subprocess -import shutil import datetime +import os import re +import shutil +import subprocess def append_to_file(aline, afile): diff --git a/examples/setup_antarctic_basins.py b/examples/setup_antarctic_basins.py index 4ece173d..391239f1 100755 --- a/examples/setup_antarctic_basins.py +++ b/examples/setup_antarctic_basins.py @@ -4,13 +4,13 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals - -from geometric_features import GeometricFeatures +from __future__ import (absolute_import, division, print_function, + unicode_literals) import matplotlib.pyplot as plt +from geometric_features import GeometricFeatures + plot = True # create a GeometricFeatures object that points to a local cache of geometric diff --git a/examples/setup_extended_antarctic_basins.py b/examples/setup_extended_antarctic_basins.py index e19c97e7..9a6a30ed 100755 --- a/examples/setup_extended_antarctic_basins.py +++ b/examples/setup_extended_antarctic_basins.py @@ -5,13 +5,13 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals - -from geometric_features import GeometricFeatures, FeatureCollection +from __future__ import (absolute_import, division, print_function, + unicode_literals) import matplotlib.pyplot as plt +from geometric_features import FeatureCollection, GeometricFeatures + plot = True # create a GeometricFeatures object that points to a local cache of geometric diff --git a/examples/setup_ice_shelves.py b/examples/setup_ice_shelves.py index e52de1d2..607a90cf 100755 --- a/examples/setup_ice_shelves.py +++ b/examples/setup_ice_shelves.py @@ -4,13 +4,13 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals - -from geometric_features import GeometricFeatures, FeatureCollection +from __future__ import (absolute_import, division, print_function, + unicode_literals) import matplotlib.pyplot as plt +from geometric_features import FeatureCollection, GeometricFeatures + plot = True iceShelfNames = ['Abbot', diff --git a/examples/setup_ocean_critical_passages.py b/examples/setup_ocean_critical_passages.py index b14c7ef2..22a794a1 100755 --- a/examples/setup_ocean_critical_passages.py +++ b/examples/setup_ocean_critical_passages.py @@ -4,8 +4,8 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) from geometric_features import GeometricFeatures diff --git a/examples/setup_ocean_land_coverage.py b/examples/setup_ocean_land_coverage.py index 7ab883cf..621fc042 100755 --- a/examples/setup_ocean_land_coverage.py +++ b/examples/setup_ocean_land_coverage.py @@ -8,13 +8,13 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals - -from geometric_features import GeometricFeatures +from __future__ import (absolute_import, division, print_function, + unicode_literals) import matplotlib.pyplot as plt +from geometric_features import GeometricFeatures + plot = True withCavities = False diff --git a/examples/setup_ocean_region_groups.py b/examples/setup_ocean_region_groups.py index 7195dbbf..9a36dd97 100755 --- a/examples/setup_ocean_region_groups.py +++ b/examples/setup_ocean_region_groups.py @@ -12,14 +12,15 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) -import matplotlib.pyplot as plt import copy + +import matplotlib.pyplot as plt import shapely -from geometric_features import GeometricFeatures, FeatureCollection +from geometric_features import FeatureCollection, GeometricFeatures def build_ocean_basins(gf, plot): diff --git a/examples/setup_ocean_standard_transport_sections.py b/examples/setup_ocean_standard_transport_sections.py index 9f25b561..0f507ce9 100755 --- a/examples/setup_ocean_standard_transport_sections.py +++ b/examples/setup_ocean_standard_transport_sections.py @@ -5,12 +5,11 @@ """ # stuff to make scipts work for python 2 and python 3 -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) from geometric_features import GeometricFeatures - # create a GeometricFeatures object that points to a local cache of geometric # data and knows which branch of geometric_feature to use to download # missing data diff --git a/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py b/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py index 00fb6408..9f72cda2 100755 --- a/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py +++ b/feature_creation_scripts/antarctic_ocean_regions/antarctic_ocean_regions.py @@ -1,18 +1,18 @@ #!/usr/bin/env python -import shapely -import numpy -import xarray import os -import matplotlib.pyplot as plt -import pyproj -import zipfile import shutil +import zipfile -from geometric_features import GeometricFeatures, FeatureCollection -from geometric_features.feature_collection import _round_coords +import matplotlib.pyplot as plt +import numpy +import pyproj +import shapely +import xarray +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.download import download_files +from geometric_features.feature_collection import _round_coords from geometric_features.utils import write_feature_names_and_tags diff --git a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py index 66a8718b..f2f85a7a 100755 --- a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py +++ b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partI.py @@ -1,19 +1,19 @@ #!/usr/bin/env python -import shapely -import numpy -import xarray -import os -import matplotlib.pyplot as plt -import pyproj import gzip +import os import shutil import tempfile -from geometric_features import GeometricFeatures, FeatureCollection -from geometric_features.feature_collection import _round_coords +import matplotlib.pyplot as plt +import numpy +import pyproj +import shapely +import xarray +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.download import download_files +from geometric_features.feature_collection import _round_coords from geometric_features.utils import write_feature_names_and_tags diff --git a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py index ab66a25e..b4a2a319 100755 --- a/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py +++ b/feature_creation_scripts/arctic_ocean_regions/arctic_ocean_regions_partII.py @@ -1,19 +1,19 @@ #!/usr/bin/env python -import shapely -import numpy -import xarray -import os -import matplotlib.pyplot as plt -import pyproj import gzip +import os import shutil import tempfile -from geometric_features import GeometricFeatures, FeatureCollection -from geometric_features.feature_collection import _round_coords +import matplotlib.pyplot as plt +import numpy +import pyproj +import shapely +import xarray +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.download import download_files +from geometric_features.feature_collection import _round_coords from geometric_features.utils import write_feature_names_and_tags diff --git a/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py b/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py index 6d654c71..7590f087 100755 --- a/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py +++ b/feature_creation_scripts/extract_bedmachine_coastlines/extract_bedmachine_coastlines.py @@ -1,24 +1,22 @@ #!/usr/bin/env python import os -import xarray + +import matplotlib.pyplot as plt import numpy import pyproj -import matplotlib.pyplot as plt -from skimage import measure - +import skfmm +import xarray +from scipy.interpolate import interp1d +from scipy.ndimage.filters import gaussian_filter from shapely.geometry import Polygon, mapping from shapely.ops import unary_union +from skimage import measure -from geometric_features import FeatureCollection, GeometricFeatures, \ - read_feature_collection +from geometric_features import (FeatureCollection, GeometricFeatures, + read_feature_collection) from geometric_features.utils import write_feature_names_and_tags -import skfmm - -from scipy.ndimage.filters import gaussian_filter -from scipy.interpolate import interp1d - """ We do not have permission to automatically download or re-distribute the BedMachine Antarctica topography. To download the file, follow these diff --git a/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py b/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py index 0046c25d..54cd0aad 100644 --- a/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py +++ b/feature_creation_scripts/extract_bedmap2_ice_coverage/bedamp2_to_netcdf.py @@ -1,9 +1,10 @@ -from netCDF4 import Dataset -import numpy import os import matplotlib.pyplot as plt -from progressbar import ProgressBar, Percentage, Bar, ETA +import numpy +from netCDF4 import Dataset +from progressbar import ETA, Bar, Percentage, ProgressBar + """ This script converts the Bedmap2 binary dataset into a NetCDF file, including longitude and latitude fields. The Bedmap2 bindary dataset is available via diff --git a/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py b/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py index be2d04e7..b37c5506 100644 --- a/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py +++ b/feature_creation_scripts/extract_bedmap2_ice_coverage/extract_bedmap2_ice_coverage.py @@ -1,20 +1,14 @@ -from netCDF4 import Dataset import numpy -from matplotlib import pyplot +import skfmm from matplotlib import _cntr as cntr - +from matplotlib import pyplot +from mpl_toolkits.basemap import interp as basemap_interp +from netCDF4 import Dataset +from scipy.ndimage.filters import gaussian_filter from shapely.geometry import Polygon, mapping from shapely.ops import unary_union - from utils.feature_write_utils import write_all_features - -import skfmm - -from scipy.ndimage.filters import gaussian_filter - -from mpl_toolkits.basemap import interp as basemap_interp - """ This script takes as input the Bedmap2 topography data produced by the bedmap2_to_netcdf.py script. It produces the feature file diff --git a/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py b/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py index 8b1ed19d..d095be62 100755 --- a/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py +++ b/feature_creation_scripts/iceshelves/bedmap2_to_netcdf.py @@ -1,9 +1,9 @@ #!/usr/bin/env python2 -from netCDF4 import Dataset import numpy +from netCDF4 import Dataset +from progressbar import ETA, Bar, Percentage, ProgressBar -from progressbar import ProgressBar, Percentage, Bar, ETA """ This script converts the Bedmap2 binary dataset into a NetCDF file, including longitude and latitude fields. The Bedmap2 bindary dataset is available via diff --git a/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py b/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py index fb98ada2..35818362 100755 --- a/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py +++ b/feature_creation_scripts/iceshelves/ice_vel_to_bedmap2.py @@ -1,15 +1,13 @@ #!/usr/bin/env python +import matplotlib import numpy from netCDF4 import Dataset -import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt - -from mpl_toolkits.basemap import interp - import scipy.ndimage.filters as filters +from mpl_toolkits.basemap import interp inFileName = 'Bedmap2_ice_shelf_distance.nc' inFile = Dataset(inFileName,'r') diff --git a/feature_creation_scripts/iceshelves/plot_streamline.py b/feature_creation_scripts/iceshelves/plot_streamline.py index 6d2b0087..e7cc7a6f 100755 --- a/feature_creation_scripts/iceshelves/plot_streamline.py +++ b/feature_creation_scripts/iceshelves/plot_streamline.py @@ -1,19 +1,17 @@ #!/usr/bin/env python +import matplotlib import numpy from netCDF4 import Dataset -import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt - -from mpl_toolkits.basemap import interp - import scipy.integrate import scipy.ndimage.morphology as morphology - +from mpl_toolkits.basemap import interp from skimage import measure + def interpVel(p,t): np = len(p)/2 x = p[0:np] diff --git a/feature_creation_scripts/iceshelves/polar.py b/feature_creation_scripts/iceshelves/polar.py index 5a7cfdbb..9fddcb3b 100644 --- a/feature_creation_scripts/iceshelves/polar.py +++ b/feature_creation_scripts/iceshelves/polar.py @@ -1,5 +1,6 @@ import numpy + def toPolar(points): lons = numpy.pi*points[:,0]/180. lats = numpy.pi*points[:,1]/180. diff --git a/feature_creation_scripts/iceshelves/write_basin_distances.py b/feature_creation_scripts/iceshelves/write_basin_distances.py index f3b6fef9..2a92e1a7 100755 --- a/feature_creation_scripts/iceshelves/write_basin_distances.py +++ b/feature_creation_scripts/iceshelves/write_basin_distances.py @@ -1,17 +1,17 @@ #!/usr/bin/env python -import numpy -from netCDF4 import Dataset +import os +import matplotlib +import numpy import scipy.misc - import skfmm -import os +from netCDF4 import Dataset -import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt + def readBasinImage(name): basinImage = scipy.misc.imread('basins/%s.png'%name) data = 1.0 - numpy.array(basinImage[::-1,:,0],float)/255. diff --git a/feature_creation_scripts/iceshelves/write_basin_images.py b/feature_creation_scripts/iceshelves/write_basin_images.py index bffc034c..9244e636 100755 --- a/feature_creation_scripts/iceshelves/write_basin_images.py +++ b/feature_creation_scripts/iceshelves/write_basin_images.py @@ -1,18 +1,18 @@ #!/usr/bin/env python -import numpy import json import sys + +import matplotlib +import numpy +from descartes import PolygonPatch from netCDF4 import Dataset from shapely.geometry import shape -from descartes import PolygonPatch -import matplotlib matplotlib.use('Agg') -import matplotlib.pyplot as plt - import os.path +import matplotlib.pyplot as plt from polar import toPolar diff --git a/feature_creation_scripts/iceshelves/write_basin_numbers.py b/feature_creation_scripts/iceshelves/write_basin_numbers.py index c368cfd5..74977c78 100755 --- a/feature_creation_scripts/iceshelves/write_basin_numbers.py +++ b/feature_creation_scripts/iceshelves/write_basin_numbers.py @@ -1,13 +1,12 @@ #!/usr/bin/env python +import matplotlib import numpy from netCDF4 import Dataset -import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt - inFileName = 'Bedmap2_ice_shelf_distance.nc' basinFileName = 'Bedmap2_grid_basin_distances.nc' diff --git a/feature_creation_scripts/iceshelves/write_expanded_overlaps.py b/feature_creation_scripts/iceshelves/write_expanded_overlaps.py index e1032b9e..73516635 100755 --- a/feature_creation_scripts/iceshelves/write_expanded_overlaps.py +++ b/feature_creation_scripts/iceshelves/write_expanded_overlaps.py @@ -1,15 +1,16 @@ #!/usr/bin/env python -import numpy import csv -from netCDF4 import Dataset import matplotlib +import numpy +from netCDF4 import Dataset + matplotlib.use('Agg') import matplotlib.pyplot as plt - import skfmm + def getBoundinBox(mask): xIndices = numpy.nonzero(numpy.amax(mask,axis=0))[0] yIndices = numpy.nonzero(numpy.amax(mask,axis=1))[0] diff --git a/feature_creation_scripts/iceshelves/write_iceshelf_distance.py b/feature_creation_scripts/iceshelves/write_iceshelf_distance.py index 1a576dfc..3d7df3c4 100755 --- a/feature_creation_scripts/iceshelves/write_iceshelf_distance.py +++ b/feature_creation_scripts/iceshelves/write_iceshelf_distance.py @@ -1,14 +1,12 @@ #!/usr/bin/env python +import matplotlib import numpy -from netCDF4 import Dataset - import skfmm +from netCDF4 import Dataset -import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt - import scipy.ndimage.morphology as morphology inFileName = 'Bedmap2.nc' diff --git a/feature_creation_scripts/iceshelves/write_iceshelf_features.py b/feature_creation_scripts/iceshelves/write_iceshelf_features.py index f9e6d5bf..0db93cc4 100755 --- a/feature_creation_scripts/iceshelves/write_iceshelf_features.py +++ b/feature_creation_scripts/iceshelves/write_iceshelf_features.py @@ -1,34 +1,28 @@ #!/usr/bin/env python -import numpy -import json import csv +import json + +import matplotlib +import numpy +from descartes import PolygonPatch from netCDF4 import Dataset from shapely.geometry import Polygon, mapping, shape -from descartes import PolygonPatch -import matplotlib matplotlib.use('Agg') -import matplotlib.pyplot as plt -import matplotlib.patches -import matplotlib.colors - +import gc import os -from mpl_toolkits.basemap import interp - -from skimage import measure - +import matplotlib.colors +import matplotlib.patches +import matplotlib.pyplot as plt import scipy.misc - import skfmm - +from mpl_toolkits.basemap import interp from polar import fromPolar - +from skimage import measure from utils.feature_write_utils import write_all_features -import gc - overlapsFileName = 'extendedOverlaps.nc' shelfDistanceFileName = 'Bedmap2_ice_shelf_distance.nc' namesFileName = 'ice_shelf_lat_lon.csv' diff --git a/feature_creation_scripts/iceshelves/write_iceshelf_numbers.py b/feature_creation_scripts/iceshelves/write_iceshelf_numbers.py index c0e6063a..26df8efb 100755 --- a/feature_creation_scripts/iceshelves/write_iceshelf_numbers.py +++ b/feature_creation_scripts/iceshelves/write_iceshelf_numbers.py @@ -1,22 +1,18 @@ #!/usr/bin/env python -import numpy import csv -from netCDF4 import Dataset import matplotlib +import numpy +from netCDF4 import Dataset + matplotlib.use('Agg') import matplotlib.pyplot as plt - -from mpl_toolkits.basemap import interp - -from skimage import measure - import scipy.misc - import skfmm - +from mpl_toolkits.basemap import interp from polar import toPolar +from skimage import measure inFileName = 'Bedmap2_ice_shelf_distance.nc' outFileName = 'Bedmap2_ice_shelf_numbers.nc' diff --git a/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py b/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py index cc226fc0..56adbd8e 100755 --- a/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py +++ b/feature_creation_scripts/ismip6_antarctic_ocean_regions/ismip6_antarctic_ocean_regions.py @@ -1,19 +1,19 @@ #!/usr/bin/env python -import shapely.geometry -import shapely.ops -import numpy -import xarray import os -import matplotlib.pyplot as plt -import pyproj -import zipfile import shutil +import zipfile -from geometric_features import GeometricFeatures, FeatureCollection -from geometric_features.feature_collection import _round_coords +import matplotlib.pyplot as plt +import numpy +import pyproj +import shapely.geometry +import shapely.ops +import xarray +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.download import download_files +from geometric_features.feature_collection import _round_coords from geometric_features.utils import write_feature_names_and_tags diff --git a/feature_creation_scripts/ismip6_landice_basins/basin_masks_to_geojson_regions.py b/feature_creation_scripts/ismip6_landice_basins/basin_masks_to_geojson_regions.py index 0ab8ab50..2145f2a5 100755 --- a/feature_creation_scripts/ismip6_landice_basins/basin_masks_to_geojson_regions.py +++ b/feature_creation_scripts/ismip6_landice_basins/basin_masks_to_geojson_regions.py @@ -6,17 +6,17 @@ # * pyproj import os -import numpy -import xarray -import pyproj -import matplotlib.pyplot as plt -from importlib.resources import path from configparser import ConfigParser, ExtendedInterpolation +from importlib.resources import path +import matplotlib.pyplot as plt +import numpy +import pyproj +import xarray from ismip6_ocean_forcing.bedmap2 import bedmap2_to_ismip6_grid from ismip6_ocean_forcing.imbie import make_imbie_masks -from geometric_features import GeometricFeatures, FeatureCollection +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.utils import write_feature_names_and_tags diff --git a/feature_creation_scripts/transport_transects/OSNAPsections.py b/feature_creation_scripts/transport_transects/OSNAPsections.py index 1aabb939..9973b379 100755 --- a/feature_creation_scripts/transport_transects/OSNAPsections.py +++ b/feature_creation_scripts/transport_transects/OSNAPsections.py @@ -1,10 +1,11 @@ #!/usr/bin/env python import csv -import matplotlib.pyplot as plt import shutil -from geometric_features import GeometricFeatures, FeatureCollection +import matplotlib.pyplot as plt + +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.utils import write_feature_names_and_tags diff --git a/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py b/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py index d2d38e9a..80776f0d 100644 --- a/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py +++ b/feature_creation_scripts/transport_transects/flipOSNAP_renameArcticTransectsTag.py @@ -2,10 +2,9 @@ import shutil -from geometric_features import GeometricFeatures, FeatureCollection +from geometric_features import FeatureCollection, GeometricFeatures from geometric_features.utils import write_feature_names_and_tags - gf = GeometricFeatures(cacheLocation='../../geometric_data', remoteBranchOrTag='main') diff --git a/geometric_features/__main__.py b/geometric_features/__main__.py index e5caf911..b90e0d8f 100644 --- a/geometric_features/__main__.py +++ b/geometric_features/__main__.py @@ -1,12 +1,13 @@ -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import argparse import os + import geometric_features from geometric_features import GeometricFeatures -from geometric_features.feature_collection import FeatureCollection, \ - read_feature_collection +from geometric_features.feature_collection import (FeatureCollection, + read_feature_collection) def combine_features(): diff --git a/geometric_features/aggregation/__init__.py b/geometric_features/aggregation/__init__.py index df09bf69..32e06b79 100644 --- a/geometric_features/aggregation/__init__.py +++ b/geometric_features/aggregation/__init__.py @@ -1,9 +1,14 @@ -from geometric_features.aggregation.ocean import basins, subbasins, \ - antarctic, ismip6_greenland, ice_shelves, ismip6, arctic as arctic_ocean, \ - transport, arctic_transport, moc from geometric_features.aggregation.landice import nasa_greenland +from geometric_features.aggregation.ocean import antarctic +from geometric_features.aggregation.ocean import arctic as arctic_ocean +from geometric_features.aggregation.ocean import (arctic_transport, basins, + ice_shelves, ismip6, + ismip6_greenland, moc, + subbasins, transport) from geometric_features.aggregation.seaice import arctic as arctic_seaice -from geometric_features.aggregation.seaice import qgreenland as qgreenland_seaice +from geometric_features.aggregation.seaice import \ + qgreenland as qgreenland_seaice + def get_aggregator_by_name(region_group): """ diff --git a/geometric_features/aggregation/landice/__init__.py b/geometric_features/aggregation/landice/__init__.py index 485cfe31..3c915c9a 100644 --- a/geometric_features/aggregation/landice/__init__.py +++ b/geometric_features/aggregation/landice/__init__.py @@ -1 +1,2 @@ -from geometric_features.aggregation.landice.nasa_greenland_extended import nasa_greenland +from geometric_features.aggregation.landice.nasa_greenland_extended import \ + nasa_greenland diff --git a/geometric_features/aggregation/ocean/__init__.py b/geometric_features/aggregation/ocean/__init__.py index 448a6f90..887313e2 100644 --- a/geometric_features/aggregation/ocean/__init__.py +++ b/geometric_features/aggregation/ocean/__init__.py @@ -1,10 +1,12 @@ -from geometric_features.aggregation.ocean.subbasin_regions import subbasins -from geometric_features.aggregation.ocean.ocean_basins import basins -from geometric_features.aggregation.ocean.arctic_regions import arctic from geometric_features.aggregation.ocean.antarctic_regions import antarctic +from geometric_features.aggregation.ocean.arctic_regions import arctic +from geometric_features.aggregation.ocean.arctic_transport_transects import \ + arctic_transport from geometric_features.aggregation.ocean.ice_shelf_regions import ice_shelves +from geometric_features.aggregation.ocean.ismip6_greenland_regions import \ + ismip6_greenland +from geometric_features.aggregation.ocean.ismip6_regions import ismip6 from geometric_features.aggregation.ocean.moc_basins import moc +from geometric_features.aggregation.ocean.ocean_basins import basins +from geometric_features.aggregation.ocean.subbasin_regions import subbasins from geometric_features.aggregation.ocean.transport_transects import transport -from geometric_features.aggregation.ocean.arctic_transport_transects import arctic_transport -from geometric_features.aggregation.ocean.ismip6_regions import ismip6 -from geometric_features.aggregation.ocean.ismip6_greenland_regions import ismip6_greenland diff --git a/geometric_features/aggregation/ocean/moc_basins.py b/geometric_features/aggregation/ocean/moc_basins.py index 9f2520c9..e612fbd9 100644 --- a/geometric_features/aggregation/ocean/moc_basins.py +++ b/geometric_features/aggregation/ocean/moc_basins.py @@ -1,6 +1,7 @@ +import copy + import shapely.geometry import shapely.ops -import copy from geometric_features import FeatureCollection diff --git a/geometric_features/download.py b/geometric_features/download.py index d0e1e2a3..52285664 100644 --- a/geometric_features/download.py +++ b/geometric_features/download.py @@ -1,12 +1,12 @@ -from __future__ import absolute_import, division, print_function, \ - unicode_literals - +from __future__ import (absolute_import, division, print_function, + unicode_literals) import os -import requests -import progressbar from urllib.request import pathname2url +import progressbar +import requests + # From https://stackoverflow.com/a/1094933/7728169 def sizeof_fmt(num, suffix='B'): diff --git a/geometric_features/feature_collection.py b/geometric_features/feature_collection.py index 3512d44c..24483bbb 100644 --- a/geometric_features/feature_collection.py +++ b/geometric_features/feature_collection.py @@ -1,7 +1,8 @@ -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import json + try: import matplotlib.pyplot as plt except ImportError: @@ -10,18 +11,18 @@ mpl.use('Agg', force=True) import matplotlib.pyplot as plt -import shapely.geometry -import shapely.ops +import copy + import cartopy import numpy as np import progressbar -import copy +import shapely.geometry +import shapely.ops +from geometric_features.plot import (build_projections, plot_base, + subdivide_geom) from geometric_features.utils import provenance_command -from geometric_features.plot import build_projections, subdivide_geom, \ - plot_base - def read_feature_collection(fileName): """ diff --git a/geometric_features/geometric_features.py b/geometric_features/geometric_features.py index 04516bae..4b9dfeaa 100644 --- a/geometric_features/geometric_features.py +++ b/geometric_features/geometric_features.py @@ -1,17 +1,14 @@ -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) import json import os - from importlib.resources import files as imp_res_files import geometric_features - -from geometric_features.feature_collection import FeatureCollection, \ - read_feature_collection - from geometric_features.download import download_files +from geometric_features.feature_collection import (FeatureCollection, + read_feature_collection) class GeometricFeatures(object): diff --git a/geometric_features/plot.py b/geometric_features/plot.py index 0aa14e9e..6b095cc5 100644 --- a/geometric_features/plot.py +++ b/geometric_features/plot.py @@ -1,10 +1,10 @@ -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) -import numpy as np -import matplotlib.pyplot as plt import cartopy.crs import cartopy.feature +import matplotlib.pyplot as plt +import numpy as np import shapely diff --git a/geometric_features/test/__init__.py b/geometric_features/test/__init__.py index 4cd11f75..bef37584 100644 --- a/geometric_features/test/__init__.py +++ b/geometric_features/test/__init__.py @@ -5,11 +5,11 @@ 03/16/2017 """ +import os +import shutil import warnings from contextlib import contextmanager -import os -import shutil from pytest import fixture try: diff --git a/geometric_features/test/test_aggregation.py b/geometric_features/test/test_aggregation.py index 9d955b7e..e77c0e47 100644 --- a/geometric_features/test/test_aggregation.py +++ b/geometric_features/test/test_aggregation.py @@ -1,10 +1,15 @@ import pytest -from geometric_features.test import TestCase, loaddatadir from geometric_features import GeometricFeatures -from geometric_features.aggregation import get_aggregator_by_name, basins, \ - subbasins, antarctic, ice_shelves, ismip6, arctic_ocean, transport, \ - arctic_transport, moc, arctic_seaice, qgreenland_seaice, nasa_greenland, ismip6_greenland +from geometric_features.aggregation import (antarctic, arctic_ocean, + arctic_seaice, arctic_transport, + basins, get_aggregator_by_name, + ice_shelves, ismip6, + ismip6_greenland, moc, + nasa_greenland, qgreenland_seaice, + subbasins, transport) +from geometric_features.test import TestCase, loaddatadir + @pytest.mark.usefixtures('loaddatadir') class TestAggregation(TestCase): diff --git a/geometric_features/test/test_feature_collection.py b/geometric_features/test/test_feature_collection.py index da3aa8ed..62f77d68 100644 --- a/geometric_features/test/test_feature_collection.py +++ b/geometric_features/test/test_feature_collection.py @@ -1,12 +1,13 @@ -import os import json +import os + import pytest import shapely import shapely.geometry +from geometric_features import (FeatureCollection, GeometricFeatures, + read_feature_collection) from geometric_features.test import TestCase, loaddatadir -from geometric_features import GeometricFeatures, FeatureCollection, \ - read_feature_collection @pytest.mark.usefixtures('loaddatadir') diff --git a/geometric_features/test/test_geometric_features.py b/geometric_features/test/test_geometric_features.py index a5cec2a5..a401bf43 100644 --- a/geometric_features/test/test_geometric_features.py +++ b/geometric_features/test/test_geometric_features.py @@ -1,8 +1,9 @@ import os + import pytest -from geometric_features.test import TestCase, loaddatadir from geometric_features import GeometricFeatures +from geometric_features.test import TestCase, loaddatadir @pytest.mark.usefixtures('loaddatadir') diff --git a/geometric_features/utils.py b/geometric_features/utils.py index 48a8e0d6..170a089e 100644 --- a/geometric_features/utils.py +++ b/geometric_features/utils.py @@ -1,13 +1,13 @@ -from __future__ import absolute_import, division, print_function, \ - unicode_literals +from __future__ import (absolute_import, division, print_function, + unicode_literals) +import datetime import glob import json -from collections import OrderedDict import os -import sys import socket -import datetime +import sys +from collections import OrderedDict def write_feature_names_and_tags(cacheLocation='./geometry_data', quiet=False): diff --git a/setup.py b/setup.py index ed8d1613..ec922a49 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,8 @@ import os import re -from setuptools import setup, find_packages + +from setuptools import find_packages, setup here = os.path.abspath(os.path.dirname(__file__)) with open(os.path.join(here, 'geometric_features', '__init__.py')) as f: From fd39cc25b0391d51befee0a361827b67ac0240eb Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Sat, 21 Dec 2024 12:24:40 +0100 Subject: [PATCH 10/12] Add features_and_tags.json to ignore list --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 10141221..83db65a0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -exclude: "docs|.git|geometric_data" +exclude: "docs|.git|geometric_data|geometric_features/features_and_tags.json" default_stages: [pre-commit] fail_fast: true From 9004c4ed54b8a57fd8bfb4727940eb5cd17844e9 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Sat, 21 Dec 2024 12:30:21 +0100 Subject: [PATCH 11/12] Add isort and flake8 to dev environment --- dev-spec.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dev-spec.txt b/dev-spec.txt index 99a6ab05..3638e4c9 100644 --- a/dev-spec.txt +++ b/dev-spec.txt @@ -16,6 +16,8 @@ pip pytest setuptools>=60 pre-commit +isort +flake8 # Documentation sphinx From cfff1e504b9017b59c93a10d04517ea6f9a96ed3 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Sat, 21 Dec 2024 16:53:30 +0100 Subject: [PATCH 12/12] Remove mypy --- .pre-commit-config.yaml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 83db65a0..116ef6b8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,12 +33,3 @@ repos: - id: flake8 args: ["--config=.flake8"] additional_dependencies: [flake8-isort] - - # Can run individually with `pre-commit run mypy --all-files` - - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.13.0 - hooks: - - id: mypy - args: ["--config=pyproject.toml", "--show-error-codes"] - verbose: true - additional_dependencies: ['types-requests', 'types-PyYAML']