MapProxy 1.16.1__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/__init__.py +0 -0
- mapproxy/cache/__init__.py +36 -0
- mapproxy/cache/azureblob.py +145 -0
- mapproxy/cache/base.py +111 -0
- mapproxy/cache/compact.py +664 -0
- mapproxy/cache/couchdb.py +295 -0
- mapproxy/cache/dummy.py +34 -0
- mapproxy/cache/file.py +185 -0
- mapproxy/cache/geopackage.py +609 -0
- mapproxy/cache/legend.py +83 -0
- mapproxy/cache/mbtiles.py +392 -0
- mapproxy/cache/meta.py +78 -0
- mapproxy/cache/path.py +250 -0
- mapproxy/cache/redis.py +88 -0
- mapproxy/cache/renderd.py +95 -0
- mapproxy/cache/riak.py +202 -0
- mapproxy/cache/s3.py +177 -0
- mapproxy/cache/tile.py +699 -0
- mapproxy/client/__init__.py +0 -0
- mapproxy/client/arcgis.py +79 -0
- mapproxy/client/cgi.py +139 -0
- mapproxy/client/http.py +315 -0
- mapproxy/client/log.py +33 -0
- mapproxy/client/tile.py +150 -0
- mapproxy/client/wms.py +254 -0
- mapproxy/compat/__init__.py +46 -0
- mapproxy/compat/image.py +79 -0
- mapproxy/compat/itertools.py +29 -0
- mapproxy/compat/modules.py +13 -0
- mapproxy/config/__init__.py +22 -0
- mapproxy/config/config.py +201 -0
- mapproxy/config/coverage.py +107 -0
- mapproxy/config/defaults.py +98 -0
- mapproxy/config/loader.py +2286 -0
- mapproxy/config/spec.py +644 -0
- mapproxy/config/validator.py +239 -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 +593 -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 +142 -0
- mapproxy/featureinfo.py +252 -0
- mapproxy/grid.py +1170 -0
- mapproxy/image/__init__.py +536 -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 +75 -0
- mapproxy/image/merge.py +316 -0
- mapproxy/image/message.py +347 -0
- mapproxy/image/opts.py +182 -0
- mapproxy/image/tile.py +167 -0
- mapproxy/image/transform.py +350 -0
- mapproxy/layer.py +470 -0
- mapproxy/multiapp.py +231 -0
- mapproxy/proj.py +302 -0
- mapproxy/request/__init__.py +18 -0
- mapproxy/request/arcgis.py +259 -0
- mapproxy/request/base.py +476 -0
- mapproxy/request/tile.py +128 -0
- mapproxy/request/wms/__init__.py +793 -0
- mapproxy/request/wms/exception.py +99 -0
- mapproxy/request/wmts.py +436 -0
- mapproxy/response.py +237 -0
- mapproxy/script/__init__.py +0 -0
- mapproxy/script/conf/__init__.py +0 -0
- mapproxy/script/conf/app.py +195 -0
- mapproxy/script/conf/caches.py +45 -0
- mapproxy/script/conf/layers.py +54 -0
- mapproxy/script/conf/seeds.py +37 -0
- mapproxy/script/conf/sources.py +86 -0
- mapproxy/script/conf/utils.py +143 -0
- mapproxy/script/defrag.py +184 -0
- mapproxy/script/export.py +333 -0
- mapproxy/script/grids.py +188 -0
- mapproxy/script/scales.py +126 -0
- mapproxy/script/util.py +406 -0
- mapproxy/script/wms_capabilities.py +152 -0
- mapproxy/seed/__init__.py +0 -0
- mapproxy/seed/cachelock.py +121 -0
- mapproxy/seed/cleanup.py +187 -0
- mapproxy/seed/config.py +469 -0
- mapproxy/seed/script.py +388 -0
- mapproxy/seed/seeder.py +538 -0
- mapproxy/seed/spec.py +64 -0
- mapproxy/seed/util.py +254 -0
- mapproxy/service/__init__.py +14 -0
- mapproxy/service/base.py +46 -0
- mapproxy/service/demo.py +356 -0
- mapproxy/service/kml.py +331 -0
- mapproxy/service/ows.py +38 -0
- mapproxy/service/template_helper.py +53 -0
- mapproxy/service/templates/demo/capabilities_demo.html +16 -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 +103 -0
- mapproxy/service/templates/demo/wms_demo.html +140 -0
- mapproxy/service/templates/demo/wmts_demo.html +110 -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 +536 -0
- mapproxy/service/wms.py +851 -0
- mapproxy/service/wmts.py +381 -0
- mapproxy/source/__init__.py +75 -0
- mapproxy/source/arcgis.py +39 -0
- mapproxy/source/error.py +39 -0
- mapproxy/source/mapnik.py +259 -0
- mapproxy/source/tile.py +96 -0
- mapproxy/source/wms.py +270 -0
- mapproxy/srs.py +726 -0
- mapproxy/template.py +54 -0
- mapproxy/test/__init__.py +0 -0
- mapproxy/test/conftest.py +7 -0
- mapproxy/test/helper.py +247 -0
- mapproxy/test/http.py +494 -0
- mapproxy/test/image.py +210 -0
- mapproxy/test/mocker.py +2268 -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_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 +100 -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 +30 -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 +1134 -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_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 +106 -0
- mapproxy/test/system/test_demo_with_extra_service.py +53 -0
- mapproxy/test/system/test_dimensions.py +278 -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 +262 -0
- mapproxy/test/system/test_layergroups.py +160 -0
- mapproxy/test/system/test_legendgraphic.py +308 -0
- mapproxy/test/system/test_mapnik.py +161 -0
- mapproxy/test/system/test_mapserver.py +81 -0
- mapproxy/test/system/test_mixed_mode_format.py +195 -0
- mapproxy/test/system/test_multi_cache_layers.py +167 -0
- mapproxy/test/system/test_multiapp.py +92 -0
- mapproxy/test/system/test_refresh.py +207 -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 +422 -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 +276 -0
- mapproxy/test/system/test_tms_origin.py +46 -0
- mapproxy/test/system/test_util_conf.py +304 -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 +1611 -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 +425 -0
- mapproxy/test/test_http_helper.py +219 -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 +245 -0
- mapproxy/test/unit/test_auth.py +419 -0
- mapproxy/test/unit/test_cache.py +1193 -0
- mapproxy/test/unit/test_cache_azureblob.py +94 -0
- mapproxy/test/unit/test_cache_compact.py +319 -0
- mapproxy/test/unit/test_cache_couchdb.py +114 -0
- mapproxy/test/unit/test_cache_geopackage.py +221 -0
- mapproxy/test/unit/test_cache_redis.py +67 -0
- mapproxy/test/unit/test_cache_riak.py +76 -0
- mapproxy/test/unit/test_cache_s3.py +84 -0
- mapproxy/test/unit/test_cache_tile.py +427 -0
- mapproxy/test/unit/test_client.py +479 -0
- mapproxy/test/unit/test_client_arcgis.py +73 -0
- mapproxy/test/unit/test_client_cgi.py +136 -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 +1061 -0
- mapproxy/test/unit/test_conf_validator.py +416 -0
- mapproxy/test/unit/test_config.py +117 -0
- mapproxy/test/unit/test_decorate_img.py +185 -0
- mapproxy/test/unit/test_exceptions.py +258 -0
- mapproxy/test/unit/test_featureinfo.py +291 -0
- mapproxy/test/unit/test_file_lock_load.py +49 -0
- mapproxy/test/unit/test_geom.py +503 -0
- mapproxy/test/unit/test_grid.py +1258 -0
- mapproxy/test/unit/test_image.py +1053 -0
- mapproxy/test/unit/test_image_mask.py +181 -0
- mapproxy/test/unit/test_image_messages.py +197 -0
- mapproxy/test/unit/test_image_options.py +160 -0
- mapproxy/test/unit/test_isodate.py +122 -0
- mapproxy/test/unit/test_multiapp.py +163 -0
- mapproxy/test/unit/test_ogr_reader.py +50 -0
- mapproxy/test/unit/test_request.py +745 -0
- mapproxy/test/unit/test_request_wmts.py +178 -0
- mapproxy/test/unit/test_response.py +79 -0
- mapproxy/test/unit/test_seed.py +365 -0
- mapproxy/test/unit/test_seed_cachelock.py +90 -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 +69 -0
- mapproxy/tilefilter.py +59 -0
- mapproxy/util/__init__.py +0 -0
- mapproxy/util/async_.py +227 -0
- mapproxy/util/collections.py +132 -0
- mapproxy/util/coverage.py +329 -0
- mapproxy/util/escape.py +10 -0
- mapproxy/util/ext/__init__.py +14 -0
- mapproxy/util/ext/dictspec/__init__.py +1 -0
- mapproxy/util/ext/dictspec/spec.py +124 -0
- mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
- mapproxy/util/ext/dictspec/validator.py +189 -0
- mapproxy/util/ext/local.py +196 -0
- mapproxy/util/ext/lockfile.py +138 -0
- mapproxy/util/ext/odict.py +330 -0
- mapproxy/util/ext/serving.py +508 -0
- mapproxy/util/ext/tempita/__init__.py +1174 -0
- mapproxy/util/ext/tempita/_looper.py +163 -0
- mapproxy/util/ext/tempita/compat3.py +46 -0
- mapproxy/util/ext/wmsparse/__init__.py +3 -0
- mapproxy/util/ext/wmsparse/duration.py +597 -0
- mapproxy/util/ext/wmsparse/parse.py +305 -0
- mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
- mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
- mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
- mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
- mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
- mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
- mapproxy/util/ext/wmsparse/util.py +187 -0
- mapproxy/util/fs.py +156 -0
- mapproxy/util/geom.py +295 -0
- mapproxy/util/lib.py +115 -0
- mapproxy/util/lock.py +163 -0
- mapproxy/util/ogr.py +231 -0
- mapproxy/util/py.py +81 -0
- mapproxy/util/times.py +75 -0
- mapproxy/util/yaml.py +56 -0
- mapproxy/version.py +31 -0
- mapproxy/wsgiapp.py +164 -0
- mapproxy-1.16.1.dist-info/METADATA +151 -0
- mapproxy-1.16.1.dist-info/RECORD +458 -0
- mapproxy-1.16.1.dist-info/WHEEL +5 -0
- mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
- mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
- mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
- mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
- mapproxy-1.16.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010-2012 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 os
|
|
17
|
+
import hashlib
|
|
18
|
+
|
|
19
|
+
from io import BytesIO
|
|
20
|
+
|
|
21
|
+
import pytest
|
|
22
|
+
|
|
23
|
+
from mapproxy.compat.image import Image
|
|
24
|
+
from mapproxy.test.image import is_jpeg, tmp_image
|
|
25
|
+
from mapproxy.test.http import mock_httpd
|
|
26
|
+
from mapproxy.test.system import SysTest
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.fixture(scope="module")
|
|
30
|
+
def config_file():
|
|
31
|
+
return "layer.yaml"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TestTMS(SysTest):
|
|
35
|
+
|
|
36
|
+
def test_tms_capabilities(self, app):
|
|
37
|
+
resp = app.get("/tms/1.0.0/")
|
|
38
|
+
assert "WMS Cache Layer" in resp
|
|
39
|
+
assert "WMS Cache Multi Layer" in resp
|
|
40
|
+
assert "TMS Cache Layer" in resp
|
|
41
|
+
assert "TMS Cache Layer + FI" in resp
|
|
42
|
+
xml = resp.lxml
|
|
43
|
+
assert xml.xpath("count(//TileMap)") == 11
|
|
44
|
+
|
|
45
|
+
# without trailing space
|
|
46
|
+
resp2 = app.get("/tms/1.0.0")
|
|
47
|
+
assert resp.body == resp2.body
|
|
48
|
+
|
|
49
|
+
def test_tms_layer_capabilities(self, app):
|
|
50
|
+
resp = app.get("/tms/1.0.0/wms_cache")
|
|
51
|
+
assert "WMS Cache Layer" in resp
|
|
52
|
+
xml = resp.lxml
|
|
53
|
+
assert xml.xpath("count(//TileSet)") == 19
|
|
54
|
+
|
|
55
|
+
def test_tms_root_resource(self, app):
|
|
56
|
+
resp = app.get("/tms")
|
|
57
|
+
resp2 = app.get("/tms/")
|
|
58
|
+
assert "TileMapService" in resp and "TileMapService" in resp2
|
|
59
|
+
xml = resp.lxml
|
|
60
|
+
assert xml.xpath("//TileMapService/@version") == ["1.0.0"]
|
|
61
|
+
|
|
62
|
+
def test_tms_get_out_of_bounds_tile(self, app):
|
|
63
|
+
for coord in [(0, 0, -1), (-1, 0, 0), (0, -1, 0), (4, 2, 1), (1, 3, 0)]:
|
|
64
|
+
x, y, z = coord
|
|
65
|
+
url = "/tms/1.0.0/wms_cache/%d/%d/%d.jpeg" % (z, x, y)
|
|
66
|
+
resp = app.get(url, status=404)
|
|
67
|
+
xml = resp.lxml
|
|
68
|
+
assert (
|
|
69
|
+
"outside the bounding box"
|
|
70
|
+
in xml.xpath("/TileMapServerError/Message/text()")[0]
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def test_invalid_layer(self, app):
|
|
74
|
+
resp = app.get("/tms/1.0.0/inVAlid/0/0/0.png", status=404)
|
|
75
|
+
xml = resp.lxml
|
|
76
|
+
assert (
|
|
77
|
+
"unknown layer: inVAlid"
|
|
78
|
+
in xml.xpath("/TileMapServerError/Message/text()")[0]
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def test_invalid_format(self, app):
|
|
82
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/1.png", status=404)
|
|
83
|
+
xml = resp.lxml
|
|
84
|
+
assert "invalid format" in xml.xpath("/TileMapServerError/Message/text()")[0]
|
|
85
|
+
|
|
86
|
+
def test_get_tile_tile_source_error(self, app):
|
|
87
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/0.jpeg", status=500)
|
|
88
|
+
xml = resp.lxml
|
|
89
|
+
assert (
|
|
90
|
+
"No response from URL" in xml.xpath("/TileMapServerError/Message/text()")[0]
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def test_get_cached_tile(self, app, fixture_cache_data):
|
|
94
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/1.jpeg")
|
|
95
|
+
assert resp.content_type == "image/jpeg"
|
|
96
|
+
assert resp.content_length == len(resp.body)
|
|
97
|
+
data = BytesIO(resp.body)
|
|
98
|
+
assert is_jpeg(data)
|
|
99
|
+
|
|
100
|
+
def test_get_tile(self, app, cache_dir):
|
|
101
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
102
|
+
expected_req = (
|
|
103
|
+
{
|
|
104
|
+
"path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
|
|
105
|
+
"&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
|
|
106
|
+
"&VERSION=1.1.1&BBOX=-20037508.3428,-20037508.3428,0.0,0.0"
|
|
107
|
+
"&WIDTH=256"
|
|
108
|
+
},
|
|
109
|
+
{"body": img.read(), "headers": {"content-type": "image/jpeg"}},
|
|
110
|
+
)
|
|
111
|
+
with mock_httpd(
|
|
112
|
+
("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
|
|
113
|
+
):
|
|
114
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/0.jpeg")
|
|
115
|
+
assert resp.content_type == "image/jpeg"
|
|
116
|
+
assert cache_dir.join(
|
|
117
|
+
"wms_cache_EPSG900913/01/000/000/000/000/000/000.jpeg"
|
|
118
|
+
).check()
|
|
119
|
+
|
|
120
|
+
def test_get_tile_from_cache_with_tile_source(self, app, cache_dir):
|
|
121
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
122
|
+
expected_req = (
|
|
123
|
+
{"path": r"/tiles/01/000/000/000/000/000/001.png"},
|
|
124
|
+
{"body": img.read(), "headers": {"content-type": "image/png"}},
|
|
125
|
+
)
|
|
126
|
+
with mock_httpd(("localhost", 42423), [expected_req]):
|
|
127
|
+
resp = app.get("/tms/1.0.0/tms_cache/0/0/1.png")
|
|
128
|
+
assert resp.content_type == "image/png"
|
|
129
|
+
assert cache_dir.join(
|
|
130
|
+
"tms_cache_EPSG900913/01/000/000/000/000/000/001.png"
|
|
131
|
+
).check()
|
|
132
|
+
|
|
133
|
+
def test_get_tile_with_watermark_cache(self, app):
|
|
134
|
+
with tmp_image((256, 256), format="png", color=(0, 0, 0)) as img:
|
|
135
|
+
expected_req = (
|
|
136
|
+
{"path": r"/tiles/01/000/000/000/000/000/000.png"},
|
|
137
|
+
{"body": img.read(), "headers": {"content-type": "image/png"}},
|
|
138
|
+
)
|
|
139
|
+
with mock_httpd(("localhost", 42423), [expected_req]):
|
|
140
|
+
resp = app.get("/tms/1.0.0/watermark_cache/0/0/0.png")
|
|
141
|
+
assert resp.content_type == "image/png"
|
|
142
|
+
img = Image.open(BytesIO(resp.body))
|
|
143
|
+
colors = img.getcolors()
|
|
144
|
+
assert len(colors) >= 2
|
|
145
|
+
assert sorted(colors)[-1][1] == (0, 0, 0)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class TestTileService(SysTest):
|
|
149
|
+
|
|
150
|
+
def test_get_out_of_bounds_tile(self, app):
|
|
151
|
+
for coord in [(0, 0, -1), (-1, 0, 0), (0, -1, 0), (4, 2, 1), (1, 3, 0)]:
|
|
152
|
+
x, y, z = coord
|
|
153
|
+
url = "/tiles/wms_cache/%d/%d/%d.jpeg" % (z, x, y)
|
|
154
|
+
resp = app.get(url, status=404)
|
|
155
|
+
assert "outside the bounding box" in resp
|
|
156
|
+
|
|
157
|
+
def test_invalid_layer(self, app):
|
|
158
|
+
resp = app.get("/tiles/inVAlid/0/0/0.png", status=404)
|
|
159
|
+
assert resp.content_type == "text/plain"
|
|
160
|
+
assert "unknown layer: inVAlid" in resp
|
|
161
|
+
|
|
162
|
+
def test_invalid_format(self, app):
|
|
163
|
+
resp = app.get("/tiles/wms_cache/0/0/1.png", status=404)
|
|
164
|
+
assert resp.content_type == "text/plain"
|
|
165
|
+
assert "invalid format" in resp
|
|
166
|
+
|
|
167
|
+
def test_get_tile_tile_source_error(self, app):
|
|
168
|
+
resp = app.get("/tiles/wms_cache/0/0/0.jpeg", status=500)
|
|
169
|
+
assert resp.content_type == "text/plain"
|
|
170
|
+
assert "No response from URL" in resp
|
|
171
|
+
|
|
172
|
+
def _check_tile_resp(self, resp):
|
|
173
|
+
assert resp.content_type == "image/jpeg"
|
|
174
|
+
assert resp.content_length == len(resp.body)
|
|
175
|
+
data = BytesIO(resp.body)
|
|
176
|
+
assert is_jpeg(data)
|
|
177
|
+
|
|
178
|
+
def _update_timestamp(self, cache_dir, base_config):
|
|
179
|
+
timestamp = 1234567890.0
|
|
180
|
+
size = 10214
|
|
181
|
+
base_dir = base_config.cache.base_dir
|
|
182
|
+
os.utime(
|
|
183
|
+
os.path.join(
|
|
184
|
+
base_dir, "wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg"
|
|
185
|
+
),
|
|
186
|
+
(timestamp, timestamp),
|
|
187
|
+
)
|
|
188
|
+
max_age = base_config.tiles.expires_hours * 60 * 60
|
|
189
|
+
etag = hashlib.md5((str(timestamp) + str(size)).encode("ascii")).hexdigest()
|
|
190
|
+
return etag, max_age
|
|
191
|
+
|
|
192
|
+
def _check_cache_control_headers(self, resp, etag, max_age):
|
|
193
|
+
assert resp.headers["ETag"] == etag
|
|
194
|
+
assert resp.headers["Last-modified"] == "Fri, 13 Feb 2009 23:31:30 GMT"
|
|
195
|
+
assert resp.headers["Cache-control"] == "public, max-age=%d, s-maxage=%d" % (
|
|
196
|
+
max_age,
|
|
197
|
+
max_age,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
def test_get_cached_tile(self, app, cache_dir, base_config, fixture_cache_data):
|
|
201
|
+
etag, max_age = self._update_timestamp(cache_dir, base_config)
|
|
202
|
+
resp = app.get("/tiles/wms_cache/1/0/1.jpeg")
|
|
203
|
+
self._check_cache_control_headers(resp, etag, max_age)
|
|
204
|
+
self._check_tile_resp(resp)
|
|
205
|
+
|
|
206
|
+
def test_get_cached_tile_flipped_y(
|
|
207
|
+
self, app, cache_dir, base_config, fixture_cache_data
|
|
208
|
+
):
|
|
209
|
+
etag, max_age = self._update_timestamp(cache_dir, base_config)
|
|
210
|
+
resp = app.get("/tiles/wms_cache/1/0/0.jpeg?origin=nw")
|
|
211
|
+
self._check_cache_control_headers(resp, etag, max_age)
|
|
212
|
+
self._check_tile_resp(resp)
|
|
213
|
+
|
|
214
|
+
def test_if_none_match(self, app, cache_dir, base_config, fixture_cache_data):
|
|
215
|
+
etag, max_age = self._update_timestamp(cache_dir, base_config)
|
|
216
|
+
resp = app.get("/tiles/wms_cache/1/0/1.jpeg", headers={"If-None-Match": etag})
|
|
217
|
+
assert resp.status == "304 Not Modified"
|
|
218
|
+
self._check_cache_control_headers(resp, etag, max_age)
|
|
219
|
+
|
|
220
|
+
resp = app.get(
|
|
221
|
+
"/tiles/wms_cache/1/0/1.jpeg", headers={"If-None-Match": etag + "foo"}
|
|
222
|
+
)
|
|
223
|
+
self._check_cache_control_headers(resp, etag, max_age)
|
|
224
|
+
assert resp.status == "200 OK"
|
|
225
|
+
self._check_tile_resp(resp)
|
|
226
|
+
|
|
227
|
+
@pytest.mark.parametrize(
|
|
228
|
+
"date,modified",
|
|
229
|
+
[
|
|
230
|
+
("Fri, 15 Feb 2009 23:31:30 GMT", False),
|
|
231
|
+
("Fri, 13 Feb 2009 23:31:31 GMT", False),
|
|
232
|
+
("Fri, 13 Feb 2009 23:31:30 GMT", False),
|
|
233
|
+
("Fri, 13 Feb 2009 23:31:29 GMT", True),
|
|
234
|
+
("Fri, 11 Feb 2009 23:31:29 GMT", True),
|
|
235
|
+
("Friday, 13-Feb-09 23:31:30 GMT", False),
|
|
236
|
+
("Friday, 13-Feb-09 23:31:29 GMT", True),
|
|
237
|
+
("Fri Feb 13 23:31:30 2009", False),
|
|
238
|
+
("Fri Feb 13 23:31:29 2009", True),
|
|
239
|
+
# and some invalid ones
|
|
240
|
+
("Fri Foo 13 23:31:29 2009", True),
|
|
241
|
+
("1234567890", True),
|
|
242
|
+
],
|
|
243
|
+
)
|
|
244
|
+
def test_if_modified_since(
|
|
245
|
+
self, app, cache_dir, base_config, fixture_cache_data, date, modified
|
|
246
|
+
):
|
|
247
|
+
etag, max_age = self._update_timestamp(cache_dir, base_config)
|
|
248
|
+
resp = app.get(
|
|
249
|
+
"/tiles/wms_cache/1/0/1.jpeg", headers={"If-Modified-Since": date}
|
|
250
|
+
)
|
|
251
|
+
self._check_cache_control_headers(resp, etag, max_age)
|
|
252
|
+
if modified:
|
|
253
|
+
assert resp.status == "200 OK"
|
|
254
|
+
self._check_tile_resp(resp)
|
|
255
|
+
else:
|
|
256
|
+
assert resp.status == "304 Not Modified"
|
|
257
|
+
|
|
258
|
+
def test_get_tile(self, app, cache_dir):
|
|
259
|
+
with tmp_image((256, 256), format="jpeg") as img:
|
|
260
|
+
expected_req = (
|
|
261
|
+
{
|
|
262
|
+
"path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
|
|
263
|
+
"&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
|
|
264
|
+
"&VERSION=1.1.1&BBOX=-20037508.3428,-20037508.3428,0.0,0.0"
|
|
265
|
+
"&WIDTH=256"
|
|
266
|
+
},
|
|
267
|
+
{"body": img.read(), "headers": {"content-type": "image/jpeg"}},
|
|
268
|
+
)
|
|
269
|
+
with mock_httpd(
|
|
270
|
+
("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
|
|
271
|
+
):
|
|
272
|
+
resp = app.get("/tiles/wms_cache/1/0/0.jpeg")
|
|
273
|
+
assert resp.content_type == "image/jpeg"
|
|
274
|
+
assert cache_dir.join(
|
|
275
|
+
"wms_cache_EPSG900913/01/000/000/000/000/000/000.jpeg"
|
|
276
|
+
).check()
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010-2012 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_jpeg
|
|
19
|
+
from mapproxy.test.system import SysTest
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@pytest.fixture(scope="module")
|
|
23
|
+
def config_file():
|
|
24
|
+
return "tileservice_origin.yaml"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pytest.mark.usefixtures("fixture_cache_data")
|
|
28
|
+
class TestTileServicesOrigin(SysTest):
|
|
29
|
+
|
|
30
|
+
###
|
|
31
|
+
# tile 0/0/1 is cached, check if we can access it with different URLs
|
|
32
|
+
|
|
33
|
+
def test_get_cached_tile_tms(self, app):
|
|
34
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/1.jpeg")
|
|
35
|
+
assert resp.content_type == "image/jpeg"
|
|
36
|
+
assert is_jpeg(resp.body)
|
|
37
|
+
|
|
38
|
+
def test_get_cached_tile_service_origin(self, app):
|
|
39
|
+
resp = app.get("/tiles/wms_cache/1/0/0.jpeg")
|
|
40
|
+
assert resp.content_type == "image/jpeg"
|
|
41
|
+
assert is_jpeg(resp.body)
|
|
42
|
+
|
|
43
|
+
def test_get_cached_tile_request_origin(self, app):
|
|
44
|
+
resp = app.get("/tiles/wms_cache/1/0/1.jpeg?origin=sw")
|
|
45
|
+
assert resp.content_type == "image/jpeg"
|
|
46
|
+
assert is_jpeg(resp.body)
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# -:- encoding: utf-8 -:-
|
|
2
|
+
# This file is part of the MapProxy project.
|
|
3
|
+
# Copyright (C) 2013 Omniscale <http://omniscale.de>
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
import shutil
|
|
20
|
+
import tempfile
|
|
21
|
+
|
|
22
|
+
import yaml
|
|
23
|
+
|
|
24
|
+
from mapproxy.script.conf.app import config_command
|
|
25
|
+
from mapproxy.test.helper import capture
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def filename(name):
|
|
29
|
+
return os.path.join(os.path.dirname(__file__), "fixture", name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TestMapProxyConfCmd(object):
|
|
33
|
+
|
|
34
|
+
def setup(self):
|
|
35
|
+
self.dir = tempfile.mkdtemp()
|
|
36
|
+
|
|
37
|
+
def teardown(self):
|
|
38
|
+
if os.path.exists(self.dir):
|
|
39
|
+
shutil.rmtree(self.dir)
|
|
40
|
+
|
|
41
|
+
def tmp_filename(self, name):
|
|
42
|
+
return os.path.join(self.dir, name)
|
|
43
|
+
|
|
44
|
+
def test_cmd_no_args(self):
|
|
45
|
+
with capture() as (stdout, stderr):
|
|
46
|
+
assert config_command(["mapproxy-conf"]) == 2
|
|
47
|
+
|
|
48
|
+
assert "--capabilities required" in stderr.getvalue()
|
|
49
|
+
|
|
50
|
+
def test_stdout_output(self):
|
|
51
|
+
with capture(bytes=True) as (stdout, stderr):
|
|
52
|
+
assert (
|
|
53
|
+
config_command(
|
|
54
|
+
[
|
|
55
|
+
"mapproxy-conf",
|
|
56
|
+
"--capabilities",
|
|
57
|
+
filename("util-conf-wms-111-cap.xml"),
|
|
58
|
+
]
|
|
59
|
+
)
|
|
60
|
+
== 0
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
assert stdout.getvalue().startswith(b"# MapProxy configuration")
|
|
64
|
+
|
|
65
|
+
def test_test_cap_output_no_base(self):
|
|
66
|
+
with capture(bytes=True) as (stdout, stderr):
|
|
67
|
+
assert (
|
|
68
|
+
config_command(
|
|
69
|
+
[
|
|
70
|
+
"mapproxy-conf",
|
|
71
|
+
"--capabilities",
|
|
72
|
+
filename("util-conf-wms-111-cap.xml"),
|
|
73
|
+
"--output",
|
|
74
|
+
self.tmp_filename("mapproxy.yaml"),
|
|
75
|
+
]
|
|
76
|
+
)
|
|
77
|
+
== 0
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
with open(self.tmp_filename("mapproxy.yaml"), "rb") as f:
|
|
81
|
+
conf = yaml.safe_load(f)
|
|
82
|
+
|
|
83
|
+
assert "grids" not in conf
|
|
84
|
+
assert conf["sources"] == {
|
|
85
|
+
"osm_roads_wms": {
|
|
86
|
+
"supported_srs": [
|
|
87
|
+
"CRS:84",
|
|
88
|
+
"EPSG:25831",
|
|
89
|
+
"EPSG:25832",
|
|
90
|
+
"EPSG:25833",
|
|
91
|
+
"EPSG:31466",
|
|
92
|
+
"EPSG:31467",
|
|
93
|
+
"EPSG:31468",
|
|
94
|
+
"EPSG:3857",
|
|
95
|
+
"EPSG:4258",
|
|
96
|
+
"EPSG:4326",
|
|
97
|
+
"EPSG:900913",
|
|
98
|
+
],
|
|
99
|
+
"req": {
|
|
100
|
+
"layers": "osm_roads",
|
|
101
|
+
"url": "http://osm.omniscale.net/proxy/service?",
|
|
102
|
+
"transparent": True,
|
|
103
|
+
},
|
|
104
|
+
"type": "wms",
|
|
105
|
+
"coverage": {
|
|
106
|
+
"srs": "EPSG:4326",
|
|
107
|
+
"bbox": [-180.0, -85.0511287798, 180.0, 85.0511287798],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
"osm_wms": {
|
|
111
|
+
"supported_srs": [
|
|
112
|
+
"CRS:84",
|
|
113
|
+
"EPSG:25831",
|
|
114
|
+
"EPSG:25832",
|
|
115
|
+
"EPSG:25833",
|
|
116
|
+
"EPSG:31466",
|
|
117
|
+
"EPSG:31467",
|
|
118
|
+
"EPSG:31468",
|
|
119
|
+
"EPSG:3857",
|
|
120
|
+
"EPSG:4258",
|
|
121
|
+
"EPSG:4326",
|
|
122
|
+
"EPSG:900913",
|
|
123
|
+
],
|
|
124
|
+
"req": {
|
|
125
|
+
"layers": "osm",
|
|
126
|
+
"url": "http://osm.omniscale.net/proxy/service?",
|
|
127
|
+
"transparent": True,
|
|
128
|
+
},
|
|
129
|
+
"type": "wms",
|
|
130
|
+
"coverage": {
|
|
131
|
+
"srs": "EPSG:4326",
|
|
132
|
+
"bbox": [-180.0, -85.0511287798, 180.0, 85.0511287798],
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
assert conf["layers"] == [
|
|
138
|
+
{
|
|
139
|
+
"title": "Omniscale OpenStreetMap WMS",
|
|
140
|
+
"layers": [
|
|
141
|
+
{
|
|
142
|
+
"name": "osm",
|
|
143
|
+
"title": "OpenStreetMap (complete map)",
|
|
144
|
+
"sources": ["osm_wms"],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "osm_roads",
|
|
148
|
+
"title": "OpenStreetMap (streets only)",
|
|
149
|
+
"sources": ["osm_roads_wms"],
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
}
|
|
153
|
+
]
|
|
154
|
+
assert len(conf["layers"][0]["layers"]) == 2
|
|
155
|
+
|
|
156
|
+
def test_test_cap_output(self):
|
|
157
|
+
with capture(bytes=True) as (stdout, stderr):
|
|
158
|
+
assert (
|
|
159
|
+
config_command(
|
|
160
|
+
[
|
|
161
|
+
"mapproxy-conf",
|
|
162
|
+
"--capabilities",
|
|
163
|
+
filename("util-conf-wms-111-cap.xml"),
|
|
164
|
+
"--output",
|
|
165
|
+
self.tmp_filename("mapproxy.yaml"),
|
|
166
|
+
"--base",
|
|
167
|
+
filename("util-conf-base-grids.yaml"),
|
|
168
|
+
]
|
|
169
|
+
)
|
|
170
|
+
== 0
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
with open(self.tmp_filename("mapproxy.yaml"), "rb") as f:
|
|
174
|
+
conf = yaml.safe_load(f)
|
|
175
|
+
|
|
176
|
+
assert "grids" not in conf
|
|
177
|
+
assert len(conf["sources"]) == 2
|
|
178
|
+
|
|
179
|
+
assert conf["caches"] == {
|
|
180
|
+
"osm_cache": {
|
|
181
|
+
"grids": ["webmercator", "geodetic"],
|
|
182
|
+
"sources": ["osm_wms"],
|
|
183
|
+
},
|
|
184
|
+
"osm_roads_cache": {
|
|
185
|
+
"grids": ["webmercator", "geodetic"],
|
|
186
|
+
"sources": ["osm_roads_wms"],
|
|
187
|
+
},
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
assert conf["layers"] == [
|
|
191
|
+
{
|
|
192
|
+
"title": "Omniscale OpenStreetMap WMS",
|
|
193
|
+
"layers": [
|
|
194
|
+
{
|
|
195
|
+
"name": "osm",
|
|
196
|
+
"title": "OpenStreetMap (complete map)",
|
|
197
|
+
"sources": ["osm_cache"],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "osm_roads",
|
|
201
|
+
"title": "OpenStreetMap (streets only)",
|
|
202
|
+
"sources": ["osm_roads_cache"],
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
}
|
|
206
|
+
]
|
|
207
|
+
assert len(conf["layers"][0]["layers"]) == 2
|
|
208
|
+
|
|
209
|
+
def test_overwrites(self):
|
|
210
|
+
with capture(bytes=True) as (stdout, stderr):
|
|
211
|
+
assert (
|
|
212
|
+
config_command(
|
|
213
|
+
[
|
|
214
|
+
"mapproxy-conf",
|
|
215
|
+
"--capabilities",
|
|
216
|
+
filename("util-conf-wms-111-cap.xml"),
|
|
217
|
+
"--output",
|
|
218
|
+
self.tmp_filename("mapproxy.yaml"),
|
|
219
|
+
"--overwrite",
|
|
220
|
+
filename("util-conf-overwrite.yaml"),
|
|
221
|
+
"--base",
|
|
222
|
+
filename("util-conf-base-grids.yaml"),
|
|
223
|
+
]
|
|
224
|
+
)
|
|
225
|
+
== 0
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
with open(self.tmp_filename("mapproxy.yaml"), "rb") as f:
|
|
229
|
+
conf = yaml.safe_load(f)
|
|
230
|
+
|
|
231
|
+
assert "grids" not in conf
|
|
232
|
+
assert len(conf["sources"]) == 2
|
|
233
|
+
|
|
234
|
+
assert conf["sources"] == {
|
|
235
|
+
"osm_roads_wms": {
|
|
236
|
+
"supported_srs": ["EPSG:3857"],
|
|
237
|
+
"req": {
|
|
238
|
+
"layers": "osm_roads",
|
|
239
|
+
"url": "http://osm.omniscale.net/proxy/service?",
|
|
240
|
+
"transparent": True,
|
|
241
|
+
"param": 42,
|
|
242
|
+
},
|
|
243
|
+
"type": "wms",
|
|
244
|
+
"coverage": {"srs": "EPSG:4326", "bbox": [0, 0, 90, 90]},
|
|
245
|
+
},
|
|
246
|
+
"osm_wms": {
|
|
247
|
+
"supported_srs": [
|
|
248
|
+
"CRS:84",
|
|
249
|
+
"EPSG:25831",
|
|
250
|
+
"EPSG:25832",
|
|
251
|
+
"EPSG:25833",
|
|
252
|
+
"EPSG:31466",
|
|
253
|
+
"EPSG:31467",
|
|
254
|
+
"EPSG:31468",
|
|
255
|
+
"EPSG:3857",
|
|
256
|
+
"EPSG:4258",
|
|
257
|
+
"EPSG:4326",
|
|
258
|
+
"EPSG:900913",
|
|
259
|
+
],
|
|
260
|
+
"req": {
|
|
261
|
+
"layers": "osm",
|
|
262
|
+
"url": "http://osm.omniscale.net/proxy/service?",
|
|
263
|
+
"transparent": True,
|
|
264
|
+
"param": 42,
|
|
265
|
+
},
|
|
266
|
+
"type": "wms",
|
|
267
|
+
"coverage": {
|
|
268
|
+
"srs": "EPSG:4326",
|
|
269
|
+
"bbox": [-180.0, -85.0511287798, 180.0, 85.0511287798],
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
assert conf["caches"] == {
|
|
275
|
+
"osm_cache": {
|
|
276
|
+
"grids": ["webmercator", "geodetic"],
|
|
277
|
+
"sources": ["osm_wms"],
|
|
278
|
+
"cache": {"type": "sqlite"},
|
|
279
|
+
},
|
|
280
|
+
"osm_roads_cache": {
|
|
281
|
+
"grids": ["webmercator"],
|
|
282
|
+
"sources": ["osm_roads_wms"],
|
|
283
|
+
"cache": {"type": "sqlite"},
|
|
284
|
+
},
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
assert conf["layers"] == [
|
|
288
|
+
{
|
|
289
|
+
"title": "Omniscale OpenStreetMap WMS",
|
|
290
|
+
"layers": [
|
|
291
|
+
{
|
|
292
|
+
"name": "osm",
|
|
293
|
+
"title": "OpenStreetMap (complete map)",
|
|
294
|
+
"sources": ["osm_cache"],
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"name": "osm_roads",
|
|
298
|
+
"title": "OpenStreetMap (streets only)",
|
|
299
|
+
"sources": ["osm_roads_cache"],
|
|
300
|
+
},
|
|
301
|
+
],
|
|
302
|
+
}
|
|
303
|
+
]
|
|
304
|
+
assert len(conf["layers"][0]["layers"]) == 2
|