Skip to content

Commit

Permalink
Update Develop-ref after #1577 (#1579)
Browse files Browse the repository at this point in the history
* thru SPEED #1049

* thru S #1049

* thru T #1049

* thru U #1049

* thru V #1049

* thru V #1049

* thru Z #1049

* Update statistics_list.rst

Tara is testing editing in UI

* Update statistics_list.rst

Updates through the A's

* Update statistics_list.rst

Cleaning up the A's

* Update statistics_list.rst

Standardizing MODE and MTD entries

* Update statistics_list.rst

Updating B's and C's

* Update statistics_list.rst

Testing adding TC-Stat and TCST to an entry

* feature 1252 allow dictionary value for time_summary.width (#1253)

* Update statistics_list.rst

Clean up of a few A-Cs and then update of Ds

* Update statistics_list.rst

A few clean-ups and Es

* Update statistics_list.rst

Halfway through Fs...

* feature 1213 obs_quality_inc/exc (#1260)

* Feature 1203 ioda2nc (#1262)

* Update statistics_list.rst

A little clean up and the rest of Fs

* Update statistics_list.rst

G, H, I, Ks

* Update statistics_list.rst

L, M, Ns

* Update statistics_list.rst

A little clean-up and Os

* Update statistics_list.rst

A little clean-up and Os

* Update statistics_list.rst

Rs

* Update statistics_list.rst

S and Ts

* Update statistics_list.rst

The rest of the list

* Update statistics_list.rst

Removed Attr from Stat Type thru E

* Update statistics_list.rst

Remove Attr from Statistics Type through Gs

* Update statistics_list.rst

Remove Attr from Statistic Type through Rs

* Update statistics_list.rst

Remove Attr from Stat Type to the end

* Update statistics_list.rst

Cleaned up some Line Type typos

* Update statistics_list.rst

Still more Attr cleanup

* Add default title for the new use case issue template.

* Feature 1019 harmonic preprocessing (#1272)

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* Feature 1266 gen ens prod missing ensembles (#1275)

* Feature 1049 statistics list (#1271)

* first attempt at a table #1049

* 2nd attempt, smaller, different formatting table #1049

* trying to get rid of git error message by adding this to the index #1049

* alignment #1049

* trying to text wrap in a table #1049

* attempting to create text wrapping in tables #1049

* removing role, trying to wrap text #1049

* removing html break, trying to wrap text #1049

* adding code to wrap text #1049

* removing code to wrap text #1049

* fixing naming typo #1049

* hitting returns in table #1049

* removing typo file, removing line breaks #1049

* attempting a simple table for text wrapping #1049

* attempting to bold header row in simple table #1049

* simple table line break attempt #1049

* simple table line break attempt #2 #1049

* simple table line break attempt #3 #1049

* trying another | #1049

* 2 trying another | #1049

* 3 trying another | #1049

* trying a blank line #1049

* trying reformating grid #1049

* 2 trying reformating grid #1049

* 3 trying reformating grid #1049

* 4 trying reformating grid #1049

* adding in one more table row #1049

* adding more text #1049

* trying glossary format #1049

* 2 trying glossary format #1049

* 3 trying glossary format #1049

* 4 trying glossary format #1049

* adding glossary format 2D objects #1049

* fixing glossary format 2D objects #1049

* adding glossary items #1049

* fixing glossary format #1049

* hopefully all examples are working #1049

* changing reference to tool

* removing 2D object examples

* removing the unwrapped table

* adding ACC into the example

* fixing formatting #1049

* fixing formatting take 2 #1049

* fixing formatting take 3 #1049

* bolding and language change #1049

* fixing spacing #1049

* fixing spacing again #1049

* changing title #1049

* trying superscript #1049

* superscript glossary #1049

* removing quotes #1049

* fixing spacing #1049

* Tara has decided to go with the glossary format.  Removing table example. #1049

* Adding 2D objects #1049

* 2D objects fix #1049

* 2D objects fix attempt 2 #1049

* 2D objects fix attempt 3 #1049

* 2D objects fix attempt 4 #1049

* 2D objects fix attempt 5 #1049

* 2D objects fix attempt 7 #1049

* 2D objects fix attempt 8 #1049

* ABR added #1049

* adding remaining AB items to list #1049

* adding remaining ACC_ items to list #1049

* ADLAND & AFSS entries #1049

* A entries #1049

* fixing formatting #1049

* fixing formatting #2 #1049

* removing new entries to make it run #1049

* adding a couple back in #1049

* adding a couple more back in #1049

* tool key at the bottom #1049

* spacing changes #1049

* spacing changes another try #1049

* fixing spacing #1049

* fixing spacing attempt 2 #1049

* fixing spacing attempt 3 #1049

* through AREA items #1049

* AMODEL listed twice but it's not #1049

* AMODEL listed twice but it's not #2 #1049

* AMODEL added question marks so it will run #1049

* final A entries #1049

* naming the glossary statistics in hopes of not conflicting with original glossary #1049

* removing glossary statistics space #1049

* Testing multiple glossary names

* Per #1067, working on attempts to have multiple glossaries with the same term

* Per #1067, working on attempts to have multiple glossaries with the same term

* Per #1067, working on attempts to have multiple glossaries with the same term

* Per #1067, removing code with attempts at mutiple glossaries

* Per #1067, adding back three question marks due to duplicate term

* paring down list, adding a table for review

* problems with table

* still trying to get it to publish

* still trying to get a second line in the table

* still trying to get a second line in the table 2

* testing different formatting

* testing different formatting

* trying to comment out the glossary inner workings

* formatting again

* line breaks in table #1049

* adding in some more for an example #1049

* adding new entries in through AREA #1049

* fixing line breaks #1049

* fixing line breaks #1049 #2

* fixing line breaks and warning messages #1049

* fixing line breaks #1049

* adding AREA_RATIO through ASPECT_DIFF

* fixing typo #1049

* fixing typo #1049

* fixing typo #1049 take 2

* adding AXIS_ANG to BCMSE #1049

* adding spacing #1049

* adding spacing removing commas #1049

* removing comma #1049

* BOUNDARY_DIST thru BSS_SMPL #1049

* BOUNDARY_DIST splitting across 2 lines #1049

* cleaning up typos #1049

* calibration thru centriod_dist #1049

* centriod_lat thru centroid_y #1049

* fixing spacing #1049

* removing test glossary #1049

* climo_mean thru crtk_err #1049

* fixing crtk_err spacing #1049

* fixing spacing #1049

* CSI to CURVATURE_Y #1049

* CURVATURE_X & Y spacing #1049

* DEV_CAT to DURATION_DIFF #1049

* EC_VALUE to F #1049

* F_RATE TO FBS #1049

* Fixing spacing #1049

* fcst_clus thru fcst_conv_radius #1049

* removing CTOP_PRS #1049

* fixing the order of tools for FBAR and FBIAS #1049

* fixing spacing #1049

* adding grid-stat to all point-stat entries #1049

* adding fixing spacing #1049

* adding fixing spacing take 2  #1049

* adding fixing spacing take 3  #1049

* adding fixing spacing take 4  #1049

* adding fixing spacing take 5  #1049

* adding fixing spacing take 6  #1049

* adding fixing spacing take 7  #1049

* fixing spacing with a period take 7  #1049

* first attempt fcst_  #1049

* fixing typos #1049

* thru FOBAR #1049

* thru end of F #1049

* g thru h #1049

* i thru intensity #s #1049

* fixing typos #1049

* capturing example for Julie #1049

* thru k #1049

* fixing typos #1049

* thru L #1049

* thru MG #1049

* thru N_ENS #1049

* thru all N #1049

* fixing FBIAS alignment #1049

* fixing ME and MSE alignment #1049

* fixing ME alignment take 2 #1049

* thru OBS_E #1049

* fixing alignment #1049

* fixing alignment n_thresh #1049

* thru OBS_thresh #1049

* thru O #1049

* fixing OOBAR formating #1049

* thru PR_CORR #1049

* commented lines out with line total info #1049

* commented lines out with line total info take 2 #1049

* thru R #1049

* thru SPEED #1049

* thru S #1049

* thru T #1049

* thru U #1049

* thru V #1049

* thru V #1049

* thru Z #1049

* Update statistics_list.rst

Tara is testing editing in UI

* Update statistics_list.rst

Updates through the A's

* Update statistics_list.rst

Cleaning up the A's

* Update statistics_list.rst

Standardizing MODE and MTD entries

* Update statistics_list.rst

Updating B's and C's

* Update statistics_list.rst

Testing adding TC-Stat and TCST to an entry

* Update statistics_list.rst

Clean up of a few A-Cs and then update of Ds

* Update statistics_list.rst

A few clean-ups and Es

* Update statistics_list.rst

Halfway through Fs...

* Update statistics_list.rst

A little clean up and the rest of Fs

* Update statistics_list.rst

G, H, I, Ks

* Update statistics_list.rst

L, M, Ns

* Update statistics_list.rst

A little clean-up and Os

* Update statistics_list.rst

A little clean-up and Os

* Update statistics_list.rst

Rs

* Update statistics_list.rst

S and Ts

* Update statistics_list.rst

The rest of the list

* Update statistics_list.rst

Removed Attr from Stat Type thru E

* Update statistics_list.rst

Remove Attr from Statistics Type through Gs

* Update statistics_list.rst

Remove Attr from Statistic Type through Rs

* Update statistics_list.rst

Remove Attr from Stat Type to the end

* Update statistics_list.rst

Cleaned up some Line Type typos

* Update statistics_list.rst

Still more Attr cleanup

Co-authored-by: Julie Prestopnik <jpresto@seneca.rap.ucar.edu>
Co-authored-by: TaraJensen <jensen@ucar.edu>

* creating a separate list for diagnostics, in progesss

* removing diagnostics from statistics, in progess #1049

* adding diagnostics_list to TOC #1049

* separating lists

* fixing typos #1049

* moving blank statistic type from statistics to diagnostics #1049

* Feature 1263 v4.1.0 beta4 (#1277)

* update version to note development towards beta5

* fixing errors #1049

* updating table name #1049

* fixing typo #1049

* Feature 934 release stage doc (#1235)

* Per #934 add stages of the METplus release cycle.

* Per #934, adding link to descriptions of the release cycle in the User's Guide.

* Per #934, made corrections

* Per #934, changed Beta and Release Candidate (rc) from bold to subsubsections.

* Update index.rst

Co-authored-by: Julie Prestopnik <jpresto@seneca.rap.ucar.edu>

* putting both tables into one chapter

* removing diagnostics since it's going back into the statistics chapter #1049

* Delete diagnostics_list.rst

This table will be added to the statistics page as a separate table. #1049

* test. breaking out directories A-B and C-D #1049

* testing with section names #1049

* alphbetical sections for statistics #1049

* making U-Z statistics list #1049

* alpabetical breaks for diagnostics list #1049

* trying to fix errors #1049

* trying to fix errors take 2 #1049

* trying to fix errors take 3 #1049

* Removed a unnecessary space #1049

* Making all METplus Names CAPITAL LETTERS #1049

* Feature 344 met util refactor (#1292)

* removed deprecated sections from config examples

* minor change to METplus release guide to add a link to the PDF of the User's Guide instead of downloading it and attaching it to the release

* Feature 1285 extract tiles mtd times (#1315)

* Feature 896 more met config (#1322)

* removed incorrect search keyword

* added workflow_dispatch event so workflow can be triggered by an external repository such as MET to test to ensure that changes from that repo will break anything in METplus

* added another input argument for workflow_dispatch event

* added job with name that shows the event name or the repository name if triggered by an external repository such as MET

* GHA: add username that triggered external event to event info job name

* added required input argument for external trigger that contains the commit hash of the push event that triggered in the other repo

* change event info to show commit hash instead of username that merged the PR

* changed input names to match names of event in repository that triggered workflow

* feature 1320 OMP_NUM_THREADS (#1338)

* Feature 1183 memory documentation (#1340)

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* add email address of user who triggered push event to job name

* Feature 1166 series analysis field info (#1353)

* Feature 1116 usecase smos (#1348)

Co-authored-by: Mrinal Biswas <biswas@ucar.edu>

* turn off new use case from every push

* feature 1236 Control Members in EnsembleStat and GenEnsProd (#1357)

* added optional argument to change the directory to untar new input data into so the same Dockerfile can be used to add data for other METplus components such as MET

* feature 1358 v4.1.0-beta5 release (#1359)

* update version for next development cycle

* Feature 1216 usecase smap (#1361)

* Adding a conf file for SMAP

* Adding a directory to host the read file

* Removing temp file

* Updated the valid dates to match Todd's code

* Adding documentation for SMAP case

* Updates the valis dates to match Todd's code

* Removing a tmp file

* Typo in file name

* Updating the input RTOFS to have the init time instead of the valid time ii the file name

* updated file paths, tesing

* updated use case descriptions, rearranged use case group testing

* put new use case into its own group so that the diff logic can evaluate marine_and_cryosphere:3. The truth data for 3-4 does not exist yet so the diff fails.

Co-authored-by: Mrinal Biswas <biswas@ucar.edu>
Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* updated marine_and_cryo grouping

* Feature 1230 stratosphere metrics (#1354)

* Initial checkin for Meridial Mean use case

* Changed the name and directories

* Added some documentation

* Fixed config variables

* Issue 1230 Stratospheric metrics (zonal/meridional use case) put INPUT_BASE in the user_env_vars so the user doesn't need to set the INPUT_BASE environment in the current working shell

* Issue #1230 remove import of metplotpy-this isn't called

* Issue #1230_stratosphere_metric Add use case to the list of use cases to be run for testing

* Issue 1230 Remove the INPUT_BASE from the user_env_vars section

* Issue #1230 redundant files

* Issue #1230 redundant files

* Issue #1230 redundant files

* Issue #120 replace INPUT_BASE with INPUT_FILE_NAME

* Issue #1230 remove entry for INPUT_FILE_NAME, this goes in the system.conf

* Update all_use_cases.txt

Copy and pasted #11 from s2s use case for the Stratosphere use case but forgot to update the index to 12.

* Update use_case_groups.json

added use case #12 from s2s to test stratosphere use case

* Issue #1230 put INPUT_FILE_NAME back under the user_env_vars

* Issue #1230 forgot to include the filename

* Issue #1230 clean up config file, remove uneccessary comments, group related entries in the user_env_vars

* Issue #1230 remove extraneous and incorrect path to the input_filename setting

* Removed pingouin dependency

* Issue #1230 another cut and paste error fixed for the Stratosphere use case

* Issue #1230 type in name, obs_Only should be obsOnly

* Issue #1230 added the metdatadb to the env, code imports metdatadb and may require some of these dependencies

* issue #1230 removed pingouin dependency from comment to reduce any confusion

* issue #1230 turn off the test for the Stratosphere metrics use case

* Added use case image

Co-authored-by: Hank Fisher <fisherh@kiowa.rap.ucar.edu>
Co-authored-by: Minna Win <minnawin@kiowa.rap.ucar.edu>
Co-authored-by: bikegeek <3753118+bikegeek@users.noreply.github.com>
Co-authored-by: Christina Kalb <kalb@kiowa.rap.ucar.edu>

* Corrected spelling of occurrence in two places

* Fixed misspelling of occurrence

* Found and fixed two more misspellings of occurence

* Changed version specific information to by X.Y.Z moved text indicating to click save to the bottom of the list.

* Feature 1374 python packages (#1378)

* Added documentation about updating spreadsheet of Python requirements

* Changed references to master_metplus.py to run_metplus.py

* Fixed formatting of section with run_metplus.py commands

* Updated text for updating the spreadsheet

* Removed a newly added section that wasn't needed

Co-authored-by: Julie Prestopnik <jpresto@seneca.rap.ucar.edu>

* feature 1368 PCPCombine use zero accum (#1381)

* feature 1369 grid_weight_flag in EnsembleStat (#1379)

* Per #1356, change how wrappers create instances of other wrappers to ensure that config settings for the created instance do not change values in METplusConfig used by the rest of the wrappers, ci-run-all-diff

* Per #1356, remove config_overrides functionality in favor of using instances -- this prevents the issue where overrides for a given tool affect the global config settings. it also forces the configs to override for an instance to be put into another config section so that it will be available in the final conf, ci-run-all-diff

* Per #1356, update documentation to reflect changes

* Per #1356, fixed unit test to no longer use deprecated approach to overriding config variables

* feature 1247 climatology settings (#1385)

* feature 1356 isolate config (#1386)

* Feature 675 Continuous Integration Documentation (#1409)

Co-authored-by: johnhg <johnhg@ucar.edu>

* feature 1382 Filename templates in MODEL (#1414)

* Feature 1289 explicit file list (#1387)

* Per PR #1387 review, fix typo

* Bugfix 1421 EnsembleStat use fcst fields in ens dictionary if ens is unset (#1422)

* fixed missing path change for docker file path

* removed variables that are not used

* Feature 1408 use case ptype (#1425)

* adding imagery, config file, updating internal tests

* updated lists, auto testing

* corrected old reference

* Update use_case_groups.json

* only trigger testing workflow for pull requests that are going into develop or main_* branches

* Feature 1371 blocking wr (#1426)

* turn off use cases for push events

* Feature 1392 climo_cdf.direct_prob and SeriesAnalysis (#1396)

* Changed event triggering rules for documentation workflow so that it will run for pull requests even if no files in the docs directory have changed. A recent pull request passed but develop failed after it was approved because files that were referenced in the use case documentation files had been deleted as part of the PR.

* feature 1273 TCGen -edeck and -shape (#1424)

* Feature 966 Fix mask.poly logic (#1430)

* Feature 1030 total seconds documentation (#1428)

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_obsERA_obsOnly_Blocking.py

* Update UserScript_fcstGFS_obsERA_WeatherRegime.py

* Update UserScript_obsERA_obsOnly_WeatherRegime.py

* Update UserScript_obsERA_obsOnly_WeatherRegime.py

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_fcstGFS_obsERA_WeatherRegime.py

* Update UserScript_obsERA_obsOnly_Blocking.py

* Update UserScript_obsERA_obsOnly_WeatherRegime.py

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_fcstGFS_obsERA_WeatherRegime.py

* Update UserScript_obsERA_obsOnly_Blocking.py

* Update UserScript_obsERA_obsOnly_WeatherRegime.py

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_fcstGFS_obsERA_WeatherRegime.py

* Update UserScript_fcstGFS_obsERA_WeatherRegime.py

* Update UserScript_fcstGFS_obsERA_Blocking.py

* Update UserScript_obsERA_obsOnly_Blocking.py

* Update UserScript_obsERA_obsOnly_WeatherRegime.py

* get branch name in job controls job

* replace logic to update input data volumes with call to dtcenter/metplus-action-data-update action

* feature 1431 remove obs_prepbufr_map (#1433)

* Per #675, added images and updated content

* added statsmodel package to metplotpy docker conda environment

* Added fcst_file_type to two wrappers (#1437)

Co-authored-by: Hank Fisher <fisherh@seneca.rap.ucar.edu>
Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* added release notes for tasks that have already been completed for beta6

* updated env var for METplotpy base to match changes made to the METplotpy repository

* Updated METplotpy base env var to preemptively match changes from PR dtcenter/METplotpy#197. Once that PR is merged into develop, a test workflow will run that should fix this issue.

* removed commented code that is no longer used

* update the instructions for updating test input data to ensure volume_mount_directories file is updated in the upcoming version directory, i.e. v4.1, so that the Docker data volumes from the release will be created properly

* removed duplicate script

* updated script to copy volume_mount_directories file into new METplus version directory

* added logic to skip files that are temporary copies of tar files that should not be added to new version directory

* updated release guide instructions for creating METplus data directory for next development cycle

* Feature 911 tc trackint (#1439)

Co-authored-by: Mrinal Biswas <biswas@seneca.rap.ucar.edu>
Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* added new use cases that are currently being reviewed to release notes

* updated event info in contributor's guide

* Feature 626 fix hovmoeller documentation (#1444)

* Update UserScript_obsPrecip_obsOnly_Hovmoeller.py

replace hovmoeller_diagram.conf with UserScript_obsPrecip_obsOnly_Hovmoeller.conf

* Update UserScript_obsPrecip_obsOnly_Hovmoeller.py

Removed a typo: UserScript This uses data from...

Now: This uses data from...

* Update UserScript_obsPrecip_obsOnly_Hovmoeller.py

* Modified the PR template to add review of the source issue metadata ci-skip-all

* feature_1403_python_components_table (#1446)

* creating new METplus Components Python Requirements

* adding a return to test

* testing use case links

* testing use case links #2

* testing use case links #3

* testing use case links #4

* Filling in some use cases

* fixing indentation #1403

* fixing indentation #1403 take 2

* fixing indentation #1403 take 3

* cleaning up anything after # in the links #1403

* entries thru D #1403

* entries thru H #1403

* fixing indents #1403

* fixing indents #1403 take 2

* fixing web name #1403

* entries thru L #1403

* entry matplotlib #1403

* entry matplotlib #1403 marking duplicate names

* entry metcalcpy #1403

* entry metcalcpy fix indents #1403

* entry matplotlib #1403 fixing duplicate names

* entry metplotpy #1403

* entry metplotpy #1403 marking duplicate names

* entry metplotpy #1403 fixing

* entry thru ps #1403

* double names #1403

* character fix #1403

* adding in missing links #1403

* thru pyproj #1403

* problem with line 353 #1403

* thru pyproj #1403 typos

* more duplicate names #1403

* line break #1403

* loose ends #1403

* adding >= to some of the versions #1403

* adding name to the Use Cases to avoid duplicate naming issues TEST #1403

* adding name to the Use Cases to avoid duplicate naming issues thru pyproj #1403

* adding thru pyresample #1403

* fixing pyresample typo #1403

* adding thru  scikit-image #1403

* fixing line breaks#1403

* web links thru  scikit-learn #1403

* web links thru scipy #1403

* web links thru sklearn #1403

* Duplicate web names. temp. fix #1403

* Duplicate web names fixed #1403

* Duplicate web names fixing #3 #1403

* Duplicate web names fixing #4 #1403

* Duplicate web names fixing #5 #1403

* table end #1403

* table loose ends #1403

* Removed unnecessary comma

* table loose ends after pull request #1403

* Minor modifications to METplus Component column

* Changed description of pyproj

* Added link for last referenced use case

* Attempting to fix doc warning

Co-authored-by: jprestop <jpresto@ucar.edu>

* Feature 1318 usecase aviso (#1440)

* Correct small typo.

* Update pull_request_template.md

* Added files for ReadTheDocs (#864)

* Updated documentation links for ReadtheDocs

* Update pull_request_template.md

Added entry for completion date for pull request review.

* Adding python embedding script to read AVISO, RTOFS, HYCOM and OSTIA data

* Updated the script - working but only RMSE values match

* Adding documentation for the AVISO case

* Adding a conf file for the AVISO case

* Updates to the codel to include model3, obs, climo3 but also has many extra print statements, netcdf output files which needs to be cleaned

* Cleaning up the conf file and adding SAL1L2 to get the model_climo sdev and obs_climo sdev

* Updating the file to fix the standard names and add the model3, climo3 and obs3

* Updating the file to fix the standard names and add the model3, climo3 and obs3

* Adding an image to the use case. Image Courtesy: EMC/NOAA website

* added to use case list

* updated case description

* removed merge issues

* caught second docs issue

* removed other doc merge issues, turned off auto test

* more merge comments sneaking in

Co-authored-by: johnhg <johnhg@ucar.edu>
Co-authored-by: jprestop <jpresto@ucar.edu>
Co-authored-by: Mrinal Biswas <biswas@ucar.edu>

* Revert "Feature 1318 usecase aviso (#1440)" (#1459)

This reverts commit d3021de.

* Feature 1449 v4.1.0 beta6 (#1461)

* Per #1449, updated version as specified in the Release Guide

* Per #1449, updated release notes

* Updated release date for beta6 release

Co-authored-by: Julie Prestopnik <jpresto@seneca.rap.ucar.edu>

* updated version number after beta release

* Feature 1318 usecase aviso attempt 2 (#1473)

Co-authored-by: johnhg <johnhg@ucar.edu>
Co-authored-by: jprestop <jpresto@ucar.edu>
Co-authored-by: Mrinal Biswas <biswas@ucar.edu>
Co-authored-by: j-opatz <jopatz@ucar.edu>

* error if no input template is set for GridDiag wrapper

* added comment for new logic, ci-run-diff

* updated old section name to config, ci-run-all-diff

* fixed bug with replacing wildcard characters with 'all' in output file paths

* Revert "fixed bug with replacing wildcard characters with 'all' in output file paths"

This reverts commit c11711e.

* fixed bug with replacing wildcard characters with 'all' in output file paths, ci-run-all-diff

* feature 1102 -out for TCStat and StatAnalysis (#1477)

* feature 1464 EnsembleStat probabilistic additions (#1479)

* feature 1445 normalize in GenEnsProd (#1478)

* added logic to add quotes around grid value if they are not set in conf variable value, moved error check for unset grid to init step, ci-run-all-diff

* bugfix 1486 PB2NC file window variables not read (#1487)

* added build arg to override MET DockerHub repository so development version tests can use dtcenter/met-dev:develop

* set MET DockerHub repo based on develop or stable version of METplus

* run diff logic for push events to develop and main_v* branches so we can catch if changes to external repositories caused differences in the output

* do not run diff logic on main_v* and develop branch push events -- diff logic is already running when external repository triggers workflow, which is what we need to test with the diff logic

* Added description for Use Cases

* updated script to set up new release input data directories -- use real path for all symbolic links for consistency, added usage statement

* changed logic to error if new version directory to create already exists at all -- previous logic only errors if directory is not empty

* Changed all filename template tags for datetime objects (init/valid/da_init/etc.) to use %H instead of %2H. We discovered that Python 3.6.8 interprets %2H as the same as %H (correctly substituting the hour), however Python 3.8.8 interprets %2H as 2H. The number in between the % and letter is not supported by strftime so it is not valid for these datetime values. The logic to zero-pad using this notation was written in the METplus string substitution logic and only applies to lead and level template tags. ci-run-all-diff

* feature 1274 TCGen use case using -shape/-genesis (#1492)

Co-authored-by: Kathryn Newman <knewman@seneca.rap.ucar.edu>
Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com>

* feature 1490 Python Embedding for Point Observations (#1491)

* update use case groupings for automated tests

* removed extra comma typo, ci-run-all-diff

* added missing characters in commmands

* Feature 1403 python components table (#1497)

Co-authored-by: Lisa Goodrich <lisag@ucar.edu>
Co-authored-by: Julie Prestopnik <jpresto@seneca.rap.ucar.edu>

* testing new statistics provided by Tara #1049

* testing new statistics #2 #1049

* New statistics from Tara #1049

* New statistics from Tara small corrections #1049

* New statistics from Tara small corrections #2 #1049

* New statistics from Tara small moving to Diagnostics table #1049

* Fixing space-time, like that's possible #1049

* Fixing spacing #1049

* feature 1471 fix current field info in output_prefix (#1500)

* Feature 1503 v4.1.0 rc1 (#1504)

* update version after rc1 release to reflect development towards 4.1.0 release

* Corrected documentation title name

* bugfix 1486 pb2nc window variables (#1507)

* feature 1443 document probabilistic field settings (#1508)

Co-authored-by: johnhg <johnhg@ucar.edu>

* feature 943 document referencing current level (#1509)

* feature 1510 v4.1.0 Release (#1511)

* updated release guide to reflect updated process to trigger reference branch GHA workflow for an official release

* update version to reflect development towards 5.0.0-beta1 release

* Feature 673 MET (#1517)

* set MET docker repo to dtcenter/met if forcing a specific MET tag to use since that is where the stable release versions are stored on DockerHub

* pass variable to tell docker build script that an external workflow triggered the run and use -lite if so to ensure that MET docker image that was created by the triggering MET workflow is used

* echo output variables from job control job so they can be reviewed in the GHA log output

* minor fix for consistency in logs, ci-skip-all

* Feature 1399 usecase cable (#1538)

* Adding initial code to read AOML Cable Transport and RTOFS cable transport variables

* Updating the conf file (no stat analysis yet) and updates to the read file

* Updating the conf file to add STAT_ANALYSIS

* Updates to the code- adding stats

* Updated code--runs now but needs to follow User Script conventions

* Changed directory name based on MET conventions

* Updating the read file and adding a conf file

* Added logic to count the number of directories in the RTOFS dir

* Updated to run with UserScript conf

* update version for official release

* Adding a yaml file to specify start_date

* Added the yaml file and cleaned up the conf file

* Added logic to read the yaml file, cleaned up the script

* Updating the confile to add output dir, input template and clean up

* Removing yaml, getting vDate from conf file, adding output file

* Adding the doc file for the cable use case

* Adding image courtesy NOAA

* Adding more documentation

* Adding more info

* Updated docs

* Correcting the python embedding script

* Updating to see if the error goes away..no clue

* Fixing the doc error

* modifed docs, testing

* updated permissions for script

* turned off always testing

* Updated version number

* Update use_case_groups.json

* Removed erroneous file

* Apply suggestions from code review

* Update .github/parm/use_case_groups.json

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* Update docs/use_cases/model_applications/marine_and_cryosphere/UserScript_fcstRTOFS_obsAOML_calcTransport.py

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* Update docs/use_cases/model_applications/marine_and_cryosphere/UserScript_fcstRTOFS_obsAOML_calcTransport.py

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* Update docs/use_cases/model_applications/marine_and_cryosphere/UserScript_fcstRTOFS_obsAOML_calcTransport.py

Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

Co-authored-by: Mrinal Biswas <biswas@ucar.edu>
Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com>

* Update UserScript_fcstGFS_obsERA_WeatherRegime.conf

Fixed a title typo

* Feature component links (#1518)

* Feature 770 3rd person (#1564)

* changing from 2nd to 3rd person and fixing some spacing #770

* missed we and corrected #770

* typos, spacing etc #770

* spelling, italics and bolding #770

* removing you changing to 3rd person #770

* changing to 3rd person #770

* 3rd person already done.  Fixing formatting, typos etc.  #770

* 3rd person already done.  Fixing formatting  #770

* changing to 3rd person, fixing typos, spacing, etc. #770

* changing to 3rd person, fixing typos, grammar and punctuation. #770

* google doc corrections. #770

* clean up #770

* removing |  #770

* typo #770

* Fixing TOC and coding block #770

* fixing note #770

* one 3rd person fix.  Updating bolding and italics for file names and directories #770

* Modified Python Code Analyis Tools

* Modified Python Code Analyis Tools

* Removed link for PROCESS_LIST. If we can't have an internal link, we do not want one in this case.

* fixing space #770

* fixing conflict #2 #770

* fixing typos #770

* fixing typos #2 #770

* directory formatting #2 #770

* Changed sub process to subprocess

* Modified usage of user because this text is for developers. Made other minor changes.

Co-authored-by: Julie Prestopnik <jpresto@ucar.edu>

* bugfix 1555 develop clear args properly (#1562)

* Fixed bug in classification text file (#1568)

Co-authored-by: Lisa Goodrich <lisag@ucar.edu>
Co-authored-by: TaraJensen <jensen@ucar.edu>
Co-authored-by: johnhg <johnhg@ucar.edu>
Co-authored-by: Christina Kalb <kalb@ucar.edu>
Co-authored-by: lisagoodrich <33230218+lisagoodrich@users.noreply.github.com>
Co-authored-by: Julie Prestopnik <jpresto@seneca.rap.ucar.edu>
Co-authored-by: jprestop <jpresto@ucar.edu>
Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com>
Co-authored-by: Mrinal Biswas <biswas@ucar.edu>
Co-authored-by: j-opatz <jopatz@ucar.edu>
Co-authored-by: bikegeek <minnawin@ucar.edu>
Co-authored-by: Hank Fisher <fisherh@ucar.edu>
Co-authored-by: Hank Fisher <fisherh@kiowa.rap.ucar.edu>
Co-authored-by: Minna Win <minnawin@kiowa.rap.ucar.edu>
Co-authored-by: bikegeek <3753118+bikegeek@users.noreply.github.com>
Co-authored-by: Christina Kalb <kalb@kiowa.rap.ucar.edu>
Co-authored-by: Hank Fisher <fisherh@seneca.rap.ucar.edu>
Co-authored-by: Mrinal Biswas <biswas@seneca.rap.ucar.edu>
Co-authored-by: Kathryn Newman <knewman@seneca.rap.ucar.edu>
  • Loading branch information
20 people authored Apr 20, 2022
1 parent 2c1971f commit 8221969
Show file tree
Hide file tree
Showing 32 changed files with 574 additions and 347 deletions.
104 changes: 74 additions & 30 deletions docs/Contributors_Guide/basic_components.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,20 @@ found in metplus/wrappers/ascii2nc_wrapper.py.
The class name should always be the item that is passed into the
METplus configuration variable list PROCESS_LIST with 'Wrapper' at the end.

CommandBuilder's initialization function sets default values for instance variables, initializes the CommandRunner object (used to execute shell commands), and calls the create_c_dict() function. This function is found in CommandBuilder but it is also implemented by most (eventually all) wrappers. The wrapper implementations start off by calling the parent's version of create_c_dict using super(), then adding additional dictionary items that are specific to that wrapper and finally returning the dictionary that was created. If possible, all of the calls to the 'get' functions of the cMETplusConfig object should be found in the create_c_dict function. This allows the configuration values to be referenced throughout the wrapper without the redundantly referencing the wrapper name (i.e. ASCII2NC_INPUT_DIR can be referenced as INPUT_DIR in ASCII2NC since we already it pertains to ASCII2NC) It also makes it easier to see which configuration variables are used in each wrapper.
CommandBuilder's initialization function sets default values for instance
variables, initializes the CommandRunner object (used to execute shell
commands), and calls the create_c_dict() function. This function is found
in CommandBuilder but it is also implemented by most (eventually all)
wrappers. The wrapper implementations start off by calling the parent's
version of create_c_dict using super(), then adding additional dictionary
items that are specific to that wrapper and finally returning the dictionary
that was created. If possible, all of the calls to the 'get' functions of the
cMETplusConfig object should be found in the create_c_dict function. This
allows the configuration values to be referenced throughout the wrapper
without the redundantly referencing the wrapper name (i.e. ASCII2NC_INPUT_DIR
can be referenced as INPUT_DIR in ASCII2NC since it already pertains to
ASCII2NC) It also makes it easier to see which configuration variables are
used in each wrapper.

create_c_dict (ExampleWrapper)::

Expand Down Expand Up @@ -85,10 +98,13 @@ isOK class variable
isOK is defined in CommandBuilder (ush/command_builder.py).

Its function is to note a failed process while not stopping a parent process.
Instead of instantly exiting a larger wrapper script once one sub process has failed we
want all of the processes to attempt to be executed and then note which ones failed.
Instead of instantly exiting a larger wrapper script once one subprocess has
failed this allows all of the processes to attempt to be executed and
then note which ones failed.

At the end of the wrapper initialization step, all isOK=false will be collected and reported. Execution of the wrappers will not occur unless all wrappers in the process list are initialized correctly.
At the end of the wrapper initialization step, all isOK=false will be
collected and reported. Execution of the wrappers will not occur unless all
wrappers in the process list are initialized correctly.

.. code-block:: python
Expand Down Expand Up @@ -127,38 +143,57 @@ See ush/pb2nc_wrapper.py for an example.
run_all_times function
======================

run_all_times loops over a series of times calling run_at_time for one process for each time
Defined in CommandBuilder but overridden in a wrappers that process all of the data from every run time at once.
run_all_times loops over a series of times calling run_at_time for one
process for each time. Defined in CommandBuilder but overridden in
wrappers that process all of the data from every run time at once.

See SeriesByLeadWrapper (ush/series_by_lead_wrapper.py) for an example of overridding the function
See SeriesByLeadWrapper (ush/series_by_lead_wrapper.py) for an example of
overriding the function.

get_command function
====================

get_command assembles a MET command with arguments that can be run via the shell or the wrapper.
It is defined in CommandBuilder but is overridden in most wrappers because the command line arguments differ for each MET tool.
get_command assembles a MET command with arguments that can be run via the
shell or the wrapper.
It is defined in CommandBuilder but is overridden in most wrappers because
the command line arguments differ for each MET tool.

set_environment_variables function
==================================

Uses add_env_var function (CommandBuilder) to set any shell environment variables that MET or other METplus wrappers
need to be set. This allows a wrapper to pass information into a MET configuration file. The MET config file refers to the environment variables.
This is currently only set in wrappers that use MET config files, but the other wrappers will also need to set environment variables
that are needed to be set in the environment when running, such as MET_TMP_DIR and MET_PYTHON_EXE.
Uses add_env_var function (CommandBuilder) to set any shell environment
variables that MET or other METplus wrappers
need to be set. This allows a wrapper to pass information into a MET
configuration file. The MET config file refers to the environment variables.
This is currently only set in wrappers that use MET config files, but the
other wrappers will also need to set environment variables
that are needed to be set in the environment when running, such as
MET_TMP_DIR and MET_PYTHON_EXE.

find_data/find_model/find_obs functions (in CommandBuilder)
===========================================================

find_* uses the c_dict directory templates and then queries the file system to find the files you are looking for
uses c_dict dictionary items [FCST/OBS]_FILE_WINDOW_[BEGIN/END], [FCST/OBS]_INPUT_[DIR/TEMPLATE], etc.
If [FCST/OBS]_FILE_WINDOW_[BEGIN/END] are non-zero, these functions will list all files under [FCST/OBS]_INPUT_DIR and use [FCST/OBS]_INPUT_TEMPLATE to extract out time information from each file to determine which files within the file window range should be used. Some tools allow multiple files to be selected. If a tool does not allow multiple files, the file closest to the valid time is returned. If multiple files are the same distance from the valid time, the first file that was found is used.
If a wrapper can read in multiple files, the c_dict item 'ALLOW_MULTIPLE_FILES' should be set to True.
These find_* functions use the c_dict directory templates, queries
the file system to find files, and use c_dict dictionary items
like [FCST/OBS]_FILE_WINDOW_[BEGIN/END], [FCST/OBS]_INPUT_[DIR/TEMPLATE],
etc.
If [FCST/OBS]_FILE_WINDOW_[BEGIN/END] are non-zero, these functions will
list all files under [FCST/OBS]_INPUT_DIR and use [FCST/OBS]_INPUT_TEMPLATE
to extract out time information from each file to determine which files
within the file window range should be used. Some tools allow multiple
files to be selected. If a tool does not allow multiple files, the file
closest to the valid time is returned. If multiple files are the same
distance from the valid time, the first file that was found is used.
If a wrapper can be read in multiple files, the c_dict item
'ALLOW_MULTIPLE_FILES' should be set to True.

do_string_sub function
======================

do_string_sub is found in ush/string_template_substitution.py and is the critical function for substituting the placeholder
values in templates with the actual values needed for running a particular wrapper
do_string_sub is found in ush/string_template_substitution.py and is the
critical function for substituting the placeholder
values in templates with the actual values needed for running a particular
wrapper

tc_pairs_wrapper has a good example

Expand All @@ -172,13 +207,17 @@ tc_pairs_wrapper has a good example
bdeck_glob = os.path.join(self.c_dict['BDECK_DIR'],
bdeck_file)
time_info is a dictionary of current run time information that can be substituted into the template. See the 'Time Utilities' section for more information.
time_info is a dictionary of current run time information that can be
substituted into the template. See the 'Time Utilities' section for more
information.

Time Utilities
==============

time_util is a collection of functions to handle the idosyncracies of working with valid, initialization and observation times.
METplus creates a dictionary containing the current time and either init or valid time::
time_util is a collection of functions to handle the idiosyncrasies of working
with valid, initialization and observation times.
METplus creates a dictionary containing the current time and either init or
valid time::

input_dict = {}
input_dict['now'] = clock_time_obj
Expand All @@ -188,24 +227,28 @@ METplus creates a dictionary containing the current time and either init or vali
else:
input_dict['valid'] = loop_time

The forecast lead is also set if provided ('lead'). This dictionary is passed into time_util's ti_calculate function, which determines the other time values that were not provided::
The forecast lead is also set if provided ('lead'). This dictionary is
passed into time_util's ti_calculate function, which determines the other
time values that were not provided::

>>> import time_util
>>> import datetime
>>> input_dict = {'init':datetime.datetime.strptime('1987020106', '%Y%m%d%H'), 'lead':10800}
>>> time_util.ti_calculate(input_dict)
{'lead': 10800, 'offset': 0, 'init': datetime.datetime(1987, 2, 1, 6, 0), 'valid': datetime.datetime(1987, 2, 1, 9, 0), 'loop_by': 'init', 'da_init': datetime.datetime(1987, 2, 1, 9, 0), 'init_fmt': '19870201060000', 'da_init_fmt': '19870201090000', 'valid_fmt': '19870201090000', 'lead_string': '3 hours', 'lead_hours': 3, 'lead_minutes': 180, 'lead_seconds': 10800, 'offset_hours': 0, 'date': datetime.datetime(1987, 2, 1, 9, 0), 'cycle': datetime.datetime(1987, 2, 1, 9, 0)}

Items that will be parsed from the input dictionary are: now, init, valid, lead, lead_seconds, lead_minutes, lead_hours, offset, offset_hours, da_init
Items that will be parsed from the input dictionary are: now, init, valid,
lead, lead_seconds, lead_minutes, lead_hours, offset, offset_hours, da_init

pcp_combine uses a variety of time_util functions like ti_calculate and ti_get_lead_string
pcp_combine uses a variety of time_util functions like ti_calculate and
ti_get_lead_string

Adding Support for MET Configuration Variables
==============================================

The METplus wrappers utilize environment variables to override values in the
MET configuration files. There are functions in CommandBuilder that can be
used to easily add support for override MET configuration variables that did
used to easily add support for overriding MET configuration variables that
were not previously supported in METplus configuration files.

There is a utility that can be used to easily see what changes are needed to
Expand Down Expand Up @@ -243,7 +286,7 @@ should be set.

* name: Name of the variable to set, i.e. model
* data_type: Type of variable. Valid options are int, string, list, float,
bool, and thresh
bool, and thresh.
* metplus_configs: List of METplus configuration variable names that should be
checked. Variable names are checked in order that they appear in the list.
If any of the variables are set in the config object, then the value will be
Expand Down Expand Up @@ -305,11 +348,12 @@ data type, extra info, children, and nicknames.
set by the METplus config variable GRID_STAT_MASK_POLY. However, in older
versions of the METplus wrappers, the variable used was
GRID_STAT_VERIFICATION_MASK_TEMPLATE. To preserve support for this name, the
nickname can be set to [f'{self.app_name.upper()}_VERIFICATION_MASK_TEMPLATE'] and the old variable
nickname can be set to
[f'{self.app_name.upper()}_VERIFICATION_MASK_TEMPLATE'] and the old variable
will be checked if GRID_STAT_MASK_POLY is not set.

Values must be set to None to preserve the order.
For example, if you need to define a nickname but no extra info or children,
For example, to define a nickname but no extra info or children,
then use: ('string', None, None, ['NICKNAME1]).

If a complex MET configuration dictionary is used by multiple MET tools, then
Expand All @@ -326,7 +370,7 @@ CompareGriddedWrapper and is used by GridStat, PointStat, and EnsembleStat::
This function handles setting the climo_cdf dictionary. The METplus config
variable that fits the format {APP_NAME}_{DICTIONARY_NAME}_{VARIABLE_NAME},
i.e. GRID_STAT_CLIMO_CDF_CDF_BINS for GridStat's climo_cdf.cdf_bins, is
quieried first. However, this default name is a little redundant, so adding
queried first. However, this default name is a little redundant, so adding
the nickname 'GRID_STAT_CLIMO_CDF_BINS' allows the user to set the variable
GRID_STAT_CLIMO_CDF_BINS instead.

Expand Down
109 changes: 67 additions & 42 deletions docs/Contributors_Guide/coding_standards.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
.. _codingstandards:

****************
Coding Standards
================
****************



Expand All @@ -14,81 +15,105 @@ Coding Standards
`Sphinx <http://www.sphinx-doc.org/en/master/>`_ for documentation
* **NOTE: Please do not use f-strings in the run_metplus.py file so that the Python version check can notify the user of the incorrect version. Using Python 3.5 or earlier will output the SyntaxError from the f-string instead of the useful error message.**

Python code analysis tools
--------------------------
Python Code Analysis Tools
==========================

Static:
Static Tools
------------

pylint
^^^^^^

::
pip install pylint or conda install pylint
`pylint <https://pylint.pycqa.org/en/latest/intro.html>`_ is a tool that checks
for errors in Python code, tries to enforce a coding standard and looks for code
smells.

pylint.org
To `install pylint <https://pylint.pycqa.org/en/latest/user_guide/installation.html>`_
the following can be run:

checks for code errors
.. code-block:: ini
pip install pylint
or

.. code-block:: ini
conda install pylint
To check for errors as well as PEP-8 style code, run:

.. code-block:: ini
pylint pep8 <code-to-analyze>
replacing <code-to-analyze> with the name of the file to analyze.

pylint pep8 code-to-analyze will check for errors as well as PEP-8 style code

pyflakes
^^^^^^^^

::
`pyflakes <https://pypi.org/project/pyflakes/>`_ is a simple program which
checks Python source files for errors. Pyflakes analyzes programs and
detects various errors. It works by parsing the source file, not importing
it, so it is safe to use on modules with side effects. It’s also much faster.

pip install pyflakes or conda install pyflakes

parses code rather than importing code, therefore OK to use on modules with side-effects
To install pyflakes the following can be run:

checks for code errors
.. code-block:: ini
faster than pylint
pip install pyflakes
https://pypi.python.org/pypi/pyflakes
or

flake8 is wrapper to pyflakes, performs PEP-8 style checking in addition to error checking
http://flake8.pycqa.org/en/latest/index.html#quickstart
.. code-block:: ini
vulture
^^^^^^^
conda install pyflakes
::
checks for unused imports, variables, methods, classed ie "dead code"
`flake8 <http://flake8.pycqa.org/en/latest/index.html#quickstart>`_ is wrapper
to pyflakes, performs PEP-8 style checking in addition to error checking.

pip install vulture or conda install vulture
vulture
^^^^^^^

https://pypi.python.org/pypi/vulture
`vulture <https://pypi.org/project/vulture/>`_ finds unused code in Python
programs and is useful for cleaning up and finding errors in large code bases.
It checks for unused imports, variables, methods, and classes.

Dynamic (run-time):
To install vulture the following can be run:

.. code-block:: ini
cpde-coverage analysis
^^^^^^^^^^^^^^^^^^^^^^
pip install vulture
Useful when running unit tests to determine whether tests are executing all possible branches, loops, etc.
or

figleaf
^^^^^^^
.. code-block:: ini
http://darcs.idyll.org/~t/projects/figleaf/doc/
Checking for God objects and God methods:
conda install vulture
(from Chapter 4 of "How to Make Mistakes in Python", Mike Pirnat)
::
Dynamic (run-time) Tools
------------------------

find . -name "*.py" -exec wc -l {} \; | sort -g -r
for all Python source files, order by size
anything over 1000 lines is worth investigating (as general rule of thumb)
Code Coverage Analysis
^^^^^^^^^^^^^^^^^^^^^^

grep "^class " mybigmodule.py |wc -l
counts the number of classes defined in mybigmodule.py
Code coverage analysis tools are useful when running unit tests to determine
whether tests are executing all possible branches, loops, etc.

grep "\sdef " mybigmodule.py |wc -l
**Examples:**

counts the number of methods defined within a class or other function (ie at some level of indentation) in mybigmodule.py
`Coverage.py <https://coverage.readthedocs.io/>`_: A free tool for
monitoring the coverage of your Python apps, monitoring every bit of your code
to find what was executed and what was not.

try this if the above doesn't work: grep "def " mybigmodule.py |wc -l
`pytest-cov <https://pypi.org/project/pytest-cov/>`_: A free language plug-in
to produce a coverage report of your app.

A high ratio of methods to classes warrants investigation (what constitutes a high ratio- 10:1, 5:1???)
`figleaf <https://ctb.github.io/figleaf/doc/>`_: A code coverage analysis
tool intended to be to be a minimal replacement of 'coverage.py' that supports
more configurable coverage gathering and reporting.
Loading

0 comments on commit 8221969

Please sign in to comment.