MapProxy 2.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- MapProxy-2.1.0.dist-info/AUTHORS.txt +33 -0
- MapProxy-2.1.0.dist-info/COPYING.txt +60 -0
- MapProxy-2.1.0.dist-info/LICENSE.txt +202 -0
- MapProxy-2.1.0.dist-info/METADATA +165 -0
- MapProxy-2.1.0.dist-info/RECORD +459 -0
- MapProxy-2.1.0.dist-info/WHEEL +5 -0
- MapProxy-2.1.0.dist-info/entry_points.txt +4 -0
- MapProxy-2.1.0.dist-info/top_level.txt +1 -0
- mapproxy/__init__.py +0 -0
- mapproxy/cache/__init__.py +36 -0
- mapproxy/cache/azureblob.py +145 -0
- mapproxy/cache/base.py +120 -0
- mapproxy/cache/compact.py +665 -0
- mapproxy/cache/couchdb.py +301 -0
- mapproxy/cache/dummy.py +36 -0
- mapproxy/cache/file.py +200 -0
- mapproxy/cache/geopackage.py +647 -0
- mapproxy/cache/legend.py +87 -0
- mapproxy/cache/mbtiles.py +411 -0
- mapproxy/cache/meta.py +80 -0
- mapproxy/cache/path.py +261 -0
- mapproxy/cache/redis.py +152 -0
- mapproxy/cache/renderd.py +100 -0
- mapproxy/cache/riak.py +206 -0
- mapproxy/cache/s3.py +209 -0
- mapproxy/cache/tile.py +736 -0
- mapproxy/client/__init__.py +0 -0
- mapproxy/client/arcgis.py +82 -0
- mapproxy/client/cgi.py +141 -0
- mapproxy/client/http.py +295 -0
- mapproxy/client/log.py +33 -0
- mapproxy/client/tile.py +158 -0
- mapproxy/client/wms.py +255 -0
- mapproxy/compat/__init__.py +0 -0
- mapproxy/compat/image.py +86 -0
- mapproxy/config/__init__.py +22 -0
- mapproxy/config/config-schema.json +813 -0
- mapproxy/config/config.py +213 -0
- mapproxy/config/coverage.py +108 -0
- mapproxy/config/defaults.py +102 -0
- mapproxy/config/loader.py +2399 -0
- mapproxy/config/spec.py +657 -0
- mapproxy/config/validator.py +242 -0
- mapproxy/config_template/__init__.py +0 -0
- mapproxy/config_template/base_config/config.wsgi +10 -0
- mapproxy/config_template/base_config/full_example.yaml +598 -0
- mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
- mapproxy/config_template/base_config/log.ini +35 -0
- mapproxy/config_template/base_config/mapproxy.yaml +60 -0
- mapproxy/config_template/base_config/seed.yaml +27 -0
- mapproxy/exception.py +149 -0
- mapproxy/featureinfo.py +251 -0
- mapproxy/grid.py +1199 -0
- mapproxy/image/__init__.py +549 -0
- mapproxy/image/fonts/DejaVuSans.ttf +0 -0
- mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
- mapproxy/image/fonts/LICENSE +99 -0
- mapproxy/image/fonts/__init__.py +0 -0
- mapproxy/image/mask.py +79 -0
- mapproxy/image/merge.py +323 -0
- mapproxy/image/message.py +357 -0
- mapproxy/image/opts.py +185 -0
- mapproxy/image/tile.py +171 -0
- mapproxy/image/transform.py +350 -0
- mapproxy/layer.py +489 -0
- mapproxy/multiapp.py +230 -0
- mapproxy/proj.py +309 -0
- mapproxy/request/__init__.py +18 -0
- mapproxy/request/arcgis.py +268 -0
- mapproxy/request/base.py +466 -0
- mapproxy/request/tile.py +131 -0
- mapproxy/request/wms/__init__.py +829 -0
- mapproxy/request/wms/exception.py +107 -0
- mapproxy/request/wmts.py +442 -0
- mapproxy/response.py +237 -0
- mapproxy/script/__init__.py +0 -0
- mapproxy/script/conf/__init__.py +0 -0
- mapproxy/script/conf/app.py +222 -0
- mapproxy/script/conf/caches.py +44 -0
- mapproxy/script/conf/geopackage.py +136 -0
- mapproxy/script/conf/layers.py +54 -0
- mapproxy/script/conf/seeds.py +36 -0
- mapproxy/script/conf/sources.py +88 -0
- mapproxy/script/conf/utils.py +148 -0
- mapproxy/script/defrag.py +187 -0
- mapproxy/script/export.py +337 -0
- mapproxy/script/grids.py +198 -0
- mapproxy/script/scales.py +134 -0
- mapproxy/script/util.py +410 -0
- mapproxy/script/wms_capabilities.py +160 -0
- mapproxy/seed/__init__.py +0 -0
- mapproxy/seed/cachelock.py +127 -0
- mapproxy/seed/cleanup.py +191 -0
- mapproxy/seed/config.py +481 -0
- mapproxy/seed/script.py +391 -0
- mapproxy/seed/seeder.py +551 -0
- mapproxy/seed/spec.py +66 -0
- mapproxy/seed/util.py +266 -0
- mapproxy/service/__init__.py +14 -0
- mapproxy/service/base.py +45 -0
- mapproxy/service/demo.py +364 -0
- mapproxy/service/kml.py +333 -0
- mapproxy/service/ows.py +39 -0
- mapproxy/service/template_helper.py +55 -0
- mapproxy/service/templates/demo/capabilities_demo.html +18 -0
- mapproxy/service/templates/demo/demo.html +181 -0
- mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
- mapproxy/service/templates/demo/static/img/blank.gif +0 -0
- mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
- mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
- mapproxy/service/templates/demo/static/logo.png +0 -0
- mapproxy/service/templates/demo/static/ol.css +345 -0
- mapproxy/service/templates/demo/static/ol.js +4 -0
- mapproxy/service/templates/demo/static/proj4.min.js +1 -0
- mapproxy/service/templates/demo/static/proj4defs.js +1 -0
- mapproxy/service/templates/demo/static/site.css +137 -0
- mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
- mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
- mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
- mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
- mapproxy/service/templates/demo/static.html +34 -0
- mapproxy/service/templates/demo/tms_demo.html +117 -0
- mapproxy/service/templates/demo/wms_demo.html +144 -0
- mapproxy/service/templates/demo/wmts_demo.html +118 -0
- mapproxy/service/templates/tms_capabilities.xml +13 -0
- mapproxy/service/templates/tms_exception.xml +4 -0
- mapproxy/service/templates/tms_root_resource.xml +7 -0
- mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
- mapproxy/service/templates/wms100capabilities.xml +112 -0
- mapproxy/service/templates/wms100exception.xml +4 -0
- mapproxy/service/templates/wms110capabilities.xml +152 -0
- mapproxy/service/templates/wms110exception.xml +5 -0
- mapproxy/service/templates/wms111capabilities.xml +183 -0
- mapproxy/service/templates/wms111exception.xml +5 -0
- mapproxy/service/templates/wms130capabilities.xml +326 -0
- mapproxy/service/templates/wms130exception.xml +8 -0
- mapproxy/service/templates/wmts100capabilities.xml +155 -0
- mapproxy/service/templates/wmts100exception.xml +9 -0
- mapproxy/service/tile.py +540 -0
- mapproxy/service/wms.py +868 -0
- mapproxy/service/wmts.py +387 -0
- mapproxy/source/__init__.py +83 -0
- mapproxy/source/arcgis.py +39 -0
- mapproxy/source/error.py +40 -0
- mapproxy/source/mapnik.py +262 -0
- mapproxy/source/tile.py +97 -0
- mapproxy/source/wms.py +273 -0
- mapproxy/srs.py +734 -0
- mapproxy/template.py +54 -0
- mapproxy/test/__init__.py +0 -0
- mapproxy/test/conftest.py +8 -0
- mapproxy/test/helper.py +255 -0
- mapproxy/test/http.py +511 -0
- mapproxy/test/image.py +219 -0
- mapproxy/test/mocker.py +2291 -0
- mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
- mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
- mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
- mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
- mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
- mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
- mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
- mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
- mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
- mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
- mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
- mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
- mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
- mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
- mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
- mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
- mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
- mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
- mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
- mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
- mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
- mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
- mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
- mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
- mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
- mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
- mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
- mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
- mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
- mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
- mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
- mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
- mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
- mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
- mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
- mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
- mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
- mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
- mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
- mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
- mapproxy/test/schemas/xml.xsd +287 -0
- mapproxy/test/system/__init__.py +98 -0
- mapproxy/test/system/fixture/arcgis.yaml +57 -0
- mapproxy/test/system/fixture/auth.yaml +70 -0
- mapproxy/test/system/fixture/cache.mbtiles +0 -0
- mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
- mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
- mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
- mapproxy/test/system/fixture/cache_coverage.yaml +84 -0
- mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
- mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
- mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
- mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
- mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
- mapproxy/test/system/fixture/cache_s3.yaml +58 -0
- mapproxy/test/system/fixture/cache_source.yaml +81 -0
- mapproxy/test/system/fixture/combined_sources.yaml +130 -0
- mapproxy/test/system/fixture/coverage.yaml +77 -0
- mapproxy/test/system/fixture/demo.yaml +135 -0
- mapproxy/test/system/fixture/dimension.yaml +59 -0
- mapproxy/test/system/fixture/disable_storage.yaml +25 -0
- mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
- mapproxy/test/system/fixture/formats.yaml +72 -0
- mapproxy/test/system/fixture/inspire.yaml +101 -0
- mapproxy/test/system/fixture/inspire_full.yaml +124 -0
- mapproxy/test/system/fixture/kml_layer.yaml +66 -0
- mapproxy/test/system/fixture/layer.yaml +260 -0
- mapproxy/test/system/fixture/layergroups.yaml +57 -0
- mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
- mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
- mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
- mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
- mapproxy/test/system/fixture/mapserver.yaml +23 -0
- mapproxy/test/system/fixture/minimal_cgi.py +16 -0
- mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
- mapproxy/test/system/fixture/multi_cache_layers.yaml +111 -0
- mapproxy/test/system/fixture/multiapp1.yaml +20 -0
- mapproxy/test/system/fixture/multiapp2.yaml +19 -0
- mapproxy/test/system/fixture/renderd_client.yaml +55 -0
- mapproxy/test/system/fixture/scalehints.yaml +70 -0
- mapproxy/test/system/fixture/seed.yaml +94 -0
- mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
- mapproxy/test/system/fixture/seed_old.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
- mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
- mapproxy/test/system/fixture/seedonly.yaml +51 -0
- mapproxy/test/system/fixture/sld.yaml +35 -0
- mapproxy/test/system/fixture/source_errors.yaml +84 -0
- mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
- mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
- mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
- mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
- mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
- mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
- mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
- mapproxy/test/system/fixture/util_grids.yaml +29 -0
- mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
- mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
- mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
- mapproxy/test/system/fixture/watermark.yaml +50 -0
- mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
- mapproxy/test/system/fixture/wms_versions.yaml +38 -0
- mapproxy/test/system/fixture/wmts.yaml +134 -0
- mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
- mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
- mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
- mapproxy/test/system/test_arcgis.py +156 -0
- mapproxy/test/system/test_auth.py +1133 -0
- mapproxy/test/system/test_behind_proxy.py +75 -0
- mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
- mapproxy/test/system/test_cache_azureblob.py +127 -0
- mapproxy/test/system/test_cache_band_merge.py +103 -0
- mapproxy/test/system/test_cache_coverage.py +168 -0
- mapproxy/test/system/test_cache_geopackage.py +144 -0
- mapproxy/test/system/test_cache_grid_names.py +89 -0
- mapproxy/test/system/test_cache_mbtiles.py +85 -0
- mapproxy/test/system/test_cache_s3.py +115 -0
- mapproxy/test/system/test_cache_source.py +146 -0
- mapproxy/test/system/test_combined_sources.py +335 -0
- mapproxy/test/system/test_coverage.py +140 -0
- mapproxy/test/system/test_decorate_img.py +214 -0
- mapproxy/test/system/test_demo.py +56 -0
- mapproxy/test/system/test_demo_with_extra_service.py +57 -0
- mapproxy/test/system/test_dimensions.py +279 -0
- mapproxy/test/system/test_disable_storage.py +42 -0
- mapproxy/test/system/test_formats.py +219 -0
- mapproxy/test/system/test_inspire_vs.py +173 -0
- mapproxy/test/system/test_kml.py +264 -0
- mapproxy/test/system/test_layergroups.py +160 -0
- mapproxy/test/system/test_legendgraphic.py +308 -0
- mapproxy/test/system/test_mapnik.py +162 -0
- mapproxy/test/system/test_mapserver.py +83 -0
- mapproxy/test/system/test_mixed_mode_format.py +201 -0
- mapproxy/test/system/test_multi_cache_layers.py +169 -0
- mapproxy/test/system/test_multiapp.py +92 -0
- mapproxy/test/system/test_refresh.py +206 -0
- mapproxy/test/system/test_renderd_client.py +304 -0
- mapproxy/test/system/test_response_headers.py +54 -0
- mapproxy/test/system/test_scalehints.py +140 -0
- mapproxy/test/system/test_seed.py +425 -0
- mapproxy/test/system/test_seed_only.py +93 -0
- mapproxy/test/system/test_sld.py +120 -0
- mapproxy/test/system/test_source_errors.py +377 -0
- mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
- mapproxy/test/system/test_tms.py +277 -0
- mapproxy/test/system/test_tms_origin.py +46 -0
- mapproxy/test/system/test_util_conf.py +434 -0
- mapproxy/test/system/test_util_export.py +210 -0
- mapproxy/test/system/test_util_grids.py +88 -0
- mapproxy/test/system/test_util_wms_capabilities.py +182 -0
- mapproxy/test/system/test_watermark.py +91 -0
- mapproxy/test/system/test_wms.py +1616 -0
- mapproxy/test/system/test_wms_srs_extent.py +165 -0
- mapproxy/test/system/test_wms_version.py +85 -0
- mapproxy/test/system/test_wmsc.py +116 -0
- mapproxy/test/system/test_wmts.py +334 -0
- mapproxy/test/system/test_wmts_dimensions.py +206 -0
- mapproxy/test/system/test_wmts_restful.py +198 -0
- mapproxy/test/system/test_xslt_featureinfo.py +423 -0
- mapproxy/test/test_http_helper.py +217 -0
- mapproxy/test/unit/__init__.py +0 -0
- mapproxy/test/unit/epsg +2 -0
- mapproxy/test/unit/polygons/polygons.dbf +0 -0
- mapproxy/test/unit/polygons/polygons.shp +0 -0
- mapproxy/test/unit/polygons/polygons.shx +0 -0
- mapproxy/test/unit/test_async.py +242 -0
- mapproxy/test/unit/test_auth.py +430 -0
- mapproxy/test/unit/test_cache.py +1356 -0
- mapproxy/test/unit/test_cache_azureblob.py +97 -0
- mapproxy/test/unit/test_cache_compact.py +324 -0
- mapproxy/test/unit/test_cache_couchdb.py +118 -0
- mapproxy/test/unit/test_cache_geopackage.py +256 -0
- mapproxy/test/unit/test_cache_redis.py +123 -0
- mapproxy/test/unit/test_cache_riak.py +80 -0
- mapproxy/test/unit/test_cache_s3.py +93 -0
- mapproxy/test/unit/test_cache_tile.py +477 -0
- mapproxy/test/unit/test_client.py +488 -0
- mapproxy/test/unit/test_client_arcgis.py +74 -0
- mapproxy/test/unit/test_client_cgi.py +140 -0
- mapproxy/test/unit/test_collections.py +116 -0
- mapproxy/test/unit/test_concat_legends.py +37 -0
- mapproxy/test/unit/test_conf_loader.py +1267 -0
- mapproxy/test/unit/test_conf_validator.py +427 -0
- mapproxy/test/unit/test_config.py +118 -0
- mapproxy/test/unit/test_decorate_img.py +185 -0
- mapproxy/test/unit/test_exceptions.py +270 -0
- mapproxy/test/unit/test_featureinfo.py +313 -0
- mapproxy/test/unit/test_file_lock_load.py +49 -0
- mapproxy/test/unit/test_geom.py +512 -0
- mapproxy/test/unit/test_grid.py +1279 -0
- mapproxy/test/unit/test_image.py +1051 -0
- mapproxy/test/unit/test_image_mask.py +181 -0
- mapproxy/test/unit/test_image_messages.py +209 -0
- mapproxy/test/unit/test_image_options.py +160 -0
- mapproxy/test/unit/test_isodate.py +118 -0
- mapproxy/test/unit/test_multiapp.py +163 -0
- mapproxy/test/unit/test_ogr_reader.py +51 -0
- mapproxy/test/unit/test_request.py +745 -0
- mapproxy/test/unit/test_request_wmts.py +178 -0
- mapproxy/test/unit/test_response.py +78 -0
- mapproxy/test/unit/test_seed.py +365 -0
- mapproxy/test/unit/test_seed_cachelock.py +91 -0
- mapproxy/test/unit/test_srs.py +215 -0
- mapproxy/test/unit/test_tiled_source.py +122 -0
- mapproxy/test/unit/test_tilefilter.py +31 -0
- mapproxy/test/unit/test_times.py +25 -0
- mapproxy/test/unit/test_timeutils.py +50 -0
- mapproxy/test/unit/test_util_conf_utils.py +75 -0
- mapproxy/test/unit/test_utils.py +476 -0
- mapproxy/test/unit/test_wms_capabilities.py +44 -0
- mapproxy/test/unit/test_wms_layer.py +113 -0
- mapproxy/test/unit/test_yaml.py +68 -0
- mapproxy/tilefilter.py +61 -0
- mapproxy/util/__init__.py +0 -0
- mapproxy/util/async_.py +229 -0
- mapproxy/util/collections.py +134 -0
- mapproxy/util/coverage.py +337 -0
- mapproxy/util/ext/__init__.py +14 -0
- mapproxy/util/ext/dictspec/__init__.py +1 -0
- mapproxy/util/ext/dictspec/spec.py +131 -0
- mapproxy/util/ext/dictspec/test/__init__.py +0 -0
- mapproxy/util/ext/dictspec/test/test_validator.py +278 -0
- mapproxy/util/ext/dictspec/validator.py +194 -0
- mapproxy/util/ext/local.py +198 -0
- mapproxy/util/ext/lockfile.py +140 -0
- mapproxy/util/ext/odict.py +321 -0
- mapproxy/util/ext/serving.py +491 -0
- mapproxy/util/ext/tempita/__init__.py +1093 -0
- mapproxy/util/ext/tempita/_looper.py +163 -0
- mapproxy/util/ext/tempita/string_utils.py +24 -0
- mapproxy/util/ext/wmsparse/__init__.py +3 -0
- mapproxy/util/ext/wmsparse/duration.py +600 -0
- mapproxy/util/ext/wmsparse/parse.py +307 -0
- mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
- mapproxy/util/ext/wmsparse/test/test_parse.py +111 -0
- mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
- mapproxy/util/ext/wmsparse/test/wms-example-111.xml +90 -0
- mapproxy/util/ext/wmsparse/test/wms-example-130.xml +120 -0
- mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
- mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
- mapproxy/util/ext/wmsparse/util.py +189 -0
- mapproxy/util/fs.py +164 -0
- mapproxy/util/geom.py +307 -0
- mapproxy/util/lib.py +117 -0
- mapproxy/util/lock.py +171 -0
- mapproxy/util/ogr.py +247 -0
- mapproxy/util/py.py +75 -0
- mapproxy/util/times.py +78 -0
- mapproxy/util/yaml.py +58 -0
- mapproxy/version.py +33 -0
- mapproxy/wsgiapp.py +167 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2012 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import multiprocessing
|
|
17
|
+
import time
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
from mapproxy.seed.cachelock import CacheLocker, CacheLockedError
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.mark.skipif(sys.platform == "win32", reason="test not supported for Windows")
|
|
26
|
+
@pytest.mark.skipif(sys.platform == "darwin" and sys.version_info >= (3, 8),
|
|
27
|
+
reason="test not supported for MacOS with Python >=3.8")
|
|
28
|
+
class TestCacheLock(object):
|
|
29
|
+
|
|
30
|
+
@pytest.fixture
|
|
31
|
+
def lock_file(self, tmpdir):
|
|
32
|
+
return (tmpdir / "lock").strpath
|
|
33
|
+
|
|
34
|
+
def test_free_lock(self, lock_file):
|
|
35
|
+
locker = CacheLocker(lock_file)
|
|
36
|
+
with locker.lock("foo"):
|
|
37
|
+
assert True
|
|
38
|
+
|
|
39
|
+
def test_locked_by_process_no_block(self, lock_file):
|
|
40
|
+
proc_is_locked = multiprocessing.Event()
|
|
41
|
+
|
|
42
|
+
def lock():
|
|
43
|
+
locker = CacheLocker(lock_file)
|
|
44
|
+
with locker.lock("foo"):
|
|
45
|
+
proc_is_locked.set()
|
|
46
|
+
time.sleep(10)
|
|
47
|
+
|
|
48
|
+
p = multiprocessing.Process(target=lock)
|
|
49
|
+
p.start()
|
|
50
|
+
# wait for process to start
|
|
51
|
+
proc_is_locked.wait()
|
|
52
|
+
|
|
53
|
+
locker = CacheLocker(lock_file)
|
|
54
|
+
|
|
55
|
+
# test unlocked bar
|
|
56
|
+
with locker.lock("bar", no_block=True):
|
|
57
|
+
assert True
|
|
58
|
+
|
|
59
|
+
# test locked foo
|
|
60
|
+
try:
|
|
61
|
+
with locker.lock("foo", no_block=True):
|
|
62
|
+
assert False
|
|
63
|
+
except CacheLockedError:
|
|
64
|
+
pass
|
|
65
|
+
finally:
|
|
66
|
+
p.terminate()
|
|
67
|
+
p.join()
|
|
68
|
+
|
|
69
|
+
def test_locked_by_process_waiting(self, lock_file):
|
|
70
|
+
proc_is_locked = multiprocessing.Event()
|
|
71
|
+
|
|
72
|
+
def lock():
|
|
73
|
+
locker = CacheLocker(lock_file)
|
|
74
|
+
with locker.lock("foo"):
|
|
75
|
+
proc_is_locked.set()
|
|
76
|
+
time.sleep(.1)
|
|
77
|
+
|
|
78
|
+
p = multiprocessing.Process(target=lock)
|
|
79
|
+
start_time = time.time()
|
|
80
|
+
p.start()
|
|
81
|
+
# wait for process to start
|
|
82
|
+
proc_is_locked.wait()
|
|
83
|
+
|
|
84
|
+
locker = CacheLocker(lock_file, polltime=0.02)
|
|
85
|
+
try:
|
|
86
|
+
with locker.lock("foo", no_block=False):
|
|
87
|
+
diff = time.time() - start_time
|
|
88
|
+
assert diff > 0.1
|
|
89
|
+
finally:
|
|
90
|
+
p.terminate()
|
|
91
|
+
p.join()
|
|
@@ -0,0 +1,215 @@
|
|
|
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
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from mapproxy.config import base_config
|
|
21
|
+
from mapproxy import srs, proj
|
|
22
|
+
from mapproxy.srs import SRS, PreferredSrcSRS, SupportedSRS
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class TestSRS(object):
|
|
26
|
+
|
|
27
|
+
def test_epsg4326(self):
|
|
28
|
+
srs = SRS(4326)
|
|
29
|
+
|
|
30
|
+
assert srs.is_latlong
|
|
31
|
+
assert not srs.is_axis_order_en
|
|
32
|
+
assert srs.is_axis_order_ne
|
|
33
|
+
|
|
34
|
+
assert srs.get_geographic_srs() == srs
|
|
35
|
+
|
|
36
|
+
def test_crs84(self):
|
|
37
|
+
srs = SRS("CRS:84")
|
|
38
|
+
|
|
39
|
+
assert srs.is_latlong
|
|
40
|
+
assert srs.is_axis_order_en
|
|
41
|
+
assert not srs.is_axis_order_ne
|
|
42
|
+
|
|
43
|
+
assert srs == SRS("EPSG:4326")
|
|
44
|
+
|
|
45
|
+
def test_epsg31467(self):
|
|
46
|
+
srs = SRS("EPSG:31467")
|
|
47
|
+
|
|
48
|
+
assert not srs.is_latlong
|
|
49
|
+
assert not srs.is_axis_order_en
|
|
50
|
+
assert srs.is_axis_order_ne
|
|
51
|
+
|
|
52
|
+
assert srs.get_geographic_srs() == SRS(4326)
|
|
53
|
+
|
|
54
|
+
def test_epsg900913(self):
|
|
55
|
+
srs = SRS("epsg:900913")
|
|
56
|
+
|
|
57
|
+
assert not srs.is_latlong
|
|
58
|
+
assert srs.is_axis_order_en
|
|
59
|
+
assert not srs.is_axis_order_ne
|
|
60
|
+
|
|
61
|
+
def test_non_epsg_auth(self):
|
|
62
|
+
srs = SRS("IGNF:ETRS89UTM28")
|
|
63
|
+
|
|
64
|
+
assert not srs.is_latlong
|
|
65
|
+
assert srs.is_axis_order_en
|
|
66
|
+
assert not srs.is_axis_order_ne
|
|
67
|
+
|
|
68
|
+
assert srs.get_geographic_srs() == SRS(4326)
|
|
69
|
+
|
|
70
|
+
def test_iau_crs(self):
|
|
71
|
+
try:
|
|
72
|
+
srs = SRS("IAU:49900") # "Mars (2015) - Sphere / Ocentric"
|
|
73
|
+
except Exception:
|
|
74
|
+
pytest.skip('Requires recent pyproj version')
|
|
75
|
+
|
|
76
|
+
assert srs.is_latlong
|
|
77
|
+
assert '49900' in str(srs.get_geographic_srs())
|
|
78
|
+
|
|
79
|
+
def test_iau_crs_projected(self):
|
|
80
|
+
try:
|
|
81
|
+
srs = SRS("IAU:49910") # "Mars (2015) - Sphere / Ocentric / Equirectangular, clon = 0"
|
|
82
|
+
except Exception:
|
|
83
|
+
pytest.skip('Requires recent pyproj version')
|
|
84
|
+
|
|
85
|
+
assert not srs.is_latlong
|
|
86
|
+
assert '49900' in str(srs.get_geographic_srs())
|
|
87
|
+
|
|
88
|
+
def test_from_srs(self):
|
|
89
|
+
srs1 = SRS("epsg:4326")
|
|
90
|
+
srs2 = SRS(srs1)
|
|
91
|
+
assert srs1 == srs2
|
|
92
|
+
|
|
93
|
+
# proj_data_dir test relies on old Proj4 epsg files.
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@pytest.mark.skipif(not proj.USE_PROJ4_API, reason="only for old proj4 lib")
|
|
97
|
+
class Test_0_ProjDefaultDataPath(object):
|
|
98
|
+
|
|
99
|
+
def test_known_srs(self):
|
|
100
|
+
srs.SRS(4326)
|
|
101
|
+
|
|
102
|
+
def test_unknown_srs(self):
|
|
103
|
+
with pytest.raises(RuntimeError):
|
|
104
|
+
srs.SRS(1234)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@pytest.fixture(scope="class")
|
|
108
|
+
def custom_proj_data_dir():
|
|
109
|
+
srs._proj_initalized = False
|
|
110
|
+
srs._srs_cache = {}
|
|
111
|
+
base_config().srs.proj_data_dir = os.path.dirname(__file__)
|
|
112
|
+
|
|
113
|
+
yield
|
|
114
|
+
|
|
115
|
+
srs._proj_initalized = False
|
|
116
|
+
srs._srs_cache = {}
|
|
117
|
+
srs.set_datapath(None)
|
|
118
|
+
base_config().srs.proj_data_dir = None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@pytest.mark.skipif(not proj.USE_PROJ4_API, reason="only for old proj4 lib")
|
|
122
|
+
@pytest.mark.usefixtures("custom_proj_data_dir")
|
|
123
|
+
class Test_1_ProjDataPath(object):
|
|
124
|
+
|
|
125
|
+
def test_dummy_srs(self):
|
|
126
|
+
srs.SRS(1234)
|
|
127
|
+
|
|
128
|
+
def test_unknown_srs(self):
|
|
129
|
+
with pytest.raises(RuntimeError):
|
|
130
|
+
srs.SRS(2339)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class TestPreferredSrcSRS(object):
|
|
134
|
+
|
|
135
|
+
# test selection of preferred SRS
|
|
136
|
+
# unprojected: 4326, 4258
|
|
137
|
+
# projected: 3857, 25831, 25832, 31467
|
|
138
|
+
@pytest.mark.parametrize("target,available,expected", [
|
|
139
|
+
|
|
140
|
+
# always return target if available
|
|
141
|
+
(4326, [25832, 4326, 3857], 4326),
|
|
142
|
+
|
|
143
|
+
(4326, [25832, 4326, 3857], 4326),
|
|
144
|
+
(4326, [25831, 3857], 3857),
|
|
145
|
+
|
|
146
|
+
(3857, [25832, 4258, 3857, 31466], 3857),
|
|
147
|
+
(3857, [25832, 4258, 31467, 25831, 31466], 25832),
|
|
148
|
+
(3857, [4258, 31467, 25831, 31466], 25831),
|
|
149
|
+
(3857, [4258, 31467, 31466], 31467),
|
|
150
|
+
(3857, [4258, 31466], 31466),
|
|
151
|
+
(3857, [4258], 4258),
|
|
152
|
+
|
|
153
|
+
# always return first preferred, regardless of order in available
|
|
154
|
+
(4326, [3857, 4258], 4258),
|
|
155
|
+
(4326, [4258, 3857], 4258),
|
|
156
|
+
|
|
157
|
+
# no preferred, return first that is also projected/unprojected
|
|
158
|
+
(31467, [4326, 25831, 3857], 25831),
|
|
159
|
+
(4258, [25831, 4326, 3857], 4326),
|
|
160
|
+
|
|
161
|
+
# no preferred and no srs that is also projected/unprojected, return first
|
|
162
|
+
(31467, [4326, 4258], 4326),
|
|
163
|
+
(4258, [3857, 25832, 31467], 3857),
|
|
164
|
+
])
|
|
165
|
+
def test_preferred(self, target, available, expected):
|
|
166
|
+
preferredSRS = PreferredSrcSRS()
|
|
167
|
+
preferredSRS.add(SRS(4326), [SRS(4258), SRS(3857)])
|
|
168
|
+
preferredSRS.add(SRS(3857), [SRS(25832), SRS(25831), SRS(31467), SRS(4326)])
|
|
169
|
+
|
|
170
|
+
assert preferredSRS.preferred_src(SRS(target), [SRS(c) for c in available]) == SRS(expected)
|
|
171
|
+
|
|
172
|
+
def test_no_available(self):
|
|
173
|
+
preferredSRS = PreferredSrcSRS()
|
|
174
|
+
preferredSRS.add(SRS(4326), [SRS(4258), SRS(3857)])
|
|
175
|
+
|
|
176
|
+
with pytest.raises(ValueError):
|
|
177
|
+
preferredSRS.preferred_src(SRS(4326), [])
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class TestSupportedSRS(object):
|
|
181
|
+
@pytest.fixture
|
|
182
|
+
def preferred(self):
|
|
183
|
+
preferredSRS = PreferredSrcSRS()
|
|
184
|
+
preferredSRS.add(SRS(4326), [SRS(4258), SRS(3857)])
|
|
185
|
+
preferredSRS.add(SRS(3857), [SRS(25832), SRS(25831), SRS(31467), SRS(4326)])
|
|
186
|
+
return preferredSRS
|
|
187
|
+
|
|
188
|
+
def test_supported(self, preferred):
|
|
189
|
+
supported = SupportedSRS([SRS(4326), SRS(25832)], preferred)
|
|
190
|
+
assert SRS(4326) in supported
|
|
191
|
+
assert SRS(4258) not in supported
|
|
192
|
+
assert SRS(25832) in supported
|
|
193
|
+
|
|
194
|
+
def test_iter(self, preferred):
|
|
195
|
+
supported = SupportedSRS([SRS(4326), SRS(25832)], preferred)
|
|
196
|
+
assert [SRS(4326), SRS(25832)] == [srs for srs in supported]
|
|
197
|
+
|
|
198
|
+
def test_best_srs(self, preferred):
|
|
199
|
+
supported = SupportedSRS([SRS(4326), SRS(25832)], preferred)
|
|
200
|
+
assert supported.best_srs(SRS(4326)) == SRS(4326)
|
|
201
|
+
assert supported.best_srs(SRS(4258)) == SRS(4326)
|
|
202
|
+
assert supported.best_srs(SRS(25832)) == SRS(25832)
|
|
203
|
+
assert supported.best_srs(SRS(25831)) == SRS(25832)
|
|
204
|
+
assert supported.best_srs(SRS(3857)) == SRS(25832)
|
|
205
|
+
supported = SupportedSRS([SRS(4326), SRS(31467), SRS(25831)], preferred)
|
|
206
|
+
assert supported.best_srs(SRS(3857)) == SRS(25831)
|
|
207
|
+
assert supported.best_srs(SRS(25831)) == SRS(25831)
|
|
208
|
+
|
|
209
|
+
def test_best_srs_no_preferred(self, preferred):
|
|
210
|
+
supported = SupportedSRS([SRS(4326), SRS(25832)], None)
|
|
211
|
+
assert supported.best_srs(SRS(4326)) == SRS(4326)
|
|
212
|
+
assert supported.best_srs(SRS(4258)) == SRS(4326)
|
|
213
|
+
assert supported.best_srs(SRS(25832)) == SRS(25832)
|
|
214
|
+
assert supported.best_srs(SRS(25831)) == SRS(25832)
|
|
215
|
+
assert supported.best_srs(SRS(3857)) == SRS(25832)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 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
|
+
|
|
17
|
+
from mapproxy.client.tile import TileClient, TileURLTemplate
|
|
18
|
+
from mapproxy.grid import TileGrid
|
|
19
|
+
from mapproxy.srs import SRS
|
|
20
|
+
from mapproxy.source.tile import TiledSource
|
|
21
|
+
from mapproxy.source.error import HTTPSourceErrorHandler
|
|
22
|
+
from mapproxy.layer import MapQuery
|
|
23
|
+
from mapproxy.test.http import mock_httpd
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
TEST_SERVER_ADDRESS = ("127.0.0.1", 56413)
|
|
27
|
+
TESTSERVER_URL = ("http://%s:%d" % TEST_SERVER_ADDRESS) + "/%(tms_path)s.png"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TestTileClientOnError(object):
|
|
31
|
+
|
|
32
|
+
def setup_method(self):
|
|
33
|
+
self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
|
|
34
|
+
self.client = TileClient(TileURLTemplate(TESTSERVER_URL))
|
|
35
|
+
|
|
36
|
+
def test_cacheable_response(self):
|
|
37
|
+
error_handler = HTTPSourceErrorHandler()
|
|
38
|
+
error_handler.add_handler(500, (255, 0, 0), cacheable=True)
|
|
39
|
+
self.source = TiledSource(self.grid, self.client, error_handler=error_handler)
|
|
40
|
+
|
|
41
|
+
with mock_httpd(
|
|
42
|
+
TEST_SERVER_ADDRESS,
|
|
43
|
+
[
|
|
44
|
+
(
|
|
45
|
+
{"path": "/1/0/0.png"},
|
|
46
|
+
{
|
|
47
|
+
"body": b"error",
|
|
48
|
+
"status": 500,
|
|
49
|
+
"headers": {"content-type": "text/plain"},
|
|
50
|
+
},
|
|
51
|
+
)
|
|
52
|
+
],
|
|
53
|
+
):
|
|
54
|
+
resp = self.source.get_map(
|
|
55
|
+
MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
|
|
56
|
+
)
|
|
57
|
+
assert resp.cacheable
|
|
58
|
+
assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 0))]
|
|
59
|
+
|
|
60
|
+
def test_image_response(self):
|
|
61
|
+
error_handler = HTTPSourceErrorHandler()
|
|
62
|
+
error_handler.add_handler(500, (255, 0, 0), cacheable=False)
|
|
63
|
+
self.source = TiledSource(self.grid, self.client, error_handler=error_handler)
|
|
64
|
+
|
|
65
|
+
with mock_httpd(
|
|
66
|
+
TEST_SERVER_ADDRESS,
|
|
67
|
+
[
|
|
68
|
+
(
|
|
69
|
+
{"path": "/1/0/0.png"},
|
|
70
|
+
{
|
|
71
|
+
"body": b"error",
|
|
72
|
+
"status": 500,
|
|
73
|
+
"headers": {"content-type": "text/plain"},
|
|
74
|
+
},
|
|
75
|
+
)
|
|
76
|
+
],
|
|
77
|
+
):
|
|
78
|
+
resp = self.source.get_map(
|
|
79
|
+
MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
|
|
80
|
+
)
|
|
81
|
+
assert not resp.cacheable
|
|
82
|
+
assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 0))]
|
|
83
|
+
|
|
84
|
+
def test_multiple_image_responses(self):
|
|
85
|
+
error_handler = HTTPSourceErrorHandler()
|
|
86
|
+
error_handler.add_handler(500, (255, 0, 0), cacheable=False)
|
|
87
|
+
error_handler.add_handler(204, (255, 0, 127, 200), cacheable=True)
|
|
88
|
+
self.source = TiledSource(self.grid, self.client, error_handler=error_handler)
|
|
89
|
+
|
|
90
|
+
with mock_httpd(
|
|
91
|
+
TEST_SERVER_ADDRESS,
|
|
92
|
+
[
|
|
93
|
+
(
|
|
94
|
+
{"path": "/1/0/0.png"},
|
|
95
|
+
{
|
|
96
|
+
"body": b"error",
|
|
97
|
+
"status": 500,
|
|
98
|
+
"headers": {"content-type": "text/plain"},
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
(
|
|
102
|
+
{"path": "/1/0/0.png"},
|
|
103
|
+
{
|
|
104
|
+
"body": b"error",
|
|
105
|
+
"status": 204,
|
|
106
|
+
"headers": {"content-type": "text/plain"},
|
|
107
|
+
},
|
|
108
|
+
),
|
|
109
|
+
],
|
|
110
|
+
):
|
|
111
|
+
|
|
112
|
+
resp = self.source.get_map(
|
|
113
|
+
MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
|
|
114
|
+
)
|
|
115
|
+
assert not resp.cacheable
|
|
116
|
+
assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 0))]
|
|
117
|
+
|
|
118
|
+
resp = self.source.get_map(
|
|
119
|
+
MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
|
|
120
|
+
)
|
|
121
|
+
assert resp.cacheable
|
|
122
|
+
assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 127, 200))]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010, 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.tilefilter import tile_watermark_placement
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_tile_watermark_placement():
|
|
20
|
+
assert tile_watermark_placement((0, 0, 0)) == "c"
|
|
21
|
+
assert tile_watermark_placement((1, 0, 0)) == "c"
|
|
22
|
+
assert tile_watermark_placement((0, 1, 0)) == "b"
|
|
23
|
+
assert tile_watermark_placement((1, 1, 0)) == "b"
|
|
24
|
+
|
|
25
|
+
assert tile_watermark_placement((0, 0, 0), True) is None
|
|
26
|
+
assert tile_watermark_placement((1, 0, 0), True) == "c"
|
|
27
|
+
assert tile_watermark_placement((2, 0, 0), True) is None
|
|
28
|
+
|
|
29
|
+
assert tile_watermark_placement((0, 1, 0), True) == "c"
|
|
30
|
+
assert tile_watermark_placement((1, 1, 0), True) is None
|
|
31
|
+
assert tile_watermark_placement((2, 1, 0), True) == "c"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010, 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
|
+
from mapproxy.util.times import timestamp_from_isodate
|
|
16
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_timestamp_from_isodate():
|
|
21
|
+
ts = timestamp_from_isodate("2009-06-09T10:57:00")
|
|
22
|
+
assert (1244537820.0 - 14 * 3600) < ts < (1244537820.0 + 14 * 3600)
|
|
23
|
+
|
|
24
|
+
with pytest.raises(ValueError):
|
|
25
|
+
timestamp_from_isodate("2009-06-09T10:57")
|
|
@@ -0,0 +1,50 @@
|
|
|
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 datetime import datetime
|
|
17
|
+
from mapproxy.util.times import parse_httpdate, format_httpdate, timestamp
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TestHTTPDate(object):
|
|
23
|
+
|
|
24
|
+
def test_parse_httpdate(self):
|
|
25
|
+
for date in (
|
|
26
|
+
"Fri, 13 Feb 2009 23:31:30 GMT",
|
|
27
|
+
"Friday, 13-Feb-09 23:31:30 GMT",
|
|
28
|
+
"Fri Feb 13 23:31:30 2009",
|
|
29
|
+
):
|
|
30
|
+
assert parse_httpdate(date) == 1234567890
|
|
31
|
+
|
|
32
|
+
def test_parse_invalid(self):
|
|
33
|
+
for date in (None, "foobar", "4823764923", "Fri, 13 Foo 2009 23:31:30 GMT"):
|
|
34
|
+
assert parse_httpdate(date) is None
|
|
35
|
+
|
|
36
|
+
def test_format_httpdate(self):
|
|
37
|
+
assert (
|
|
38
|
+
format_httpdate(datetime.fromtimestamp(1234567890))
|
|
39
|
+
== "Fri, 13 Feb 2009 23:31:30 GMT"
|
|
40
|
+
)
|
|
41
|
+
assert format_httpdate(1234567890) == "Fri, 13 Feb 2009 23:31:30 GMT"
|
|
42
|
+
|
|
43
|
+
def test_format_invalid(self):
|
|
44
|
+
with pytest.raises(AssertionError):
|
|
45
|
+
format_httpdate("foobar")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_timestamp():
|
|
49
|
+
assert timestamp(1234567890) == 1234567890
|
|
50
|
+
assert timestamp(datetime.fromtimestamp(1234567890)) == 1234567890
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# -:- encoding: utf-8 -:-
|
|
2
|
+
# This file is part of the MapProxy project.
|
|
3
|
+
# Copyright (C) 2013 Omniscale <http://omniscale.de>
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
from copy import deepcopy
|
|
18
|
+
|
|
19
|
+
from mapproxy.script.conf.utils import update_config
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TestUpdateConfig(object):
|
|
23
|
+
|
|
24
|
+
def test_empty(self):
|
|
25
|
+
a = {"a": "foo", "b": 42}
|
|
26
|
+
b = {}
|
|
27
|
+
assert update_config(deepcopy(a), b) == a
|
|
28
|
+
|
|
29
|
+
def test_add(self):
|
|
30
|
+
a = {"a": "foo", "b": 42}
|
|
31
|
+
b = {"c": [1, 2, 3]}
|
|
32
|
+
assert update_config(a, b) == {"a": "foo", "b": 42, "c": [1, 2, 3]}
|
|
33
|
+
|
|
34
|
+
def test_mod(self):
|
|
35
|
+
a = {"a": "foo", "b": 42, "c": {}}
|
|
36
|
+
b = {"a": [1, 2, 3], "c": 1}
|
|
37
|
+
assert update_config(a, b) == {"b": 42, "a": [1, 2, 3], "c": 1}
|
|
38
|
+
|
|
39
|
+
def test_nested_add_mod(self):
|
|
40
|
+
a = {"a": "foo", "b": {"ba": 42, "bb": {}}}
|
|
41
|
+
b = {"b": {"bb": {"bba": 1}, "bc": [1, 2, 3]}}
|
|
42
|
+
assert update_config(a, b) == {
|
|
43
|
+
"a": "foo",
|
|
44
|
+
"b": {"ba": 42, "bb": {"bba": 1}, "bc": [1, 2, 3]},
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
def test_add_all(self):
|
|
48
|
+
a = {"a": "foo", "b": {"ba": 42, "bb": {}}}
|
|
49
|
+
b = {"__all__": {"ba": 1}}
|
|
50
|
+
assert update_config(a, b) == {"a": {"ba": 1}, "b": {"ba": 1, "bb": {}}}
|
|
51
|
+
|
|
52
|
+
def test_extend(self):
|
|
53
|
+
a = {"a": "foo", "b": ["ba"]}
|
|
54
|
+
b = {"b__extend__": ["bb", "bc"]}
|
|
55
|
+
assert update_config(a, b) == {"a": "foo", "b": ["ba", "bb", "bc"]}
|
|
56
|
+
|
|
57
|
+
def test_prefix_wildcard(self):
|
|
58
|
+
a = {"test_foo": "foo", "test_bar": "ba", "test2_foo": "test2", "nounderfoo": 1}
|
|
59
|
+
b = {"____foo": 42}
|
|
60
|
+
assert update_config(a, b) == {
|
|
61
|
+
"test_foo": 42,
|
|
62
|
+
"test_bar": "ba",
|
|
63
|
+
"test2_foo": 42,
|
|
64
|
+
"nounderfoo": 1,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
def test_suffix_wildcard(self):
|
|
68
|
+
a = {"test_foo": "foo", "test_bar": "ba", "test2_foo": "test2", "nounderfoo": 1}
|
|
69
|
+
b = {"test____": 42}
|
|
70
|
+
assert update_config(a, b) == {
|
|
71
|
+
"test_foo": 42,
|
|
72
|
+
"test_bar": 42,
|
|
73
|
+
"test2_foo": "test2",
|
|
74
|
+
"nounderfoo": 1,
|
|
75
|
+
}
|