MapProxy 2.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- MapProxy-2.1.0.dist-info/AUTHORS.txt +33 -0
- MapProxy-2.1.0.dist-info/COPYING.txt +60 -0
- MapProxy-2.1.0.dist-info/LICENSE.txt +202 -0
- MapProxy-2.1.0.dist-info/METADATA +165 -0
- MapProxy-2.1.0.dist-info/RECORD +459 -0
- MapProxy-2.1.0.dist-info/WHEEL +5 -0
- MapProxy-2.1.0.dist-info/entry_points.txt +4 -0
- MapProxy-2.1.0.dist-info/top_level.txt +1 -0
- mapproxy/__init__.py +0 -0
- mapproxy/cache/__init__.py +36 -0
- mapproxy/cache/azureblob.py +145 -0
- mapproxy/cache/base.py +120 -0
- mapproxy/cache/compact.py +665 -0
- mapproxy/cache/couchdb.py +301 -0
- mapproxy/cache/dummy.py +36 -0
- mapproxy/cache/file.py +200 -0
- mapproxy/cache/geopackage.py +647 -0
- mapproxy/cache/legend.py +87 -0
- mapproxy/cache/mbtiles.py +411 -0
- mapproxy/cache/meta.py +80 -0
- mapproxy/cache/path.py +261 -0
- mapproxy/cache/redis.py +152 -0
- mapproxy/cache/renderd.py +100 -0
- mapproxy/cache/riak.py +206 -0
- mapproxy/cache/s3.py +209 -0
- mapproxy/cache/tile.py +736 -0
- mapproxy/client/__init__.py +0 -0
- mapproxy/client/arcgis.py +82 -0
- mapproxy/client/cgi.py +141 -0
- mapproxy/client/http.py +295 -0
- mapproxy/client/log.py +33 -0
- mapproxy/client/tile.py +158 -0
- mapproxy/client/wms.py +255 -0
- mapproxy/compat/__init__.py +0 -0
- mapproxy/compat/image.py +86 -0
- mapproxy/config/__init__.py +22 -0
- mapproxy/config/config-schema.json +813 -0
- mapproxy/config/config.py +213 -0
- mapproxy/config/coverage.py +108 -0
- mapproxy/config/defaults.py +102 -0
- mapproxy/config/loader.py +2399 -0
- mapproxy/config/spec.py +657 -0
- mapproxy/config/validator.py +242 -0
- mapproxy/config_template/__init__.py +0 -0
- mapproxy/config_template/base_config/config.wsgi +10 -0
- mapproxy/config_template/base_config/full_example.yaml +598 -0
- mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
- mapproxy/config_template/base_config/log.ini +35 -0
- mapproxy/config_template/base_config/mapproxy.yaml +60 -0
- mapproxy/config_template/base_config/seed.yaml +27 -0
- mapproxy/exception.py +149 -0
- mapproxy/featureinfo.py +251 -0
- mapproxy/grid.py +1199 -0
- mapproxy/image/__init__.py +549 -0
- mapproxy/image/fonts/DejaVuSans.ttf +0 -0
- mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
- mapproxy/image/fonts/LICENSE +99 -0
- mapproxy/image/fonts/__init__.py +0 -0
- mapproxy/image/mask.py +79 -0
- mapproxy/image/merge.py +323 -0
- mapproxy/image/message.py +357 -0
- mapproxy/image/opts.py +185 -0
- mapproxy/image/tile.py +171 -0
- mapproxy/image/transform.py +350 -0
- mapproxy/layer.py +489 -0
- mapproxy/multiapp.py +230 -0
- mapproxy/proj.py +309 -0
- mapproxy/request/__init__.py +18 -0
- mapproxy/request/arcgis.py +268 -0
- mapproxy/request/base.py +466 -0
- mapproxy/request/tile.py +131 -0
- mapproxy/request/wms/__init__.py +829 -0
- mapproxy/request/wms/exception.py +107 -0
- mapproxy/request/wmts.py +442 -0
- mapproxy/response.py +237 -0
- mapproxy/script/__init__.py +0 -0
- mapproxy/script/conf/__init__.py +0 -0
- mapproxy/script/conf/app.py +222 -0
- mapproxy/script/conf/caches.py +44 -0
- mapproxy/script/conf/geopackage.py +136 -0
- mapproxy/script/conf/layers.py +54 -0
- mapproxy/script/conf/seeds.py +36 -0
- mapproxy/script/conf/sources.py +88 -0
- mapproxy/script/conf/utils.py +148 -0
- mapproxy/script/defrag.py +187 -0
- mapproxy/script/export.py +337 -0
- mapproxy/script/grids.py +198 -0
- mapproxy/script/scales.py +134 -0
- mapproxy/script/util.py +410 -0
- mapproxy/script/wms_capabilities.py +160 -0
- mapproxy/seed/__init__.py +0 -0
- mapproxy/seed/cachelock.py +127 -0
- mapproxy/seed/cleanup.py +191 -0
- mapproxy/seed/config.py +481 -0
- mapproxy/seed/script.py +391 -0
- mapproxy/seed/seeder.py +551 -0
- mapproxy/seed/spec.py +66 -0
- mapproxy/seed/util.py +266 -0
- mapproxy/service/__init__.py +14 -0
- mapproxy/service/base.py +45 -0
- mapproxy/service/demo.py +364 -0
- mapproxy/service/kml.py +333 -0
- mapproxy/service/ows.py +39 -0
- mapproxy/service/template_helper.py +55 -0
- mapproxy/service/templates/demo/capabilities_demo.html +18 -0
- mapproxy/service/templates/demo/demo.html +181 -0
- mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
- mapproxy/service/templates/demo/static/img/blank.gif +0 -0
- mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
- mapproxy/service/templates/demo/static/logo.png +0 -0
- mapproxy/service/templates/demo/static/ol.css +345 -0
- mapproxy/service/templates/demo/static/ol.js +4 -0
- mapproxy/service/templates/demo/static/proj4.min.js +1 -0
- mapproxy/service/templates/demo/static/proj4defs.js +1 -0
- mapproxy/service/templates/demo/static/site.css +137 -0
- mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
- mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
- mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
- mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
- mapproxy/service/templates/demo/static.html +34 -0
- mapproxy/service/templates/demo/tms_demo.html +117 -0
- mapproxy/service/templates/demo/wms_demo.html +144 -0
- mapproxy/service/templates/demo/wmts_demo.html +118 -0
- mapproxy/service/templates/tms_capabilities.xml +13 -0
- mapproxy/service/templates/tms_exception.xml +4 -0
- mapproxy/service/templates/tms_root_resource.xml +7 -0
- mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
- mapproxy/service/templates/wms100capabilities.xml +112 -0
- mapproxy/service/templates/wms100exception.xml +4 -0
- mapproxy/service/templates/wms110capabilities.xml +152 -0
- mapproxy/service/templates/wms110exception.xml +5 -0
- mapproxy/service/templates/wms111capabilities.xml +183 -0
- mapproxy/service/templates/wms111exception.xml +5 -0
- mapproxy/service/templates/wms130capabilities.xml +326 -0
- mapproxy/service/templates/wms130exception.xml +8 -0
- mapproxy/service/templates/wmts100capabilities.xml +155 -0
- mapproxy/service/templates/wmts100exception.xml +9 -0
- mapproxy/service/tile.py +540 -0
- mapproxy/service/wms.py +868 -0
- mapproxy/service/wmts.py +387 -0
- mapproxy/source/__init__.py +83 -0
- mapproxy/source/arcgis.py +39 -0
- mapproxy/source/error.py +40 -0
- mapproxy/source/mapnik.py +262 -0
- mapproxy/source/tile.py +97 -0
- mapproxy/source/wms.py +273 -0
- mapproxy/srs.py +734 -0
- mapproxy/template.py +54 -0
- mapproxy/test/__init__.py +0 -0
- mapproxy/test/conftest.py +8 -0
- mapproxy/test/helper.py +255 -0
- mapproxy/test/http.py +511 -0
- mapproxy/test/image.py +219 -0
- mapproxy/test/mocker.py +2291 -0
- mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
- mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
- mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
- mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
- mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
- mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
- mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
- mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
- mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
- mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
- mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
- mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
- mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
- mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
- mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
- mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
- mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
- mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
- mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
- mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
- mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
- mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
- mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
- mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
- mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
- mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
- mapproxy/test/schemas/xml.xsd +287 -0
- mapproxy/test/system/__init__.py +98 -0
- mapproxy/test/system/fixture/arcgis.yaml +57 -0
- mapproxy/test/system/fixture/auth.yaml +70 -0
- mapproxy/test/system/fixture/cache.mbtiles +0 -0
- mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
- mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
- mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
- mapproxy/test/system/fixture/cache_coverage.yaml +84 -0
- mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
- mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
- mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
- mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
- mapproxy/test/system/fixture/cache_s3.yaml +58 -0
- mapproxy/test/system/fixture/cache_source.yaml +81 -0
- mapproxy/test/system/fixture/combined_sources.yaml +130 -0
- mapproxy/test/system/fixture/coverage.yaml +77 -0
- mapproxy/test/system/fixture/demo.yaml +135 -0
- mapproxy/test/system/fixture/dimension.yaml +59 -0
- mapproxy/test/system/fixture/disable_storage.yaml +25 -0
- mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
- mapproxy/test/system/fixture/formats.yaml +72 -0
- mapproxy/test/system/fixture/inspire.yaml +101 -0
- mapproxy/test/system/fixture/inspire_full.yaml +124 -0
- mapproxy/test/system/fixture/kml_layer.yaml +66 -0
- mapproxy/test/system/fixture/layer.yaml +260 -0
- mapproxy/test/system/fixture/layergroups.yaml +57 -0
- mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
- mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
- mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
- mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
- mapproxy/test/system/fixture/mapserver.yaml +23 -0
- mapproxy/test/system/fixture/minimal_cgi.py +16 -0
- mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
- mapproxy/test/system/fixture/multi_cache_layers.yaml +111 -0
- mapproxy/test/system/fixture/multiapp1.yaml +20 -0
- mapproxy/test/system/fixture/multiapp2.yaml +19 -0
- mapproxy/test/system/fixture/renderd_client.yaml +55 -0
- mapproxy/test/system/fixture/scalehints.yaml +70 -0
- mapproxy/test/system/fixture/seed.yaml +94 -0
- mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
- mapproxy/test/system/fixture/seed_old.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
- mapproxy/test/system/fixture/seedonly.yaml +51 -0
- mapproxy/test/system/fixture/sld.yaml +35 -0
- mapproxy/test/system/fixture/source_errors.yaml +84 -0
- mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
- mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
- mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
- mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
- mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
- mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
- mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
- mapproxy/test/system/fixture/util_grids.yaml +29 -0
- mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
- mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
- mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
- mapproxy/test/system/fixture/watermark.yaml +50 -0
- mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
- mapproxy/test/system/fixture/wms_versions.yaml +38 -0
- mapproxy/test/system/fixture/wmts.yaml +134 -0
- mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
- mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
- mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
- mapproxy/test/system/test_arcgis.py +156 -0
- mapproxy/test/system/test_auth.py +1133 -0
- mapproxy/test/system/test_behind_proxy.py +75 -0
- mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
- mapproxy/test/system/test_cache_azureblob.py +127 -0
- mapproxy/test/system/test_cache_band_merge.py +103 -0
- mapproxy/test/system/test_cache_coverage.py +168 -0
- mapproxy/test/system/test_cache_geopackage.py +144 -0
- mapproxy/test/system/test_cache_grid_names.py +89 -0
- mapproxy/test/system/test_cache_mbtiles.py +85 -0
- mapproxy/test/system/test_cache_s3.py +115 -0
- mapproxy/test/system/test_cache_source.py +146 -0
- mapproxy/test/system/test_combined_sources.py +335 -0
- mapproxy/test/system/test_coverage.py +140 -0
- mapproxy/test/system/test_decorate_img.py +214 -0
- mapproxy/test/system/test_demo.py +56 -0
- mapproxy/test/system/test_demo_with_extra_service.py +57 -0
- mapproxy/test/system/test_dimensions.py +279 -0
- mapproxy/test/system/test_disable_storage.py +42 -0
- mapproxy/test/system/test_formats.py +219 -0
- mapproxy/test/system/test_inspire_vs.py +173 -0
- mapproxy/test/system/test_kml.py +264 -0
- mapproxy/test/system/test_layergroups.py +160 -0
- mapproxy/test/system/test_legendgraphic.py +308 -0
- mapproxy/test/system/test_mapnik.py +162 -0
- mapproxy/test/system/test_mapserver.py +83 -0
- mapproxy/test/system/test_mixed_mode_format.py +201 -0
- mapproxy/test/system/test_multi_cache_layers.py +169 -0
- mapproxy/test/system/test_multiapp.py +92 -0
- mapproxy/test/system/test_refresh.py +206 -0
- mapproxy/test/system/test_renderd_client.py +304 -0
- mapproxy/test/system/test_response_headers.py +54 -0
- mapproxy/test/system/test_scalehints.py +140 -0
- mapproxy/test/system/test_seed.py +425 -0
- mapproxy/test/system/test_seed_only.py +93 -0
- mapproxy/test/system/test_sld.py +120 -0
- mapproxy/test/system/test_source_errors.py +377 -0
- mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
- mapproxy/test/system/test_tms.py +277 -0
- mapproxy/test/system/test_tms_origin.py +46 -0
- mapproxy/test/system/test_util_conf.py +434 -0
- mapproxy/test/system/test_util_export.py +210 -0
- mapproxy/test/system/test_util_grids.py +88 -0
- mapproxy/test/system/test_util_wms_capabilities.py +182 -0
- mapproxy/test/system/test_watermark.py +91 -0
- mapproxy/test/system/test_wms.py +1616 -0
- mapproxy/test/system/test_wms_srs_extent.py +165 -0
- mapproxy/test/system/test_wms_version.py +85 -0
- mapproxy/test/system/test_wmsc.py +116 -0
- mapproxy/test/system/test_wmts.py +334 -0
- mapproxy/test/system/test_wmts_dimensions.py +206 -0
- mapproxy/test/system/test_wmts_restful.py +198 -0
- mapproxy/test/system/test_xslt_featureinfo.py +423 -0
- mapproxy/test/test_http_helper.py +217 -0
- mapproxy/test/unit/__init__.py +0 -0
- mapproxy/test/unit/epsg +2 -0
- mapproxy/test/unit/polygons/polygons.dbf +0 -0
- mapproxy/test/unit/polygons/polygons.shp +0 -0
- mapproxy/test/unit/polygons/polygons.shx +0 -0
- mapproxy/test/unit/test_async.py +242 -0
- mapproxy/test/unit/test_auth.py +430 -0
- mapproxy/test/unit/test_cache.py +1356 -0
- mapproxy/test/unit/test_cache_azureblob.py +97 -0
- mapproxy/test/unit/test_cache_compact.py +324 -0
- mapproxy/test/unit/test_cache_couchdb.py +118 -0
- mapproxy/test/unit/test_cache_geopackage.py +256 -0
- mapproxy/test/unit/test_cache_redis.py +123 -0
- mapproxy/test/unit/test_cache_riak.py +80 -0
- mapproxy/test/unit/test_cache_s3.py +93 -0
- mapproxy/test/unit/test_cache_tile.py +477 -0
- mapproxy/test/unit/test_client.py +488 -0
- mapproxy/test/unit/test_client_arcgis.py +74 -0
- mapproxy/test/unit/test_client_cgi.py +140 -0
- mapproxy/test/unit/test_collections.py +116 -0
- mapproxy/test/unit/test_concat_legends.py +37 -0
- mapproxy/test/unit/test_conf_loader.py +1267 -0
- mapproxy/test/unit/test_conf_validator.py +427 -0
- mapproxy/test/unit/test_config.py +118 -0
- mapproxy/test/unit/test_decorate_img.py +185 -0
- mapproxy/test/unit/test_exceptions.py +270 -0
- mapproxy/test/unit/test_featureinfo.py +313 -0
- mapproxy/test/unit/test_file_lock_load.py +49 -0
- mapproxy/test/unit/test_geom.py +512 -0
- mapproxy/test/unit/test_grid.py +1279 -0
- mapproxy/test/unit/test_image.py +1051 -0
- mapproxy/test/unit/test_image_mask.py +181 -0
- mapproxy/test/unit/test_image_messages.py +209 -0
- mapproxy/test/unit/test_image_options.py +160 -0
- mapproxy/test/unit/test_isodate.py +118 -0
- mapproxy/test/unit/test_multiapp.py +163 -0
- mapproxy/test/unit/test_ogr_reader.py +51 -0
- mapproxy/test/unit/test_request.py +745 -0
- mapproxy/test/unit/test_request_wmts.py +178 -0
- mapproxy/test/unit/test_response.py +78 -0
- mapproxy/test/unit/test_seed.py +365 -0
- mapproxy/test/unit/test_seed_cachelock.py +91 -0
- mapproxy/test/unit/test_srs.py +215 -0
- mapproxy/test/unit/test_tiled_source.py +122 -0
- mapproxy/test/unit/test_tilefilter.py +31 -0
- mapproxy/test/unit/test_times.py +25 -0
- mapproxy/test/unit/test_timeutils.py +50 -0
- mapproxy/test/unit/test_util_conf_utils.py +75 -0
- mapproxy/test/unit/test_utils.py +476 -0
- mapproxy/test/unit/test_wms_capabilities.py +44 -0
- mapproxy/test/unit/test_wms_layer.py +113 -0
- mapproxy/test/unit/test_yaml.py +68 -0
- mapproxy/tilefilter.py +61 -0
- mapproxy/util/__init__.py +0 -0
- mapproxy/util/async_.py +229 -0
- mapproxy/util/collections.py +134 -0
- mapproxy/util/coverage.py +337 -0
- mapproxy/util/ext/__init__.py +14 -0
- mapproxy/util/ext/dictspec/__init__.py +1 -0
- mapproxy/util/ext/dictspec/spec.py +131 -0
- mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- mapproxy/util/ext/dictspec/test/test_validator.py +278 -0
- mapproxy/util/ext/dictspec/validator.py +194 -0
- mapproxy/util/ext/local.py +198 -0
- mapproxy/util/ext/lockfile.py +140 -0
- mapproxy/util/ext/odict.py +321 -0
- mapproxy/util/ext/serving.py +491 -0
- mapproxy/util/ext/tempita/__init__.py +1093 -0
- mapproxy/util/ext/tempita/_looper.py +163 -0
- mapproxy/util/ext/tempita/string_utils.py +24 -0
- mapproxy/util/ext/wmsparse/__init__.py +3 -0
- mapproxy/util/ext/wmsparse/duration.py +600 -0
- mapproxy/util/ext/wmsparse/parse.py +307 -0
- mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- mapproxy/util/ext/wmsparse/test/test_parse.py +111 -0
- mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
- mapproxy/util/ext/wmsparse/test/wms-example-111.xml +90 -0
- mapproxy/util/ext/wmsparse/test/wms-example-130.xml +120 -0
- mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
- mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
- mapproxy/util/ext/wmsparse/util.py +189 -0
- mapproxy/util/fs.py +164 -0
- mapproxy/util/geom.py +307 -0
- mapproxy/util/lib.py +117 -0
- mapproxy/util/lock.py +171 -0
- mapproxy/util/ogr.py +247 -0
- mapproxy/util/py.py +75 -0
- mapproxy/util/times.py +78 -0
- mapproxy/util/yaml.py +58 -0
- mapproxy/version.py +33 -0
- mapproxy/wsgiapp.py +167 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2022 Even Rouault
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import re
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from mapproxy.test.system import SysTest
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@pytest.fixture(scope="module")
|
|
23
|
+
def config_file():
|
|
24
|
+
return "demo.yaml"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TestDemo(SysTest):
|
|
28
|
+
|
|
29
|
+
def test_basic(self, app):
|
|
30
|
+
resp = app.get("/demo/", status=200)
|
|
31
|
+
assert resp.content_type == "text/html"
|
|
32
|
+
assert 'href="../service?REQUEST=GetCapabilities"' in resp
|
|
33
|
+
assert 'href="../service?REQUEST=GetCapabilities&tiled=true"' in resp
|
|
34
|
+
assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
|
|
35
|
+
assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
|
|
36
|
+
|
|
37
|
+
def test_previewmap(self, app):
|
|
38
|
+
resp = app.get("/demo/?srs=EPSG%3A3857&format=image%2Fpng&wms_layer=wms_cache", status=200)
|
|
39
|
+
assert resp.content_type == "text/html"
|
|
40
|
+
assert '<h2>Layer Preview - wms_cache</h2>' in resp
|
|
41
|
+
|
|
42
|
+
def test_layers_sorted_by_name(self, app):
|
|
43
|
+
resp = app.get("/demo/", status=200)
|
|
44
|
+
|
|
45
|
+
patternTable = re.compile(r'<table class="code">.*?</table>', re.DOTALL)
|
|
46
|
+
patternWMS = r'<td\s+rowspan="2">([\w\d-]+)</td>'
|
|
47
|
+
patternWMTS_TBS = r'<td\s+rowspan="1">([\w\d-]+)</td>'
|
|
48
|
+
tables = patternTable.findall(resp.text)
|
|
49
|
+
|
|
50
|
+
layersWMS = re.findall(patternWMS, resp.text, re.IGNORECASE)
|
|
51
|
+
layersWMTS = re.findall(patternWMTS_TBS, tables[1], re.IGNORECASE)
|
|
52
|
+
layersTBS = re.findall(patternWMTS_TBS, tables[2], re.IGNORECASE)
|
|
53
|
+
|
|
54
|
+
assert layersWMS == sorted(layersWMS)
|
|
55
|
+
assert layersWMTS == sorted(layersWMTS)
|
|
56
|
+
assert layersTBS == sorted(layersTBS)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2022 Even Rouault
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from mapproxy.service.demo import (
|
|
19
|
+
extra_demo_server_handlers, extra_substitution_handlers, register_extra_demo_server_handler,
|
|
20
|
+
register_extra_demo_substitution_handler)
|
|
21
|
+
from mapproxy.test.system import SysTest
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def demo_server_handler(demo_server, req):
|
|
25
|
+
if 'my_service' in req.args:
|
|
26
|
+
return 'my_return'
|
|
27
|
+
return None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def demo_substitution_handler(demo_server, req, substitutions):
|
|
31
|
+
substitutions['extra_services_html_beginning'] += '<h2>My extra service</h2>'
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.fixture(scope="module")
|
|
35
|
+
def config_file():
|
|
36
|
+
register_extra_demo_server_handler(demo_server_handler)
|
|
37
|
+
register_extra_demo_substitution_handler(demo_substitution_handler)
|
|
38
|
+
yield "demo.yaml"
|
|
39
|
+
extra_demo_server_handlers.clear()
|
|
40
|
+
extra_substitution_handlers.clear()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TestDemoWithExtraService(SysTest):
|
|
44
|
+
|
|
45
|
+
def test_basic(self, app):
|
|
46
|
+
resp = app.get("/demo/", status=200)
|
|
47
|
+
assert resp.content_type == "text/html"
|
|
48
|
+
assert 'href="../service?REQUEST=GetCapabilities"' in resp
|
|
49
|
+
assert 'href="../service?REQUEST=GetCapabilities&tiled=true"' in resp
|
|
50
|
+
assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
|
|
51
|
+
assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
|
|
52
|
+
assert '<h2>My extra service</h2>' in resp
|
|
53
|
+
|
|
54
|
+
def test_my_service(self, app):
|
|
55
|
+
resp = app.get("/demo/?my_service=bar", status=200)
|
|
56
|
+
assert resp.content_type == "text/html"
|
|
57
|
+
assert 'my_return' in resp
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
# you may not use this file except in compliance with the License.
|
|
4
|
+
# You may obtain a copy of the License at
|
|
5
|
+
#
|
|
6
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
#
|
|
8
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
# See the License for the specific language governing permissions and
|
|
12
|
+
# limitations under the License.
|
|
13
|
+
|
|
14
|
+
from __future__ import division
|
|
15
|
+
import pytest
|
|
16
|
+
from mapproxy.test.image import tmp_image
|
|
17
|
+
from mapproxy.test.http import mock_httpd
|
|
18
|
+
from mapproxy.test.system import SysTest
|
|
19
|
+
|
|
20
|
+
from mapproxy.request.wms import (
|
|
21
|
+
WMS100MapRequest,
|
|
22
|
+
WMS111MapRequest,
|
|
23
|
+
WMS130MapRequest,
|
|
24
|
+
WMS111CapabilitiesRequest,
|
|
25
|
+
WMS130CapabilitiesRequest,
|
|
26
|
+
WMS100CapabilitiesRequest,
|
|
27
|
+
WMS110MapRequest,
|
|
28
|
+
WMS110CapabilitiesRequest,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
expected_dim = {'time': {
|
|
32
|
+
'values': '2020-09-22T11:20:00Z,2020-09-22T13:20:00Z,2020-09-22T15:20:00Z',
|
|
33
|
+
'default': '2020-09-22T14:20:00Z'},
|
|
34
|
+
'dim_reference_time': {
|
|
35
|
+
'values': '2020-09-22T11:20:00Z,2020-09-22T13:20:00Z,2020-09-22T15:20:00Z',
|
|
36
|
+
'default': '2020-09-22T14:20:00Z'}}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture(scope="module")
|
|
40
|
+
def config_file():
|
|
41
|
+
return "dimension.yaml"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class TestDimensionsWMS130(SysTest):
|
|
45
|
+
|
|
46
|
+
def setup_method(self):
|
|
47
|
+
self.common_req = WMS130MapRequest(
|
|
48
|
+
url="/service?", param=dict(service="WMS", version="1.3.0")
|
|
49
|
+
)
|
|
50
|
+
self.common_map_req = WMS130MapRequest(
|
|
51
|
+
url="/service?",
|
|
52
|
+
param=dict(
|
|
53
|
+
service="WMS",
|
|
54
|
+
version="1.3.0",
|
|
55
|
+
bbox="-180,0,0,80",
|
|
56
|
+
width="200",
|
|
57
|
+
height="200",
|
|
58
|
+
layers="test_cache",
|
|
59
|
+
srs="EPSG:4326",
|
|
60
|
+
format="image/png",
|
|
61
|
+
styles="",
|
|
62
|
+
request="GetMap",
|
|
63
|
+
time="2020-09-22T14:20:00Z",
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def test_get_capabilities_dimension(self, app):
|
|
68
|
+
req = WMS130CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
69
|
+
self.common_req
|
|
70
|
+
)
|
|
71
|
+
resp = app.get(req)
|
|
72
|
+
xml = resp.lxml
|
|
73
|
+
|
|
74
|
+
dimensions = xml.xpath('//xmlns:Layer/xmlns:Dimension', namespaces=dict(xmlns="http://www.opengis.net/wms"))
|
|
75
|
+
results = dict()
|
|
76
|
+
|
|
77
|
+
for dimension in dimensions:
|
|
78
|
+
temp_dict = dict()
|
|
79
|
+
temp_dict['values'] = dimension.text
|
|
80
|
+
temp_dict['default'] = dimension.attrib['default']
|
|
81
|
+
results[dimension.attrib['name']] = temp_dict
|
|
82
|
+
|
|
83
|
+
assert set(list(expected_dim.keys())) == set(list(results.keys()))
|
|
84
|
+
|
|
85
|
+
assert expected_dim['time']['default'] == results['time']['default']
|
|
86
|
+
assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
|
|
87
|
+
assert expected_dim['time']['values'] == results['time']['values']
|
|
88
|
+
assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
|
|
89
|
+
|
|
90
|
+
def test_get_map_dimensions(self, app, cache_dir):
|
|
91
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
92
|
+
expected_req = (
|
|
93
|
+
{
|
|
94
|
+
"path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
|
|
95
|
+
"&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
|
|
96
|
+
"&VERSION=1.1.1&BBOX=0.0,0.0,20037508.3428,20037508.3428"
|
|
97
|
+
"&WIDTH=256&TIME=2020-09-22T14:20:00Z"
|
|
98
|
+
},
|
|
99
|
+
{"body": img.read(), "headers": {"content-type": "image/jpeg"}},
|
|
100
|
+
)
|
|
101
|
+
with mock_httpd(
|
|
102
|
+
("localhost", 42422), [expected_req], bbox_aware_query_comparator=True
|
|
103
|
+
):
|
|
104
|
+
self.common_map_req.params["bbox"] = "0,0,180,90"
|
|
105
|
+
resp = app.get(self.common_map_req)
|
|
106
|
+
assert 35000 < int(resp.headers["Content-length"]) < 75000
|
|
107
|
+
assert resp.content_type == "image/png"
|
|
108
|
+
|
|
109
|
+
assert cache_dir.join(
|
|
110
|
+
"test_cache_EPSG900913/time-2020-09-22T14:20:00Z/01/000/000/001/000/000/001.jpeg"
|
|
111
|
+
).check()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class TestDimensionsWMS111(SysTest):
|
|
115
|
+
|
|
116
|
+
def setup_method(self):
|
|
117
|
+
self.common_req = WMS111MapRequest(
|
|
118
|
+
url="/service?", param=dict(service="WMS", version="1.1.1")
|
|
119
|
+
)
|
|
120
|
+
self.common_map_req = WMS111MapRequest(
|
|
121
|
+
url="/service?",
|
|
122
|
+
param=dict(
|
|
123
|
+
service="WMS",
|
|
124
|
+
version="1.1.1",
|
|
125
|
+
bbox="-180,0,0,80",
|
|
126
|
+
width="200",
|
|
127
|
+
height="200",
|
|
128
|
+
layers="test_cache",
|
|
129
|
+
srs="EPSG:4326",
|
|
130
|
+
format="image/png",
|
|
131
|
+
styles="",
|
|
132
|
+
request="GetMap",
|
|
133
|
+
time="2020-09-22T14:20:00Z",
|
|
134
|
+
),
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
def test_get_capabilities_dimension(self, app):
|
|
138
|
+
req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
139
|
+
self.common_req
|
|
140
|
+
)
|
|
141
|
+
resp = app.get(req)
|
|
142
|
+
xml = resp.lxml
|
|
143
|
+
dimensions = xml.xpath('//Layer/Dimension')
|
|
144
|
+
results = dict()
|
|
145
|
+
|
|
146
|
+
for dimension in dimensions:
|
|
147
|
+
temp_dict = dict()
|
|
148
|
+
temp_dict['values'] = dimension.text
|
|
149
|
+
temp_dict['default'] = dimension.attrib['default']
|
|
150
|
+
results[dimension.attrib['name']] = temp_dict
|
|
151
|
+
|
|
152
|
+
assert set(list(expected_dim.keys())) == set(list(results.keys()))
|
|
153
|
+
|
|
154
|
+
assert expected_dim['time']['default'] == results['time']['default']
|
|
155
|
+
assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
|
|
156
|
+
|
|
157
|
+
def test_get_map_dimensions(self, app, cache_dir):
|
|
158
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
159
|
+
expected_req = (
|
|
160
|
+
{
|
|
161
|
+
"path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
|
|
162
|
+
"&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
|
|
163
|
+
"&VERSION=1.1.1&BBOX=0.0,0.0,20037508.3428,20037508.3428"
|
|
164
|
+
"&WIDTH=256&TIME=2020-09-22T14:20:00Z"
|
|
165
|
+
},
|
|
166
|
+
{"body": img.read(), "headers": {"content-type": "image/jpeg"}},
|
|
167
|
+
)
|
|
168
|
+
with mock_httpd(
|
|
169
|
+
("localhost", 42422), [expected_req], bbox_aware_query_comparator=True
|
|
170
|
+
):
|
|
171
|
+
self.common_map_req.params["bbox"] = "0,0,180,90"
|
|
172
|
+
resp = app.get(self.common_map_req)
|
|
173
|
+
assert 35000 < int(resp.headers["Content-length"]) < 75000
|
|
174
|
+
assert resp.content_type == "image/png"
|
|
175
|
+
|
|
176
|
+
assert cache_dir.join(
|
|
177
|
+
"test_cache_EPSG900913/time-2020-09-22T14:20:00Z/01/000/000/001/000/000/001.jpeg"
|
|
178
|
+
).check()
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class TestDimensionsWMS110(SysTest):
|
|
182
|
+
|
|
183
|
+
def setup_method(self):
|
|
184
|
+
self.common_req = WMS110MapRequest(
|
|
185
|
+
url="/service?", param=dict(service="WMS", version="1.1.0")
|
|
186
|
+
)
|
|
187
|
+
self.common_map_req = WMS110MapRequest(
|
|
188
|
+
url="/service?",
|
|
189
|
+
param=dict(
|
|
190
|
+
service="WMS",
|
|
191
|
+
version="1.1.0",
|
|
192
|
+
bbox="-180,0,0,80",
|
|
193
|
+
width="200",
|
|
194
|
+
height="200",
|
|
195
|
+
layers="test_cache",
|
|
196
|
+
srs="EPSG:4326",
|
|
197
|
+
format="image/png",
|
|
198
|
+
styles="",
|
|
199
|
+
request="GetMap",
|
|
200
|
+
time="2020-09-22T14:20:00Z",
|
|
201
|
+
),
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
def test_get_capabilities_dimension(self, app):
|
|
205
|
+
req = WMS110CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
206
|
+
self.common_req
|
|
207
|
+
)
|
|
208
|
+
resp = app.get(req)
|
|
209
|
+
xml = resp.lxml
|
|
210
|
+
dimensions = xml.xpath('//Layer/Dimension')
|
|
211
|
+
results = dict()
|
|
212
|
+
|
|
213
|
+
for dimension in dimensions:
|
|
214
|
+
temp_dict = dict()
|
|
215
|
+
temp_dict['values'] = dimension.text
|
|
216
|
+
temp_dict['default'] = dimension.attrib['default']
|
|
217
|
+
results[dimension.attrib['name']] = temp_dict
|
|
218
|
+
assert set(list(expected_dim.keys())) == set(list(results.keys()))
|
|
219
|
+
|
|
220
|
+
assert expected_dim['time']['default'] == results['time']['default']
|
|
221
|
+
assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
|
|
222
|
+
assert expected_dim['time']['values'] == results['time']['values']
|
|
223
|
+
assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
|
|
224
|
+
assert expected_dim['time']['values'] == results['time']['values']
|
|
225
|
+
assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
|
|
226
|
+
|
|
227
|
+
def test_get_map_dimensions(self, app, cache_dir):
|
|
228
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
229
|
+
expected_req = (
|
|
230
|
+
{
|
|
231
|
+
"path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
|
|
232
|
+
"&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
|
|
233
|
+
"&VERSION=1.1.1&BBOX=0.0,0.0,20037508.3428,20037508.3428"
|
|
234
|
+
"&WIDTH=256&TIME=2020-09-22T14:20:00Z"
|
|
235
|
+
},
|
|
236
|
+
{"body": img.read(), "headers": {"content-type": "image/jpeg"}},
|
|
237
|
+
)
|
|
238
|
+
with mock_httpd(
|
|
239
|
+
("localhost", 42422), [expected_req], bbox_aware_query_comparator=True
|
|
240
|
+
):
|
|
241
|
+
self.common_map_req.params["bbox"] = "0,0,180,90"
|
|
242
|
+
resp = app.get(self.common_map_req)
|
|
243
|
+
assert 35000 < int(resp.headers["Content-length"]) < 75000
|
|
244
|
+
assert resp.content_type == "image/png"
|
|
245
|
+
|
|
246
|
+
assert cache_dir.join(
|
|
247
|
+
"test_cache_EPSG900913/time-2020-09-22T14:20:00Z/01/000/000/001/000/000/001.jpeg"
|
|
248
|
+
).check()
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class TestDimensionsWMS100(SysTest):
|
|
252
|
+
|
|
253
|
+
def setup_method(self):
|
|
254
|
+
self.common_req = WMS100MapRequest(
|
|
255
|
+
url="/service?", param=dict(service="WMS", wmtver="1.0.0")
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
def test_get_capabilities_dimension(self, app):
|
|
259
|
+
req = WMS100CapabilitiesRequest(url="/service?").copy_with_request_params(
|
|
260
|
+
self.common_req
|
|
261
|
+
)
|
|
262
|
+
resp = app.get(req)
|
|
263
|
+
xml = resp.lxml
|
|
264
|
+
dimensions = xml.xpath('//Layer/Dimension')
|
|
265
|
+
results = dict()
|
|
266
|
+
|
|
267
|
+
for dimension in dimensions:
|
|
268
|
+
temp_dict = dict()
|
|
269
|
+
temp_dict['values'] = dimension.text
|
|
270
|
+
temp_dict['default'] = dimension.attrib['default']
|
|
271
|
+
results[dimension.attrib['name']] = temp_dict
|
|
272
|
+
|
|
273
|
+
assert set(list(expected_dim.keys())) == set(list(results.keys()))
|
|
274
|
+
assert expected_dim['time']['default'] == results['time']['default']
|
|
275
|
+
assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
|
|
276
|
+
assert expected_dim['time']['values'] == results['time']['values']
|
|
277
|
+
assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
|
|
278
|
+
assert expected_dim['time']['values'] == results['time']['values']
|
|
279
|
+
assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2011 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from mapproxy.test.image import is_png, tmp_image
|
|
19
|
+
from mapproxy.test.http import mock_httpd
|
|
20
|
+
from mapproxy.test.system import SysTest
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.fixture(scope="module")
|
|
24
|
+
def config_file():
|
|
25
|
+
return "disable_storage.yaml"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TestDisableStorage(SysTest):
|
|
29
|
+
|
|
30
|
+
def test_get_tile_without_caching(self, app, cache_dir):
|
|
31
|
+
for _ in range(2):
|
|
32
|
+
with tmp_image((256, 256), format="png") as img:
|
|
33
|
+
expected_req = (
|
|
34
|
+
{"path": r"/tile.png"},
|
|
35
|
+
{"body": img.read(), "headers": {"content-type": "image/png"}},
|
|
36
|
+
)
|
|
37
|
+
with mock_httpd(("localhost", 42423), [expected_req]):
|
|
38
|
+
resp = app.get("/tms/1.0.0/tiles/0/0/0.png")
|
|
39
|
+
assert resp.content_type == "image/png"
|
|
40
|
+
is_png(resp.body)
|
|
41
|
+
|
|
42
|
+
assert not cache_dir.check()
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import division
|
|
17
|
+
|
|
18
|
+
from io import BytesIO
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
from mapproxy.request.wms import WMS111MapRequest, WMS111FeatureInfoRequest
|
|
23
|
+
from mapproxy.test.image import tmp_image, check_format
|
|
24
|
+
from mapproxy.test.http import mock_httpd
|
|
25
|
+
from mapproxy.test.system import SysTest
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture(scope="module")
|
|
29
|
+
def config_file():
|
|
30
|
+
return "formats.yaml"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def assert_file_format(filename, format):
|
|
34
|
+
assert filename.check()
|
|
35
|
+
check_format(filename.read_binary(), format)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TestWMS111(SysTest):
|
|
39
|
+
|
|
40
|
+
def setup_method(self):
|
|
41
|
+
self.common_req = WMS111MapRequest(
|
|
42
|
+
url="/service?", param=dict(service="WMS", version="1.1.1")
|
|
43
|
+
)
|
|
44
|
+
self.common_map_req = WMS111MapRequest(
|
|
45
|
+
url="/service?",
|
|
46
|
+
param=dict(
|
|
47
|
+
service="WMS",
|
|
48
|
+
version="1.1.1",
|
|
49
|
+
bbox="0,0,180,80",
|
|
50
|
+
width="200",
|
|
51
|
+
height="200",
|
|
52
|
+
layers="wms_cache",
|
|
53
|
+
srs="EPSG:4326",
|
|
54
|
+
format="image/png",
|
|
55
|
+
styles="",
|
|
56
|
+
request="GetMap",
|
|
57
|
+
),
|
|
58
|
+
)
|
|
59
|
+
self.common_direct_map_req = WMS111MapRequest(
|
|
60
|
+
url="/service?",
|
|
61
|
+
param=dict(
|
|
62
|
+
service="WMS",
|
|
63
|
+
version="1.1.1",
|
|
64
|
+
bbox="0,0,10,10",
|
|
65
|
+
width="200",
|
|
66
|
+
height="200",
|
|
67
|
+
layers="wms_cache",
|
|
68
|
+
srs="EPSG:4326",
|
|
69
|
+
format="image/png",
|
|
70
|
+
styles="",
|
|
71
|
+
request="GetMap",
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
self.common_fi_req = WMS111FeatureInfoRequest(
|
|
75
|
+
url="/service?",
|
|
76
|
+
param=dict(
|
|
77
|
+
x="10",
|
|
78
|
+
y="20",
|
|
79
|
+
width="200",
|
|
80
|
+
height="200",
|
|
81
|
+
layers="wms_cache",
|
|
82
|
+
format="image/png",
|
|
83
|
+
query_layers="wms_cache",
|
|
84
|
+
styles="",
|
|
85
|
+
bbox="1000,400,2000,1400",
|
|
86
|
+
srs="EPSG:900913",
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
self.expected_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=256" "&SRS=EPSG%3A900913&styles=&VERSION=1.1.1&WIDTH=256" "&BBOX=0.0,0.0,20037508.3428,20037508.3428" # noqa
|
|
90
|
+
self.expected_direct_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=200" "&SRS=EPSG%3A4326&styles=&VERSION=1.1.1&WIDTH=200" "&BBOX=0.0,0.0,10.0,10.0" # noqa
|
|
91
|
+
|
|
92
|
+
@pytest.mark.parametrize(
|
|
93
|
+
"layer,source,wms_format,cache_format,req_format",
|
|
94
|
+
[
|
|
95
|
+
["jpeg_cache_tiff_source", "tiffsource", "png", "jpeg", "tiff"],
|
|
96
|
+
["jpeg_cache_tiff_source", "tiffsource", "jpeg", "jpeg", "tiff"],
|
|
97
|
+
["jpeg_cache_tiff_source", "tiffsource", "tiff", "jpeg", "tiff"],
|
|
98
|
+
["jpeg_cache_tiff_source", "tiffsource", "gif", "jpeg", "tiff"],
|
|
99
|
+
["png_cache_all_source", "allsource", "png", "png", "png"],
|
|
100
|
+
["png_cache_all_source", "allsource", "jpeg", "png", "png"],
|
|
101
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "jpeg", "jpeg", "jpeg"],
|
|
102
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "png", "jpeg", "jpeg"],
|
|
103
|
+
],
|
|
104
|
+
)
|
|
105
|
+
def test_get_cached(
|
|
106
|
+
self, app, cache_dir, layer, source, wms_format, cache_format, req_format
|
|
107
|
+
):
|
|
108
|
+
with tmp_image((256, 256), format=req_format) as img:
|
|
109
|
+
expected_req = (
|
|
110
|
+
{
|
|
111
|
+
"path": self.expected_base_path
|
|
112
|
+
+ "&layers="
|
|
113
|
+
+ source
|
|
114
|
+
+ "&format=image%2F"
|
|
115
|
+
+ req_format
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"body": img.read(),
|
|
119
|
+
"headers": {"content-type": "image/" + req_format},
|
|
120
|
+
},
|
|
121
|
+
)
|
|
122
|
+
with mock_httpd(
|
|
123
|
+
("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
|
|
124
|
+
):
|
|
125
|
+
self.common_map_req.params["layers"] = layer
|
|
126
|
+
self.common_map_req.params["format"] = "image/" + wms_format
|
|
127
|
+
resp = app.get(self.common_map_req)
|
|
128
|
+
assert resp.content_type == "image/" + wms_format
|
|
129
|
+
check_format(BytesIO(resp.body), wms_format)
|
|
130
|
+
assert_file_format(
|
|
131
|
+
cache_dir.join(
|
|
132
|
+
layer + "_EPSG900913/01/000/000/001/000/000/001." + cache_format
|
|
133
|
+
),
|
|
134
|
+
cache_format,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
@pytest.mark.parametrize(
|
|
138
|
+
"layer,source,wms_format,req_format",
|
|
139
|
+
[
|
|
140
|
+
["jpeg_cache_tiff_source", "tiffsource", "gif", "tiff"],
|
|
141
|
+
["jpeg_cache_tiff_source", "tiffsource", "jpeg", "tiff"],
|
|
142
|
+
["jpeg_cache_tiff_source", "tiffsource", "png", "tiff"],
|
|
143
|
+
["png_cache_all_source", "allsource", "gif", "gif"],
|
|
144
|
+
["png_cache_all_source", "allsource", "png", "png"],
|
|
145
|
+
["png_cache_all_source", "allsource", "tiff", "tiff"],
|
|
146
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "jpeg", "jpeg"],
|
|
147
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "png", "png"],
|
|
148
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "tiff", "png"],
|
|
149
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "gif", "png"],
|
|
150
|
+
],
|
|
151
|
+
)
|
|
152
|
+
def test_get_direct(self, app, layer, source, wms_format, req_format):
|
|
153
|
+
with tmp_image((256, 256), format=req_format) as img:
|
|
154
|
+
expected_req = (
|
|
155
|
+
{
|
|
156
|
+
"path": self.expected_direct_base_path
|
|
157
|
+
+ "&layers="
|
|
158
|
+
+ source
|
|
159
|
+
+ "&format=image%2F"
|
|
160
|
+
+ req_format
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"body": img.read(),
|
|
164
|
+
"headers": {"content-type": "image/" + req_format},
|
|
165
|
+
},
|
|
166
|
+
)
|
|
167
|
+
with mock_httpd(
|
|
168
|
+
("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
|
|
169
|
+
):
|
|
170
|
+
self.common_direct_map_req.params["layers"] = layer
|
|
171
|
+
self.common_direct_map_req.params["format"] = "image/" + wms_format
|
|
172
|
+
resp = app.get(self.common_direct_map_req)
|
|
173
|
+
assert resp.content_type == "image/" + wms_format
|
|
174
|
+
check_format(BytesIO(resp.body), wms_format)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class TestTMS(SysTest):
|
|
178
|
+
|
|
179
|
+
def setup_method(self):
|
|
180
|
+
self.expected_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=256" "&SRS=EPSG%3A900913&styles=&VERSION=1.1.1&WIDTH=256" "&BBOX=0.0,0.0,20037508.3428,20037508.3428" # noqa
|
|
181
|
+
self.expected_direct_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=200" "&SRS=EPSG%3A4326&styles=&VERSION=1.1.1&WIDTH=200" "&BBOX=0.0,0.0,10.0,10.0" # noqa
|
|
182
|
+
|
|
183
|
+
@pytest.mark.parametrize(
|
|
184
|
+
"layer,source,tms_format,cache_format,req_format",
|
|
185
|
+
[
|
|
186
|
+
["jpeg_cache_tiff_source", "tiffsource", "jpeg", "jpeg", "tiff"],
|
|
187
|
+
["png_cache_all_source", "allsource", "png", "png", "png"],
|
|
188
|
+
["jpeg_cache_png_jpeg_source", "pngjpegsource", "jpeg", "jpeg", "jpeg"],
|
|
189
|
+
],
|
|
190
|
+
)
|
|
191
|
+
def test_get_cached(
|
|
192
|
+
self, app, cache_dir, layer, source, tms_format, cache_format, req_format
|
|
193
|
+
):
|
|
194
|
+
with tmp_image((256, 256), format=req_format) as img:
|
|
195
|
+
expected_req = (
|
|
196
|
+
{
|
|
197
|
+
"path": self.expected_base_path
|
|
198
|
+
+ "&layers="
|
|
199
|
+
+ source
|
|
200
|
+
+ "&format=image%2F"
|
|
201
|
+
+ req_format
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"body": img.read(),
|
|
205
|
+
"headers": {"content-type": "image/" + req_format},
|
|
206
|
+
},
|
|
207
|
+
)
|
|
208
|
+
with mock_httpd(
|
|
209
|
+
("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
|
|
210
|
+
):
|
|
211
|
+
resp = app.get("/tms/1.0.0/%s/0/1/1.%s" % (layer, tms_format))
|
|
212
|
+
assert resp.content_type == "image/" + tms_format
|
|
213
|
+
# check_format(BytesIO(resp.body), tms_format)
|
|
214
|
+
assert_file_format(
|
|
215
|
+
cache_dir.join(
|
|
216
|
+
layer + "_EPSG900913/01/000/000/001/000/000/001." + cache_format
|
|
217
|
+
),
|
|
218
|
+
cache_format,
|
|
219
|
+
)
|