Repository: NeurodataWithoutBorders/nwbinspector (language: python)

Issue:
Allow NCBI for subject species form
## Motivation

Add NCBI Taxonomy link to the alllowed subject species form. Added test for it. Updated Best Practice with instructions on how to find it for a given species.


Discussion / hints:
Originating issue: https://github.com/dandi/helpdesk/issues/81

# [Codecov](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders) Report
> Merging [#290](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders) (ef1f45b) into [dev](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/commit/a4a66e7a30e99bcca0a4a129909acec7eaa23360?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders) (a4a66e7) will **increase** coverage by `0.01%`.
> The diff coverage is `90.69%`.

[![Impacted file tree graph](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/graphs/tree.svg?width=650&height=150&src=pr&token=772QROR5F0&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders)](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders)

```diff
@@            Coverage Diff             @@
##              dev     #290      +/-   ##
==========================================
+ Coverage   93.95%   93.97%   +0.01%     
==========================================
  Files          20       20              
  Lines        1026     1045      +19     
==========================================
+ Hits          964      982      +18     
- Misses         62       63       +1     
```

| Flag | Coverage Δ | |
|---|---|---|
| unittests | `93.97% <90.69%> (+0.01%)` | :arrow_up: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders) | Coverage Δ | |
|---|---|---|
| [src/nwbinspector/\_\_init\_\_.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9fX2luaXRfXy5weQ==) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/behavior.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvYmVoYXZpb3IucHk=) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/ecephys.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvZWNlcGh5cy5weQ==) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/general.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvZ2VuZXJhbC5weQ==) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/icephys.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvaWNlcGh5cy5weQ==) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/images.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvaW1hZ2VzLnB5) | `78.94% <ø> (ø)` | |
| [src/nwbinspector/checks/nwb\_containers.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvbndiX2NvbnRhaW5lcnMucHk=) | `96.42% <ø> (ø)` | |
| [src/nwbinspector/checks/ogen.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3Mvb2dlbi5weQ==) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/ophys.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3Mvb3BoeXMucHk=) | `100.00% <ø> (ø)` | |
| [src/nwbinspector/checks/tables.py](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders#diff-c3JjL253Ymluc3BlY3Rvci9jaGVja3MvdGFibGVzLnB5) | `96.70% <ø> (ø)` | |
| ... and [10 more](https://codecov.io/gh/NeurodataWithoutBorders/nwbinspector/pull/290/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=NeurodataWithoutBorders) | |


Fix patch:
diff --git a/src/nwbinspector/__init__.py b/src/nwbinspector/__init__.py
index 88c937ae4..3228437c9 100644
--- a/src/nwbinspector/__init__.py
+++ b/src/nwbinspector/__init__.py
@@ -13,3 +13,5 @@
 from .checks.tables import *
 from .checks.time_series import *
 from .checks.icephys import *
+
+default_check_registry = {check.__name__: check for check in available_checks}
diff --git a/src/nwbinspector/internal_configs/dandi.inspector_config.yaml b/src/nwbinspector/internal_configs/dandi.inspector_config.yaml
index 22798812c..c3d06a5bb 100644
--- a/src/nwbinspector/internal_configs/dandi.inspector_config.yaml
+++ b/src/nwbinspector/internal_configs/dandi.inspector_config.yaml
@@ -3,7 +3,7 @@ CRITICAL:  # All the fields under CRITICAL will be required for dandi validate t
   - check_subject_id_exists
   - check_subject_sex
   - check_subject_species_exists
-  - check_subject_species_latin_binomial
+  - check_subject_species_form
   - check_subject_age
   - check_subject_proper_age_range
 BEST_PRACTICE_VIOLATION:


Test patch:
diff --git a/tests/test_check_configuration.py b/tests/test_check_configuration.py
index 55fc041b8..bd3cdfa6d 100644
--- a/tests/test_check_configuration.py
+++ b/tests/test_check_configuration.py
@@ -8,6 +8,7 @@
     check_data_orientation,
     check_timestamps_match_first_dimension,
     available_checks,
+    default_check_registry,
 )
 from nwbinspector.nwbinspector import validate_config, configure_checks, _copy_function, load_config
 
@@ -94,7 +95,7 @@ def test_load_config(self):
                     "check_subject_id_exists",
                     "check_subject_sex",
                     "check_subject_species_exists",
-                    "check_subject_species_latin_binomial",
+                    "check_subject_species_form",
                     "check_subject_age",
                     "check_subject_proper_age_range",
                 ],
@@ -103,3 +104,11 @@ def test_load_config(self):
                 ],
             ),
         )
+
+    def test_all_config_check_names_are_in_default_registry(self):
+        config = load_config(filepath_or_keyword="dandi")
+        for importance_level, check_names in config.items():
+            for check_name in check_names:
+                assert (
+                    check_name in default_check_registry
+                ), f"Check name {check_name} was not found in the default registry!"