diff --git a/intake/catalog/base.py b/intake/catalog/base.py
index 34c2e7c..9fd7087 100644
--- a/intake/catalog/base.py
+++ b/intake/catalog/base.py
@@ -273,7 +273,10 @@ class Catalog(DataSource):
         output = {"metadata": self.metadata, "sources": {},
                   "name": self.name}
         for key, entry in self.items():
-            output["sources"][key] = entry._captured_init_kwargs
+            kw = entry._captured_init_kwargs.copy()
+            kw.pop('catalog', None)
+            kw['parameters'] = {k.name: k.__getstate__()['kwargs'] for k in kw.get('parameters', [])}
+            output["sources"][key] = kw
         return yaml.dump(output)
 
     def save(self, url, storage_options=None):

.save() functionality in Catalog for custom local catalog class
Found a number of errors in trying to save a catalog that was defined in a custom class. Source here: https://github.com/manfralab/intake-qcodes

Here's the solution I ended up with, including some comments about what errors needed to be fixed. Sorry, this isn't a super clean example...

```
    def serialize(self):
        """
        Produce YAML version of this catalog.
        Note that this is not the same as ``.yaml()``, which produces a YAML
        block referring to this catalog.
        """
        import yaml
        output = {"metadata": self.metadata, "sources": {},
                  "name": self.name}
        for key, entry in self.items():
            # hack to fix serializing the name of the custom catalog
            kw = entry._captured_init_kwargs.copy()
            kw.pop('catalog')

            # 'parameters' should be a dict, is currently being written as a list
            # this hack only works because there are no parameters defined in my catalog
            if isinstance(kw['parameters'], list):
                if not kw['parameters']:
                    kw['parameters'] = {}
                else:
                    raise ValueError('not sure how to serialize this correctly')

            if not kw['cache']:
                kw['cache'] = [] # default value of None raises an error when read back

            output["sources"][key] = kw

        return yaml.dump(output)
```
diff --git a/intake/catalog/tests/test_local.py b/intake/catalog/tests/test_local.py
index b5dc04e..7673307 100644
--- a/intake/catalog/tests/test_local.py
+++ b/intake/catalog/tests/test_local.py
@@ -617,7 +617,25 @@ def test_dict_save():
     cat2 = open_catalog(fn)
     assert 'trial' in cat2
     assert cat2.name == 'mycat'
-    assert cat2.trial._driver =='csv'
+    assert cat2.trial._driver == 'csv'
+
+
+def test_dict_save_complex():
+    from intake.catalog.base import Catalog
+    fn = os.path.join(tempfile.mkdtemp(), 'mycat.yaml')
+    cat = Catalog()
+    entry = LocalCatalogEntry(name='trial', description='get this back',
+                              driver='csv', cache=[], catalog=cat,
+                              parameters=[UserParameter(name='par1', description='desc', type='int')],
+                              args={'urlpath': 'none'})
+
+    cat._entries = {'trial': entry}
+    cat.save(fn)
+
+    cat2 = open_catalog(fn)
+    assert 'trial' in cat2
+    assert cat2.name == 'mycat'
+    assert cat2.trial.describe()['plugin'][0] == 'csv'
 
 
 def test_dict_adddel():

docs/environment.yml
pip install -e .[complete]
parse_log_pytest
environment.yml
pytest
apt-get update apt-get install -y gcc libsnappy-dev
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster @ file:///home/ktietz/src/ci/alabaster_1611921544520/work
anyio @ file:///tmp/build/80754af9/anyio_1644481697509/work/dist
appdirs==1.4.4
argon2-cffi @ file:///opt/conda/conda-bld/argon2-cffi_1645000214183/work
argon2-cffi-bindings @ file:///tmp/build/80754af9/argon2-cffi-bindings_1644569681205/work
attrs @ file:///croot/attrs_1668696182826/work
Babel @ file:///croot/babel_1671781930836/work
backcall @ file:///home/ktietz/src/ci/backcall_1611930011877/work
beautifulsoup4 @ file:///opt/conda/conda-bld/beautifulsoup4_1650462163268/work
bleach @ file:///opt/conda/conda-bld/bleach_1641577558959/work
bokeh==1.4.0
Bottleneck @ file:///opt/conda/conda-bld/bottleneck_1657175564434/work
brotlipy==0.7.0
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi @ file:///croot/cffi_1670423208954/work
charset-normalizer @ file:///tmp/build/80754af9/charset-normalizer_1630003229654/work
click @ file:///tmp/build/80754af9/click_1646056591685/work
cloudpickle @ file:///tmp/build/80754af9/cloudpickle_1632508026186/work
colorama @ file:///croot/colorama_1672386526460/work
colorcet @ file:///croot/colorcet_1668084511401/work
cryptography @ file:///croot/cryptography_1677533068310/work
cycler @ file:///tmp/build/80754af9/cycler_1637851556182/work
cytoolz @ file:///croot/cytoolz_1667465931118/work
dask==2.10.1
debugpy @ file:///tmp/build/80754af9/debugpy_1637091426235/work
decorator @ file:///opt/conda/conda-bld/decorator_1643638310831/work
defusedxml @ file:///tmp/build/80754af9/defusedxml_1615228127516/work
distributed @ file:///tmp/build/80754af9/distributed_1605066520545/work
docutils @ file:///opt/conda/conda-bld/docutils_1657175430858/work
entrypoints @ file:///tmp/build/80754af9/entrypoints_1649908585034/work
exceptiongroup==1.2.2
fastjsonschema @ file:///opt/conda/conda-bld/python-fastjsonschema_1661371079312/work
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
fonttools==4.25.0
fsspec @ file:///croot/fsspec_1670336592807/work
HeapDict @ file:///Users/ktietz/demo/mc3/conda-bld/heapdict_1630598515714/work
holoviews @ file:///opt/conda/conda-bld/holoviews_1645454331194/work
hvplot @ file:///croot/hvplot_1668767118610/work
idna @ file:///croot/idna_1666125576474/work
imagesize @ file:///opt/conda/conda-bld/imagesize_1657179498843/work
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
importlib-resources @ file:///tmp/build/80754af9/importlib_resources_1625135880749/work
iniconfig==2.0.0
-e git+https://github.com/intake/intake.git@bd3d02aa098ce396457414769b95e78f2b0bf124#egg=intake
ipykernel @ file:///opt/conda/conda-bld/ipykernel_1662361798230/work
ipython @ file:///tmp/abs_94gruux8u8/croots/recipe/ipython_1659529858706/work
ipython-genutils @ file:///tmp/build/80754af9/ipython_genutils_1606773439826/work
jedi @ file:///tmp/build/80754af9/jedi_1644299024593/work
Jinja2 @ file:///croot/jinja2_1666908132255/work
jsonschema @ file:///croot/jsonschema_1676558650973/work
jupyter-server @ file:///croot/jupyter_server_1671707632269/work
jupyter_client @ file:///croot/jupyter_client_1676329080601/work
jupyter_core @ file:///croot/jupyter_core_1668084443243/work
jupyterlab-pygments @ file:///tmp/build/80754af9/jupyterlab_pygments_1601490720602/work
kiwisolver @ file:///croot/kiwisolver_1672387140495/work
locket @ file:///opt/conda/conda-bld/locket_1652903118915/work
lxml @ file:///opt/conda/conda-bld/lxml_1657545139709/work
Markdown @ file:///croot/markdown_1671541909495/work
MarkupSafe @ file:///opt/conda/conda-bld/markupsafe_1654597864307/work
matplotlib @ file:///croot/matplotlib-suite_1667356714455/work
matplotlib-inline @ file:///opt/conda/conda-bld/matplotlib-inline_1662014470464/work
mistune @ file:///tmp/build/80754af9/mistune_1594373098390/work
msgpack @ file:///opt/conda/conda-bld/msgpack-python_1652362659880/work
msgpack-numpy @ file:///tmp/build/80754af9/msgpack-numpy_1605111757211/work
munkres==1.1.4
nbclassic @ file:///croot/nbclassic_1676902904845/work
nbclient @ file:///tmp/build/80754af9/nbclient_1650308370114/work
nbconvert @ file:///croot/nbconvert_1668450669124/work
nbformat @ file:///croot/nbformat_1670352325207/work
nest-asyncio @ file:///croot/nest-asyncio_1672387112409/work
notebook @ file:///croot/notebook_1668179881751/work
notebook_shim @ file:///croot/notebook-shim_1668160579331/work
numexpr @ file:///croot/numexpr_1668713893690/work
numpy @ file:///opt/conda/conda-bld/numpy_and_numpy_base_1653915516269/work
numpydoc @ file:///croot/numpydoc_1668085905352/work
packaging @ file:///croot/packaging_1671697413597/work
pandas==1.3.5
pandocfilters @ file:///opt/conda/conda-bld/pandocfilters_1643405455980/work
panel==0.8.0
param @ file:///croot/param_1671697421807/work
parso @ file:///opt/conda/conda-bld/parso_1641458642106/work
partd @ file:///opt/conda/conda-bld/partd_1647245470509/work
pexpect @ file:///tmp/build/80754af9/pexpect_1605563209008/work
pickleshare @ file:///tmp/build/80754af9/pickleshare_1606932040724/work
Pillow==9.4.0
pkgutil_resolve_name @ file:///opt/conda/conda-bld/pkgutil-resolve-name_1661463321198/work
pluggy==1.2.0
prometheus-client @ file:///tmp/abs_d3zeliano1/croots/recipe/prometheus_client_1659455100375/work
prompt-toolkit @ file:///croot/prompt-toolkit_1672387306916/work
psutil @ file:///opt/conda/conda-bld/psutil_1656431268089/work
ptyprocess @ file:///tmp/build/80754af9/ptyprocess_1609355006118/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
pyarrow==12.0.1
pycparser @ file:///tmp/build/80754af9/pycparser_1636541352034/work
pyct @ file:///croot/pyct_1675441480074/work
Pygments @ file:///opt/conda/conda-bld/pygments_1644249106324/work
pyOpenSSL @ file:///croot/pyopenssl_1677607685877/work
pyparsing @ file:///opt/conda/conda-bld/pyparsing_1661452539315/work
pyrsistent @ file:///tmp/build/80754af9/pyrsistent_1636098896055/work
PySocks @ file:///tmp/build/80754af9/pysocks_1594394576006/work
pytest==7.4.4
python-dateutil @ file:///tmp/build/80754af9/python-dateutil_1626374649649/work
python-snappy @ file:///croot/python-snappy_1670943913523/work
pytz @ file:///croot/pytz_1671697431263/work
pyviz-comms @ file:///tmp/build/80754af9/pyviz_comms_1623747165329/work
PyYAML @ file:///croot/pyyaml_1670514731622/work
pyzmq @ file:///opt/conda/conda-bld/pyzmq_1657724186960/work
requests @ file:///opt/conda/conda-bld/requests_1657734628632/work
Send2Trash @ file:///tmp/build/80754af9/send2trash_1632406701022/work
six @ file:///tmp/build/80754af9/six_1644875935023/work
sniffio @ file:///tmp/build/80754af9/sniffio_1614030478629/work
snowballstemmer @ file:///tmp/build/80754af9/snowballstemmer_1637937080595/work
sortedcontainers @ file:///tmp/build/80754af9/sortedcontainers_1623949099177/work
soupsieve @ file:///croot/soupsieve_1666296392845/work
Sphinx @ file:///opt/conda/conda-bld/sphinx_1657784123546/work
sphinx-rtd-theme @ file:///Users/ktietz/demo/mc3/conda-bld/sphinx_rtd_theme_1629455006846/work
sphinxcontrib-applehelp @ file:///home/ktietz/src/ci/sphinxcontrib-applehelp_1611920841464/work
sphinxcontrib-devhelp @ file:///home/ktietz/src/ci/sphinxcontrib-devhelp_1611920923094/work
sphinxcontrib-htmlhelp @ file:///tmp/build/80754af9/sphinxcontrib-htmlhelp_1623945626792/work
sphinxcontrib-jsmath @ file:///home/ktietz/src/ci/sphinxcontrib-jsmath_1611920942228/work
sphinxcontrib-qthelp @ file:///home/ktietz/src/ci/sphinxcontrib-qthelp_1611921055322/work
sphinxcontrib-serializinghtml @ file:///tmp/build/80754af9/sphinxcontrib-serializinghtml_1624451540180/work
tblib @ file:///Users/ktietz/demo/mc3/conda-bld/tblib_1629402031467/work
terminado @ file:///croot/terminado_1671751832461/work
tinycss2 @ file:///croot/tinycss2_1668168815555/work
tomli==2.0.1
toolz @ file:///croot/toolz_1667464077321/work
tornado @ file:///opt/conda/conda-bld/tornado_1662061693373/work
tqdm @ file:///opt/conda/conda-bld/tqdm_1664392687731/work
traitlets @ file:///croot/traitlets_1671143879854/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
urllib3 @ file:///croot/urllib3_1673575502006/work
wcwidth @ file:///Users/ktietz/demo/mc3/conda-bld/wcwidth_1629357192024/work
webencodings==0.5.1
websocket-client @ file:///tmp/build/80754af9/websocket-client_1614804260725/work
zict==2.1.0
zipp @ file:///croot/zipp_1672387121353/work

name: intake
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - alabaster=0.7.12=pyhd3eb1b0_0
  - anyio=3.5.0=py37h06a4308_0
  - appdirs=1.4.4=pyhd3eb1b0_0
  - argon2-cffi=21.3.0=pyhd3eb1b0_0
  - argon2-cffi-bindings=21.2.0=py37h7f8727e_0
  - attrs=22.1.0=py37h06a4308_0
  - babel=2.11.0=py37h06a4308_0
  - backcall=0.2.0=pyhd3eb1b0_0
  - beautifulsoup4=4.11.1=py37h06a4308_0
  - blas=1.0=openblas
  - bleach=4.1.0=pyhd3eb1b0_0
  - bokeh=1.4.0=py37_0
  - bottleneck=1.3.5=py37h7deecbd_0
  - brotli=1.0.9=h5eee18b_9
  - brotli-bin=1.0.9=h5eee18b_9
  - brotlipy=0.7.0=py37h27cfd23_1003
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - cffi=1.15.1=py37h5eee18b_3
  - charset-normalizer=2.0.4=pyhd3eb1b0_0
  - click=8.0.4=py37h06a4308_0
  - cloudpickle=2.0.0=pyhd3eb1b0_0
  - colorama=0.4.6=py37h06a4308_0
  - colorcet=3.0.1=py37h06a4308_0
  - cryptography=39.0.1=py37h9ce1e76_0
  - cycler=0.11.0=pyhd3eb1b0_0
  - cytoolz=0.12.0=py37h5eee18b_0
  - dask=2.10.1=py_0
  - dask-core=2.10.1=py_0
  - debugpy=1.5.1=py37h295c915_0
  - decorator=5.1.1=pyhd3eb1b0_0
  - defusedxml=0.7.1=pyhd3eb1b0_0
  - distributed=2.30.1=py37h06a4308_0
  - docutils=0.18.1=py37h06a4308_3
  - entrypoints=0.4=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - fonttools=4.25.0=pyhd3eb1b0_0
  - freetype=2.12.1=h4a9f257_0
  - fsspec=2022.11.0=py37h06a4308_0
  - giflib=5.2.2=h5eee18b_0
  - heapdict=1.0.1=pyhd3eb1b0_0
  - holoviews=1.14.8=pyhd3eb1b0_0
  - hvplot=0.8.1=py37h06a4308_0
  - icu=58.2=he6710b0_3
  - idna=3.4=py37h06a4308_0
  - imagesize=1.4.1=py37h06a4308_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - importlib_resources=5.2.0=pyhd3eb1b0_1
  - ipykernel=6.15.2=py37h06a4308_0
  - ipython=7.31.1=py37h06a4308_1
  - ipython_genutils=0.2.0=pyhd3eb1b0_1
  - jedi=0.18.1=py37h06a4308_1
  - jinja2=3.1.2=py37h06a4308_0
  - jpeg=9e=h5eee18b_3
  - jsonschema=4.17.3=py37h06a4308_0
  - jupyter_client=7.4.9=py37h06a4308_0
  - jupyter_core=4.11.2=py37h06a4308_0
  - jupyter_server=1.23.4=py37h06a4308_0
  - jupyterlab_pygments=0.1.2=py_0
  - kiwisolver=1.4.4=py37h6a678d5_0
  - lcms2=2.16=hb9589c4_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - lerc=4.0.0=h6a678d5_0
  - libbrotlicommon=1.0.9=h5eee18b_9
  - libbrotlidec=1.0.9=h5eee18b_9
  - libbrotlienc=1.0.9=h5eee18b_9
  - libdeflate=1.22=h5eee18b_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgfortran-ng=11.2.0=h00389a5_1
  - libgfortran5=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libopenblas=0.3.21=h043d6bf_0
  - libpng=1.6.39=h5eee18b_0
  - libsodium=1.0.18=h7b6447c_0
  - libstdcxx-ng=11.2.0=h1234567_1
  - libtiff=4.5.1=hffd6297_1
  - libwebp=1.2.4=h11a3e52_1
  - libwebp-base=1.2.4=h5eee18b_1
  - libxml2=2.9.14=h74e7548_0
  - libxslt=1.1.35=h4e12654_0
  - locket=1.0.0=py37h06a4308_0
  - lxml=4.9.1=py37h1edc446_0
  - lz4-c=1.9.4=h6a678d5_1
  - markdown=3.4.1=py37h06a4308_0
  - markupsafe=2.1.1=py37h7f8727e_0
  - matplotlib-base=3.5.3=py37hf590b9c_0
  - matplotlib-inline=0.1.6=py37h06a4308_0
  - mistune=0.8.4=py37h14c3975_1001
  - msgpack-numpy=0.4.7.1=pyhd3eb1b0_0
  - msgpack-python=1.0.3=py37hd09550d_0
  - munkres=1.1.4=py_0
  - nbclassic=0.5.2=py37h06a4308_0
  - nbclient=0.5.13=py37h06a4308_0
  - nbconvert=6.5.4=py37h06a4308_0
  - nbformat=5.7.0=py37h06a4308_0
  - ncurses=6.4=h6a678d5_0
  - nest-asyncio=1.5.6=py37h06a4308_0
  - notebook=6.5.2=py37h06a4308_0
  - notebook-shim=0.2.2=py37h06a4308_0
  - numexpr=2.8.4=py37hd2a5715_0
  - numpy=1.21.5=py37hf838250_3
  - numpy-base=1.21.5=py37h1e6e340_3
  - numpydoc=1.5.0=py37h06a4308_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pandas=1.3.5=py37h8c16a72_0
  - pandocfilters=1.5.0=pyhd3eb1b0_0
  - panel=0.8.0=0
  - param=1.12.3=py37h06a4308_0
  - parso=0.8.3=pyhd3eb1b0_0
  - partd=1.2.0=pyhd3eb1b0_1
  - pexpect=4.8.0=pyhd3eb1b0_3
  - pickleshare=0.7.5=pyhd3eb1b0_1003
  - pillow=9.4.0=py37h6a678d5_0
  - pip=22.3.1=py37h06a4308_0
  - pkgutil-resolve-name=1.3.10=py37h06a4308_0
  - prometheus_client=0.14.1=py37h06a4308_0
  - prompt-toolkit=3.0.36=py37h06a4308_0
  - psutil=5.9.0=py37h5eee18b_0
  - ptyprocess=0.7.0=pyhd3eb1b0_2
  - pycparser=2.21=pyhd3eb1b0_0
  - pyct=0.5.0=py37h06a4308_0
  - pygments=2.11.2=pyhd3eb1b0_0
  - pyopenssl=23.0.0=py37h06a4308_0
  - pyparsing=3.0.9=py37h06a4308_0
  - pyrsistent=0.18.0=py37heee7806_0
  - pysocks=1.7.1=py37_1
  - python=3.7.16=h7a1cb2a_0
  - python-dateutil=2.8.2=pyhd3eb1b0_0
  - python-fastjsonschema=2.16.2=py37h06a4308_0
  - python-snappy=0.6.1=py37h6a678d5_0
  - pytz=2022.7=py37h06a4308_0
  - pyviz_comms=2.0.2=pyhd3eb1b0_0
  - pyyaml=6.0=py37h5eee18b_1
  - pyzmq=23.2.0=py37h6a678d5_0
  - readline=8.2=h5eee18b_0
  - requests=2.28.1=py37h06a4308_0
  - send2trash=1.8.0=pyhd3eb1b0_1
  - setuptools=65.6.3=py37h06a4308_0
  - six=1.16.0=pyhd3eb1b0_1
  - snappy=1.2.1=h6a678d5_0
  - sniffio=1.2.0=py37h06a4308_1
  - snowballstemmer=2.2.0=pyhd3eb1b0_0
  - sortedcontainers=2.4.0=pyhd3eb1b0_0
  - soupsieve=2.3.2.post1=py37h06a4308_0
  - sphinx=5.0.2=py37h06a4308_0
  - sphinx_rtd_theme=0.4.3=pyhd3eb1b0_0
  - sphinxcontrib-applehelp=1.0.2=pyhd3eb1b0_0
  - sphinxcontrib-devhelp=1.0.2=pyhd3eb1b0_0
  - sphinxcontrib-htmlhelp=2.0.0=pyhd3eb1b0_0
  - sphinxcontrib-jsmath=1.0.1=pyhd3eb1b0_0
  - sphinxcontrib-qthelp=1.0.3=pyhd3eb1b0_0
  - sphinxcontrib-serializinghtml=1.1.5=pyhd3eb1b0_0
  - sqlite=3.45.3=h5eee18b_0
  - tblib=1.7.0=pyhd3eb1b0_0
  - terminado=0.17.1=py37h06a4308_0
  - tinycss2=1.2.1=py37h06a4308_0
  - tk=8.6.14=h39e8969_0
  - toolz=0.12.0=py37h06a4308_0
  - tornado=6.2=py37h5eee18b_0
  - tqdm=4.64.1=py37h06a4308_0
  - traitlets=5.7.1=py37h06a4308_0
  - typing-extensions=4.4.0=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - urllib3=1.26.14=py37h06a4308_0
  - wcwidth=0.2.5=pyhd3eb1b0_0
  - webencodings=0.5.1=py37_1
  - websocket-client=0.58.0=py37h06a4308_4
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - yaml=0.2.5=h7b6447c_0
  - zeromq=4.3.5=h6a678d5_0
  - zict=2.1.0=py37h06a4308_0
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - zstd=1.5.6=hc292b87_0
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.0.0
      - pluggy==1.2.0
      - pyarrow==12.0.1
      - pytest==7.4.4
      - tomli==2.0.1
prefix: /opt/conda/envs/intake

intake/catalog/tests/test_local.py::test_dict_save_complex
intake/catalog/tests/test_local.py::test_get_dir intake/catalog/tests/test_local.py::test_remote_cat
intake/catalog/tests/test_local.py::test_local_catalog intake/catalog/tests/test_local.py::test_get_items intake/catalog/tests/test_local.py::test_nested intake/catalog/tests/test_local.py::test_nested_gets_name_from_super intake/catalog/tests/test_local.py::test_hash intake/catalog/tests/test_local.py::test_getitem intake/catalog/tests/test_local.py::test_source_plugin_config intake/catalog/tests/test_local.py::test_metadata intake/catalog/tests/test_local.py::test_use_source_plugin_from_config intake/catalog/tests/test_local.py::test_entry_dir_function intake/catalog/tests/test_local.py::test_user_parameter_default_value[bool-False] intake/catalog/tests/test_local.py::test_user_parameter_default_value[datetime-expected1] intake/catalog/tests/test_local.py::test_user_parameter_default_value[float-0.0] intake/catalog/tests/test_local.py::test_user_parameter_default_value[int-0] intake/catalog/tests/test_local.py::test_user_parameter_default_value[list-expected4] intake/catalog/tests/test_local.py::test_user_parameter_default_value[str-] intake/catalog/tests/test_local.py::test_user_parameter_default_value[unicode-] intake/catalog/tests/test_local.py::test_user_parameter_repr intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[bool-true-True] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[bool-0-False] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[datetime-given2-expected2] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[datetime-2018-01-01 intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[datetime-1234567890000000000-expected4] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[float-3.14-3.14] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[int-1-1] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[list-given7-expected7] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[str-1-1] intake/catalog/tests/test_local.py::test_user_parameter_coerce_value[unicode-foo-foo] intake/catalog/tests/test_local.py::test_user_parameter_coerce_special_datetime[now] intake/catalog/tests/test_local.py::test_user_parameter_coerce_special_datetime[today] intake/catalog/tests/test_local.py::test_user_parameter_coerce_min[float-100.0-100.0] intake/catalog/tests/test_local.py::test_user_parameter_coerce_min[int-20-20] intake/catalog/tests/test_local.py::test_user_parameter_coerce_min[int-20.0-20] intake/catalog/tests/test_local.py::test_user_parameter_coerce_max[float-100.0-100.0] intake/catalog/tests/test_local.py::test_user_parameter_coerce_max[int-20-20] intake/catalog/tests/test_local.py::test_user_parameter_coerce_max[int-20.0-20] intake/catalog/tests/test_local.py::test_user_parameter_coerce_allowed[float-given0-expected0] intake/catalog/tests/test_local.py::test_user_parameter_coerce_allowed[int-given1-expected1] intake/catalog/tests/test_local.py::test_user_parameter_validation_range intake/catalog/tests/test_local.py::test_user_parameter_validation_allowed intake/catalog/tests/test_local.py::test_parser_validation_error[catalog_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[data_source_missing] intake/catalog/tests/test_local.py::test_parser_validation_error[data_source_name_non_string] intake/catalog/tests/test_local.py::test_parser_validation_error[data_source_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[data_source_value_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[params_missing_required] intake/catalog/tests/test_local.py::test_parser_validation_error[params_name_non_string] intake/catalog/tests/test_local.py::test_parser_validation_error[params_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[params_value_bad_choice] intake/catalog/tests/test_local.py::test_parser_validation_error[params_value_bad_type] intake/catalog/tests/test_local.py::test_parser_validation_error[params_value_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[plugins_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[plugins_source_missing] intake/catalog/tests/test_local.py::test_parser_validation_error[plugins_source_missing_key] intake/catalog/tests/test_local.py::test_parser_validation_error[plugins_source_non_dict] intake/catalog/tests/test_local.py::test_parser_validation_error[plugins_source_non_list] intake/catalog/tests/test_local.py::test_parser_obsolete_error[obsolete_data_source_list] intake/catalog/tests/test_local.py::test_parser_obsolete_error[obsolete_params_list] intake/catalog/tests/test_local.py::test_union_catalog intake/catalog/tests/test_local.py::test_persist_local_cat intake/catalog/tests/test_local.py::test_empty_catalog intake/catalog/tests/test_local.py::test_nonexistent_error intake/catalog/tests/test_local.py::test_duplicate_data_sources intake/catalog/tests/test_local.py::test_duplicate_parameters intake/catalog/tests/test_local.py::test_catalog_file_removal intake/catalog/tests/test_local.py::test_flatten_duplicate_error intake/catalog/tests/test_local.py::test_multi_cat_names intake/catalog/tests/test_local.py::test_name_of_builtin intake/catalog/tests/test_local.py::test_cat_with_declared_name intake/catalog/tests/test_local.py::test_cat_with_no_declared_name_gets_name_from_dir_if_file_named_catalog intake/catalog/tests/test_local.py::test_default_expansions intake/catalog/tests/test_local.py::test_multi_plugins intake/catalog/tests/test_local.py::test_no_plugins intake/catalog/tests/test_local.py::test_explicit_entry_driver intake/catalog/tests/test_local.py::test_getitem_and_getattr intake/catalog/tests/test_local.py::test_dot_names intake/catalog/tests/test_local.py::test_listing intake/catalog/tests/test_local.py::test_dict_save intake/catalog/tests/test_local.py::test_dict_adddel intake/catalog/tests/test_local.py::test_filter intake/catalog/tests/test_local.py::test_no_instance intake/catalog/tests/test_local.py::test_fsspec_integration intake/catalog/tests/test_local.py::test_cat_add
intake/catalog/base.py
intake/catalog/base.py