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,256 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2016 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 sqlite3
|
|
20
|
+
import threading
|
|
21
|
+
import time
|
|
22
|
+
|
|
23
|
+
from io import BytesIO
|
|
24
|
+
|
|
25
|
+
from mapproxy.cache.geopackage import GeopackageCache, GeopackageLevelCache
|
|
26
|
+
from mapproxy.cache.tile import Tile
|
|
27
|
+
from mapproxy.grid import tile_grid, TileGrid
|
|
28
|
+
from mapproxy.image import ImageSource
|
|
29
|
+
from mapproxy.layer import MapExtent
|
|
30
|
+
from mapproxy.srs import SRS
|
|
31
|
+
from mapproxy.test.helper import assert_files_in_dir
|
|
32
|
+
from mapproxy.test.unit.test_cache_tile import TileCacheTestBase
|
|
33
|
+
from mapproxy.util.coverage import coverage
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
GLOBAL_WEBMERCATOR_EXTENT = MapExtent(
|
|
37
|
+
(-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244),
|
|
38
|
+
SRS(3857))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class TestGeopackageCache(TileCacheTestBase):
|
|
42
|
+
|
|
43
|
+
always_loads_metadata = True
|
|
44
|
+
|
|
45
|
+
def setup_method(self):
|
|
46
|
+
TileCacheTestBase.setup_method(self)
|
|
47
|
+
self.gpkg_file = os.path.join(self.cache_dir, 'tmp.gpkg')
|
|
48
|
+
self.table_name = 'test_tiles'
|
|
49
|
+
self.cache = GeopackageCache(
|
|
50
|
+
self.gpkg_file,
|
|
51
|
+
tile_grid=tile_grid(3857, name='global-webmarcator'),
|
|
52
|
+
table_name=self.table_name,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def teardown_method(self):
|
|
56
|
+
if self.cache:
|
|
57
|
+
self.cache.cleanup()
|
|
58
|
+
TileCacheTestBase.teardown_method(self)
|
|
59
|
+
|
|
60
|
+
def test_new_geopackage(self):
|
|
61
|
+
assert os.path.exists(self.gpkg_file)
|
|
62
|
+
|
|
63
|
+
with sqlite3.connect(self.gpkg_file) as db:
|
|
64
|
+
cur = db.execute('''SELECT name FROM sqlite_master WHERE type='table' AND name=?''',
|
|
65
|
+
(self.table_name,))
|
|
66
|
+
content = cur.fetchone()
|
|
67
|
+
assert content[0] == self.table_name
|
|
68
|
+
|
|
69
|
+
with sqlite3.connect(self.gpkg_file) as db:
|
|
70
|
+
cur = db.execute('''SELECT table_name, data_type FROM gpkg_contents WHERE table_name = ?''',
|
|
71
|
+
(self.table_name,))
|
|
72
|
+
content = cur.fetchone()
|
|
73
|
+
assert content[0] == self.table_name
|
|
74
|
+
assert content[1] == 'tiles'
|
|
75
|
+
|
|
76
|
+
with sqlite3.connect(self.gpkg_file) as db:
|
|
77
|
+
cur = db.execute('''SELECT table_name FROM gpkg_tile_matrix WHERE table_name = ?''',
|
|
78
|
+
(self.table_name,))
|
|
79
|
+
content = cur.fetchall()
|
|
80
|
+
assert len(content) == 20
|
|
81
|
+
|
|
82
|
+
with sqlite3.connect(self.gpkg_file) as db:
|
|
83
|
+
cur = db.execute('''SELECT table_name FROM gpkg_tile_matrix_set WHERE table_name = ?''',
|
|
84
|
+
(self.table_name,))
|
|
85
|
+
content = cur.fetchone()
|
|
86
|
+
assert content[0] == self.table_name
|
|
87
|
+
|
|
88
|
+
assert self.cache.coverage is None
|
|
89
|
+
assert self.cache.bbox == GLOBAL_WEBMERCATOR_EXTENT.bbox
|
|
90
|
+
|
|
91
|
+
def test_load_empty_tileset(self):
|
|
92
|
+
assert self.cache.load_tiles([Tile(None)]) is True
|
|
93
|
+
assert self.cache.load_tiles([Tile(None), Tile(None), Tile(None)]) is True
|
|
94
|
+
|
|
95
|
+
def test_load_more_than_2000_tiles(self):
|
|
96
|
+
# prepare data
|
|
97
|
+
for i in range(0, 2010):
|
|
98
|
+
assert self.cache.store_tile(Tile((i, 0, 10), ImageSource(BytesIO(b'foo'))))
|
|
99
|
+
|
|
100
|
+
tiles = [Tile((i, 0, 10)) for i in range(0, 2010)]
|
|
101
|
+
assert self.cache.load_tiles(tiles)
|
|
102
|
+
|
|
103
|
+
def test_timeouts(self):
|
|
104
|
+
self.cache._db_conn_cache.db = sqlite3.connect(self.cache.geopackage_file, timeout=0.05)
|
|
105
|
+
|
|
106
|
+
def block():
|
|
107
|
+
# block database by delaying the commit
|
|
108
|
+
db = sqlite3.connect(self.cache.geopackage_file)
|
|
109
|
+
cur = db.cursor()
|
|
110
|
+
stmt = "INSERT OR REPLACE INTO {0} (zoom_level, tile_column, tile_row, tile_data) " \
|
|
111
|
+
"VALUES (?,?,?,?)".format(self.table_name)
|
|
112
|
+
cur.execute(stmt, (3, 1, 1, '1234'))
|
|
113
|
+
time.sleep(0.2)
|
|
114
|
+
db.commit()
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
assert self.cache.store_tile(self.create_tile((0, 0, 1))) is True
|
|
118
|
+
|
|
119
|
+
t = threading.Thread(target=block)
|
|
120
|
+
t.start()
|
|
121
|
+
time.sleep(0.05)
|
|
122
|
+
assert self.cache.store_tile(self.create_tile((0, 0, 1))) is False
|
|
123
|
+
finally:
|
|
124
|
+
t.join()
|
|
125
|
+
|
|
126
|
+
assert self.cache.store_tile(self.create_tile((0, 0, 1))) is True
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class TestGeopackageCacheCoverage(TileCacheTestBase):
|
|
130
|
+
def setup_method(self):
|
|
131
|
+
TileCacheTestBase.setup_method(self)
|
|
132
|
+
self.gpkg_file = os.path.join(self.cache_dir, 'tmp.gpkg')
|
|
133
|
+
self.table_name = 'test_tiles'
|
|
134
|
+
self.cache = GeopackageCache(
|
|
135
|
+
self.gpkg_file,
|
|
136
|
+
tile_grid=tile_grid(4326, name='inspire-crs-84-quad'),
|
|
137
|
+
table_name=self.table_name,
|
|
138
|
+
coverage=coverage([20, 20, 30, 30], SRS(4326))
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def teardown_method(self):
|
|
142
|
+
if self.cache:
|
|
143
|
+
self.cache.cleanup()
|
|
144
|
+
TileCacheTestBase.teardown_method(self)
|
|
145
|
+
|
|
146
|
+
def test_correct_coverage(self):
|
|
147
|
+
assert self.cache.bbox == [20, 20, 30, 30]
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class TestGeopackageLevelCache(TileCacheTestBase):
|
|
151
|
+
|
|
152
|
+
always_loads_metadata = True
|
|
153
|
+
|
|
154
|
+
def setup_method(self):
|
|
155
|
+
TileCacheTestBase.setup_method(self)
|
|
156
|
+
self.cache = GeopackageLevelCache(
|
|
157
|
+
self.cache_dir,
|
|
158
|
+
tile_grid=tile_grid(3857, name='global-webmarcator'),
|
|
159
|
+
table_name='test_tiles',
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def teardown_method(self):
|
|
163
|
+
if self.cache:
|
|
164
|
+
self.cache.cleanup()
|
|
165
|
+
TileCacheTestBase.teardown_method(self)
|
|
166
|
+
|
|
167
|
+
def test_default_coverage(self):
|
|
168
|
+
assert self.cache.coverage is None
|
|
169
|
+
|
|
170
|
+
def test_level_files(self):
|
|
171
|
+
if os.path.exists(self.cache_dir):
|
|
172
|
+
assert_files_in_dir(self.cache_dir, [], glob='*.gpkg')
|
|
173
|
+
|
|
174
|
+
self.cache.store_tile(self.create_tile((0, 0, 1)))
|
|
175
|
+
assert_files_in_dir(self.cache_dir, ['1.gpkg'], glob='*.gpkg')
|
|
176
|
+
|
|
177
|
+
self.cache.store_tile(self.create_tile((0, 0, 5)))
|
|
178
|
+
assert_files_in_dir(self.cache_dir, ['1.gpkg', '5.gpkg'], glob='*.gpkg')
|
|
179
|
+
|
|
180
|
+
def test_remove_level_files(self):
|
|
181
|
+
self.cache.store_tile(self.create_tile((0, 0, 1)))
|
|
182
|
+
self.cache.store_tile(self.create_tile((0, 0, 2)))
|
|
183
|
+
assert_files_in_dir(self.cache_dir, ['1.gpkg', '2.gpkg'], glob='*.gpkg')
|
|
184
|
+
|
|
185
|
+
self.cache.remove_level_tiles_before(1, timestamp=0)
|
|
186
|
+
assert_files_in_dir(self.cache_dir, ['2.gpkg'], glob='*.gpkg')
|
|
187
|
+
|
|
188
|
+
def test_remove_level_tiles_before(self):
|
|
189
|
+
self.cache.store_tile(self.create_tile((0, 0, 1)))
|
|
190
|
+
self.cache.store_tile(self.create_tile((0, 0, 2)))
|
|
191
|
+
|
|
192
|
+
assert_files_in_dir(self.cache_dir, ['1.gpkg', '2.gpkg'], glob='*.gpkg')
|
|
193
|
+
assert self.cache.is_cached(Tile((0, 0, 1)))
|
|
194
|
+
|
|
195
|
+
self.cache.remove_level_tiles_before(1, timestamp=time.time() - 60)
|
|
196
|
+
assert self.cache.is_cached(Tile((0, 0, 1)))
|
|
197
|
+
|
|
198
|
+
self.cache.remove_level_tiles_before(1, timestamp=0)
|
|
199
|
+
assert not self.cache.is_cached(Tile((0, 0, 1)))
|
|
200
|
+
|
|
201
|
+
assert_files_in_dir(self.cache_dir, ['1.gpkg', '2.gpkg'], glob='*.gpkg')
|
|
202
|
+
assert self.cache.is_cached(Tile((0, 0, 2)))
|
|
203
|
+
|
|
204
|
+
def test_bulk_store_tiles_with_different_levels(self):
|
|
205
|
+
self.cache.store_tiles([
|
|
206
|
+
self.create_tile((0, 0, 1)),
|
|
207
|
+
self.create_tile((0, 0, 2)),
|
|
208
|
+
self.create_tile((1, 0, 2)),
|
|
209
|
+
self.create_tile((1, 0, 1)),
|
|
210
|
+
])
|
|
211
|
+
|
|
212
|
+
assert_files_in_dir(self.cache_dir, ['1.gpkg', '2.gpkg'], glob='*.gpkg')
|
|
213
|
+
assert self.cache.is_cached(Tile((0, 0, 1)))
|
|
214
|
+
assert self.cache.is_cached(Tile((1, 0, 1)))
|
|
215
|
+
assert self.cache.is_cached(Tile((0, 0, 2)))
|
|
216
|
+
assert self.cache.is_cached(Tile((1, 0, 2)))
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class TestGeopackageCacheInitErrors(object):
|
|
220
|
+
table_name = 'cache'
|
|
221
|
+
|
|
222
|
+
def test_bad_config_geopackage_srs(self):
|
|
223
|
+
error_msg = None
|
|
224
|
+
gpkg_file = os.path.join(os.path.join(os.path.dirname(__file__),
|
|
225
|
+
'fixture'),
|
|
226
|
+
'cache.gpkg')
|
|
227
|
+
table_name = 'cache'
|
|
228
|
+
try:
|
|
229
|
+
GeopackageCache(gpkg_file, TileGrid(srs=4326), table_name)
|
|
230
|
+
except ValueError as ve:
|
|
231
|
+
error_msg = ve
|
|
232
|
+
assert "srs is improperly configured." in str(error_msg)
|
|
233
|
+
|
|
234
|
+
def test_bad_config_geopackage_tile(self):
|
|
235
|
+
error_msg = None
|
|
236
|
+
gpkg_file = os.path.join(os.path.join(os.path.dirname(__file__),
|
|
237
|
+
'fixture'),
|
|
238
|
+
'cache.gpkg')
|
|
239
|
+
table_name = 'cache'
|
|
240
|
+
try:
|
|
241
|
+
GeopackageCache(gpkg_file, TileGrid(srs=900913, tile_size=(512, 512)), table_name)
|
|
242
|
+
except ValueError as ve:
|
|
243
|
+
error_msg = ve
|
|
244
|
+
assert "tile_size is improperly configured." in str(error_msg)
|
|
245
|
+
|
|
246
|
+
def test_bad_config_geopackage_res(self):
|
|
247
|
+
error_msg = None
|
|
248
|
+
gpkg_file = os.path.join(os.path.join(os.path.dirname(__file__),
|
|
249
|
+
'fixture'),
|
|
250
|
+
'cache.gpkg')
|
|
251
|
+
table_name = 'cache'
|
|
252
|
+
try:
|
|
253
|
+
GeopackageCache(gpkg_file, TileGrid(srs=900913, res=[1000, 100, 10]), table_name)
|
|
254
|
+
except ValueError as ve:
|
|
255
|
+
error_msg = ve
|
|
256
|
+
assert "res is improperly configured." in str(error_msg)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2017 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import os
|
|
17
|
+
import time
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
import redis
|
|
23
|
+
except ImportError:
|
|
24
|
+
redis = None
|
|
25
|
+
|
|
26
|
+
from mapproxy.cache.redis import RedisCache
|
|
27
|
+
from mapproxy.cache.tile import Tile
|
|
28
|
+
from mapproxy.test.unit.test_cache_tile import TileCacheTestBase
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.mark.skipif(not redis or not os.environ.get('MAPPROXY_TEST_REDIS'),
|
|
32
|
+
reason="redis package and MAPPROXY_TEST_REDIS env required")
|
|
33
|
+
class TestRedisCache(TileCacheTestBase):
|
|
34
|
+
always_loads_metadata = False
|
|
35
|
+
|
|
36
|
+
def setup_method(self):
|
|
37
|
+
redis_host = os.environ['MAPPROXY_TEST_REDIS']
|
|
38
|
+
self.host, self.port = redis_host.split(':')
|
|
39
|
+
if os.environ.get('MAPPROXY_TEST_REDIS_TLS'):
|
|
40
|
+
redis_host_tls = os.environ['MAPPROXY_TEST_REDIS_TLS']
|
|
41
|
+
self.tls_host, self.tls_port = redis_host_tls.split(':')
|
|
42
|
+
if os.environ.get('MAPPROXY_TEST_REDIS_AUTH'):
|
|
43
|
+
redis_host_tls = os.environ['MAPPROXY_TEST_REDIS_AUTH']
|
|
44
|
+
self.auth_host, self.auth_port = redis_host_tls.split(':')
|
|
45
|
+
|
|
46
|
+
TileCacheTestBase.setup_method(self)
|
|
47
|
+
|
|
48
|
+
self.cache = RedisCache(self.host, int(self.port), prefix='mapproxy-test', db=1)
|
|
49
|
+
|
|
50
|
+
def teardown_method(self):
|
|
51
|
+
for k in self.cache.r.keys('mapproxy-test-*'):
|
|
52
|
+
self.cache.r.delete(k)
|
|
53
|
+
|
|
54
|
+
def test_default_coverage(self):
|
|
55
|
+
assert self.cache.coverage is None
|
|
56
|
+
|
|
57
|
+
def test_expire(self):
|
|
58
|
+
cache = RedisCache(self.host, int(self.port), prefix='mapproxy-test', db=1, ttl=0)
|
|
59
|
+
t1 = self.create_tile(coord=(9382, 1234, 9))
|
|
60
|
+
assert cache.store_tile(t1)
|
|
61
|
+
time.sleep(0.1)
|
|
62
|
+
t2 = Tile(t1.coord)
|
|
63
|
+
assert cache.is_cached(t2)
|
|
64
|
+
|
|
65
|
+
cache = RedisCache(self.host, int(self.port), prefix='mapproxy-test', db=1, ttl=0.05)
|
|
66
|
+
t1 = self.create_tile(coord=(5382, 2234, 9))
|
|
67
|
+
assert cache.store_tile(t1)
|
|
68
|
+
time.sleep(0.1)
|
|
69
|
+
t2 = Tile(t1.coord)
|
|
70
|
+
assert not cache.is_cached(t2)
|
|
71
|
+
|
|
72
|
+
def test_double_remove(self):
|
|
73
|
+
tile = self.create_tile()
|
|
74
|
+
self.create_cached_tile(tile)
|
|
75
|
+
assert self.cache.remove_tile(tile)
|
|
76
|
+
assert self.cache.remove_tile(tile)
|
|
77
|
+
|
|
78
|
+
@pytest.mark.skipif(not redis or not os.environ.get('MAPPROXY_TEST_REDIS_TLS'),
|
|
79
|
+
reason="MAPPROXY_TEST_REDIS_TLS is required")
|
|
80
|
+
def test_tls_authentication_enabled(self):
|
|
81
|
+
print(os.curdir)
|
|
82
|
+
ssl_certfile = 'mapproxy/test/unit/fixture/redis-client.crt'
|
|
83
|
+
ssl_keyfile = 'mapproxy/test/unit/fixture/redis-client.key'
|
|
84
|
+
ssl_ca_certs = 'mapproxy/test/unit/fixture/ca.crt'
|
|
85
|
+
cache = RedisCache(
|
|
86
|
+
self.tls_host, int(self.tls_port), prefix='mapproxy-test', db=1, ssl_certfile=ssl_certfile,
|
|
87
|
+
ssl_keyfile=ssl_keyfile, ssl_ca_certs=ssl_ca_certs)
|
|
88
|
+
assert cache.r.connection_pool.connection_kwargs['ssl_certfile'] == ssl_certfile
|
|
89
|
+
assert cache.r.connection_pool.connection_kwargs['ssl_keyfile'] == ssl_keyfile
|
|
90
|
+
assert cache.r.connection_pool.connection_kwargs['ssl_ca_certs'] == ssl_ca_certs
|
|
91
|
+
t1 = self.create_tile(coord=(5382, 3234, 9))
|
|
92
|
+
assert cache.store_tile(t1)
|
|
93
|
+
time.sleep(0.1)
|
|
94
|
+
t2 = Tile(t1.coord)
|
|
95
|
+
assert cache.is_cached(t2)
|
|
96
|
+
|
|
97
|
+
@pytest.mark.skipif(not redis or not os.environ.get('MAPPROXY_TEST_REDIS_TLS'),
|
|
98
|
+
reason="MAPPROXY_TEST_REDIS_TLS is required")
|
|
99
|
+
def test_tls_authentication_disabled(self):
|
|
100
|
+
cache = RedisCache(self.tls_host, int(self.tls_port), prefix='mapproxy-test', db=1)
|
|
101
|
+
assert 'ssl_certfile' not in cache.r.connection_pool.connection_kwargs
|
|
102
|
+
assert 'ssl_keyfile' not in cache.r.connection_pool.connection_kwargs
|
|
103
|
+
assert 'ssl_ca_certs' not in cache.r.connection_pool.connection_kwargs
|
|
104
|
+
assert not cache.r.connection_pool.connection_kwargs.get('ssl', False)
|
|
105
|
+
t1 = self.create_tile(coord=(5382, 4234, 9))
|
|
106
|
+
assert not cache.store_tile(t1)
|
|
107
|
+
time.sleep(0.1)
|
|
108
|
+
t2 = Tile(t1.coord)
|
|
109
|
+
assert not cache.is_cached(t2)
|
|
110
|
+
|
|
111
|
+
@pytest.mark.skipif(not redis or not os.environ.get('MAPPROXY_TEST_REDIS_AUTH'),
|
|
112
|
+
reason="MAPPROXY_TEST_REDIS_AUTH is required to test authentication")
|
|
113
|
+
def test_user_password_authentication(self):
|
|
114
|
+
username = 'test'
|
|
115
|
+
password = 'pw4test'
|
|
116
|
+
cache = RedisCache(
|
|
117
|
+
self.auth_host, int(self.auth_port), prefix='mapproxy-test', db=1, username=username, password=password)
|
|
118
|
+
assert cache.r.connection_pool.connection_kwargs['username'] == username
|
|
119
|
+
assert cache.r.connection_pool.connection_kwargs['password'] == password
|
|
120
|
+
t1 = self.create_tile(coord=(5382, 5234, 9))
|
|
121
|
+
assert cache.store_tile(t1)
|
|
122
|
+
t2 = Tile(t1.coord)
|
|
123
|
+
assert cache.is_cached(t2)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2013 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import os
|
|
17
|
+
import sys
|
|
18
|
+
import random
|
|
19
|
+
from urllib.parse import urlparse
|
|
20
|
+
|
|
21
|
+
import pytest
|
|
22
|
+
|
|
23
|
+
from mapproxy.cache.riak import RiakCache
|
|
24
|
+
from mapproxy.grid import tile_grid
|
|
25
|
+
from mapproxy.test.image import create_tmp_image_buf
|
|
26
|
+
from mapproxy.test.unit.test_cache_tile import TileCacheTestBase
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
tile_image = create_tmp_image_buf((256, 256), color='blue')
|
|
30
|
+
tile_image2 = create_tmp_image_buf((256, 256), color='red')
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.mark.skipif(sys.version_info > (3, 7), reason="riak is not compatible with this Python version")
|
|
34
|
+
class RiakCacheTestBase(TileCacheTestBase):
|
|
35
|
+
always_loads_metadata = True
|
|
36
|
+
|
|
37
|
+
def setup_method(self):
|
|
38
|
+
url = os.environ[self.riak_url_env]
|
|
39
|
+
urlparts = urlparse(url)
|
|
40
|
+
protocol = urlparts.scheme.lower()
|
|
41
|
+
node = {'host': urlparts.hostname}
|
|
42
|
+
if ':' in urlparts.hostname:
|
|
43
|
+
if protocol == 'pbc':
|
|
44
|
+
node['pb_port'] = urlparts.port
|
|
45
|
+
if protocol in ('http', 'https'):
|
|
46
|
+
node['http_port'] = urlparts.port
|
|
47
|
+
|
|
48
|
+
db_name = 'mapproxy_test_%d' % random.randint(0, 100000)
|
|
49
|
+
|
|
50
|
+
TileCacheTestBase.setup_method(self)
|
|
51
|
+
|
|
52
|
+
self.cache = RiakCache([node], protocol, db_name, tile_grid=tile_grid(3857, name='global-webmarcator'))
|
|
53
|
+
|
|
54
|
+
def teardown_method(self):
|
|
55
|
+
import riak
|
|
56
|
+
bucket = self.cache.bucket
|
|
57
|
+
for k in bucket.get_keys():
|
|
58
|
+
riak.RiakObject(self.cache.connection, bucket, k).delete()
|
|
59
|
+
TileCacheTestBase.teardown_method(self)
|
|
60
|
+
|
|
61
|
+
def test_default_coverage(self):
|
|
62
|
+
assert self.cache.coverage is None
|
|
63
|
+
|
|
64
|
+
def test_double_remove(self):
|
|
65
|
+
tile = self.create_tile()
|
|
66
|
+
self.create_cached_tile(tile)
|
|
67
|
+
assert self.cache.remove_tile(tile)
|
|
68
|
+
assert self.cache.remove_tile(tile)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@pytest.mark.skipif(not os.environ.get('MAPPROXY_TEST_RIAK_HTTP'),
|
|
72
|
+
reason="MAPPROXY_TEST_RIAK_HTTP not set")
|
|
73
|
+
class TestRiakCacheHTTP(RiakCacheTestBase):
|
|
74
|
+
riak_url_env = 'MAPPROXY_TEST_RIAK_HTTP'
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@pytest.mark.skipif(not os.environ.get('MAPPROXY_TEST_RIAK_PBC'),
|
|
78
|
+
reason="MAPPROXY_TEST_RIAK_PBC not set")
|
|
79
|
+
class TestRiakCachePBC(RiakCacheTestBase):
|
|
80
|
+
riak_url_env = 'MAPPROXY_TEST_RIAK_PBC'
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2011 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
from mapproxy.layer import MapExtent
|
|
19
|
+
from mapproxy.srs import SRS
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
import boto3
|
|
23
|
+
from moto import mock_s3
|
|
24
|
+
except ImportError:
|
|
25
|
+
boto3 = None
|
|
26
|
+
mock_s3 = None
|
|
27
|
+
|
|
28
|
+
from mapproxy.cache.s3 import S3Cache
|
|
29
|
+
from mapproxy.test.unit.test_cache_tile import TileCacheTestBase
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
GLOBAL_WEBMERCATOR_EXTENT = MapExtent(
|
|
33
|
+
(-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244),
|
|
34
|
+
SRS(3857))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.mark.skipif(not mock_s3 or not boto3,
|
|
38
|
+
reason="boto3 and moto required for S3 tests")
|
|
39
|
+
class TestS3Cache(TileCacheTestBase):
|
|
40
|
+
always_loads_metadata = True
|
|
41
|
+
uses_utc = True
|
|
42
|
+
|
|
43
|
+
def setup_method(self):
|
|
44
|
+
TileCacheTestBase.setup_method(self)
|
|
45
|
+
|
|
46
|
+
self.mock = mock_s3()
|
|
47
|
+
self.mock.start()
|
|
48
|
+
|
|
49
|
+
self.bucket_name = "test"
|
|
50
|
+
dir_name = 'mapproxy'
|
|
51
|
+
|
|
52
|
+
boto3.client("s3").create_bucket(Bucket=self.bucket_name)
|
|
53
|
+
|
|
54
|
+
self.cache = S3Cache(dir_name,
|
|
55
|
+
file_ext='png',
|
|
56
|
+
directory_layout='tms',
|
|
57
|
+
bucket_name=self.bucket_name,
|
|
58
|
+
profile_name=None,
|
|
59
|
+
_concurrent_writer=1,) # moto is not thread safe
|
|
60
|
+
|
|
61
|
+
def teardown_method(self):
|
|
62
|
+
self.mock.stop()
|
|
63
|
+
TileCacheTestBase.teardown_method(self)
|
|
64
|
+
|
|
65
|
+
def test_default_coverage(self):
|
|
66
|
+
assert self.cache.coverage is None
|
|
67
|
+
|
|
68
|
+
@pytest.mark.parametrize('layout,tile_coord,key', [
|
|
69
|
+
['mp', (12345, 67890, 2), 'mycache/webmercator/02/0001/2345/0006/7890.png'],
|
|
70
|
+
['mp', (12345, 67890, 12), 'mycache/webmercator/12/0001/2345/0006/7890.png'],
|
|
71
|
+
|
|
72
|
+
['tc', (12345, 67890, 2), 'mycache/webmercator/02/000/012/345/000/067/890.png'],
|
|
73
|
+
['tc', (12345, 67890, 12), 'mycache/webmercator/12/000/012/345/000/067/890.png'],
|
|
74
|
+
|
|
75
|
+
['tms', (12345, 67890, 2), 'mycache/webmercator/2/12345/67890.png'],
|
|
76
|
+
['tms', (12345, 67890, 12), 'mycache/webmercator/12/12345/67890.png'],
|
|
77
|
+
|
|
78
|
+
['quadkey', (0, 0, 0), 'mycache/webmercator/.png'],
|
|
79
|
+
['quadkey', (0, 0, 1), 'mycache/webmercator/0.png'],
|
|
80
|
+
['quadkey', (1, 1, 1), 'mycache/webmercator/3.png'],
|
|
81
|
+
['quadkey', (12345, 67890, 12), 'mycache/webmercator/200200331021.png'],
|
|
82
|
+
|
|
83
|
+
['arcgis', (1, 2, 3), 'mycache/webmercator/L03/R00000002/C00000001.png'],
|
|
84
|
+
['arcgis', (9, 2, 3), 'mycache/webmercator/L03/R00000002/C00000009.png'],
|
|
85
|
+
['arcgis', (10, 2, 3), 'mycache/webmercator/L03/R00000002/C0000000a.png'],
|
|
86
|
+
['arcgis', (12345, 67890, 12), 'mycache/webmercator/L12/R00010932/C00003039.png'],
|
|
87
|
+
])
|
|
88
|
+
def test_tile_key(self, layout, tile_coord, key):
|
|
89
|
+
cache = S3Cache('/mycache/webmercator', 'png', bucket_name=self.bucket_name, directory_layout=layout)
|
|
90
|
+
cache.store_tile(self.create_tile(tile_coord))
|
|
91
|
+
|
|
92
|
+
# raises, if key is missing
|
|
93
|
+
boto3.client("s3").head_object(Bucket=self.bucket_name, Key=key)
|