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
mapproxy/seed/script.py
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
# This file is part of the MapProxy project.
|
|
2
|
+
# Copyright (C) 2010 Omniscale <http://omniscale.de>
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
from __future__ import print_function
|
|
17
|
+
|
|
18
|
+
import errno
|
|
19
|
+
import os
|
|
20
|
+
import re
|
|
21
|
+
import signal
|
|
22
|
+
import sys
|
|
23
|
+
import time
|
|
24
|
+
import logging
|
|
25
|
+
from logging.config import fileConfig
|
|
26
|
+
|
|
27
|
+
from subprocess import Popen
|
|
28
|
+
from optparse import OptionParser, OptionValueError
|
|
29
|
+
|
|
30
|
+
from mapproxy.config.loader import load_configuration, ConfigurationError
|
|
31
|
+
from mapproxy.seed.config import load_seed_tasks_conf
|
|
32
|
+
from mapproxy.seed.seeder import seed, SeedInterrupted
|
|
33
|
+
from mapproxy.seed.cleanup import cleanup
|
|
34
|
+
from mapproxy.seed.util import (format_seed_task, format_cleanup_task,
|
|
35
|
+
ProgressLog, ProgressStore)
|
|
36
|
+
from mapproxy.seed.cachelock import CacheLocker
|
|
37
|
+
|
|
38
|
+
SECONDS_PER_DAY = 60 * 60 * 24
|
|
39
|
+
SECONDS_PER_MINUTE = 60
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def setup_logging(logging_conf=None):
|
|
43
|
+
if logging_conf is not None:
|
|
44
|
+
fileConfig(logging_conf, {'here': './'})
|
|
45
|
+
|
|
46
|
+
mapproxy_log = logging.getLogger('mapproxy')
|
|
47
|
+
mapproxy_log.setLevel(logging.WARN)
|
|
48
|
+
|
|
49
|
+
ch = logging.StreamHandler(sys.stdout)
|
|
50
|
+
ch.setLevel(logging.DEBUG)
|
|
51
|
+
formatter = logging.Formatter(
|
|
52
|
+
"[%(asctime)s] %(name)s - %(levelname)s - %(message)s")
|
|
53
|
+
ch.setFormatter(formatter)
|
|
54
|
+
mapproxy_log.addHandler(ch)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def check_duration(option, opt, value, parser):
|
|
58
|
+
try:
|
|
59
|
+
setattr(parser.values, option.dest, parse_duration(value))
|
|
60
|
+
except ValueError:
|
|
61
|
+
raise OptionValueError(
|
|
62
|
+
"option %s: invalid duration value: %r, expected (10s, 15m, 0.5h, 3d, etc)"
|
|
63
|
+
% (opt, value),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def parse_duration(string):
|
|
68
|
+
match = re.match(r'^(\d*.?\d+)([smhd])', string)
|
|
69
|
+
if not match:
|
|
70
|
+
raise ValueError('invalid duration, not in format: 10s, 0.5h, etc.')
|
|
71
|
+
duration = float(match.group(1))
|
|
72
|
+
unit = match.group(2)
|
|
73
|
+
if unit == 's':
|
|
74
|
+
return duration
|
|
75
|
+
duration *= 60
|
|
76
|
+
if unit == 'm':
|
|
77
|
+
return duration
|
|
78
|
+
duration *= 60
|
|
79
|
+
if unit == 'h':
|
|
80
|
+
return duration
|
|
81
|
+
duration *= 24
|
|
82
|
+
return duration
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class SeedScript(object):
|
|
86
|
+
usage = "usage: %prog [options] seed_conf"
|
|
87
|
+
parser = OptionParser(usage)
|
|
88
|
+
parser.add_option("-q", "--quiet",
|
|
89
|
+
action="count", dest="quiet", default=0,
|
|
90
|
+
help="reduce number of messages to stdout, repeat to disable progress output")
|
|
91
|
+
parser.add_option("-s", "--seed-conf",
|
|
92
|
+
dest="seed_file", default=None,
|
|
93
|
+
help="seed configuration")
|
|
94
|
+
parser.add_option("-f", "--proxy-conf",
|
|
95
|
+
dest="conf_file", default=None,
|
|
96
|
+
help="proxy configuration")
|
|
97
|
+
parser.add_option("-c", "--concurrency", type="int",
|
|
98
|
+
dest="concurrency", default=2,
|
|
99
|
+
help="number of parallel seed processes")
|
|
100
|
+
parser.add_option("-n", "--dry-run",
|
|
101
|
+
action="store_true", dest="dry_run", default=False,
|
|
102
|
+
help="do not seed, just print output")
|
|
103
|
+
parser.add_option("-l", "--skip-geoms-for-last-levels",
|
|
104
|
+
type="int", dest="geom_levels", default=0,
|
|
105
|
+
metavar="N",
|
|
106
|
+
help="do not check for intersections between tiles"
|
|
107
|
+
" and seed geometries on the last N levels")
|
|
108
|
+
parser.add_option("--skip-uncached",
|
|
109
|
+
action="store_true", dest="skip_uncached", default=False,
|
|
110
|
+
help="only treat tiles which are already present in the cache."
|
|
111
|
+
" This can be used with the configuration entry `refresh_before`"
|
|
112
|
+
" to refresh only the existing cache.")
|
|
113
|
+
parser.add_option("--summary",
|
|
114
|
+
action="store_true", dest="summary", default=False,
|
|
115
|
+
help="print summary with all seeding tasks and exit."
|
|
116
|
+
" does not seed anything.")
|
|
117
|
+
parser.add_option("-i", "--interactive",
|
|
118
|
+
action="store_true", dest="interactive", default=False,
|
|
119
|
+
help="print each task description and ask if it should be seeded")
|
|
120
|
+
|
|
121
|
+
parser.add_option("--seed",
|
|
122
|
+
action="append", dest="seed_names", metavar='task1,task2,...',
|
|
123
|
+
help="seed only the named tasks. cleanup is disabled unless "
|
|
124
|
+
"--cleanup is used. use ALL to select all tasks")
|
|
125
|
+
|
|
126
|
+
parser.add_option("--cleanup",
|
|
127
|
+
action="append", dest="cleanup_names", metavar='task1,task2,...',
|
|
128
|
+
help="cleanup only the named tasks. seeding is disabled unless "
|
|
129
|
+
"--seed is used. use ALL to select all tasks")
|
|
130
|
+
|
|
131
|
+
parser.add_option("--use-cache-lock",
|
|
132
|
+
action="store_true", default=False,
|
|
133
|
+
help="use locking to prevent multiple mapproxy-seed calls "
|
|
134
|
+
"to seed the same cache")
|
|
135
|
+
|
|
136
|
+
parser.add_option("--continue", dest='continue_seed',
|
|
137
|
+
action="store_true", default=False,
|
|
138
|
+
help="continue an aborted seed progress")
|
|
139
|
+
|
|
140
|
+
parser.add_option("--progress-file", dest='progress_file',
|
|
141
|
+
default=None,
|
|
142
|
+
help="filename for storing the seed progress (for --continue option)")
|
|
143
|
+
|
|
144
|
+
parser.add_option("--duration", dest="duration",
|
|
145
|
+
help="stop seeding after (120s, 15m, 4h, 0.5d, etc)",
|
|
146
|
+
type=str, action="callback", callback=check_duration)
|
|
147
|
+
|
|
148
|
+
parser.add_option("--reseed-file", dest="reseed_file",
|
|
149
|
+
help="start of last re-seed", metavar="FILE",
|
|
150
|
+
default=None)
|
|
151
|
+
parser.add_option("--reseed-interval", dest="reseed_interval",
|
|
152
|
+
help="only start seeding if --reseed-file is older then --reseed-interval",
|
|
153
|
+
metavar="DURATION",
|
|
154
|
+
type=str, action="callback", callback=check_duration,
|
|
155
|
+
default=None)
|
|
156
|
+
|
|
157
|
+
parser.add_option("--log-config", dest='logging_conf', default=None,
|
|
158
|
+
help="logging configuration")
|
|
159
|
+
|
|
160
|
+
def __call__(self):
|
|
161
|
+
(options, args) = self.parser.parse_args()
|
|
162
|
+
|
|
163
|
+
if len(args) != 1 and not options.seed_file:
|
|
164
|
+
self.parser.print_help()
|
|
165
|
+
sys.exit(1)
|
|
166
|
+
|
|
167
|
+
if not options.seed_file:
|
|
168
|
+
if len(args) != 1:
|
|
169
|
+
self.parser.error('missing seed_conf file as last argument or --seed-conf option')
|
|
170
|
+
else:
|
|
171
|
+
options.seed_file = args[0]
|
|
172
|
+
|
|
173
|
+
if not options.conf_file:
|
|
174
|
+
self.parser.error('missing mapproxy configuration -f/--proxy-conf')
|
|
175
|
+
|
|
176
|
+
setup_logging(options.logging_conf)
|
|
177
|
+
|
|
178
|
+
if options.duration:
|
|
179
|
+
# calls with --duration are handled in call_with_duration
|
|
180
|
+
sys.exit(self.call_with_duration(options, args))
|
|
181
|
+
|
|
182
|
+
try:
|
|
183
|
+
mapproxy_conf = load_configuration(options.conf_file, seed=True)
|
|
184
|
+
except ConfigurationError as ex:
|
|
185
|
+
print("ERROR: " + '\n\t'.join(str(ex).split('\n')))
|
|
186
|
+
sys.exit(2)
|
|
187
|
+
|
|
188
|
+
if options.use_cache_lock:
|
|
189
|
+
cache_locker = CacheLocker('.mapproxy_seed.lck')
|
|
190
|
+
else:
|
|
191
|
+
cache_locker = None
|
|
192
|
+
|
|
193
|
+
if not sys.stdout.isatty() and options.quiet == 0:
|
|
194
|
+
# disable verbose output for non-ttys
|
|
195
|
+
options.quiet = 1
|
|
196
|
+
|
|
197
|
+
progress = None
|
|
198
|
+
if options.continue_seed or options.progress_file:
|
|
199
|
+
if not options.progress_file:
|
|
200
|
+
options.progress_file = '.mapproxy_seed_progress'
|
|
201
|
+
progress = ProgressStore(options.progress_file,
|
|
202
|
+
continue_seed=options.continue_seed)
|
|
203
|
+
|
|
204
|
+
if options.reseed_file:
|
|
205
|
+
if not os.path.exists(options.reseed_file):
|
|
206
|
+
# create --reseed-file if missing
|
|
207
|
+
with open(options.reseed_file, 'w'):
|
|
208
|
+
pass
|
|
209
|
+
else:
|
|
210
|
+
if progress and not os.path.exists(options.progress_file):
|
|
211
|
+
# we have an existing --reseed-file but no --progress-file
|
|
212
|
+
# meaning the last seed call was completed
|
|
213
|
+
if options.reseed_interval and (
|
|
214
|
+
os.path.getmtime(options.reseed_file) > (time.time() - options.reseed_interval)
|
|
215
|
+
):
|
|
216
|
+
print("no need for re-seeding")
|
|
217
|
+
sys.exit(1)
|
|
218
|
+
os.utime(options.reseed_file, (time.time(), time.time()))
|
|
219
|
+
|
|
220
|
+
with mapproxy_conf:
|
|
221
|
+
try:
|
|
222
|
+
seed_conf = load_seed_tasks_conf(options.seed_file, mapproxy_conf)
|
|
223
|
+
seed_names, cleanup_names = self.task_names(seed_conf, options)
|
|
224
|
+
seed_tasks = seed_conf.seeds(seed_names)
|
|
225
|
+
cleanup_tasks = seed_conf.cleanups(cleanup_names)
|
|
226
|
+
except ConfigurationError as ex:
|
|
227
|
+
print("error in configuration: " + '\n\t'.join(str(ex).split('\n')))
|
|
228
|
+
sys.exit(2)
|
|
229
|
+
|
|
230
|
+
if options.summary:
|
|
231
|
+
print('========== Seeding tasks ==========')
|
|
232
|
+
for task in seed_tasks:
|
|
233
|
+
print(format_seed_task(task))
|
|
234
|
+
print('========== Cleanup tasks ==========')
|
|
235
|
+
for task in cleanup_tasks:
|
|
236
|
+
print(format_cleanup_task(task))
|
|
237
|
+
return 0
|
|
238
|
+
|
|
239
|
+
try:
|
|
240
|
+
if options.interactive:
|
|
241
|
+
seed_tasks, cleanup_tasks = self.interactive(seed_tasks, cleanup_tasks)
|
|
242
|
+
|
|
243
|
+
if seed_tasks:
|
|
244
|
+
print('========== Seeding tasks ==========')
|
|
245
|
+
print('Start seeding process (%d task%s)' % (
|
|
246
|
+
len(seed_tasks), 's' if len(seed_tasks) > 1 else ''))
|
|
247
|
+
logger = ProgressLog(verbose=options.quiet == 0, silent=options.quiet >= 2,
|
|
248
|
+
progress_store=progress)
|
|
249
|
+
seed(seed_tasks, progress_logger=logger, dry_run=options.dry_run,
|
|
250
|
+
concurrency=options.concurrency, cache_locker=cache_locker,
|
|
251
|
+
skip_geoms_for_last_levels=options.geom_levels,
|
|
252
|
+
skip_uncached=options.skip_uncached)
|
|
253
|
+
if cleanup_tasks:
|
|
254
|
+
print('========== Cleanup tasks ==========')
|
|
255
|
+
print('Start cleanup process (%d task%s)' % (
|
|
256
|
+
len(cleanup_tasks), 's' if len(cleanup_tasks) > 1 else ''))
|
|
257
|
+
logger = ProgressLog(verbose=options.quiet == 0, silent=options.quiet >= 2,
|
|
258
|
+
progress_store=progress)
|
|
259
|
+
cleanup(cleanup_tasks, verbose=options.quiet == 0, dry_run=options.dry_run,
|
|
260
|
+
concurrency=options.concurrency, progress_logger=logger,
|
|
261
|
+
skip_geoms_for_last_levels=options.geom_levels)
|
|
262
|
+
except SeedInterrupted:
|
|
263
|
+
print('\ninterrupted...')
|
|
264
|
+
return 3
|
|
265
|
+
except KeyboardInterrupt:
|
|
266
|
+
print('\nexiting...')
|
|
267
|
+
return 2
|
|
268
|
+
|
|
269
|
+
if progress:
|
|
270
|
+
progress.remove()
|
|
271
|
+
|
|
272
|
+
def task_names(self, seed_conf, options):
|
|
273
|
+
seed_names = cleanup_names = []
|
|
274
|
+
|
|
275
|
+
if options.seed_names:
|
|
276
|
+
seed_names = split_comma_seperated_option(options.seed_names)
|
|
277
|
+
if seed_names == ['ALL']:
|
|
278
|
+
seed_names = None
|
|
279
|
+
else:
|
|
280
|
+
avail_seed_names = seed_conf.seed_tasks_names()
|
|
281
|
+
missing = set(seed_names).difference(avail_seed_names)
|
|
282
|
+
if missing:
|
|
283
|
+
print('unknown seed tasks: %s' % (', '.join(missing), ))
|
|
284
|
+
print('available seed tasks: %s' % (', '.join(avail_seed_names), ))
|
|
285
|
+
sys.exit(1)
|
|
286
|
+
elif not options.cleanup_names:
|
|
287
|
+
seed_names = None # seed all
|
|
288
|
+
|
|
289
|
+
if options.cleanup_names:
|
|
290
|
+
cleanup_names = split_comma_seperated_option(options.cleanup_names)
|
|
291
|
+
if cleanup_names == ['ALL']:
|
|
292
|
+
cleanup_names = None
|
|
293
|
+
else:
|
|
294
|
+
avail_cleanup_names = seed_conf.cleanup_tasks_names()
|
|
295
|
+
missing = set(cleanup_names).difference(avail_cleanup_names)
|
|
296
|
+
if missing:
|
|
297
|
+
print('unknown cleanup tasks: %s' % (', '.join(missing), ))
|
|
298
|
+
print('available cleanup tasks: %s' % (', '.join(avail_cleanup_names), ))
|
|
299
|
+
sys.exit(1)
|
|
300
|
+
elif not options.seed_names:
|
|
301
|
+
cleanup_names = None # cleanup all
|
|
302
|
+
|
|
303
|
+
return seed_names, cleanup_names
|
|
304
|
+
|
|
305
|
+
def call_with_duration(self, options, args):
|
|
306
|
+
# --duration is implemented by calling mapproxy-seed again in a separate
|
|
307
|
+
# process (but without --duration) and terminating that process
|
|
308
|
+
# after --duration
|
|
309
|
+
|
|
310
|
+
argv = sys.argv[:]
|
|
311
|
+
for i, arg in enumerate(sys.argv):
|
|
312
|
+
if arg == '--duration':
|
|
313
|
+
argv = sys.argv[:i] + sys.argv[i+2:]
|
|
314
|
+
break
|
|
315
|
+
elif arg.startswith('--duration='):
|
|
316
|
+
argv = sys.argv[:i] + sys.argv[i+1:]
|
|
317
|
+
break
|
|
318
|
+
|
|
319
|
+
# call mapproxy-seed again, poll status, terminate after --duration
|
|
320
|
+
cmd = Popen(args=argv)
|
|
321
|
+
start = time.time()
|
|
322
|
+
while True:
|
|
323
|
+
if (time.time() - start) > options.duration:
|
|
324
|
+
try:
|
|
325
|
+
cmd.send_signal(signal.SIGINT)
|
|
326
|
+
# try to stop with sigint
|
|
327
|
+
# send sigterm after 10 seconds
|
|
328
|
+
for _ in range(10):
|
|
329
|
+
time.sleep(1)
|
|
330
|
+
if cmd.poll() is not None:
|
|
331
|
+
break
|
|
332
|
+
else:
|
|
333
|
+
cmd.terminate()
|
|
334
|
+
except OSError as ex:
|
|
335
|
+
if ex.errno != errno.ESRCH: # no such process
|
|
336
|
+
raise
|
|
337
|
+
return 0
|
|
338
|
+
if cmd.poll() is not None:
|
|
339
|
+
return cmd.returncode
|
|
340
|
+
try:
|
|
341
|
+
time.sleep(1)
|
|
342
|
+
except KeyboardInterrupt:
|
|
343
|
+
# force termination
|
|
344
|
+
start = 0
|
|
345
|
+
|
|
346
|
+
def interactive(self, seed_tasks, cleanup_tasks):
|
|
347
|
+
selected_seed_tasks = []
|
|
348
|
+
print('========== Select seeding tasks ==========')
|
|
349
|
+
for task in seed_tasks:
|
|
350
|
+
print(format_seed_task(task))
|
|
351
|
+
if ask_yes_no_question(' Seed this task (y/n)? '):
|
|
352
|
+
selected_seed_tasks.append(task)
|
|
353
|
+
seed_tasks = selected_seed_tasks
|
|
354
|
+
|
|
355
|
+
selected_cleanup_tasks = []
|
|
356
|
+
print('========== Select cleanup tasks ==========')
|
|
357
|
+
for task in cleanup_tasks:
|
|
358
|
+
print(format_cleanup_task(task))
|
|
359
|
+
if ask_yes_no_question(' Cleanup this task (y/n)? '):
|
|
360
|
+
selected_cleanup_tasks.append(task)
|
|
361
|
+
cleanup_tasks = selected_cleanup_tasks
|
|
362
|
+
return seed_tasks, cleanup_tasks
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def main():
|
|
366
|
+
return SeedScript()()
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def ask_yes_no_question(question):
|
|
370
|
+
while True:
|
|
371
|
+
resp = input(question).lower()
|
|
372
|
+
if resp in ('y', 'yes'):
|
|
373
|
+
return True
|
|
374
|
+
elif resp in ('n', 'no'):
|
|
375
|
+
return False
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def split_comma_seperated_option(option):
|
|
379
|
+
"""
|
|
380
|
+
>>> split_comma_seperated_option(['foo,bar', 'baz'])
|
|
381
|
+
['foo', 'bar', 'baz']
|
|
382
|
+
"""
|
|
383
|
+
result = []
|
|
384
|
+
if option:
|
|
385
|
+
for args in option:
|
|
386
|
+
result.extend(args.split(','))
|
|
387
|
+
return result
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
if __name__ == '__main__':
|
|
391
|
+
main()
|