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,178 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2011 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from mapproxy.exception import RequestError
|
|
17
|
+
from mapproxy.request.wmts import wmts_request, WMTS100CapabilitiesRequest
|
|
18
|
+
from mapproxy.request.wmts import (
|
|
19
|
+
URLTemplateConverter,
|
|
20
|
+
FeatureInfoURLTemplateConverter,
|
|
21
|
+
InvalidWMTSTemplate,
|
|
22
|
+
make_wmts_rest_request_parser,
|
|
23
|
+
WMTS100RestTileRequest,
|
|
24
|
+
WMTS100RestFeatureInfoRequest,
|
|
25
|
+
)
|
|
26
|
+
from mapproxy.request.base import url_decode
|
|
27
|
+
|
|
28
|
+
import pytest
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def dummy_req(args):
|
|
32
|
+
return DummyRequest(url_decode(args.replace("\n", "")))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def dummy_rest_req(path):
|
|
36
|
+
return DummyRequest(args="", path=path)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class DummyRequest(object):
|
|
40
|
+
|
|
41
|
+
def __init__(self, args, path="", url=""):
|
|
42
|
+
self.args = args
|
|
43
|
+
self.path = path
|
|
44
|
+
self.base_url = url
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_tile_request():
|
|
48
|
+
args = """requeST=GetTile&service=wmts&tileMatrixset=EPSG900913&
|
|
49
|
+
tilematrix=2&tileROW=4&TILECOL=2&FORMAT=image/png&Style=&layer=Foo&version=1.0.0"""
|
|
50
|
+
req = wmts_request(dummy_req(args))
|
|
51
|
+
|
|
52
|
+
assert req.params.coord == (2, 4, "2")
|
|
53
|
+
assert req.params.layer == "Foo"
|
|
54
|
+
assert req.params.format == "png"
|
|
55
|
+
assert req.params.tilematrixset == "EPSG900913"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_featureinfo_request():
|
|
59
|
+
args = """requeST=GetFeatureInfo&service=wmts&tileMatrixset=EPSG900913&
|
|
60
|
+
tilematrix=2&tileROW=4&TILECOL=2&FORMAT=image/png&Style=&layer=Foo&version=1.0.0&
|
|
61
|
+
i=5&j=10&infoformat=application/json"""
|
|
62
|
+
req = wmts_request(dummy_req(args))
|
|
63
|
+
|
|
64
|
+
assert req.params.coord == (2, 4, "2")
|
|
65
|
+
assert req.params.layer == "Foo"
|
|
66
|
+
assert req.params.format == "png"
|
|
67
|
+
assert req.params.tilematrixset == "EPSG900913"
|
|
68
|
+
assert req.params.pos == (5, 10)
|
|
69
|
+
assert req.params.infoformat == "application/json"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_capabilities_request():
|
|
73
|
+
args = """requeST=GetCapabilities&service=wmts"""
|
|
74
|
+
req = wmts_request(dummy_req(args))
|
|
75
|
+
|
|
76
|
+
assert isinstance(req, WMTS100CapabilitiesRequest)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_template_converter():
|
|
80
|
+
regexp = URLTemplateConverter(
|
|
81
|
+
"/{Layer}/{Style}/{TileMatrixSet}-{TileMatrix}-{TileCol}-{TileRow}/tile"
|
|
82
|
+
).regexp()
|
|
83
|
+
match = regexp.match("/wmts/test/bar/foo-EPSG4326-4-12-99/tile")
|
|
84
|
+
assert match
|
|
85
|
+
assert match.groupdict()["Layer"] == "test"
|
|
86
|
+
assert match.groupdict()["TileMatrixSet"] == "foo-EPSG4326"
|
|
87
|
+
assert match.groupdict()["TileMatrix"] == "4"
|
|
88
|
+
assert match.groupdict()["TileCol"] == "12"
|
|
89
|
+
assert match.groupdict()["TileRow"] == "99"
|
|
90
|
+
assert match.groupdict()["Style"] == "bar"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_template_converter_deprecated_format():
|
|
94
|
+
# old format that doesn't match the WMTS spec, now deprecated
|
|
95
|
+
regexp = URLTemplateConverter(
|
|
96
|
+
"/{{Layer}}/{{Style}}/{{TileMatrixSet}}-{{TileMatrix}}-{{TileCol}}-{{TileRow}}/tile"
|
|
97
|
+
).regexp()
|
|
98
|
+
match = regexp.match("/wmts/test/bar/foo-EPSG4326-4-12-99/tile")
|
|
99
|
+
assert match
|
|
100
|
+
assert match.groupdict()["Layer"] == "test"
|
|
101
|
+
assert match.groupdict()["TileMatrixSet"] == "foo-EPSG4326"
|
|
102
|
+
assert match.groupdict()["TileMatrix"] == "4"
|
|
103
|
+
assert match.groupdict()["TileCol"] == "12"
|
|
104
|
+
assert match.groupdict()["TileRow"] == "99"
|
|
105
|
+
assert match.groupdict()["Style"] == "bar"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def test_template_converter_missing_vars():
|
|
109
|
+
with pytest.raises(InvalidWMTSTemplate):
|
|
110
|
+
URLTemplateConverter("/wmts/{Style}/{TileMatrixSet}/{TileCol}.png").regexp()
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def test_template_converter_dimensions():
|
|
114
|
+
converter = URLTemplateConverter(
|
|
115
|
+
"/{Layer}/{Dim1}/{Dim2}/{TileMatrixSet}-{TileMatrix}-{TileCol}-{TileRow}/tile"
|
|
116
|
+
)
|
|
117
|
+
assert converter.dimensions == ["Dim1", "Dim2"]
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class TestRestRequestParser(object):
|
|
121
|
+
|
|
122
|
+
@pytest.fixture
|
|
123
|
+
def parser(self):
|
|
124
|
+
return make_wmts_rest_request_parser(
|
|
125
|
+
URLTemplateConverter(
|
|
126
|
+
"/{Layer}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.{Format}"
|
|
127
|
+
),
|
|
128
|
+
FeatureInfoURLTemplateConverter(
|
|
129
|
+
"/{Layer}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}/{I}/{J}.{InfoFormat}"
|
|
130
|
+
),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
@pytest.mark.parametrize(
|
|
134
|
+
"url,tile,pos",
|
|
135
|
+
[
|
|
136
|
+
["/wmts/roads/webmercator/09/201/123/10/30.json", (201, 123, 9), (10, 30)],
|
|
137
|
+
["/wmts/roads/webmercator/10/201/1/0/999.json", (201, 1, 10), (0, 999)],
|
|
138
|
+
["/wmts/roads/webmercator/09/201/123/10/30json", None, None],
|
|
139
|
+
["/wmts/roads/webmercator/09/201/123/10.json", None, None],
|
|
140
|
+
["/wmts/roads-webmercator/09/201/123/10/30.json", None, None],
|
|
141
|
+
["/roads/webmercator/09/201/123/10/30.json", None, None],
|
|
142
|
+
],
|
|
143
|
+
)
|
|
144
|
+
def test_featureinfo(self, parser, url, tile, pos):
|
|
145
|
+
if tile is None:
|
|
146
|
+
with pytest.raises(RequestError):
|
|
147
|
+
parser(dummy_rest_req(url))
|
|
148
|
+
else:
|
|
149
|
+
req = parser(dummy_rest_req(url))
|
|
150
|
+
assert isinstance(req, WMTS100RestFeatureInfoRequest)
|
|
151
|
+
req.make_request()
|
|
152
|
+
assert req.pos == pos
|
|
153
|
+
assert req.tile == tile
|
|
154
|
+
assert req.infoformat == "json"
|
|
155
|
+
assert req.tilematrixset == "webmercator"
|
|
156
|
+
|
|
157
|
+
@pytest.mark.parametrize(
|
|
158
|
+
"url,tile",
|
|
159
|
+
[
|
|
160
|
+
["/wmts/roads/webmercator/09/201/123.png", (201, 123, 9)],
|
|
161
|
+
["/wmts/roads/webmercator/10/201/123.png", (201, 123, 10)],
|
|
162
|
+
["/wmts/roads/webmercator/10/201/123a.png", None],
|
|
163
|
+
["/wmts/roads/webmercator/10/201/123png", None],
|
|
164
|
+
["/wmts/roads/webmercator/10/2013.png", None],
|
|
165
|
+
["/wmts/roads-webmercator/10/201/123.png", None],
|
|
166
|
+
],
|
|
167
|
+
)
|
|
168
|
+
def test_tile(self, parser, url, tile):
|
|
169
|
+
if tile is None:
|
|
170
|
+
with pytest.raises(RequestError):
|
|
171
|
+
parser(dummy_rest_req(url))
|
|
172
|
+
else:
|
|
173
|
+
req = parser(dummy_rest_req(url))
|
|
174
|
+
assert isinstance(req, WMTS100RestTileRequest)
|
|
175
|
+
req.make_request()
|
|
176
|
+
assert req.tile == tile
|
|
177
|
+
assert req.format == "png"
|
|
178
|
+
assert req.tilematrixset == "webmercator"
|
|
@@ -0,0 +1,79 @@
|
|
|
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 io import BytesIO
|
|
17
|
+
|
|
18
|
+
from mapproxy.test.helper import Mocker
|
|
19
|
+
from mapproxy.test.mocker import ANY
|
|
20
|
+
from mapproxy.response import Response
|
|
21
|
+
from mapproxy.compat import string_type
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TestResponse(Mocker):
|
|
25
|
+
|
|
26
|
+
def test_str_response(self):
|
|
27
|
+
resp = Response("string content")
|
|
28
|
+
assert isinstance(resp.response, string_type)
|
|
29
|
+
start_response = self.mock()
|
|
30
|
+
self.expect(start_response("200 OK", ANY))
|
|
31
|
+
self.replay()
|
|
32
|
+
result = resp({"REQUEST_METHOD": "GET"}, start_response)
|
|
33
|
+
assert next(result) == b"string content"
|
|
34
|
+
|
|
35
|
+
def test_itr_response(self):
|
|
36
|
+
resp = Response(iter(["string content", "as iterable"]))
|
|
37
|
+
assert hasattr(resp.response, "next") or hasattr(resp.response, "__next__")
|
|
38
|
+
start_response = self.mock()
|
|
39
|
+
self.expect(start_response("200 OK", ANY))
|
|
40
|
+
self.replay()
|
|
41
|
+
result = resp({"REQUEST_METHOD": "GET"}, start_response)
|
|
42
|
+
assert next(result) == "string content"
|
|
43
|
+
assert next(result) == "as iterable"
|
|
44
|
+
|
|
45
|
+
def test_file_response(self):
|
|
46
|
+
data = BytesIO(b"foobar")
|
|
47
|
+
resp = Response(data)
|
|
48
|
+
assert resp.response == data
|
|
49
|
+
start_response = self.mock()
|
|
50
|
+
self.expect(start_response("200 OK", ANY))
|
|
51
|
+
self.replay()
|
|
52
|
+
result = resp({"REQUEST_METHOD": "GET"}, start_response)
|
|
53
|
+
assert next(result) == b"foobar"
|
|
54
|
+
|
|
55
|
+
def test_file_response_w_file_wrapper(self):
|
|
56
|
+
data = BytesIO(b"foobar")
|
|
57
|
+
resp = Response(data)
|
|
58
|
+
assert resp.response == data
|
|
59
|
+
start_response = self.mock()
|
|
60
|
+
self.expect(start_response("200 OK", ANY))
|
|
61
|
+
|
|
62
|
+
file_wrapper = self.mock()
|
|
63
|
+
self.expect(file_wrapper(data, resp.block_size)).result("DUMMY")
|
|
64
|
+
self.replay()
|
|
65
|
+
|
|
66
|
+
result = resp(
|
|
67
|
+
{"REQUEST_METHOD": "GET", "wsgi.file_wrapper": file_wrapper}, start_response
|
|
68
|
+
)
|
|
69
|
+
assert result == "DUMMY"
|
|
70
|
+
|
|
71
|
+
def test_file_response_content_length(self):
|
|
72
|
+
data = BytesIO(b"*" * 342)
|
|
73
|
+
resp = Response(data)
|
|
74
|
+
assert resp.response == data
|
|
75
|
+
start_response = self.mock()
|
|
76
|
+
self.expect(start_response("200 OK", ANY))
|
|
77
|
+
self.replay()
|
|
78
|
+
resp({"REQUEST_METHOD": "GET"}, start_response)
|
|
79
|
+
assert resp.content_length == 342
|
|
@@ -0,0 +1,365 @@
|
|
|
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
|
+
from __future__ import division
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
import time
|
|
20
|
+
from collections import defaultdict
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
import cPickle as pickle
|
|
24
|
+
except ImportError:
|
|
25
|
+
import pickle
|
|
26
|
+
|
|
27
|
+
import pytest
|
|
28
|
+
|
|
29
|
+
from mapproxy.seed.seeder import TileWalker, SeedTask, SeedProgress
|
|
30
|
+
from mapproxy.cache.dummy import DummyLocker
|
|
31
|
+
from mapproxy.cache.tile import TileManager
|
|
32
|
+
from mapproxy.source.tile import TiledSource
|
|
33
|
+
from mapproxy.grid import tile_grid_for_epsg
|
|
34
|
+
from mapproxy.grid import TileGrid
|
|
35
|
+
from mapproxy.srs import SRS
|
|
36
|
+
from mapproxy.util.coverage import BBOXCoverage, GeomCoverage
|
|
37
|
+
from mapproxy.seed.config import before_timestamp_from_options, SeedConfigurationError
|
|
38
|
+
from mapproxy.seed.config import (
|
|
39
|
+
LevelsList,
|
|
40
|
+
LevelsRange,
|
|
41
|
+
LevelsResolutionList,
|
|
42
|
+
LevelsResolutionRange,
|
|
43
|
+
)
|
|
44
|
+
from mapproxy.seed.util import ProgressStore
|
|
45
|
+
from mapproxy.test.helper import TempFile
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
from shapely.wkt import loads as load_wkt
|
|
50
|
+
|
|
51
|
+
load_wkt # prevent lint warning
|
|
52
|
+
except ImportError:
|
|
53
|
+
load_wkt = None
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class MockSeedPool(object):
|
|
57
|
+
|
|
58
|
+
def __init__(self):
|
|
59
|
+
self.seeded_tiles = defaultdict(set)
|
|
60
|
+
|
|
61
|
+
def process(self, tiles, progess):
|
|
62
|
+
for x, y, level in tiles:
|
|
63
|
+
self.seeded_tiles[level].add((x, y))
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class MockCache(object):
|
|
67
|
+
|
|
68
|
+
def is_cached(self, tile,dimensions=None):
|
|
69
|
+
return False
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class TestSeeder(object):
|
|
73
|
+
|
|
74
|
+
def setup(self):
|
|
75
|
+
self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
|
|
76
|
+
self.source = TiledSource(self.grid, None)
|
|
77
|
+
self.tile_mgr = TileManager(
|
|
78
|
+
self.grid, MockCache(), [self.source], "png", locker=DummyLocker()
|
|
79
|
+
)
|
|
80
|
+
self.seed_pool = MockSeedPool()
|
|
81
|
+
|
|
82
|
+
def make_bbox_task(self, bbox, srs, levels):
|
|
83
|
+
md = dict(name="", cache_name="", grid_name="")
|
|
84
|
+
coverage = BBOXCoverage(bbox, srs)
|
|
85
|
+
return SeedTask(
|
|
86
|
+
md, self.tile_mgr, levels, refresh_timestamp=None, coverage=coverage
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def make_geom_task(self, geom, srs, levels):
|
|
90
|
+
md = dict(name="", cache_name="", grid_name="")
|
|
91
|
+
coverage = GeomCoverage(geom, srs)
|
|
92
|
+
return SeedTask(
|
|
93
|
+
md, self.tile_mgr, levels, refresh_timestamp=None, coverage=coverage
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def test_seed_full_bbox(self):
|
|
97
|
+
task = self.make_bbox_task([-180, -90, 180, 90], SRS(4326), [0, 1, 2])
|
|
98
|
+
seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
|
|
99
|
+
seeder.walk()
|
|
100
|
+
|
|
101
|
+
assert len(self.seed_pool.seeded_tiles) == 3
|
|
102
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
103
|
+
assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
|
|
104
|
+
assert self.seed_pool.seeded_tiles[2] == set(
|
|
105
|
+
[(0, 0), (1, 0), (2, 0), (3, 0), (0, 1), (1, 1), (2, 1), (3, 1)]
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
def test_seed_small_bbox(self):
|
|
109
|
+
task = self.make_bbox_task([-45, 0, 180, 90], SRS(4326), [0, 1, 2])
|
|
110
|
+
seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
|
|
111
|
+
seeder.walk()
|
|
112
|
+
|
|
113
|
+
assert len(self.seed_pool.seeded_tiles) == 3
|
|
114
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
115
|
+
assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
|
|
116
|
+
assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1), (3, 1)])
|
|
117
|
+
|
|
118
|
+
def test_seed_small_bbox_iregular_levels(self):
|
|
119
|
+
task = self.make_bbox_task([-45, 0, 180, 90], SRS(4326), [0, 2])
|
|
120
|
+
seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
|
|
121
|
+
seeder.walk()
|
|
122
|
+
|
|
123
|
+
assert len(self.seed_pool.seeded_tiles) == 2
|
|
124
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
125
|
+
assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1), (3, 1)])
|
|
126
|
+
|
|
127
|
+
def test_seed_small_bbox_transformed(self):
|
|
128
|
+
bbox = SRS(4326).transform_bbox_to(SRS(900913), [-45, 0, 179, 80])
|
|
129
|
+
task = self.make_bbox_task(bbox, SRS(900913), [0, 1, 2])
|
|
130
|
+
seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
|
|
131
|
+
seeder.walk()
|
|
132
|
+
|
|
133
|
+
assert len(self.seed_pool.seeded_tiles) == 3
|
|
134
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
135
|
+
assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
|
|
136
|
+
assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1), (3, 1)])
|
|
137
|
+
|
|
138
|
+
@pytest.mark.skipif(not load_wkt, reason="Shapely not installed")
|
|
139
|
+
def test_seed_with_geom(self):
|
|
140
|
+
# box from 10 10 to 80 80 with small spike/corner to -10 60 (upper left)
|
|
141
|
+
geom = load_wkt("POLYGON((10 10, 10 50, -10 60, 10 80, 80 80, 80 10, 10 10))")
|
|
142
|
+
task = self.make_geom_task(geom, SRS(4326), [0, 1, 2, 3, 4])
|
|
143
|
+
seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
|
|
144
|
+
seeder.walk()
|
|
145
|
+
|
|
146
|
+
assert len(self.seed_pool.seeded_tiles) == 5
|
|
147
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
148
|
+
assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
|
|
149
|
+
assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1)])
|
|
150
|
+
assert self.seed_pool.seeded_tiles[3] == set(
|
|
151
|
+
[(4, 2), (5, 2), (4, 3), (5, 3), (3, 3)]
|
|
152
|
+
)
|
|
153
|
+
assert len(self.seed_pool.seeded_tiles[4]) == 4 * 4 + 2
|
|
154
|
+
|
|
155
|
+
@pytest.mark.skipif(not load_wkt, reason="Shapely not installed")
|
|
156
|
+
def test_seed_with_res_list(self):
|
|
157
|
+
# box from 10 10 to 80 80 with small spike/corner to -10 60 (upper left)
|
|
158
|
+
geom = load_wkt("POLYGON((10 10, 10 50, -10 60, 10 80, 80 80, 80 10, 10 10))")
|
|
159
|
+
|
|
160
|
+
self.grid = TileGrid(
|
|
161
|
+
SRS(4326),
|
|
162
|
+
bbox=[-180, -90, 180, 90],
|
|
163
|
+
res=[360 / 256, 360 / 720, 360 / 2000, 360 / 5000, 360 / 8000],
|
|
164
|
+
)
|
|
165
|
+
self.tile_mgr = TileManager(
|
|
166
|
+
self.grid, MockCache(), [self.source], "png", locker=DummyLocker()
|
|
167
|
+
)
|
|
168
|
+
task = self.make_geom_task(geom, SRS(4326), [0, 1, 2, 3, 4])
|
|
169
|
+
seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
|
|
170
|
+
seeder.walk()
|
|
171
|
+
|
|
172
|
+
assert len(self.seed_pool.seeded_tiles) == 5
|
|
173
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
174
|
+
assert self.grid.grid_sizes[1] == (3, 2)
|
|
175
|
+
assert self.seed_pool.seeded_tiles[1] == set([(1, 0), (1, 1), (2, 0), (2, 1)])
|
|
176
|
+
assert self.grid.grid_sizes[2] == (8, 4)
|
|
177
|
+
assert self.seed_pool.seeded_tiles[2] == set(
|
|
178
|
+
[(4, 2), (5, 2), (4, 3), (5, 3), (3, 3)]
|
|
179
|
+
)
|
|
180
|
+
assert self.grid.grid_sizes[3] == (20, 10)
|
|
181
|
+
assert len(self.seed_pool.seeded_tiles[3]) == 5 * 5 + 2
|
|
182
|
+
|
|
183
|
+
def test_seed_full_bbox_continue(self):
|
|
184
|
+
task = self.make_bbox_task([-180, -90, 180, 90], SRS(4326), [0, 1, 2])
|
|
185
|
+
seed_progress = SeedProgress([(0, 1), (1, 2)])
|
|
186
|
+
seeder = TileWalker(
|
|
187
|
+
task, self.seed_pool, handle_uncached=True, seed_progress=seed_progress
|
|
188
|
+
)
|
|
189
|
+
seeder.walk()
|
|
190
|
+
|
|
191
|
+
assert len(self.seed_pool.seeded_tiles) == 3
|
|
192
|
+
assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
|
|
193
|
+
assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
|
|
194
|
+
assert self.seed_pool.seeded_tiles[2] == set([(2, 0), (3, 0), (2, 1), (3, 1)])
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class TestLevels(object):
|
|
198
|
+
|
|
199
|
+
def test_level_list(self):
|
|
200
|
+
levels = LevelsList([-10, 3, 1, 3, 5, 7, 50])
|
|
201
|
+
assert levels.for_grid(tile_grid_for_epsg(4326)) == [1, 3, 5, 7]
|
|
202
|
+
|
|
203
|
+
def test_level_range(self):
|
|
204
|
+
levels = LevelsRange([1, 5])
|
|
205
|
+
assert levels.for_grid(tile_grid_for_epsg(4326)) == [1, 2, 3, 4, 5]
|
|
206
|
+
|
|
207
|
+
def test_level_range_open_from(self):
|
|
208
|
+
levels = LevelsRange([None, 5])
|
|
209
|
+
assert levels.for_grid(tile_grid_for_epsg(4326)) == [0, 1, 2, 3, 4, 5]
|
|
210
|
+
|
|
211
|
+
def test_level_range_open_to(self):
|
|
212
|
+
levels = LevelsRange([13, None])
|
|
213
|
+
assert levels.for_grid(tile_grid_for_epsg(4326)) == [13, 14, 15, 16, 17, 18, 19]
|
|
214
|
+
|
|
215
|
+
def test_level_range_open_tos_range(self):
|
|
216
|
+
levels = LevelsResolutionRange([1000, 100])
|
|
217
|
+
assert levels.for_grid(tile_grid_for_epsg(900913)) == [8, 9, 10, 11]
|
|
218
|
+
|
|
219
|
+
def test_res_range_open_from(self):
|
|
220
|
+
levels = LevelsResolutionRange([None, 100])
|
|
221
|
+
assert levels.for_grid(tile_grid_for_epsg(900913)) == [
|
|
222
|
+
0,
|
|
223
|
+
1,
|
|
224
|
+
2,
|
|
225
|
+
3,
|
|
226
|
+
4,
|
|
227
|
+
5,
|
|
228
|
+
6,
|
|
229
|
+
7,
|
|
230
|
+
8,
|
|
231
|
+
9,
|
|
232
|
+
10,
|
|
233
|
+
11,
|
|
234
|
+
]
|
|
235
|
+
|
|
236
|
+
def test_res_range_open_to(self):
|
|
237
|
+
levels = LevelsResolutionRange([1000, None])
|
|
238
|
+
assert levels.for_grid(tile_grid_for_epsg(900913)) == [
|
|
239
|
+
8,
|
|
240
|
+
9,
|
|
241
|
+
10,
|
|
242
|
+
11,
|
|
243
|
+
12,
|
|
244
|
+
13,
|
|
245
|
+
14,
|
|
246
|
+
15,
|
|
247
|
+
16,
|
|
248
|
+
17,
|
|
249
|
+
18,
|
|
250
|
+
19,
|
|
251
|
+
]
|
|
252
|
+
|
|
253
|
+
def test_resolution_list(self):
|
|
254
|
+
levels = LevelsResolutionList([1000, 100, 500])
|
|
255
|
+
assert levels.for_grid(tile_grid_for_epsg(900913)) == [8, 9, 11]
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class TestProgressStore(object):
|
|
259
|
+
|
|
260
|
+
def test_load_empty(self):
|
|
261
|
+
store = ProgressStore("doesnotexist.no_realy.txt")
|
|
262
|
+
store.load()
|
|
263
|
+
assert store.get(("foo", "bar", "baz")) == None
|
|
264
|
+
|
|
265
|
+
def test_load_store(self):
|
|
266
|
+
with TempFile(no_create=True) as tmp:
|
|
267
|
+
with open(tmp, "wb") as f:
|
|
268
|
+
f.write(pickle.dumps({("view", "cache", "grid"): [(0, 1), (2, 4)]}))
|
|
269
|
+
store = ProgressStore(tmp)
|
|
270
|
+
assert store.get(("view", "cache", "grid")) == [(0, 1), (2, 4)]
|
|
271
|
+
assert store.get(("view", "cache", "grid2")) == None
|
|
272
|
+
store.add(("view", "cache", "grid"), [])
|
|
273
|
+
store.add(("view", "cache", "grid2"), [(0, 1)])
|
|
274
|
+
store.write()
|
|
275
|
+
|
|
276
|
+
store = ProgressStore(tmp)
|
|
277
|
+
assert store.get(("view", "cache", "grid")) == []
|
|
278
|
+
assert store.get(("view", "cache", "grid2")) == [(0, 1)]
|
|
279
|
+
|
|
280
|
+
def test_load_broken(self):
|
|
281
|
+
with TempFile(no_create=True) as tmp:
|
|
282
|
+
with open(tmp, "wb") as f:
|
|
283
|
+
f.write(b"##invaliddata")
|
|
284
|
+
f.write(pickle.dumps({("view", "cache", "grid"): [(0, 1), (2, 4)]}))
|
|
285
|
+
|
|
286
|
+
store = ProgressStore(tmp)
|
|
287
|
+
assert store.status == {}
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class TestRemovebreforeTimetamp(object):
|
|
291
|
+
|
|
292
|
+
def test_from_time(self):
|
|
293
|
+
ts = before_timestamp_from_options({"time": "2010-12-01T20:12:00"})
|
|
294
|
+
# we don't know the timezone this test will run
|
|
295
|
+
assert (1291230720.0 - 14 * 3600) < ts < (1291230720.0 + 14 * 3600)
|
|
296
|
+
|
|
297
|
+
def test_from_mtime(self):
|
|
298
|
+
with TempFile() as tmp:
|
|
299
|
+
os.utime(tmp, (12376512, 12376512))
|
|
300
|
+
assert before_timestamp_from_options({"mtime": tmp}) == 12376512
|
|
301
|
+
|
|
302
|
+
def test_from_mtime_missing_file(self):
|
|
303
|
+
with pytest.raises(SeedConfigurationError):
|
|
304
|
+
before_timestamp_from_options(
|
|
305
|
+
{"mtime": "/tmp/does-not-exist-at-all,really"}
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def test_from_empty(self):
|
|
309
|
+
assert before_timestamp_from_options({}) == pytest.approx(time.time(), 1)
|
|
310
|
+
|
|
311
|
+
def test_from_delta(self):
|
|
312
|
+
assert (
|
|
313
|
+
before_timestamp_from_options({"minutes": 15}) + 60 * 15
|
|
314
|
+
) == pytest.approx(time.time(), 1)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
class TestSeedProgress(object):
|
|
318
|
+
|
|
319
|
+
def test_progress_identifier(self):
|
|
320
|
+
old = SeedProgress()
|
|
321
|
+
with old.step_down(0, 2):
|
|
322
|
+
with old.step_down(0, 4):
|
|
323
|
+
assert old.current_progress_identifier() == [(0, 2), (0, 4)]
|
|
324
|
+
# previous leafs are still present
|
|
325
|
+
assert old.current_progress_identifier() == [(0, 2), (0, 4)]
|
|
326
|
+
with old.step_down(1, 4):
|
|
327
|
+
assert old.current_progress_identifier() == [(0, 2), (1, 4)]
|
|
328
|
+
assert old.current_progress_identifier() == [(0, 2), (1, 4)]
|
|
329
|
+
|
|
330
|
+
assert old.current_progress_identifier() == [] # empty list after seed
|
|
331
|
+
|
|
332
|
+
with old.step_down(1, 2):
|
|
333
|
+
assert old.current_progress_identifier() == [(1, 2)]
|
|
334
|
+
with old.step_down(0, 4):
|
|
335
|
+
with old.step_down(1, 4):
|
|
336
|
+
assert old.current_progress_identifier() == [(1, 2), (0, 4), (1, 4)]
|
|
337
|
+
|
|
338
|
+
def test_already_processed(self):
|
|
339
|
+
new = SeedProgress([(0, 2)])
|
|
340
|
+
with new.step_down(0, 2):
|
|
341
|
+
assert not new.already_processed()
|
|
342
|
+
with new.step_down(0, 2):
|
|
343
|
+
assert not new.already_processed()
|
|
344
|
+
|
|
345
|
+
new = SeedProgress([(1, 2)])
|
|
346
|
+
with new.step_down(0, 2):
|
|
347
|
+
assert new.already_processed()
|
|
348
|
+
with new.step_down(0, 2):
|
|
349
|
+
assert new.already_processed()
|
|
350
|
+
|
|
351
|
+
new = SeedProgress([(0, 2), (1, 4), (2, 4)])
|
|
352
|
+
with new.step_down(0, 2):
|
|
353
|
+
assert not new.already_processed()
|
|
354
|
+
with new.step_down(0, 4):
|
|
355
|
+
assert new.already_processed()
|
|
356
|
+
with new.step_down(1, 4):
|
|
357
|
+
assert not new.already_processed()
|
|
358
|
+
with new.step_down(1, 4):
|
|
359
|
+
assert new.already_processed()
|
|
360
|
+
with new.step_down(2, 4):
|
|
361
|
+
assert not new.already_processed()
|
|
362
|
+
with new.step_down(3, 4):
|
|
363
|
+
assert not new.already_processed()
|
|
364
|
+
with new.step_down(2, 4):
|
|
365
|
+
assert not new.already_processed()
|