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,422 @@
|
|
|
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
|
+
import os
|
|
17
|
+
import time
|
|
18
|
+
import shutil
|
|
19
|
+
import tempfile
|
|
20
|
+
|
|
21
|
+
from mapproxy.config.loader import load_configuration
|
|
22
|
+
from mapproxy.cache.tile import Tile
|
|
23
|
+
from mapproxy.image import ImageSource
|
|
24
|
+
from mapproxy.image.opts import ImageOptions
|
|
25
|
+
from mapproxy.seed.seeder import seed
|
|
26
|
+
from mapproxy.seed.cleanup import cleanup
|
|
27
|
+
from mapproxy.seed.config import load_seed_tasks_conf
|
|
28
|
+
from mapproxy.config import local_base_config
|
|
29
|
+
from mapproxy.util.fs import ensure_directory
|
|
30
|
+
|
|
31
|
+
from mapproxy.test.helper import assert_files_in_dir
|
|
32
|
+
from mapproxy.test.http import mock_httpd
|
|
33
|
+
from mapproxy.test.image import tmp_image, create_tmp_image_buf, create_tmp_image
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
FIXTURE_DIR = os.path.join(os.path.dirname(__file__), 'fixture')
|
|
37
|
+
|
|
38
|
+
class SeedTestEnvironment(object):
|
|
39
|
+
def setup(self):
|
|
40
|
+
self.dir = tempfile.mkdtemp()
|
|
41
|
+
shutil.copy(os.path.join(FIXTURE_DIR, self.seed_conf_name), self.dir)
|
|
42
|
+
shutil.copy(os.path.join(FIXTURE_DIR, self.mapproxy_conf_name), self.dir)
|
|
43
|
+
shutil.copy(os.path.join(FIXTURE_DIR, self.empty_ogrdata), self.dir)
|
|
44
|
+
self.seed_conf_file = os.path.join(self.dir, self.seed_conf_name)
|
|
45
|
+
self.mapproxy_conf_file = os.path.join(self.dir, self.mapproxy_conf_name)
|
|
46
|
+
self.mapproxy_conf = load_configuration(self.mapproxy_conf_file, seed=True)
|
|
47
|
+
|
|
48
|
+
def teardown(self):
|
|
49
|
+
shutil.rmtree(self.dir)
|
|
50
|
+
|
|
51
|
+
def make_tile(self, coord=(0, 0, 0), timestamp=None):
|
|
52
|
+
"""
|
|
53
|
+
Create file for tile at `coord` with given timestamp.
|
|
54
|
+
"""
|
|
55
|
+
tile_dir = os.path.join(self.dir, 'cache/one_EPSG4326/%02d/000/000/%03d/000/000/' %
|
|
56
|
+
(coord[2], coord[0]))
|
|
57
|
+
|
|
58
|
+
ensure_directory(tile_dir)
|
|
59
|
+
tile = os.path.join(tile_dir + '%03d.png' % coord[1])
|
|
60
|
+
open(tile, 'wb').write(b'')
|
|
61
|
+
if timestamp:
|
|
62
|
+
os.utime(tile, (timestamp, timestamp))
|
|
63
|
+
return tile
|
|
64
|
+
|
|
65
|
+
def tile_exists(self, coord):
|
|
66
|
+
tile_dir = os.path.join(self.dir, 'cache/one_EPSG4326/%02d/000/000/%03d/000/000/' %
|
|
67
|
+
(coord[2], coord[0]))
|
|
68
|
+
tile = os.path.join(tile_dir + '%03d.png' % coord[1])
|
|
69
|
+
return os.path.exists(tile)
|
|
70
|
+
|
|
71
|
+
class SeedTestBase(SeedTestEnvironment):
|
|
72
|
+
|
|
73
|
+
def test_seed_dry_run(self):
|
|
74
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
75
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
76
|
+
tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
|
|
77
|
+
seed(tasks, dry_run=True)
|
|
78
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=True)
|
|
79
|
+
|
|
80
|
+
def test_seed(self):
|
|
81
|
+
with tmp_image((256, 256), format='png') as img:
|
|
82
|
+
img_data = img.read()
|
|
83
|
+
expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
84
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
85
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
86
|
+
{'body': img_data, 'headers': {'content-type': 'image/png'}})
|
|
87
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
88
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
89
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
90
|
+
tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
|
|
91
|
+
seed(tasks, dry_run=False)
|
|
92
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
93
|
+
|
|
94
|
+
def test_seed_skip_uncached(self):
|
|
95
|
+
with tmp_image((256, 256), format='png') as img:
|
|
96
|
+
img_data = img.read()
|
|
97
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
98
|
+
expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
99
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
100
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
101
|
+
{'body': img_data, 'headers': {'content-type': 'image/png'}})
|
|
102
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
103
|
+
tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
|
|
104
|
+
|
|
105
|
+
# tile not in cache => skipped by seeder
|
|
106
|
+
seed(tasks, dry_run=False, skip_uncached=True)
|
|
107
|
+
assert not self.tile_exists((0, 0, 0))
|
|
108
|
+
|
|
109
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
110
|
+
# force tile generation in cache (via skip_uncached=False)
|
|
111
|
+
seed(tasks, dry_run=False, skip_uncached=False)
|
|
112
|
+
assert self.tile_exists((0, 0, 0))
|
|
113
|
+
|
|
114
|
+
# no refresh since tile is not older than 1 day (cf. config seed.yaml)
|
|
115
|
+
seed(tasks, dry_run=False, skip_uncached=True)
|
|
116
|
+
|
|
117
|
+
# create stale tile (older than 1 day)
|
|
118
|
+
self.make_tile((0, 0, 0), timestamp=time.time() - (60*60*25))
|
|
119
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
120
|
+
# check that old tile in cache is refreshed
|
|
121
|
+
seed(tasks, dry_run=False, skip_uncached=True)
|
|
122
|
+
assert self.tile_exists((0, 0, 0))
|
|
123
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
124
|
+
|
|
125
|
+
def test_reseed_uptodate(self):
|
|
126
|
+
# tile already there.
|
|
127
|
+
self.make_tile((0, 0, 0))
|
|
128
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
129
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
130
|
+
tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
|
|
131
|
+
seed(tasks, dry_run=False)
|
|
132
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
133
|
+
|
|
134
|
+
class TestSeedOldConfiguration(SeedTestBase):
|
|
135
|
+
seed_conf_name = 'seed_old.yaml'
|
|
136
|
+
mapproxy_conf_name = 'seed_mapproxy.yaml'
|
|
137
|
+
empty_ogrdata = 'empty_ogrdata.geojson'
|
|
138
|
+
|
|
139
|
+
def test_reseed_remove_before(self):
|
|
140
|
+
# tile already there but too old
|
|
141
|
+
t000 = self.make_tile((0, 0, 0), timestamp=time.time() - (60*60*25))
|
|
142
|
+
# old tile outside the seed view (should be removed)
|
|
143
|
+
t001 = self.make_tile((0, 0, 1), timestamp=time.time() - (60*60*25))
|
|
144
|
+
assert os.path.exists(t000)
|
|
145
|
+
assert os.path.exists(t001)
|
|
146
|
+
with tmp_image((256, 256), format='png') as img:
|
|
147
|
+
img_data = img.read()
|
|
148
|
+
expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
149
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
150
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
151
|
+
{'body': img_data, 'headers': {'content-type': 'image/png'}})
|
|
152
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
153
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
154
|
+
tasks, cleanup_tasks = seed_conf.seeds(), seed_conf.cleanups()
|
|
155
|
+
seed(tasks, dry_run=False)
|
|
156
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
157
|
+
|
|
158
|
+
assert os.path.exists(t000)
|
|
159
|
+
assert os.path.getmtime(t000) - 5 < time.time() < os.path.getmtime(t000) + 5
|
|
160
|
+
assert not os.path.exists(t001)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
tile_image_buf = create_tmp_image_buf((256, 256), color='blue')
|
|
164
|
+
tile_image = create_tmp_image((256, 256), color='blue')
|
|
165
|
+
|
|
166
|
+
class TestSeed(SeedTestBase):
|
|
167
|
+
seed_conf_name = 'seed.yaml'
|
|
168
|
+
mapproxy_conf_name = 'seed_mapproxy.yaml'
|
|
169
|
+
empty_ogrdata = 'empty_ogrdata.geojson'
|
|
170
|
+
|
|
171
|
+
def test_cleanup_levels(self):
|
|
172
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
173
|
+
cleanup_tasks = seed_conf.cleanups(['cleanup'])
|
|
174
|
+
|
|
175
|
+
self.make_tile((0, 0, 0))
|
|
176
|
+
self.make_tile((0, 0, 1))
|
|
177
|
+
self.make_tile((0, 0, 2))
|
|
178
|
+
self.make_tile((0, 0, 3))
|
|
179
|
+
|
|
180
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
181
|
+
assert not self.tile_exists((0, 0, 0))
|
|
182
|
+
assert not self.tile_exists((0, 0, 1))
|
|
183
|
+
assert self.tile_exists((0, 0, 2))
|
|
184
|
+
assert not self.tile_exists((0, 0, 3))
|
|
185
|
+
|
|
186
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'one_EPSG4326'),
|
|
187
|
+
['02'])
|
|
188
|
+
|
|
189
|
+
def test_cleanup_remove_all(self):
|
|
190
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
191
|
+
cleanup_tasks = seed_conf.cleanups(['remove_all'])
|
|
192
|
+
|
|
193
|
+
self.make_tile((0, 0, 0))
|
|
194
|
+
self.make_tile((0, 0, 1))
|
|
195
|
+
self.make_tile((1, 0, 1))
|
|
196
|
+
self.make_tile((0, 1, 1))
|
|
197
|
+
self.make_tile((1, 1, 1))
|
|
198
|
+
self.make_tile((0, 0, 2))
|
|
199
|
+
self.make_tile((0, 0, 3))
|
|
200
|
+
|
|
201
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'one_EPSG4326'),
|
|
202
|
+
['00', '01', '02', '03'])
|
|
203
|
+
|
|
204
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
205
|
+
assert self.tile_exists((0, 0, 0))
|
|
206
|
+
assert not self.tile_exists((0, 0, 1))
|
|
207
|
+
assert not self.tile_exists((1, 0, 1))
|
|
208
|
+
assert not self.tile_exists((0, 1, 1))
|
|
209
|
+
assert not self.tile_exists((1, 1, 1))
|
|
210
|
+
assert not self.tile_exists((0, 0, 1))
|
|
211
|
+
assert self.tile_exists((0, 0, 2))
|
|
212
|
+
assert self.tile_exists((0, 0, 3))
|
|
213
|
+
|
|
214
|
+
# remove_all should remove the whole directory
|
|
215
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'one_EPSG4326'),
|
|
216
|
+
['00', '02', '03'])
|
|
217
|
+
|
|
218
|
+
def test_cleanup_coverage(self):
|
|
219
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
220
|
+
cleanup_tasks = seed_conf.cleanups(['with_coverage'])
|
|
221
|
+
|
|
222
|
+
self.make_tile((0, 0, 0))
|
|
223
|
+
self.make_tile((1, 0, 1))
|
|
224
|
+
self.make_tile((2, 0, 2))
|
|
225
|
+
self.make_tile((2, 0, 3))
|
|
226
|
+
self.make_tile((4, 0, 3))
|
|
227
|
+
|
|
228
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
229
|
+
assert not self.tile_exists((0, 0, 0))
|
|
230
|
+
assert not self.tile_exists((1, 0, 1))
|
|
231
|
+
assert self.tile_exists((2, 0, 2))
|
|
232
|
+
assert not self.tile_exists((2, 0, 3))
|
|
233
|
+
assert self.tile_exists((4, 0, 3))
|
|
234
|
+
|
|
235
|
+
def test_seed_mbtile(self):
|
|
236
|
+
with tmp_image((256, 256), format='png') as img:
|
|
237
|
+
img_data = img.read()
|
|
238
|
+
expected_req = ({'path': r'/service?LAYERS=bar&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
239
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
240
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
241
|
+
{'body': img_data, 'headers': {'content-type': 'image/png'}})
|
|
242
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
243
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
244
|
+
tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache']), seed_conf.cleanups(['cleanup_mbtile_cache'])
|
|
245
|
+
seed(tasks, dry_run=False)
|
|
246
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
247
|
+
|
|
248
|
+
def create_tile(self, coord=(0, 0, 0)):
|
|
249
|
+
return Tile(coord,
|
|
250
|
+
ImageSource(tile_image_buf,
|
|
251
|
+
image_opts=ImageOptions(format='image/png')))
|
|
252
|
+
|
|
253
|
+
def test_reseed_mbtiles(self):
|
|
254
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
255
|
+
tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache']), seed_conf.cleanups(['cleanup_mbtile_cache'])
|
|
256
|
+
|
|
257
|
+
cache = tasks[0].tile_manager.cache
|
|
258
|
+
cache.store_tile(self.create_tile())
|
|
259
|
+
# no refresh before
|
|
260
|
+
seed(tasks, dry_run=False)
|
|
261
|
+
|
|
262
|
+
def test_reseed_mbtiles_with_refresh(self):
|
|
263
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
264
|
+
tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache_refresh']), seed_conf.cleanups(['cleanup_mbtile_cache'])
|
|
265
|
+
|
|
266
|
+
cache = tasks[0].tile_manager.cache
|
|
267
|
+
cache.store_tile(self.create_tile())
|
|
268
|
+
|
|
269
|
+
expected_req = ({'path': r'/service?LAYERS=bar&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
270
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
271
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
272
|
+
{'body': tile_image, 'headers': {'content-type': 'image/png'}})
|
|
273
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
274
|
+
# mbtiles does not support timestamps, refresh all tiles
|
|
275
|
+
seed(tasks, dry_run=False)
|
|
276
|
+
|
|
277
|
+
def test_cleanup_mbtiles(self):
|
|
278
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
279
|
+
tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache_refresh']), seed_conf.cleanups(['cleanup_mbtile_cache'])
|
|
280
|
+
|
|
281
|
+
cache = tasks[0].tile_manager.cache
|
|
282
|
+
cache.store_tile(self.create_tile())
|
|
283
|
+
|
|
284
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
285
|
+
|
|
286
|
+
def test_cleanup_sqlite(self):
|
|
287
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
288
|
+
cleanup_tasks = seed_conf.cleanups(['sqlite_cache'])
|
|
289
|
+
|
|
290
|
+
cache = cleanup_tasks[0].tile_manager.cache
|
|
291
|
+
cache.store_tile(self.create_tile((0, 0, 2)))
|
|
292
|
+
cache.store_tile(self.create_tile((0, 0, 3)))
|
|
293
|
+
assert cache.is_cached(Tile((0, 0, 2)))
|
|
294
|
+
assert cache.is_cached(Tile((0, 0, 3)))
|
|
295
|
+
|
|
296
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
|
|
297
|
+
['2.mbtile', '3.mbtile'],
|
|
298
|
+
glob='*.mbtile')
|
|
299
|
+
|
|
300
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
301
|
+
|
|
302
|
+
# 3.mbtile file is still there
|
|
303
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
|
|
304
|
+
['2.mbtile', '3.mbtile'],
|
|
305
|
+
glob='*.mbtile')
|
|
306
|
+
assert cache.is_cached(Tile((0, 0, 2)))
|
|
307
|
+
assert not cache.is_cached(Tile((0, 0, 3)))
|
|
308
|
+
|
|
309
|
+
def test_cleanup_sqlite_remove_all(self):
|
|
310
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
311
|
+
cleanup_tasks = seed_conf.cleanups(['sqlite_cache_remove_all'])
|
|
312
|
+
|
|
313
|
+
cache = cleanup_tasks[0].tile_manager.cache
|
|
314
|
+
cache.store_tile(self.create_tile((0, 0, 2)))
|
|
315
|
+
cache.store_tile(self.create_tile((0, 0, 3)))
|
|
316
|
+
assert cache.is_cached(Tile((0, 0, 2)))
|
|
317
|
+
assert cache.is_cached(Tile((0, 0, 3)))
|
|
318
|
+
|
|
319
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
|
|
320
|
+
['2.mbtile', '3.mbtile'],
|
|
321
|
+
glob='*.mbtile')
|
|
322
|
+
|
|
323
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
324
|
+
|
|
325
|
+
# 3.mbtile file should be removed completely
|
|
326
|
+
assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
|
|
327
|
+
['3.mbtile'],
|
|
328
|
+
glob='*.mbtile')
|
|
329
|
+
assert not cache.is_cached(Tile((0, 0, 2)))
|
|
330
|
+
assert cache.is_cached(Tile((0, 0, 3)))
|
|
331
|
+
|
|
332
|
+
def test_active_seed_tasks(self):
|
|
333
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
334
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
335
|
+
assert len(seed_conf.seed_tasks_names()) == 5
|
|
336
|
+
assert len(seed_conf.seeds()) == 5
|
|
337
|
+
|
|
338
|
+
def test_seed_refresh_remove_before_from_file(self):
|
|
339
|
+
# tile already there but old
|
|
340
|
+
t000 = self.make_tile((0, 0, 0), timestamp=time.time() - (60*60*25))
|
|
341
|
+
|
|
342
|
+
# mtime is older than tile, no create of the tile
|
|
343
|
+
timestamp = time.time() - (60*60*30)
|
|
344
|
+
os.utime(self.seed_conf_file, (timestamp, timestamp))
|
|
345
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
346
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
347
|
+
tasks = seed_conf.seeds(['refresh_from_file'])
|
|
348
|
+
seed(tasks, dry_run=False)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
# touch the seed_conf file and refresh everything
|
|
352
|
+
os.utime(self.seed_conf_file, None)
|
|
353
|
+
img_data = create_tmp_image((256, 256), format='png')
|
|
354
|
+
expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
355
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
356
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
357
|
+
{'body': img_data, 'headers': {'content-type': 'image/png'}})
|
|
358
|
+
with mock_httpd(('localhost', 42423), [expected_req]):
|
|
359
|
+
# touch the seed_conf file and refresh everything
|
|
360
|
+
timestamp = time.time() - 60
|
|
361
|
+
os.utime(self.seed_conf_file, (timestamp, timestamp))
|
|
362
|
+
|
|
363
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
364
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
365
|
+
tasks = seed_conf.seeds(['refresh_from_file'])
|
|
366
|
+
seed(tasks, dry_run=False)
|
|
367
|
+
|
|
368
|
+
assert os.path.exists(t000)
|
|
369
|
+
assert os.path.getmtime(t000) - 5 < time.time() < os.path.getmtime(t000) + 5
|
|
370
|
+
|
|
371
|
+
# mtime is older than tile, no cleanup
|
|
372
|
+
timestamp = time.time() - 5
|
|
373
|
+
os.utime(self.seed_conf_file, (timestamp, timestamp))
|
|
374
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
375
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
376
|
+
cleanup_tasks = seed_conf.cleanups(['remove_from_file'])
|
|
377
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
378
|
+
assert os.path.exists(t000)
|
|
379
|
+
|
|
380
|
+
# now touch the seed_conf again and remove everything
|
|
381
|
+
timestamp = time.time() + 5
|
|
382
|
+
os.utime(self.seed_conf_file, (timestamp, timestamp))
|
|
383
|
+
with local_base_config(self.mapproxy_conf.base_config):
|
|
384
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
385
|
+
cleanup_tasks = seed_conf.cleanups(['remove_from_file'])
|
|
386
|
+
cleanup(cleanup_tasks, verbose=False, dry_run=False)
|
|
387
|
+
assert not os.path.exists(t000)
|
|
388
|
+
|
|
389
|
+
class TestConcurrentRequestsSeed(SeedTestEnvironment):
|
|
390
|
+
seed_conf_name = 'seed_timeouts.yaml'
|
|
391
|
+
mapproxy_conf_name = 'seed_timeouts_mapproxy.yaml'
|
|
392
|
+
empty_ogrdata = 'empty_ogrdata.geojson'
|
|
393
|
+
|
|
394
|
+
def test_timeout(self):
|
|
395
|
+
# test concurrent seeding where seed concurrency is higher than the permitted
|
|
396
|
+
# concurrent_request value of the source and a lock times out
|
|
397
|
+
|
|
398
|
+
seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
|
|
399
|
+
tasks = seed_conf.seeds(['test'])
|
|
400
|
+
|
|
401
|
+
expected_req1 = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
402
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
403
|
+
'&width=256&height=128&srs=EPSG:4326'},
|
|
404
|
+
{'body': tile_image, 'headers': {'content-type': 'image/png'}, 'duration': 0.1})
|
|
405
|
+
|
|
406
|
+
expected_req2 = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
407
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
408
|
+
'&width=512&height=256&srs=EPSG:4326'},
|
|
409
|
+
{'body': tile_image, 'headers': {'content-type': 'image/png'}, 'duration': 0.1})
|
|
410
|
+
|
|
411
|
+
expected_req3 = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
|
|
412
|
+
'&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
|
|
413
|
+
'&width=1024&height=512&srs=EPSG:4326'},
|
|
414
|
+
{'body': tile_image, 'headers': {'content-type': 'image/png'}, 'duration': 0.1})
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
with mock_httpd(('localhost', 42423), [expected_req1, expected_req2, expected_req3], unordered=True):
|
|
418
|
+
seed(tasks, dry_run=False, concurrency=3)
|
|
419
|
+
# concurrency=3, concurrent_request=1, client_timeout=0.2, response delay=0.1
|
|
420
|
+
# the third request should time out (3x0.1 > 0.2), but exp_backoff() in the seeder ignores this
|
|
421
|
+
# timeout exception and tries a second time
|
|
422
|
+
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
|
23
|
+
from mapproxy.compat.image import Image
|
|
24
|
+
from mapproxy.test.image import is_png, is_jpeg
|
|
25
|
+
from mapproxy.test.system import SysTest
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture(scope="module")
|
|
29
|
+
def config_file():
|
|
30
|
+
return "seedonly.yaml"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TestSeedOnlyWMS(SysTest):
|
|
34
|
+
|
|
35
|
+
def setup(self):
|
|
36
|
+
self.common_map_req = WMS111MapRequest(
|
|
37
|
+
url="/service?",
|
|
38
|
+
param=dict(
|
|
39
|
+
service="WMS",
|
|
40
|
+
version="1.1.1",
|
|
41
|
+
bbox="-180,0,0,80",
|
|
42
|
+
width="200",
|
|
43
|
+
height="200",
|
|
44
|
+
layers="wms_cache",
|
|
45
|
+
srs="EPSG:4326",
|
|
46
|
+
format="image/png",
|
|
47
|
+
styles="",
|
|
48
|
+
request="GetMap",
|
|
49
|
+
transparent=True,
|
|
50
|
+
),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def test_get_map_cached(self, app, fixture_cache_data):
|
|
54
|
+
resp = app.get(self.common_map_req)
|
|
55
|
+
assert resp.content_type == "image/png"
|
|
56
|
+
data = BytesIO(resp.body)
|
|
57
|
+
assert is_png(data)
|
|
58
|
+
img = Image.open(data)
|
|
59
|
+
assert img.mode == "RGB"
|
|
60
|
+
# cached image has more that 256 colors, getcolors -> None
|
|
61
|
+
assert img.getcolors() == None
|
|
62
|
+
|
|
63
|
+
def test_get_map_uncached(self, app):
|
|
64
|
+
self.common_map_req.params["bbox"] = "10,10,20,20"
|
|
65
|
+
resp = app.get(self.common_map_req)
|
|
66
|
+
assert resp.content_type == "image/png"
|
|
67
|
+
data = BytesIO(resp.body)
|
|
68
|
+
assert is_png(data)
|
|
69
|
+
img = Image.open(data)
|
|
70
|
+
assert img.mode == "RGBA"
|
|
71
|
+
assert img.getcolors() == [(200 * 200, (255, 255, 255, 0))]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class TestSeedOnlyTMS(SysTest):
|
|
75
|
+
|
|
76
|
+
def test_get_tile_cached(self, app, fixture_cache_data):
|
|
77
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/1.jpeg")
|
|
78
|
+
assert resp.content_type == "image/jpeg"
|
|
79
|
+
data = BytesIO(resp.body)
|
|
80
|
+
assert is_jpeg(data)
|
|
81
|
+
img = Image.open(data)
|
|
82
|
+
assert img.mode == "RGB"
|
|
83
|
+
# cached image has more that 256 colors, getcolors -> None
|
|
84
|
+
assert img.getcolors() == None
|
|
85
|
+
|
|
86
|
+
def test_get_tile_uncached(self, app):
|
|
87
|
+
resp = app.get("/tms/1.0.0/wms_cache/0/0/0.jpeg")
|
|
88
|
+
assert resp.content_type == "image/png"
|
|
89
|
+
data = BytesIO(resp.body)
|
|
90
|
+
assert is_png(data)
|
|
91
|
+
img = Image.open(data)
|
|
92
|
+
assert img.mode == "RGBA"
|
|
93
|
+
assert img.getcolors() == [(256 * 256, (255, 255, 255, 0))]
|
|
@@ -0,0 +1,120 @@
|
|
|
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
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from urllib.parse import quote
|
|
22
|
+
except ImportError:
|
|
23
|
+
from urllib import quote
|
|
24
|
+
|
|
25
|
+
from mapproxy.request.wms import WMS111MapRequest
|
|
26
|
+
from mapproxy.test.system import SysTest
|
|
27
|
+
from mapproxy.test.http import mock_httpd
|
|
28
|
+
from mapproxy.test.image import create_tmp_image
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.fixture(scope="module")
|
|
32
|
+
def config_file():
|
|
33
|
+
return "sld.yaml"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
TESTSERVER_ADDRESS = "localhost", 42423
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class TestWMS(SysTest):
|
|
40
|
+
|
|
41
|
+
@pytest.fixture(scope="class")
|
|
42
|
+
def additional_files(self, base_dir):
|
|
43
|
+
base_dir.join("mysld.xml").write("<sld>")
|
|
44
|
+
|
|
45
|
+
def setup(self):
|
|
46
|
+
self.common_map_req = WMS111MapRequest(
|
|
47
|
+
url="/service?",
|
|
48
|
+
param=dict(
|
|
49
|
+
service="WMS",
|
|
50
|
+
version="1.1.1",
|
|
51
|
+
bbox="0,0,10,10",
|
|
52
|
+
width="200",
|
|
53
|
+
height="200",
|
|
54
|
+
srs="EPSG:4326",
|
|
55
|
+
format="image/png",
|
|
56
|
+
styles="",
|
|
57
|
+
request="GetMap",
|
|
58
|
+
exceptions="xml",
|
|
59
|
+
),
|
|
60
|
+
)
|
|
61
|
+
self.common_wms_url = (
|
|
62
|
+
"/service?styles=&srs=EPSG%3A4326&version=1.1.1&"
|
|
63
|
+
"bbox=0.0,0.0,10.0,10.0&service=WMS&format=image%2Fpng&request=GetMap"
|
|
64
|
+
"&width=200&height=200"
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def test_sld_url(self, app):
|
|
68
|
+
self.common_map_req.params["layers"] = "sld_url"
|
|
69
|
+
with mock_httpd(
|
|
70
|
+
TESTSERVER_ADDRESS,
|
|
71
|
+
[
|
|
72
|
+
(
|
|
73
|
+
{
|
|
74
|
+
"path": self.common_wms_url
|
|
75
|
+
+ "&sld="
|
|
76
|
+
+ quote("http://example.org/sld.xml"),
|
|
77
|
+
"method": "GET",
|
|
78
|
+
},
|
|
79
|
+
{"body": create_tmp_image((200, 200), format="png")},
|
|
80
|
+
)
|
|
81
|
+
],
|
|
82
|
+
):
|
|
83
|
+
resp = app.get(self.common_map_req)
|
|
84
|
+
assert resp.content_type == "image/png"
|
|
85
|
+
|
|
86
|
+
def test_sld_file(self, app):
|
|
87
|
+
self.common_map_req.params["layers"] = "sld_file"
|
|
88
|
+
with mock_httpd(
|
|
89
|
+
TESTSERVER_ADDRESS,
|
|
90
|
+
[
|
|
91
|
+
(
|
|
92
|
+
{
|
|
93
|
+
"path": self.common_wms_url + "&sld_body=" + quote("<sld>"),
|
|
94
|
+
"method": "GET",
|
|
95
|
+
},
|
|
96
|
+
{"body": create_tmp_image((200, 200), format="png")},
|
|
97
|
+
)
|
|
98
|
+
],
|
|
99
|
+
):
|
|
100
|
+
resp = app.get(self.common_map_req)
|
|
101
|
+
assert resp.content_type == "image/png"
|
|
102
|
+
|
|
103
|
+
def test_sld_body(self, app):
|
|
104
|
+
self.common_map_req.params["layers"] = "sld_body"
|
|
105
|
+
with mock_httpd(
|
|
106
|
+
TESTSERVER_ADDRESS,
|
|
107
|
+
[
|
|
108
|
+
(
|
|
109
|
+
{
|
|
110
|
+
"path": self.common_wms_url
|
|
111
|
+
+ "&sld_body="
|
|
112
|
+
+ quote("<sld:StyledLayerDescriptor />"),
|
|
113
|
+
"method": "POST",
|
|
114
|
+
},
|
|
115
|
+
{"body": create_tmp_image((200, 200), format="png")},
|
|
116
|
+
)
|
|
117
|
+
],
|
|
118
|
+
):
|
|
119
|
+
resp = app.get(self.common_map_req)
|
|
120
|
+
assert resp.content_type == "image/png"
|