Full Code of geopython/pycsw for AI

master 0f25925c59ee cached
1359 files
9.3 MB
2.5M tokens
481 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (10,144K chars total). Download the full file to get everything.
Repository: geopython/pycsw
Branch: master
Commit: 0f25925c59ee
Files: 1359
Total size: 9.3 MB

Directory structure:
gitextract_p9bcr3yi/

├── .coveragerc
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── docker.yml
│       ├── ghcr.yml
│       ├── main.yml
│       ├── stale.yml
│       └── vulnerabilities.yml
├── .gitignore
├── .readthedocs.yaml
├── CODE_OF_CONDUCT.md
├── COMMITTERS.txt
├── CONTRIBUTING.rst
├── Dockerfile
├── HISTORY.txt
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── SECURITY.md
├── csw.py
├── default-sample.yml
├── docker/
│   ├── compose/
│   │   ├── docker-compose.scale.yml
│   │   ├── docker-compose.yml
│   │   └── pycsw.yml
│   ├── entrypoint.py
│   ├── helm/
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── db-data-persistentvolumeclaim.yaml
│   │   │   ├── db-service.yaml
│   │   │   ├── db-statefulset.yaml
│   │   │   ├── pycsw-configmap.yaml
│   │   │   ├── pycsw-deployment.yaml
│   │   │   └── pycsw-service.yaml
│   │   └── values.yaml
│   ├── kubernetes/
│   │   ├── Makefile
│   │   ├── db-data-persistentvolumeclaim.yaml
│   │   ├── db-deployment.yaml
│   │   ├── db-service.yaml
│   │   ├── pycsw-configmap.yaml
│   │   ├── pycsw-deployment.yaml
│   │   └── pycsw-service.yaml
│   ├── min-apk
│   └── pycsw.yml
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   └── favicon/
│   │       └── browserconfig.xml
│   ├── _templates/
│   │   ├── indexsidebar.html
│   │   └── layout.html
│   ├── administration.rst
│   ├── api.rst
│   ├── ckan.rst
│   ├── committers.rst
│   ├── conf.py
│   ├── configuration.rst
│   ├── contributing.rst
│   ├── csw-support.rst
│   ├── distributedsearching.rst
│   ├── docker.rst
│   ├── geonode.rst
│   ├── hhypermap.rst
│   ├── html-templating.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── introduction.rst
│   ├── json.rst
│   ├── license.rst
│   ├── locale/
│   │   ├── el/
│   │   │   └── LC_MESSAGES/
│   │   │       └── .gitkeep
│   │   ├── fr/
│   │   │   └── LC_MESSAGES/
│   │   │       └── .gitkeep
│   │   └── zh/
│   │       └── LC_MESSAGES/
│   │           ├── administration.po
│   │           ├── api.po
│   │           ├── ckan.po
│   │           ├── committers.po
│   │           ├── configuration.po
│   │           ├── contributing.po
│   │           ├── csw-support.po
│   │           ├── distributedsearching.po
│   │           ├── docker.po
│   │           ├── geonode.po
│   │           ├── hhypermap.po
│   │           ├── index.po
│   │           ├── installation.po
│   │           ├── introduction.po
│   │           ├── json.po
│   │           ├── license.po
│   │           ├── migration-guide.po
│   │           ├── oaipmh.po
│   │           ├── oarec-support.po
│   │           ├── odc.po
│   │           ├── opensearch.po
│   │           ├── outputschemas.po
│   │           ├── profiles.po
│   │           ├── repofilters.po
│   │           ├── repositories.po
│   │           ├── sitemaps.po
│   │           ├── soap.po
│   │           ├── sru.po
│   │           ├── stac.po
│   │           ├── support.po
│   │           ├── testing.po
│   │           ├── tools.po
│   │           └── transactions.po
│   ├── metadata-model-reference.rst
│   ├── migration-guide.rst
│   ├── oaipmh.rst
│   ├── oarec-support.rst
│   ├── odc.rst
│   ├── opensearch.rst
│   ├── outputschemas.rst
│   ├── profiles.rst
│   ├── pubsub.rst
│   ├── repofilters.rst
│   ├── repositories.rst
│   ├── requirements-mocked.txt
│   ├── sitemaps.rst
│   ├── soap.rst
│   ├── sru.rst
│   ├── stac.rst
│   ├── support.rst
│   ├── testing.rst
│   ├── tools.rst
│   ├── transactions.rst
│   └── xslt.rst
├── etc/
│   ├── harvest-all.cron
│   ├── mappings.py
│   ├── migrations/
│   │   └── 2.x-3.0/
│   │       └── migrate.sql
│   ├── pycsw
│   ├── pycsw.conf
│   └── pycsw.desktop
├── pycsw/
│   ├── __init__.py
│   ├── broker/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── http.py
│   │   └── mqtt.py
│   ├── core/
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── config.py
│   │   ├── etree.py
│   │   ├── formats/
│   │   │   ├── __init__.py
│   │   │   └── fmt_json.py
│   │   ├── log.py
│   │   ├── metadata.py
│   │   ├── pygeofilter_evaluate.py
│   │   ├── repository.py
│   │   ├── schemas/
│   │   │   ├── catalog.xml
│   │   │   ├── ogc/
│   │   │   │   ├── OGC-SOFTWARE-NOTICE.txt
│   │   │   │   ├── README.txt
│   │   │   │   ├── cat/
│   │   │   │   │   └── csw/
│   │   │   │   │       └── 3.0/
│   │   │   │   │           ├── README.txt
│   │   │   │   │           ├── _wrapper.xsd
│   │   │   │   │           ├── cswAll.xsd
│   │   │   │   │           ├── cswCommon.xsd
│   │   │   │   │           ├── cswGetCapabilities.xsd
│   │   │   │   │           ├── cswGetDomain.xsd
│   │   │   │   │           ├── cswGetRecordById.xsd
│   │   │   │   │           ├── cswGetRecords.xsd
│   │   │   │   │           ├── cswHarvest.xsd
│   │   │   │   │           ├── cswTransaction.xsd
│   │   │   │   │           ├── cswUnHarvest.xsd
│   │   │   │   │           ├── rec-dcmes.xsd
│   │   │   │   │           ├── rec-dcterms.xsd
│   │   │   │   │           └── record.xsd
│   │   │   │   ├── csw/
│   │   │   │   │   └── 2.0.2/
│   │   │   │   │       ├── CSW-discovery.xsd
│   │   │   │   │       ├── CSW-publication.xsd
│   │   │   │   │       ├── rec-dcmes.xsd
│   │   │   │   │       ├── rec-dcterms.xsd
│   │   │   │   │       └── record.xsd
│   │   │   │   ├── filter/
│   │   │   │   │   ├── 1.1.0/
│   │   │   │   │   │   ├── expr.xsd
│   │   │   │   │   │   ├── filter.xsd
│   │   │   │   │   │   ├── filterCapabilities.xsd
│   │   │   │   │   │   └── sort.xsd
│   │   │   │   │   └── 2.0/
│   │   │   │   │       ├── _wrapper.xsd
│   │   │   │   │       ├── expr.xsd
│   │   │   │   │       ├── filter.xsd
│   │   │   │   │       ├── filterAll.xsd
│   │   │   │   │       ├── filterCapabilities.xsd
│   │   │   │   │       ├── query.xsd
│   │   │   │   │       └── sort.xsd
│   │   │   │   ├── gml/
│   │   │   │   │   ├── 3.1.1/
│   │   │   │   │   │   ├── base/
│   │   │   │   │   │   │   ├── basicTypes.xsd
│   │   │   │   │   │   │   ├── coordinateOperations.xsd
│   │   │   │   │   │   │   ├── coordinateReferenceSystems.xsd
│   │   │   │   │   │   │   ├── coordinateSystems.xsd
│   │   │   │   │   │   │   ├── coverage.xsd
│   │   │   │   │   │   │   ├── dataQuality.xsd
│   │   │   │   │   │   │   ├── datums.xsd
│   │   │   │   │   │   │   ├── defaultStyle.xsd
│   │   │   │   │   │   │   ├── dictionary.xsd
│   │   │   │   │   │   │   ├── direction.xsd
│   │   │   │   │   │   │   ├── dynamicFeature.xsd
│   │   │   │   │   │   │   ├── feature.xsd
│   │   │   │   │   │   │   ├── geometryAggregates.xsd
│   │   │   │   │   │   │   ├── geometryBasic0d1d.xsd
│   │   │   │   │   │   │   ├── geometryBasic2d.xsd
│   │   │   │   │   │   │   ├── geometryComplexes.xsd
│   │   │   │   │   │   │   ├── geometryPrimitives.xsd
│   │   │   │   │   │   │   ├── gml.xsd
│   │   │   │   │   │   │   ├── gmlBase.xsd
│   │   │   │   │   │   │   ├── grids.xsd
│   │   │   │   │   │   │   ├── measures.xsd
│   │   │   │   │   │   │   ├── observation.xsd
│   │   │   │   │   │   │   ├── referenceSystems.xsd
│   │   │   │   │   │   │   ├── temporal.xsd
│   │   │   │   │   │   │   ├── temporalReferenceSystems.xsd
│   │   │   │   │   │   │   ├── temporalTopology.xsd
│   │   │   │   │   │   │   ├── topology.xsd
│   │   │   │   │   │   │   ├── units.xsd
│   │   │   │   │   │   │   └── valueObjects.xsd
│   │   │   │   │   │   └── smil/
│   │   │   │   │   │       ├── smil20-language.xsd
│   │   │   │   │   │       └── smil20.xsd
│   │   │   │   │   └── 3.2.1/
│   │   │   │   │       ├── SchematronConstraints.xml
│   │   │   │   │       ├── basicTypes.xsd
│   │   │   │   │       ├── coordinateOperations.xsd
│   │   │   │   │       ├── coordinateReferenceSystems.xsd
│   │   │   │   │       ├── coordinateSystems.xsd
│   │   │   │   │       ├── coverage.xsd
│   │   │   │   │       ├── datums.xsd
│   │   │   │   │       ├── defaultStyle.xsd
│   │   │   │   │       ├── deprecatedTypes.xsd
│   │   │   │   │       ├── dictionary.xsd
│   │   │   │   │       ├── direction.xsd
│   │   │   │   │       ├── dynamicFeature.xsd
│   │   │   │   │       ├── feature.xsd
│   │   │   │   │       ├── geometryAggregates.xsd
│   │   │   │   │       ├── geometryBasic0d1d.xsd
│   │   │   │   │       ├── geometryBasic2d.xsd
│   │   │   │   │       ├── geometryComplexes.xsd
│   │   │   │   │       ├── geometryPrimitives.xsd
│   │   │   │   │       ├── gml.xsd
│   │   │   │   │       ├── gmlBase.xsd
│   │   │   │   │       ├── gml_32_geometries.rdf
│   │   │   │   │       ├── gml_3_2_1-ReadMe.txt
│   │   │   │   │       ├── grids.xsd
│   │   │   │   │       ├── measures.xsd
│   │   │   │   │       ├── observation.xsd
│   │   │   │   │       ├── referenceSystems.xsd
│   │   │   │   │       ├── temporal.xsd
│   │   │   │   │       ├── temporalReferenceSystems.xsd
│   │   │   │   │       ├── temporalTopology.xsd
│   │   │   │   │       ├── topology.xsd
│   │   │   │   │       ├── units.xsd
│   │   │   │   │       └── valueObjects.xsd
│   │   │   │   ├── ogcapi/
│   │   │   │   │   └── records/
│   │   │   │   │       └── part1/
│   │   │   │   │           └── 1.0/
│   │   │   │   │               └── ogcapi-records-1.yaml
│   │   │   │   └── ows/
│   │   │   │       ├── 1.0.0/
│   │   │   │       │   ├── ows19115subset.xsd
│   │   │   │       │   ├── owsAll.xsd
│   │   │   │       │   ├── owsCommon.xsd
│   │   │   │       │   ├── owsDataIdentification.xsd
│   │   │   │       │   ├── owsExceptionReport.xsd
│   │   │   │       │   ├── owsGetCapabilities.xsd
│   │   │   │       │   ├── owsOperationsMetadata.xsd
│   │   │   │       │   ├── owsServiceIdentification.xsd
│   │   │   │       │   └── owsServiceProvider.xsd
│   │   │   │       ├── 1.1.0/
│   │   │   │       │   ├── ows19115subset.xsd
│   │   │   │       │   ├── owsAll.xsd
│   │   │   │       │   ├── owsCommon.xsd
│   │   │   │       │   ├── owsContents.xsd
│   │   │   │       │   ├── owsDataIdentification.xsd
│   │   │   │       │   ├── owsDomainType.xsd
│   │   │   │       │   ├── owsExceptionReport.xsd
│   │   │   │       │   ├── owsGetCapabilities.xsd
│   │   │   │       │   ├── owsGetResourceByID.xsd
│   │   │   │       │   ├── owsInputOutputData.xsd
│   │   │   │       │   ├── owsManifest.xsd
│   │   │   │       │   ├── owsOperationsMetadata.xsd
│   │   │   │       │   ├── owsServiceIdentification.xsd
│   │   │   │       │   └── owsServiceProvider.xsd
│   │   │   │       └── 2.0/
│   │   │   │           ├── ows19115subset.xsd
│   │   │   │           ├── owsAdditionalParameters.xsd
│   │   │   │           ├── owsAll.xsd
│   │   │   │           ├── owsCommon.xsd
│   │   │   │           ├── owsContents.xsd
│   │   │   │           ├── owsDataIdentification.xsd
│   │   │   │           ├── owsDomainType.xsd
│   │   │   │           ├── owsExceptionReport.xsd
│   │   │   │           ├── owsGetCapabilities.xsd
│   │   │   │           ├── owsGetResourceByID.xsd
│   │   │   │           ├── owsInputOutputData.xsd
│   │   │   │           ├── owsManifest.xsd
│   │   │   │           ├── owsOperationsMetadata.xsd
│   │   │   │           ├── owsServiceIdentification.xsd
│   │   │   │           └── owsServiceProvider.xsd
│   │   │   └── w3c/
│   │   │       ├── 1999/
│   │   │       │   └── xlink.xsd
│   │   │       └── 2001/
│   │   │           └── xml.xsd
│   │   └── util.py
│   ├── oaipmh.py
│   ├── ogc/
│   │   ├── __init__.py
│   │   ├── api/
│   │   │   ├── __init__.py
│   │   │   ├── oapi.py
│   │   │   ├── records.py
│   │   │   └── util.py
│   │   ├── csw/
│   │   │   ├── __init__.py
│   │   │   ├── cql.py
│   │   │   ├── csw2.py
│   │   │   └── csw3.py
│   │   ├── fes/
│   │   │   ├── __init__.py
│   │   │   ├── fes1.py
│   │   │   └── fes2.py
│   │   ├── gml/
│   │   │   ├── __init__.py
│   │   │   ├── gml3.py
│   │   │   └── gml32.py
│   │   └── pubsub/
│   │       └── __init__.py
│   ├── opensearch.py
│   ├── plugins/
│   │   ├── __init__.py
│   │   ├── outputschemas/
│   │   │   ├── __init__.py
│   │   │   ├── atom.py
│   │   │   ├── datacite.py
│   │   │   ├── dif.py
│   │   │   ├── fgdc.py
│   │   │   └── gm03.py
│   │   ├── profiles/
│   │   │   ├── __init__.py
│   │   │   ├── apiso/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── apiso.py
│   │   │   │   ├── docs/
│   │   │   │   │   └── apiso.rst
│   │   │   │   └── schemas/
│   │   │   │       └── ogc/
│   │   │   │           ├── csw/
│   │   │   │           │   └── 2.0.2/
│   │   │   │           │       └── profiles/
│   │   │   │           │           └── apiso/
│   │   │   │           │               └── 1.0.0/
│   │   │   │           │                   ├── ReadMe.txt
│   │   │   │           │                   └── apiso.xsd
│   │   │   │           └── iso/
│   │   │   │               └── 19139/
│   │   │   │                   ├── 20060504/
│   │   │   │                   │   ├── ReadMe.txt
│   │   │   │                   │   ├── Version.txt
│   │   │   │                   │   ├── gco/
│   │   │   │                   │   │   ├── basicTypes.xsd
│   │   │   │                   │   │   ├── gco.xsd
│   │   │   │                   │   │   └── gcoBase.xsd
│   │   │   │                   │   ├── gmd/
│   │   │   │                   │   │   ├── applicationSchema.xsd
│   │   │   │                   │   │   ├── citation.xsd
│   │   │   │                   │   │   ├── constraints.xsd
│   │   │   │                   │   │   ├── content.xsd
│   │   │   │                   │   │   ├── dataQuality.xsd
│   │   │   │                   │   │   ├── distribution.xsd
│   │   │   │                   │   │   ├── extent.xsd
│   │   │   │                   │   │   ├── freeText.xsd
│   │   │   │                   │   │   ├── gmd.xsd
│   │   │   │                   │   │   ├── identification.xsd
│   │   │   │                   │   │   ├── maintenance.xsd
│   │   │   │                   │   │   ├── metadataApplication.xsd
│   │   │   │                   │   │   ├── metadataEntity.xsd
│   │   │   │                   │   │   ├── metadataExtension.xsd
│   │   │   │                   │   │   ├── portrayalCatalogue.xsd
│   │   │   │                   │   │   ├── referenceSystem.xsd
│   │   │   │                   │   │   └── spatialRepresentation.xsd
│   │   │   │                   │   ├── gml/
│   │   │   │                   │   │   ├── ReadMe.txt
│   │   │   │                   │   │   ├── basicTypes.xsd
│   │   │   │                   │   │   ├── coordinateOperations.xsd
│   │   │   │                   │   │   ├── coordinateReferenceSystems.xsd
│   │   │   │                   │   │   ├── coordinateSystems.xsd
│   │   │   │                   │   │   ├── coverage.xsd
│   │   │   │                   │   │   ├── datums.xsd
│   │   │   │                   │   │   ├── dictionary.xsd
│   │   │   │                   │   │   ├── direction.xsd
│   │   │   │                   │   │   ├── dynamicFeature.xsd
│   │   │   │                   │   │   ├── feature.xsd
│   │   │   │                   │   │   ├── geometryAggregates.xsd
│   │   │   │                   │   │   ├── geometryBasic0d1d.xsd
│   │   │   │                   │   │   ├── geometryBasic2d.xsd
│   │   │   │                   │   │   ├── geometryComplexes.xsd
│   │   │   │                   │   │   ├── geometryPrimitives.xsd
│   │   │   │                   │   │   ├── gml.xsd
│   │   │   │                   │   │   ├── gmlBase.xsd
│   │   │   │                   │   │   ├── grids.xsd
│   │   │   │                   │   │   ├── measures.xsd
│   │   │   │                   │   │   ├── observation.xsd
│   │   │   │                   │   │   ├── referenceSystems.xsd
│   │   │   │                   │   │   ├── temporal.xsd
│   │   │   │                   │   │   ├── temporalReferenceSystems.xsd
│   │   │   │                   │   │   ├── temporalTopology.xsd
│   │   │   │                   │   │   ├── topology.xsd
│   │   │   │                   │   │   ├── units.xsd
│   │   │   │                   │   │   └── valueObjects.xsd
│   │   │   │                   │   ├── gmx/
│   │   │   │                   │   │   ├── catalogues.xsd
│   │   │   │                   │   │   ├── codelistItem.xsd
│   │   │   │                   │   │   ├── crsItem.xsd
│   │   │   │                   │   │   ├── extendedTypes.xsd
│   │   │   │                   │   │   ├── gmx.xsd
│   │   │   │                   │   │   ├── gmxUsage.xsd
│   │   │   │                   │   │   └── uomItem.xsd
│   │   │   │                   │   ├── gsr/
│   │   │   │                   │   │   ├── gsr.xsd
│   │   │   │                   │   │   └── spatialReferencing.xsd
│   │   │   │                   │   ├── gss/
│   │   │   │                   │   │   ├── geometry.xsd
│   │   │   │                   │   │   └── gss.xsd
│   │   │   │                   │   ├── gts/
│   │   │   │                   │   │   ├── gts.xsd
│   │   │   │                   │   │   └── temporalObjects.xsd
│   │   │   │                   │   ├── resources/
│   │   │   │                   │   │   ├── Codelist/
│   │   │   │                   │   │   │   ├── ML_gmxCodelists.xml
│   │   │   │                   │   │   │   └── gmxCodelists.xml
│   │   │   │                   │   │   ├── crs/
│   │   │   │                   │   │   │   ├── ML_gmxCrs.xml
│   │   │   │                   │   │   │   └── gmxCrs.xml
│   │   │   │                   │   │   ├── example/
│   │   │   │                   │   │   │   └── fr-fr.xml
│   │   │   │                   │   │   └── uom/
│   │   │   │                   │   │       ├── ML_gmxUom.xml
│   │   │   │                   │   │       └── gmxUom.xml
│   │   │   │                   │   └── srv/
│   │   │   │                   │       ├── serviceMetadata.xsd
│   │   │   │                   │       ├── serviceModel.xsd
│   │   │   │                   │       └── srv.xsd
│   │   │   │                   └── 20070417/
│   │   │   │                       ├── ReadMe.txt
│   │   │   │                       ├── gco/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── basicTypes.xsd
│   │   │   │                       │   ├── gco.xsd
│   │   │   │                       │   └── gcoBase.xsd
│   │   │   │                       ├── gmd/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── applicationSchema.xsd
│   │   │   │                       │   ├── citation.xsd
│   │   │   │                       │   ├── constraints.xsd
│   │   │   │                       │   ├── content.xsd
│   │   │   │                       │   ├── dataQuality.xsd
│   │   │   │                       │   ├── distribution.xsd
│   │   │   │                       │   ├── extent.xsd
│   │   │   │                       │   ├── freeText.xsd
│   │   │   │                       │   ├── gmd.xsd
│   │   │   │                       │   ├── identification.xsd
│   │   │   │                       │   ├── maintenance.xsd
│   │   │   │                       │   ├── metadataApplication.xsd
│   │   │   │                       │   ├── metadataEntity.xsd
│   │   │   │                       │   ├── metadataExtension.xsd
│   │   │   │                       │   ├── portrayalCatalogue.xsd
│   │   │   │                       │   ├── referenceSystem.xsd
│   │   │   │                       │   └── spatialRepresentation.xsd
│   │   │   │                       ├── gmx/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── catalogues.xsd
│   │   │   │                       │   ├── codelistItem.xsd
│   │   │   │                       │   ├── crsItem.xsd
│   │   │   │                       │   ├── extendedTypes.xsd
│   │   │   │                       │   ├── gmx.xsd
│   │   │   │                       │   ├── gmxUsage.xsd
│   │   │   │                       │   └── uomItem.xsd
│   │   │   │                       ├── gsr/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── gsr.xsd
│   │   │   │                       │   └── spatialReferencing.xsd
│   │   │   │                       ├── gss/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── geometry.xsd
│   │   │   │                       │   └── gss.xsd
│   │   │   │                       ├── gts/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── gts.xsd
│   │   │   │                       │   └── temporalObjects.xsd
│   │   │   │                       └── resources/
│   │   │   │                           ├── ReadMe.txt
│   │   │   │                           ├── codelist/
│   │   │   │                           │   ├── ML_gmxCodelists.xml
│   │   │   │                           │   ├── gmxCodelists.xml
│   │   │   │                           │   └── tcCodelists.xml
│   │   │   │                           ├── crs/
│   │   │   │                           │   ├── ML_gmxCrs.xml
│   │   │   │                           │   └── gmxCrs.xml
│   │   │   │                           ├── example/
│   │   │   │                           │   └── fr-fr.xml
│   │   │   │                           └── uom/
│   │   │   │                               ├── ML_gmxUom.xml
│   │   │   │                               └── gmxUom.xml
│   │   │   ├── ebrim/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── docs/
│   │   │   │   │   └── ebrim.rst
│   │   │   │   ├── ebrim.py
│   │   │   │   └── schemas/
│   │   │   │       └── ogc/
│   │   │   │           └── csw/
│   │   │   │               └── 2.0.2/
│   │   │   │                   └── profiles/
│   │   │   │                       └── ebrim/
│   │   │   │                           └── 1.0/
│   │   │   │                               ├── csw-ebrim-iri.xsd
│   │   │   │                               ├── csw-ebrim.xsd
│   │   │   │                               └── wsdl/
│   │   │   │                                   ├── 1.1/
│   │   │   │                                   │   ├── csw-ebrim-binding.wsdl
│   │   │   │                                   │   ├── csw-ebrim-interface.wsdl
│   │   │   │                                   │   └── csw-ebrim-service.wsdl
│   │   │   │                                   └── 2.0/
│   │   │   │                                       └── csw-ebrim-interface.wsdl
│   │   │   ├── iso19115p3/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── iso19115p3.py
│   │   │   │   └── schemas/
│   │   │   │       └── ogc/
│   │   │   │           └── iso/
│   │   │   │               └── iso19115-3/
│   │   │   │                   ├── cat/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── cat.xsd
│   │   │   │                   │       ├── catalogues.xsd
│   │   │   │                   │       ├── codelistItem.xsd
│   │   │   │                   │       ├── crsItem.xsd
│   │   │   │                   │       └── uomItem.xsd
│   │   │   │                   ├── cit/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── cit.sch
│   │   │   │                   │   │   ├── cit.xsd
│   │   │   │                   │   │   └── citation.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── cit.xsd
│   │   │   │                   │       └── citation.xsd
│   │   │   │                   ├── gco/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── baseTypes2014.xsd
│   │   │   │                   │       └── gco.xsd
│   │   │   │                   ├── gcx/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── extendedTypes.xsd
│   │   │   │                   │       ├── extendedTypes_autoFromShapeChange.xsd
│   │   │   │                   │       └── gcx.xsd
│   │   │   │                   ├── gex/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── extent.xsd
│   │   │   │                   │       ├── gex.sch
│   │   │   │                   │       └── gex.xsd
│   │   │   │                   ├── gmw/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── gmlWrapperTypes2014.xsd
│   │   │   │                   │       └── gmw.xsd
│   │   │   │                   ├── lan/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── lan.xsd
│   │   │   │                   │       └── language.xsd
│   │   │   │                   ├── mac/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── acquisitionInformationImagery.xsd
│   │   │   │                   │   │   └── mac.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── acquisitionInformationImagery.xsd
│   │   │   │                   │       ├── event.xsd
│   │   │   │                   │       └── mac.xsd
│   │   │   │                   ├── mas/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── applicationSchema.xsd
│   │   │   │                   │       └── mas.xsd
│   │   │   │                   ├── mcc/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── AbstractCommonClasses.xsd
│   │   │   │                   │       ├── commonClasses.xsd
│   │   │   │                   │       └── mcc.xsd
│   │   │   │                   ├── mco/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── constraints.xsd
│   │   │   │                   │       ├── mco.sch
│   │   │   │                   │       └── mco.xsd
│   │   │   │                   ├── md1/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── md1.xsd
│   │   │   │                   │       └── metadataWExtendedType.xsd
│   │   │   │                   ├── md2/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── md2.xsd
│   │   │   │                   │       └── metadataWithExtensions.xsd
│   │   │   │                   ├── mda/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mda.xsd
│   │   │   │                   │       └── metadataApplication.xsd
│   │   │   │                   ├── mdb/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── mdb.sch
│   │   │   │                   │   │   ├── mdb.xsd
│   │   │   │                   │   │   └── metadataBase.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── mdb.sch
│   │   │   │                   │       ├── mdb.xsd
│   │   │   │                   │       └── metadataBase.xsd
│   │   │   │                   ├── mds/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mds.xsd
│   │   │   │                   │       └── metadataDataServices.xsd
│   │   │   │                   ├── mdt/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mdt.xsd
│   │   │   │                   │       └── metadataTransfer.xsd
│   │   │   │                   ├── mex/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── metadataExtension.xsd
│   │   │   │                   │       ├── mex.sch
│   │   │   │                   │       └── mex.xsd
│   │   │   │                   ├── mmi/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── maintenance.xsd
│   │   │   │                   │       ├── mmi.sch
│   │   │   │                   │       └── mmi.xsd
│   │   │   │                   ├── mpc/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mpc.xsd
│   │   │   │                   │       └── portrayalCatalogue.xsd
│   │   │   │                   ├── mrc/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── content.xsd
│   │   │   │                   │   │   ├── contentInformationImagery.xsd
│   │   │   │                   │   │   ├── mrc.sch
│   │   │   │                   │   │   └── mrc.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── content.xsd
│   │   │   │                   │       ├── contentInformationImagery.xsd
│   │   │   │                   │       └── mrc.xsd
│   │   │   │                   ├── mrd/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── distribution.xsd
│   │   │   │                   │       ├── mrd.sch
│   │   │   │                   │       └── mrd.xsd
│   │   │   │                   ├── mri/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── identification.xsd
│   │   │   │                   │       ├── mri.sch
│   │   │   │                   │       └── mri.xsd
│   │   │   │                   ├── mrl/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── lineage.xsd
│   │   │   │                   │   │   ├── lineageImagery.xsd
│   │   │   │                   │   │   └── mrl.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── lineage.xsd
│   │   │   │                   │       ├── lineageImagery.xsd
│   │   │   │                   │       └── mrl.xsd
│   │   │   │                   ├── mrs/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mrs.sch
│   │   │   │                   │       ├── mrs.xsd
│   │   │   │                   │       └── referenceSystem.xsd
│   │   │   │                   ├── msr/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── msr.xsd
│   │   │   │                   │   │   ├── spatialRepresentation.xsd
│   │   │   │                   │   │   └── spatialRepresentationImagery.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── msr.xsd
│   │   │   │                   │       ├── spatialRepresentation.xsd
│   │   │   │                   │       └── spatialRepresentationImagery.xsd
│   │   │   │                   └── srv/
│   │   │   │                       ├── 2.0/
│   │   │   │                       │   ├── serviceInformation.xsd
│   │   │   │                       │   ├── srv.sch
│   │   │   │                       │   └── srv.xsd
│   │   │   │                       └── 2.1/
│   │   │   │                           ├── serviceInformation.xsd
│   │   │   │                           └── srv.xsd
│   │   │   └── profile.py
│   │   └── repository/
│   │       ├── __init__.py
│   │       └── odc/
│   │           ├── __init__.py
│   │           └── odc.py
│   ├── server.py
│   ├── sru.py
│   ├── stac/
│   │   ├── __init__.py
│   │   └── api.py
│   ├── templates/
│   │   ├── _base.html
│   │   ├── collection.html
│   │   ├── collections.html
│   │   ├── conformance.html
│   │   ├── exception.html
│   │   ├── federatedcatalog.html
│   │   ├── federatedcatalogs.html
│   │   ├── item.html
│   │   ├── items.html
│   │   ├── landing_page.html
│   │   ├── openapi.html
│   │   ├── queryables.html
│   │   └── stac_items.html
│   ├── wsgi.py
│   └── wsgi_flask.py
├── pyproject.toml
├── requirements-dev.txt
├── requirements-pg.txt
├── requirements-pubsub.txt
├── requirements-standalone.txt
├── requirements.txt
├── setup.py
├── tests/
│   ├── README.txt
│   ├── conftest.py
│   ├── functionaltests/
│   │   ├── conftest.py
│   │   ├── suites/
│   │   │   ├── apiso/
│   │   │   │   ├── data/
│   │   │   │   │   ├── 3e9a8c05.xml
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000012.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000013.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000014.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000015.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_284404.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288395.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288398.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288401.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276395.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276398.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276401.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_280395.xml
│   │   │   │   │   ├── iso_19115-2_Sentinel-2-scene.xml
│   │   │   │   │   ├── pacioos-NS06agg.xml
│   │   │   │   │   └── test.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-property.xml
│   │   │   │   │   ├── post_GetRecordById-brief.xml
│   │   │   │   │   ├── post_GetRecordById-full-dc.xml
│   │   │   │   │   ├── post_GetRecordById-full.xml
│   │   │   │   │   ├── post_GetRecordById-srv-brief.xml
│   │   │   │   │   ├── post_GetRecords-all-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-all.xml
│   │   │   │   │   ├── post_GetRecords-cql-title.xml
│   │   │   │   │   ├── post_GetRecords-elementname.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox.xml
│   │   │   │   │   └── post_GetRecords-filter-servicetype.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-property.xml
│   │   │   │       ├── GetRecordById-brief.xml
│   │   │   │       ├── GetRecordById-full-dc.xml
│   │   │   │       ├── GetRecordById-full.xml
│   │   │   │       ├── GetRecordById-srv-brief.xml
│   │   │   │       ├── GetRecords-all-csw-output.xml
│   │   │   │       ├── GetRecords-all.xml
│   │   │   │       ├── GetRecords-cql-title.xml
│   │   │   │       ├── GetRecords-elementname.xml
│   │   │   │       ├── GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │       ├── GetRecords-filter-anytext.xml
│   │   │   │       ├── GetRecords-filter-bbox-csw-output.xml
│   │   │   │       ├── GetRecords-filter-bbox.xml
│   │   │   │       └── GetRecords-filter-servicetype.xml
│   │   │   ├── apiso-inspire/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetCapabilities-lang.xml
│   │   │   │   │   └── get_GetCapabilities.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── atom/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_opensearch-description.xml
│   │   │   │   │   ├── get_opensearch-ogc-bbox-and-time.xml
│   │   │   │   │   ├── get_opensearch-ogc-bbox.xml
│   │   │   │   │   ├── get_opensearch-ogc-count-and-page1.xml
│   │   │   │   │   ├── get_opensearch-ogc-count-and-page2.xml
│   │   │   │   │   ├── get_opensearch-ogc-q-and-bbox.xml
│   │   │   │   │   ├── get_opensearch-ogc-q-and-time.xml
│   │   │   │   │   ├── get_opensearch-ogc-q.xml
│   │   │   │   │   ├── get_opensearch-ogc-time.xml
│   │   │   │   │   ├── get_opensearch-ogc-timeend.xml
│   │   │   │   │   ├── get_opensearch-ogc-timestart.xml
│   │   │   │   │   ├── get_opensearch.xml
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── cite/
│   │   │   │   ├── data/
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml
│   │   │   │   │   ├── Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml
│   │   │   │   │   ├── Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml
│   │   │   │   │   ├── Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml
│   │   │   │   │   ├── Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml
│   │   │   │   │   ├── Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml
│   │   │   │   │   ├── Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml
│   │   │   │   │   ├── Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml
│   │   │   │   │   ├── Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml
│   │   │   │   │   ├── Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml
│   │   │   │   │   ├── Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml
│   │   │   │   │   └── Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_27e17158-c57a-4493-92ac-dba8934cf462.xml
│   │   │   │   │   ├── get_27f69b66-5f05-4311-a89c-73ca55c2686b.xml
│   │   │   │   │   ├── get_2ab7d1fa-885b-459f-80e4-b6282eab4f8c.xml
│   │   │   │   │   ├── get_37aa90e2-6ff0-420c-af15-8b9463099a73.xml
│   │   │   │   │   ├── get_3a8a3c47-455f-4f49-9078-03119f3e70b3.xml
│   │   │   │   │   ├── get_4515831f-834a-4699-95f6-ab0c2cbfcfd0.xml
│   │   │   │   │   ├── get_477b23a3-baa9-47c8-9541-5fe27735ed49.xml
│   │   │   │   │   ├── get_48f26761-3a9d-48db-bee1-da089f5fb857.xml
│   │   │   │   │   ├── get_4e38092f-1586-44b8-988e-0acfa5855916.xml
│   │   │   │   │   ├── get_55c38f00-2553-42c1-99ab-33edbb561ad7.xml
│   │   │   │   │   ├── get_5ab5db18-c87a-4fbf-a8d8-b7289b09ac81.xml
│   │   │   │   │   ├── get_6a4f57ca-a1bd-4802-89c2-44860dbdb0f0.xml
│   │   │   │   │   ├── get_6c375703-9c00-4aef-bec7-d2e964f849eb.xml
│   │   │   │   │   ├── get_80f31def-4185-48b9-983a-960566918eae.xml
│   │   │   │   │   ├── get_8e2232ed-05d9-44ae-8b04-0911cbe6a507.xml
│   │   │   │   │   ├── get_9697f0aa-3b6a-4125-83a5-61e8826127c4.xml
│   │   │   │   │   ├── get_9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7.xml
│   │   │   │   │   ├── get_b81c3595-06d6-4693-82ea-1ff8650755ac.xml
│   │   │   │   │   ├── get_ba5fc729-3b71-47a0-b7d0-42ec565cd185.xml
│   │   │   │   │   ├── get_c4ea754f-c158-4d8d-8253-dc8f86021b52.xml
│   │   │   │   │   ├── get_f4692ec5-9547-4a05-88ab-e6154af2640a.xml
│   │   │   │   │   ├── get_f997f25e-c865-4d53-a362-0ed1846337f2.xml
│   │   │   │   │   ├── post_0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
│   │   │   │   │   ├── post_19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
│   │   │   │   │   ├── post_1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
│   │   │   │   │   ├── post_1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
│   │   │   │   │   ├── post_1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
│   │   │   │   │   ├── post_2102a460-5d62-465f-9668-d70b3faafbfa.xml
│   │   │   │   │   ├── post_225f455a-0035-486b-a94e-fee7ae881b2b.xml
│   │   │   │   │   ├── post_2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
│   │   │   │   │   ├── post_34a019a9-1581-42cb-9827-fbfdda2773b7.xml
│   │   │   │   │   ├── post_3e76fd38-e035-41c9-83dc-61356f680c97.xml
│   │   │   │   │   ├── post_418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
│   │   │   │   │   ├── post_420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
│   │   │   │   │   ├── post_4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
│   │   │   │   │   ├── post_5c5861bc-f742-40a5-9998-5342615d674b.xml
│   │   │   │   │   ├── post_6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
│   │   │   │   │   ├── post_73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
│   │   │   │   │   ├── post_78297c88-4850-4927-adc6-511cd9a3d539.xml
│   │   │   │   │   ├── post_7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
│   │   │   │   │   ├── post_7e2cd105-daec-4d25-bc8e-d49d21364912.xml
│   │   │   │   │   ├── post_87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
│   │   │   │   │   ├── post_88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
│   │   │   │   │   ├── post_898cd63b-2585-4ec0-8720-d554bd324174.xml
│   │   │   │   │   ├── post_8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
│   │   │   │   │   ├── post_928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
│   │   │   │   │   ├── post_93bdbb9d-2734-4f01-92fb-48634cca41de.xml
│   │   │   │   │   ├── post_948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
│   │   │   │   │   ├── post_9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
│   │   │   │   │   ├── post_a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
│   │   │   │   │   ├── post_ad61686c-d304-42d1-b845-8c1f3070c83e.xml
│   │   │   │   │   ├── post_af39c020-7b1d-429c-b474-f45c3164cb79.xml
│   │   │   │   │   ├── post_b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
│   │   │   │   │   ├── post_ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
│   │   │   │   │   ├── post_bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
│   │   │   │   │   ├── post_c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
│   │   │   │   │   ├── post_c311a342-72e3-4983-be39-868e6ed9740f.xml
│   │   │   │   │   ├── post_c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
│   │   │   │   │   ├── post_c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
│   │   │   │   │   ├── post_da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
│   │   │   │   │   ├── post_dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
│   │   │   │   │   ├── post_dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
│   │   │   │   │   ├── post_e308f030-c097-4036-a838-44bad74c9ef7.xml
│   │   │   │   │   ├── post_e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
│   │   │   │   │   ├── post_f7976c55-a156-4421-8199-bc0487da4b0f.xml
│   │   │   │   │   ├── post_f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
│   │   │   │   │   ├── post_fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
│   │   │   │   │   └── post_fe20960f-a26c-4f13-852d-470a0d3233f9.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── 0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
│   │   │   │       ├── 19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
│   │   │   │       ├── 1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
│   │   │   │       ├── 1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
│   │   │   │       ├── 1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
│   │   │   │       ├── 2102a460-5d62-465f-9668-d70b3faafbfa.xml
│   │   │   │       ├── 225f455a-0035-486b-a94e-fee7ae881b2b.xml
│   │   │   │       ├── 2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
│   │   │   │       ├── 34a019a9-1581-42cb-9827-fbfdda2773b7.xml
│   │   │   │       ├── 3e76fd38-e035-41c9-83dc-61356f680c97.xml
│   │   │   │       ├── 418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
│   │   │   │       ├── 420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
│   │   │   │       ├── 4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
│   │   │   │       ├── 5c5861bc-f742-40a5-9998-5342615d674b.xml
│   │   │   │       ├── 6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
│   │   │   │       ├── 73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
│   │   │   │       ├── 78297c88-4850-4927-adc6-511cd9a3d539.xml
│   │   │   │       ├── 7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
│   │   │   │       ├── 7e2cd105-daec-4d25-bc8e-d49d21364912.xml
│   │   │   │       ├── 87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
│   │   │   │       ├── 88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
│   │   │   │       ├── 898cd63b-2585-4ec0-8720-d554bd324174.xml
│   │   │   │       ├── 8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
│   │   │   │       ├── 928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
│   │   │   │       ├── 93bdbb9d-2734-4f01-92fb-48634cca41de.xml
│   │   │   │       ├── 948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
│   │   │   │       ├── 9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
│   │   │   │       ├── a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
│   │   │   │       ├── ad61686c-d304-42d1-b845-8c1f3070c83e.xml
│   │   │   │       ├── af39c020-7b1d-429c-b474-f45c3164cb79.xml
│   │   │   │       ├── b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
│   │   │   │       ├── ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
│   │   │   │       ├── bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
│   │   │   │       ├── c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
│   │   │   │       ├── c311a342-72e3-4983-be39-868e6ed9740f.xml
│   │   │   │       ├── c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
│   │   │   │       ├── c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
│   │   │   │       ├── da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
│   │   │   │       ├── dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
│   │   │   │       ├── dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
│   │   │   │       ├── e308f030-c097-4036-a838-44bad74c9ef7.xml
│   │   │   │       ├── e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
│   │   │   │       ├── f7976c55-a156-4421-8199-bc0487da4b0f.xml
│   │   │   │       ├── f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
│   │   │   │       ├── fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
│   │   │   │       └── fe20960f-a26c-4f13-852d-470a0d3233f9.xml
│   │   │   ├── csw30/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_002258f0-627f-457f-b2ad-025777c77ac8.xml
│   │   │   │   │   ├── get_045c600d-973d-41eb-9f60-eba1b717b720.xml
│   │   │   │   │   ├── get_0bbcf862-5211-4351-9988-63f8bec49c98.xml
│   │   │   │   │   ├── get_0bdf8457-971e-4ed1-be4a-5feca4dcd8fa.xml
│   │   │   │   │   ├── get_0d8bbdec-0846-42ca-8dc8-b7f4cba41d67.xml
│   │   │   │   │   ├── get_0e1dca37-477a-4060-99fe-7799b52d656c.xml
│   │   │   │   │   ├── get_13c87956-51a4-4780-a8e9-6e0b5c0bb473.xml
│   │   │   │   │   ├── get_151d982f-ebd3-4cb2-b507-a667713a1e92.xml
│   │   │   │   │   ├── get_1869e495-1a61-4713-8285-76d1336ee1a6.xml
│   │   │   │   │   ├── get_1bcb42a9-538c-4f0a-9d4c-d6f10b720aa6.xml
│   │   │   │   │   ├── get_22f44168-2ccf-4801-ad96-204212566d56.xml
│   │   │   │   │   ├── get_2499a9c9-8d33-449c-bc92-d494adfcc84d.xml
│   │   │   │   │   ├── get_27f4f39c-d92a-4e3c-b961-c6aa8c24e513.xml
│   │   │   │   │   ├── get_28e569df-8596-4128-8d9a-29ad03138915.xml
│   │   │   │   │   ├── get_2b06a5c8-0df2-4af1-8d2e-a425de11c845.xml
│   │   │   │   │   ├── get_2ba1418a-444d-4cce-9cfe-4c94efcf8b55.xml
│   │   │   │   │   ├── get_397fe17a-d5b4-4f96-8cc4-4ce467ed4d0a.xml
│   │   │   │   │   ├── get_3dcd1b15-73d2-4b7d-a3e3-ff15bf14aae4.xml
│   │   │   │   │   ├── get_405e1ff1-5c75-4846-a28b-cfaff2a6921a.xml
│   │   │   │   │   ├── get_43cd6471-6ac7-45bd-8ff9-148cb2de9a52.xml
│   │   │   │   │   ├── get_4566d2ec-1283-4a02-baed-a74fc5b47e37.xml
│   │   │   │   │   ├── get_461bd4c5-6623-490d-9036-d91a2201e87b.xml
│   │   │   │   │   ├── get_5496894a-3877-4f62-a20b-5d7126f94925.xml
│   │   │   │   │   ├── get_5a015f6a-bf14-4977-b1e3-6577eb0223c8.xml
│   │   │   │   │   ├── get_5c3a2390-1fb9-43f0-b96c-f48c7a69c990.xml
│   │   │   │   │   ├── get_5e9e67dc-18d6-4645-8111-c6263c88a61f.xml
│   │   │   │   │   ├── get_604d9379-741c-42e5-b4cf-92e56c87fa64.xml
│   │   │   │   │   ├── get_60e6af95-d5fc-465a-82e2-fd2e6d85e4af.xml
│   │   │   │   │   ├── get_62ad94c2-b558-4265-a427-23d6677975d6.xml
│   │   │   │   │   ├── get_6a5e247b-0961-4b8a-a0d6-35a491d9cfe7.xml
│   │   │   │   │   ├── get_6a9d0558-9d87-495b-b999-b49a3ef1cf99.xml
│   │   │   │   │   ├── get_6bd790c9-6019-4652-9c91-330a894d6700.xml
│   │   │   │   │   ├── get_6e9cba43-5e27-415d-adbd-a92851c2c173.xml
│   │   │   │   │   ├── get_7630d230-e142-4a09-accf-f091000b90cd.xml
│   │   │   │   │   ├── get_7e82446a-b5dc-43fe-9a73-4cc1f2f2f0bf.xml
│   │   │   │   │   ├── get_8025978e-1a35-4d70-80c2-e8329e0c7864.xml
│   │   │   │   │   ├── get_8184ae4f-536d-4978-8b28-ad703be96967.xml
│   │   │   │   │   ├── get_88f63a89-664f-4315-b4f8-04a0b33803a7.xml
│   │   │   │   │   ├── get_8987f8f0-4d93-4481-968c-a2ccbd6b8be2.xml
│   │   │   │   │   ├── get_8e5fa0f6-3f29-4d1f-abe2-d9866f3def98.xml
│   │   │   │   │   ├── get_9000ec29-5649-474e-b2d6-55c00f8a52c0.xml
│   │   │   │   │   ├── get_91914d35-7bbf-45e6-9b37-5ef484869a4e.xml
│   │   │   │   │   ├── get_92d4844d-57d5-4cf3-8f47-ba50e369dc04.xml
│   │   │   │   │   ├── get_9c0e2a4b-b4e6-41c0-b630-c8c99fc89ff3.xml
│   │   │   │   │   ├── get_9d7ffac8-9798-428d-8e27-3cd12497ee6b.xml
│   │   │   │   │   ├── get_Exception-GetDomain-value-reference.xml
│   │   │   │   │   ├── get_Exception-GetDomain.xml
│   │   │   │   │   ├── get_Exception-GetRecordById-404.xml
│   │   │   │   │   ├── get_Exception-GetRecordById-dc.xml.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-notfound.xml
│   │   │   │   │   ├── get_Exception-invalid-request.xml
│   │   │   │   │   ├── get_GetCapabilities-base-url.xml
│   │   │   │   │   ├── get_GetCapabilities-no-version.xml
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   ├── get_GetDomain-parameter.xml
│   │   │   │   │   ├── get_GetDomain-value-reference.xml
│   │   │   │   │   ├── get_GetRepositoryItem.xml
│   │   │   │   │   ├── get_OpenSearch-description.xml
│   │   │   │   │   ├── get_a2f18643-e24e-4fa5-b780-6de4a2dbc814.xml
│   │   │   │   │   ├── get_abc90c8c-5868-4405-a73e-64c849be3b2a.xml
│   │   │   │   │   ├── get_ad0c0571-09ed-436a-9a4f-a5de744c88fe.xml
│   │   │   │   │   ├── get_af502903-f4ee-47ee-b76e-af878d238bcc.xml
│   │   │   │   │   ├── get_b2aafc3f-4f35-47bc-affd-08590972deae.xml
│   │   │   │   │   ├── get_b6069623-f7d8-4021-8582-98f0aea0f763.xml
│   │   │   │   │   ├── get_b9a07a54-75a8-45bd-b341-2823600211e3.xml
│   │   │   │   │   ├── get_baa4a7d0-0c01-42b6-adc3-0d03e9949fa3.xml
│   │   │   │   │   ├── get_bfbe6409-f64a-4c89-acb3-50f260a5c743.xml
│   │   │   │   │   ├── get_bfe20134-d1da-42ef-9c0f-8e1307bbf92b.xml
│   │   │   │   │   ├── get_c03d173a-3f42-4956-89c8-1fe02c3a0873.xml
│   │   │   │   │   ├── get_cb43d8c3-e14c-4a9f-9231-4384b7dd21f3.xml
│   │   │   │   │   ├── get_d03c6fd3-e821-4a26-b62f-d20a474e25af.xml
│   │   │   │   │   ├── get_d4ccbf96-a529-480e-a53d-5b88dc1dea7f.xml
│   │   │   │   │   ├── get_d94c801a-1207-4897-b84a-53f3a192515b.xml
│   │   │   │   │   ├── get_da859e34-91fc-495a-8c09-285a40c0900b.xml
│   │   │   │   │   ├── get_dc246fb8-5af5-4fda-82bb-c18b3ecd439c.xml
│   │   │   │   │   ├── get_de016645-6d5c-4855-943c-2db07ae9f49a.xml
│   │   │   │   │   ├── get_dff3ec6b-bb2d-4887-bd17-8fcf15def042.xml
│   │   │   │   │   ├── get_e38e6bfb-8ac4-4ae4-8b87-0aafbc8d3c6b.xml
│   │   │   │   │   ├── get_e67ca935-d65d-4d8c-8302-1405333dded0.xml
│   │   │   │   │   ├── get_e7704509-3441-458f-8ef0-e333c6b6043f.xml
│   │   │   │   │   ├── get_f1223a49-6d08-44ff-97fe-4c32cbbfad82.xml
│   │   │   │   │   ├── get_f89dd4e1-3a81-4433-afd2-a3fa1bdb1e18.xml
│   │   │   │   │   ├── post_Exception-GetDomain-parametername-bad.xml
│   │   │   │   │   ├── post_Exception-GetDomain-valuereference-bad.xml
│   │   │   │   │   ├── post_Exception-GetRecordById-404.xml
│   │   │   │   │   ├── post_Exception-GetRecordById-bad-esn.xml
│   │   │   │   │   ├── post_Exception-bad-xml.xml
│   │   │   │   │   ├── post_Exception-not-xml.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parametername.xml
│   │   │   │   │   ├── post_GetDomain-valuereference.xml
│   │   │   │   │   ├── post_GetRecordById-dc-full.xml
│   │   │   │   │   ├── post_GetRecordById-dc.xml
│   │   │   │   │   └── post_GetRecords-anytext.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── Exception-GetDomain-parametername-bad.xml
│   │   │   │       ├── Exception-GetDomain-valuereference-bad.xml
│   │   │   │       ├── Exception-GetRecordById-404.xml
│   │   │   │       ├── Exception-GetRecordById-bad-esn.xml
│   │   │   │       ├── Exception-bad-xml.xml
│   │   │   │       ├── Exception-not-xml.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parametername.xml
│   │   │   │       ├── GetDomain-valuereference.xml
│   │   │   │       ├── GetRecordById-dc-full.xml
│   │   │   │       ├── GetRecordById-dc.xml
│   │   │   │       └── GetRecords-anytext.xml
│   │   │   ├── default/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-notfound.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-service-invalid1.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-service-invalid2.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-version-invalid.xml
│   │   │   │   │   ├── get_GetCapabilities-invalid-request.xml
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   ├── get_GetRecords-all.xml
│   │   │   │   │   ├── get_GetRecords-empty-maxrecords.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-or-abstract-with-spaces.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-or-abstract.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-with-spaces-or-abstract-with-spaces.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-with-spaces-or-abstract.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-with-spaces.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title.xml
│   │   │   │   │   ├── get_GetRecords-filter.xml
│   │   │   │   │   ├── get_GetRecords-sortby-asc.xml
│   │   │   │   │   ├── get_GetRecords-sortby-desc.xml
│   │   │   │   │   ├── get_GetRecords-sortby-invalid-order.xml
│   │   │   │   │   ├── get_GetRecords-sortby-invalid-propertyname.xml
│   │   │   │   │   ├── get_GetRepositoryItem.xml
│   │   │   │   │   ├── post_DescribeRecord-json.xml
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_Exception-GetRecords-badsrsname.xml
│   │   │   │   │   ├── post_Exception-GetRecords-elementname.xml
│   │   │   │   │   ├── post_Exception-GetRecords-invalid-xml.xml
│   │   │   │   │   ├── post_GetCapabilities-SOAP.xml
│   │   │   │   │   ├── post_GetCapabilities-sections.xml
│   │   │   │   │   ├── post_GetCapabilities-updatesequence.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parameter.xml
│   │   │   │   │   ├── post_GetDomain-property.xml
│   │   │   │   │   ├── post_GetRecordById-json.xml
│   │   │   │   │   ├── post_GetRecordById.xml
│   │   │   │   │   ├── post_GetRecords-all-json.xml
│   │   │   │   │   ├── post_GetRecords-all-resulttype-hits.xml
│   │   │   │   │   ├── post_GetRecords-all-resulttype-validate.xml
│   │   │   │   │   ├── post_GetRecords-all-sortby-bbox.xml
│   │   │   │   │   ├── post_GetRecords-all.xml
│   │   │   │   │   ├── post_GetRecords-bbox-filter-crs84.xml
│   │   │   │   │   ├── post_GetRecords-cql-title-and-abstract.xml
│   │   │   │   │   ├── post_GetRecords-cql-title.xml
│   │   │   │   │   ├── post_GetRecords-distributedsearch.xml
│   │   │   │   │   ├── post_GetRecords-elementname.xml
│   │   │   │   │   ├── post_GetRecords-end.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-bbox-freetext.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-or-multiple.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-or.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-or2.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext-and-not.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext-equal.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-poslist.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-reproject.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-sortby.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox.xml
│   │   │   │   │   ├── post_GetRecords-filter-between.xml
│   │   │   │   │   ├── post_GetRecords-filter-function-bad.xml
│   │   │   │   │   ├── post_GetRecords-filter-function.xml
│   │   │   │   │   ├── post_GetRecords-filter-invalid-poslist.xml
│   │   │   │   │   ├── post_GetRecords-filter-not-bbox.xml
│   │   │   │   │   ├── post_GetRecords-filter-or-bbox-freetext.xml
│   │   │   │   │   ├── post_GetRecords-filter-or-nested-and.xml
│   │   │   │   │   ├── post_GetRecords-filter-or-title-abstract.xml
│   │   │   │   │   ├── post_GetRecords-maxrecords.xml
│   │   │   │   │   ├── post_GetRecords-requestid.xml
│   │   │   │   │   ├── post_Harvest-default.xml
│   │   │   │   │   ├── post_Harvest-response-handler.xml
│   │   │   │   │   ├── post_Transaction-delete.xml
│   │   │   │   │   ├── post_Transaction-insert.xml
│   │   │   │   │   ├── post_Transaction-update-full.xml
│   │   │   │   │   └── post_Transaction-update-recordproperty.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord-json.xml
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── Exception-GetRecords-badsrsname.xml
│   │   │   │       ├── Exception-GetRecords-elementname.xml
│   │   │   │       ├── Exception-GetRecords-invalid-xml.xml
│   │   │   │       ├── GetCapabilities-SOAP.xml
│   │   │   │       ├── GetCapabilities-sections.xml
│   │   │   │       ├── GetCapabilities-updatesequence.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parameter.xml
│   │   │   │       ├── GetDomain-property.xml
│   │   │   │       ├── GetRecordById-json.xml
│   │   │   │       ├── GetRecordById.xml
│   │   │   │       ├── GetRecords-all-json.xml
│   │   │   │       ├── GetRecords-all-resulttype-hits.xml
│   │   │   │       ├── GetRecords-all-resulttype-validate.xml
│   │   │   │       ├── GetRecords-all-sortby-bbox.xml
│   │   │   │       ├── GetRecords-all.xml
│   │   │   │       ├── GetRecords-bbox-filter-crs84.xml
│   │   │   │       ├── GetRecords-cql-title-and-abstract.xml
│   │   │   │       ├── GetRecords-cql-title.xml
│   │   │   │       ├── GetRecords-distributedsearch.xml
│   │   │   │       ├── GetRecords-elementname.xml
│   │   │   │       ├── GetRecords-end.xml
│   │   │   │       ├── GetRecords-filter-and-bbox-freetext.xml
│   │   │   │       ├── GetRecords-filter-and-nested-or-multiple.xml
│   │   │   │       ├── GetRecords-filter-and-nested-or.xml
│   │   │   │       ├── GetRecords-filter-and-nested-or2.xml
│   │   │   │       ├── GetRecords-filter-anytext-and-not.xml
│   │   │   │       ├── GetRecords-filter-anytext-equal.xml
│   │   │   │       ├── GetRecords-filter-anytext.xml
│   │   │   │       ├── GetRecords-filter-bbox-poslist.xml
│   │   │   │       ├── GetRecords-filter-bbox-reproject.xml
│   │   │   │       ├── GetRecords-filter-bbox-sortby.xml
│   │   │   │       ├── GetRecords-filter-bbox.xml
│   │   │   │       ├── GetRecords-filter-between.xml
│   │   │   │       ├── GetRecords-filter-function-bad.xml
│   │   │   │       ├── GetRecords-filter-function.xml
│   │   │   │       ├── GetRecords-filter-invalid-poslist.xml
│   │   │   │       ├── GetRecords-filter-not-bbox.xml
│   │   │   │       ├── GetRecords-filter-or-bbox-freetext.xml
│   │   │   │       ├── GetRecords-filter-or-nested-and.xml
│   │   │   │       ├── GetRecords-filter-or-title-abstract.xml
│   │   │   │       ├── GetRecords-maxrecords.xml
│   │   │   │       ├── GetRecords-requestid.xml
│   │   │   │       ├── Harvest-default.xml
│   │   │   │       ├── Harvest-response-handler.xml
│   │   │   │       ├── Transaction-delete.xml
│   │   │   │       ├── Transaction-insert.xml
│   │   │   │       ├── Transaction-update-full.xml
│   │   │   │       └── Transaction-update-recordproperty.xml
│   │   │   ├── dif/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── duplicatefileid/
│   │   │   │   ├── data/
│   │   │   │   │   └── isos/
│   │   │   │   │       └── tds.maracoos.org/
│   │   │   │   │           └── iso/
│   │   │   │   │               ├── AVHRR.2011.7Agg.xml
│   │   │   │   │               └── AVHRR.2012.7Agg.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-all.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       └── GetRecords-all.xml
│   │   │   ├── ebrim/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-full.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetRecords-filter-bbox-full.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── fgdc/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── gm03/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── harvesting/
│   │   │   │   ├── data/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_Exception-Harvest-invalid-resourcetype.xml
│   │   │   │   │   ├── get_Exception-Harvest-missing-resourcetype.xml
│   │   │   │   │   ├── get_Exception-Harvest-missing-source.xml
│   │   │   │   │   ├── get_Exception-Harvest-waf-bad-value.xml
│   │   │   │   │   ├── get_Exception-Harvest-waf-no-records-found.xml
│   │   │   │   │   ├── post_Clear-000-delete-all.xml
│   │   │   │   │   ├── post_Exception-Havest-csw-404.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parameter.xml
│   │   │   │   │   ├── post_Harvest-csw-iso.xml
│   │   │   │   │   ├── post_Harvest-csw-run1.xml
│   │   │   │   │   ├── post_Harvest-csw-run2.xml
│   │   │   │   │   ├── post_Harvest-dc.xml
│   │   │   │   │   ├── post_Harvest-fgdc.xml
│   │   │   │   │   ├── post_Harvest-iso.xml
│   │   │   │   │   ├── post_Harvest-rdf.xml
│   │   │   │   │   ├── post_Harvest-sos100.xml
│   │   │   │   │   ├── post_Harvest-sos200.xml
│   │   │   │   │   ├── post_Harvest-waf.xml
│   │   │   │   │   ├── post_Harvest-wcs.xml
│   │   │   │   │   ├── post_Harvest-wfs110.xml
│   │   │   │   │   ├── post_Harvest-wfs200.xml
│   │   │   │   │   ├── post_Harvest-wms-run1.xml
│   │   │   │   │   ├── post_Harvest-wms-run2.xml
│   │   │   │   │   ├── post_Harvest-wmts.xml
│   │   │   │   │   ├── post_Harvest-wps.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wms-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wms-iso.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wms-layer.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wps-process.xml
│   │   │   │   │   └── post_Transaction-000-delete-all.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── Clear-000-delete-all.xml
│   │   │   │       ├── Exception-Havest-csw-404.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parameter.xml
│   │   │   │       ├── Harvest-csw-iso.xml
│   │   │   │       ├── Harvest-csw-run1.xml
│   │   │   │       ├── Harvest-csw-run2.xml
│   │   │   │       ├── Harvest-dc.xml
│   │   │   │       ├── Harvest-fgdc.xml
│   │   │   │       ├── Harvest-iso.xml
│   │   │   │       ├── Harvest-rdf.xml
│   │   │   │       ├── Harvest-sos100.xml
│   │   │   │       ├── Harvest-sos200.xml
│   │   │   │       ├── Harvest-waf.xml
│   │   │   │       ├── Harvest-wcs.xml
│   │   │   │       ├── Harvest-wfs110.xml
│   │   │   │       ├── Harvest-wfs200.xml
│   │   │   │       ├── Harvest-wms-run1.xml
│   │   │   │       ├── Harvest-wms-run2.xml
│   │   │   │       ├── Harvest-wmts.xml
│   │   │   │       ├── Harvest-wps.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-ows-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-sos-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-sos-iso.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wms-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wms-iso.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wms-layer.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wps-process.xml
│   │   │   │       └── Transaction-000-delete-all.xml
│   │   │   ├── idswithpaths/
│   │   │   │   ├── data/
│   │   │   │   │   ├── file_id_as_url.xml
│   │   │   │   │   ├── file_id_starting_with_forward_slash.xml
│   │   │   │   │   ├── file_id_with_colon.xml
│   │   │   │   │   ├── file_id_with_directory_changes.xml
│   │   │   │   │   ├── file_id_with_driveletter_and_backslashes.xml
│   │   │   │   │   └── file_id_with_foward_slashes.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   └── get_GetCapabilities.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── iso19115p3/
│   │   │   │   ├── data/
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── auscope-3d-model.xml
│   │   │   │   │   ├── auscope-iso19139-geoprovinces.xml
│   │   │   │   │   ├── metawal.wallonie.be-catchments.xml
│   │   │   │   │   └── metawal.wallonie.be-srv.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_DescribeRecord.xml
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-property.xml
│   │   │   │   │   ├── post_GetRecordById-ISO19139-full.xml
│   │   │   │   │   ├── post_GetRecordById-brief.xml
│   │   │   │   │   ├── post_GetRecordById-full-dc.xml
│   │   │   │   │   ├── post_GetRecordById-full.xml
│   │   │   │   │   ├── post_GetRecordById-srv-brief.xml
│   │   │   │   │   ├── post_GetRecords-all-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-all.xml
│   │   │   │   │   ├── post_GetRecords-cql-title.xml
│   │   │   │   │   ├── post_GetRecords-elementname.xml
│   │   │   │   │   ├── post_GetRecords-filter-accessconstraints.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox.xml
│   │   │   │   │   ├── post_GetRecords-filter-date.xml
│   │   │   │   │   ├── post_Transaction-delete.xml
│   │   │   │   │   ├── post_Transaction-insert.xml
│   │   │   │   │   ├── post_Transaction-update-full.xml
│   │   │   │   │   └── post_Transaction-update-recordproperty.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-property.xml
│   │   │   │       ├── GetRecordById-ISO19139-full.xml
│   │   │   │       ├── GetRecordById-brief.xml
│   │   │   │       ├── GetRecordById-full-dc.xml
│   │   │   │       ├── GetRecordById-full.xml
│   │   │   │       ├── GetRecordById-srv-brief.xml
│   │   │   │       ├── GetRecords-all-csw-output.xml
│   │   │   │       ├── GetRecords-all.xml
│   │   │   │       ├── GetRecords-cql-title.xml
│   │   │   │       ├── GetRecords-elementname.xml
│   │   │   │       ├── GetRecords-filter-accessconstraints.xml
│   │   │   │       ├── GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │       ├── GetRecords-filter-anytext.xml
│   │   │   │       ├── GetRecords-filter-bbox-csw-output.xml
│   │   │   │       ├── GetRecords-filter-bbox.xml
│   │   │   │       ├── GetRecords-filter-date.xml
│   │   │   │       ├── Transaction-delete.xml
│   │   │   │       ├── Transaction-insert.xml
│   │   │   │       ├── Transaction-update-full.xml
│   │   │   │       └── Transaction-update-recordproperty.xml
│   │   │   ├── manager/
│   │   │   │   ├── data/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_Clear-000-delete-all.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parameter.xml
│   │   │   │   │   ├── post_Transaction-000-delete-all.xml
│   │   │   │   │   ├── post_Transaction-dc-01-insert.xml
│   │   │   │   │   ├── post_Transaction-dc-02-update-full.xml
│   │   │   │   │   ├── post_Transaction-fgdc-01-insert.xml
│   │   │   │   │   ├── post_Transaction-fgdc-02-update-recprop.xml
│   │   │   │   │   ├── post_Transaction-fgdc-03-delete-all.xml
│   │   │   │   │   ├── post_Transaction-iso-00-delete-all.xml
│   │   │   │   │   ├── post_Transaction-iso-01-insert.xml
│   │   │   │   │   ├── post_Transaction-iso-02-update-full.xml
│   │   │   │   │   ├── post_Transaction-iso-03-update-recprop.xml
│   │   │   │   │   ├── post_Transaction-iso-04-update-recprop-no-matches.xml
│   │   │   │   │   ├── post_Transaction-iso-05-delete.xml
│   │   │   │   │   └── post_Transaction-xxx-delete-all.xml
│   │   │   │   └── post/
│   │   │   │       ├── Clear-000-delete-all.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parameter.xml
│   │   │   │       ├── Transaction-000-delete-all.xml
│   │   │   │       ├── Transaction-dc-01-insert.xml
│   │   │   │       ├── Transaction-dc-02-update-full.xml
│   │   │   │       ├── Transaction-fgdc-01-insert.xml
│   │   │   │       ├── Transaction-fgdc-02-update-recprop.xml
│   │   │   │       ├── Transaction-fgdc-03-delete-all.xml
│   │   │   │       ├── Transaction-iso-00-delete-all.xml
│   │   │   │       ├── Transaction-iso-01-insert.xml
│   │   │   │       ├── Transaction-iso-02-update-full.xml
│   │   │   │       ├── Transaction-iso-03-update-recprop.xml
│   │   │   │       ├── Transaction-iso-04-update-recprop-no-matches.xml
│   │   │   │       ├── Transaction-iso-05-delete.xml
│   │   │   │       └── Transaction-xxx-delete-all.xml
│   │   │   ├── oaipmh/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetRecord_bad_metadata_prefix.xml
│   │   │   │   │   ├── get_GetRecord_datacite.xml
│   │   │   │   │   ├── get_GetRecord_dc.xml
│   │   │   │   │   ├── get_GetRecord_iso.xml
│   │   │   │   │   ├── get_GetRecord_oai_dc.xml
│   │   │   │   │   ├── get_Identify.xml
│   │   │   │   │   ├── get_ListIdentifiers_bad_metadata_prefix.xml
│   │   │   │   │   ├── get_ListIdentifiers_datacite.xml
│   │   │   │   │   ├── get_ListIdentifiers_dc.xml
│   │   │   │   │   ├── get_ListIdentifiers_iso.xml
│   │   │   │   │   ├── get_ListIdentifiers_missing_metadata_prefix.xml
│   │   │   │   │   ├── get_ListIdentifiers_oai_dc.xml
│   │   │   │   │   ├── get_ListMetadataFormats.xml
│   │   │   │   │   ├── get_ListRecords_datacite.xml
│   │   │   │   │   ├── get_ListRecords_dc.xml
│   │   │   │   │   ├── get_ListRecords_dc_bad_metadata_prefix.xml
│   │   │   │   │   ├── get_ListRecords_iso19139.xml
│   │   │   │   │   ├── get_ListRecords_oai_dc.xml
│   │   │   │   │   ├── get_ListSets.xml
│   │   │   │   │   ├── get_bad_verb.xml
│   │   │   │   │   ├── get_empty.xml
│   │   │   │   │   ├── get_empty_with_amp.xml
│   │   │   │   │   └── get_illegal_verb.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── oarec/
│   │   │   │   ├── conftest.py
│   │   │   │   ├── test_oarec_functional.py
│   │   │   │   └── test_oarec_virtual_collections_functional.py
│   │   │   ├── opensearcheo/
│   │   │   │   ├── data/
│   │   │   │   │   ├── 3e9a8c05.xml
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000012.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000013.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000014.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000015.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_284404.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288395.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288398.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288401.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276395.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276398.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276401.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_280395.xml
│   │   │   │   │   ├── iso_19115-2_Sentinel-2-scene.xml
│   │   │   │   │   ├── pacioos-NS06agg.xml
│   │   │   │   │   └── test.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_opensearch-description-document.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover-gt.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover-lt-gt.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover-lt.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover.xml
│   │   │   │   │   ├── get_opensearch-query-instrument.xml
│   │   │   │   │   ├── get_opensearch-query-orbitdirection.xml
│   │   │   │   │   ├── get_opensearch-query-orbitnumber.xml
│   │   │   │   │   ├── get_opensearch-query-platform.xml
│   │   │   │   │   ├── get_opensearch-query-processinglevel.xml
│   │   │   │   │   ├── get_opensearch-query-producttype.xml
│   │   │   │   │   ├── get_opensearch-query-sensortype.xml
│   │   │   │   │   ├── get_opensearch-query-snowcover.xml
│   │   │   │   │   ├── get_opensearch-query-spectralrange.xml
│   │   │   │   │   ├── get_opensearch-query-start-stop-extent.xml
│   │   │   │   │   └── get_opensearch-query-time-extent.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── pubsub/
│   │   │   │   ├── conftest.py
│   │   │   │   └── test_pubsub_functional.py
│   │   │   ├── repofilter/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_GetRecordById-masked.xml
│   │   │   │   │   └── post_GetRecords-all.xml
│   │   │   │   └── post/
│   │   │   │       ├── GetRecordById-masked.xml
│   │   │   │       └── GetRecords-all.xml
│   │   │   ├── sru/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_explain.xml
│   │   │   │   │   ├── get_search.xml
│   │   │   │   │   ├── get_search_cql.xml
│   │   │   │   │   ├── get_search_maxrecords.xml
│   │   │   │   │   └── get_search_startrecord_maxrecords.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── stablesort/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetRecords-page1.xml
│   │   │   │   │   ├── get_GetRecords-page2.xml
│   │   │   │   │   └── get_GetRecords-page3.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── stac_api/
│   │   │   │   ├── conftest.py
│   │   │   │   ├── data/
│   │   │   │   │   ├── 20201211_223832_CS21.json
│   │   │   │   │   ├── S2A_MSIL2A_20241128T092331_R093_T34SEJ_20241128T122153.json
│   │   │   │   │   ├── S2A_MSIL2A_20241128T092331_R093_T34SFH_20241128T122153.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33TWN_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33TXN_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UWP_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UWQ_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UXP_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UXQ_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33TWN_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33TXN_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UWP_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UWQ_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UXP_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UXQ_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33TWN_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33TXN_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33UWP_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33UXP_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33UXQ_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33TWN_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33TXN_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UWP_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UWQ_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UXP_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UXQ_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2MSI1C.xml
│   │   │   │   │   ├── S2MSI2A.xml
│   │   │   │   │   ├── sentinel-2-l2a.json
│   │   │   │   │   ├── simple-collection.json
│   │   │   │   │   └── woudc-total-column-ozone-totalozone.json
│   │   │   │   └── test_stac_api_functional.py
│   │   │   ├── utf-8/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   └── post_GetCapabilities.xml
│   │   │   │   └── post/
│   │   │   │       └── GetCapabilities.xml
│   │   │   └── xslt/
│   │   │       ├── custom.xslt
│   │   │       ├── default.yml
│   │   │       ├── expected/
│   │   │       │   ├── post_csw2-GetRecordById-xslt.xml
│   │   │       │   ├── post_csw2-GetRecordById.xml
│   │   │       │   ├── post_csw2-GetRecords-all-xslt.xml
│   │   │       │   ├── post_csw2-GetRecords-all.xml
│   │   │       │   ├── post_csw3-GetRecordById-xslt.xml
│   │   │       │   ├── post_csw3-GetRecordById.xml
│   │   │       │   ├── post_csw3-GetRecords-all-xslt.xml
│   │   │       │   └── post_csw3-GetRecords-all.xml
│   │   │       └── post/
│   │   │           ├── csw2-GetRecordById-xslt.xml
│   │   │           ├── csw2-GetRecordById.xml
│   │   │           ├── csw2-GetRecords-all-xslt.xml
│   │   │           ├── csw2-GetRecords-all.xml
│   │   │           ├── csw3-GetRecordById-xslt.xml
│   │   │           ├── csw3-GetRecordById.xml
│   │   │           ├── csw3-GetRecords-all-xslt.xml
│   │   │           └── csw3-GetRecords-all.xml
│   │   └── test_xml_suites_functional.py
│   ├── gen_html.py
│   └── unittests/
│       ├── test_fmt_json.py
│       ├── test_metadata.py
│       ├── test_ogc_csw_csw3.py
│       ├── test_opensearch.py
│       ├── test_repository.py
│       ├── test_server.py
│       ├── test_util.py
│       └── test_wsgi.py
└── tox.ini

================================================
FILE CONTENTS
================================================

================================================
FILE: .coveragerc
================================================
[run]
branch = True
source = pycsw

[paths]
source =
    pycsw
    .tox/*/lib/python*/site-packages/pycsw
    /usr/local/lib/python*/dist-packages/pycsw

[report]
show_missing = True

================================================
FILE: .dockerignore
================================================
# build artifacts
*.pyc
*.egg-info
build
dist
docs/_build
MANIFEST

# testing artifacts
tests/index.html
tests/results
**.cache
.coverage
.tox

# test configurations
/default.cfg

# git stuff
.git

# pycharm ide
.idea


================================================
FILE: .gitattributes
================================================
.gitattributes export-ignore
.gitignore export-ignore


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

#github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
custom: ['https://github.com/geopython/pycsw/wiki/Sponsorship'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
# Description

# Environment

- operating system:
- Python version:
- pycsw version:
- source/distribution
  - [ ] git clone
  - [ ] DebianGIS/UbuntuGIS
  - [ ] PyPI
  - [ ] zip/tar.gz
  - [ ] other (please specify):
- web server
  - [ ] Apache/mod_wsgi
  - [ ] CGI
  - [ ] other (please specify): 

# Steps to Reproduce

# Additional Information


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
# Overview

# Related Issue / Discussion

# Additional Information

# Contributions and Licensing

(as per https://github.com/geopython/pycsw/blob/master/CONTRIBUTING.rst#contributions-and-licensing)

- [ ] I'd like to contribute [feature X|bugfix Y|docs|something else] to pycsw. I confirm that my contributions to pycsw will be compatible with the pycsw license guidelines at the time of contribution.
- [ ] I have already previously agreed to the pycsw Contributions and Licensing Guidelines


================================================
FILE: .github/workflows/docker.yml
================================================
# Triggers a Docker workflow on completion of the "build" workflow but
# pushes to DockerHub
#
# Author: Just van den Broecke & Edward Lewis - 2021
#
name: Docker Build

on:
  workflow_run:
    workflows: ["build ⚙️"]
    types: [completed]

jobs:
  # Single job now to build Docker Image and push to DockerHub
  on-success:
    name: Build, Test and Push Docker Image to DockerHub
    runs-on: ubuntu-24.04
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    
    # v2 https://github.com/docker/build-push-action/blob/master/UPGRADE.md
    steps:
      - name: Checkout ✅
        uses: actions/checkout@master

      - name: Prepare 📦
        id: prep
        run: |
          DOCKER_IMAGE=geopython/pycsw
          VERSION=latest
          if [[ $GITHUB_REF == refs/tags/* ]]; then
            VERSION=${GITHUB_REF#refs/tags/}
          elif [[ $GITHUB_REF == refs/heads/* ]]; then
            VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
          elif [[ $GITHUB_REF == refs/pull/* ]]; then
            VERSION=pr-${{ github.event.number }}
          fi
          if [[ $VERSION == master ]]; then
            VERSION=latest
          fi
          TAGS="${DOCKER_IMAGE}:${VERSION}"
          echo ::set-output name=image::${DOCKER_IMAGE}
          echo ::set-output name=version::${VERSION}
          echo ::set-output name=tags::${TAGS}
          echo ::set-output name=created::$(date -u +'%Y-%m-%dT%H:%M:%SZ')
      - name: Show Image Settings 📦
        run: echo "IMAGE=${{ steps.prep.outputs.image }} VERSION=${{ steps.prep.outputs.version }} TAGS=${{ steps.prep.outputs.tags }}"

      - name: Set up Docker Buildx 📦
        uses: docker/setup-buildx-action@v1

      - name: Login to DockerHub 📦
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Docker Build only - retain local Image 📦
        uses: docker/build-push-action@v2
        with:
          context: .
          load: true
          push: false
          tags: ${{ steps.prep.outputs.tags }}
          labels: |
            org.opencontainers.image.source=${{ github.event.repository.html_url }}
            org.opencontainers.image.created=${{ steps.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: Push to Docker repo ☁️
        run: docker push ${{ steps.prep.outputs.image }}:${{ steps.prep.outputs.version }}

  on-failure:
    runs-on: ubuntu-24.04
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    steps:
      - name: Print Test Fail
        run: echo Tests Failed


================================================
FILE: .github/workflows/ghcr.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# Triggers a Docker workflow on completion of the "build" workflow but
# pushes to GitHub Container Registry 
#
# Author: Edward Lewis - 2021

name: GHCR

on:
  workflow_run:
    workflows: ["build ⚙️"]
    types: [completed]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: pycsw

jobs:
  # Push image to GitHub Packages.
  # See also https://docs.docker.com/docker-hub/builds/
  push:
    runs-on: ubuntu-24.04
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    permissions:
      packages: write
      contents: read

    steps:
      - uses: actions/checkout@master

      - name: Build image
        run: docker build . --file Dockerfile --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}"

      - name: Log in to registry
        # This is where you will update the PAT to GITHUB_TOKEN
        run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Rename image for publication
        run: |
          IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME

          # Change all uppercase to lowercase
          IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
          # Strip git ref prefix from version
          VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
          # Strip "v" prefix from tag name
          [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
          # Use Docker `latest` tag convention
          [ "$VERSION" == "master" ] && VERSION=latest
          echo IMAGE_ID=$IMAGE_ID
          echo VERSION=$VERSION
          echo FULLCONTAINERNAME=$IMAGE_ID:$VERSION >> $GITHUB_ENV
          docker tag $IMAGE_NAME $IMAGE_ID:$VERSION

      #- uses: Azure/container-scan@v0
        #with:
          #image-name: ${{ env.FULLCONTAINERNAME }}

      - name: Push to CR
        run: docker push ${{ env.FULLCONTAINERNAME }}

  on-failure:
    runs-on: ubuntu-24.04
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    steps:
      - name: Print Test Fail
        run: echo Tests Failed        


================================================
FILE: .github/workflows/main.yml
================================================
name: build ⚙️

on: 
  push:
    branches:
      - master
    paths-ignore:
      - '**.md'  
  pull_request:
    branches:
      - master
    paths-ignore:
      - '**.md'  
  release:
    types:
      - released

jobs:
  main:
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        include:
          - python-version: "3.12"
            toxenv: "py312-sqlite"
    env:
        TOXENV: ${{ matrix.toxenv }}
    steps:
    - uses: actions/checkout@master
    - uses: actions/setup-python@v5
      name: Setup Python ${{ matrix.python-version }}
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install requirements 📦
      run: |
        sudo apt update
        sudo apt install -y libgeos-dev libpq-dev libxml2-dev libxslt1-dev libz-dev libexpat1 python3-distutils-extra
        pip3 install setuptools
        pip3 install -r requirements.txt
        pip3 install -r requirements-standalone.txt
        pip3 install -r requirements-pubsub.txt
        pip3 install -r requirements-dev.txt
        pip3 install --upgrade https://github.com/geopython/OWSLib/archive/master.zip
        pip3 install tox
        echo "TOXENV => $TOXENV"
    - name: run unit tests ⚙️
      run: tox -- --exitfirst -m unit
    - name: run integration tests ⚙️
      run: tox -- --exitfirst -m functional -k 'not harvesting'
    - name: build docs 🏗️
      run: cd docs && make html


================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale Issues and Pull Requests'

env:
  STALE_AFTER_INACTIVE_DAYS: 90
  CLOSE_AFTER_INACTIVE_DAYS: 7

on:
  schedule:
    - cron: '1 3 * * 0'  # runs every Sunday at 03h01 UTC
    # - cron: '0 * * * *'  # runs every hour, for debugging
jobs:
  stale:
    permissions:
      issues: write
      pull-requests: write
    if: github.repository == 'geopython/pycsw'
    runs-on: ubuntu-24.04
    steps:
      - uses: 'actions/stale@v10'
        with:
          # debug-only: true
          operations-per-run: 1000
          enable-statistics: true
          stale-issue-label: stale
          stale-pr-label: stale
          exempt-issue-labels: blocker
          exempt-pr-labels: blocker
          days-before-stale: ${{ env.STALE_AFTER_INACTIVE_DAYS }}
          days-before-close: ${{ env.CLOSE_AFTER_INACTIVE_DAYS }}
          remove-stale-when-updated: true
          stale-issue-message: >
            This Issue has been inactive for ${{env.STALE_AFTER_INACTIVE_DAYS }}
            days. In order to manage maintenance burden, it will be automatically closed
            in ${{ env.CLOSE_AFTER_INACTIVE_DAYS }} days.
          stale-pr-message: >
            This Pull Request has been inactive for ${{env.STALE_AFTER_INACTIVE_DAYS }}
            days. In order to manage maintenance burden, it will be automatically closed
            in ${{ env.CLOSE_AFTER_INACTIVE_DAYS }} days.
          close-issue-message: >
            This Issue has been closed due to there being no activity for more
            than ${{ env.STALE_AFTER_INACTIVE_DAYS }} days.
          close-pr-message: >
            This Pull Request has been closed due to there being no activity for more
            than ${{ env.STALE_AFTER_INACTIVE_DAYS }} days.


================================================
FILE: .github/workflows/vulnerabilities.yml
================================================
name: Check vulnerabilities

on:
  push:
    paths-ignore:
      - '**.md'
  pull_request:
    branches:
      - master
    paths-ignore:
      - '!**.md'
  release:
    types:
      - released

jobs:

  vulnerabilities:
    runs-on: ubuntu-24.04
    defaults:
      run:
        working-directory: .
    steps:
    - name: Checkout pycsw
      uses: actions/checkout@master
    - name: Scan vulnerabilities with trivy
      uses: aquasecurity/trivy-action@v0.35.0
      with:
        scan-type: fs
        exit-code: 1
        ignore-unfixed: true
        severity: CRITICAL,HIGH
        scanners: vuln,misconfig,secret
        scan-ref: .
        skip-dirs: docker/helm,docker/kubernetes
    - name: Build locally the image from Dockerfile
      run: |
        docker buildx build -t ${{ github.repository }}:${{ github.sha }} --platform linux/amd64 --no-cache -f Dockerfile .
    - name: Scan locally built Docker image for vulnerabilities with trivy
      uses: aquasecurity/trivy-action@v0.35.0
      with:
        scan-type: image
        exit-code: 1
        ignore-unfixed: true
        severity: CRITICAL,HIGH
        vuln-type: os,library
        image-ref: '${{ github.repository }}:${{ github.sha }}'


================================================
FILE: .gitignore
================================================
# build artifacts
*.pyc
*.egg-info
build
dist
docs/_build
MANIFEST

# testing artifacts
tests/index.html
tests/results
**.cache
.coverage
.tox
.pytest_cache

# test configurations
/default.cfg

# pycharm ide
.idea

# shell files
.env
.envrc

# compiled file for *.po.
*.mo

# virtual environments
.venv

# visual studio code workspace
*.code-workspace
.vscode/settings.json
.vscode/launch.json


================================================
FILE: .readthedocs.yaml
================================================
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the version of Python and other tools you might need
build:
  os: ubuntu-22.04
  tools:
    python: "3.11"

# Build documentation in the docs/ directory with Sphinx
sphinx:
  configuration: docs/conf.py

# We recommend specifying your dependencies to enable reproducible builds:
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
  install:
  - requirements: docs/requirements-mocked.txt

formats:
  - pdf


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at pycsw-devel@lists.osgeo.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: COMMITTERS.txt
================================================
============== ===================== ================================== ==================================
Login(s)       Name                  Email / Contact                    Area(s)
============== ===================== ================================== ==================================
tomkralidis    Tom Kralidis          tomkralidis at gmail.com           Overall 
kalxas         Angelos Tzotsos       tzotsos at gmail.com               INSPIRE, APISO profiles, Packaging 
adamhinz       Adam Hinz             hinz dot adam at gmail.com         WSGI/Server Deployment
ricardogsilva  Ricardo Garcia Silva  ricardo.garcia.silva at gmail.com  Overall
============== ===================== ================================== ==================================


================================================
FILE: CONTRIBUTING.rst
================================================
Contributing to pycsw
=====================

The pycsw project openly welcomes contributions (bug reports, bug fixes, code
enhancements/features, etc.).  This document will outline some guidelines on
contributing to pycsw.  As well, the pycsw `community <https://pycsw.org/community/>`_ is a great place to
get an idea of how to connect and participate in pycsw community and development.

pycsw has the following modes of contribution:

- GitHub Commit Access
- GitHub Pull Requests

Code of Conduct
---------------

Contributors to this project are expected to act respectfully toward others in accordance with the `OSGeo Code of Conduct <https://www.osgeo.org/code_of_conduct>`_.

Contributions and Licensing
---------------------------

Contributors are asked to confirm that they comply with project `license <https://github.com/geopython/pycsw/blob/master/LICENSE.txt>`_ guidelines.

GitHub Commit Access
^^^^^^^^^^^^^^^^^^^^

- proposals to provide developers with GitHub commit access shall be emailed to the pycsw-devel `mailing list`_.  Proposals shall be approved by the pycsw development team.  Committers shall be added by the project admin
- removal of commit access shall be handled in the same manner
- each committer must send an email to the pycsw mailing list agreeing to the license guidelines (see `Contributions and Licensing Agreement Template <#contributions-and-licensing-agreement-template>`_).  **This is only required once**
- each committer shall be listed in https://github.com/geopython/pycsw/blob/master/COMMITTERS.txt

GitHub Pull Requests
^^^^^^^^^^^^^^^^^^^^

- pull requests can provide agreement to license guidelines as text in the pull request or via email to the pycsw `mailing list`_  (see `Contributions and Licensing Agreement Template <#contributions-and-licensing-agreement-template>`_).  **This is only required for a contributor's first pull request.  Subsequent pull requests do not require this step**
- pull requests may include copyright in the source code header by the contributor if the contribution is significant or the contributor wants to claim copyright on their contribution
- all contributors shall be listed at https://github.com/geopython/pycsw/graphs/contributors
- unclaimed copyright, by default, is assigned to the main copyright holders as specified in https://github.com/geopython/pycsw/blob/master/LICENSE.txt

Contributions and Licensing Agreement Template
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

``Hi all, I'd like to contribute <feature X|bugfix Y|docs|something else> to pycsw.
I confirm that my contributions to pycsw will be compatible with the pycsw
license guidelines at the time of contribution.``


GitHub
------

Code, tests, documentation, wiki and issue tracking are all managed on GitHub.
Make sure you have a `GitHub account <https://github.com/signup/free>`_.

Code Overview
-------------

- the pycsw `wiki <https://github.com/geopython/pycsw/wiki/Code-Architecture>`_ documents an overview of the codebase

Documentation
-------------

- documentation is managed in ``docs/``, in reStructuredText format
- `Sphinx`_ is used to generate the documentation
- See the `reStructuredText Primer <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_ on rST markup and syntax.

Bugs
----

pycsw's `issue tracker <https://github.com/geopython/pycsw/issues>`_ is the place to report bugs or request enhancements. To submit a bug be sure to specify the pycsw version you are using, the appropriate component, a description of how to reproduce the bug, as well as what version of Python and platform. For convenience, you can run ``pycsw-admin.py get-sysprof`` and copy/paste the output into your issue.

Forking pycsw
-------------

Contributions are most easily managed via GitHub pull requests.  `Fork <https://github.com/geopython/pycsw/fork>`_
pycsw into your own GitHub repository to be able to commit your work and submit pull requests.

Development
-----------

GitHub Commit Guidelines
^^^^^^^^^^^^^^^^^^^^^^^^

- enhancements and bug fixes should be identified with a GitHub issue
- commits should be granular enough for other developers to understand the nature / implications of the change(s)
- non-trivial Git commits shall be associated with a GitHub issue.  As documentation can always be improved, tickets need not be opened for improving the docs
- Git commits shall include a description of changes
- Git commits shall include the GitHub issue number (i.e. ``#1234``) in the Git commit log message
- all enhancements or bug fixes must successfully pass all :ref:`ogc-cite` tests before they are committed
- all enhancements or bug fixes must successfully pass all :ref:`tests` tests before they are committed
- enhancements which can be demonstrated from the pycsw :ref:`tests` should be accompanied by example CSW request XML

Coding Guidelines
^^^^^^^^^^^^^^^^^

- pycsw instead of PyCSW, pyCSW, Pycsw
- always code with `PEP 8`_ conventions
- always run source code through `flake8`_ and `pylint`_, using all pylint defaults except for ``C0111``.  ``sbin/pycsw-pylint.sh`` is included for convenience
- for exceptions which make their way to OGC ``ExceptionReport`` XML, always specify the appropriate ``locator`` and ``code`` parameters

Submitting a Pull Request
^^^^^^^^^^^^^^^^^^^^^^^^^

This section will guide you through steps of working on pycsw.  This section assumes you have forked pycsw into your own GitHub repository.

.. code-block:: bash

  # setup a virtualenv
  virtualenv mypycsw && cd mypycsw
  . ./bin/activate
  # clone the repository locally
  git clone git@github.com:USERNAME/pycsw.git
  cd pycsw
  pip install -e . && pip install -r requirements-standalone.txt
  # add the main pycsw master branch to keep up to date with upstream changes
  git remote add upstream https://github.com/geopython/pycsw.git
  git pull upstream master
  # create a local branch off master
  # The name of the branch should include the issue number if it exists
  git branch issue-72
  git checkout issue-72
  # 
  # make code/doc changes
  #
  git commit -am 'fix xyz (#72)'
  git push origin issue-72

Your changes are now visible on your pycsw repository on GitHub.  You are now ready to create a pull request.
A member of the pycsw team will review the pull request and provide feedback / suggestions if required.  If changes are
required, make them against the same branch and push as per above (all changes to the branch in the pull request apply).

The pull request will then be merged by the pycsw team.  You can then delete your local branch (on GitHub), and then update
your own repository to ensure your pycsw repository is up to date with pycsw master:

.. code-block:: bash

  git checkout master
  git pull upstream master

.. _`info@osgeo.org`: mailto:info@osgeo.org
.. _`PEP 8`: https://www.python.org/dev/peps/pep-0008/
.. _`flake8`: https://gitlab.com/pycqa/flake8
.. _`pylint`: https://pylint.org
.. _`Sphinx`: https://www.sphinx-doc.org
.. _`developer tasks`: https://github.com/geopython/pycsw/wiki/Developer-Tasks
.. _`mailing list`: https://pycsw.org/community#mailing-list


================================================
FILE: Dockerfile
================================================
# =================================================================
# Authors: Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
# Authors: Massimo Di Stefano <epiesasha@me.com>
# Authors: Tom Kralidis <tomkralidis@gmail.com>
# Authors: Angelos Tzotsos <gcpp.kalxas@gmail.com>
#
# Contributors: Arnulf Heimsbakk <aheimsbakk@met.no>
#               Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2020 Ricardo Garcia Silva
# Copyright (c) 2020 Massimo Di Stefano
# Copyright (c) 2025 Tom Kralidis
# Copyright (c) 2026 Angelos Tzotsos
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
#
# =================================================================

FROM python:3.12-slim-trixie
LABEL maintainer="massimods@met.no,aheimsbakk@met.no,tommkralidis@gmail.com,gcpp.kalxas@gmail.com"

# Build arguments
# add "--build-arg BUILD_DEV_IMAGE=true" to Docker build command when building with test/doc tools

ARG BUILD_DEV_IMAGE="false"

RUN apt-get update --yes && \
    apt-get install --yes --no-install-recommends ca-certificates python3-setuptools libssl3t64 && \
    rm -rf /var/lib/apt/lists/*

RUN adduser --uid 1000 --gecos '' --disabled-password pycsw

ENV PYCSW_CONFIG=/etc/pycsw/pycsw.yml

WORKDIR /home/pycsw/pycsw

RUN chown --recursive pycsw:pycsw .

# initially copy only the requirements files
COPY --chown=pycsw \
    requirements.txt \
    requirements-standalone.txt \
    requirements-dev.txt \
    ./

RUN python3 -m venv /venv && \
    /venv/bin/pip3 install -U pip setuptools && \
    /venv/bin/pip3 install \
    --requirement requirements.txt \
    --requirement requirements-standalone.txt \
    psycopg2-binary gunicorn \
    && if [ "$BUILD_DEV_IMAGE" = "true" ] ; then /venv/bin/pip3 install -r requirements-dev.txt; fi

COPY --chown=pycsw . .

COPY docker/pycsw.yml ${PYCSW_CONFIG}
COPY docker/entrypoint.py /usr/local/bin/entrypoint.py

RUN /venv/bin/pip3 install -e . --config-settings editable_mode=strict

WORKDIR /home/pycsw

EXPOSE 8000

USER pycsw

ENTRYPOINT [ "/venv/bin/python3", "/usr/local/bin/entrypoint.py" ]


================================================
FILE: HISTORY.txt
================================================
pycsw Revision History
===========================

See http://github.com/geopython/pycsw for commit and release history.


================================================
FILE: LICENSE.txt
================================================
The MIT License (MIT)
=====================

Copyright &copy; 2010-2026 Tom Kralidis
Copyright &copy; 2011-2026 Angelos Tzotsos
Copyright &copy; 2012-2015 Adam Hinz
Copyright &copy; 2015-2021 Ricardo Garcia Silva

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.



================================================
FILE: MANIFEST.in
================================================
recursive-include pycsw *.xsd *.yaml *.html *.png *.ico
include *.txt
include README.md


================================================
FILE: README.md
================================================
# pycsw

[![DOI](https://zenodo.org/badge/2367090.svg)](https://zenodo.org/badge/latestdoi/2367090)
[![Build Status](https://github.com/geopython/pycsw/workflows/build%20%E2%9A%99%EF%B8%8F/badge.svg)](https://github.com/geopython/pycsw/actions)
[![Join the chat at https://gitter.im/geopython/pycsw](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/geopython/pycsw)
[![Documentation](https://readthedocs.org/projects/pycsw/badge/)](https://docs.pycsw.org)
[![Vulnerabilities](https://github.com/geopython/pycsw/actions/workflows/vulnerabilities.yml/badge.svg)](https://github.com/geopython/pycsw/actions/workflows/vulnerabilities.yml)

[pycsw](https://pycsw.org) is an OGC API - Records and CSW server implementation written in Python.

pycsw fully implements the the [OGC API - Records (OARec) standard](https://ogcapi.ogc.org/records/)
and the OpenGIS Catalogue Service Implementation Specification (Catalogue Service for
the Web). Initial development started in 2010 (more formally announced in
2011). The project is certified OGC Compliant, and is an OGC Reference
Implementation.  Since 2015, pycsw is an official OSGeo Project.

pycsw allows for the publishing and discovery of geospatial metadata via
numerous APIs (OGC API - Records, CSW 2/CSW 3, OpenSearch, OAI-PMH, SRU). Existing
repositories of geospatial metadata can also be exposed, providing a standards-based
metadata and catalogue component of spatial data infrastructures.

pycsw is Open Source, released under an MIT license, and runs on all major
platforms (Windows, Linux, Mac OS X).

Please read the docs at [https://pycsw.org/docs](https://pycsw.org/docs) for more information.


================================================
FILE: SECURITY.md
================================================
# pycsw Security Policy

## Reporting

Security/vulnerability reports **should not** be submitted through GitHub issues or public discussions, but instead please send your report 
to **geopython-security nospam @ lists.osgeo.org** - (remove the blanks and 'nospam').  

Please follow the [contributor guidelines](https://github.com/geopython/pycsw/blob/master/CONTRIBUTING.rst#bugs) when submitting a vulnerability report.

## Supported Versions

The pycsw Project Steering Committee (PSC) will release patches for security vulnerabilities for the following versions:

| Version | Supported          |
| ------- | ------------------ |
| 2.6.x   | :white_check_mark: |
| 2.4.x   | :white_check_mark: |
| 2.2.x   | :white_check_mark: |
| 2.0.x   | :white_check_mark: |
| < 2.0   | :x:                |


================================================
FILE: csw.py
================================================
#!/usr/bin/python3 -u
# -*- coding: utf-8 -*-
# =================================================================
#
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2015 Tom Kralidis
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================

"""
A CGI wrapper for pycsw that reuses code from the wsgi wrapper.
"""

from wsgiref.handlers import CGIHandler

from pycsw.wsgi import application


handler = CGIHandler()
handler.run(application)


================================================
FILE: default-sample.yml
================================================
# =================================================================
#
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#          Angelos Tzotsos <tzotsos@gmail.com>
#
# Copyright (c) 2026 Tom Kralidis
# Copyright (c) 2024 Angelos Tzotsos
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================

server:
    url: http://localhost/pycsw/csw.py
    mimetype: application/xml; charset=UTF-8
    encoding: UTF-8
    language: en-US
    maxrecords: 10
    #ogc_schemas_location: http://foo
    #pretty_print: true
    gzip_compresslevel: 9
    #domainquerytype: range
    #domaincounts: true
    #spatial_ranking: true
    #workers=2
    #timeout=30
    # templates:
      # path: /path/to/Jinja2/templates
      # static: /path/to/static/folder # css/js/img

logging:
    level: ERROR
    #logfile: /tmp/pycsw.log

profiles:
    - apiso

federatedcatalogues:
    - id: arctic-sdi-csw
      type: CSW
      title: Arctic SDI
      url: https://catalogue.arctic-sdi.org/csw
    - id: pycsw-cite-demo
      type: OARec
      title: pycsw OGC CITE demo and Reference Implementation
      uresultsrl: https://demo.pycsw.org/cite
    - id: fedcat03
      type: STAC-API
      title: Copernicus Data Space Ecosystem (CDSE) asset-level STAC catalogue
      url: https://stac.dataspace.copernicus.eu/v1
      collections:
          - daymet-annual-pr

manager:
    transactions: false
    allowed_ips:
        - 127.0.0.1
    csw_harvest_pagesize: 10

#pubsub:
#    broker:
#        type: mqtt
#        url: mqtt://localhost:1883

metadata:
    identification:
        title: pycsw Geospatial Catalogue
        description: pycsw is an OARec and OGC CSW server implementation written in Python
        keywords:
            - catalogue
            - discovery
            - metadata
        keywords_type: theme
        fees: None
        accessconstraints: None
        terms_of_service: https://creativecommons.org/licenses/by/4.0
        url: https://example.org
    license:
        name: CC-BY 4.0 license
        url: https://creativecommons.org/licenses/by/4.0
    provider:
        name: Organization Name
        url: https://pycsw.org
    contact:
        name: Lastname, Firstname
        position: Position Title
        address: Mailing Address
        city: City
        stateorprovince: Administrative Area
        postalcode: Zip or Postal Code
        country: Country
        phone: +xx-xxx-xxx-xxxx
        fax: +xx-xxx-xxx-xxxx
        email: you@example.org
        url: Contact URL
        hours: Mo-Fr 08:00-17:00
        instructions: During hours of service. Off on weekends.
        role: pointOfContact
    inspire:
        enabled: true
        languages_supported:
            - eng
            - gre
        default_language: eng
        date: YYYY-MM-DD
        gemet_keywords:
            - Utility and governmental services
        conformity_service: notEvaluated
        contact_name: Organization Name
        contact_email: Email Address
        temp_extent:
            begin: YYYY-MM-DD
            end: YYYY-MM-DD

repository:
    # sqlite
    database: sqlite:////var/www/pycsw/tests/functionaltests/suites/cite/data/cite.db
    # postgres
    #database: postgresql://username:password@localhost/pycsw
    # mysql
    #database: mysql://username:password@localhost/pycsw?charset=utf8
    #mappings: path/to/mappings.py
    table: records
    #filter: type = 'http://purl.org/dc/dcmitype/Dataset'
    #max_retries: 5
    #stable_sort: true
    facets:
        - type
        - title


================================================
FILE: docker/compose/docker-compose.scale.yml
================================================
# =================================================================
#
# Authors: Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2017 Ricardo Garcia Silva
# Copyright (c) 2025 Tom Kralidis
# Copyright (c) 2025 Angelos Tzotsos
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================
#
#
# This docker compose file demos how to use the pycsw docker image with a
# PostgreSQL/PostGIS database.
#
# docker compose usage:
#
# docker compose up
#
# docker stack (in a docker swarm):
#
# PYCSW_DOCKER_IMAGE=2.1-dev docker stack deploy --compose-file docker-compose.yml pycsw
#

services:
  db:
    container_name: db
    image: postgis/postgis:17-3.5
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: mypass
      POSTGRES_DB: pycsw
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - db-data:/var/lib/postgresql/data/pgdata
    ports:
      - 5432:5432
    networks:
      - pycsw-net
  pycsw:
    image: geopython/pycsw:${PYCSW_DOCKER_IMAGE}
    environment:
        PYCSW_SERVER_URL: http://localhost:8000
    # deploy 5 instances of pycsw, from ports 8000-8004
    deploy:
      replicas: 5
    ports:
      - 8000-8004:8000
    volumes:
      - ./pycsw.yml:/etc/pycsw/pycsw.yml
    networks:
      - pycsw-net

networks:
  pycsw-net:

volumes:
  db-data:


================================================
FILE: docker/compose/docker-compose.yml
================================================
# =================================================================
#
# Authors: Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2017 Ricardo Garcia Silva
# Copyright (c) 2025 Tom Kralidis
# Copyright (c) 2025 Angelos Tzotsos
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================
#
#
# This docker compose file demos how to use the pycsw docker image with a
# PostgreSQL/PostGIS database.
#
# docker compose usage:
#
# docker compose up
#
# docker stack (in a docker swarm):
#
# PYCSW_DOCKER_IMAGE=2.1-dev docker stack deploy --compose-file docker-compose.yml pycsw
#

services:
  db:
    container_name: db
    image: postgis/postgis:17-3.5
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: mypass
      POSTGRES_DB: pycsw
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - db-data:/var/lib/postgresql/data/pgdata
    ports:
      - 5432:5432
    networks:
      - pycsw-net
  pycsw:
    container_name: pycsw
    image: geopython/pycsw:${PYCSW_DOCKER_IMAGE}
    environment:
        PYCSW_SERVER_URL: http://localhost:8000
    ports:
      - 8000:8000
    volumes:
      - ./pycsw.yml:/etc/pycsw/pycsw.yml
    networks:
      - pycsw-net

networks:
  pycsw-net:

volumes:
  db-data:


================================================
FILE: docker/compose/pycsw.yml
================================================
# =================================================================
#
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#          Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
#
# Copyright (c) 2026 Tom Kralidis
# Copyright (c) 2017 Ricardo Garcia Silva
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================

server:
    url: ${PYCSW_SERVER_URL}
    mimetype: application/xml; charset=UTF-8
    encoding: UTF-8
    language: en-US
    maxrecords: 10
    timeout: 30
    #ogc_schemas_location: http://foo
    #pretty_print: true
    gzip_compresslevel: 9
    #domainquerytype: range
    #domaincounts: true
    #spatial_ranking: true
    #workers=2

logging:
    level: DEBUG
    #logfile: /tmp/pycsw.log

profiles:
    - apiso

federatedcatalogues:
    - id: fedcat01
      type: CSW
      title: Arctic SDI
      url: https://catalogue.arctic-sdi.org/csw

manager:
    transactions: false
    allowed_ips:
        - 127.0.0.1
#    csw_harvest_pagesize: 10

metadata:
    identification:
        title: pycsw Geospatial Catalogue
        description: pycsw is an OARec and OGC CSW server implementation written in Python
        keywords:
            - catalogue
            - discovery
            - metadata
        keywords_type: theme
        fees: None
        accessconstraints: None
        terms_of_service: https://creativecommons.org/licenses/by/4.0
        url: https://example.org
    license:
        name: CC-BY 4.0 license
        url: https://creativecommons.org/licenses/by/4.0
    provider:
        name: Organization Name
        url: https://pycsw.org
    contact:
        name: Lastname, Firstname
        position: Position Title
        address: Mailing Address
        city: City
        stateorprovince: Administrative Area
        postalcode: Zip or Postal Code
        country: Country
        phone: +xx-xxx-xxx-xxxx
        fax: +xx-xxx-xxx-xxxx
        email: you@example.org
        url: Contact URL
        hours: Mo-Fr 08:00-17:00
        instructions: During hours of service. Off on weekends.
        role: pointOfContact

    inspire:
        enabled: true
        languages_supported:
            - eng
            - gre
        default_language: eng
        date: YYYY-MM-DD
        gemet_keywords:
            - Utility and governmental services
        conformity_service: notEvaluated
        contact_name: Organization Name
        contact_email: Email Address
        temp_extent:
            begin: YYYY-MM-DD
            end: YYYY-MM-DD
 
repository:
    database: 'postgresql://postgres:mypass@db/pycsw'
    table: records


================================================
FILE: docker/entrypoint.py
================================================
#!/usr/bin/env python3
# =================================================================
#
# Authors: Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
#          Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2017 Ricardo Garcia Silva
# Copyright (c) 2024 Tom Kralidis
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================

"""Entrypoint script for docker containers.

This module serves as the entrypoint for docker containers. Its main
purpose is to set up the pycsw database so that newly generated
containers may be useful soon after being launched, without requiring
additional input.

"""


import argparse
import logging
import os
import sys

from pycsw.core.config import StaticContext
from pycsw.core.repository import Repository, setup
from pycsw.ogc.api.util import yaml_load

LOGGER = logging.getLogger(__name__)


def launch_pycsw(pycsw_config, workers=2, reload=False):
    """Launch pycsw.

    Main function of this entrypoint script. It will read pycsw's config file
    and handle the specified repository backend, after which it will yield
    control to the gunicorn wsgi server.

    The ``os.execlp`` function is used to launch gunicorn. This causes it to
    replace the current process - something analogous to bash's `exec`
    command, which seems to be a common techinque when writing docker
    entrypoint scripts. This means gunicorn will become PID 1 inside the
    container and it somehow simplifies the process of interacting with it
    (e.g. if the need arises to restart the worker processes). It also allows
    for a clean exit. See

    http://docs.gunicorn.org/en/latest/signals.html

    for more information on how to control gunicorn by sending UNIX signals.
    """

    database = pycsw_config['repository'].get('database')
    table = pycsw_config['repository'].get('table')

    try:
        setup(database, table)
    except Exception as err:
        LOGGER.debug(err)

    repo = Repository(database, StaticContext(), table=table)

    repo.ping()

    sys.stdout.flush()
    # we're using --reload-engine=poll because there is a bug with gunicorn
    # that prevents using inotify together with python3. For more info:
    #
    # https://github.com/benoitc/gunicorn/issues/1477
    #

    timeout = pycsw_config["server"].get('timeout', 30)

    args = ["--reload", "--reload-engine=poll"] if reload else []
    execution_args = ["gunicorn"] + args + [
        "--bind=0.0.0.0:8000",
        "--access-logfile=-",
        "--error-logfile=-",
        f"--workers={workers}",
        f"--timeout={timeout}",
        'pycsw.wsgi_flask:APP'

    ]
    LOGGER.debug(f"Launching pycsw with {' '.join(execution_args)} ...")
    os.execlp(
        "/venv/bin/gunicorn",
        *execution_args
    )


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--workers",
        default=2,
        help="Number of workers to use by the gunicorn server. Defaults to 2."
    )
    parser.add_argument(
        "-r",
        "--reload",
        action="store_true",
        help="Should the gunicorn server automatically restart workers when "
             "code changes? This option is only useful for development. "
             "Defaults to False."
    )

    args = parser.parse_args()

    with open(os.getenv('PYCSW_CONFIG'), encoding='utf8') as fh:
        config = yaml_load(fh)

    level = config['logging'].get('level', 'WARNING')

    workers = int(config['server'].get('workers', args.workers))
    logging.basicConfig(level=getattr(logging, level))
    launch_pycsw(config, workers=workers, reload=args.reload)


================================================
FILE: docker/helm/Chart.yaml
================================================
apiVersion: v2
name: pycsw
description: A Helm chart for pycsw
version: 3.0.0-beta2
appVersion: 3.0.0-beta2


================================================
FILE: docker/helm/README.md
================================================
# Helm chart for pycsw services

Debug with:

```bash
helm install --dry-run --debug pycsw .
```
Test template rendering with:

```bash
helm template --debug .
```

Deploy with:

```bash
helm install pycsw .
```

The server should then be made available at the host/port specified by
`minikube service pycsw --url`.


================================================
FILE: docker/helm/templates/db-data-persistentvolumeclaim.yaml
================================================
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: {{ .Values.global.namespace }}
  creationTimestamp: null
  labels:
    io.kompose.service: {{ .Values.db.volume_name }}
  name: {{ .Values.db.volume_name }}
spec:
  {{ if .Values.db.volume_storage_type }}
  storageClassName: {{ .Values.db.volume_storage_type }}
  {{ end }}
  accessModes:
  - {{ .Values.db.volume_access_modes }}
  resources:
    requests:
      storage: {{ .Values.db.volume_size }}
status: {}


================================================
FILE: docker/helm/templates/db-service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  namespace: {{ .Values.global.namespace }}
  labels:
    io.kompose.service: {{ .Values.db.name }}
  name: {{ .Values.db.name }}
spec:
  ports:
  - name: "default"
    port: {{ .Values.db.port }}
    targetPort: {{ .Values.db.port }}
  selector:
    io.kompose.service: {{ .Values.db.name }}


================================================
FILE: docker/helm/templates/db-statefulset.yaml
================================================
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: {{ .Values.global.namespace }}
  labels:
    io.kompose.service: {{ .Values.db.name }}
  name: {{ .Values.db.name }}
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: {{ .Values.db.name }}
  # strategy:
  #   type: Recreate
  serviceName: {{ .Values.db.name }}
  template:
    metadata:
      labels:
        io.kompose.service: {{ .Values.db.name }}
    spec:
      containers:
      - env:
        - name: PGDATA
          value: {{ .Values.db.volume_path }}
        - name: POSTGRES_DB
          value: {{ .Values.db.database }}
        - name: POSTGRES_PASSWORD
          value: {{ .Values.db.pass }}
        - name: POSTGRES_USER
          value: {{ .Values.db.user }}
        image: {{ .Values.db.image }}
        name: {{ .Values.db.name }}
        ports:
        - containerPort: {{ .Values.db.port }}
        resources: {}
        volumeMounts:
        - mountPath: {{ .Values.db.volume_path }}
          name: {{ .Values.db.volume_name }}
        securityContext:
          readOnlyRootFilesystem: true
      restartPolicy: Always
  volumeClaimTemplates:
    - metadata:
        name: {{ .Values.db.volume_name }}
      spec:
        storageClassName: {{ .Values.db.volume_storage_type }}
        accessModes:
        - {{ .Values.db.volume_access_modes }}
        resources:
          requests:
            storage: {{ .Values.db.volume_size }}
# status: {}


================================================
FILE: docker/helm/templates/pycsw-configmap.yaml
================================================
apiVersion: v1
data:
  pycsw.yml: |+
{{- if .Values.pycsw.config }}
  {{- toYaml .Values.pycsw.config | nindent 4 -}}
{{- end }}

kind: ConfigMap
metadata:
  name: {{ .Values.pycsw.configmap_name }}
  namespace: {{ .Values.global.namespace }}


================================================
FILE: docker/helm/templates/pycsw-deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: {{ .Values.global.namespace }}
  labels:
    io.kompose.service: {{ .Values.pycsw.name }}
  name: {{ .Values.pycsw.name }}
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: {{ .Values.pycsw.name }}
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        io.kompose.service: {{ .Values.pycsw.name }}
    spec:
      containers:
      - env:
        - name: PYCSW_SERVER_URL
          value: {{ .Values.pycsw.config.server.url }}
        - name: PYCSW_REPOSITORY_DATABASE_URI
          value: {{ .Values.pycsw.config.repository.database }}
        image: {{ .Values.pycsw.image }}
        name: {{ .Values.pycsw.name }}
        ports:
        - containerPort: {{ .Values.pycsw.container_port }}
        resources: {}
        volumeMounts:
        - mountPath: {{ .Values.pycsw.volume_path }}
          name: {{ .Values.pycsw.volume_name }}
        securityContext:
          readOnlyRootFilesystem: true
      restartPolicy: Always
      volumes:
      - name: {{ .Values.pycsw.volume_name }}
        configMap:
          name: {{ .Values.pycsw.configmap_name }}


================================================
FILE: docker/helm/templates/pycsw-service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  namespace: {{ .Values.global.namespace }}
  labels:
    io.kompose.service: {{ .Values.pycsw.name }}
  name: {{ .Values.pycsw.name }}
spec:
  type: {{ .Values.pycsw.service_type }}
  ports:
    - port: {{ .Values.pycsw.service_port }}
      {{ if .Values.pycsw.service_node_port }}
      nodePort: {{ .Values.pycsw.service_node_port }}
      {{ end }}
      {{ if .Values.pycsw.service_target_port }}
      targetPort: {{ .Values.pycsw.service_target_port }}
      {{ end }}
      {{ if .Values.pycsw.service_port_protocol }}
      protocol: {{ .Values.pycsw.service_port_protocol }}
      {{ end }}
      name: {{ .Values.pycsw.service_port_name }}
  selector:
    io.kompose.service: {{ .Values.pycsw.name }}


================================================
FILE: docker/helm/values.yaml
================================================
global:
  namespace: default

db:
  name: db
  image: postgis/postgis:17-3.5
  port: 5432
  database: pycsw
  user: postgres
  pass: mypass
  volume_name: db-data
  volume_path: /var/lib/postgresql/data/pgdata
  volume_size: 500Mi
  volume_access_modes: ReadWriteOnce
  volume_storage_type: standard

pycsw:
  name: pycsw
  image: geopython/pycsw:latest
  container_port: 8000
  service_type: NodePort
  service_port: 8000
  service_port_name: http
  service_node_port: 30000
  # service_port_protocol: TCP
  # service_target_port: 8000
  configmap_name: pycsw-configmap
  volume_name: pycsw-config
  volume_path: /etc/pycsw
  config:
    server:
      url: http://localhost:8000
      mimetype: application/xml; charset=UTF-8
      encoding: UTF-8
      language: en-US
      maxrecords: 10
      # ogc_schemas_base: http://foo
      # pretty_print: true
      # gzip_compresslevel: 8
      # domainquerytype: range
      # domaincounts: true
      # spatial_ranking: true
      # workers: 2
      timeout: 30
    logging:
      level: ERROR
      # logfile: /tmp/pycsw.log
    profiles:
      - apiso
    # federatedcatalogues:
    #  - id: fedcat01
    #    type: CSW 
    #    title: Arctic SDI 
    #    url: https://catalogue.arctic-sdi.org/csw
    manager:
      transactions: "false"
      allowed_ips:
        - 127.0.0.1
      csw_harvest_pagesize: 10
    # pubsub:
    #   broker:
    #   type: mqtt
    #   url: mqtt://localhost:1883
    metadata:
      identification:
        title: pycsw Geospatial Catalogue
        description: pycsw is an OARec and OGC CSW server implementation written in Python
        keywords:
          - catalogue
          - discovery
          - metadata
        keywords_type: theme
        fees: None
        accessconstraints: None
        terms_of_service: https://creativecommons.org/licenses/by/4.0
        url: https://example.org
      license:
        name: CC-BY 4.0 license
        url: https://creativecommons.org/licenses/by/4.0
      provider:
        name: Organization Name
        url: https://pycsw.org/
      contact:
        name: Lastname, Firstname
        position: Position Title
        address: Mailing Address
        city: City
        stateorprovince: Administrative Area
        postalcode: Zip or Postal Code
        country: Country
        phone: +xx-xxx-xxx-xxxx
        fax: +xx-xxx-xxx-xxxx
        email: Email Address
        url: Contact URL
        hours: Hours of Service
        instructions: During hours of service.  Off on weekends.
        role: pointOfContact
      inspire:
        enabled: "true"
        languages_supported:
          - eng
          - gre
        default_language: eng
        date: YYYY-MM-DD
        gemet_keywords:
          - Utility and governmental services
        conformity_service: notEvaluated
        contact_name: Organization Name
        contact_email: Email Address
        temp_extent:
          begin: YYYY-MM-DD
          end: YYYY-MM-DD
    repository:
      database: postgresql://postgres:mypass@db/pycsw
      table: records
      # mappings: path/to/mappings.py
      # filter: type = 'http://purl.org/dc/dcmitype/Dataset'
      # max_retries: 5
      # stable_sort: true
      facets:
        - type
        - title


================================================
FILE: docker/kubernetes/Makefile
================================================

PYCSW_DOCKER_IMAGE=latest

convert:
	PYCSW_DOCKER_IMAGE=$(PYCSW_DOCKER_IMAGE) kompose convert --volumes hostPath

up:
	kubectl apply -f db-data-persistentvolumeclaim.yaml
	kubectl apply -f db-deployment.yaml
	kubectl apply -f db-service.yaml
	kubectl apply -f pycsw-configmap.yaml
	kubectl apply -f pycsw-deployment.yaml
	kubectl apply -f pycsw-service.yaml

down:
	kubectl delete service pycsw
	kubectl delete service db
	kubectl delete deployment pycsw
	kubectl delete deployment db

remove-volumes:
	kubectl delete configmap pycsw-config
	kubectl delete PersistentVolumeClaim db-data

open:
	minikube service pycsw --url

restart: down up

status:
	kubectl get all -o wide


================================================
FILE: docker/kubernetes/db-data-persistentvolumeclaim.yaml
================================================
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: db-data
  name: db-data
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
status: {}


================================================
FILE: docker/kubernetes/db-deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    io.kompose.service: db
  name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: db
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        io.kompose.service: db
    spec:
      containers:
      - env:
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        - name: POSTGRES_DB
          value: pycsw
        - name: POSTGRES_PASSWORD
          value: mypass
        - name: POSTGRES_USER
          value: postgres
        image: postgis/postgis:17-3.5
        name: db
        ports:
        - containerPort: 5432
        resources: {}
        volumeMounts:
        - mountPath: /var/lib/postgresql/data/pgdata
          name: db-data
        securityContext:
          readOnlyRootFilesystem: true
      restartPolicy: Always
      volumes:
      - name: db-data
        persistentVolumeClaim:
          claimName: db-data
status: {}


================================================
FILE: docker/kubernetes/db-service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  labels:
    io.kompose.service: db
  name: db
spec:
  ports:
  - name: "5432"
    port: 5432
    targetPort: 5432
  selector:
    io.kompose.service: db
status:
  loadBalancer: {}


================================================
FILE: docker/kubernetes/pycsw-configmap.yaml
================================================
apiVersion: v1
data:
  pycsw.yml: |+
    # =================================================================
    #
    # Authors: Tom Kralidis <tomkralidis@gmail.com>
    #          Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
    #          Angelos Tzotsos <tzotsos@gmail.com>
    #
    # Copyright (c) 2026 Tom Kralidis
    # Copyright (c) 2017 Ricardo Garcia Silva
    # Copyright (c) 2024 Angelos Tzotsos
    #
    # Permission is hereby granted, free of charge, to any person
    # obtaining a copy of this software and associated documentation
    # files (the "Software"), to deal in the Software without
    # restriction, including without limitation the rights to use,
    # copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the
    # Software is furnished to do so, subject to the following
    # conditions:
    #
    # The above copyright notice and this permission notice shall be
    # included in all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    # OTHER DEALINGS IN THE SOFTWARE.
    #
    # =================================================================
    
    server:
        url: ${PYCSW_SERVER_URL}
        mimetype: application/xml; charset=UTF-8
        encoding: UTF-8
        language: en-US
        maxrecords: 10
        timeout: 30
        #ogc_schemas_location: http://foo
        #pretty_print: true
        #gzip_compresslevel: 9
        #domainquerytype: range
        #domaincounts: true
        #spatial_ranking: true
        #workers=2
    
    logging:
        level: DEBUG
        #logfile: /tmp/pycsw.log
    
    profiles:
        - apiso
    
    federatedcatalogues:
        - id: fedcat01
          type: CSW 
          title: Arctic SDI 
          url: https://catalogue.arctic-sdi.org/csw
    
    manager:
        transactions: false
        allowed_ips:
            - 127.0.0.1
        #csw_harvest_pagesize: 10
    
    metadata:
        identification:
            title: pycsw Geospatial Catalogue
            description: pycsw is an OARec and OGC CSW server implementation written in Python
            keywords:
                - catalogue
                - discovery
                - metadata
            keywords_type: theme
            fees: None
            accessconstraints: None
            terms_of_service: https://creativecommons.org/licenses/by/4.0
            url: https://example.org
        license:
            name: CC-BY 4.0 license
            url: https://creativecommons.org/licenses/by/4.0
        provider:
            name: Organization Name
            url: https://pycsw.org
        contact:
            name: Lastname, Firstname
            position: Position Title
            address: Mailing Address
            city: City
            stateorprovince: Administrative Area
            postalcode: Zip or Postal Code
            country: Country
            phone: +xx-xxx-xxx-xxxx
            fax: +xx-xxx-xxx-xxxx
            email: you@example.org
            url: Contact URL
            hours: Mo-Fr 08:00-17:00
            instructions: During hours of service. Off on weekends.
            role: pointOfContact
        inspire:
            enabled: true
            languages_supported:
                - eng
                - gre
            default_language: eng
            date: YYYY-MM-DD
            gemet_keywords:
                - Utility and governmental services
            conformity_service: notEvaluated
            contact_name: Organization Name
            contact_email: Email Address
            temp_extent:
                begin: YYYY-MM-DD
                end: YYYY-MM-DD

    repository:
        database: ${PYCSW_REPOSITORY_DATABASE_URI}
        table: records
        facets:
            - type
            - title

kind: ConfigMap
metadata:
  creationTimestamp: "2020-10-12T20:12:04Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:pycsw_config: {}
    manager: kubectl
    operation: Update
    time: "2020-10-12T20:12:04Z"
  name: pycsw-configmap
  namespace: default
  resourceVersion: "192581"
  selfLink: /api/v1/namespaces/default/configmaps/pycsw-configmap
  uid: 95a9327a-0091-4f07-abf9-093f59dc3a24


================================================
FILE: docker/kubernetes/pycsw-deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    io.kompose.service: pycsw
  name: pycsw
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: pycsw
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        io.kompose.service: pycsw
    spec:
      containers:
      - env:
        - name: PYCSW_SERVER_URL
          value: http://localhost:8000
        - name: PYCSW_REPOSITORY_DATABASE_URI
          value: postgresql://postgres:mypass@db/pycsw
        image: 'geopython/pycsw:latest'
        name: pycsw
        ports:
        - containerPort: 8000
        resources: {}
        volumeMounts:
        - mountPath: /etc/pycsw
          name: pycsw-config
        securityContext:
         readOnlyRootFilesystem: true
      restartPolicy: Always
      volumes:
      - name: pycsw-config
        configMap:
          name: pycsw-configmap
status: {}


================================================
FILE: docker/kubernetes/pycsw-service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  labels:
    io.kompose.service: pycsw
  name: pycsw
spec:
  type: NodePort
  ports:
    - port: 8000
      nodePort: 30000
  selector:
    io.kompose.service: pycsw
status:
  loadBalancer: {}


================================================
FILE: docker/min-apk
================================================
#!/bin/sh -e

apk --update add $@ && rm -rf /var/cache/apk/* || false

strip --strip-unneeded --strip-debug /usr/lib/*.a || true


================================================
FILE: docker/pycsw.yml
================================================
# =================================================================
#
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#          Ricardo Garcia Silva <ricardo.garcia.silva@gmail.com>
#
# Copyright (c) 2026 Tom Kralidis
# Copyright (c) 2017 Ricardo Garcia Silva
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================

server:
    url: http://localhost:8000/
    mimetype: application/xml; charset=UTF-8
    encoding: UTF-8
    language: en-US
    maxrecords: 10
    timeout: 30
    #ogc_schemas_location: http://foo
    #pretty_print: true
    gzip_compresslevel: 9
    #domainquerytype: range
    #domaincounts: true
    #spatial_ranking: true
    #workers=2

logging:
    level: DEBUG
    #logfile: /tmp/pycsw.log

profiles:
    - apiso

federatedcatalogues:
    - id: fedcat01
      type: CSW
      title: Arctic SDI
      url: https://catalogue.arctic-sdi.org/csw

manager:
    transactions: false
    allowed_ips:
        - 127.0.0.1
#    csw_harvest_pagesize: 10

metadata:
    identification:
        title: pycsw Geospatial Catalogue
        description: pycsw is an OARec and OGC CSW server implementation written in Python
        keywords:
            - catalogue
            - discovery
            - metadata
        keywords_type: theme
        fees: None
        accessconstraints: None
        terms_of_service: https://creativecommons.org/licenses/by/4.0
        url: https://example.org
    license:
        name: CC-BY 4.0 license
        url: https://creativecommons.org/licenses/by/4.0
    provider:
        name: Organization Name
        url: https://pycsw.org
    contact:
        name: Lastname, Firstname
        position: Position Title
        address: Mailing Address
        city: City
        stateorprovince: Administrative Area
        postalcode: Zip or Postal Code
        country: Country
        phone: +xx-xxx-xxx-xxxx
        fax: +xx-xxx-xxx-xxxx
        email: you@example.org
        url: Contact URL
        hours: Mo-Fr 08:00-17:00
        instructions: During hours of service. Off on weekends.
        role: pointOfContact

    inspire:
        enabled: true
        languages_supported:
            - eng
            - gre
        default_language: eng
        date: YYYY-MM-DD
        gemet_keywords:
            - Utility and governmental services
        conformity_service: notEvaluated
        contact_name: Organization Name
        contact_email: Email Address
        temp_extent: 
            begin: YYYY-MM-DD
            end: YYYY-MM-DD
 
repository:
    # sqlite
    database: 'sqlite:////home/pycsw/pycsw/tests/functionaltests/suites/cite/data/cite.db'
    table: records


================================================
FILE: docs/Makefile
================================================
# Makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = _build

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -W -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext

help:
	@echo "Please use \`make <target>' where <target> is one of"
	@echo "  html       to make standalone HTML files"
	@echo "  dirhtml    to make HTML files named index.html in directories"
	@echo "  singlehtml to make a single large HTML file"
	@echo "  pickle     to make pickle files"
	@echo "  json       to make JSON files"
	@echo "  htmlhelp   to make HTML files and a HTML help project"
	@echo "  qthelp     to make HTML files and a qthelp project"
	@echo "  devhelp    to make HTML files and a Devhelp project"
	@echo "  epub       to make an epub"
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
	@echo "  text       to make text files"
	@echo "  man        to make manual pages"
	@echo "  texinfo    to make Texinfo files"
	@echo "  info       to make Texinfo files and run them through makeinfo"
	@echo "  gettext    to make PO message catalogs"
	@echo "  changes    to make an overview of all changed/added/deprecated items"
	@echo "  linkcheck  to check all external links for integrity"
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"

clean:
	-rm -rf $(BUILDDIR)/*

html:
	mkdir -p $(BUILDDIR)
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

dirhtml:
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

singlehtml:
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
	@echo
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

pickle:
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
	@echo
	@echo "Build finished; now you can process the pickle files."

json:
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
	@echo
	@echo "Build finished; now you can process the JSON files."

htmlhelp:
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in $(BUILDDIR)/htmlhelp."

qthelp:
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
	@echo
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pycsw.qhcp"
	@echo "To view the help file:"
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pycsw.qhc"

devhelp:
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
	@echo
	@echo "Build finished."
	@echo "To view the help file:"
	@echo "# mkdir -p $$HOME/.local/share/devhelp/pycsw"
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pycsw"
	@echo "# devhelp"

epub:
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
	@echo
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

latex:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
	      "(use \`make latexpdf' here to do that automatically)."

latexpdf:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through pdflatex..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

text:
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
	@echo
	@echo "Build finished. The text files are in $(BUILDDIR)/text."

man:
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
	@echo
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

texinfo:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo
	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
	@echo "Run \`make' in that directory to run these through makeinfo" \
	      "(use \`make info' here to do that automatically)."

info:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo "Running Texinfo files through makeinfo..."
	make -C $(BUILDDIR)/texinfo info
	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."

gettext:
	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
	@echo
	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."

changes:
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
	@echo
	@echo "The overview file is in $(BUILDDIR)/changes."

linkcheck:
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in $(BUILDDIR)/linkcheck/output.txt."

doctest:
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
	@echo "Testing of doctests in the sources finished, look at the " \
	      "results in $(BUILDDIR)/doctest/output.txt."


================================================
FILE: docs/_static/favicon/browserconfig.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
    <msapplication>
        <tile>
            <square150x150logo src="/mstile-150x150.png"/>
            <TileColor>#2d89ef</TileColor>
        </tile>
    </msapplication>
</browserconfig>


================================================
FILE: docs/_templates/indexsidebar.html
================================================
<p>
    <img style="background: white;" alt="pycsw" src="https://raw.githubusercontent.com/geopython/pycsw/master/docs/_static/logo/logo-horizontal.png" height="75" />
</p>

    <p>pycsw is Certified <a href="https://www.ogc.org/resources/product-details/?pid=1661">OGC Compliant</a> and is an <a href="https://demo.pycsw.org/">OGC Reference Implementation</a></p>
    <p>
      <a title="DOI" href="https://zenodo.org/badge/latestdoi/2367090"><img src="https://zenodo.org/badge/2367090.svg" alt="DOI"></a>
    </p>
    <p>
      <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="https://www.opengeospatial.org/resource/products/details/?pid=1661"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." src="https://portal.ogc.org/public_ogc/compliance/OGC_Certified_Badge.png" height="74"/></a>
    </p>
    <p>
      <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 3.0.0. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="https://www.opengeospatial.org/resource/products/details/?pid=1661"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 3.0.0. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." src="https://portal.ogc.org/public_ogc/compliance/badge.php?s=CAT%203.0&r=1&n=1" height="38"/></a>
    </p>
    <p>
      <a title="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="https://www.opengeospatial.org/resource/products/details/?pid=1661"><img alt="This product conforms to the OpenGIS Catalogue Service Implementation Specification [Catalogue Service for the Web], Revision 2.0.2. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." src="https://portal.ogc.org/public_ogc/compliance/badge.php?s=CAT%202.0.2&r=1&n=1" height="38"/></a>
    </p>
    <p>
      <a title="This product conforms to the OGC GeoRSS Encoding Standard version 1.0. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." href="https://www.opengeospatial.org/resource/products/details/?pid=1374"><img alt="This product conforms to the OGC GeoRSS Encoding Standard version 1.0. OGC, OGC®, and CERTIFIED OGC COMPLIANT are trademarks or registered trademarks of the Open Geospatial Consortium, Inc. in the United States and other countries." src="https://portal.ogc.org/public_ogc/compliance/badge.php?s=georss%201.0&r=1&n=1" height="38"/></a>
    </p>
<p>
    <img style="background: white;" alt="OSGeo Project" src="https://raw.githubusercontent.com/OSGeo/osgeo/master/incubation/project/OSGeo_project.png" height="64"/>
</p>

<p>
    <script type="text/javascript" src="https://www.openhub.net/p/488022/widgets/project_thin_badge.js"></script> 
</p>


================================================
FILE: docs/_templates/layout.html
================================================
{% extends "!layout.html" %}

{%- block extrahead %}
{{ super() }}

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-32855587-1']);
  _gaq.push(['_setDomainName', 'pycsw.org']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

{% endblock %}

{% block relbar1 %}

<style type="text/css">
  .header a:link{color: white;}
  .header a:visited{color: white;}
  .metadata-model-table {background-color: white;}
  .padded{padding: 10px 10px;}
</style>

{{ super() }}
{% endblock %}

{% block footer %}

<div class="footer">
    <p>&copy; Copyright {{ copyright }}<br/>Last updated on {{ last_updated }}</p>
    <p>
        <a href="https://pycsw.org">Website</a> &mdash;
        <a href="https://pycsw.org/community">Community</a> &mdash;
        <a href="https://pycsw.org/blog">Blog</a> &mdash;
        <a href="https://pycsw.org/download">Download</a> &mdash;
        <a href="https://github.com/geopython/pycsw">Source</a> &mdash;
        <a href="https://github.com/geopython/pycsw/issues">Issues</a> &mdash;
        <a href="https://lists.osgeo.org/mailman/listinfo/pycsw-devel">Mailing List</a>
    </p>
</div>
{% endblock %}


================================================
FILE: docs/administration.rst
================================================
.. _administration:

Administration
==============

pycsw administration is handled by the ``pycsw-admin.py`` utility.  ``pycsw-admin.py``
is installed as part of the pycsw install process and should be available in your
PATH.

.. note::
  Run ``pycsw-admin.py --help`` to see all administration operations and parameters

Metadata Repository Setup
-------------------------

pycsw supports the following databases:

- SQLite3
- PostgreSQL (without PostGIS)
- PostgreSQL with PostGIS enabled
- MySQL

.. note::
  The easiest and fastest way to deploy pycsw is to use SQLite3 as the backend. To use an SQLite
  in-memory database, in the pycsw configuration, set `repository.database` to ``sqlite://``.

.. note::
  PostgreSQL support includes support for PostGIS functions if enabled

.. note::
  If PostGIS is activated before setting up the pycsw/PostgreSQL database, then native PostGIS geometries will be enabled.

To expose your geospatial metadata via pycsw, perform the following actions:

- setup the database
- import metadata
- publish the repository

Supported Information Models
----------------------------

By default, pycsw's API  supports the core OGC API - Records and CSW Record information models.  From
the database perspective, the pycsw metadata model is loosely based on ISO 19115 and is
able to transform to other formats as part of transformation during OGC API - Records/CSW requests.

.. note::
  See :ref:`profiles` for information on enabling profiles

.. note::
  See :ref:`metadata-model-reference` for detailed information on pycsw's internal metadata model

Setting up the Database
-----------------------

.. code-block:: bash

  pycsw-admin.py setup-repository --config default.yml

This will create the necessary tables and values for the repository.

The database created is an `OGC SFSQL`_ compliant database, and can be used with any implementing software.  For example, to use with `GDAL`_:

.. code-block:: bash

  ogrinfo /path/to/records.db
  INFO: Open of 'records.db'
  using driver 'SQLite' successful.
  1: records (Polygon)
  ogrinfo -al /path/to/records.db
  # lots of output

.. note::
  If PostGIS is detected, the ``pycsw-admin.py`` script does not create the SFSQL tables as they are already in the database.


Loading Records
----------------

.. code-block:: bash

  pycsw-admin.py load-records --config default.yml --path /path/to/records

This will import all ``*.xml`` records from ``/path/to/records`` into the database specified in ``default.yml`` (``repository.database``).  Passing ``-r`` to the script will process ``/path/to/records`` recursively.  Passing ``-y`` to the script will force overwrite existing metadata with the same identifier.  Note that ``-p`` accepts either a directory path or single file.

.. note::
  Records can also be imported using CSW-T (see :ref:`transactions`).

Exporting the Repository
------------------------

.. code-block:: bash

  pycsw-admin.py export-records --config default.yml --path /path/to/output_dir

This will write each record in the database specified in ``default.yml`` (``repository.database``) to an XML document on disk, in directory ``/path/to/output_dir``.

Optimizing the Database
-----------------------

.. code-block:: bash

  pycsw-admin.py optimize-db --config default.yml
  pycsw-admin.py rebuild-db-indexes --config default.yml

.. note::
  This feature is relevant only for PostgreSQL and MySQL

Deleting Records from the Repository
------------------------------------

.. code-block:: bash

  pycsw-admin.py delete-records --config default.yml

This will empty the repository of all records.

Database Specific Notes
-----------------------

PostgreSQL
^^^^^^^^^^

-  To enable PostgreSQL support, the database user must be able to create functions within the database.
- `PostgreSQL Full Text Search`_ is supported for ``csw:AnyText`` based queries.  pycsw creates a tsvector column based on the text from anytext column. Then pycsw creates a GIN index against the anytext_tsvector column.  This is created automatically in ``pycsw.core.repository.setup``.  Any query against the OGC API - Records ``q`` parameter or CSW `csw:AnyText` or `apiso:AnyText` will process using PostgreSQL FTS handling

PostGIS
^^^^^^^

- pycsw makes use of PostGIS spatial functions and native geometry data type.
- It is advised to install the PostGIS extension before setting up the pycsw database
- If PostGIS is detected, the ``pycsw-admin.py`` script will create both a native geometry column and a WKT column, as well as a trigger to keep both synchronized
- In case PostGIS gets disabled, pycsw will continue to work with the `WKT`_ column
- In case of migration from plain PostgreSQL database to PostGIS, the spatial functions of PostGIS will be used automatically
- When migrating from plain PostgreSQL database to PostGIS, in order to enable native geometry support, a "GEOMETRY" column named "wkb_geometry" needs to be created manually (along with the update trigger in ``pycsw.core.repository.setup``). Also the native geometries must be filled manually from the `WKT`_ field. Next versions of pycsw will automate this process

.. _custom_repository:

Mapping to an Existing Repository
---------------------------------

pycsw supports publishing metadata from an existing repository.  To enable this functionality, the default database
mappings must be modified to represent the existing database columns mapping to the abstract core model (the default
mappings are in ``pycsw/core/config.py:StaticContext.md_core_model``).

To override the default settings:

- define a custom database mapping based on ``etc/mappings.py``
- in ``default.yml``, set ``repository.mappings`` to the location of the mappings.py file:

.. code-block:: yaml

  repository:
      ...
      mappings: path/to/mappings.py

Note you can also reference mappings as a Python object as a dotted path:

.. code-block:: yaml

  repository:
      ...
      mappings: path.to.pycsw_mappings


See the :ref:`geonode`, :ref:`hhypermap`, and :ref:`odc` for further examples.

.. _existing-repository-requirements:

Existing Repository Requirements
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

pycsw requires certain repository attributes and semantics to exist in any repository to operate as follows:

- ``pycsw:Identifier``: unique identifier
- ``pycsw:Typename``: typename for the metadata; typically the value of the root element tag (e.g. ``csw:Record``, ``gmd:MD_Metadata``)
- ``pycsw:Schema``: schema for the metadata; typically the target namespace (e.g. ``http://www.opengis.net/cat/csw/2.0.2``, ``http://www.isotc211.org/2005/gmd``)
- ``pycsw:InsertDate``: date of insertion
- ``pycsw:XML``: full XML representation (deprecated; will be removed in a future release)
- ``pycsw:Metadata``: full metadata representation
- ``pycsw:MetadataType``: media type of metadata representation
- ``pycsw:AnyText``: bag of XML element text values, used for full text search.  Realized with the following design pattern:

  - capture all XML element and attribute values
  - store in repository
- ``pycsw:BoundingBox``: string of `WKT`_ or `EWKT`_ geometry

The following repository semantics exist if the attributes are specified:

- ``pycsw:Keywords``: comma delimited list of keywords
- ``pycsw:Themes``: Text field of JSON list of objects with properties ``concepts``, ``scheme``

.. code-block:: json

   [
     {
       "concepts": [
         {
           "id": "atmosphericComposition"
         },
         {
           "id": "pollution"
         },
         {
           "id": "observationPlatform"
         },
         {
           "id": "rocketSounding"
         }
       ],
       "scheme": "https://wis.wmo.int/2012/codelists/WMOCodeLists.xml#WMO_CategoryCode"
     }
   ]

- ``pycsw:Contacts``: Text field of JSON list of objects with properties as per the OGC API - Records party definition

.. code-block:: json

   [
     {
       "name": "contact",
       "individual": "Lastname, Firstname",
       "positionName": "Position Title",
       "contactInfo": {
         "phone": {
           "office": "+xx-xxx-xxx-xxxx"
         },
         "email": {
           "office": "you@example.org"
         },
         "address": {
           "office": {
             "deliveryPoint": "Mailing Address",
             "city": "City",
             "administrativeArea": "Administrative Area",
             "postalCode": "Zip or Postal Code",
             "country": "COuntry"
           },
           "onlineResource": {
             "href": "Contact URL"
           }
         },
         "hoursOfService": "Hours of Service",
         "contactInstructions": "During hours of service.  Off on weekends",
         "url": {
           "rel": "canonical",
           "type": "text/html",
           "href": "https://example.org"
         }
       },
       "roles": [
         {
           "name": "pointOfContact"
         }
       ]
     }
   ]

- ``pycsw:Links``: Text field of JSON list of objects with properties ``name``, ``description``, ``protocol``, ``url``

.. code-block:: json

   [
     {
       "name": "foo",
       "description": "bar",
       "protocol": "OGC:WMS",
       "url": "https://example.org/wms"
     }
  ]

.. note::
  The ``pycsw:Links`` field should be a text type, not a JSON object type

- ``pycsw:Bands``: Text field of JSON list of dicts with properties: ``name``, ``units``, ``min``, ``max``

.. code-block:: json

   [
     {
       "name": "B1",
       "units": "nm",
       "min": 0.1,
       "max": 0.333
     }
  ]

.. note::
  The ``pycsw:Bands`` field should be a text type, not a JSON object type

Values of mappings can be derived from the following mechanisms:

- text fields
- Python datetime.datetime or datetime.date objects
- Python functions 

Further information is provided in ``pycsw/config.py:MD_CORE_MODEL``.


.. note::
  See :ref:`metadata-model-reference` for detailed information on pycsw's internal metadata model

Using a SQL View as the repository table
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If your pre-existing database stores information in a normalized fashion, *i.e.* distributed on multiple tables rather
than on a single table (which is what pycsw expects by default), you have the option to create a DB view and use that
as pycsw's repository.

As a practical example, lets say you have a `CKAN`_ project which you would like to also provide pycsw integration with.
CKAN stores dataset-related information over multiple tables:

- ``package`` - has base metadata fields for each dataset;
- ``package_extra`` - additional custom metadata fields, depending on the user's metadata schema;
- ``package_tag`` - dataset_related keywords;
- ``tag`` - dataset_related keywords;
- ``group`` - details about a dataset's owner organization;
- etc.

One way to adapt such a DB structure to be able to integrate with pycsw is to create a `PostgreSQL Materialized View`_.
For example:

.. code-block:: SQL

  CREATE MATERIALIZED VIEW IF NOT EXISTS my_pycsw_view AS
      WITH cte_extras AS (
          SELECT
                 p.id,
                 p.title,
                 g.title AS org_name,
                 json_object_agg(pe.key, pe.value) AS extras,
                 array_agg(DISTINCT t.name) AS tags
                 -- remaining columns omitted for brevity
          FROM package AS p
              JOIN package_extra AS pe ON p.id = pe.package_id
              JOIN "group" AS g ON p.owner_org = g.id
              JOIN package_tag AS pt ON p.id = pt.package_id
              JOIN tag AS t on pt.tag_id = t.id
          WHERE p.state = 'active'
           AND p.private = false
          GROUP BY p.id, g.title
      )
      SELECT
             c.id AS identifier,
             c.title AS title,
             c.org_name AS organization,
             ST_GeomFromGeoJSON(c.extras->>'spatial')::geometry(Polygon, 4326) AS geom,
             c.extras->>'reference_date' AS date,
             concat_ws(', ', VARIADIC c.tags) AS keywords
             -- remaining columns omitted for brevity
      FROM cte_extras AS c
  WITH DATA;

Creating this SQL view in the database means that all we now have the CKAN dataset information all on a single flat
table, ready for pycsw to integrate with.

A crucial setup that is required in order for SQL Views to be usable by pycsw is to include the additional
``column_constraints`` property in your custom mappings. This property is used to specify which column(s) should
function as the primary key of the SQL View:

.. code-block:: python

    # contents of my_custom_pycsw_mappings.py
    from sqlalchemy.schema import PrimaryKeyConstraint

    MD_CORE_MODEL = {
        "column_constraints": (PrimaryKeyConstraint("identifier"),),
        "typename": "pycsw:CoreMetadata",
        "outputschema": "http://pycsw.org/metadata",
        "mappings": {
            "pycsw:Identifier": "identifier",
            # remaining mappings omitted for brevity

The above code snippet demonstrates how you could instruct sqlalchemy, which is what pycsw uses to interface with
the DB, that the ``identifier`` column of the SQL view should be assumed to be the primary key of the table.

Finally, we can configure pycsw with the path to the custom mappings and the name of the SQL view:

.. code-block:: yaml

    # file: pycsw.yml

    repository:
        database: postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}
        mappings: /path/to/my_custom_pycsw_mappings.py
        table: my_pycsw_view


.. _`GDAL`: https://www.gdal.org
.. _`OGC SFSQL`: https://www.ogc.org/standards/sfs
.. _`WKT`: https://en.wikipedia.org/wiki/Well-known_text
.. _`EWKT`: https://en.wikipedia.org/wiki/Well-known_text#Variations
.. _`PostgreSQL Full Text Search`: https://www.postgresql.org/docs/current/textsearch.html
.. _`CKAN`: https://ckan.org/
.. _`PostgreSQL Materialized View`: https://www.postgresql.org/docs/current/sql-creatematerializedview.html


================================================
FILE: docs/api.rst
================================================
.. _api:

API
===

Python applications can integrate pycsw into their custom workflows.  This
allows for seamless integate within frameworks such as Flask and Django.

Below are examples of where using the API (as opposed to the default WSGI/CGI
services could be used:

- configuration based on a Python dict, or stored in a database
- downstream request environment / framework (Flask, Django)
- authentication or authorization logic
- forcing CSW version 2.0.2 as default

OGC API - Records Flask Example
-------------------------------

See https://github.com/geopython/pycsw/blob/master/pycsw/wsgi_flask.py for how
to implement a Flask wrapper atop all pycsw supported APIs.  Note the use of
Flask blueprints to enable integration with downstream Flask applications.

Simple Flask blueprint example
------------------------------

.. code-block:: python

  from flask import Flask, redirect

  from pycsw.wsgi_flask import BLUEPRINT as pycsw_blueprint

  app = Flask(__name__, static_url_path='/static')

  app.url_map.strict_slashes = False
  app.register_blueprint(pycsw_blueprint, url_prefix='/oapi')

  @app.route('/')
  def hello_world():
      return "Hello, World!"


In the above example, all pycsw endpoints are made available under ``http://localhost:8000/oapi``.

Simple CSW Flask Example
------------------------

.. code-block:: python

  import logging

  from flask import Flask, request

  from pycsw import __version__ as pycsw_version
  from pycsw.server import Csw

  LOGGER = logging.getLogger(__name__)
  APP = Flask(__name__)
 
  @APP.route('/csw')
  def csw_wrapper():
      """CSW wrapper"""

      LOGGER.info('Running pycsw %s', pycsw_version)

      pycsw_config = some_dict  # really comes from somewhere

      # initialize pycsw
      # pycsw_config: dict of the pycsw configuration
      #
      # env: dict of (HTTP) environment (defaults to os.environ)
      # 
      # version: defaults to '3.0.0'
      my_csw = Csw(pycsw_config, request.environ, version='2.0.2')

      # dispatch the request
      http_status_code, response = my_csw.dispatch_wsgi()

      return response, http_status_code, {'Content-type': csw.contenttype}


================================================
FILE: docs/ckan.rst
================================================
.. _ckan:

CKAN Configuration
==================

CKAN (https://ckan.org) is a powerful data management system that makes data accessible – by providing tools to streamline publishing, sharing, finding and using data. CKAN is aimed at data publishers (national and regional governments, companies and organizations) wanting to make their data open and available.

`ckanext-spatial`_ is CKAN's geospatial extension.  The extension adds a spatial field to the default CKAN dataset schema, using PostGIS as the backend. This allows to perform spatial queries and display the dataset extent on the frontend. It also provides harvesters to import geospatial metadata into CKAN from other sources, as well as commands to support the CSW standard. Finally, it also includes plugins to preview spatial formats such as GeoJSON.

CKAN Setup
----------

Installation and configuration Instructions are provided as part of the ckanext-spatial `documentation`_.

.. _`ckanext-spatial`: https://github.com/ckan/ckanext-spatial
.. _`documentation`: https://docs.ckan.org/projects/ckanext-spatial/en/latest/csw.html


================================================
FILE: docs/committers.rst
================================================
.. _committers:

Committers
==========

.. include:: ../COMMITTERS.txt


================================================
FILE: docs/conf.py
================================================
# -*- coding: utf-8 -*-
# =================================================================
#
# Authors: Tom Kralidis <tomkralidis@gmail.com>
#
# Copyright (c) 2026 Tom Kralidis
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# =================================================================
#
# pycsw documentation build configuration file, created by
# sphinx-quickstart on Fri Aug  2 19:48:50 2013.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.

import sys
from unittest.mock import MagicMock

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))

# -- General configuration -----------------------------------------------------

# locale 
locale_dirs = ['locale/']

# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = []

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# The suffix of source filenames.
source_suffix = {'.rst': 'restructuredtext'}

locale_dirs = ['locale/'] # path is example but recommended.

# The encoding of source files.
#source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = u'pycsw'
authors = u'Tom Kralidis'
license = u'This work is licensed under a Creative Commons Attribution 4.0 International License'
copyright = u'2010-2026, ' + authors + ' ' + license

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '3.0-dev'
# The full version, including alpha/beta/rc tags.
release = version

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%Y-%m-%d'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']

# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
show_authors = True

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []


# -- Options for HTML output ---------------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = 'classic'

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
html_theme_options = {
    'sidebarbgcolor': '#356aa0',
    'sidebarlinkcolor': '#ffffff',
    'relbarlinkcolor': '#ffffff',
    'footerbgcolor': '#356aa0'
}

# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
#html_title = 'Documentation'

# A shorter title for the navigation bar.  Default is the same as html_title.
#html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None

# The name of an image file (within the static path) to use as favicon of the
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
html_favicon = '_static/favicon/favicon.ico'

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%Y-%m-%dT%H:%M:%SZ'

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
html_sidebars = {
    #'index':'indexsidebar.html',
    '**': ['indexsidebar.html']
}

# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}

# If false, no module index is generated.
#html_domain_indices = True

# If false, no index is generated.
html_use_index = False

# If true, the index is split into individual pages for each letter.
#html_split_index = False

# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None

# Output file base name for HTML help builder.
htmlhelp_basename = 'pycswdoc'


# -- Options for LaTeX output --------------------------------------------------

latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',

# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',

# Additional stuff for the LaTeX preamble.
#'preamble': '',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
  ('index', 'pycsw.tex', u'pycsw Documentation',
   authors, 'manual'),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False

# If true, show page references after internal links.
#latex_show_pagerefs = False

# If true, show URL addresses after external links.
#latex_show_urls = False

# Documents to append as an appendix to all manuals.
#latex_appendices = []

# If false, no module index is generated.
#latex_domain_indices = True


# -- Options for manual page output --------------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    ('index', 'pycsw', u'pycsw Documentation',
     [authors], 1)
]

# If true, show URL addresses after external links.
#man_show_urls = False


# -- Options for Texinfo output ------------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
  ('index', 'pycsw', u'pycsw Documentation',
   authors, 'pycsw', 'One line description of project.',
   'Miscellaneous'),
]

# Documents to append as an appendix to all manuals.
#texinfo_appendices = []

# If false, no module index is generated.
#texinfo_domain_indices = True

# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'


# -- Options for Epub output ---------------------------------------------------

# Bibliographic Dublin Core info.
epub_title = u'pycsw'
epub_author = authors
epub_publisher = authors
epub_copyright = copyright

# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''

# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''

# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''

# A unique identification for the text.
#epub_uid = ''

# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()

# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []

# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []

# A list of files that should not be packed into the epub file.
#epub_exclude_files = []

# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3

# Allow duplicate toc entries.
#epub_tocdup = True

# mock out imports with C extensions for building on readthedocs.io

class Mock(MagicMock):
    @classmethod
    def __getattr__(cls, name):
            return MagicMock()

MOCK_MODULES = ['shapely']
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)



================================================
FILE: docs/configuration.rst
================================================
.. _configuration:

Configuration
=============

pycsw's runtime configuration is defined by ``default.yml``.  pycsw ships with a `sample configuration`_ (``default-sample.yml``).  Copy the file to ``default.yml`` and edit the following:

**server**

- **home**: the full filesystem path to pycsw
- **url**: the URL of the resulting service
- **mimetype**: the MIME type when returning HTTP responses
- **language**: the ISO 639-1 language and ISO 3166-1 alpha2 country code of the service (e.g. ``en-CA``, ``fr-CA``, ``en-US``)
- **encoding**: the content type encoding (e.g. ``ISO-8859-1``, see https://docs.python.org/2/library/codecs.html#standard-encodings).  Default value is 'UTF-8'
- **maxrecords**: the maximum number of records to return by default.  This value is enforced if a CSW's client's ``maxRecords`` parameter is greater than ``server.maxrecords`` to limit capacity.  See :ref:`maxrecords-handling` for more information
- **level**: the logging level (see https://docs.python.org/library/logging.html#logging-levels)
- **logfile**: the full file path to the logfile
- **ogc_schemas_base**: base URL of OGC XML schemas tree file structure (default is http://schemas.opengis.net)
- **federatedcatalogues**: arrray of distributed catalogue endpoints to be used for distributed searching, if requested by the client (see :ref:`distributedsearching`)
- **pretty_print**: whether to pretty print the output (``true`` or ``false``).  Default is ``false``
- **gzip_compresslevel**: gzip compression level, lowest is ``1``, highest is ``9``.  Default is off.  **NOTE**: if gzip compression is already enabled via your web server, do not enable this directive (or else the server will try to compress the response twice, resulting in degraded performance)
- **domainquerytype**: for GetDomain operations, how to output domain values.  Accepted values are ``list`` and ``range`` (min/max). Default is ``list``
- **domaincounts**: for GetDomain operations, whether to provide frequency counts for values.  Accepted values are ``true`` and ``False``. Default is ``false``
- **smtp_host**: SMTP host for processing ``csw:ResponseHandler`` parameter via outgoing email requests (default is ``localhost``)
- **smtp_user**: SMTP user name related to the account (default is '')
- **smtp_pass**: SMTP password related to the account (default is '')
- **smtp_ssl**: Option to choose between SMTP and SMTP_SSL. To enable it, set the value to ``true`` (default is ``false``)
- **spatial_ranking**: parameter that enables (``true`` or ``false``) ranking of spatial query results as per `K.J. Lanfear 2006 - A Spatial Overlay Ranking Method for a Geospatial Search of Text Objects  <https://pubs.usgs.gov/of/2006/1279/2006-1279.pdf>`_.
- **workers**: set the number of workers used by the wsgi server when lunching pycsw using the provided docker/entrypoint.py. If not set, it will use 2 workers as Default.

**profiles**

- list of profiles to load at runtime (default is none).  See :ref:`profiles`

**manager**

- **transactions**: whether to enable transactions (``true`` or ``false``).  Default is ``false`` (see :ref:`transactions`)
- **allowed_ips**: comma delimited list of IP addresses (e.g. 192.168.0.103), wildcards (e.g. 192.168.0.*) or CIDR notations (e.g. 192.168.100.0/24) allowed to perform transactions (see :ref:`transactions`)
- **csw_harvest_pagesize**: when harvesting other CSW servers, the number of records per request to page by (default is 10)

**pubsub**

- **broker**: Publish-Subscribe definition

**pubsub.broker**

- **show_link**: whether to display as a link in the landing page (``true`` or ``false``)
- **type**: type of broker
- **url**: endpoint of broker

.. note::

  See :ref:`pubsub` for configuring your instance with Pub/Sub capability.

**metadata**

**metadata.identification**

- **title**: the title of the service
- **description**: some descriptive text about the service
- **keywords**: list of keywords about the service
- **keywords_type**: keyword type as per the `ISO 19115 MD_KeywordTypeCode codelist <https://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#MD_KeywordTypeCode>`_).  Accepted values are ``discipline``, ``temporal``, ``place``, ``theme``, ``stratum``
- **fees**: fees associated with the service
- **accessconstraints**: access constraints associated with the service

**metadata.provider**

- **name**: the name of the service provider
- **url**: the URL of the service provider

**metadata.contact**

- **name**: the name of the provider contact
- **position**: the position title of the provider contact
- **address**: the address of the provider contact
- **city**: the city of the provider contact
- **stateorprovince**: the province or territory of the provider contact
- **postalcode**: the postal code of the provider contact (enclose in quotes)
- **country**: the country of the provider contact
- **phone**: the phone number of the provider contact (enclose in quotes)
- **fax**: the facsimile number of the provider contact (enclose in quotes)
- **email**: the email address of the provider contact
- **url**: the URL to more information about the provider contact
- **hours**: the hours of service to contact the provider
- **instructions**: the how to contact the provider contact
- **role**: the role of the provider contact as per the `ISO 19115 CI_RoleCode codelist <https://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode>`_).  Accepted values are ``author``, ``processor``, ``publisher``, ``custodian``, ``pointOfContact``, ``distributor``, ``user``, ``resourceProvider``, ``originator``, ``owner``, ``principalInvestigator``

**repository**

- **database**: the full file path to the metadata database, in database URL format (see https://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls)
- **table**: the table name for metadata records (default is ``records``).  If you are using PostgreSQL with a DB schema other than ``public``, qualify the table like ``myschema.table``
- **mappings**: custom repository mappings (see :ref:`custom_repository`)
- **source**: the source of this repository only if not local (e.g. :ref:`geonode`, :ref:`odc`).  Supported values are ``geonode``, ``odc``
- **filter**: server side database filter to apply as mask to all CSW requests (see :ref:`repofilters`)
- **max_retries**: max number of retry attempts when connecting to records-repository database
- **stable_sort**: enables stable sorting by appending an identifier sort as the last sortable. Default is ``false``
- **facets**: comma-separated list of facetable properties for search results

.. note::

  See :ref:`administration` for connecting your metadata repository and supported information models.

.. _maxrecords-handling:

MaxRecords Handling
-------------------

The The following describes how ``maxRecords`` is handled by the configuration when handling OGC API - Records items or CSW ``GetRecords`` requests:

.. csv-table::
  :header: server.maxrecords,OGC API - Records limit/CSW GetRecords.maxRecords,Result

  none set,none passed,10 (CSW default)
  20,14,20
  20,none passed,20
  none set,100,100
  20,200,20

.. _alternate-configurations:

Using environment variables in configuration files
--------------------------------------------------

pycsw configuration supports using system environment variables, which can be helpful
for deploying into `12 factor <https://12factor.net/>`_ environments for example.

Below is an example of how to integrate system environment variables in pycsw:

.. code-block:: yaml

   repository:
       database: ${PYCSW_REPOSITORY_DATABASE_URI}
       table: ${MY_TABLE}


Alternate Configurations
------------------------

By default, pycsw loads ``default.yml`` at runtime.  To load an alternate configuration, modify ``csw.py`` to point to the desired configuration.  Alternatively, pycsw supports explicitly specifiying a configuration by appending ``config=/path/to/default.yml`` to the base URL of the service (e.g. ``http://localhost/pycsw/csw.py?config=tests/suites/default/default.yml&service=CSW&version=2.0.2&request=GetCapabilities``).  When the ``config`` parameter is passed by a CSW client, pycsw will override the default configuration location and subsequent settings with those of the specified configuration.

This also provides the functionality to deploy numerous CSW servers with a single pycsw installation.

Hiding the Location
^^^^^^^^^^^^^^^^^^^

Some deployments with alternate configurations prefer not to advertise the base URL with the ``config=`` approach.  In this case, there are many options to advertise the base URL.

Environment Variables
~~~~~~~~~~~~~~~~~~~~~

pycsw supports the following environment variables:

- ``PYCSW_CONFIG``: specifies the filepath to a pycsw configuraiton


Configuration file location
^^^^^^^^^^^^^^^^^^^^^^^^^^^

One option is using Apache's ``Alias`` and ``SetEnvIf`` directives.  For example, given the base URL ``http://localhost/pycsw/csw.py?config=foo.yml``, set the following in your Apache configuration:

.. code-block:: none

  Alias /pycsw/csw-foo.py /var/www/pycsw/csw.py
  SetEnvIf Request_URI "/pycsw/csw-foo.py" PYCSW_CONFIG=/var/www/pycsw/csw-foo.yml.

.. note::

  Apache must be restarted after changes to configuration

pycsw will use the configuration as set in the ``PYCSW_CONFIG`` environment variable in the same manner as if it was specified in the base URL.  Note that the configuration value ``server.url`` value must match the ``Request_URI`` value so as to advertise correctly in pycsw's Capabilities XML.

Wrapper Script
~~~~~~~~~~~~~~

Another option is to write a simple wrapper (e.g. ``csw-foo.sh``), which provides the same functionality and can be deployed without restarting Apache:

.. code-block:: bash

  #!/bin/sh

  export PYCSW_CONFIG=/var/www/pycsw/csw-foo.yml

  /var/www/pycsw/csw.py



.. _`sample configuration`: https://github.com/geopython/pycsw/blob/master/default-sample.yml


================================================
FILE: docs/contributing.rst
================================================
.. _contributing:

.. include:: ../CONTRIBUTING.rst


================================================
FILE: docs/csw-support.rst
================================================
.. _csw-support:

CSW Support
===========

Versions
--------

pycsw supports both CSW 2.0.2 and 3.0.0 versions by default.  In alignment with
the CSW specifications, the default version returned is the latest supported
version.  That is, pycsw will always behave like a 3.0.0 CSW unless the client
explicitly requests a 2.0.2 CSW.

The sample URLs below provide examples of how requests behaves against
various/missing/default version parameters.

.. code-block:: bash

  http://localhost/csw  # returns 3.0.0 Capabilities
  http://localhost/csw?service=CSW&request=GetCapabilities  # returns 3.0.0 Capabilities
  http://localhost/csw?service=CSW&version=2.0.2&request=GetCapabilities  # returns 2.0.2 Capabilities
  http://localhost/csw?service=CSW&version=3.0.0&request=GetCapabilities  # returns 3.0.0 Capabilities

Request Examples
----------------

The best place to look for sample requests is within the `tests/` directory,
which provides numerous examples of all supported APIs and requests.

Additional examples:

- `Data.gov CSW HowTo v2.0`_
- `pycsw Quickstart on OSGeoLive`_

.. _`pycsw Quickstart on OSGeoLive`: https://live.osgeo.org/en/quickstart/pycsw_quickstart.html
.. _`Data.gov CSW HowTo v2.0`: https://gist.github.com/kalxas/6ecb06d61cdd487dc7f9


================================================
FILE: docs/distributedsearching.rst
================================================
.. _distributedsearching:

Distributed Searching
=====================

.. note::

   - in CSW mode, distributed search must be configured against remote CSW services
   - in OGC API - Records mode, distributed search must be configured against remote OGC API - Records services

.. note::

   Your server must be able to make outgoing HTTP requests for this functionality.

CSW 2 / 3
---------

pycsw has the ability to perform distributed searching against other CSW servers.  Distributed searching is disabled by default; to enable, ``federatedcatalogues`` must be set.  A CSW client must issue a GetRecords request with ``csw:DistributedSearch`` specified, along with an optional ``hopCount`` attribute (see subclause 10.8.4.13 of the CSW specification).  When enabled, pycsw will search all specified catalogues and return a unified set of search results to the client.  Due to the distributed nature of this functionality, requests will take extra time to process compared to queries against the local repository.

Scenario: Federated Search
^^^^^^^^^^^^^^^^^^^^^^^^^^

pycsw deployment with 3 configurations (CSW-1, CSW-2, CSW-3), subsequently providing three (3) endpoints.  Each endpoint is based on an opaque metadata repository (based on theme/place/discipline, etc.).  Goal is to perform a single search against all endpoints.
 
pycsw realizes this functionality by supporting :ref:`alternate configurations <alternate-configurations>`, and exposes the additional CSW endpoint(s) with the following design pattern:
 
CSW-1: ``http://localhost/pycsw/csw.py?config=CSW-1.yml``
 
CSW-2: ``http://localhost/pycsw/csw.py?config=CSW-2.yml``
 
CSW-3: ``http://localhost/pycsw/csw.py?config=CSW-3.yml``
 
...where the ``*.yml`` configuration files are configured for each respective metadata repository.  The above CSW endpoints can be interacted with as usual.
 
To federate the discovery of the three (3) portals into a unified search, pycsw realizes this functionality by deploying an additional configuration which acts as the superset of CSW-1, CSW-2, CSW-3:

CSW-all: ``http://localhost/pycsw/csw.py?config=CSW-all.yml``

This allows the client to invoke one (1) CSW GetRecords request, in which the CSW endpoint spawns the same GetRecords request to 1..n distributed CSW endpoints.  Distributed CSW endpoints are advertised in CSW Capabilities XML via ``ows:Constraint``:

.. code-block:: xml

  <ows:OperationsMetadata>
  ... 
      <ows:Constraint name="FederatedCatalogues">
          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-1.yml</ows:Value>
          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-2.yml</ows:Value>
          <ows:Value>http://localhost/pycsw/csw.py?config=CSW-3.yml</ows:Value>
      </ows:Constraint>
  ...
  </ows:OperationsMetadata>

...which advertises which CSW endpoint(s) the CSW server will spawn if a distributed search is requested by the client.
 
in the CSW-all configuration:

.. code-block:: yaml

  federatedcatalogues:
      - id: fedcat01
        type: CSW
        title: Federated catalogue 1
        url: http://localhost/pycsw/csw.py?config=CSW-1.yml
      - id: fedcat02
        type: CSW
        title: Federated catalogue 2
        url: http://localhost/pycsw/csw.py?config=CSW-2.yml
      - id: fedcat03
        type: CSW
        title: Federated catalogue 3
        url: http://localhost/pycsw/csw.py?config=CSW-3.yml
 
At which point a CSW client request to CSW-all with ``distributedsearch=TRUE``, while specifying an optional ``hopCount``.  Query network topology:

.. code-block:: none 

          AnyClient
              ^
              |
              v
           CSW-all
              ^ 
              |
              v
       /-------------\
       ^      ^      ^
       |      |      |
       v      v      v
     CSW-1  CSW-2  CSW-3
 
As a result, a pycsw deployment in this scenario may be approached on a per 'theme' basis, or at an aggregate level.
 
All interaction in this scenario is local to the pycsw installation, so network performance would not be problematic.
 
A very important facet of distributed search is as per Annex B of OGC:CSW 2.0.2.  Given that all the CSW endpoints are managed locally, duplicates and infinite looping are not deemed to present an issue.

OGC API - Records
-----------------

Experimental support for distibuted searching is available in pycsw's OGC API - Records support to allow for searching remote services.  The implementation uses the same approach as described above, operating in OGC API - Records mode as per `OGC API - Records - Part 4: Federated Search`_ (draft).

.. note::

   The ``federatedcatalogues`` directives must point to an OGC API - Records **collections** endpoint.

.. code-block:: yaml

  federatedcatalogues:
      - id: fedcat01
        type: OARec
        title: Federated catalogue 1
        url: https://example.org/collections/collection1
      - id: fedcat02
        type: OARec
        title: Federated catalogue 2
        url: https://example.org/collections/collection2
 
With the above configured, a distributed search can be invoked as follows:

http://localhost/collections/metadata:main/items?distributedSearch=true

STAC API
--------

Experimental support for distibuted searching is available in pycsw's STAC API support to allow for searching remote services.  The implementation uses the same approach as described above.

.. note::

   The ``federatedcatalogues`` directives must point to a STAC API endpoint.

.. code-block:: yaml

  federatedcatalogues:
    - id: fedcat03
      type: STAC-API
      title: Copernicus Data Space Ecosystem (CDSE) asset-level STAC catalogue
      url: https://stac.dataspace.copernicus.eu/v1
      collections:
          - daymet-annual-pr


.. note::

   To constrain STAC API distributed search to specific collections, define one to many in the `collections` (array) directive.


With the above configured, a distributed search can be invoked as follows:

http://localhost/stac/search?distributedSearch=true

.. _`OGC API - Records - Part 4: Federated Search`: https://github.com/opengeospatial/ogcapi-records/blob/master/extensions/federated-search/document.adoc


================================================
FILE: docs/docker.rst
================================================
Docker
======

Installation
------------

pycsw  provides an official `Docker`_ image which is made available on both the `geopython Docker Hub`_ and our `GitHub Container Registry`_. 

Either ``IMAGE`` can be called with the ``docker`` command, ``geopython/pycsw`` from DockerHub or ``ghcr.io/geophython/pycsw`` from the GitHub Container Registry. Examples below use ``geopython/pygeoapi``. 

Assuming you already have docker installed, you can get a pycsw instance up and running run with the default built-in configuration:

.. code-block:: bash

   docker run -p 8000:8000 geopython/pycsw 
   
   # or
   
   docker run -p 8000:8000 ghcr.io/geopython/pycsw

...then browse to http://localhost:8000
   
Docker will retrieve the pycsw image (if needed) and then
start a new container listening on port 8000.

The default configuration will run pycsw with an sqlite repository backend
loaded with some test data from the CITE test suite. You can use this to take
pycsw for a test drive.


Inspect logs
------------

The default configuration for the docker image outputs logs to stdout. This is
common practice with docker containers and enables the inspection of logs
with the ``docker logs`` command::

    # run a pycsw container in the background
    docker run \
        --name pycsw-test \
        --publish 8000:8000 \
        --detach \
        geopython/pycsw

    # inspect logs
    docker logs pycsw-test

.. note::

   In order to have pycsw logs being sent to standard output you must set
   ``server.logfile=`` in the pycsw configuration file.


Using pycsw-admin.py
--------------------

``pycsw-admin.py`` can be executed on a running container by
using ``docker exec``::

    docker exec -ti <running-container-id> pycsw-admin.py --help


Running custom pycsw containers
-------------------------------

pycsw configuration
^^^^^^^^^^^^^^^^^^^

It is possible to supply a custom configuration file for pycsw as a bind 
mount or as a docker secret (in the case of docker swarm). The configuration 
file is searched at the value of the ``PYCSW_CONFIG`` environmental variable,
which defaults to ``/etc/pycsw/pycsw.yml``. 

Supplying the configuration file via bind mount::

    docker run \
        --name pycsw \
        --detach \
        --volume <path-to-local-pycsw.yml>:/etc/pycsw/pycsw.yml \
        --publish 8000:8000 \
        geopython/pycsw

Supplying the configuration file via docker secrets::

    # first create a docker secret with the pycsw config file
    docker secret create pycsw-config <path-to-local-pycsw.yml>
    docker service create \
        --name pycsw \
        --secret src=pycsw-config,target=/etc/pycsw/pycsw.yml \
        --publish 8000:8000
        geopython/pycsw


sqlite repositories
^^^^^^^^^^^^^^^^^^^

The default database repository is the CITE database that is used for running 
pycsw's test suites. Docker volumes may be used to specify a custom sqlite
database path. It should be mounted under ``/var/lib/pycsw``::

    # first create a docker volume for persisting the database when
    # destroying containers
    docker volume create pycsw-db-data
    docker run \
        --volume db-data:/var/lib/pycsw \
        --detach \
        --publish 8000:8000
        geopython/pycsw


PostgreSQL repositories
^^^^^^^^^^^^^^^^^^^^^^^

Specifying a PostgreSQL repository is just a matter of configuring a custom
pycsw.yml file with the correct specification.

Check `pycsw's GitHub repository`_ for an example of a docker compose/stack
file that spins up a postgis database together with a pycsw instance.


Setting up a development environment with docker
------------------------------------------------

Working on pycsw's code using docker enables an isolated environment that
helps ensuring reproducibility while at the same time keeping your base
system free from pycsw related dependencies. This can be achieved by:

* Cloning pycsw's repository locally;
* Starting up a docker container with appropriately set up bind mounts. In
  addition, the pycsw docker image supports a ``reload`` flag that turns on
  automatic reloading of the gunicorn web server whenever the code changes;
* Installing the development dependencies by using ``docker exec`` with the
  root user;

The following instructions set up a fully working development environment::

    # clone pycsw's repo
    git clone https://github.com/geopython/pycsw.git

    # start a container for development
    cd pycsw
    docker run \
        --name pycsw-dev \
        --detach \
        --volume ${PWD}/pycsw:/usr/lib/python3.7/site-packages/pycsw \
        --volume ${PWD}/docs:/home/pycsw/docs \
        --volume ${PWD}/LICENSE.txt:/home/pycsw/LICENSE.txt \
        --volume ${PWD}/COMMITTERS.txt:/home/pycsw/COMMITTERS.txt \
        --volume ${PWD}/CONTRIBUTING.rst:/home/pycsw/CONTRIBUTING.rst \
        --volume ${PWD}/pycsw/plugins:/home/pycsw/pycsw/plugins \
        --publish 8000:8000 \
        geopython/pycsw --reload

    # install additional dependencies used in tests and docs
    docker exec \
        -ti \
        --user root \
        pycsw-dev pip3 install -r pycsw/requirements-dev.txt

    # run tests (for example unit tests)
    docker exec -ti pycsw-dev pytest -m unit pycsw

    # build docs
    docker exec -ti pycsw-dev sh -c "cd pycsw/docs && make html"

.. note::

   The pycsw image uses a specific Python version and does
   not install pycsw in editable mode. As such it is not possible to
   use ``tox``.

Since the docs directory is bind mounted from your host machine into the
container, after building the docs you may inspect their content visually, for
example by running::

    firefox docs/_build/html/index.html

Docker Compose
==============

For `Docker Compose`_ deployment, run the following in ``docker/compose``:

.. code-block:: bash

  PYCSW_DOCKER_IMAGE=latest docker compose up


.. note::

  The ``PYCSW_DOCKER_IMAGE`` setting is required to set the Docker image version/tag.


Scaling
-------

To scale via Docker Compose, run the following in ``docker/compose``:

.. code-block:: bash

  PYCSW_DOCKER_IMAGE=latest docker compose -f docker-compose.scale.yml up

.. note::

  In ``docker/compose/docker-compose.scale.yml``, adjust the ``services.pycsw.deploy``
  and services.pycsw.ports values to scale accordingly.  The port range specified must
  match the number of replicas defined.

Kubernetes
==========

For `Kubernetes`_ orchestration, run the following in ``docker/kubernetes``:

.. code-block:: bash

  make up
  make open


Helm
====

For Kubernetes deployment via `Helm`_, run the following in ``docker/helm``:

.. code-block:: bash

  helm install pycsw .
  minikube service pycsw --url


.. _`Docker`: https://www.docker.com
.. _`geopython Docker Hub`: https://hub.docker.com/r/geopython/pycsw
.. _`GitHub Container Registry`: https://github.com/geopython/pycsw/pkgs/container/pycsw
.. _pycsw's GitHub repository: https://github.com/geopython/pycsw/tree/master/docker
.. _`Docker Compose`: https://docs.docker.com/compose
.. _`Kubernetes`: https://kubernetes.io/
.. _`Helm`: https://helm.sh


================================================
FILE: docs/geonode.rst
================================================
.. _geonode:

GeoNode Configuration
======================

GeoNode (https://geonode.org/) is a platform for the management and publication of geospatial data. It brings together mature and stable open-source software projects under a consistent and easy-to-use interface allowing users, with little training, to quickly and easily share data and create interactive maps. GeoNode provides a cost-effective and scalable tool for developing information management systems.  GeoNode uses CSW as a cataloguing mechanism to query and present geospatial metadata.

pycsw supports binding to an existing GeoNode repository for metadata query.  The binding is read-only (transactions are not in scope, as GeoNode manages repository metadata changes in the application proper).

GeoNode Setup
-------------

pycsw is enabled and configured by default in GeoNode, so there are no additional steps required once GeoNode is setup.  See the ``CATALOGUE`` and ``PYCSW`` `settings.py entries`_ at for customizing pycsw within GeoNode.

The GeoNode plugin is managed outside of pycsw within the GeoNode project.

.. _`settings.py entries`: https://docs.geonode.org/en/master/basic/settings/index.html


================================================
FILE: docs/hhypermap.rst
================================================
.. _hhypermap:

HHypermap-Registry Configuration
================================

HHypermap (Harvard Hypermap) Registry (https://github.com/cga-harvard/Hypermap-Registry) is an application that manages OWS, Esri REST, and other types of map service harvesting, and maintains uptime statistics for services and layers. HHypermap Registry will publish to HHypermap Search (based on Lucene) which provides a fast search and visualization environment for spatio-temporal materials.

HHypermap uses CSW as a cataloguing mechanism to ingest, query and present geospatial metadata.

pycsw supports binding to an existing HHypermap repository for metadata query.

HHypermap Setup
---------------

pycsw is enabled and configured by default in HHypermap, so there are no additional steps required once HHypermap is setup.  See the ``REGISTRY_PYCSW`` `hypermap/settings.py entries`_ for customizing pycsw within HHypermap.

The HHypermap plugin is managed outside of pycsw within the HHypermap project.  HHypermap settings must ensure that ``REGISTRY_PYCSW['repository']['source']`` is set to ``hypermap.search.pycsw_repository``.

.. _`hypermap/settings.py entries`: https://github.com/cga-harvard/Hypermap-Registry/blob/master/hypermap/settings.py


================================================
FILE: docs/html-templating.rst
================================================
.. _html-templating:

HTML Templating
===============

pycsw uses `Jinja`_ as its templating engine to render HTML and `Flask`_ to provide route paths of the API that returns HTTP responses. For complete details on how to use these modules, refer to the `Jinja documentation`_ and the `Flask documentation`_.

The default pycsw configuration has ``server.templates`` commented out and defaults to the pycsw ``pycsw/templates`` and ``pycsw/static`` folder. To point to a different set of template configuration, you can edit your configuration as follows:

.. code-block:: yaml

  server:
    templates:
      path: /path/to/jinja2/templates/folder # jinja2 template HTML files
      static: /path/to/static/folder # css, js, images and other static files referenced by the template

**Note:** the URL path to your static folder will always be ``/static`` in your deployed web instance of pycsw.

Your templates folder should mimic the same file names and structure of the default pycsw templates. Otherwise, you will need to modify ``api.py`` accordingly.

Note that you need only copy and edit the templates you are interested in updating.  For example,
if you are only interested in updating the ``landing_page.html`` template, then create your own version
of only that same file.  When pycsw detects that a custom HTML template is being used,
it will look for the custom template in ``server.templates.path``.  If it does not exist, pycsw
will render the default HTML template for the given endpoint/request.

Linking to a static file in your HTML templates can be done using Jinja syntax and the exposed ``config['server']['url']``:

.. code-block:: html

  <!-- CSS example -->
  <link rel="stylesheet" href="{{ config['server']['url'] }}/static/css/default.css">
  <!-- JS example -->
  <script src="{{ config['server']['url'] }}/static/js/main.js"></script>
  <!-- Image example with metadata -->
  <img src="{{ config['server']['url'] }}/static/img/logo.png" title="{{ config['metadata']['identification']['title'] }}" />

.. _`Jinja`: https://palletsprojects.com/p/jinja/
.. _`Jinja documentation`: https://jinja.palletsprojects.com
.. _`Flask`: https://palletsprojects.com/p/flask/
.. _`Flask documentation`: https://flask.palletsprojects.com


================================================
FILE: docs/index.rst
================================================
.. _index:

=============================
pycsw |release| Documentation
=============================

.. image:: https://zenodo.org/badge/2367090.svg
   :target: https://zenodo.org/badge/latestdoi/2367090

:Author: Tom Kralidis
:Contact: tomkralidis at gmail.com
:Release: |release|
:Date: |today|

.. toctree::
   :maxdepth: 2

   introduction
   installation
   docker
   configuration
   administration
   metadata-model-reference
   oarec-support
   csw-support
   pubsub
   stac
   distributedsearching
   sru
   opensearch
   oaipmh
   json
   soap
   sitemaps
   transactions
   repofilters
   profiles
   repositories
   outputschemas
   xslt
   html-templating
   geonode
   hhypermap
   odc
   ckan
   api
   testing
   migration-guide
   tools
   support
   contributing
   license
   committers


================================================
FILE: docs/installation.rst
================================================
.. _installation:

Installation
============

System Requirements
-------------------

pycsw is written in `Python <https://python.org>`_, and works with (tested) Python 3.

pycsw requires the following Python supporting libraries:

- `lxml`_ for XML support
- `SQLAlchemy`_ for database bindings
- `pyproj`_ for coordinate transformations
- `PyYAML`_ for configuration management
- `Shapely`_ for spatial query / geometry support
- `OWSLib`_ for CSW client and metadata parser
- `xmltodict`_ for working with XML similar to working with JSON
- `geolinks`_ for dealing with geospatial links

OGC API - Records
^^^^^^^^^^^^^^^^^

OGC API - Records support additionally requires the following:

- `Flask`_ for pycsw's default OGC API - Records endpoint
- `pygeofilter`_ for CQL parsing

.. note::

  You can install these dependencies via `pip`_

.. note::

  For :ref:`GeoNode <geonode>` or :ref:`Open Data Catalog <odc>` or :ref:`HHypermap <hhypermap>` deployments, SQLAlchemy is not required

Installing from Source
----------------------

`Download <https://pycsw.org/download>`_ the latest stable version or fetch from Git.

For Developers and the Truly Impatient
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The 4 minute install:

.. code-block:: bash

  virtualenv pycsw && cd pycsw && . bin/activate
  git clone https://github.com/geopython/pycsw.git && cd pycsw
  pip3 install -e . && pip3 install -r requirements-standalone.txt
  cp default-sample.yml default.yml
  vi default.yml
  # adjust paths in
  # server.home
  # repository.database
  # set server.url to http://localhost:8000/
  # start server - CSW 2/3, OAI-PMH, OpenSearch, SRU (all endpoints at /)
  python3 pycsw/wsgi.py
  curl http://localhost:8000/?service=CSW&version=2.0.2&request=GetCapabilities

To enable OGC API - Records as well as the abovementioned search standards:

.. code-block:: bash

  # configure which config file to use
  export PYCSW_CONFIG=default.yml
  # start server - OGC API - Records and all services (various endpoints below)
  python3 pycsw/wsgi_flask.py
  # OGC API - Records
  curl http://localhost:8000
  # OpenAPI document
  curl http://localhost:8000/openapi
  # OGC CSW 3
  curl http://localhost:8000/csw
  # OGC CSW 2
  curl http://localhost:8000/csw?service=CSW&version=2.0.2&request=GetCapabilities
  # OAI-PMH
  curl http://localhost:8000/oaipmh
  # OpenSearch
  curl http://localhost:8000/opensearch
  # SRU
  curl http://localhost:8000/sru


The Quick and Dirty Way
^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: bash

  git clone https://github.com/geopython/pycsw.git

Ensure that CGI is enabled for the install directory.  For example, on Apache, if pycsw is installed in ``/srv/www/htdocs/pycsw`` (where the URL will be ``http://host/pycsw/csw.py``), add the following to ``httpd.conf``:

.. code-block:: none

  <Location /pycsw/>
   Options +FollowSymLinks +ExecCGI
   Allow from all
   AddHandler cgi-script .py
  </Location>

.. note::
  If pycsw is installed in ``cgi-bin``, this should work as expected.  In this case, the :ref:`tests <tests>` application must be moved to a different location to serve static HTML documents.

Make sure, you have all the dependencies from ``requirements.txt and requirements-standalone.txt``

The Clean and Proper Way
^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: bash

  git clone https://github.com/geopython/pycsw.git
  cd pycsw
  python3 setup.py build
  python3 setup.py install

At this point, pycsw is installed as a library and requires a CGI ``csw.py``
or WSGI ``pycsw/wsgi.py`` script to be served into your web server environment
(see below for WSGI configuration/deployment).

.. _pypi:

Installing from the Python Package Index (PyPI)
-----------------------------------------------

.. code-block:: bash

  pip3 install pycsw

.. _opensuse:

Installing from OpenSUSE Build Service
--------------------------------------

In order to install the pycsw package in openSUSE Leap (stable distribution), one can run the following commands as user ``root``:

.. code-block:: bash

  zypper -ar https://download.opensuse.org/repositories/Application:/Geo/openSUSE_Leap_15.2/ GEO
  zypper refresh
  zypper install python-pycsw pycsw-cgi


In order to install the pycsw package in openSUSE Tumbleweed (rolling distribution), one can run the following commands as user ``root``:

.. code-block:: bash

  zypper -ar https://download.opensuse.org/repositories/Application:/Geo/openSUSE_Tumbleweed/ GEO
  zypper refresh
  zypper install python-pycsw pycsw-cgi

An alternative method is to use the `One-Click Installer <https://software.opensuse.org/package/python-pycsw>`_.

.. _ubuntu:

Installing on Ubuntu/Mint
-------------------------

In order to install the most recent pycsw release to an Ubuntu-based distribution, one can use the UbuntuGIS Unstable repository by running the following commands:

.. code-block:: bash

  sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
  sudo apt-get update
  sudo apt-get install python-pycsw pycsw-cgi

Alternatively, one can use the UbuntuGIS Stable repository which includes older but very well tested versions:

  sudo add-apt-repository ppa:ubuntugis/ppa
  sudo apt-get update
  sudo apt-get install python-pycsw pycsw-cgi

.. note::
  Since Ubuntu 16.04 LTS Xenial release, pycsw is included by default in the official Multiverse repository.

Running on Windows
------------------

For Windows installs, change the first line of ``csw.py`` to:

.. code-block:: python

  #!/Users/USERNAME/AppData/Local/Programs/Python/Python36/python -u

.. note::
  The use of ``-u`` is required to properly output gzip-compressed responses.

.. note::
  ``USERNAME`` should match your username, and the Python version should match with your install (e.g. ``Python36``).
  
.. Tip::
  
   `MS4W <https://ms4w.com>`__  (MapServer for Windows) as of its version 4.0 release includes pycsw,
   Apache's mod_wsgi, Python 3.7, and many other tools, all ready to use out of the box.  After installing,
   you will find your local pycsw catalogue endpoint, and steps for further configuration, on your
   browser's localhost page.  You can read more about pycsw inside MS4W `here <https://ms4w.com/README_INSTALL.html#pycsw>`__.

Security
--------

By default, ``default.yml`` is at the root of the pycsw install.  If pycsw is setup outside an HTTP server's ``cgi-bin`` area, this file could be read.  The following options protect the configuration:

- move ``default.yml`` to a non HTTP accessible area, and modify ``csw.py`` to point to the updated location
- configure web server to deny access to the configuration.  For example, in Apache, add the following to ``httpd.conf``:

.. code-block:: none

  <Files ~ "\.(yml)$">
   order allow,deny
   deny from all
  </Files>


Running on WSGI
---------------

pycsw supports the `Web Server Gateway Interface`_ (WSGI).  To run pycsw in
WSGI mode, use ``pycsw/wsgi.py`` in your WSGI server environment.

.. note::

  ``mod_wsgi`` supports only the version of Python it was compiled with. If the target server
  already supports WSGI applications, pycsw will need to use the same Python version.
  `WSGIDaemonProcess`_ provides a ``python-path`` directive that may allow a virtualenv created from the Python version ``mod_wsgi`` uses.

Below is an example of configuring with Apache:

.. code-block:: none

  WSGIDaemonProcess host1 home=/var/www/pycsw processes=2
  WSGIProcessGroup host1
  WSGIScriptAlias /pycsw-wsgi /var/www/pycsw/wsgi.py
  <Directory /var/www/pycsw>
    Order deny,allow
    Allow from all
  </Directory>


or use the `WSGI reference implementation`_:

.. code-block:: bash

  python3 ./pycsw/wsgi.py
  Serving on port 8000...

which will publish pycsw to ``http://localhost:8000/``

.. _`lxml`: https://lxml.de/
.. _`SQLAlchemy`: https://www.sqlalchemy.org/
.. _`Shapely`: https://toblerity.github.io/shapely/
.. _`pyproj`: https://code.google.com/p/pyproj/
.. _`OWSLib`: https://geopython.github.io/OWSLib
.. _`xmltodict`: https://github.com/martinblech/xmltodict
.. _`geolinks`: https://github.com/geopython/geolinks
.. _`Flask`: https://flask.palletsprojects.com
.. _`pygeofilter`: https://github.com/geopython/pygeofilter
.. _`PyYAML`: https://pyyaml.org
.. _`pip`: https://pip.pypa.io/en/stable
.. _`Web Server Gateway Interface`: https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
.. _`WSGIDaemonProcess`: https://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess
.. _`WSGI reference implementation`: https://docs.python.org/library/wsgiref.html


================================================
FILE: docs/introduction.rst
================================================
.. _introduction:

Introduction
============

pycsw is an OGC API - Records and OGC CSW server implementation written in Python.

Features
========

- implements `OGC API - Records - Part 1: Core`_
- implements `OGC API - Records - Part 2: Facets`_
- implements `OGC API - Records - Part 3: Create, Replace, Update, Delete, Harvest`_
- implements `OGC API - Records - Part 4: Federated Search`_
- implements `OGC API - Features - Part 3: Filtering`_
- implements `STAC API`_
- implements `Common Query Language (CQL2)`_
- certified OGC `Compliant`_ and OGC Reference Implementation for both CSW 2.0.2 and CSW 3.0.0
- harvesting support for WMS, WFS, WCS, WPS, WAF, CSW, SOS
- implements `INSPIRE Discovery Services 3.0`_
- implements `ISO Metadata Application Profile 1.0.0`_
- implements `FGDC CSDGM Application Profile for CSW 2.0`_
- implements the Search/Retrieval via URL (`SRU`_) search protocol
- implements Full Text Search capabilities
- implements OGC OpenSearch Geo and Time Extensions
- implements Open Archives Initiative Protocol for Metadata Harvesting
- implements Pub/Sub capability via `OGC API Publish-Subscribe Workflow - Part 1: Core`_
- supports ISO, Dublin Core, DIF, FGDC, Atom, GM03 and DataCite metadata models
- CGI or WSGI deployment
- simple YAML configuration
- transactional capabilities (OGC API - Records and CSW-T)
- flexible repository configuration
- `GeoNode`_ connectivity
- `HHypermap`_ connectivity
- `Open Data Catalog`_ connectivity
- `CKAN`_ connectivity
- federated catalogue distributed searching
- realtime XML Schema validation
- extensible profile plugin architecture

Standards Support
-----------------

.. csv-table::
  :header: Standard,Version(s)

  `OGC API - Records - Part 1: Core`_,1.0
  `OGC API - Features - Part 3: Filtering`_,draft
  "`OGC API - Features - Part 4: Create, Replace, Update and Delete`_",draft
  `OGC API Publish-Subscribe Workflow - Part 1: Core`_,draft
  `OGC CSW`_,2.0.2/3.0.0
  `OGC Filter`_,1.1.0/2.0.0
  `OGC OWS Common`_,1.0.0/2.0.0
  `OGC GML`_,3.1.1
  `OGC SFSQL`_,1.2.1
  `OGC GeoRSS`_,1.0
  `Dublin Core`_,1.1
  `SOAP`_,1.2
  `ISO 19115`_,2003
  `ISO 19139`_,2007
  `ISO 19119`_,2005
  `NASA DIF`_,9.7
  `FGDC CSDGM`_,1998
  `GM03`_,2.1
  `SRU`_,1.1
  `OGC OpenSearch`_,1.0
  `OAI-PMH`_,2.0
  `DataCite`_,4.3

OGC API - Records support
-------------------------

- Part 1: Core

OGC API - Features support
--------------------------

- Part 3: Filtering
- Part 4: Create, Replace, Update and Delete

CQL
---

- Common Query Language (CQL2)

Supported Output Formats
^^^^^^^^^^^^^^^^^^^^^^^^

- JSON (default)
- XML

Supported Filters
^^^^^^^^^^^^^^^^^

- q
- datetime
- filter / filter-lang (CQL)
- bbox
- all properties (``property=value``)

Paging
^^^^^^

- limit
- offset

CSW Support
-----------

Supported Operations
^^^^^^^^^^^^^^^^^^^^

.. csv-table::
  :header: Request,Optionality,Supported,HTTP method binding(s)

  GetCapabilities,mandatory,yes,GET (KVP) / POST (XML) / SOAP
  DescribeRecord,mandatory,yes,GET (KVP) / POST (XML) / SOAP
  GetRecords,mandatory,yes,GET (KVP) / POST (XML) / SOAP
  GetRecordById,optional,yes,GET (KVP) / POST (XML) / SOAP
  GetRepositoryItem,optional,yes,GET (KVP)
  GetDomain,optional,yes,GET (KVP) / POST (XML) / SOAP
  Harvest,optional,yes,GET (KVP) / POST (XML) / SOAP
  UnHarvest,optional,no,
  Transaction,optional,yes,POST (XML) / SOAP

.. note::

  Asynchronous processing supported for GetRecords and Harvest requests (via ``csw:ResponseHandler``)

.. note::

  Supported Harvest Resource Types are listed in :ref:`transactions`

Supported Output Formats
^^^^^^^^^^^^^^^^^^^^^^^^

- XML (default)
- JSON

Supported Output Schemas
^^^^^^^^^^^^^^^^^^^^^^^^

- Dublin Core
- ISO 19139
- FGDC CSDGM
- NASA DIF
- Atom
- GM03
- DataCite

Supported Sorting Functionality
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- ogc:SortBy
- ascending or descending
- aspatial (queryable properties)
- spatial (geometric area)

Supported Filters
^^^^^^^^^^^^^^^^^

Full Text Search
^^^^^^^^^^^^^^^^

- csw:AnyText

Geometry Operands
^^^^^^^^^^^^^^^^^

- gml:Point
- gml:LineString
- gml:Polygon
- gml:Envelope

.. note::

  Coordinate transformations are supported

Spatial Operators
^^^^^^^^^^^^^^^^^

- BBOX
- Beyond
- Contains
- Crosses
- Disjoint
- DWithin
- Equals
- Intersects
- Overlaps
- Touches
- Within

Logical Operators
^^^^^^^^^^^^^^^^^

- Between
- EqualTo
- LessThanEqualTo
- GreaterThan
- Like
- LessThan
- GreaterThanEqualTo
- NotEqualTo
- NullCheck

Functions
^^^^^^^^^
- length
- lower
- ltrim
- rtrim
- trim
- upper

OAI-PMH Support
---------------

Supported Operations
^^^^^^^^^^^^^^^^^^^^

- GetRecord
- Identify
- ListIdentifiers
- ListMetadataFormats
- ListRecords
- ListSets

Supported Filters
^^^^^^^^^^^^^^^^^

- from
- until
- set

Paging
^^^^^^

- resumptionToken

.. _`OGC API - Records - Part 1: Core`: https://docs.ogc.org/is/20-004r1/20-004r1.html
.. _`OGC API - Records - Part 2: Facets`: https://docs.ogc.org/DRAFTS/25-013.html
.. _`OGC API - Records - Part 3: Create, Replace, Update, Delete, Harvest`: https://docs.ogc.org/DRAFTS/25-015.html
.. _`OGC API - Records - Part 4: Federated Search`: https://github.com/opengeospatial/ogcapi-records/blob/master/extensions/federated-search/document.adoc
.. _`OGC API - Features - Part 3: Filtering`: http://docs.ogc.org/DRAFTS/19-079.html
.. _`Common Query Language (CQL2)`: https://docs.ogc.org/DRAFTS/21-065.html
.. _`OGC CSW`: https://www.ogc.org/standards/cat
.. _`ISO Metadata Application Profile 1.0.0`: https://portal.ogc.org/files/?artifact_id=21460
.. _`OGC Filter`: https://www.ogc.org/standards/filter
.. _`OGC OWS Common`: https://www.ogc.org/standards/common
.. _`OGC GML`: https://www.ogc.org/standards/gml
.. _`OGC SFSQL`: https://www.ogc.org/standards/sfs
.. _`Dublin Core`: https://www.dublincore.org/
.. _`OGC CITE CSW`: https://github.com/opengeospatial/ets-csw202
.. _`OGC GeoRSS`: http://docs.opengeospatial.org/cs/17-002r1/17-002r1.html
.. _`SOAP`: https://www.w3.org/TR/soap/
.. _`INSPIRE Discovery Services 3.0`: https://inspire.jrc.ec.europa.eu/documents/Network_Services/TechnicalGuidance_DiscoveryServices_v3.0.pdf
.. _`ISO 19115`: https://www.iso.org/iso/catalogue_detail.htm?csnumber=26020
.. _`ISO 19139`: https://www.iso.org/iso/catalogue_detail.htm?csnumber=32557
.. _`ISO 19119`: https://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=39890
.. _`NASA DIF`: https://earthdata.nasa.gov/esdis/eso/standards-and-references/directory-interchange-format-dif-standard
.. _`FGDC CSDGM`: https://www.fgdc.gov/metadata/csdgm-standard
.. _`FGDC CSDGM Application Profile for CSW 2.0`: https://portal.ogc.org/files/?artifact_id=16936
.. _`SRU`: https://www.loc.gov/standards/sru
.. _`OGC OpenSearch`: https://www.ogc.org/standards/opensearchgeo
.. _`GeoNode`: https://geonode.org/
.. _`HHypermap`: https://github.com/cga-harvard/HHypermap
.. _`Open Data Catalog`: https://github.com/azavea/Open-Data-Catalog/
.. _`CKAN`: https://ckan.org/
.. _`Compliant`: https://www.ogc.org/resource/products/details/?pid=1374
.. _`OAI-PMH`: https://www.openarchives.org/pmh/
.. _`GM03`: https://www.geocat.admin.ch/en/dokumentation/gm03.html
.. _`OGC API - Features - Part 4: Create, Replace, Update and Delete`: https://cnn.com
.. _`DataCite`: https://schema.datacite.org/meta/kernel-4.3/
.. _`OGC API Publish-Subscribe Workflow - Part 1: Core`: https://docs.ogc.org/DRAFTS/25-030.html
.. _`STAC API`: https://github.com/radiantearth/stac-api-spec



================================================
FILE: docs/json.rst
================================================
.. _json:

JSON Support
============

OGC API - Records
-----------------

pycsw fully supports the OGC API - Records JSON conformance class, which is the default
representation provided.

CSW
---

pycsw supports JSON support for ``DescribeRecord``, ``GetRecords`` and ``GetRecordById`` requests.  Adding ``outputFormat=application/json`` to your CSW request will return the response as a JSON representation.



================================================
FILE: docs/license.rst
================================================
.. _license:

License
=======

.. include:: ../LICENSE.txt

Documentation
-------------

The documentation is released under the `Creative Commons Attribution 4.0 International (CC BY 4.0)`_ license.

.. _`Creative Commons Attribution 4.0 International (CC BY 4.0)`: https://creativecommons.org/licenses/by/4.0


================================================
FILE: docs/locale/el/LC_MESSAGES/.gitkeep
================================================


================================================
FILE: docs/locale/fr/LC_MESSAGES/.gitkeep
================================================


================================================
FILE: docs/locale/zh/LC_MESSAGES/administration.po
================================================
#
msgid ""
msgstr ""
"Project-Id-Version: pycsw 2.0-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-03-08 22:54+0800\n"
"PO-Revision-Date: 2022-03-09 09:34+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Generated-By: Babel 2.8.0\n"
"X-Generator: Poedit 3.0.1\n"

#: ../../administration.rst:4
msgid "Administration"
msgstr "管理"

#: ../../administration.rst:6
msgid ""
"pycsw administration is handled by the ``pycsw-admin.py`` utility.  ``pycsw-"
"admin.py`` is installed as part of the pycsw install process and should be "
"available in your PATH."
msgstr ""
"pycsw 管理由 ``pycsw-admin.py`` 实用程序处理。 ``pycsw-admin.py`` 是作为 pycsw "
"安装过程的一部分安装的,可在PATH 中可用。"

#: ../../administration.rst:11
msgid ""
"Run ``pycsw-admin.py --help`` to see all administration operations and "
"parameters"
msgstr "运行 ``pycsw-admin.py -h`` 以查看所有的管理操作与参数"

#: ../../administration.rst:14
msgid "Metadata Repository Setup"
msgstr "元数据存储库设置"

#: ../../administration.rst:16
msgid "pycsw supports the following databases:"
msgstr "pycsw支持以下数据库:"

#: ../../administration.rst:18
msgid "SQLite3"
msgstr "SQLite3"

#: ../../administration.rst:19
msgid "PostgreSQL (without PostGIS)"
msgstr "PostgreSQL (无 PostGIS)"

#: ../../administration.rst:20
msgid "PostgreSQL with PostGIS enabled"
msgstr "启用 PostGIS 的 PostgreSQL"

#: ../../administration.rst:21
msgid "MySQL"
msgstr "MySQL"

#: ../../administration.rst:24
msgid ""
"The easiest and fastest way to deploy pycsw is to use SQLite3 as the backend."
msgstr "部署 pycsw 最简单、最快的方法是使用 SQLite3 作为后端。"

#: ../../administration.rst:27
msgid "PostgreSQL support includes support for PostGIS functions if enabled"
msgstr "PostgreSQL 支持包括对 PostGIS 功能的支持(如果启用)"

#: ../../administration.rst:30
msgid ""
"If PostGIS is activated before setting up the pycsw/PostgreSQL database, then "
"native PostGIS geometries will be enabled."
msgstr ""
"如果在设置 pycsw/PostgreSQL 数据库之前激活 PostGIS,则将启用本机 PostGIS "
"geometries。"

#: ../../administration.rst:32
msgid ""
"To expose your geospatial metadata via pycsw, perform the following actions:"
msgstr "通过 pycsw 发布地理空间元数据,执行以下操作:"

#: ../../administration.rst:34
msgid "setup the database"
msgstr "创建数据库"

#: ../../administration.rst:35
msgid "import metadata"
msgstr "导入元数据"

#: ../../administration.rst:36
msgid "publish the repository"
msgstr "存储库发布"

#: ../../administration.rst:39
msgid "Supported Information Models"
msgstr "支持的信息模型"

#: ../../administration.rst:41
msgid ""
"By default, pycsw's API  supports the core OARec and CSW Record information "
"models.  From the database perspective, the pycsw metadata model is loosely "
"based on ISO 19115 and is able to transform to other formats as part of "
"transformation during OARec/CSW requests."
msgstr ""
"默认情况下,pycsw 的 API 支持核心是 OARec 和 CSW Record 信息模型。从数据库的角度"
"来看,pycsw 元数据模型松散地基于 ISO 19115,并且能够在 OARec/CSW 请求期间转换为"
"其他格式作为转换的一部分。"

#: ../../administration.rst:46
msgid "See :ref:`profiles` for information on enabling profiles"
msgstr "请参见 :ref:`profiles` 查看有关配置文件的信息"

#: ../../administration.rst:49
msgid "Setting up the Database"
msgstr "创建数据库"

#: ../../administration.rst:55
msgid "This will create the necessary tables and values for the repository."
msgstr "这将为存储库创建必要的表与值。"

#: ../../administration.rst:57
msgid ""
"The database created is an `OGC SFSQL`_ compliant database, and can be used "
"with any implementing software.  For example, to use with `GDAL`_:"
msgstr ""
"创建的数据库是兼容 `OGC SFSQL`_ 的,此数据库可应用于任何实现(相关标准的)软件。"
"例如, `OGR`_ :创建的数据库是符合“OGC SFSQL”的数据库,可与任何实施软件一起使用。"
"例如,与 `GDAL`_ 一起使用:"

#: ../../administration.rst:69
msgid ""
"If PostGIS is detected, the ``pycsw-admin.py`` script does not create the SFSQL "
"tables as they are already in the database."
msgstr ""
"如检测到PostGIS, pycsw-admin.py 脚本就不会再创建 SFSQL 表,因为数据库中已经存在"
"了。"

#: ../../administration.rst:73
msgid "Loading Records"
msgstr "加载记录"

#: ../../administration.rst:79
msgid ""
"This will import all ``*.xml`` records from ``/path/to/records`` into the "
"database specified in ``default.yml`` (``repository.database``).  Passing ``-"
"r`` to the script will process ``/path/to/records`` recursively.  Passing ``-"
"y`` to the script will force overwrite existing metadata with the same "
"identifier.  Note that ``-p`` accepts either a directory path or single file."
msgstr ""
"这时所有的 ``*.xml`` 记录就会从 ``/path/to/records`` 导入到 ``default.yml`` 中指"
"定的数据库 (``repository.database``)。将 ``-r`` 传递到脚本中, 程序 ``/path/to/"
"records`` 就会递归运行。将 ``-y`` 传递到脚本中, 程序 ``/path/to/records`` 将强"
"制替换现有的相同元数据标识符。请注意, ``-p`` 只能接受一个目录路径或单个文件。"

#: ../../administration.rst:82
msgid "Records can also be imported using CSW-T (see :ref:`transactions`)."
msgstr "记录也可以使用 CSW-T导入 (请查看 :ref:`transactions` )。"

#: ../../administration.rst:85
msgid "Exporting the Repository"
msgstr "导出数据库"

#: ../../administration.rst:91
msgid ""
"This will write each record in the database specified in ``default.yml`` "
"(``repository.database``) to an XML document on disk, in directory ``/path/to/"
"output_dir``."
msgstr ""
"这会将 ``default.yml`` (``repository.database``) 中指定的数据库的每条记录写入磁"
"盘上的 ``/path/to/output_dir`` 目录中的 XML 文档。"

#: ../../administration.rst:94
msgid "Optimizing the Database"
msgstr "优化数据库"

#: ../../administration.rst:102
msgid "This feature is relevant only for PostgreSQL and MySQL"
msgstr "此特性只适用于 PostgreSQL和MySQL"

#: ../../administration.rst:105
msgid "Deleting Records from the Repository"
msgstr "从存储库中删除记录"

#: ../../administration.rst:111
msgid "This will empty the repository of all records."
msgstr "数据库中的所有记录都会被清空。"

#: ../../administration.rst:114
msgid "Database Specific Notes"
msgstr "数据库特别需要注意的是"

#: ../../administration.rst:117
msgid "PostgreSQL"
msgstr "PostgreSQL"

#: ../../administration.rst:119
msgid ""
"To enable the database user must be able to create functions within the database."
msgstr ""
"在PostgreSQL支持下,用户必须在数据"

#: ../../administration.rst:120
msgid ""
"`PostgreSQL Full Text Search`_ is supported for ``csw:AnyText`` based queries.  "
"pycsw creates a tsvector column based on the text from anytext column. Then "
"pycsw creates a GIN index against the anytext_tsvector column.  This is created "
"automatically in ``pycsw.core.repository.setup``.  Any query against OARec's ``q`` "
"parameter or CSW `csw:AnyText` or `apiso:AnyText` will process using PostgreSQL "
"FTS handling"
msgstr ""
"`PostgreSQL Full Text Search`_ (全文搜索)支持基于 ``csw:AnyText`` (任意文本)的"
"查询。pycsw创建的tsvector栏是基于文本anytext栏。然而pycsw针对"
"anytext_tsvector(任意文本)栏创建了GIN索引。这在 ``pycsw.core.repository.setup`` 是自"
"动生成的。任何针对 `csw:AnyText` or `apiso:AnyText` 的查询都是使用PostgreSQL FT"
"进行处理"

#: ../../administration.rst:123
msgid "PostGIS"
msgstr "PostGIS"

#: ../../administration.rst:125
msgid ""
"pycsw makes use of PostGIS spatial functions and native geometry data type."
msgstr "pycsw使用的是PostGIS空间功能和本地 geometry数据类型."

#: ../../administration.rst:126
msgid ""
"It is advised to install the PostGIS extension before setting up the pycsw "
"database"
msgstr "建议在创建pycsw数据库前先安装PostGIS扩展信息"

#: ../../administration.rst:127
msgid ""
"If PostGIS is detected, the ``pycsw-admin.py`` script will create both a native "
"geometry column and a WKT column, as well as a trigger to keep both synchronized"
msgstr ""
"如果PostGIS被监测到,脚本pycsw-admin.py既会在本地 geometry栏创建,也会在WKT栏创"
"建,以及触发器,来保持两者的同步。"

#: ../../administration.rst:128
msgid ""
"In case PostGIS gets disabled, pycsw will continue to work with the `WKT`_ "
"column"
msgstr "一旦PostGIS被禁用,pycsw将继续与 `WKT`_ 栏一起运行"

#: ../../administration.rst:129
msgid ""
"In case of migration from plain PostgreSQL database to PostGIS, the spatial "
"functions of PostGIS will be used automatically"
msgstr "如果plain PostgreSQL数据库移入PostGIS中,PostGIS的空间功能将自行启动"

#: ../../administration.rst:130
msgid ""
"When migrating from plain PostgreSQL database to PostGIS, in order to enable "
"native geometry support, a \"GEOMETRY\" column named \"wkb_geometry\" needs to "
"be created manually (along with the update trigger in ``pycsw.core.repository."
"setup``). Also the native geometries must be filled manually from the `WKT`_ "
"field. Next versions of pycsw will automate this process"
msgstr ""
"当从普通的数据库plain PostgreSQL移入PostGIS时, 为了启用本地geometry支持,需要手"
"动创建一个名为 \"wkb_geometry\" 的 \"GEOMETRY\" 列(随着 ``pycsw.core.repository."
"setup`` 一起更新)。本地geometries也必须在 `WKT`_ 中手动填充。pycsw的下一个版"
"本就会将此过程自动化运行"

#: ../../administration.rst:135
msgid "Mapping to an Existing Repository"
msgstr "映射到现有的存储库"

#: ../../administration.rst:137
msgid ""
"pycsw supports publishing metadata from an existing repository.  To enable this "
"functionality, the default database mappings must be modified to represent the "
"existing database columns mapping to the abstract core model (the default "
"mappings are in ``pycsw/config.py:MD_CORE_MODEL``)."
msgstr ""
"pycsw支持在现在的存储库中发布元数据。为了启用此功能,必须修改默认数据库映射以表"
"示映射到抽象核心模型的现有数据库列(默认的眏射方式在 ``pycsw/config.py:"
"MD_CORE_MODEL`` 中)"

#: ../../administration.rst:139
msgid "To override the default settings:"
msgstr "覆盖默认的配置:"

#: ../../administration.rst:141
msgid "define a custom database mapping based on ``etc/mappings.py``"
msgstr "定于基于 ``etc/mappings.py`` 数据库映射"

#: ../../administration.rst:142
msgid ""
"in ``default.yml``, set ``repository.mappings`` to the location of the mappings."
"py file:"
msgstr ""
"在 ``default.yml`` 中,设置 ``repository.mappings`` 为 mappings.py 文件的位置:"

#: ../../administration.rst:150
msgid "Note you can also reference mappings as a Python object as a dotted path:"
msgstr "注意,还可以将映射作为Python对象引用为虚线路径:"

#: ../../administration.rst:159
msgid ""
"See the :ref:`geonode`, :ref:`hhypermap`, and :ref:`odc` for further examples."
msgstr "请参照 :ref:`geonode` , :ref:`hhypermap` 和 :ref:`odc` 查看更多示例。"

#: ../../administration.rst:162
msgid "Existing Repository Requirements"
msgstr "现有的存储需求"

#: ../../administration.rst:164
msgid ""
"pycsw requires certain repository attributes and semantics to exist in any "
"repository to operate as follows:"
msgstr "pycsw需要在任何存储库中存在某些存储库属性和语义,以便按照以下方式操作:"

#: ../../administration.rst:166
msgid "``pycsw:Identifier``: unique identifier"
msgstr "``pycsw:Identifier``:唯一的标识符"

#: ../../administration.rst:167
msgid ""
"``pycsw:Typename``: typename for the metadata; typically the value of the root "
"element tag (e.g. ``csw:Record``, ``gmd:MD_Metadata``)"
msgstr ""
"``pycsw:Typename``: 元数据的类型名;典型的根标签值(例如 ``csw:Record`` , ``gmd:"
"MD_Metadata`` )"

#: ../../administration.rst:168
msgid ""
"``pycsw:Schema``: schema for the metadata; typically the target namespace (e.g. "
"``http://www.opengis.net/cat/csw/2.0.2``, ``http://www.isotc211.org/2005/gmd``)"
msgstr ""
"``pycsw:Schema``: 元数据图表;典型的目标名称空间(例如 ``http://www.opengis.net/"
"cat/csw/2.0.2`` , ``http://www.isotc211.org/2005/gmd`` )"

#: ../../administration.rst:169
msgid "``pycsw:InsertDate``: date of insertion"
msgstr "``pycsw:InsertDate`` : 插入日期"

#: ../../administration.rst:170
msgid "``pycsw:XML``: full XML representation"
msgstr "``pycsw:XML`` :完整的XML表现形式"

#: ../../administration.rst:171
msgid ""
"``pycsw:AnyText``: bag of XML element text values, used for full text search.  "
"Realized with the following design pattern:"
msgstr ""
"``pycsw:AnyText`` : XML元素文件值包,用于完整的文本搜索。采用以下设计模式实现:"

#: ../../administration.rst:173
msgid "capture all XML element and attribute values"
msgstr "获取所有的XML元素与属性值"

#: ../../administration.rst:174
msgid "store in repository"
msgstr "存储数据库"

#: ../../administration.rst:175
msgid "``pycsw:BoundingBox``: string of `WKT`_ or `EWKT`_ geometry"
msgstr "``pycsw:BoundingBox`` :  `WKT`_ or `EWKT`_ geometry字符串"

#: ../../administration.rst:177
msgid "The following repository semantics exist if the attributes are specified:"
msgstr "如果指定了属性,则存在以下存储库语义:"

#: ../../administration.rst:179
msgid "``pycsw:Keywords``: comma delimited list of keywords"
msgstr "``pycsw:Keywords`` : 以逗号分隔的关键字列表"

#: ../../administration.rst:180
msgid ""
"``pycsw:Links``: Text field of JSON list of objects with properties ``name``, "
"``description``, ``protocol``, ``url``"
msgstr ""
"``pycsw:Links``:具有属性 ``name``,``description``,``protocol``,``url`` 的对"
"象的JSON列表的文本字段"

#: ../../administration.rst:194
msgid "The ``pycsw:Links`` field should be a text type, not a JSON object type"
msgstr "``pycsw:Links`` 字段应该是文本类型,而不是 JSON 对象类型"

#: ../../administration.rst:196
msgid ""
"``pycsw:Bands``: Text field of JSON list of dicts with properties: ``name``, "
"``units``, ``min``, ``max``"
msgstr ""
"``pycsw:Bands``:具有属性的 JSON 列表的文本字段:``name``,``units``,``min``,"
"``max``"

#: ../../administration.rst:210
msgid "The ``pycsw:Bands`` field should be a text type, not a JSON object type"
msgstr "``pycsw:Bands`` 字段应该是文本类型,而不是 JSON 对象类型"

#: ../../administration.rst:212
msgid "Values of mappings can be derived from the following mechanisms:"
msgstr "映射值由以下的结构获得:"

#: ../../administration.rst:214
msgid "text fields"
msgstr "文本域"

#: ../../administration.rst:215
msgid "Python datetime.datetime or datetime.date objects"
msgstr "Python ``datetime.datetime`` 或 ``datetime.date`` 对象"

#: ../../administration.rst:216
msgid "Python functions"
msgstr "Python 功能"

#: ../../administration.rst:218
msgid "Further information is provided in ``pycsw/config.py:MD_CORE_MODEL``."
msgstr "在 ``pycsw/config.py:MD_CORE_MODEL`` 中可获得更多资料。"

#~ msgid "By default, pycsw supports the ``csw:Record`` information model."
#~ msgstr "默认情况下,pycsw支持 ``csw:Record`` 信息模型。"

#~ msgid ""
#~ "``pycsw:Links``: structure of links in the format \"name,description,"
#~ "protocol,url[^,,,[^,,,]]\""
#~ msgstr ""
#~ "``pycsw:Links`` : 链接的格式结构 \"name,description,protocol,url[^,,,"
#~ "[^,,,]]\" "


================================================
FILE: docs/locale/zh/LC_MESSAGES/api.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a
# Creative Commons Attribution 4.0 International License
# This file is distributed under the same license as the pycsw package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: pycsw 2.1-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-03-08 22:54+0800\n"
"PO-Revision-Date: 2022-03-09 09:44+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Generated-By: Babel 2.8.0\n"
"X-Generator: Poedit 3.0.1\n"

#: ../../api.rst:4
msgid "API"
msgstr "API"

#: ../../api.rst:6
msgid ""
"Python applications can integrate pycsw into their custom workflows.  "
"This allows for seamless integate within frameworks such as Flask and "
"Django."
msgstr ""
"Python应用可以在自己的工作流中集成 pycsw 。这样就允许在 Flask与 Django 这"
"样的框架中无缝集成。"

#: ../../api.rst:9
msgid ""
"Below are examples of where using the API (as opposed to the default "
"WSGI/CGI services could be used:"
msgstr "下面是一些使用API的示例(相对于默认的WSGI/CGI服务,可以使用:"

#: ../../api.rst:12
msgid "configuration based on a Python dict, or stored in a database"
msgstr "基于Python字典 进行配置,或存储在数据库中"

#: ../../api.rst:13
msgid "downstream request environment / framework (Flask, Django)"
msgstr "下游请求环境/框架(Flask,Django)"

#: ../../api.rst:14
msgid "authentication or authorization logic"
msgstr "认证或授权逻辑"

#: ../../api.rst:15
msgid "forcing CSW version 2.0.2 as default"
msgstr "强制使用 CSW 版本2.0.2作为默认值"

#: ../../api.rst:18
msgid "OARec Flask Example"
msgstr "OARec Flask 示例"

#: ../../api.rst:20
msgid ""
"See https://github.com/geopython/pycsw/blob/master/pycsw/wsgi_flask.py "
"for how to implement a Flask wrapper atop all pycsw supported APIs.  "
"Note the use of Flask blueprints to enable integration with downstream "
"Flask applications."
msgstr ""
"请参阅 https://github.com/geopython/pycsw/blob/master/pycsw/wsgi_flask."
"py 了解如何在所有 pycsw 支持的 API 上实现 Flask 包装器。请注意使用 Flask "
"蓝图来实现与下游 Flask 应用程序的集成。"

#: ../../api.rst:25
msgid "Simple Flask blueprint example"
msgstr "简单的 Flask 蓝图示例"

#: ../../api.rst:43
msgid ""
"In the above example, all pycsw endpoints are made available under "
"``http://localhost:8000/oapi``."
msgstr ""
"在上面的示例中,所有 pycsw 端点都在 http://localhost:8000/oapi 下可用。"

#: ../../api.rst:46
msgid "Simple CSW Flask Example"
msgstr "简单的 CSW Flask 示例"


================================================
FILE: docs/locale/zh/LC_MESSAGES/ckan.po
================================================
#
msgid ""
msgstr ""
"Project-Id-Version: pycsw 2.0-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-03-08 22:54+0800\n"
"PO-Revision-Date: 2022-03-09 09:48+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Generated-By: Babel 2.8.0\n"
"X-Generator: Poedit 3.0.1\n"

#: ../../ckan.rst:4
msgid "CKAN Configuration"
msgstr "CKAN配置"

#: ../../ckan.rst:6
msgid ""
"CKAN (https://ckan.org) is a powerful data management system that makes "
"data accessible – by providing tools to streamline publishing, sharing, "
"finding and using data. CKAN is aimed at data publishers (national and "
"regional governments, companies and organizations) wanting to make their "
"data open and available."
msgstr ""
"CKAN (http://ckan.org)是一个功能强大的数据管理系统,该系统提高了数据可访"
"问性,通过提供工具来简化发布、共享、发现和使用数据。CKAN的目的在于使他们"
"变成数据开放并可用的数据发布者(国家和地方政府、公司和组织)。"

#: ../../ckan.rst:8
msgid ""
"`ckanext-spatial`_ is CKAN's geospatial extension.  The extension adds a "
"spatial field to the default CKAN dataset schema, using PostGIS as the "
"backend. This allows to perform spatial queries and display the dataset "
"extent on the frontend. It also provides harvesters to import geospatial "
"metadata into CKAN from other sources, as well as commands to support "
"the CSW standard. Finally, it also includes plugins to preview spatial "
"formats such as GeoJSON."
msgstr ""
"`ckanext 空间`_ 是 CKAN 的地理空间扩展。此功能扩展将空间的字段添加到默认"
"的 CKAN 数据集架构中,使用 PostGIS 作为后端。这允许执行空间查询并在前端显"
"示数据集范围。它还提供了将地理空间元数据从其他来源导入 CKAN 的采集器,以"
"及支持 CSW 标准的命令。最后,它还包括用于预览空间格式的插件,例如 "
"GeoJSON。"

#: ../../ckan.rst:11
msgid "CKAN Setup"
msgstr "CKAN设置"

#: ../../ckan.rst:13
msgid ""
"Installation and configuration Instructions are provided as part of the "
"ckanext-spatial `documentation`_."
msgstr "安装和配置说明作为 ckanext-spatial `documentation`_ 的一部分提供。"


================================================
FILE: docs/locale/zh/LC_MESSAGES/committers.po
================================================
#
msgid ""
msgstr ""
"Project-Id-Version: pycsw 2.0-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-28 11:27+0800\n"
"PO-Revision-Date: 2022-03-09 09:50+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Generated-By: Babel 2.3.4\n"
"X-Generator: Poedit 3.0.1\n"

#: ../../committers.rst:4
msgid "Committers"
msgstr "提交者,执行者,管理员"

#: ../../../COMMITTERS.txt:2
msgid "Login(s)"
msgstr "登录"

#: ../../../COMMITTERS.txt:2
msgid "Name"
msgstr "名字"

#: ../../../COMMITTERS.txt:2
msgid "Email / Contact"
msgstr "联系方式/邮件"

#: ../../../COMMITTERS.txt:2
msgid "Area(s)"
msgstr "区域"

#: ../../../COMMITTERS.txt:4
msgid "tomkralidis"
msgstr "tomkralidis"

#: ../../../COMMITTERS.txt:4
msgid "Tom Kralidis"
msgstr "Tom Kralidis"

#: ../../../COMMITTERS.txt:4
msgid "tomkralidis at gmail.com"
msgstr "tomkralidis at gmail.com"

#: ../../../COMMITTERS.txt:4 ../../../COMMITTERS.txt:7
msgid "Overall"
msgstr "总计"

#: ../../../COMMITTERS.txt:5
msgid "kalxas"
msgstr "kalxas"

#: ../../../COMMITTERS.txt:5
msgid "Angelos Tzotsos"
msgstr "Angelos Tzotsos"

#: ../../../COMMITTERS.txt:5
msgid "tzotsos at gmail.com"
msgstr "tzotsos at gmail.com"

#: ../../../COMMITTERS.txt:5
msgid "INSPIRE, APISO profiles, Packaging"
msgstr "INSPIRE, APISO profiles, Packaging"

#: ../../../COMMITTERS.txt:6
msgid "adamhinz"
msgstr "adamhinz"

#: ../../../COMMITTERS.txt:6
msgid "Adam Hinz"
msgstr "Adam Hinz"

#: ../../../COMMITTERS.txt:6
msgid "hinz dot adam at gmail.com"
msgstr "hinz dot adam at gmail.com"

#: ../../../COMMITTERS.txt:6
msgid "WSGI/Server Deployment"
msgstr "WSGI/服务器部署"

#: ../../../COMMITTERS.txt:7
msgid "ricardogsilva"
msgstr "ricardogsilva"

#: ../../../COMMITTERS.txt:7
msgid "Ricardo Garcia Silva"
msgstr "Ricardo Garcia Silva"

#: ../../../COMMITTERS.txt:7
msgid "ricardo.garcia.silva at gmail.com"
msgstr "ricardo.garcia.silva at gmail.com"


================================================
FILE: docs/locale/zh/LC_MESSAGES/configuration.po
================================================
#
msgid ""
msgstr ""
"Project-Id-Version: pycsw 2.0-dev\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-03-08 22:54+0800\n"
"PO-Revision-Date: 2022-03-09 10:27+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Generated-By: Babel 2.8.0\n"
"X-Generator: Poedit 3.0.1\n"

#: ../../configuration.rst:4
msgid "Configuration"
msgstr "配置"

#: ../../configuration.rst:6
msgid ""
"pycsw's runtime configuration is defined by ``default.yml``.  pycsw ships with "
"a `sample configuration`_ (``default-sample.yml``).  Copy the file to ``default."
.yml`` and edit the following:"
msgstr ""
"pycsw 的运行配置写为此格式 ``default.yml`` 。 pycsw 还有一个示例配置 "
"( ``default-sample.yml`` )。 将文件复制到 ``default.yml`` 并编辑以下内容:"

#: ../../configuration.rst:8
msgid "**[server]**"
msgstr "**[server]**"

#: ../../configuration.rst:10
msgid "**home**: the full filesystem path to pycsw"
msgstr "**home**: pycsw 的完整文件系统路径"

#: ../../configuration.rst:11
msgid "**url**: the URL of the resulting service"
msgstr "**url**: 生成服务器的网址"

#: ../../configuration.rst:12
msgid "**mimetype**: the MIME type when returning HTTP responses"
msgstr "**mimetype**: 当HTTP响应时的MIME型"

#: ../../configuration.rst:13
msgid ""
"**language**: the ISO 639-1 language and ISO 3166-1 alpha2 country code of the "
"service (e.g. ``en-CA``, ``fr-CA``, ``en-US``)"
msgstr ""
"**language**: ISO 639-1 语言和 ISO 3166-1 α2服务器上的国家/地区代码 (例如 ``en-"
"CA`` 、``fr-CA``、 ``EN-US`` )"

#: ../../configuration.rst:14
msgid ""
"**encoding**: the content type encoding (e.g. ``ISO-8859-1``, see https://docs."
"python.org/2/library/codecs.html#standard-encodings).  Default value is 'UTF-8'"
msgstr ""
"**encoding**: 编码的内容类别 (例如 ``ISO-8859-1``,见 https://docs.python.org/2/"
"library/codecs.html#standard-encodings ) 。 默认值是 'UTF-8'"

#: ../../configuration.rst:15
msgid ""
"**maxrecords**: the maximum number of records to return by default.  This value "
"is enforced if a CSW's client's ``maxRecords`` parameter is greater than "
"``server.maxrecords`` to limit capacity.  See :ref:`maxrecords-handling` for "
"more information"
msgstr ""
"**maxrecords**: 默认情况下再次浏览记录的最大数目。如果CSW客户端的 "
"``maxRecords`` 参数大于 ``server.maxrecords`` ,此值就会被强制性限制。 请参见 :"
"ref:`maxrecords-handling` 的详细信息"

#: ../../configuration.rst:16
msgid ""
"**loglevel**: the logging level (see https://docs.python.org/library/logging."
"html#logging-levels)"
msgstr ""
"**loglevel**:日志级别(参见 https://docs.python.org/library/logging."
"html#logging-levels)"

#: ../../configuration.rst:17
msgid "**logfile**: the full file path to the logfile"
msgstr "**logfile**:日志文件的完整文件系统路径"

#: ../../configuration.rst:18
msgid ""
"**ogc_schemas_base**: base URL of OGC XML schemas tree file structure (default "
"is http://schemas.opengis.net)"
msgstr ""
"**ogc_schemas_base**: OGC XML 模型文件结构树的网址库 (默认 http://schemas."
"opengis.net)"

#: ../../configuration.rst:19
msgid ""
"**federatedcatalogues**: comma delimited list of CSW endpoints to be used for "
"distributed searching, if requested by the client (see :ref:"
"`distributedsearching`)"
msgstr ""
"**federatedcatalogues**: 如果客户端有用户请求加入时, CSW端以逗号分隔的列表就会"
"用于分布式搜索 (请参阅 :ref:`distributedsearching` )"

#: ../../configuration.rst:20
msgid ""
"**pretty_print**: whether to pretty print the output (``true`` or ``false``).  "
"Default is ``false``"
msgstr ""
"**pretty_print**: 输出的( ``true`` or ``false`` )来确认是否要优质打印。 默认值"
"为 ``false``"

#: ../../configuration.rst:21
msgid ""
"**gzip_compresslevel**: gzip compression level, lowest is ``1``, highest is "
"``9``.  Default is off.  **NOTE**: if gzip compression is already enabled via "
"your web server, do not enable this directive (or else the server will try to "
"compress the response twice, resulting in degraded performance)"
msgstr ""
"**gzip_compresslevel**:gzip 压缩级别,最低为 ``1``,最高为 ``9``。默认为关闭。 "
"**注意**:如果 gzip 压缩已通过您的 Web 服务器启用,请不要启用此指令(否则服务器"
"将尝试压缩响应两次,从而导致性能下降)"

#: ../../configuration.rst:22
msgid ""
"**domainquerytype**: for GetDomain operations, how to output domain values.  "
"Accepted values are ``list`` and ``range`` (min/max). Default is ``list``"
msgstr ""
"**domainquerytype**: 在GetDomain中应当如何输出域值。 公认的域值有 ``list`` 和 "
"``range`` (最小/最大)。默认值是 ``list`` "

#: ../../configuration.rst:23
msgid ""
"**domaincounts**: for GetDomain operations, whether to provide frequency counts "
"for values.  Accepted values are ``true`` and ``False``. Default is ``false``"
msgstr ""
"**domaincounts**:在GetDomain中,是否要提供频率计数值的操作。目前的值有 "
"``true`` 和 ``false`` 。默认值为 ``false``"

#: ../../configuration.rst:24
msgid ""
"**profiles**: comma delimited list of profiles to load at runtime (default is "
"none).  See :ref:`profiles`"
msgstr ""
"**profiles**: 是否在运行时加载以逗号分隔的配置文件列表(默认为无)。 请参见 :"
"ref:`profiles`"

#: ../../configuration.rst:25
msgid ""
"**smtp_host**: SMTP host for processing ``csw:ResponseHandler`` parameter via "
"outgoing email requests (default is ``localhost``)"
msgstr ""
"**smtp_host**: SMTP 主机(默认为' 本地主机 ')通过发送电子邮件请求的方式处理  "
"``csw:ResponseHandler`` 参数"

#: ../../configuration.rst:26
msgid ""
"**spatial_ranking**: parameter that enables (``true`` or ``false``) ranking of "
"spatial query results as per `K.J. Lanfear 2006 - A Spatial Overlay Ranking "
"Method for a Geospatial Search of Text Objects  <https://pubs.usgs.gov/"
"of/2006/1279/2006-1279.pdf>`_."
msgstr ""
"**spatial_ranking**: 是否在对空间搜索的结果进行排名的一项参数( ``true`` 或 "
"``false`` ),此排名参数在每 `K.J. Lanfear 2006 文本对象空间搜索的一个空间覆盖排"
"名方法 <http: pubs.usgs.gov/of/2006/1279/2006-1279.pdf>`_ 。"

#: ../../configuration.rst:27
msgid ""
"**workers**: set the number of workers used by the wsgi server when lunching "
"pycsw using the provided docker/entrypoint.py. If not set, it will use 2 "
"workers as Default."
msgstr ""
"**workers**:使用提供的 docker/entrypoint.py 设置午餐 pycsw 时 wsgi 服务器使用的"
"工人数量。如果未设置,它将使用 2 个工人作为默认值。"

#: ../../configuration.rst:29
msgid "**[manager]**"
msgstr "**[manager]**"

#: ../../configuration.rst:31
msgid ""
"**transactions**: whether to enable transactions (``true`` or ``false``).  "
"Default is ``false`` (see :ref:`transactions`)"
msgstr ""
"**transactions**: 是否可以交易 ( ``true`` 或 ``false`` )。 默认值为否 (请参"
"阅 :ref:`transactions` )"

#: ../../configuration.rst:32
msgid ""
"**allowed_ips**: comma delimited list of IP addresses (e.g. 192.168.0.103), "
"wildcards (e.g. 192.168.0.*) or CIDR notations (e.g. 192.168.100.0/24) allowed "
"to perform transactions (see :ref:`transactions`)"
msgstr ""
"**allowed_ips**: IP 地址 (如 192.168.0.103)、 通配符 (如 192.168.0.*) 或 CIDR 表"
"示法 (例如 192.168.100.0/24) 以逗号分隔的列表允许执行交易 (请参见 :ref:"
"`transactions` )"

#: ../../configuration.rst:33
msgid ""
"**csw_harvest_pagesize**: when harvesting other CSW servers, the number of "
"records per request to page by (default is 10)"
msgstr ""
"**csw_harvest_pagesize**: 当收集其它CSW服务器时,每项请求的记录数都会显示在各页"
"中 (每页默认的数量为 10)"

#: ../../configuration.rst:35
msgid "**[metadata:main]**"
msgstr "**[metadata:main]**"

#: ../../configuration.rst:37
msgid "**identification_title**: the title of the service"
msgstr "**identification_title**: 服务项目标题"

#: ../../configuration.rst:38
msgid "**identification_abstract**: some descriptive text about the service"
msgstr "**identification_abstract**: 一些有关该服务的描述性文本"

#: ../../configuration.rst:39
msgid ""
"**identification_keywords**: comma delimited list of keywords about the service"
msgstr "**identification_keywords**: 以逗号分隔的服务器有关的关键字列表"

#: ../../configuration.rst:40
msgid ""
"**identification_keywords_type**: keyword type as per the `ISO 19115 "
"MD_KeywordTypeCode codelist <https://www.isotc211.org/2005/resources/Codelist/"
"gmxCodelists.xml#MD_KeywordTypeCode>`_).  Accepted values are ``discipline``, "
"``temporal``, ``place``, ``theme``, ``stratum``"
msgstr ""
"**identification_keywords_type**: 每 `ISO 19115 MD_KeywordTypeCode codelist "
"<http://www.isotc211.org/2005/resources/Codelist/gmxCodelists."
"xml#MD_KeywordTypeCode>`_ )的关键字类型。接受的值是 ``纪律``, ``时间``, ``地点"
"``, ``主题``, ``地层``"

#: ../../configuration.rst:41
msgid "**identification_fees**: fees associated with the service"
msgstr "**identification_fees**: 与服务有关的费用"

#: ../../configuration.rst:42
msgid ""
"**identification_accessconstraints**: access constraints associated with the "
"service"
msgstr "**identification_accessconstraints**: 访问与该服务相关的限制条目"

#: ../../configuration.rst:43
msgid "**provider_name**: the name of the service provider"
msgstr "**provider_name**: 服务提供者的名字"

#: ../../configuration.rst:44
msgid "**provider_url**: the URL of the service provider"
msgstr "**provider_url**: 服务提供者的网址"

#: ../../configuration.rst:45
msgid "**contact_name**: the name of the provider contact"
msgstr "**provider_name**: 服务提供者联系人"

#: ../../configuration.rst:46
msgid "**contact_position**: the position title of the provider contact"
msgstr "**contact_position**:提供者联系人的职位名称"

#: ../../configuration.rst:47
msgid "**contact_address**: the address of the provider contact"
msgstr "**contact_address**: 提供者联系人的地址"

#: ../../configuration.rst:48
msgid "**contact_city**: the city of the provider contact"
msgstr "**contact_city**:提供者联系人所在城市"

#: ../../configuration.rst:49
msgid ""
"**contact_stateorprovince**: the province or territory of the provider contact"
msgstr "**contact_stateorprovince**: 提供者联系人所在省份或更详细地址"

#: ../../configuration.rst:50
msgid "**contact_postalcode**: the postal code of the provider contact"
msgstr "**contact_postalcode**: 提供者联系人所在地区的邮政编码"

#: ../../configuration.rst:51
msgid "**contact_country**: the country of the provider contact"
msgstr "**contact_country**: 提供者联系人所在国籍"

#: ../../configuration.rst:52
msgid "**contact_phone**: the phone number of the provider contact"
msgstr "**contact_phone**: 提供者联系人的电话号码"

#: ../../configuration.rst:53
msgid "**contact_fax**: the facsimile number of the provider contact"
msgstr "**contact_fax**: 提供者联系人的传真号码"

#: ../../configuration.rst:54
msgid "**contact_email**: the email address of the provider contact"
msgstr "**contact_email**: 提供者联系人的电子邮件地址"

#: ../../configuration.rst:55
msgid "**contact_url**: the URL to more information about the provider contact"
msgstr "**contact_url**: 提供者联系人的详细URL"

#: ../../configuration.rst:56
msgid "**contact_hours**: the hours of service to contact the provider"
msgstr "**contact_hours**: 提供者联系人的服务时间"

#: ../../configuration.rst:57
msgid "**contact_instructions**: the how to contact the provider contact"
msgstr "**contact_instructions**: 如何与提供者取得联系"

#: ../../configuration.rst:58
msgid ""
"**contact_role**: the role of the provider contact as per the `ISO 19115 "
"CI_RoleCode codelist <https://www.isotc211.org/2005/resources/Codelist/"
"gmxCodelists.xml#CI_RoleCode>`_).  Accepted values are ``author``, "
"``processor``, ``publisher``, ``custodian``, ``pointOfContact``, "
"``distributor``, ``user``, ``resourceProvider``, ``originator``, ``owner``, "
"``principalInvestigator``"
msgstr ""
"**contact_role**: 在 `ISO 19115 CI_RoleCode codelist <http://www.isotc211."
"org/2005/resources/Codelist/gmxCodelists.xml#CI_RoleCode>`_ )有每位提供者联系人"
"的职务。可接受的值包括 ``作者``、``处理器``、``发布者``、``保管人``、"
"``pointOfContact``、``分发者``、``用户``、``资源提供者``,``发起人``,``所有者"
"``,``主要调查员``"

#: ../../configuration.rst:60
msgid "**[repository]**"
msgstr "**[repository]**"

#: ../../configuration.rst:62
msgid ""
"**database**: the full file path to the metadata database, in database URL "
"format (see https://docs.sqlalchemy.org/en/latest/core/engines.html#database-"
"urls)"
msgstr ""
"**database**:元数据库中完整的文件路径,采用数据库URL格式(见 http://docs."
"sqlalchemy.org/en/latest/core/engines.html#database-urls )"

#: ../../configuration.rst:63
msgid ""
"**table**: the table name for metadata records (default is ``records``).  If "
"you are using PostgreSQL with a DB schema other than ``public``, qualify the "
"table like ``myschema.table``"
msgstr ""
"**table**:元数据记录的表名(默认为 ``records``)。如果在使用除了 ``public`` 以"
"外的DB模式PostgreSQL,表格就会被限定,如 ``myschema.table``"

#: ../../configuration.rst:64
msgid "**mappings**: custom repository mappings (see :ref:`custom_repository`)"
msgstr "**mappings**:自定义的映射库(请参见 :ref:`custom_repository` )"

#: ../../configuration.rst:65
msgid ""
"**source**: the source of this repository only if not local (e.g. :ref:"
"`geonode`, :ref:`odc`).  Supported values are ``geonode``, ``odc``"
msgstr ""
"**source**:不在本地的数据库源(例如:请参考 :ref:`geonode` , :ref:`odc` )。现"
"有值为`geonode`,`odc`"

#: ../../configuration.rst:66
msgid ""
"**filter**: server side database filter to apply as mask to all CSW requests "
"(see :ref:`repofilters`)"
msgstr ""
"**filter**:服务器端的数据库过滤器,适用所有CSW请求掩码(请参阅: :ref:"
"`repofilters`)"

#: ../../configuration.rst:67
msgid ""
"**max_retries**: max number of retry attempts when connecting to records-"
"repository database"
msgstr "**max_retries**:连接到记录存储库数据库时的最大重试次数"

#: ../../configuration.rst:71
msgid ""
"See :ref:`administration` for connecting your metadata repository and supported "
"information models."
msgstr "请参阅: :ref:`administration` ,用于连接元数据信息库和支持信息模型。"

#: ../../configuration.rst:76
msgid "MaxRecords Handling"
msgstr "MaxRecords 处理"

#: ../../configuration.rst:78
msgid ""
"The The following describes how ``maxRecords`` is handled by the configuration "
"when handling OARec items or CSW ``GetRecords`` requests:"
msgstr ""
"以下描述了在处理 OARec 项目或 CSW 的 ``GetRecords`` 请求时配置如何处理 "
"``maxRecords`` :"

#: ../../configuration.rst:1
msgid "server.maxrecords"
msgstr "server.maxrecords"

#: ../../configuration.rst:1
msgid "OARec limit/CSW GetRecords.maxRecords"
msgstr "OARec 限制/CSW GetRecords.maxRecords"

#: ../../configuration.rst:1
msgid "Result"
msgstr "结果"

#: ../../configuration.rst:1
msgid "none set"
msgstr "未设定"

#: ../../configuration.rst:1
msgid "none passed"
msgstr "未通过"

#: ../../configuration.rst:1
msgid "10 (CSW default)"
msgstr "10 (CSW 默认值)"

#: ../../configuration.rst:1
msgid "20"
msgstr "20"

#: ../../configuration.rst:1
msgid "14"
msgstr "14"

#: ../../configuration.rst:1
msgid "100"
msgstr "100"

#: ../../configuration.rst:1
msgid "200"
msgstr "200"

#: ../../configuration.rst:92
msgid "Using environment variables in configuration files"
msgstr "在配置文件中使用环境变量"

#: ../../configuration.rst:94
msgid ""
"pycsw configuration supports using system environment variables, which can be "
"helpful for deploying into `12 factor <https://12factor.net/>`_ environments "
"for example."
msgstr ""
"pycsw 配置支持使用系统环境变量,例如有助于部署到 `12 factor <https://12factor."
"net/
Download .txt
gitextract_p9bcr3yi/

├── .coveragerc
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── docker.yml
│       ├── ghcr.yml
│       ├── main.yml
│       ├── stale.yml
│       └── vulnerabilities.yml
├── .gitignore
├── .readthedocs.yaml
├── CODE_OF_CONDUCT.md
├── COMMITTERS.txt
├── CONTRIBUTING.rst
├── Dockerfile
├── HISTORY.txt
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── SECURITY.md
├── csw.py
├── default-sample.yml
├── docker/
│   ├── compose/
│   │   ├── docker-compose.scale.yml
│   │   ├── docker-compose.yml
│   │   └── pycsw.yml
│   ├── entrypoint.py
│   ├── helm/
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── db-data-persistentvolumeclaim.yaml
│   │   │   ├── db-service.yaml
│   │   │   ├── db-statefulset.yaml
│   │   │   ├── pycsw-configmap.yaml
│   │   │   ├── pycsw-deployment.yaml
│   │   │   └── pycsw-service.yaml
│   │   └── values.yaml
│   ├── kubernetes/
│   │   ├── Makefile
│   │   ├── db-data-persistentvolumeclaim.yaml
│   │   ├── db-deployment.yaml
│   │   ├── db-service.yaml
│   │   ├── pycsw-configmap.yaml
│   │   ├── pycsw-deployment.yaml
│   │   └── pycsw-service.yaml
│   ├── min-apk
│   └── pycsw.yml
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   └── favicon/
│   │       └── browserconfig.xml
│   ├── _templates/
│   │   ├── indexsidebar.html
│   │   └── layout.html
│   ├── administration.rst
│   ├── api.rst
│   ├── ckan.rst
│   ├── committers.rst
│   ├── conf.py
│   ├── configuration.rst
│   ├── contributing.rst
│   ├── csw-support.rst
│   ├── distributedsearching.rst
│   ├── docker.rst
│   ├── geonode.rst
│   ├── hhypermap.rst
│   ├── html-templating.rst
│   ├── index.rst
│   ├── installation.rst
│   ├── introduction.rst
│   ├── json.rst
│   ├── license.rst
│   ├── locale/
│   │   ├── el/
│   │   │   └── LC_MESSAGES/
│   │   │       └── .gitkeep
│   │   ├── fr/
│   │   │   └── LC_MESSAGES/
│   │   │       └── .gitkeep
│   │   └── zh/
│   │       └── LC_MESSAGES/
│   │           ├── administration.po
│   │           ├── api.po
│   │           ├── ckan.po
│   │           ├── committers.po
│   │           ├── configuration.po
│   │           ├── contributing.po
│   │           ├── csw-support.po
│   │           ├── distributedsearching.po
│   │           ├── docker.po
│   │           ├── geonode.po
│   │           ├── hhypermap.po
│   │           ├── index.po
│   │           ├── installation.po
│   │           ├── introduction.po
│   │           ├── json.po
│   │           ├── license.po
│   │           ├── migration-guide.po
│   │           ├── oaipmh.po
│   │           ├── oarec-support.po
│   │           ├── odc.po
│   │           ├── opensearch.po
│   │           ├── outputschemas.po
│   │           ├── profiles.po
│   │           ├── repofilters.po
│   │           ├── repositories.po
│   │           ├── sitemaps.po
│   │           ├── soap.po
│   │           ├── sru.po
│   │           ├── stac.po
│   │           ├── support.po
│   │           ├── testing.po
│   │           ├── tools.po
│   │           └── transactions.po
│   ├── metadata-model-reference.rst
│   ├── migration-guide.rst
│   ├── oaipmh.rst
│   ├── oarec-support.rst
│   ├── odc.rst
│   ├── opensearch.rst
│   ├── outputschemas.rst
│   ├── profiles.rst
│   ├── pubsub.rst
│   ├── repofilters.rst
│   ├── repositories.rst
│   ├── requirements-mocked.txt
│   ├── sitemaps.rst
│   ├── soap.rst
│   ├── sru.rst
│   ├── stac.rst
│   ├── support.rst
│   ├── testing.rst
│   ├── tools.rst
│   ├── transactions.rst
│   └── xslt.rst
├── etc/
│   ├── harvest-all.cron
│   ├── mappings.py
│   ├── migrations/
│   │   └── 2.x-3.0/
│   │       └── migrate.sql
│   ├── pycsw
│   ├── pycsw.conf
│   └── pycsw.desktop
├── pycsw/
│   ├── __init__.py
│   ├── broker/
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── http.py
│   │   └── mqtt.py
│   ├── core/
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── config.py
│   │   ├── etree.py
│   │   ├── formats/
│   │   │   ├── __init__.py
│   │   │   └── fmt_json.py
│   │   ├── log.py
│   │   ├── metadata.py
│   │   ├── pygeofilter_evaluate.py
│   │   ├── repository.py
│   │   ├── schemas/
│   │   │   ├── catalog.xml
│   │   │   ├── ogc/
│   │   │   │   ├── OGC-SOFTWARE-NOTICE.txt
│   │   │   │   ├── README.txt
│   │   │   │   ├── cat/
│   │   │   │   │   └── csw/
│   │   │   │   │       └── 3.0/
│   │   │   │   │           ├── README.txt
│   │   │   │   │           ├── _wrapper.xsd
│   │   │   │   │           ├── cswAll.xsd
│   │   │   │   │           ├── cswCommon.xsd
│   │   │   │   │           ├── cswGetCapabilities.xsd
│   │   │   │   │           ├── cswGetDomain.xsd
│   │   │   │   │           ├── cswGetRecordById.xsd
│   │   │   │   │           ├── cswGetRecords.xsd
│   │   │   │   │           ├── cswHarvest.xsd
│   │   │   │   │           ├── cswTransaction.xsd
│   │   │   │   │           ├── cswUnHarvest.xsd
│   │   │   │   │           ├── rec-dcmes.xsd
│   │   │   │   │           ├── rec-dcterms.xsd
│   │   │   │   │           └── record.xsd
│   │   │   │   ├── csw/
│   │   │   │   │   └── 2.0.2/
│   │   │   │   │       ├── CSW-discovery.xsd
│   │   │   │   │       ├── CSW-publication.xsd
│   │   │   │   │       ├── rec-dcmes.xsd
│   │   │   │   │       ├── rec-dcterms.xsd
│   │   │   │   │       └── record.xsd
│   │   │   │   ├── filter/
│   │   │   │   │   ├── 1.1.0/
│   │   │   │   │   │   ├── expr.xsd
│   │   │   │   │   │   ├── filter.xsd
│   │   │   │   │   │   ├── filterCapabilities.xsd
│   │   │   │   │   │   └── sort.xsd
│   │   │   │   │   └── 2.0/
│   │   │   │   │       ├── _wrapper.xsd
│   │   │   │   │       ├── expr.xsd
│   │   │   │   │       ├── filter.xsd
│   │   │   │   │       ├── filterAll.xsd
│   │   │   │   │       ├── filterCapabilities.xsd
│   │   │   │   │       ├── query.xsd
│   │   │   │   │       └── sort.xsd
│   │   │   │   ├── gml/
│   │   │   │   │   ├── 3.1.1/
│   │   │   │   │   │   ├── base/
│   │   │   │   │   │   │   ├── basicTypes.xsd
│   │   │   │   │   │   │   ├── coordinateOperations.xsd
│   │   │   │   │   │   │   ├── coordinateReferenceSystems.xsd
│   │   │   │   │   │   │   ├── coordinateSystems.xsd
│   │   │   │   │   │   │   ├── coverage.xsd
│   │   │   │   │   │   │   ├── dataQuality.xsd
│   │   │   │   │   │   │   ├── datums.xsd
│   │   │   │   │   │   │   ├── defaultStyle.xsd
│   │   │   │   │   │   │   ├── dictionary.xsd
│   │   │   │   │   │   │   ├── direction.xsd
│   │   │   │   │   │   │   ├── dynamicFeature.xsd
│   │   │   │   │   │   │   ├── feature.xsd
│   │   │   │   │   │   │   ├── geometryAggregates.xsd
│   │   │   │   │   │   │   ├── geometryBasic0d1d.xsd
│   │   │   │   │   │   │   ├── geometryBasic2d.xsd
│   │   │   │   │   │   │   ├── geometryComplexes.xsd
│   │   │   │   │   │   │   ├── geometryPrimitives.xsd
│   │   │   │   │   │   │   ├── gml.xsd
│   │   │   │   │   │   │   ├── gmlBase.xsd
│   │   │   │   │   │   │   ├── grids.xsd
│   │   │   │   │   │   │   ├── measures.xsd
│   │   │   │   │   │   │   ├── observation.xsd
│   │   │   │   │   │   │   ├── referenceSystems.xsd
│   │   │   │   │   │   │   ├── temporal.xsd
│   │   │   │   │   │   │   ├── temporalReferenceSystems.xsd
│   │   │   │   │   │   │   ├── temporalTopology.xsd
│   │   │   │   │   │   │   ├── topology.xsd
│   │   │   │   │   │   │   ├── units.xsd
│   │   │   │   │   │   │   └── valueObjects.xsd
│   │   │   │   │   │   └── smil/
│   │   │   │   │   │       ├── smil20-language.xsd
│   │   │   │   │   │       └── smil20.xsd
│   │   │   │   │   └── 3.2.1/
│   │   │   │   │       ├── SchematronConstraints.xml
│   │   │   │   │       ├── basicTypes.xsd
│   │   │   │   │       ├── coordinateOperations.xsd
│   │   │   │   │       ├── coordinateReferenceSystems.xsd
│   │   │   │   │       ├── coordinateSystems.xsd
│   │   │   │   │       ├── coverage.xsd
│   │   │   │   │       ├── datums.xsd
│   │   │   │   │       ├── defaultStyle.xsd
│   │   │   │   │       ├── deprecatedTypes.xsd
│   │   │   │   │       ├── dictionary.xsd
│   │   │   │   │       ├── direction.xsd
│   │   │   │   │       ├── dynamicFeature.xsd
│   │   │   │   │       ├── feature.xsd
│   │   │   │   │       ├── geometryAggregates.xsd
│   │   │   │   │       ├── geometryBasic0d1d.xsd
│   │   │   │   │       ├── geometryBasic2d.xsd
│   │   │   │   │       ├── geometryComplexes.xsd
│   │   │   │   │       ├── geometryPrimitives.xsd
│   │   │   │   │       ├── gml.xsd
│   │   │   │   │       ├── gmlBase.xsd
│   │   │   │   │       ├── gml_32_geometries.rdf
│   │   │   │   │       ├── gml_3_2_1-ReadMe.txt
│   │   │   │   │       ├── grids.xsd
│   │   │   │   │       ├── measures.xsd
│   │   │   │   │       ├── observation.xsd
│   │   │   │   │       ├── referenceSystems.xsd
│   │   │   │   │       ├── temporal.xsd
│   │   │   │   │       ├── temporalReferenceSystems.xsd
│   │   │   │   │       ├── temporalTopology.xsd
│   │   │   │   │       ├── topology.xsd
│   │   │   │   │       ├── units.xsd
│   │   │   │   │       └── valueObjects.xsd
│   │   │   │   ├── ogcapi/
│   │   │   │   │   └── records/
│   │   │   │   │       └── part1/
│   │   │   │   │           └── 1.0/
│   │   │   │   │               └── ogcapi-records-1.yaml
│   │   │   │   └── ows/
│   │   │   │       ├── 1.0.0/
│   │   │   │       │   ├── ows19115subset.xsd
│   │   │   │       │   ├── owsAll.xsd
│   │   │   │       │   ├── owsCommon.xsd
│   │   │   │       │   ├── owsDataIdentification.xsd
│   │   │   │       │   ├── owsExceptionReport.xsd
│   │   │   │       │   ├── owsGetCapabilities.xsd
│   │   │   │       │   ├── owsOperationsMetadata.xsd
│   │   │   │       │   ├── owsServiceIdentification.xsd
│   │   │   │       │   └── owsServiceProvider.xsd
│   │   │   │       ├── 1.1.0/
│   │   │   │       │   ├── ows19115subset.xsd
│   │   │   │       │   ├── owsAll.xsd
│   │   │   │       │   ├── owsCommon.xsd
│   │   │   │       │   ├── owsContents.xsd
│   │   │   │       │   ├── owsDataIdentification.xsd
│   │   │   │       │   ├── owsDomainType.xsd
│   │   │   │       │   ├── owsExceptionReport.xsd
│   │   │   │       │   ├── owsGetCapabilities.xsd
│   │   │   │       │   ├── owsGetResourceByID.xsd
│   │   │   │       │   ├── owsInputOutputData.xsd
│   │   │   │       │   ├── owsManifest.xsd
│   │   │   │       │   ├── owsOperationsMetadata.xsd
│   │   │   │       │   ├── owsServiceIdentification.xsd
│   │   │   │       │   └── owsServiceProvider.xsd
│   │   │   │       └── 2.0/
│   │   │   │           ├── ows19115subset.xsd
│   │   │   │           ├── owsAdditionalParameters.xsd
│   │   │   │           ├── owsAll.xsd
│   │   │   │           ├── owsCommon.xsd
│   │   │   │           ├── owsContents.xsd
│   │   │   │           ├── owsDataIdentification.xsd
│   │   │   │           ├── owsDomainType.xsd
│   │   │   │           ├── owsExceptionReport.xsd
│   │   │   │           ├── owsGetCapabilities.xsd
│   │   │   │           ├── owsGetResourceByID.xsd
│   │   │   │           ├── owsInputOutputData.xsd
│   │   │   │           ├── owsManifest.xsd
│   │   │   │           ├── owsOperationsMetadata.xsd
│   │   │   │           ├── owsServiceIdentification.xsd
│   │   │   │           └── owsServiceProvider.xsd
│   │   │   └── w3c/
│   │   │       ├── 1999/
│   │   │       │   └── xlink.xsd
│   │   │       └── 2001/
│   │   │           └── xml.xsd
│   │   └── util.py
│   ├── oaipmh.py
│   ├── ogc/
│   │   ├── __init__.py
│   │   ├── api/
│   │   │   ├── __init__.py
│   │   │   ├── oapi.py
│   │   │   ├── records.py
│   │   │   └── util.py
│   │   ├── csw/
│   │   │   ├── __init__.py
│   │   │   ├── cql.py
│   │   │   ├── csw2.py
│   │   │   └── csw3.py
│   │   ├── fes/
│   │   │   ├── __init__.py
│   │   │   ├── fes1.py
│   │   │   └── fes2.py
│   │   ├── gml/
│   │   │   ├── __init__.py
│   │   │   ├── gml3.py
│   │   │   └── gml32.py
│   │   └── pubsub/
│   │       └── __init__.py
│   ├── opensearch.py
│   ├── plugins/
│   │   ├── __init__.py
│   │   ├── outputschemas/
│   │   │   ├── __init__.py
│   │   │   ├── atom.py
│   │   │   ├── datacite.py
│   │   │   ├── dif.py
│   │   │   ├── fgdc.py
│   │   │   └── gm03.py
│   │   ├── profiles/
│   │   │   ├── __init__.py
│   │   │   ├── apiso/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── apiso.py
│   │   │   │   ├── docs/
│   │   │   │   │   └── apiso.rst
│   │   │   │   └── schemas/
│   │   │   │       └── ogc/
│   │   │   │           ├── csw/
│   │   │   │           │   └── 2.0.2/
│   │   │   │           │       └── profiles/
│   │   │   │           │           └── apiso/
│   │   │   │           │               └── 1.0.0/
│   │   │   │           │                   ├── ReadMe.txt
│   │   │   │           │                   └── apiso.xsd
│   │   │   │           └── iso/
│   │   │   │               └── 19139/
│   │   │   │                   ├── 20060504/
│   │   │   │                   │   ├── ReadMe.txt
│   │   │   │                   │   ├── Version.txt
│   │   │   │                   │   ├── gco/
│   │   │   │                   │   │   ├── basicTypes.xsd
│   │   │   │                   │   │   ├── gco.xsd
│   │   │   │                   │   │   └── gcoBase.xsd
│   │   │   │                   │   ├── gmd/
│   │   │   │                   │   │   ├── applicationSchema.xsd
│   │   │   │                   │   │   ├── citation.xsd
│   │   │   │                   │   │   ├── constraints.xsd
│   │   │   │                   │   │   ├── content.xsd
│   │   │   │                   │   │   ├── dataQuality.xsd
│   │   │   │                   │   │   ├── distribution.xsd
│   │   │   │                   │   │   ├── extent.xsd
│   │   │   │                   │   │   ├── freeText.xsd
│   │   │   │                   │   │   ├── gmd.xsd
│   │   │   │                   │   │   ├── identification.xsd
│   │   │   │                   │   │   ├── maintenance.xsd
│   │   │   │                   │   │   ├── metadataApplication.xsd
│   │   │   │                   │   │   ├── metadataEntity.xsd
│   │   │   │                   │   │   ├── metadataExtension.xsd
│   │   │   │                   │   │   ├── portrayalCatalogue.xsd
│   │   │   │                   │   │   ├── referenceSystem.xsd
│   │   │   │                   │   │   └── spatialRepresentation.xsd
│   │   │   │                   │   ├── gml/
│   │   │   │                   │   │   ├── ReadMe.txt
│   │   │   │                   │   │   ├── basicTypes.xsd
│   │   │   │                   │   │   ├── coordinateOperations.xsd
│   │   │   │                   │   │   ├── coordinateReferenceSystems.xsd
│   │   │   │                   │   │   ├── coordinateSystems.xsd
│   │   │   │                   │   │   ├── coverage.xsd
│   │   │   │                   │   │   ├── datums.xsd
│   │   │   │                   │   │   ├── dictionary.xsd
│   │   │   │                   │   │   ├── direction.xsd
│   │   │   │                   │   │   ├── dynamicFeature.xsd
│   │   │   │                   │   │   ├── feature.xsd
│   │   │   │                   │   │   ├── geometryAggregates.xsd
│   │   │   │                   │   │   ├── geometryBasic0d1d.xsd
│   │   │   │                   │   │   ├── geometryBasic2d.xsd
│   │   │   │                   │   │   ├── geometryComplexes.xsd
│   │   │   │                   │   │   ├── geometryPrimitives.xsd
│   │   │   │                   │   │   ├── gml.xsd
│   │   │   │                   │   │   ├── gmlBase.xsd
│   │   │   │                   │   │   ├── grids.xsd
│   │   │   │                   │   │   ├── measures.xsd
│   │   │   │                   │   │   ├── observation.xsd
│   │   │   │                   │   │   ├── referenceSystems.xsd
│   │   │   │                   │   │   ├── temporal.xsd
│   │   │   │                   │   │   ├── temporalReferenceSystems.xsd
│   │   │   │                   │   │   ├── temporalTopology.xsd
│   │   │   │                   │   │   ├── topology.xsd
│   │   │   │                   │   │   ├── units.xsd
│   │   │   │                   │   │   └── valueObjects.xsd
│   │   │   │                   │   ├── gmx/
│   │   │   │                   │   │   ├── catalogues.xsd
│   │   │   │                   │   │   ├── codelistItem.xsd
│   │   │   │                   │   │   ├── crsItem.xsd
│   │   │   │                   │   │   ├── extendedTypes.xsd
│   │   │   │                   │   │   ├── gmx.xsd
│   │   │   │                   │   │   ├── gmxUsage.xsd
│   │   │   │                   │   │   └── uomItem.xsd
│   │   │   │                   │   ├── gsr/
│   │   │   │                   │   │   ├── gsr.xsd
│   │   │   │                   │   │   └── spatialReferencing.xsd
│   │   │   │                   │   ├── gss/
│   │   │   │                   │   │   ├── geometry.xsd
│   │   │   │                   │   │   └── gss.xsd
│   │   │   │                   │   ├── gts/
│   │   │   │                   │   │   ├── gts.xsd
│   │   │   │                   │   │   └── temporalObjects.xsd
│   │   │   │                   │   ├── resources/
│   │   │   │                   │   │   ├── Codelist/
│   │   │   │                   │   │   │   ├── ML_gmxCodelists.xml
│   │   │   │                   │   │   │   └── gmxCodelists.xml
│   │   │   │                   │   │   ├── crs/
│   │   │   │                   │   │   │   ├── ML_gmxCrs.xml
│   │   │   │                   │   │   │   └── gmxCrs.xml
│   │   │   │                   │   │   ├── example/
│   │   │   │                   │   │   │   └── fr-fr.xml
│   │   │   │                   │   │   └── uom/
│   │   │   │                   │   │       ├── ML_gmxUom.xml
│   │   │   │                   │   │       └── gmxUom.xml
│   │   │   │                   │   └── srv/
│   │   │   │                   │       ├── serviceMetadata.xsd
│   │   │   │                   │       ├── serviceModel.xsd
│   │   │   │                   │       └── srv.xsd
│   │   │   │                   └── 20070417/
│   │   │   │                       ├── ReadMe.txt
│   │   │   │                       ├── gco/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── basicTypes.xsd
│   │   │   │                       │   ├── gco.xsd
│   │   │   │                       │   └── gcoBase.xsd
│   │   │   │                       ├── gmd/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── applicationSchema.xsd
│   │   │   │                       │   ├── citation.xsd
│   │   │   │                       │   ├── constraints.xsd
│   │   │   │                       │   ├── content.xsd
│   │   │   │                       │   ├── dataQuality.xsd
│   │   │   │                       │   ├── distribution.xsd
│   │   │   │                       │   ├── extent.xsd
│   │   │   │                       │   ├── freeText.xsd
│   │   │   │                       │   ├── gmd.xsd
│   │   │   │                       │   ├── identification.xsd
│   │   │   │                       │   ├── maintenance.xsd
│   │   │   │                       │   ├── metadataApplication.xsd
│   │   │   │                       │   ├── metadataEntity.xsd
│   │   │   │                       │   ├── metadataExtension.xsd
│   │   │   │                       │   ├── portrayalCatalogue.xsd
│   │   │   │                       │   ├── referenceSystem.xsd
│   │   │   │                       │   └── spatialRepresentation.xsd
│   │   │   │                       ├── gmx/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── catalogues.xsd
│   │   │   │                       │   ├── codelistItem.xsd
│   │   │   │                       │   ├── crsItem.xsd
│   │   │   │                       │   ├── extendedTypes.xsd
│   │   │   │                       │   ├── gmx.xsd
│   │   │   │                       │   ├── gmxUsage.xsd
│   │   │   │                       │   └── uomItem.xsd
│   │   │   │                       ├── gsr/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── gsr.xsd
│   │   │   │                       │   └── spatialReferencing.xsd
│   │   │   │                       ├── gss/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── geometry.xsd
│   │   │   │                       │   └── gss.xsd
│   │   │   │                       ├── gts/
│   │   │   │                       │   ├── ReadMe.txt
│   │   │   │                       │   ├── gts.xsd
│   │   │   │                       │   └── temporalObjects.xsd
│   │   │   │                       └── resources/
│   │   │   │                           ├── ReadMe.txt
│   │   │   │                           ├── codelist/
│   │   │   │                           │   ├── ML_gmxCodelists.xml
│   │   │   │                           │   ├── gmxCodelists.xml
│   │   │   │                           │   └── tcCodelists.xml
│   │   │   │                           ├── crs/
│   │   │   │                           │   ├── ML_gmxCrs.xml
│   │   │   │                           │   └── gmxCrs.xml
│   │   │   │                           ├── example/
│   │   │   │                           │   └── fr-fr.xml
│   │   │   │                           └── uom/
│   │   │   │                               ├── ML_gmxUom.xml
│   │   │   │                               └── gmxUom.xml
│   │   │   ├── ebrim/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── docs/
│   │   │   │   │   └── ebrim.rst
│   │   │   │   ├── ebrim.py
│   │   │   │   └── schemas/
│   │   │   │       └── ogc/
│   │   │   │           └── csw/
│   │   │   │               └── 2.0.2/
│   │   │   │                   └── profiles/
│   │   │   │                       └── ebrim/
│   │   │   │                           └── 1.0/
│   │   │   │                               ├── csw-ebrim-iri.xsd
│   │   │   │                               ├── csw-ebrim.xsd
│   │   │   │                               └── wsdl/
│   │   │   │                                   ├── 1.1/
│   │   │   │                                   │   ├── csw-ebrim-binding.wsdl
│   │   │   │                                   │   ├── csw-ebrim-interface.wsdl
│   │   │   │                                   │   └── csw-ebrim-service.wsdl
│   │   │   │                                   └── 2.0/
│   │   │   │                                       └── csw-ebrim-interface.wsdl
│   │   │   ├── iso19115p3/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── iso19115p3.py
│   │   │   │   └── schemas/
│   │   │   │       └── ogc/
│   │   │   │           └── iso/
│   │   │   │               └── iso19115-3/
│   │   │   │                   ├── cat/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── cat.xsd
│   │   │   │                   │       ├── catalogues.xsd
│   │   │   │                   │       ├── codelistItem.xsd
│   │   │   │                   │       ├── crsItem.xsd
│   │   │   │                   │       └── uomItem.xsd
│   │   │   │                   ├── cit/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── cit.sch
│   │   │   │                   │   │   ├── cit.xsd
│   │   │   │                   │   │   └── citation.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── cit.xsd
│   │   │   │                   │       └── citation.xsd
│   │   │   │                   ├── gco/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── baseTypes2014.xsd
│   │   │   │                   │       └── gco.xsd
│   │   │   │                   ├── gcx/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── extendedTypes.xsd
│   │   │   │                   │       ├── extendedTypes_autoFromShapeChange.xsd
│   │   │   │                   │       └── gcx.xsd
│   │   │   │                   ├── gex/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── extent.xsd
│   │   │   │                   │       ├── gex.sch
│   │   │   │                   │       └── gex.xsd
│   │   │   │                   ├── gmw/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── gmlWrapperTypes2014.xsd
│   │   │   │                   │       └── gmw.xsd
│   │   │   │                   ├── lan/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── lan.xsd
│   │   │   │                   │       └── language.xsd
│   │   │   │                   ├── mac/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── acquisitionInformationImagery.xsd
│   │   │   │                   │   │   └── mac.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── acquisitionInformationImagery.xsd
│   │   │   │                   │       ├── event.xsd
│   │   │   │                   │       └── mac.xsd
│   │   │   │                   ├── mas/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── applicationSchema.xsd
│   │   │   │                   │       └── mas.xsd
│   │   │   │                   ├── mcc/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── AbstractCommonClasses.xsd
│   │   │   │                   │       ├── commonClasses.xsd
│   │   │   │                   │       └── mcc.xsd
│   │   │   │                   ├── mco/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── constraints.xsd
│   │   │   │                   │       ├── mco.sch
│   │   │   │                   │       └── mco.xsd
│   │   │   │                   ├── md1/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── md1.xsd
│   │   │   │                   │       └── metadataWExtendedType.xsd
│   │   │   │                   ├── md2/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── md2.xsd
│   │   │   │                   │       └── metadataWithExtensions.xsd
│   │   │   │                   ├── mda/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mda.xsd
│   │   │   │                   │       └── metadataApplication.xsd
│   │   │   │                   ├── mdb/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── mdb.sch
│   │   │   │                   │   │   ├── mdb.xsd
│   │   │   │                   │   │   └── metadataBase.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── mdb.sch
│   │   │   │                   │       ├── mdb.xsd
│   │   │   │                   │       └── metadataBase.xsd
│   │   │   │                   ├── mds/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mds.xsd
│   │   │   │                   │       └── metadataDataServices.xsd
│   │   │   │                   ├── mdt/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mdt.xsd
│   │   │   │                   │       └── metadataTransfer.xsd
│   │   │   │                   ├── mex/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── metadataExtension.xsd
│   │   │   │                   │       ├── mex.sch
│   │   │   │                   │       └── mex.xsd
│   │   │   │                   ├── mmi/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── maintenance.xsd
│   │   │   │                   │       ├── mmi.sch
│   │   │   │                   │       └── mmi.xsd
│   │   │   │                   ├── mpc/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mpc.xsd
│   │   │   │                   │       └── portrayalCatalogue.xsd
│   │   │   │                   ├── mrc/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── content.xsd
│   │   │   │                   │   │   ├── contentInformationImagery.xsd
│   │   │   │                   │   │   ├── mrc.sch
│   │   │   │                   │   │   └── mrc.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── content.xsd
│   │   │   │                   │       ├── contentInformationImagery.xsd
│   │   │   │                   │       └── mrc.xsd
│   │   │   │                   ├── mrd/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── distribution.xsd
│   │   │   │                   │       ├── mrd.sch
│   │   │   │                   │       └── mrd.xsd
│   │   │   │                   ├── mri/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── identification.xsd
│   │   │   │                   │       ├── mri.sch
│   │   │   │                   │       └── mri.xsd
│   │   │   │                   ├── mrl/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── lineage.xsd
│   │   │   │                   │   │   ├── lineageImagery.xsd
│   │   │   │                   │   │   └── mrl.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── lineage.xsd
│   │   │   │                   │       ├── lineageImagery.xsd
│   │   │   │                   │       └── mrl.xsd
│   │   │   │                   ├── mrs/
│   │   │   │                   │   └── 1.0/
│   │   │   │                   │       ├── mrs.sch
│   │   │   │                   │       ├── mrs.xsd
│   │   │   │                   │       └── referenceSystem.xsd
│   │   │   │                   ├── msr/
│   │   │   │                   │   ├── 1.0/
│   │   │   │                   │   │   ├── msr.xsd
│   │   │   │                   │   │   ├── spatialRepresentation.xsd
│   │   │   │                   │   │   └── spatialRepresentationImagery.xsd
│   │   │   │                   │   └── 2.0/
│   │   │   │                   │       ├── msr.xsd
│   │   │   │                   │       ├── spatialRepresentation.xsd
│   │   │   │                   │       └── spatialRepresentationImagery.xsd
│   │   │   │                   └── srv/
│   │   │   │                       ├── 2.0/
│   │   │   │                       │   ├── serviceInformation.xsd
│   │   │   │                       │   ├── srv.sch
│   │   │   │                       │   └── srv.xsd
│   │   │   │                       └── 2.1/
│   │   │   │                           ├── serviceInformation.xsd
│   │   │   │                           └── srv.xsd
│   │   │   └── profile.py
│   │   └── repository/
│   │       ├── __init__.py
│   │       └── odc/
│   │           ├── __init__.py
│   │           └── odc.py
│   ├── server.py
│   ├── sru.py
│   ├── stac/
│   │   ├── __init__.py
│   │   └── api.py
│   ├── templates/
│   │   ├── _base.html
│   │   ├── collection.html
│   │   ├── collections.html
│   │   ├── conformance.html
│   │   ├── exception.html
│   │   ├── federatedcatalog.html
│   │   ├── federatedcatalogs.html
│   │   ├── item.html
│   │   ├── items.html
│   │   ├── landing_page.html
│   │   ├── openapi.html
│   │   ├── queryables.html
│   │   └── stac_items.html
│   ├── wsgi.py
│   └── wsgi_flask.py
├── pyproject.toml
├── requirements-dev.txt
├── requirements-pg.txt
├── requirements-pubsub.txt
├── requirements-standalone.txt
├── requirements.txt
├── setup.py
├── tests/
│   ├── README.txt
│   ├── conftest.py
│   ├── functionaltests/
│   │   ├── conftest.py
│   │   ├── suites/
│   │   │   ├── apiso/
│   │   │   │   ├── data/
│   │   │   │   │   ├── 3e9a8c05.xml
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000012.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000013.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000014.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000015.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_284404.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288395.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288398.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288401.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276395.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276398.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276401.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_280395.xml
│   │   │   │   │   ├── iso_19115-2_Sentinel-2-scene.xml
│   │   │   │   │   ├── pacioos-NS06agg.xml
│   │   │   │   │   └── test.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-property.xml
│   │   │   │   │   ├── post_GetRecordById-brief.xml
│   │   │   │   │   ├── post_GetRecordById-full-dc.xml
│   │   │   │   │   ├── post_GetRecordById-full.xml
│   │   │   │   │   ├── post_GetRecordById-srv-brief.xml
│   │   │   │   │   ├── post_GetRecords-all-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-all.xml
│   │   │   │   │   ├── post_GetRecords-cql-title.xml
│   │   │   │   │   ├── post_GetRecords-elementname.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox.xml
│   │   │   │   │   └── post_GetRecords-filter-servicetype.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-property.xml
│   │   │   │       ├── GetRecordById-brief.xml
│   │   │   │       ├── GetRecordById-full-dc.xml
│   │   │   │       ├── GetRecordById-full.xml
│   │   │   │       ├── GetRecordById-srv-brief.xml
│   │   │   │       ├── GetRecords-all-csw-output.xml
│   │   │   │       ├── GetRecords-all.xml
│   │   │   │       ├── GetRecords-cql-title.xml
│   │   │   │       ├── GetRecords-elementname.xml
│   │   │   │       ├── GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │       ├── GetRecords-filter-anytext.xml
│   │   │   │       ├── GetRecords-filter-bbox-csw-output.xml
│   │   │   │       ├── GetRecords-filter-bbox.xml
│   │   │   │       └── GetRecords-filter-servicetype.xml
│   │   │   ├── apiso-inspire/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetCapabilities-lang.xml
│   │   │   │   │   └── get_GetCapabilities.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── atom/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_opensearch-description.xml
│   │   │   │   │   ├── get_opensearch-ogc-bbox-and-time.xml
│   │   │   │   │   ├── get_opensearch-ogc-bbox.xml
│   │   │   │   │   ├── get_opensearch-ogc-count-and-page1.xml
│   │   │   │   │   ├── get_opensearch-ogc-count-and-page2.xml
│   │   │   │   │   ├── get_opensearch-ogc-q-and-bbox.xml
│   │   │   │   │   ├── get_opensearch-ogc-q-and-time.xml
│   │   │   │   │   ├── get_opensearch-ogc-q.xml
│   │   │   │   │   ├── get_opensearch-ogc-time.xml
│   │   │   │   │   ├── get_opensearch-ogc-timeend.xml
│   │   │   │   │   ├── get_opensearch-ogc-timestart.xml
│   │   │   │   │   ├── get_opensearch.xml
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── cite/
│   │   │   │   ├── data/
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── Record_19887a8a-f6b0-4a63-ae56-7fba0e17801f.xml
│   │   │   │   │   ├── Record_1ef30a8b-876d-4828-9246-c37ab4510bbd.xml
│   │   │   │   │   ├── Record_66ae76b7-54ba-489b-a582-0f0633d96493.xml
│   │   │   │   │   ├── Record_6a3de50b-fa66-4b58-a0e6-ca146fdd18d4.xml
│   │   │   │   │   ├── Record_784e2afd-a9fd-44a6-9a92-a3848371c8ec.xml
│   │   │   │   │   ├── Record_829babb0-b2f1-49e1-8cd5-7b489fe71a1e.xml
│   │   │   │   │   ├── Record_88247b56-4cbc-4df9-9860-db3f8042e357.xml
│   │   │   │   │   ├── Record_94bc9c83-97f6-4b40-9eb8-a8e8787a5c63.xml
│   │   │   │   │   ├── Record_9a669547-b69b-469f-a11f-2d875366bbdc.xml
│   │   │   │   │   ├── Record_a06af396-3105-442d-8b40-22b57a90d2f2.xml
│   │   │   │   │   ├── Record_ab42a8c4-95e8-4630-bf79-33e59241605a.xml
│   │   │   │   │   └── Record_e9330592-0932-474b-be34-c3a3bb67c7db.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_27e17158-c57a-4493-92ac-dba8934cf462.xml
│   │   │   │   │   ├── get_27f69b66-5f05-4311-a89c-73ca55c2686b.xml
│   │   │   │   │   ├── get_2ab7d1fa-885b-459f-80e4-b6282eab4f8c.xml
│   │   │   │   │   ├── get_37aa90e2-6ff0-420c-af15-8b9463099a73.xml
│   │   │   │   │   ├── get_3a8a3c47-455f-4f49-9078-03119f3e70b3.xml
│   │   │   │   │   ├── get_4515831f-834a-4699-95f6-ab0c2cbfcfd0.xml
│   │   │   │   │   ├── get_477b23a3-baa9-47c8-9541-5fe27735ed49.xml
│   │   │   │   │   ├── get_48f26761-3a9d-48db-bee1-da089f5fb857.xml
│   │   │   │   │   ├── get_4e38092f-1586-44b8-988e-0acfa5855916.xml
│   │   │   │   │   ├── get_55c38f00-2553-42c1-99ab-33edbb561ad7.xml
│   │   │   │   │   ├── get_5ab5db18-c87a-4fbf-a8d8-b7289b09ac81.xml
│   │   │   │   │   ├── get_6a4f57ca-a1bd-4802-89c2-44860dbdb0f0.xml
│   │   │   │   │   ├── get_6c375703-9c00-4aef-bec7-d2e964f849eb.xml
│   │   │   │   │   ├── get_80f31def-4185-48b9-983a-960566918eae.xml
│   │   │   │   │   ├── get_8e2232ed-05d9-44ae-8b04-0911cbe6a507.xml
│   │   │   │   │   ├── get_9697f0aa-3b6a-4125-83a5-61e8826127c4.xml
│   │   │   │   │   ├── get_9bfd17fa-15dc-4a10-8fa7-b3cff7013dd7.xml
│   │   │   │   │   ├── get_b81c3595-06d6-4693-82ea-1ff8650755ac.xml
│   │   │   │   │   ├── get_ba5fc729-3b71-47a0-b7d0-42ec565cd185.xml
│   │   │   │   │   ├── get_c4ea754f-c158-4d8d-8253-dc8f86021b52.xml
│   │   │   │   │   ├── get_f4692ec5-9547-4a05-88ab-e6154af2640a.xml
│   │   │   │   │   ├── get_f997f25e-c865-4d53-a362-0ed1846337f2.xml
│   │   │   │   │   ├── post_0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
│   │   │   │   │   ├── post_19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
│   │   │   │   │   ├── post_1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
│   │   │   │   │   ├── post_1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
│   │   │   │   │   ├── post_1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
│   │   │   │   │   ├── post_2102a460-5d62-465f-9668-d70b3faafbfa.xml
│   │   │   │   │   ├── post_225f455a-0035-486b-a94e-fee7ae881b2b.xml
│   │   │   │   │   ├── post_2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
│   │   │   │   │   ├── post_34a019a9-1581-42cb-9827-fbfdda2773b7.xml
│   │   │   │   │   ├── post_3e76fd38-e035-41c9-83dc-61356f680c97.xml
│   │   │   │   │   ├── post_418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
│   │   │   │   │   ├── post_420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
│   │   │   │   │   ├── post_4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
│   │   │   │   │   ├── post_5c5861bc-f742-40a5-9998-5342615d674b.xml
│   │   │   │   │   ├── post_6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
│   │   │   │   │   ├── post_73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
│   │   │   │   │   ├── post_78297c88-4850-4927-adc6-511cd9a3d539.xml
│   │   │   │   │   ├── post_7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
│   │   │   │   │   ├── post_7e2cd105-daec-4d25-bc8e-d49d21364912.xml
│   │   │   │   │   ├── post_87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
│   │   │   │   │   ├── post_88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
│   │   │   │   │   ├── post_898cd63b-2585-4ec0-8720-d554bd324174.xml
│   │   │   │   │   ├── post_8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
│   │   │   │   │   ├── post_928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
│   │   │   │   │   ├── post_93bdbb9d-2734-4f01-92fb-48634cca41de.xml
│   │   │   │   │   ├── post_948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
│   │   │   │   │   ├── post_9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
│   │   │   │   │   ├── post_a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
│   │   │   │   │   ├── post_ad61686c-d304-42d1-b845-8c1f3070c83e.xml
│   │   │   │   │   ├── post_af39c020-7b1d-429c-b474-f45c3164cb79.xml
│   │   │   │   │   ├── post_b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
│   │   │   │   │   ├── post_ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
│   │   │   │   │   ├── post_bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
│   │   │   │   │   ├── post_c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
│   │   │   │   │   ├── post_c311a342-72e3-4983-be39-868e6ed9740f.xml
│   │   │   │   │   ├── post_c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
│   │   │   │   │   ├── post_c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
│   │   │   │   │   ├── post_da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
│   │   │   │   │   ├── post_dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
│   │   │   │   │   ├── post_dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
│   │   │   │   │   ├── post_e308f030-c097-4036-a838-44bad74c9ef7.xml
│   │   │   │   │   ├── post_e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
│   │   │   │   │   ├── post_f7976c55-a156-4421-8199-bc0487da4b0f.xml
│   │   │   │   │   ├── post_f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
│   │   │   │   │   ├── post_fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
│   │   │   │   │   └── post_fe20960f-a26c-4f13-852d-470a0d3233f9.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── 0c976d98-c896-4b10-b1fe-a22ef50434e7.xml
│   │   │   │       ├── 19d2a6ed-be28-4866-ae15-e3bb634486cb.xml
│   │   │   │       ├── 1ab55aa3-6685-4595-8ecd-45987a7b8b59.xml
│   │   │   │       ├── 1c958b7a-ca09-4c38-98bd-ef1d1d28cc14.xml
│   │   │   │       ├── 1c97fc1a-61cd-4c1d-8054-933e17a6c5ee.xml
│   │   │   │       ├── 2102a460-5d62-465f-9668-d70b3faafbfa.xml
│   │   │   │       ├── 225f455a-0035-486b-a94e-fee7ae881b2b.xml
│   │   │   │       ├── 2d53ffea-60e4-4652-abf5-36eb23042fd5.xml
│   │   │   │       ├── 34a019a9-1581-42cb-9827-fbfdda2773b7.xml
│   │   │   │       ├── 3e76fd38-e035-41c9-83dc-61356f680c97.xml
│   │   │   │       ├── 418a6fb0-a89c-4a94-afc9-3f8168eb2980.xml
│   │   │   │       ├── 420b745e-0c4b-404e-9f2d-61fa580ff05a.xml
│   │   │   │       ├── 4735d649-a2b1-42fd-a101-14e1d7e4607f.xml
│   │   │   │       ├── 5c5861bc-f742-40a5-9998-5342615d674b.xml
│   │   │   │       ├── 6e736fd0-c266-4852-9eb3-0656f5d0f5c4.xml
│   │   │   │       ├── 73f1551c-e269-4ef9-9dae-e535b5eebfc7.xml
│   │   │   │       ├── 78297c88-4850-4927-adc6-511cd9a3d539.xml
│   │   │   │       ├── 7c89cdf5-0def-4cfb-8c55-2b8ffea5d92f.xml
│   │   │   │       ├── 7e2cd105-daec-4d25-bc8e-d49d21364912.xml
│   │   │   │       ├── 87f2f670-9cd6-4907-b82c-1b46a7dd2a78.xml
│   │   │   │       ├── 88b4e1ba-3bd4-4cbe-81e5-e004056d6ca3.xml
│   │   │   │       ├── 898cd63b-2585-4ec0-8720-d554bd324174.xml
│   │   │   │       ├── 8fb13dc3-5818-45e2-9e29-46abc16e7d38.xml
│   │   │   │       ├── 928c1896-52d4-4ac7-9832-f98e3eb65f02.xml
│   │   │   │       ├── 93bdbb9d-2734-4f01-92fb-48634cca41de.xml
│   │   │   │       ├── 948b39d5-bb4f-45b8-a8f2-4ff9501aaedd.xml
│   │   │   │       ├── 9fd64fcc-f69c-4626-b72e-5c7776a29aa9.xml
│   │   │   │       ├── a06d04ab-e0d0-4a86-bfe8-71460f41fe37.xml
│   │   │   │       ├── ad61686c-d304-42d1-b845-8c1f3070c83e.xml
│   │   │   │       ├── af39c020-7b1d-429c-b474-f45c3164cb79.xml
│   │   │   │       ├── b90e2de6-3d25-4298-a13e-dc9492a8fc73.xml
│   │   │   │       ├── ba9b0107-dcee-46ef-823a-a2e25a911a96.xml
│   │   │   │       ├── bb66ebc5-7121-48b5-9f53-b56537d9561b.xml
│   │   │   │       ├── c02d1c85-df9f-45ee-bea7-345c35e02a98.xml
│   │   │   │       ├── c311a342-72e3-4983-be39-868e6ed9740f.xml
│   │   │   │       ├── c38916c2-4bc6-446d-b7aa-ab006d6ba31c.xml
│   │   │   │       ├── c8588f47-8e65-45f5-ad34-ff4524cad84d.xml
│   │   │   │       ├── da228d4c-e1be-43d7-9ccb-c3f27ee32541.xml
│   │   │   │       ├── dc92c2c4-87d8-4a13-964e-ff9b0e0c27b3.xml
│   │   │   │       ├── dcb13791-379e-4739-bcd4-dbaa69f0efdb.xml
│   │   │   │       ├── e308f030-c097-4036-a838-44bad74c9ef7.xml
│   │   │   │       ├── e6e9efb2-e2b7-4b0a-a3a2-7deea3f9b8e2.xml
│   │   │   │       ├── f7976c55-a156-4421-8199-bc0487da4b0f.xml
│   │   │   │       ├── f7d79701-f10b-4087-a33c-f62df0a04fd1.xml
│   │   │   │       ├── fc1bc094-88f1-4851-bc2b-dfc56be9f3c7.xml
│   │   │   │       └── fe20960f-a26c-4f13-852d-470a0d3233f9.xml
│   │   │   ├── csw30/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_002258f0-627f-457f-b2ad-025777c77ac8.xml
│   │   │   │   │   ├── get_045c600d-973d-41eb-9f60-eba1b717b720.xml
│   │   │   │   │   ├── get_0bbcf862-5211-4351-9988-63f8bec49c98.xml
│   │   │   │   │   ├── get_0bdf8457-971e-4ed1-be4a-5feca4dcd8fa.xml
│   │   │   │   │   ├── get_0d8bbdec-0846-42ca-8dc8-b7f4cba41d67.xml
│   │   │   │   │   ├── get_0e1dca37-477a-4060-99fe-7799b52d656c.xml
│   │   │   │   │   ├── get_13c87956-51a4-4780-a8e9-6e0b5c0bb473.xml
│   │   │   │   │   ├── get_151d982f-ebd3-4cb2-b507-a667713a1e92.xml
│   │   │   │   │   ├── get_1869e495-1a61-4713-8285-76d1336ee1a6.xml
│   │   │   │   │   ├── get_1bcb42a9-538c-4f0a-9d4c-d6f10b720aa6.xml
│   │   │   │   │   ├── get_22f44168-2ccf-4801-ad96-204212566d56.xml
│   │   │   │   │   ├── get_2499a9c9-8d33-449c-bc92-d494adfcc84d.xml
│   │   │   │   │   ├── get_27f4f39c-d92a-4e3c-b961-c6aa8c24e513.xml
│   │   │   │   │   ├── get_28e569df-8596-4128-8d9a-29ad03138915.xml
│   │   │   │   │   ├── get_2b06a5c8-0df2-4af1-8d2e-a425de11c845.xml
│   │   │   │   │   ├── get_2ba1418a-444d-4cce-9cfe-4c94efcf8b55.xml
│   │   │   │   │   ├── get_397fe17a-d5b4-4f96-8cc4-4ce467ed4d0a.xml
│   │   │   │   │   ├── get_3dcd1b15-73d2-4b7d-a3e3-ff15bf14aae4.xml
│   │   │   │   │   ├── get_405e1ff1-5c75-4846-a28b-cfaff2a6921a.xml
│   │   │   │   │   ├── get_43cd6471-6ac7-45bd-8ff9-148cb2de9a52.xml
│   │   │   │   │   ├── get_4566d2ec-1283-4a02-baed-a74fc5b47e37.xml
│   │   │   │   │   ├── get_461bd4c5-6623-490d-9036-d91a2201e87b.xml
│   │   │   │   │   ├── get_5496894a-3877-4f62-a20b-5d7126f94925.xml
│   │   │   │   │   ├── get_5a015f6a-bf14-4977-b1e3-6577eb0223c8.xml
│   │   │   │   │   ├── get_5c3a2390-1fb9-43f0-b96c-f48c7a69c990.xml
│   │   │   │   │   ├── get_5e9e67dc-18d6-4645-8111-c6263c88a61f.xml
│   │   │   │   │   ├── get_604d9379-741c-42e5-b4cf-92e56c87fa64.xml
│   │   │   │   │   ├── get_60e6af95-d5fc-465a-82e2-fd2e6d85e4af.xml
│   │   │   │   │   ├── get_62ad94c2-b558-4265-a427-23d6677975d6.xml
│   │   │   │   │   ├── get_6a5e247b-0961-4b8a-a0d6-35a491d9cfe7.xml
│   │   │   │   │   ├── get_6a9d0558-9d87-495b-b999-b49a3ef1cf99.xml
│   │   │   │   │   ├── get_6bd790c9-6019-4652-9c91-330a894d6700.xml
│   │   │   │   │   ├── get_6e9cba43-5e27-415d-adbd-a92851c2c173.xml
│   │   │   │   │   ├── get_7630d230-e142-4a09-accf-f091000b90cd.xml
│   │   │   │   │   ├── get_7e82446a-b5dc-43fe-9a73-4cc1f2f2f0bf.xml
│   │   │   │   │   ├── get_8025978e-1a35-4d70-80c2-e8329e0c7864.xml
│   │   │   │   │   ├── get_8184ae4f-536d-4978-8b28-ad703be96967.xml
│   │   │   │   │   ├── get_88f63a89-664f-4315-b4f8-04a0b33803a7.xml
│   │   │   │   │   ├── get_8987f8f0-4d93-4481-968c-a2ccbd6b8be2.xml
│   │   │   │   │   ├── get_8e5fa0f6-3f29-4d1f-abe2-d9866f3def98.xml
│   │   │   │   │   ├── get_9000ec29-5649-474e-b2d6-55c00f8a52c0.xml
│   │   │   │   │   ├── get_91914d35-7bbf-45e6-9b37-5ef484869a4e.xml
│   │   │   │   │   ├── get_92d4844d-57d5-4cf3-8f47-ba50e369dc04.xml
│   │   │   │   │   ├── get_9c0e2a4b-b4e6-41c0-b630-c8c99fc89ff3.xml
│   │   │   │   │   ├── get_9d7ffac8-9798-428d-8e27-3cd12497ee6b.xml
│   │   │   │   │   ├── get_Exception-GetDomain-value-reference.xml
│   │   │   │   │   ├── get_Exception-GetDomain.xml
│   │   │   │   │   ├── get_Exception-GetRecordById-404.xml
│   │   │   │   │   ├── get_Exception-GetRecordById-dc.xml.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-notfound.xml
│   │   │   │   │   ├── get_Exception-invalid-request.xml
│   │   │   │   │   ├── get_GetCapabilities-base-url.xml
│   │   │   │   │   ├── get_GetCapabilities-no-version.xml
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   ├── get_GetDomain-parameter.xml
│   │   │   │   │   ├── get_GetDomain-value-reference.xml
│   │   │   │   │   ├── get_GetRepositoryItem.xml
│   │   │   │   │   ├── get_OpenSearch-description.xml
│   │   │   │   │   ├── get_a2f18643-e24e-4fa5-b780-6de4a2dbc814.xml
│   │   │   │   │   ├── get_abc90c8c-5868-4405-a73e-64c849be3b2a.xml
│   │   │   │   │   ├── get_ad0c0571-09ed-436a-9a4f-a5de744c88fe.xml
│   │   │   │   │   ├── get_af502903-f4ee-47ee-b76e-af878d238bcc.xml
│   │   │   │   │   ├── get_b2aafc3f-4f35-47bc-affd-08590972deae.xml
│   │   │   │   │   ├── get_b6069623-f7d8-4021-8582-98f0aea0f763.xml
│   │   │   │   │   ├── get_b9a07a54-75a8-45bd-b341-2823600211e3.xml
│   │   │   │   │   ├── get_baa4a7d0-0c01-42b6-adc3-0d03e9949fa3.xml
│   │   │   │   │   ├── get_bfbe6409-f64a-4c89-acb3-50f260a5c743.xml
│   │   │   │   │   ├── get_bfe20134-d1da-42ef-9c0f-8e1307bbf92b.xml
│   │   │   │   │   ├── get_c03d173a-3f42-4956-89c8-1fe02c3a0873.xml
│   │   │   │   │   ├── get_cb43d8c3-e14c-4a9f-9231-4384b7dd21f3.xml
│   │   │   │   │   ├── get_d03c6fd3-e821-4a26-b62f-d20a474e25af.xml
│   │   │   │   │   ├── get_d4ccbf96-a529-480e-a53d-5b88dc1dea7f.xml
│   │   │   │   │   ├── get_d94c801a-1207-4897-b84a-53f3a192515b.xml
│   │   │   │   │   ├── get_da859e34-91fc-495a-8c09-285a40c0900b.xml
│   │   │   │   │   ├── get_dc246fb8-5af5-4fda-82bb-c18b3ecd439c.xml
│   │   │   │   │   ├── get_de016645-6d5c-4855-943c-2db07ae9f49a.xml
│   │   │   │   │   ├── get_dff3ec6b-bb2d-4887-bd17-8fcf15def042.xml
│   │   │   │   │   ├── get_e38e6bfb-8ac4-4ae4-8b87-0aafbc8d3c6b.xml
│   │   │   │   │   ├── get_e67ca935-d65d-4d8c-8302-1405333dded0.xml
│   │   │   │   │   ├── get_e7704509-3441-458f-8ef0-e333c6b6043f.xml
│   │   │   │   │   ├── get_f1223a49-6d08-44ff-97fe-4c32cbbfad82.xml
│   │   │   │   │   ├── get_f89dd4e1-3a81-4433-afd2-a3fa1bdb1e18.xml
│   │   │   │   │   ├── post_Exception-GetDomain-parametername-bad.xml
│   │   │   │   │   ├── post_Exception-GetDomain-valuereference-bad.xml
│   │   │   │   │   ├── post_Exception-GetRecordById-404.xml
│   │   │   │   │   ├── post_Exception-GetRecordById-bad-esn.xml
│   │   │   │   │   ├── post_Exception-bad-xml.xml
│   │   │   │   │   ├── post_Exception-not-xml.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parametername.xml
│   │   │   │   │   ├── post_GetDomain-valuereference.xml
│   │   │   │   │   ├── post_GetRecordById-dc-full.xml
│   │   │   │   │   ├── post_GetRecordById-dc.xml
│   │   │   │   │   └── post_GetRecords-anytext.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── Exception-GetDomain-parametername-bad.xml
│   │   │   │       ├── Exception-GetDomain-valuereference-bad.xml
│   │   │   │       ├── Exception-GetRecordById-404.xml
│   │   │   │       ├── Exception-GetRecordById-bad-esn.xml
│   │   │   │       ├── Exception-bad-xml.xml
│   │   │   │       ├── Exception-not-xml.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parametername.xml
│   │   │   │       ├── GetDomain-valuereference.xml
│   │   │   │       ├── GetRecordById-dc-full.xml
│   │   │   │       ├── GetRecordById-dc.xml
│   │   │   │       └── GetRecords-anytext.xml
│   │   │   ├── default/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-notfound.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-service-invalid1.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-service-invalid2.xml
│   │   │   │   │   ├── get_Exception-GetRepositoryItem-version-invalid.xml
│   │   │   │   │   ├── get_GetCapabilities-invalid-request.xml
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   ├── get_GetRecords-all.xml
│   │   │   │   │   ├── get_GetRecords-empty-maxrecords.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-or-abstract-with-spaces.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-or-abstract.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-with-spaces-or-abstract-with-spaces.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-with-spaces-or-abstract.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title-with-spaces.xml
│   │   │   │   │   ├── get_GetRecords-filter-cql-title.xml
│   │   │   │   │   ├── get_GetRecords-filter.xml
│   │   │   │   │   ├── get_GetRecords-sortby-asc.xml
│   │   │   │   │   ├── get_GetRecords-sortby-desc.xml
│   │   │   │   │   ├── get_GetRecords-sortby-invalid-order.xml
│   │   │   │   │   ├── get_GetRecords-sortby-invalid-propertyname.xml
│   │   │   │   │   ├── get_GetRepositoryItem.xml
│   │   │   │   │   ├── post_DescribeRecord-json.xml
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_Exception-GetRecords-badsrsname.xml
│   │   │   │   │   ├── post_Exception-GetRecords-elementname.xml
│   │   │   │   │   ├── post_Exception-GetRecords-invalid-xml.xml
│   │   │   │   │   ├── post_GetCapabilities-SOAP.xml
│   │   │   │   │   ├── post_GetCapabilities-sections.xml
│   │   │   │   │   ├── post_GetCapabilities-updatesequence.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parameter.xml
│   │   │   │   │   ├── post_GetDomain-property.xml
│   │   │   │   │   ├── post_GetRecordById-json.xml
│   │   │   │   │   ├── post_GetRecordById.xml
│   │   │   │   │   ├── post_GetRecords-all-json.xml
│   │   │   │   │   ├── post_GetRecords-all-resulttype-hits.xml
│   │   │   │   │   ├── post_GetRecords-all-resulttype-validate.xml
│   │   │   │   │   ├── post_GetRecords-all-sortby-bbox.xml
│   │   │   │   │   ├── post_GetRecords-all.xml
│   │   │   │   │   ├── post_GetRecords-bbox-filter-crs84.xml
│   │   │   │   │   ├── post_GetRecords-cql-title-and-abstract.xml
│   │   │   │   │   ├── post_GetRecords-cql-title.xml
│   │   │   │   │   ├── post_GetRecords-distributedsearch.xml
│   │   │   │   │   ├── post_GetRecords-elementname.xml
│   │   │   │   │   ├── post_GetRecords-end.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-bbox-freetext.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-or-multiple.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-or.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-or2.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext-and-not.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext-equal.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-poslist.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-reproject.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-sortby.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox.xml
│   │   │   │   │   ├── post_GetRecords-filter-between.xml
│   │   │   │   │   ├── post_GetRecords-filter-function-bad.xml
│   │   │   │   │   ├── post_GetRecords-filter-function.xml
│   │   │   │   │   ├── post_GetRecords-filter-invalid-poslist.xml
│   │   │   │   │   ├── post_GetRecords-filter-not-bbox.xml
│   │   │   │   │   ├── post_GetRecords-filter-or-bbox-freetext.xml
│   │   │   │   │   ├── post_GetRecords-filter-or-nested-and.xml
│   │   │   │   │   ├── post_GetRecords-filter-or-title-abstract.xml
│   │   │   │   │   ├── post_GetRecords-maxrecords.xml
│   │   │   │   │   ├── post_GetRecords-requestid.xml
│   │   │   │   │   ├── post_Harvest-default.xml
│   │   │   │   │   ├── post_Harvest-response-handler.xml
│   │   │   │   │   ├── post_Transaction-delete.xml
│   │   │   │   │   ├── post_Transaction-insert.xml
│   │   │   │   │   ├── post_Transaction-update-full.xml
│   │   │   │   │   └── post_Transaction-update-recordproperty.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord-json.xml
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── Exception-GetRecords-badsrsname.xml
│   │   │   │       ├── Exception-GetRecords-elementname.xml
│   │   │   │       ├── Exception-GetRecords-invalid-xml.xml
│   │   │   │       ├── GetCapabilities-SOAP.xml
│   │   │   │       ├── GetCapabilities-sections.xml
│   │   │   │       ├── GetCapabilities-updatesequence.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parameter.xml
│   │   │   │       ├── GetDomain-property.xml
│   │   │   │       ├── GetRecordById-json.xml
│   │   │   │       ├── GetRecordById.xml
│   │   │   │       ├── GetRecords-all-json.xml
│   │   │   │       ├── GetRecords-all-resulttype-hits.xml
│   │   │   │       ├── GetRecords-all-resulttype-validate.xml
│   │   │   │       ├── GetRecords-all-sortby-bbox.xml
│   │   │   │       ├── GetRecords-all.xml
│   │   │   │       ├── GetRecords-bbox-filter-crs84.xml
│   │   │   │       ├── GetRecords-cql-title-and-abstract.xml
│   │   │   │       ├── GetRecords-cql-title.xml
│   │   │   │       ├── GetRecords-distributedsearch.xml
│   │   │   │       ├── GetRecords-elementname.xml
│   │   │   │       ├── GetRecords-end.xml
│   │   │   │       ├── GetRecords-filter-and-bbox-freetext.xml
│   │   │   │       ├── GetRecords-filter-and-nested-or-multiple.xml
│   │   │   │       ├── GetRecords-filter-and-nested-or.xml
│   │   │   │       ├── GetRecords-filter-and-nested-or2.xml
│   │   │   │       ├── GetRecords-filter-anytext-and-not.xml
│   │   │   │       ├── GetRecords-filter-anytext-equal.xml
│   │   │   │       ├── GetRecords-filter-anytext.xml
│   │   │   │       ├── GetRecords-filter-bbox-poslist.xml
│   │   │   │       ├── GetRecords-filter-bbox-reproject.xml
│   │   │   │       ├── GetRecords-filter-bbox-sortby.xml
│   │   │   │       ├── GetRecords-filter-bbox.xml
│   │   │   │       ├── GetRecords-filter-between.xml
│   │   │   │       ├── GetRecords-filter-function-bad.xml
│   │   │   │       ├── GetRecords-filter-function.xml
│   │   │   │       ├── GetRecords-filter-invalid-poslist.xml
│   │   │   │       ├── GetRecords-filter-not-bbox.xml
│   │   │   │       ├── GetRecords-filter-or-bbox-freetext.xml
│   │   │   │       ├── GetRecords-filter-or-nested-and.xml
│   │   │   │       ├── GetRecords-filter-or-title-abstract.xml
│   │   │   │       ├── GetRecords-maxrecords.xml
│   │   │   │       ├── GetRecords-requestid.xml
│   │   │   │       ├── Harvest-default.xml
│   │   │   │       ├── Harvest-response-handler.xml
│   │   │   │       ├── Transaction-delete.xml
│   │   │   │       ├── Transaction-insert.xml
│   │   │   │       ├── Transaction-update-full.xml
│   │   │   │       └── Transaction-update-recordproperty.xml
│   │   │   ├── dif/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── duplicatefileid/
│   │   │   │   ├── data/
│   │   │   │   │   └── isos/
│   │   │   │   │       └── tds.maracoos.org/
│   │   │   │   │           └── iso/
│   │   │   │   │               ├── AVHRR.2011.7Agg.xml
│   │   │   │   │               └── AVHRR.2012.7Agg.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-all.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       └── GetRecords-all.xml
│   │   │   ├── ebrim/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-full.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetRecords-filter-bbox-full.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── fgdc/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── gm03/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   └── post_GetRecords-filter-bbox.xml
│   │   │   │   └── post/
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       └── GetRecords-filter-bbox.xml
│   │   │   ├── harvesting/
│   │   │   │   ├── data/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_Exception-Harvest-invalid-resourcetype.xml
│   │   │   │   │   ├── get_Exception-Harvest-missing-resourcetype.xml
│   │   │   │   │   ├── get_Exception-Harvest-missing-source.xml
│   │   │   │   │   ├── get_Exception-Harvest-waf-bad-value.xml
│   │   │   │   │   ├── get_Exception-Harvest-waf-no-records-found.xml
│   │   │   │   │   ├── post_Clear-000-delete-all.xml
│   │   │   │   │   ├── post_Exception-Havest-csw-404.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parameter.xml
│   │   │   │   │   ├── post_Harvest-csw-iso.xml
│   │   │   │   │   ├── post_Harvest-csw-run1.xml
│   │   │   │   │   ├── post_Harvest-csw-run2.xml
│   │   │   │   │   ├── post_Harvest-dc.xml
│   │   │   │   │   ├── post_Harvest-fgdc.xml
│   │   │   │   │   ├── post_Harvest-iso.xml
│   │   │   │   │   ├── post_Harvest-rdf.xml
│   │   │   │   │   ├── post_Harvest-sos100.xml
│   │   │   │   │   ├── post_Harvest-sos200.xml
│   │   │   │   │   ├── post_Harvest-waf.xml
│   │   │   │   │   ├── post_Harvest-wcs.xml
│   │   │   │   │   ├── post_Harvest-wfs110.xml
│   │   │   │   │   ├── post_Harvest-wfs200.xml
│   │   │   │   │   ├── post_Harvest-wms-run1.xml
│   │   │   │   │   ├── post_Harvest-wms-run2.xml
│   │   │   │   │   ├── post_Harvest-wmts.xml
│   │   │   │   │   ├── post_Harvest-wps.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-ows-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-sos-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-sos-iso.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wms-dc.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wms-iso.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wms-layer.xml
│   │   │   │   │   ├── post_Harvest-zzz-post-GetRecords-filter-wps-process.xml
│   │   │   │   │   └── post_Transaction-000-delete-all.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── Clear-000-delete-all.xml
│   │   │   │       ├── Exception-Havest-csw-404.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parameter.xml
│   │   │   │       ├── Harvest-csw-iso.xml
│   │   │   │       ├── Harvest-csw-run1.xml
│   │   │   │       ├── Harvest-csw-run2.xml
│   │   │   │       ├── Harvest-dc.xml
│   │   │   │       ├── Harvest-fgdc.xml
│   │   │   │       ├── Harvest-iso.xml
│   │   │   │       ├── Harvest-rdf.xml
│   │   │   │       ├── Harvest-sos100.xml
│   │   │   │       ├── Harvest-sos200.xml
│   │   │   │       ├── Harvest-waf.xml
│   │   │   │       ├── Harvest-wcs.xml
│   │   │   │       ├── Harvest-wfs110.xml
│   │   │   │       ├── Harvest-wfs200.xml
│   │   │   │       ├── Harvest-wms-run1.xml
│   │   │   │       ├── Harvest-wms-run2.xml
│   │   │   │       ├── Harvest-wmts.xml
│   │   │   │       ├── Harvest-wps.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-ows-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-sos-abstract-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-sos-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-sos-iso.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wfs-iso.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wms-dc.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wms-iso.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wms-layer.xml
│   │   │   │       ├── Harvest-zzz-post-GetRecords-filter-wps-process.xml
│   │   │   │       └── Transaction-000-delete-all.xml
│   │   │   ├── idswithpaths/
│   │   │   │   ├── data/
│   │   │   │   │   ├── file_id_as_url.xml
│   │   │   │   │   ├── file_id_starting_with_forward_slash.xml
│   │   │   │   │   ├── file_id_with_colon.xml
│   │   │   │   │   ├── file_id_with_directory_changes.xml
│   │   │   │   │   ├── file_id_with_driveletter_and_backslashes.xml
│   │   │   │   │   └── file_id_with_foward_slashes.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   └── get_GetCapabilities.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── iso19115p3/
│   │   │   │   ├── data/
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── auscope-3d-model.xml
│   │   │   │   │   ├── auscope-iso19139-geoprovinces.xml
│   │   │   │   │   ├── metawal.wallonie.be-catchments.xml
│   │   │   │   │   └── metawal.wallonie.be-srv.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_DescribeRecord.xml
│   │   │   │   │   ├── get_GetCapabilities.xml
│   │   │   │   │   ├── post_DescribeRecord.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-property.xml
│   │   │   │   │   ├── post_GetRecordById-ISO19139-full.xml
│   │   │   │   │   ├── post_GetRecordById-brief.xml
│   │   │   │   │   ├── post_GetRecordById-full-dc.xml
│   │   │   │   │   ├── post_GetRecordById-full.xml
│   │   │   │   │   ├── post_GetRecordById-srv-brief.xml
│   │   │   │   │   ├── post_GetRecords-all-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-all.xml
│   │   │   │   │   ├── post_GetRecords-cql-title.xml
│   │   │   │   │   ├── post_GetRecords-elementname.xml
│   │   │   │   │   ├── post_GetRecords-filter-accessconstraints.xml
│   │   │   │   │   ├── post_GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │   │   ├── post_GetRecords-filter-anytext.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox-csw-output.xml
│   │   │   │   │   ├── post_GetRecords-filter-bbox.xml
│   │   │   │   │   ├── post_GetRecords-filter-date.xml
│   │   │   │   │   ├── post_Transaction-delete.xml
│   │   │   │   │   ├── post_Transaction-insert.xml
│   │   │   │   │   ├── post_Transaction-update-full.xml
│   │   │   │   │   └── post_Transaction-update-recordproperty.xml
│   │   │   │   ├── get/
│   │   │   │   │   └── requests.txt
│   │   │   │   └── post/
│   │   │   │       ├── DescribeRecord.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-property.xml
│   │   │   │       ├── GetRecordById-ISO19139-full.xml
│   │   │   │       ├── GetRecordById-brief.xml
│   │   │   │       ├── GetRecordById-full-dc.xml
│   │   │   │       ├── GetRecordById-full.xml
│   │   │   │       ├── GetRecordById-srv-brief.xml
│   │   │   │       ├── GetRecords-all-csw-output.xml
│   │   │   │       ├── GetRecords-all.xml
│   │   │   │       ├── GetRecords-cql-title.xml
│   │   │   │       ├── GetRecords-elementname.xml
│   │   │   │       ├── GetRecords-filter-accessconstraints.xml
│   │   │   │       ├── GetRecords-filter-and-nested-spatial-or-dateline.xml
│   │   │   │       ├── GetRecords-filter-anytext.xml
│   │   │   │       ├── GetRecords-filter-bbox-csw-output.xml
│   │   │   │       ├── GetRecords-filter-bbox.xml
│   │   │   │       ├── GetRecords-filter-date.xml
│   │   │   │       ├── Transaction-delete.xml
│   │   │   │       ├── Transaction-insert.xml
│   │   │   │       ├── Transaction-update-full.xml
│   │   │   │       └── Transaction-update-recordproperty.xml
│   │   │   ├── manager/
│   │   │   │   ├── data/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_Clear-000-delete-all.xml
│   │   │   │   │   ├── post_GetCapabilities.xml
│   │   │   │   │   ├── post_GetDomain-parameter.xml
│   │   │   │   │   ├── post_Transaction-000-delete-all.xml
│   │   │   │   │   ├── post_Transaction-dc-01-insert.xml
│   │   │   │   │   ├── post_Transaction-dc-02-update-full.xml
│   │   │   │   │   ├── post_Transaction-fgdc-01-insert.xml
│   │   │   │   │   ├── post_Transaction-fgdc-02-update-recprop.xml
│   │   │   │   │   ├── post_Transaction-fgdc-03-delete-all.xml
│   │   │   │   │   ├── post_Transaction-iso-00-delete-all.xml
│   │   │   │   │   ├── post_Transaction-iso-01-insert.xml
│   │   │   │   │   ├── post_Transaction-iso-02-update-full.xml
│   │   │   │   │   ├── post_Transaction-iso-03-update-recprop.xml
│   │   │   │   │   ├── post_Transaction-iso-04-update-recprop-no-matches.xml
│   │   │   │   │   ├── post_Transaction-iso-05-delete.xml
│   │   │   │   │   └── post_Transaction-xxx-delete-all.xml
│   │   │   │   └── post/
│   │   │   │       ├── Clear-000-delete-all.xml
│   │   │   │       ├── GetCapabilities.xml
│   │   │   │       ├── GetDomain-parameter.xml
│   │   │   │       ├── Transaction-000-delete-all.xml
│   │   │   │       ├── Transaction-dc-01-insert.xml
│   │   │   │       ├── Transaction-dc-02-update-full.xml
│   │   │   │       ├── Transaction-fgdc-01-insert.xml
│   │   │   │       ├── Transaction-fgdc-02-update-recprop.xml
│   │   │   │       ├── Transaction-fgdc-03-delete-all.xml
│   │   │   │       ├── Transaction-iso-00-delete-all.xml
│   │   │   │       ├── Transaction-iso-01-insert.xml
│   │   │   │       ├── Transaction-iso-02-update-full.xml
│   │   │   │       ├── Transaction-iso-03-update-recprop.xml
│   │   │   │       ├── Transaction-iso-04-update-recprop-no-matches.xml
│   │   │   │       ├── Transaction-iso-05-delete.xml
│   │   │   │       └── Transaction-xxx-delete-all.xml
│   │   │   ├── oaipmh/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetRecord_bad_metadata_prefix.xml
│   │   │   │   │   ├── get_GetRecord_datacite.xml
│   │   │   │   │   ├── get_GetRecord_dc.xml
│   │   │   │   │   ├── get_GetRecord_iso.xml
│   │   │   │   │   ├── get_GetRecord_oai_dc.xml
│   │   │   │   │   ├── get_Identify.xml
│   │   │   │   │   ├── get_ListIdentifiers_bad_metadata_prefix.xml
│   │   │   │   │   ├── get_ListIdentifiers_datacite.xml
│   │   │   │   │   ├── get_ListIdentifiers_dc.xml
│   │   │   │   │   ├── get_ListIdentifiers_iso.xml
│   │   │   │   │   ├── get_ListIdentifiers_missing_metadata_prefix.xml
│   │   │   │   │   ├── get_ListIdentifiers_oai_dc.xml
│   │   │   │   │   ├── get_ListMetadataFormats.xml
│   │   │   │   │   ├── get_ListRecords_datacite.xml
│   │   │   │   │   ├── get_ListRecords_dc.xml
│   │   │   │   │   ├── get_ListRecords_dc_bad_metadata_prefix.xml
│   │   │   │   │   ├── get_ListRecords_iso19139.xml
│   │   │   │   │   ├── get_ListRecords_oai_dc.xml
│   │   │   │   │   ├── get_ListSets.xml
│   │   │   │   │   ├── get_bad_verb.xml
│   │   │   │   │   ├── get_empty.xml
│   │   │   │   │   ├── get_empty_with_amp.xml
│   │   │   │   │   └── get_illegal_verb.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── oarec/
│   │   │   │   ├── conftest.py
│   │   │   │   ├── test_oarec_functional.py
│   │   │   │   └── test_oarec_virtual_collections_functional.py
│   │   │   ├── opensearcheo/
│   │   │   │   ├── data/
│   │   │   │   │   ├── 3e9a8c05.xml
│   │   │   │   │   ├── README.txt
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000012.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000013.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000014.xml
│   │   │   │   │   ├── T_aerfo_RAS_1991_GR800P001800000015.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_284404.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288395.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288398.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288401.xml
│   │   │   │   │   ├── T_ortho_RAS_1998_288404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276395.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276398.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276401.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_276404.xml
│   │   │   │   │   ├── T_pmoed_DTM_1996_280395.xml
│   │   │   │   │   ├── iso_19115-2_Sentinel-2-scene.xml
│   │   │   │   │   ├── pacioos-NS06agg.xml
│   │   │   │   │   └── test.xml
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_opensearch-description-document.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover-gt.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover-lt-gt.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover-lt.xml
│   │   │   │   │   ├── get_opensearch-query-cloudcover.xml
│   │   │   │   │   ├── get_opensearch-query-instrument.xml
│   │   │   │   │   ├── get_opensearch-query-orbitdirection.xml
│   │   │   │   │   ├── get_opensearch-query-orbitnumber.xml
│   │   │   │   │   ├── get_opensearch-query-platform.xml
│   │   │   │   │   ├── get_opensearch-query-processinglevel.xml
│   │   │   │   │   ├── get_opensearch-query-producttype.xml
│   │   │   │   │   ├── get_opensearch-query-sensortype.xml
│   │   │   │   │   ├── get_opensearch-query-snowcover.xml
│   │   │   │   │   ├── get_opensearch-query-spectralrange.xml
│   │   │   │   │   ├── get_opensearch-query-start-stop-extent.xml
│   │   │   │   │   └── get_opensearch-query-time-extent.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── pubsub/
│   │   │   │   ├── conftest.py
│   │   │   │   └── test_pubsub_functional.py
│   │   │   ├── repofilter/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── post_GetRecordById-masked.xml
│   │   │   │   │   └── post_GetRecords-all.xml
│   │   │   │   └── post/
│   │   │   │       ├── GetRecordById-masked.xml
│   │   │   │       └── GetRecords-all.xml
│   │   │   ├── sru/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_explain.xml
│   │   │   │   │   ├── get_search.xml
│   │   │   │   │   ├── get_search_cql.xml
│   │   │   │   │   ├── get_search_maxrecords.xml
│   │   │   │   │   └── get_search_startrecord_maxrecords.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── stablesort/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   ├── get_GetRecords-page1.xml
│   │   │   │   │   ├── get_GetRecords-page2.xml
│   │   │   │   │   └── get_GetRecords-page3.xml
│   │   │   │   └── get/
│   │   │   │       └── requests.txt
│   │   │   ├── stac_api/
│   │   │   │   ├── conftest.py
│   │   │   │   ├── data/
│   │   │   │   │   ├── 20201211_223832_CS21.json
│   │   │   │   │   ├── S2A_MSIL2A_20241128T092331_R093_T34SEJ_20241128T122153.json
│   │   │   │   │   ├── S2A_MSIL2A_20241128T092331_R093_T34SFH_20241128T122153.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33TWN_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33TXN_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UWP_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UWQ_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UXP_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0208_R079_T33UXQ_20190910T120910.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33TWN_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33TXN_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UWP_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UWQ_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UXP_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL1C_20190910T095029_N0500_R079_T33UXQ_20230429T151337.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33TWN_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33TXN_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33UWP_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33UXP_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0213_R079_T33UXQ_20190910T124513.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33TWN_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33TXN_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UWP_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UWQ_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UXP_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2B_MSIL2A_20190910T095029_N0500_R079_T33UXQ_20230430T083712.SAFE.json
│   │   │   │   │   ├── S2MSI1C.xml
│   │   │   │   │   ├── S2MSI2A.xml
│   │   │   │   │   ├── sentinel-2-l2a.json
│   │   │   │   │   ├── simple-collection.json
│   │   │   │   │   └── woudc-total-column-ozone-totalozone.json
│   │   │   │   └── test_stac_api_functional.py
│   │   │   ├── utf-8/
│   │   │   │   ├── default.yml
│   │   │   │   ├── expected/
│   │   │   │   │   └── post_GetCapabilities.xml
│   │   │   │   └── post/
│   │   │   │       └── GetCapabilities.xml
│   │   │   └── xslt/
│   │   │       ├── custom.xslt
│   │   │       ├── default.yml
│   │   │       ├── expected/
│   │   │       │   ├── post_csw2-GetRecordById-xslt.xml
│   │   │       │   ├── post_csw2-GetRecordById.xml
│   │   │       │   ├── post_csw2-GetRecords-all-xslt.xml
│   │   │       │   ├── post_csw2-GetRecords-all.xml
│   │   │       │   ├── post_csw3-GetRecordById-xslt.xml
│   │   │       │   ├── post_csw3-GetRecordById.xml
│   │   │       │   ├── post_csw3-GetRecords-all-xslt.xml
│   │   │       │   └── post_csw3-GetRecords-all.xml
│   │   │       └── post/
│   │   │           ├── csw2-GetRecordById-xslt.xml
│   │   │           ├── csw2-GetRecordById.xml
│   │   │           ├── csw2-GetRecords-all-xslt.xml
│   │   │           ├── csw2-GetRecords-all.xml
│   │   │           ├── csw3-GetRecordById-xslt.xml
│   │   │           ├── csw3-GetRecordById.xml
│   │   │           ├── csw3-GetRecords-all-xslt.xml
│   │   │           └── csw3-GetRecords-all.xml
│   │   └── test_xml_suites_functional.py
│   ├── gen_html.py
│   └── unittests/
│       ├── test_fmt_json.py
│       ├── test_metadata.py
│       ├── test_ogc_csw_csw3.py
│       ├── test_opensearch.py
│       ├── test_repository.py
│       ├── test_server.py
│       ├── test_util.py
│       └── test_wsgi.py
└── tox.ini
Download .txt
SYMBOL INDEX (481 symbols across 61 files)

FILE: docker/entrypoint.py
  function launch_pycsw (line 55) | def launch_pycsw(pycsw_config, workers=2, reload=False):

FILE: docs/conf.py
  class Mock (line 333) | class Mock(MagicMock):
    method __getattr__ (line 335) | def __getattr__(cls, name):

FILE: pycsw/broker/__init__.py
  function load_client (line 35) | def load_client(def_: dict) -> BasePubSubClient:

FILE: pycsw/broker/base.py
  class BasePubSubClient (line 39) | class BasePubSubClient:
    method __init__ (line 42) | def __init__(self, publisher_def: dict):
    method connect (line 60) | def connect(self) -> None:
    method pub (line 69) | def pub(self, channel: str, message: str) -> bool:
    method __repr__ (line 81) | def __repr__(self):

FILE: pycsw/broker/http.py
  class HTTPPubSubClient (line 41) | class HTTPPubSubClient(BasePubSubClient):
    method __init__ (line 44) | def __init__(self, broker_url):
    method connect (line 67) | def connect(self) -> None:
    method pub (line 76) | def pub(self, channel: str, message: str, qos: int = 1) -> bool:
    method __repr__ (line 102) | def __repr__(self):

FILE: pycsw/broker/mqtt.py
  class MQTTPubSubClient (line 39) | class MQTTPubSubClient(BasePubSubClient):
    method __init__ (line 42) | def __init__(self, broker_url):
    method connect (line 79) | def connect(self) -> None:
    method pub (line 89) | def pub(self, channel: str, message: str, qos: int = 1) -> bool:
    method __repr__ (line 117) | def __repr__(self):

FILE: pycsw/core/admin.py
  function load_records (line 52) | def load_records(context, database, table, xml_dirpath, recursive=False,...
  function export_records (line 122) | def export_records(context, database, table, xml_dirpath):
  function refresh_harvested_records (line 189) | def refresh_harvested_records(context, database, table, url):
  function gen_sitemap (line 228) | def gen_sitemap(context, database, table, url, output_file):
  function post_xml (line 269) | def post_xml(url, xml, timeout=30):
  function get_sysprof (line 283) | def get_sysprof():
  function validate_xml (line 333) | def validate_xml(xml, xsd):
  function delete_records (line 349) | def delete_records(context, database, table):
  function cli_option_verbosity (line 358) | def cli_option_verbosity(f):
  function cli_callbacks (line 384) | def cli_callbacks(f):
  function cli (line 391) | def cli():
  function cli_setup_repository (line 399) | def cli_setup_repository(ctx, config, verbosity):
  function cli_load_records (line 422) | def cli_load_records(ctx, config, path, recursive, yes, verbosity):
  function cli_delete_records (line 445) | def cli_delete_records(ctx, config, yes, verbosity):
  function cli_export_records (line 468) | def cli_export_records(ctx, config, path, verbosity):
  function cli_rebuild_db_indexes (line 488) | def cli_rebuild_db_indexes(ctx, config, verbosity):
  function cli_optimize_db (line 504) | def cli_optimize_db(ctx, config, verbosity):
  function cli_refresh_harvested_records (line 521) | def cli_refresh_harvested_records(ctx, config, verbosity, url):
  function cli_gen_sitemap (line 545) | def cli_gen_sitemap(ctx, config, output, verbosity):
  function cli_post_xml (line 572) | def cli_post_xml(ctx, url, xml, timeout, verbosity):
  function cli_validate_xml (line 589) | def cli_validate_xml(ctx, xml, xsd, verbosity):
  function cli_get_sysprof (line 597) | def cli_get_sysprof(ctx):
  function cli_migrate_config (line 607) | def cli_migrate_config(ctx, config, verbosity):

FILE: pycsw/core/config.py
  class StaticContext (line 38) | class StaticContext(object):
    method __init__ (line 40) | def __init__(self, prefix='csw30'):
    method set_model (line 574) | def set_model(self, prefix):
    method gen_domains (line 579) | def gen_domains(self):
    method refresh_dc (line 590) | def refresh_dc(self, mappings):

FILE: pycsw/core/formats/fmt_json.py
  function xml2dict (line 38) | def xml2dict(xml_string, namespaces):
  function xml2json (line 60) | def xml2json(xml_string, namespaces, pretty_print=False):

FILE: pycsw/core/log.py
  function setup_logger (line 38) | def setup_logger(logging_config):

FILE: pycsw/core/metadata.py
  function parse_record (line 52) | def parse_record(context, record, repos=None,
  function _get (line 123) | def _get(context, obj, name):
  function _set (line 127) | def _set(context, obj, name, value):
  function _parse_metadata (line 131) | def _parse_metadata(context, repos, record):
  function _parse_csw (line 174) | def _parse_csw(context, repos, record, identifier, pagesize=10):
  function _parse_waf (line 281) | def _parse_waf(context, repos, record, identifier):
  function _parse_wms (line 331) | def _parse_wms(context, repos, record, identifier):
  function _parse_wmts (line 495) | def _parse_wmts(context, repos, record, identifier):
  function _parse_wfs (line 645) | def _parse_wfs(context, repos, record, identifier, version):
  function _parse_wcs (line 787) | def _parse_wcs(context, repos, record, identifier):
  function _parse_wps (line 908) | def _parse_wps(context, repos, record, identifier):
  function _parse_sos (line 1021) | def _parse_sos(context, repos, record, identifier, version):
  function _parse_fgdc (line 1151) | def _parse_fgdc(context, repos, exml):
  function _parse_gm03 (line 1258) | def _parse_gm03(context, repos, exml):
  function _parse_iso (line 1371) | def _parse_iso(context, repos, exml):
  function _parse_dc (line 1647) | def _parse_dc(context, repos, exml):
  function _parse_json_record (line 1729) | def _parse_json_record(context, repos, record):
  function _parse_oarec_record (line 1751) | def _parse_oarec_record(context, repos, record):
  function _parse_stac_resource (line 1817) | def _parse_stac_resource(context, repos, record):
  function fgdccontact2iso (line 1987) | def fgdccontact2iso(cnt, role='pointOfContact'):
  function caps2iso (line 2005) | def caps2iso(record, caps, context):
  function bbox_from_polygons (line 2018) | def bbox_from_polygons(bboxs):

FILE: pycsw/core/pygeofilter_evaluate.py
  class PycswFilterEvaluator (line 47) | class PycswFilterEvaluator(SQLAlchemyFilterEvaluator):
    method __init__ (line 48) | def __init__(self, field_mapping=None, dbtype='sqlite',
    method intersects (line 54) | def intersects(self, node, lhs, rhs):
    method bbox (line 74) | def bbox(self, node, lhs):
    method equal (line 88) | def equal(self, node, lhs, rhs):
    method ilike (line 105) | def ilike(self, node, lhs):
  function to_filter (line 123) | def to_filter(ast, dbtype, field_mapping=None):

FILE: pycsw/core/repository.py
  class Repository (line 56) | class Repository(object):
    method create_engine (line 60) | def create_engine(clazz, url):
    method __init__ (line 90) | def __init__(self, database, context, app_root=None, table='records', ...
    method ping (line 249) | def ping(self, max_tries=10, wait_seconds=10):
    method rebuild_db_indexes (line 272) | def rebuild_db_indexes(self):
    method optimize_db (line 282) | def optimize_db(self):
    method _create_values (line 301) | def _create_values(self, values):
    method describe (line 307) | def describe(self):
    method query_ids (line 341) | def query_ids(self, ids):
    method query_collections (line 350) | def query_collections(self, filters=None, limit=10):
    method query_domain (line 384) | def query_domain(self, domain, typenames, domainquerytype='list',
    method query_insert (line 403) | def query_insert(self, direction='max'):
    method query_source (line 413) | def query_source(self, source):
    method query (line 421) | def query(self, constraint, sortby=None, typenames=None,
    method insert (line 470) | def insert(self, record, source, insert_date):
    method update (line 486) | def update(self, record=None, recprops=None, constraint=None):
    method delete (line 547) | def delete(self, constraint):
    method exists (line 581) | def exists(self):
    method _get_repo_filter (line 591) | def _get_repo_filter(self, query):
  function create_custom_sql_functions (line 598) | def create_custom_sql_functions(connection):
  function query_spatial (line 618) | def query_spatial(bbox_data_wkt, bbox_input_wkt, predicate, distance):
  function update_xpath (line 679) | def update_xpath(nsmap, xml, recprop):
  function get_geometry_area (line 701) | def get_geometry_area(geometry):
  function get_spatial_overlay_rank (line 711) | def get_spatial_overlay_rank(target_geometry, query_geometry):
  function setup (line 740) | def setup(database, table, create_sfsql_tables=True, postgis_geometry_co...

FILE: pycsw/core/util.py
  function get_today_and_now (line 70) | def get_today_and_now():
  function datetime2iso8601 (line 75) | def datetime2iso8601(value):
  function get_time_iso2unix (line 100) | def get_time_iso2unix(isotime):
  function get_version_integer (line 106) | def get_version_integer(version):
  function nspath_eval (line 139) | def nspath_eval(xpath, nsmap):
  function wktenvelope2bbox (line 175) | def wktenvelope2bbox(envelope):
  function geojson_geometry2bbox (line 183) | def geojson_geometry2bbox(geometry):
  function wkt2geom (line 190) | def wkt2geom(ewkt, bounds=True):
  function bbox2wktpolygon (line 222) | def bbox2wktpolygon(bbox):
  function transform_mappings (line 246) | def transform_mappings(queryables, typename):
  function getqattr (line 269) | def getqattr(obj, name):
  function http_request (line 292) | def http_request(method, url, request=None, timeout=30):
  function bind_url (line 302) | def bind_url(url):
  function ip_in_network_cidr (line 314) | def ip_in_network_cidr(ip, net):
  function ipaddress_in_whitelist (line 329) | def ipaddress_in_whitelist(ipaddress, whitelist):
  function get_anytext (line 352) | def get_anytext(bag):
  function get_anytext_from_obj (line 369) | def get_anytext_from_obj(obj):
  function secure_filename (line 390) | def secure_filename(filename):
  function jsonify_links (line 434) | def jsonify_links(links):
  class EnvInterpolation (line 457) | class EnvInterpolation(BasicInterpolation):
    method before_get (line 463) | def before_get(self, parser, section, option, value, defaults):
  function parse_ini_config (line 468) | def parse_ini_config(config_path) -> ConfigParser:
  function is_none_or_empty (line 483) | def is_none_or_empty(value):
  function programmatic_import (line 498) | def programmatic_import(target_module: str) -> typing.Optional[typing.Any]:
  function load_custom_repo_mappings (line 521) | def load_custom_repo_mappings(repository_mappings: str) -> typing.Option...
  function sanitize_db_connect (line 529) | def sanitize_db_connect (url):
  function str2bool (line 542) | def str2bool(value: typing.Union[bool, str]) -> bool:
  function remove_url_auth (line 562) | def remove_url_auth(url: str) -> str:

FILE: pycsw/oaipmh.py
  class OAIPMH (line 38) | class OAIPMH(object):
    method __init__ (line 40) | def __init__(self, context, config):
    method request (line 124) | def request(self, kvp):
    method response (line 181) | def response(self, response, kvp, repository, server_url):
    method _get_metadata_prefix (line 284) | def _get_metadata_prefix(self, prefix):
    method _transform_element (line 292) | def _transform_element(self, parent, element, elname):

FILE: pycsw/ogc/api/oapi.py
  function gen_oapi (line 40) | def gen_oapi(config, oapi_filepath, mode='ogcapi-records'):

FILE: pycsw/ogc/api/records.py
  class API (line 84) | class API:
    method __init__ (line 87) | def __init__(self, config: dict):
    method get_content_type (line 153) | def get_content_type(self, headers, args):
    method get_response (line 183) | def get_response(self, status, headers, data, template=None):
    method landing_page (line 205) | def landing_page(self, headers_, args):
    method openapi (line 319) | def openapi(self, headers_, args):
    method conformance (line 339) | def conformance(self, headers_, args):
    method collections (line 365) | def collections(self, headers_, args):
    method collection (line 419) | def collection(self, headers_, args, collection='metadata:main'):
    method queryables (line 505) | def queryables(self, headers_, args, collection='metadata:main'):
    method items (line 551) | def items(self, headers_, json_post_data, args, collection='metadata:m...
    method item (line 944) | def item(self, headers_, args, collection, item):
    method manage_collection_item (line 1003) | def manage_collection_item(self, headers_, action='create', collection...
    method get_exception (line 1090) | def get_exception(self, status, headers, code, description):
    method get_collection_info (line 1109) | def get_collection_info(self, collection_name: str = 'metadata:main',
    method federated_catalogues (line 1166) | def federated_catalogues(self, headers_, args, collection):
    method federated_catalogue (line 1198) | def federated_catalogue(self, headers_, args, collection, catalogue):
    method get_all_collections (line 1238) | def get_all_collections(self) -> list:
    method get_facets (line 1250) | def get_facets(self, filters=None) -> dict:
  function record2json (line 1284) | def record2json(record, url, collection, mode='ogcapi-records'):
  function build_anytext (line 1572) | def build_anytext(name, value):
  function sortby_to_order_by (line 1606) | def sortby_to_order_by(sortby: Union[str, List[dict]], mappings: dict) -...

FILE: pycsw/ogc/api/util.py
  function get_typed_value (line 62) | def get_typed_value(value):
  function json_serial (line 82) | def json_serial(obj):
  function match_env_var (line 112) | def match_env_var(value):
  function yaml_load (line 121) | def yaml_load(fh):
  function yaml_dump (line 149) | def yaml_dump(dict_: dict, destfile: str) -> bool:
  function to_json (line 172) | def to_json(dict_, pretty=False):
  function render_j2_template (line 191) | def render_j2_template(config, template, data):
  function to_rfc3339 (line 229) | def to_rfc3339(value: str) -> Union[tuple, None]:

FILE: pycsw/ogc/csw/cql.py
  function cql2fes (line 41) | def cql2fes(cql, namespaces, fes_version='1.0'):
  function _parse_condition (line 110) | def _parse_condition(condition, fes_version='1.0'):

FILE: pycsw/ogc/csw/csw2.py
  class Csw2 (line 45) | class Csw2(object):
    method __init__ (line 47) | def __init__(self, server_csw):
    method getcapabilities (line 53) | def getcapabilities(self):
    method describerecord (line 419) | def describerecord(self):
    method getdomain (line 487) | def getdomain(self):
    method getrecords (line 608) | def getrecords(self):
    method getrecordbyid (line 1005) | def getrecordbyid(self, raw=False):
    method getrepositoryitem (line 1115) | def getrepositoryitem(self):
    method transaction (line 1126) | def transaction(self):
    method harvest (line 1255) | def harvest(self):
    method _write_record (line 1451) | def _write_record(self, recobj, queryables):
    method _parse_constraint (line 1570) | def _parse_constraint(self, element):
    method parse_postdata (line 1604) | def parse_postdata(self, postdata):
    method _write_transactionsummary (line 1922) | def _write_transactionsummary(self, inserted=0, updated=0, deleted=0):
    method _write_acknowledgement (line 1941) | def _write_acknowledgement(self, root=True):
    method _write_verboseresponse (line 1969) | def _write_verboseresponse(self, insertresults):
    method exceptionreport (line 1988) | def exceptionreport(self, code, locator, text):
  function write_boundingbox (line 2025) | def write_boundingbox(bbox, nsmap):

FILE: pycsw/ogc/csw/csw3.py
  class Csw3 (line 44) | class Csw3(object):
    method __init__ (line 46) | def __init__(self, server_csw):
    method getcapabilities (line 52) | def getcapabilities(self):
    method getdomain (line 482) | def getdomain(self):
    method getrecords (line 594) | def getrecords(self):
    method getrecordbyid (line 1045) | def getrecordbyid(self, raw=False):
    method getrepositoryitem (line 1173) | def getrepositoryitem(self):
    method transaction (line 1184) | def transaction(self):
    method harvest (line 1314) | def harvest(self):
    method _write_record (line 1510) | def _write_record(self, recobj, queryables):
    method _parse_constraint (line 1643) | def _parse_constraint(self, element):
    method parse_postdata (line 1677) | def parse_postdata(self, postdata):
    method _write_transactionsummary (line 1988) | def _write_transactionsummary(self, inserted=0, updated=0, deleted=0):
    method _write_acknowledgement (line 2007) | def _write_acknowledgement(self, root=True):
    method _write_verboseresponse (line 2035) | def _write_verboseresponse(self, insertresults):
    method _write_allowed_values (line 2054) | def _write_allowed_values(self, values):
    method exceptionreport (line 2066) | def exceptionreport(self, code, locator, text):
    method resolve_nsmap (line 2105) | def resolve_nsmap(self, list_):
  function write_boundingbox (line 2147) | def write_boundingbox(bbox, nsmap):
  function get_resultset_status (line 2180) | def get_resultset_status(matched, nextrecord):
  function get_elapsed_time (line 2193) | def get_elapsed_time(begin, end):

FILE: pycsw/ogc/fes/fes1.py
  function parse (line 76) | def parse(element, queryables, dbtype, nsmap, orm='sqlalchemy', language...
  function _get_spatial_operator (line 305) | def _get_spatial_operator(geomattr, element, dbtype, nsmap, postgis_geom...
  function _get_comparison_operator (line 392) | def _get_comparison_operator(element):
  function set_spatial_ranking (line 398) | def set_spatial_ranking(geometry):

FILE: pycsw/ogc/fes/fes2.py
  function parse (line 95) | def parse(element, queryables, dbtype, nsmap, orm='sqlalchemy', language...
  function _get_spatial_operator (line 323) | def _get_spatial_operator(geomattr, element, dbtype, nsmap, postgis_geom...
  function _get_comparison_operator (line 410) | def _get_comparison_operator(element):
  function set_spatial_ranking (line 416) | def set_spatial_ranking(geometry):

FILE: pycsw/ogc/gml/gml3.py
  function _poslist2wkt (line 44) | def _poslist2wkt(poslist, axisorder, geomtype):
  class Geometry (line 73) | class Geometry(object):
    method __init__ (line 76) | def __init__(self, element, nsmap):
    method _get_point (line 121) | def _get_point(self):
    method _get_linestring (line 136) | def _get_linestring(self):
    method _get_polygon (line 150) | def _get_polygon(self):
    method _get_envelope (line 164) | def _get_envelope(self):
    method transform (line 197) | def transform(self, src, dest):

FILE: pycsw/ogc/gml/gml32.py
  function _poslist2wkt (line 44) | def _poslist2wkt(poslist, axisorder, geomtype):
  class Geometry (line 73) | class Geometry(object):
    method __init__ (line 76) | def __init__(self, element, nsmap):
    method _get_point (line 123) | def _get_point(self):
    method _get_linestring (line 138) | def _get_linestring(self):
    method _get_polygon (line 152) | def _get_polygon(self):
    method _get_envelope (line 166) | def _get_envelope(self):
    method transform (line 200) | def transform(self, src, dest):

FILE: pycsw/ogc/pubsub/__init__.py
  function publish_message (line 37) | def publish_message(pubsub_client, url: str, action: str,
  function generate_ogc_cloudevent (line 73) | def generate_ogc_cloudevent(type_: str, media_type: str, source: str,

FILE: pycsw/opensearch.py
  class OpenSearch (line 62) | class OpenSearch(object):
    method __init__ (line 65) | def __init__(self, context):
    method response_csw2opensearch (line 83) | def response_csw2opensearch(self, element, cfg):
    method _csw2_2_os (line 107) | def _csw2_2_os(self):
    method _csw3_2_os (line 206) | def _csw3_2_os(self):
    method cswrecord2atom (line 343) | def cswrecord2atom(self, rec):
  function kvp2filterxml (line 380) | def kvp2filterxml(kvp, context, profiles, fes_version='1.0'):
  function evaluate_literal (line 754) | def evaluate_literal(context, pname, pvalue):
  function validate_4326 (line 862) | def validate_4326(bbox_list):

FILE: pycsw/plugins/outputschemas/atom.py
  function write_record (line 50) | def write_record(result, esn, context, url=None):
  function write_extent (line 128) | def write_extent(bbox, nsmap):

FILE: pycsw/plugins/outputschemas/datacite.py
  function write_record (line 86) | def write_record(result, esn, context, url=None):

FILE: pycsw/plugins/outputschemas/dif.py
  function write_record (line 54) | def write_record(result, esn, context, url=None):
  function write_extent (line 198) | def write_extent(bbox, nsmap):

FILE: pycsw/plugins/outputschemas/fgdc.py
  function write_record (line 57) | def write_record(recobj, esn, context, url=None):
  function write_extent (line 163) | def write_extent(bbox):

FILE: pycsw/plugins/outputschemas/gm03.py
  function write_record (line 39) | def write_record(result, esn, context, url=None):
  function _get_pt_freetext (line 205) | def _get_pt_freetext(val, language):
  function _get_pt_freeurl (line 215) | def _get_pt_freeurl(val, language):
  function write_extent (line 225) | def write_extent(bbox, nsmap):

FILE: pycsw/plugins/profiles/apiso/apiso.py
  class APISO (line 44) | class APISO(profile.Profile):
    method __init__ (line 46) | def __init__(self, model, namespaces, context):
    method extend_core (line 163) | def extend_core(self, model, namespaces, config):
    method check_parameters (line 190) | def check_parameters(self, kvp):
    method get_extendedcapabilities (line 207) | def get_extendedcapabilities(self):
    method get_schemacomponents (line 352) | def get_schemacomponents(self):
    method check_getdomain (line 385) | def check_getdomain(self, kvp):
    method write_record (line 389) | def write_record(self, result, esn, outputschema, queryables, caps=None):
  function write_keywords (line 700) | def write_keywords(keywords, nsmap):
  function write_extent (line 708) | def write_extent(bbox, nsmap):
  function _write_date (line 733) | def _write_date(dateval, datetypeval, nsmap):
  function _get_resource_opname (line 746) | def _get_resource_opname(operations):
  function _write_codelist_element (line 752) | def _write_codelist_element(codelist_element, codelist_value, nsmap):

FILE: pycsw/plugins/profiles/ebrim/ebrim.py
  class EBRIM (line 38) | class EBRIM(profile.Profile):
    method __init__ (line 40) | def __init__(self, model, namespaces, context):
    method extend_core (line 89) | def extend_core(self, model, namespaces, config):
    method check_parameters (line 94) | def check_parameters(self, kvp):
    method get_extendedcapabilities (line 98) | def get_extendedcapabilities(self):
    method get_schemacomponents (line 102) | def get_schemacomponents(self):
    method check_getdomain (line 120) | def check_getdomain(self, kvp):
    method write_record (line 124) | def write_record(self, result, esn, outputschema, queryables):

FILE: pycsw/plugins/profiles/iso19115p3/iso19115p3.py
  class ISO19115p3 (line 40) | class ISO19115p3(profile.Profile):
    method __init__ (line 43) | def __init__(self, model, namespaces, context):
    method extend_core (line 247) | def extend_core(self, model, namespaces, config):
    method check_parameters (line 263) | def check_parameters(self, kvp):
    method get_extendedcapabilities (line 269) | def get_extendedcapabilities(self):
    method get_schemacomponents (line 275) | def get_schemacomponents(self):
    method check_getdomain (line 309) | def check_getdomain(self, kvp):
    method write_record (line 315) | def write_record(self, result, esn, outputschema, queryables, caps=None):
    method _write_contact_phone (line 661) | def _write_contact_phone(self, ci_contact, phone_num_str):
    method _write_contact_fax (line 675) | def _write_contact_fax(self, ci_contact, fax_num_str):
    method _write_contact_address (line 689) | def _write_contact_address(self, ci_resp, ci_contact, **contact):
    method _write_keywords (line 731) | def _write_keywords(self, keywords):
    method _write_extent (line 744) | def _write_extent(self, bbox, vert_ext_min, vert_ext_max):
    method _write_date (line 783) | def _write_date(self, dateval, datetypeval):
  function get_resource_opname (line 806) | def get_resource_opname(operations):
  function write_codelist_element (line 818) | def write_codelist_element(codelist_element, codelist_value, nsmap):
  function build_path (line 835) | def build_path(node, path_list, nsmap, reuse=True):

FILE: pycsw/plugins/profiles/profile.py
  class Profile (line 36) | class Profile(object):
    method __init__ (line 38) | def __init__(self, name, version, title, url,
    method extend_core (line 76) | def extend_core(self, model, namespaces, config):
    method check_parameters (line 80) | def check_parameters(self):
    method get_extendedcapabilities (line 85) | def get_extendedcapabilities(self):
    method get_schemacomponents (line 89) | def get_schemacomponents(self):
    method check_getdomain (line 93) | def check_getdomain(self, kvp):
    method write_record (line 97) | def write_record(self, result, esn, outputschema, queryables):
    method transform2dcmappings (line 101) | def transform2dcmappings(self, queryables):
  function load_profiles (line 105) | def load_profiles(path, cls, profiles):

FILE: pycsw/plugins/repository/odc/odc.py
  class OpenDataCatalogRepository (line 38) | class OpenDataCatalogRepository(object):
    method __init__ (line 40) | def __init__(self, context, repo_filter=None):
    method query_ids (line 80) | def query_ids(self, ids):
    method query_domain (line 91) | def query_domain(self, domain, typenames, domainquerytype='list',
    method query_insert (line 107) | def query_insert(self, direction='max'):
    method query_source (line 115) | def query_source(self, source):
    method query (line 119) | def query(self, constraint, sortby=None, typenames=None,
    method _get_repo_filter (line 149) | def _get_repo_filter(self, query):

FILE: pycsw/server.py
  class Csw (line 54) | class Csw(object):
    method __init__ (line 56) | def __init__(self, rtconfig=None, env=None, version='3.0.0'):
    method expand_path (line 209) | def expand_path(self, path):
    method dispatch_wsgi (line 216) | def dispatch_wsgi(self):
    method opensearch (line 250) | def opensearch(self):
    method sru (line 257) | def sru(self):
    method oaipmh (line 264) | def oaipmh(self):
    method dispatch (line 270) | def dispatch(self, writer=sys.stdout, write_headers=True):
    method getcapabilities (line 617) | def getcapabilities(self):
    method describerecord (line 621) | def describerecord(self):
    method getdomain (line 625) | def getdomain(self):
    method getrecords (line 629) | def getrecords(self):
    method getrecordbyid (line 633) | def getrecordbyid(self, raw=False):
    method getrepositoryitem (line 637) | def getrepositoryitem(self):
    method transaction (line 641) | def transaction(self):
    method harvest (line 645) | def harvest(self):
    method _write_response (line 649) | def _write_response(self):
    method _gen_soap_wrapper (line 695) | def _gen_soap_wrapper(self):
    method _gen_manager (line 748) | def _gen_manager(self):
    method _test_manager (line 794) | def _test_manager(self):
    method _cql_update_queryables_mappings (line 811) | def _cql_update_queryables_mappings(self, cql, mappings):
    method _process_responsehandler (line 825) | def _process_responsehandler(self, xml):
    method _render_xslt (line 895) | def _render_xslt(self, res):
    method normalize_kvp (line 924) | def normalize_kvp(kvp):

FILE: pycsw/sru.py
  class Sru (line 36) | class Sru(object):
    method __init__ (line 38) | def __init__(self, context):
    method request_sru2csw (line 82) | def request_sru2csw(self, kvpin):
    method response_csw2sru (line 123) | def response_csw2sru(self, element, environ):
    method exceptionreport2diagnostic (line 196) | def exceptionreport2diagnostic(self, element):

FILE: pycsw/stac/api.py
  class STACAPI (line 80) | class STACAPI(API):
    method __init__ (line 83) | def __init__(self, config: dict):
    method landing_page (line 98) | def landing_page(self, headers_, args):
    method openapi (line 172) | def openapi(self, headers_, args):
    method conformance (line 192) | def conformance(self, headers_, args):
    method collections (line 211) | def collections(self, headers_, args):
    method collection (line 331) | def collection(self, headers_, args, collection='metadata:main'):
    method queryables (line 380) | def queryables(self, headers_, args, collection='metadata:main'):
    method items (line 411) | def items(self, headers_, json_post_data, args, collection='metadata:m...
    method item (line 669) | def item(self, headers_, args, collection, item):
    method get_collection_info (line 699) | def get_collection_info(self, collection_name: str = 'metadata:main',
    method manage_collection_item (line 762) | def manage_collection_item(self, headers_, action='create', item=None,...
  function links2stacassets (line 794) | def links2stacassets(collection: str, record: dict) -> dict:
  function get_stac_search_url (line 832) | def get_stac_search_url(url: str) -> str:

FILE: pycsw/wsgi.py
  function application (line 69) | def application(env, start_response):
  function application_dispatcher (line 77) | def application_dispatcher(env):
  function compress_response (line 106) | def compress_response(response, compression_level):
  function get_pycsw_root_path (line 138) | def get_pycsw_root_path(process_environment, request_environment=None,
  function get_configuration_path (line 177) | def get_configuration_path(process_environment, request_environment,

FILE: pycsw/wsgi_flask.py
  function get_api_type (line 59) | def get_api_type(urlpath):
  function get_response (line 76) | def get_response(result: tuple):
  function landing_page (line 96) | def landing_page():
  function openapi (line 111) | def openapi():
  function conformance (line 126) | def conformance():
  function collections (line 141) | def collections():
  function collection (line 162) | def collection(collection='metadata:main'):
  function queryables (line 192) | def queryables(collection='metadata:main'):
  function federated_catalogues (line 210) | def federated_catalogues(collection='metadata:main'):
  function federated_catalogue (line 224) | def federated_catalogue(collection='metadata:main', catalogue=None):
  function items (line 241) | def items(collection='metadata:main'):
  function item (line 287) | def item(collection='metadata:main', item=None):
  function csw (line 316) | def csw():
  function opensearch (line 330) | def opensearch():
  function oaipmh (line 344) | def oaipmh():
  function sru (line 358) | def sru():

FILE: setup.py
  function read (line 40) | def read(filename, encoding="utf-8"):
  function get_package_version (line 47) | def get_package_version():

FILE: tests/conftest.py
  function pytest_configure (line 34) | def pytest_configure(config):
  function pytest_addoption (line 51) | def pytest_addoption(parser):
  function log_level (line 107) | def log_level(request):

FILE: tests/functionaltests/conftest.py
  function pytest_configure (line 57) | def pytest_configure(config):
  function pytest_generate_tests (line 62) | def pytest_generate_tests(metafunc):
  function test_identifier (line 158) | def test_identifier(request):
  function use_xml_canonicalisation (line 164) | def use_xml_canonicalisation(request):
  function save_results_directory (line 169) | def save_results_directory(request):
  function configuration (line 174) | def configuration(request, tests_directory, log_level):
  function fixture_tests_directory (line 229) | def fixture_tests_directory(tmpdir_factory):
  function _get_cite_suite_dirs (line 246) | def _get_cite_suite_dirs():
  function _get_get_parameters (line 258) | def _get_get_parameters(get_tests_dir, expected_tests_dir, config_path,
  function _get_post_parameters (line 283) | def _get_post_parameters(post_tests_dir, expected_tests_dir, config_path,
  function _get_repository_url (line 309) | def _get_repository_url(conf, suite_name, test_dir):
  function _get_suite_dirs (line 335) | def _get_suite_dirs(suite_name):
  function _get_table_name (line 372) | def _get_table_name(suite, config, repository_url):
  function _initialize_database (line 401) | def _initialize_database(repository_url, table_name, data_dir, test_dir,...
  function _parse_postgresql_repository_url (line 464) | def _parse_postgresql_repository_url(repository_url):
  function _recreate_postgresql_database (line 492) | def _recreate_postgresql_database(configuration):
  function _create_postgresql_extension (line 532) | def _create_postgresql_extension(configuration, extension):
  function _repository_exists (line 559) | def _repository_exists(repository_url, table_name):

FILE: tests/functionaltests/suites/oarec/conftest.py
  function config (line 36) | def config():
  function config_virtual_collections (line 120) | def config_virtual_collections(config):
  function sample_record (line 127) | def sample_record():

FILE: tests/functionaltests/suites/oarec/test_oarec_functional.py
  function test_landing_page (line 45) | def test_landing_page(config):
  function test_openapi (line 62) | def test_openapi(config):
  function test_conformance (line 74) | def test_conformance(config):
  function test_collections (line 83) | def test_collections(config):
  function test_queryables (line 100) | def test_queryables(config):
  function test_items (line 120) | def test_items(config):
  function test_item (line 280) | def test_item(config):
  function test_json_transaction (line 314) | def test_json_transaction(config, sample_record):
  function test_xml_transaction (line 409) | def test_xml_transaction(config):

FILE: tests/functionaltests/suites/oarec/test_oarec_virtual_collections_functional.py
  function test_landing_page (line 43) | def test_landing_page(config_virtual_collections):
  function test_openapi (line 60) | def test_openapi(config_virtual_collections):
  function test_conformance (line 72) | def test_conformance(config_virtual_collections):
  function test_collections (line 79) | def test_collections(config_virtual_collections):
  function test_queryables (line 110) | def test_queryables(config_virtual_collections):
  function test_items (line 128) | def test_items(config_virtual_collections):
  function test_item (line 226) | def test_item(config_virtual_collections):

FILE: tests/functionaltests/suites/pubsub/conftest.py
  function config (line 36) | def config():
  function config_virtual_collections (line 126) | def config_virtual_collections(config):
  function sample_record (line 133) | def sample_record():

FILE: tests/functionaltests/suites/pubsub/test_pubsub_functional.py
  function test_landing_page (line 39) | def test_landing_page(config):
  function test_conformance (line 61) | def test_conformance(config):

FILE: tests/functionaltests/suites/stac_api/conftest.py
  function config (line 36) | def config():
  function sample_collection (line 116) | def sample_collection():
  function sample_item (line 181) | def sample_item():
  function sample_item_collection (line 229) | def sample_item_collection():

FILE: tests/functionaltests/suites/stac_api/test_stac_api_functional.py
  function test_landing_page (line 41) | def test_landing_page(config):
  function test_openapi (line 56) | def test_openapi(config):
  function test_conformance (line 65) | def test_conformance(config):
  function test_collections (line 90) | def test_collections(config):
  function test_collection (line 111) | def test_collection(config):
  function test_queryables (line 126) | def test_queryables(config):
  function test_items (line 146) | def test_items(config):
  function test_item (line 843) | def test_item(config):
  function test_json_transaction (line 870) | def test_json_transaction(config, sample_collection, sample_item,

FILE: tests/functionaltests/test_xml_suites_functional.py
  function test_xml_based_suites (line 51) | def test_xml_based_suites(
  function _compare_with_xml_canonicalisation (line 116) | def _compare_with_xml_canonicalisation(normalized_result, expected):
  function _compare_without_xml_canonicalisation (line 129) | def _compare_without_xml_canonicalisation(normalized_result, expected):
  function _prepare_wsgi_test_environment (line 133) | def _prepare_wsgi_test_environment(request_method, request_data):
  function _test_xml_result (line 173) | def _test_xml_result(result, expected, encoding="utf-8"):
  function _test_json_result (line 221) | def _test_json_result(result, expected):
  function _test_xml_diff (line 243) | def _test_xml_diff(result, expected):
  function _normalize (line 273) | def _normalize(sresult, normalize_identifiers=False):
  function _save_test_result (line 383) | def _save_test_result(target_directory_path, test_result, filename, enco...

FILE: tests/unittests/test_fmt_json.py
  function test_xml2dict (line 41) | def test_xml2dict():

FILE: tests/unittests/test_metadata.py
  function test_bbox_from_polygons (line 47) | def test_bbox_from_polygons(bboxes, expected):
  function test_bbox_from_polygons_invalid (line 52) | def test_bbox_from_polygons_invalid():

FILE: tests/unittests/test_ogc_csw_csw3.py
  function test_get_elapsed_time (line 42) | def test_get_elapsed_time(begin, end, expected):

FILE: tests/unittests/test_opensearch.py
  function test_validate_4326 (line 59) | def test_validate_4326(bbox, expected):

FILE: tests/unittests/test_repository.py
  function test_query_spatial (line 59) | def test_query_spatial(data, input_, predicate, distance, expected):

FILE: tests/unittests/test_server.py
  function test_config_env_vars (line 42) | def test_config_env_vars():

FILE: tests/unittests/test_util.py
  function test_get_today_and_now (line 48) | def test_get_today_and_now():
  function test_datetime2iso8601 (line 66) | def test_datetime2iso8601(value, expected):
  function test_get_version_integer (line 78) | def test_get_version_integer(version, expected):
  function test_get_version_integer_invalid_version (line 88) | def test_get_version_integer_invalid_version(invalid_version):
  function test_nspath_eval (line 100) | def test_nspath_eval(xpath_expression, expected):
  function test_nspath_eval_invalid_element (line 110) | def test_nspath_eval_invalid_element():
  function test_wktenvelope2bbox (line 127) | def test_wktenvelope2bbox(envelope, expected):
  function test_wkt2geom (line 139) | def test_wkt2geom(wkt, bounds, expected):
  function test_bbox2wktpolygon (line 156) | def test_bbox2wktpolygon(bbox, expected):
  function test_transform_mappings (line 161) | def test_transform_mappings():
  function test_getqattr_no_link (line 180) | def test_getqattr_no_link(name, value, expected):
  function test_getqattr_link (line 190) | def test_getqattr_link():
  function test_getqattr_invalid (line 200) | def test_getqattr_invalid():
  function test_http_request_post (line 205) | def test_http_request_post():
  function test_bind_url (line 230) | def test_bind_url(url, expected):
  function test_ip_in_network_cidr (line 240) | def test_ip_in_network_cidr(ip, netmask, expected):
  function test_ipaddress_in_whitelist (line 255) | def test_ipaddress_in_whitelist(ip, whitelist, expected):
  function test_jsonify_links (line 336) | def test_jsonify_links(linkstr, expected):
  function test_is_none_or_empty (line 349) | def test_is_none_or_empty(value, result):
  function test_programmatic_import (line 358) | def test_programmatic_import(import_path, expected_attribute):
  function test_programmatic_import_with_invalid_path (line 369) | def test_programmatic_import_with_invalid_path(invalid_import_path):
  function test_sanitize_url (line 374) | def test_sanitize_url():
  function test_str2bool (line 379) | def test_str2bool():
  function test_geojson_geometry2bbox (line 437) | def test_geojson_geometry2bbox(geometry, expected):

FILE: tests/unittests/test_wsgi.py
  function test_get_pycsw_root_path (line 49) | def test_get_pycsw_root_path(process_env, wsgi_env, fake_dir, expected):
  function test_get_configuration_path (line 87) | def test_get_configuration_path(process_env, wsgi_env, pycsw_root, expec...
  function test_compress_response (line 95) | def test_compress_response(compression_level):
  function test_application_no_gzip (line 105) | def test_application_no_gzip():
  function test_application_gzip (line 128) | def test_application_gzip():
Copy disabled (too large) Download .json
Condensed preview — 1359 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,428K chars).
[
  {
    "path": ".coveragerc",
    "chars": 182,
    "preview": "[run]\nbranch = True\nsource = pycsw\n\n[paths]\nsource =\n    pycsw\n    .tox/*/lib/python*/site-packages/pycsw\n    /usr/local"
  },
  {
    "path": ".dockerignore",
    "chars": 218,
    "preview": "# build artifacts\n*.pyc\n*.egg-info\nbuild\ndist\ndocs/_build\nMANIFEST\n\n# testing artifacts\ntests/index.html\ntests/results\n*"
  },
  {
    "path": ".gitattributes",
    "chars": 54,
    "preview": ".gitattributes export-ignore\n.gitignore export-ignore\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 270,
    "preview": "# These are supported funding model platforms\n\n#github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., ["
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 347,
    "preview": "# Description\n\n# Environment\n\n- operating system:\n- Python version:\n- pycsw version:\n- source/distribution\n  - [ ] git c"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 495,
    "preview": "# Overview\n\n# Related Issue / Discussion\n\n# Additional Information\n\n# Contributions and Licensing\n\n(as per https://githu"
  },
  {
    "path": ".github/workflows/docker.yml",
    "chars": 2719,
    "preview": "# Triggers a Docker workflow on completion of the \"build\" workflow but\n# pushes to DockerHub\n#\n# Author: Just van den Br"
  },
  {
    "path": ".github/workflows/ghcr.yml",
    "chars": 2265,
    "preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 1397,
    "preview": "name: build ⚙️\n\non: \n  push:\n    branches:\n      - master\n    paths-ignore:\n      - '**.md'  \n  pull_request:\n    branch"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 1748,
    "preview": "name: 'Close stale Issues and Pull Requests'\n\nenv:\n  STALE_AFTER_INACTIVE_DAYS: 90\n  CLOSE_AFTER_INACTIVE_DAYS: 7\n\non:\n "
  },
  {
    "path": ".github/workflows/vulnerabilities.yml",
    "chars": 1213,
    "preview": "name: Check vulnerabilities\n\non:\n  push:\n    paths-ignore:\n      - '**.md'\n  pull_request:\n    branches:\n      - master\n"
  },
  {
    "path": ".gitignore",
    "chars": 394,
    "preview": "# build artifacts\n*.pyc\n*.egg-info\nbuild\ndist\ndocs/_build\nMANIFEST\n\n# testing artifacts\ntests/index.html\ntests/results\n*"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 596,
    "preview": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3224,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "COMMITTERS.txt",
    "chars": 765,
    "preview": "============== ===================== ================================== ==================================\nLogin(s)     "
  },
  {
    "path": "CONTRIBUTING.rst",
    "chars": 7128,
    "preview": "Contributing to pycsw\n=====================\n\nThe pycsw project openly welcomes contributions (bug reports, bug fixes, co"
  },
  {
    "path": "Dockerfile",
    "chars": 3072,
    "preview": "# =================================================================\n# Authors: Ricardo Garcia Silva <ricardo.garcia.silv"
  },
  {
    "path": "HISTORY.txt",
    "chars": 122,
    "preview": "pycsw Revision History\n===========================\n\nSee http://github.com/geopython/pycsw for commit and release history"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1238,
    "preview": "The MIT License (MIT)\n=====================\n\nCopyright &copy; 2010-2026 Tom Kralidis\nCopyright &copy; 2011-2026 Angelos "
  },
  {
    "path": "MANIFEST.in",
    "chars": 88,
    "preview": "recursive-include pycsw *.xsd *.yaml *.html *.png *.ico\ninclude *.txt\ninclude README.md\n"
  },
  {
    "path": "README.md",
    "chars": 1664,
    "preview": "# pycsw\n\n[![DOI](https://zenodo.org/badge/2367090.svg)](https://zenodo.org/badge/latestdoi/2367090)\n[![Build Status](htt"
  },
  {
    "path": "SECURITY.md",
    "chars": 800,
    "preview": "# pycsw Security Policy\n\n## Reporting\n\nSecurity/vulnerability reports **should not** be submitted through GitHub issues "
  },
  {
    "path": "csw.py",
    "chars": 1533,
    "preview": "#!/usr/bin/python3 -u\n# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Au"
  },
  {
    "path": "default-sample.yml",
    "chars": 4586,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n# "
  },
  {
    "path": "docker/compose/docker-compose.scale.yml",
    "chars": 2439,
    "preview": "# =================================================================\n#\n# Authors: Ricardo Garcia Silva <ricardo.garcia.si"
  },
  {
    "path": "docker/compose/docker-compose.yml",
    "chars": 2374,
    "preview": "# =================================================================\n#\n# Authors: Ricardo Garcia Silva <ricardo.garcia.si"
  },
  {
    "path": "docker/compose/pycsw.yml",
    "chars": 3655,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n# "
  },
  {
    "path": "docker/entrypoint.py",
    "chars": 4703,
    "preview": "#!/usr/bin/env python3\n# =================================================================\n#\n# Authors: Ricardo Garcia S"
  },
  {
    "path": "docker/helm/Chart.yaml",
    "chars": 108,
    "preview": "apiVersion: v2\nname: pycsw\ndescription: A Helm chart for pycsw\nversion: 3.0.0-beta2\nappVersion: 3.0.0-beta2\n"
  },
  {
    "path": "docker/helm/README.md",
    "chars": 316,
    "preview": "# Helm chart for pycsw services\n\nDebug with:\n\n```bash\nhelm install --dry-run --debug pycsw .\n```\nTest template rendering"
  },
  {
    "path": "docker/helm/templates/db-data-persistentvolumeclaim.yaml",
    "chars": 478,
    "preview": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  namespace: {{ .Values.global.namespace }}\n  creationTimestamp: nu"
  },
  {
    "path": "docker/helm/templates/db-service.yaml",
    "chars": 332,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  namespace: {{ .Values.global.namespace }}\n  labels:\n    io.kompose.service: {{ "
  },
  {
    "path": "docker/helm/templates/db-statefulset.yaml",
    "chars": 1455,
    "preview": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n  namespace: {{ .Values.global.namespace }}\n  labels:\n    io.kompose.ser"
  },
  {
    "path": "docker/helm/templates/pycsw-configmap.yaml",
    "chars": 243,
    "preview": "apiVersion: v1\ndata:\n  pycsw.yml: |+\n{{- if .Values.pycsw.config }}\n  {{- toYaml .Values.pycsw.config | nindent 4 -}}\n{{"
  },
  {
    "path": "docker/helm/templates/pycsw-deployment.yaml",
    "chars": 1169,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  namespace: {{ .Values.global.namespace }}\n  labels:\n    io.kompose.serv"
  },
  {
    "path": "docker/helm/templates/pycsw-service.yaml",
    "chars": 752,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  namespace: {{ .Values.global.namespace }}\n  labels:\n    io.kompose.service: {{ "
  },
  {
    "path": "docker/helm/values.yaml",
    "chars": 3252,
    "preview": "global:\n  namespace: default\n\ndb:\n  name: db\n  image: postgis/postgis:17-3.5\n  port: 5432\n  database: pycsw\n  user: post"
  },
  {
    "path": "docker/kubernetes/Makefile",
    "chars": 677,
    "preview": "\nPYCSW_DOCKER_IMAGE=latest\n\nconvert:\n\tPYCSW_DOCKER_IMAGE=$(PYCSW_DOCKER_IMAGE) kompose convert --volumes hostPath\n\nup:\n\t"
  },
  {
    "path": "docker/kubernetes/db-data-persistentvolumeclaim.yaml",
    "chars": 235,
    "preview": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  creationTimestamp: null\n  labels:\n    io.kompose.service: db-data"
  },
  {
    "path": "docker/kubernetes/db-deployment.yaml",
    "chars": 974,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    io.kompose.service: db\n  name: db\nspec:\n  replicas: 1\n  sel"
  },
  {
    "path": "docker/kubernetes/db-service.yaml",
    "chars": 221,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: db\n  name: db\nspec:\n  ports:\n  - name: \"5432\"\n "
  },
  {
    "path": "docker/kubernetes/pycsw-configmap.yaml",
    "chars": 4761,
    "preview": "apiVersion: v1\ndata:\n  pycsw.yml: |+\n    # =================================================================\n    #\n    #"
  },
  {
    "path": "docker/kubernetes/pycsw-deployment.yaml",
    "chars": 906,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    io.kompose.service: pycsw\n  name: pycsw\nspec:\n  replicas: 1"
  },
  {
    "path": "docker/kubernetes/pycsw-service.yaml",
    "chars": 233,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  labels:\n    io.kompose.service: pycsw\n  name: pycsw\nspec:\n  type: NodePort\n  po"
  },
  {
    "path": "docker/min-apk",
    "chars": 129,
    "preview": "#!/bin/sh -e\n\napk --update add $@ && rm -rf /var/cache/apk/* || false\n\nstrip --strip-unneeded --strip-debug /usr/lib/*.a"
  },
  {
    "path": "docker/pycsw.yml",
    "chars": 3709,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n# "
  },
  {
    "path": "docs/Makefile",
    "chars": 5585,
    "preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD "
  },
  {
    "path": "docs/_static/favicon/browserconfig.xml",
    "chars": 246,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo"
  },
  {
    "path": "docs/_templates/indexsidebar.html",
    "chars": 3915,
    "preview": "<p>\n    <img style=\"background: white;\" alt=\"pycsw\" src=\"https://raw.githubusercontent.com/geopython/pycsw/master/docs/_"
  },
  {
    "path": "docs/_templates/layout.html",
    "chars": 1490,
    "preview": "{% extends \"!layout.html\" %}\n\n{%- block extrahead %}\n{{ super() }}\n\n<script type=\"text/javascript\">\n\n  var _gaq = _gaq |"
  },
  {
    "path": "docs/administration.rst",
    "chars": 13926,
    "preview": ".. _administration:\n\nAdministration\n==============\n\npycsw administration is handled by the ``pycsw-admin.py`` utility.  "
  },
  {
    "path": "docs/api.rst",
    "chars": 2168,
    "preview": ".. _api:\n\nAPI\n===\n\nPython applications can integrate pycsw into their custom workflows.  This\nallows for seamless intega"
  },
  {
    "path": "docs/ckan.rst",
    "chars": 1100,
    "preview": ".. _ckan:\n\nCKAN Configuration\n==================\n\nCKAN (https://ckan.org) is a powerful data management system that make"
  },
  {
    "path": "docs/committers.rst",
    "chars": 71,
    "preview": ".. _committers:\n\nCommitters\n==========\n\n.. include:: ../COMMITTERS.txt\n"
  },
  {
    "path": "docs/conf.py",
    "chars": 10986,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "docs/configuration.rst",
    "chars": 9966,
    "preview": ".. _configuration:\n\nConfiguration\n=============\n\npycsw's runtime configuration is defined by ``default.yml``.  pycsw shi"
  },
  {
    "path": "docs/contributing.rst",
    "chars": 52,
    "preview": ".. _contributing:\n\n.. include:: ../CONTRIBUTING.rst\n"
  },
  {
    "path": "docs/csw-support.rst",
    "chars": 1267,
    "preview": ".. _csw-support:\n\nCSW Support\n===========\n\nVersions\n--------\n\npycsw supports both CSW 2.0.2 and 3.0.0 versions by defaul"
  },
  {
    "path": "docs/distributedsearching.rst",
    "chars": 6174,
    "preview": ".. _distributedsearching:\n\nDistributed Searching\n=====================\n\n.. note::\n\n   - in CSW mode, distributed search "
  },
  {
    "path": "docs/docker.rst",
    "chars": 7089,
    "preview": "Docker\n======\n\nInstallation\n------------\n\npycsw  provides an official `Docker`_ image which is made available on both th"
  },
  {
    "path": "docs/geonode.rst",
    "chars": 1185,
    "preview": ".. _geonode:\n\nGeoNode Configuration\n======================\n\nGeoNode (https://geonode.org/) is a platform for the managem"
  },
  {
    "path": "docs/hhypermap.rst",
    "chars": 1241,
    "preview": ".. _hhypermap:\n\nHHypermap-Registry Configuration\n================================\n\nHHypermap (Harvard Hypermap) Registry"
  },
  {
    "path": "docs/html-templating.rst",
    "chars": 2253,
    "preview": ".. _html-templating:\n\nHTML Templating\n===============\n\npycsw uses `Jinja`_ as its templating engine to render HTML and `"
  },
  {
    "path": "docs/index.rst",
    "chars": 808,
    "preview": ".. _index:\n\n=============================\npycsw |release| Documentation\n=============================\n\n.. image:: https:"
  },
  {
    "path": "docs/installation.rst",
    "chars": 8534,
    "preview": ".. _installation:\n\nInstallation\n============\n\nSystem Requirements\n-------------------\n\npycsw is written in `Python <http"
  },
  {
    "path": "docs/introduction.rst",
    "chars": 7471,
    "preview": ".. _introduction:\n\nIntroduction\n============\n\npycsw is an OGC API - Records and OGC CSW server implementation written in"
  },
  {
    "path": "docs/json.rst",
    "chars": 411,
    "preview": ".. _json:\n\nJSON Support\n============\n\nOGC API - Records\n-----------------\n\npycsw fully supports the OGC API - Records JS"
  },
  {
    "path": "docs/license.rst",
    "chars": 311,
    "preview": ".. _license:\n\nLicense\n=======\n\n.. include:: ../LICENSE.txt\n\nDocumentation\n-------------\n\nThe documentation is released u"
  },
  {
    "path": "docs/locale/el/LC_MESSAGES/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/locale/fr/LC_MESSAGES/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/administration.po",
    "chars": 13712,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/api.po",
    "chars": 2484,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/ckan.po",
    "chars": 1956,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/committers.po",
    "chars": 2013,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-05-28 11:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/configuration.po",
    "chars": 18341,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/contributing.po",
    "chars": 11962,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/csw-support.po",
    "chars": 2081,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/distributedsearching.po",
    "chars": 5950,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/docker.po",
    "chars": 7406,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/geonode.po",
    "chars": 2789,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/hhypermap.po",
    "chars": 2738,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/index.po",
    "chars": 969,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2018-12-05 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/installation.po",
    "chars": 10491,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/introduction.po",
    "chars": 12288,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/json.po",
    "chars": 1449,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/license.po",
    "chars": 2646,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/migration-guide.po",
    "chars": 4450,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/oaipmh.po",
    "chars": 1609,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/oarec-support.po",
    "chars": 2475,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2022, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/odc.po",
    "chars": 2790,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2016-12-17 17:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/opensearch.po",
    "chars": 5506,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/outputschemas.po",
    "chars": 2688,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2018-12-05 20:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/profiles.po",
    "chars": 10224,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2018-12-05 20:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/repofilters.po",
    "chars": 4092,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/repositories.po",
    "chars": 3221,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2015, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/sitemaps.po",
    "chars": 890,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2015-11-23 21:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/soap.po",
    "chars": 832,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/sru.po",
    "chars": 1504,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/stac.po",
    "chars": 2034,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2010-2022, Tom Kralidis This work is licensed under a\n# Creative Commons Attri"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/support.po",
    "chars": 759,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/testing.po",
    "chars": 22173,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/tools.po",
    "chars": 4029,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/locale/zh/LC_MESSAGES/transactions.po",
    "chars": 8253,
    "preview": "#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pycsw 2.0-dev\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2022-03-08 22:"
  },
  {
    "path": "docs/metadata-model-reference.rst",
    "chars": 18332,
    "preview": ".. _metadata-model-reference:\n\nMetadata Model Reference\n========================\n\npycsw's metadata repository model is d"
  },
  {
    "path": "docs/migration-guide.rst",
    "chars": 3099,
    "preview": ".. _migration-guide:\n\npycsw Migration Guide\n=====================\n\nThis page provides migration support across pycsw ver"
  },
  {
    "path": "docs/oaipmh.rst",
    "chars": 883,
    "preview": ".. _oaipmh:\n\nOAI-PMH Support\n===============\n\npycsw supports the `The Open Archives Initiative Protocol for Metadata Har"
  },
  {
    "path": "docs/oarec-support.rst",
    "chars": 4149,
    "preview": ".. _oarec-support:\n\nOGC API - Records Support\n=========================\n\nVersions\n--------\n\npycsw supports `OGC API - Re"
  },
  {
    "path": "docs/odc.rst",
    "chars": 1489,
    "preview": ".. _odc:\n\nOpen Data Catalog Configuration\n===============================\n\nOpen Data Catalog (https://github.com/azavea/"
  },
  {
    "path": "docs/opensearch.rst",
    "chars": 3801,
    "preview": ".. _opensearch:\n\nOpenSearch Support\n==================\n\npycsw OpenSearch support is enabled by default.  There are two w"
  },
  {
    "path": "docs/outputschemas.rst",
    "chars": 1415,
    "preview": ".. _outputschemas:\n\nOutput Schema Plugins\n=====================\n\nOverview\n--------\n\npycsw allows for extending the imple"
  },
  {
    "path": "docs/profiles.rst",
    "chars": 2519,
    "preview": ".. _profiles:\n\nProfile Plugins\n===============\n\nOverview\n--------\n\npycsw allows for the implementation of profiles to th"
  },
  {
    "path": "docs/pubsub.rst",
    "chars": 2020,
    "preview": ".. _pubsub:\n\nPublish-Subscribe integration (Pub/Sub)\n=======================================\n\npycsw supports Publish-Sub"
  },
  {
    "path": "docs/repofilters.rst",
    "chars": 2372,
    "preview": ".. _repofilters:\n\nRepository Filters\n==================\n\npycsw has the ability to perform server side repository / datab"
  },
  {
    "path": "docs/repositories.rst",
    "chars": 1505,
    "preview": ".. _repositories:\n\nRepository Plugins\n==================\n\nOverview\n--------\n\npycsw allows for the implementation of cust"
  },
  {
    "path": "docs/requirements-mocked.txt",
    "chars": 189,
    "preview": "# This file holds some fake requirements to fool the readthedocs service into\n# building the documentation. For more inf"
  },
  {
    "path": "docs/sitemaps.rst",
    "chars": 414,
    "preview": ".. _sitemaps:\n\nXML Sitemaps\n============\n\n`XML Sitemaps`_ can be generated by running:\n\n.. code-block:: bash\n\n  pycsw-ad"
  },
  {
    "path": "docs/soap.rst",
    "chars": 210,
    "preview": ".. _soap:\n\nSOAP\n====\n\npycsw's CSW implementation supports handling of SOAP encoded requests and responses as per subclau"
  },
  {
    "path": "docs/sru.rst",
    "chars": 847,
    "preview": ".. _sru:\n\nSearch/Retrieval via URL (SRU) Support\n======================================\n\npycsw supports the `Search/Retr"
  },
  {
    "path": "docs/stac.rst",
    "chars": 5646,
    "preview": ".. _stac:\n\nSpatioTemporal Asset Catalog (STAC) API Support\n===============================================\n\nVersions\n---"
  },
  {
    "path": "docs/support.rst",
    "chars": 213,
    "preview": ".. _support:\n\nSupport\n=======\n\nCommunity\n---------\n\nPlease see the `Community`_ page for information on the pycsw commun"
  },
  {
    "path": "docs/testing.rst",
    "chars": 10451,
    "preview": ".. _tests:\n\nTesting\n=======\n\nThere are a number of test suites that perform mostly functional testing.\nThese tests ensur"
  },
  {
    "path": "docs/tools.rst",
    "chars": 1158,
    "preview": ".. _tools:\n\nCataloguing and Metadata Tools\n==============================\n\nOGC API - Records Clients and Servers\n-------"
  },
  {
    "path": "docs/transactions.rst",
    "chars": 7421,
    "preview": ".. _transactions:\n\nTransactions using CSW\n======================\n\npycsw's CSW implementation has the ability to process "
  },
  {
    "path": "docs/xslt.rst",
    "chars": 813,
    "preview": ".. _xslt:\n\nXSLT Support\n============\n\nBy default, pycsw performs metadata transformations using a generic framework\nthat"
  },
  {
    "path": "etc/harvest-all.cron",
    "chars": 211,
    "preview": "# run cronjob daily at 0400h\n#\n# info on setting up cron at http://www.unixgeeks.org/security/newbie/unix/cron-1.html\n\n0"
  },
  {
    "path": "etc/mappings.py",
    "chars": 4246,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "etc/migrations/2.x-3.0/migrate.sql",
    "chars": 539,
    "preview": "alter table records add column metadata TEXT;\nalter table records add column metadata_type TEXT default 'application/xml"
  },
  {
    "path": "etc/pycsw",
    "chars": 119,
    "preview": "<Directory /var/www/pycsw>\n  Options FollowSymLinks +ExecCGI\n  Allow from all\n  AddHandler cgi-script .py\n</Directory>\n"
  },
  {
    "path": "etc/pycsw.conf",
    "chars": 130,
    "preview": "<Directory /var/www/html/pycsw>\n  Options +FollowSymLinks +ExecCGI\n  Require all granted\n  AddHandler cgi-script .py\n</D"
  },
  {
    "path": "etc/pycsw.desktop",
    "chars": 262,
    "preview": "[Desktop Entry]\nType=Application\nEncoding=UTF-8\nName=pycsw\nComment=pycsw catalog server\nExec=xdg-open http://localhost/p"
  },
  {
    "path": "pycsw/__init__.py",
    "chars": 1443,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/broker/__init__.py",
    "chars": 1792,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n#\n"
  },
  {
    "path": "pycsw/broker/base.py",
    "chars": 2588,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n#\n"
  },
  {
    "path": "pycsw/broker/http.py",
    "chars": 3351,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n# "
  },
  {
    "path": "pycsw/broker/mqtt.py",
    "chars": 3786,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n#\n"
  },
  {
    "path": "pycsw/core/__init__.py",
    "chars": 1311,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/admin.py",
    "chars": 22912,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/config.py",
    "chars": 29390,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/etree.py",
    "chars": 1713,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/formats/__init__.py",
    "chars": 1311,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/formats/fmt_json.py",
    "chars": 2377,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/log.py",
    "chars": 2380,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/metadata.py",
    "chars": 87663,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/pygeofilter_evaluate.py",
    "chars": 4541,
    "preview": "# =================================================================\n#\n# Authors: Tom Kralidis <tomkralidis@gmail.com>\n#\n"
  },
  {
    "path": "pycsw/core/repository.py",
    "chars": 39531,
    "preview": "# -*- coding: utf-8 -*-\n# =================================================================\n#\n# Authors: Tom Kralidis <t"
  },
  {
    "path": "pycsw/core/schemas/catalog.xml",
    "chars": 2140,
    "preview": "<?xml version=\"1.0\"?>\n<!--\n# =================================================================\n#\n# Authors: Tom Kralidis"
  },
  {
    "path": "pycsw/core/schemas/ogc/OGC-SOFTWARE-NOTICE.txt",
    "chars": 2179,
    "preview": "OGC Software Notice\n\nThis OGC work (including software, documents, or other related items) is being provided by the copy"
  },
  {
    "path": "pycsw/core/schemas/ogc/README.txt",
    "chars": 377,
    "preview": "\nThese schemas are shipped with pycsw to support realtime XML validation.\n\nThe schemas have been downloaded from the off"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/README.txt",
    "chars": 880,
    "preview": "# 2015-02-13\n\nThe unofficial CSW 3.0 schema can be tested from here.\n\nhttp://test.schemas.opengis.net/csw/3.0/\n\nI did ma"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/_wrapper.xsd",
    "chars": 482,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!--\n\nthis XSD is added by pycsw for lxml/libxml2 validation against a single sc"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswAll.xsd",
    "chars": 1476,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswCommon.xsd",
    "chars": 3435,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswGetCapabilities.xsd",
    "chars": 3745,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswGetDomain.xsd",
    "chars": 6712,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswGetRecordById.xsd",
    "chars": 2885,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswGetRecords.xsd",
    "chars": 18973,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswHarvest.xsd",
    "chars": 4840,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswTransaction.xsd",
    "chars": 8650,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/cswUnHarvest.xsd",
    "chars": 3613,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/rec-dcmes.xsd",
    "chars": 11528,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xs:schema\n   targetNamespace=\"http://purl.org/dc/elements/1.1/\"\n   xmlns:xs=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/rec-dcterms.xsd",
    "chars": 4677,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n   xmlns:dct=\"http://purl."
  },
  {
    "path": "pycsw/core/schemas/ogc/cat/csw/3.0/record.xsd",
    "chars": 7705,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/cat/csw/3.0\"\n   xmlns:csw3"
  },
  {
    "path": "pycsw/core/schemas/ogc/csw/2.0.2/CSW-discovery.xsd",
    "chars": 23780,
    "preview": "<?xml version=\"1.0\"?>\n<xsd:schema\n   id=\"csw-discovery\"\n   targetNamespace=\"http://www.opengis.net/cat/csw/2.0.2\"\n   xml"
  },
  {
    "path": "pycsw/core/schemas/ogc/csw/2.0.2/CSW-publication.xsd",
    "chars": 11429,
    "preview": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<xsd:schema id=\"csw-publication\"\n   targetNamespace=\"http://www.opengis.net/"
  },
  {
    "path": "pycsw/core/schemas/ogc/csw/2.0.2/rec-dcmes.xsd",
    "chars": 10669,
    "preview": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<xs:schema id=\"dcmes\" targetNamespace=\"http://purl.org/dc/elements/1.1/\"\n   "
  },
  {
    "path": "pycsw/core/schemas/ogc/csw/2.0.2/rec-dcterms.xsd",
    "chars": 4627,
    "preview": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<xs:schema id=\"dcmi-terms\" targetNamespace=\"http://purl.org/dc/terms/\"\n   xm"
  },
  {
    "path": "pycsw/core/schemas/ogc/csw/2.0.2/record.xsd",
    "chars": 6259,
    "preview": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<xsd:schema id=\"csw-record\"\n   targetNamespace=\"http://www.opengis.net/cat/c"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/1.1.0/expr.xsd",
    "chars": 2740,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema targetNamespace=\"http://www.opengis.net/ogc\"\n   xmlns:ogc=\"http://www"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/1.1.0/filter.xsd",
    "chars": 10718,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema targetNamespace=\"http://www.opengis.net/ogc\"\n   xmlns:ogc=\"http://www"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/1.1.0/filterCapabilities.xsd",
    "chars": 6846,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/ogc\"\n   xmlns:ogc=\"http://"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/1.1.0/sort.xsd",
    "chars": 1701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/ogc\"\n   xmlns:ogc=\"http://"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/_wrapper.xsd",
    "chars": 422,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xs:schema targetNamespace=\"http://www.opengis.net/fes/2.0\" elementFormDefault=\"q"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/expr.xsd",
    "chars": 1472,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/fes/2.0\"\n   xmlns:fes=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/filter.xsd",
    "chars": 17082,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/fes/2.0\"\n   xmlns:fes=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/filterAll.xsd",
    "chars": 843,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/fes/2.0\"\n   xmlns:fes=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/filterCapabilities.xsd",
    "chars": 11289,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/fes/2.0\"\n   xmlns:fes=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/query.xsd",
    "chars": 2819,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/fes/2.0\"\n   xmlns:fes=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/filter/2.0/sort.xsd",
    "chars": 1847,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsd:schema\n   targetNamespace=\"http://www.opengis.net/fes/2.0\"\n   xmlns:fes=\"htt"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/basicTypes.xsd",
    "chars": 13997,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns=\"http://www.w3.org/200"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/coordinateOperations.xsd",
    "chars": 45706,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/coordinateReferenceSystems.xsd",
    "chars": 22652,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns=\"http://www.w3.org/200"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/coordinateSystems.xsd",
    "chars": 23617,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/coverage.xsd",
    "chars": 21443,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:xlink=\"http://www.w3.o"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/dataQuality.xsd",
    "chars": 6671,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/datums.xsd",
    "chars": 25706,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/defaultStyle.xsd",
    "chars": 19322,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns=\"http://www.w3.org/200"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/dictionary.xsd",
    "chars": 9121,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" elementFormDefault=\"qualifie"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/direction.xsd",
    "chars": 3144,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/dynamicFeature.xsd",
    "chars": 5235,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/feature.xsd",
    "chars": 9161,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns=\"http://www.w3.org/200"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/geometryAggregates.xsd",
    "chars": 28319,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns=\"http://www.w3.org/200"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/geometryBasic0d1d.xsd",
    "chars": 33035,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by David Burggraf "
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/geometryBasic2d.xsd",
    "chars": 12964,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (i"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/geometryComplexes.xsd",
    "chars": 8020,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:xlink=\"http://www.w3.o"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/geometryPrimitives.xsd",
    "chars": 89623,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by Clemens Portele (i"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/gml.xsd",
    "chars": 1297,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:xsd=\"http://www.w3.org"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/gmlBase.xsd",
    "chars": 17865,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:xsi=\"http://www.w3.org"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/grids.xsd",
    "chars": 3861,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns:gml=\"http://www.opengi"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/measures.xsd",
    "chars": 11119,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" elementFormDefault=\"qualifie"
  },
  {
    "path": "pycsw/core/schemas/ogc/gml/3.1.1/base/observation.xsd",
    "chars": 4431,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<schema targetNamespace=\"http://www.opengis.net/gml\" xmlns=\"http://www.w3.org/200"
  }
]

// ... and 1159 more files (download for full content)

About this extraction

This page contains the full source code of the geopython/pycsw GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1359 files (9.3 MB), approximately 2.5M tokens, and a symbol index with 481 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!