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/tilefilter.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
"""
|
|
17
|
+
Filter for tiles (watermark, etc.)
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from mapproxy.image.message import WatermarkImage
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def create_watermark_filter(conf, context, **kw):
|
|
24
|
+
text = conf['watermark'].get('text', '')
|
|
25
|
+
opacity = conf['watermark'].get('opacity')
|
|
26
|
+
font_size = conf['watermark'].get('font_size')
|
|
27
|
+
spacing = conf['watermark'].get('spacing')
|
|
28
|
+
font_color = conf['watermark'].get('color')
|
|
29
|
+
if spacing not in ('wide', None):
|
|
30
|
+
raise ValueError('unsupported watermark spacing: %r' % spacing)
|
|
31
|
+
if text != '':
|
|
32
|
+
return watermark_filter(text, opacity=opacity, font_size=font_size,
|
|
33
|
+
spacing=spacing, font_color=font_color)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def watermark_filter(text, opacity=None, spacing=None, font_size=None, font_color=None):
|
|
37
|
+
"""
|
|
38
|
+
Returns a tile filter that adds a watermark to the tiles.
|
|
39
|
+
:param text: watermark text
|
|
40
|
+
"""
|
|
41
|
+
def _watermark_filter(tile):
|
|
42
|
+
placement = tile_watermark_placement(tile.coord, spacing == 'wide')
|
|
43
|
+
wimg = WatermarkImage(text, image_opts=tile.source.image_opts,
|
|
44
|
+
placement=placement, opacity=opacity, font_size=font_size,
|
|
45
|
+
font_color=font_color)
|
|
46
|
+
tile.source = wimg.draw(img=tile.source, in_place=False)
|
|
47
|
+
return tile
|
|
48
|
+
return _watermark_filter
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def tile_watermark_placement(coord, double_spacing=False):
|
|
52
|
+
if not double_spacing:
|
|
53
|
+
if coord[1] % 2 == 0:
|
|
54
|
+
return 'c'
|
|
55
|
+
else:
|
|
56
|
+
return 'b'
|
|
57
|
+
|
|
58
|
+
if coord[1] % 2 != coord[0] % 2:
|
|
59
|
+
return 'c'
|
|
60
|
+
|
|
61
|
+
return None
|
|
File without changes
|
mapproxy/util/async_.py
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
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
|
+
try:
|
|
17
|
+
import Queue
|
|
18
|
+
except ImportError:
|
|
19
|
+
import queue as Queue
|
|
20
|
+
|
|
21
|
+
import sys
|
|
22
|
+
import threading
|
|
23
|
+
|
|
24
|
+
from mapproxy.config import base_config
|
|
25
|
+
from mapproxy.config import local_base_config
|
|
26
|
+
|
|
27
|
+
import logging
|
|
28
|
+
|
|
29
|
+
MAX_MAP_ASYNC_THREADS = 20
|
|
30
|
+
|
|
31
|
+
log_system = logging.getLogger('mapproxy.system')
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class AsyncResult(object):
|
|
35
|
+
def __init__(self, result=None, exception=None):
|
|
36
|
+
self.result = result
|
|
37
|
+
self.exception = exception
|
|
38
|
+
|
|
39
|
+
def __repr__(self):
|
|
40
|
+
return "<AsyncResult result='%s' exception='%s'>" % (
|
|
41
|
+
self.result, self.exception)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _result_iter(results, use_result_objects=False):
|
|
45
|
+
for result in results:
|
|
46
|
+
if use_result_objects:
|
|
47
|
+
exception = None
|
|
48
|
+
if (isinstance(result, tuple) and len(result) == 3 and
|
|
49
|
+
isinstance(result[1], Exception)):
|
|
50
|
+
exception = result
|
|
51
|
+
result = None
|
|
52
|
+
yield AsyncResult(result, exception)
|
|
53
|
+
else:
|
|
54
|
+
yield result
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ThreadWorker(threading.Thread):
|
|
58
|
+
def __init__(self, task_queue, result_queue):
|
|
59
|
+
threading.Thread.__init__(self)
|
|
60
|
+
self.task_queue = task_queue
|
|
61
|
+
self.result_queue = result_queue
|
|
62
|
+
self.base_config = base_config()
|
|
63
|
+
|
|
64
|
+
def run(self):
|
|
65
|
+
with local_base_config(self.base_config):
|
|
66
|
+
while True:
|
|
67
|
+
task = self.task_queue.get()
|
|
68
|
+
if task is None:
|
|
69
|
+
self.task_queue.task_done()
|
|
70
|
+
break
|
|
71
|
+
exec_id, func, args = task
|
|
72
|
+
try:
|
|
73
|
+
result = func(*args)
|
|
74
|
+
except Exception:
|
|
75
|
+
result = sys.exc_info()
|
|
76
|
+
self.result_queue.put((exec_id, result))
|
|
77
|
+
self.task_queue.task_done()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _consume_queue(queue):
|
|
81
|
+
"""
|
|
82
|
+
Get all items from queue.
|
|
83
|
+
"""
|
|
84
|
+
while not queue.empty():
|
|
85
|
+
try:
|
|
86
|
+
queue.get(block=False)
|
|
87
|
+
queue.task_done()
|
|
88
|
+
except Queue.Empty:
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class ThreadPool(object):
|
|
93
|
+
def __init__(self, size=4):
|
|
94
|
+
self.pool_size = size
|
|
95
|
+
self.task_queue = Queue.Queue()
|
|
96
|
+
self.result_queue = Queue.Queue()
|
|
97
|
+
self.pool = None
|
|
98
|
+
|
|
99
|
+
def map_each(self, func_args, raise_exceptions):
|
|
100
|
+
"""
|
|
101
|
+
args should be a list of function arg tuples.
|
|
102
|
+
map_each calls each function with the given arg.
|
|
103
|
+
"""
|
|
104
|
+
if self.pool_size < 2:
|
|
105
|
+
for func, arg in func_args:
|
|
106
|
+
try:
|
|
107
|
+
yield func(*arg)
|
|
108
|
+
except Exception:
|
|
109
|
+
yield sys.exc_info()
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
self.pool = self._init_pool()
|
|
113
|
+
|
|
114
|
+
i = 0
|
|
115
|
+
for i, (func, arg) in enumerate(func_args):
|
|
116
|
+
self.task_queue.put((i, func, arg))
|
|
117
|
+
|
|
118
|
+
results = {}
|
|
119
|
+
|
|
120
|
+
next_result = 0
|
|
121
|
+
for value in self._get_results(next_result, results, raise_exceptions):
|
|
122
|
+
yield value
|
|
123
|
+
next_result += 1
|
|
124
|
+
|
|
125
|
+
self.task_queue.join()
|
|
126
|
+
for value in self._get_results(next_result, results, raise_exceptions):
|
|
127
|
+
yield value
|
|
128
|
+
next_result += 1
|
|
129
|
+
|
|
130
|
+
self.shutdown()
|
|
131
|
+
|
|
132
|
+
def _single_call(self, func, args, use_result_objects):
|
|
133
|
+
try:
|
|
134
|
+
result = func(*args)
|
|
135
|
+
except Exception:
|
|
136
|
+
if not use_result_objects:
|
|
137
|
+
raise
|
|
138
|
+
result = sys.exc_info()
|
|
139
|
+
return _result_iter([result], use_result_objects)
|
|
140
|
+
|
|
141
|
+
def map(self, func, *args, **kw):
|
|
142
|
+
return list(self.imap(func, *args, **kw))
|
|
143
|
+
|
|
144
|
+
def imap(self, func, *args, **kw):
|
|
145
|
+
use_result_objects = kw.get('use_result_objects', False)
|
|
146
|
+
if len(args[0]) == 1:
|
|
147
|
+
return self._single_call(func, next(iter(zip(*args))), use_result_objects)
|
|
148
|
+
return _result_iter(self.map_each([(func, arg) for arg in zip(*args)], raise_exceptions=not use_result_objects),
|
|
149
|
+
use_result_objects)
|
|
150
|
+
|
|
151
|
+
def starmap(self, func, args, **kw):
|
|
152
|
+
use_result_objects = kw.get('use_result_objects', False)
|
|
153
|
+
if len(args[0]) == 1:
|
|
154
|
+
return self._single_call(func, args[0], use_result_objects)
|
|
155
|
+
|
|
156
|
+
return _result_iter(self.map_each([(func, arg) for arg in args], raise_exceptions=not use_result_objects),
|
|
157
|
+
use_result_objects)
|
|
158
|
+
|
|
159
|
+
def starcall(self, args, **kw):
|
|
160
|
+
def call(func, *args):
|
|
161
|
+
return func(*args)
|
|
162
|
+
return self.starmap(call, args, **kw)
|
|
163
|
+
|
|
164
|
+
def _get_results(self, next_result, results, raise_exceptions):
|
|
165
|
+
for i, value in self._fetch_results(raise_exceptions):
|
|
166
|
+
if i == next_result:
|
|
167
|
+
yield value
|
|
168
|
+
next_result += 1
|
|
169
|
+
while next_result in results:
|
|
170
|
+
yield results.pop(next_result)
|
|
171
|
+
next_result += 1
|
|
172
|
+
else:
|
|
173
|
+
results[i] = value
|
|
174
|
+
|
|
175
|
+
def _fetch_results(self, raise_exceptions):
|
|
176
|
+
while not self.task_queue.empty() or not self.result_queue.empty():
|
|
177
|
+
task_result = self.result_queue.get()
|
|
178
|
+
if (raise_exceptions and isinstance(task_result[1], tuple) and
|
|
179
|
+
len(task_result[1]) == 3 and
|
|
180
|
+
isinstance(task_result[1][1], Exception)):
|
|
181
|
+
self.shutdown(force=True)
|
|
182
|
+
exc_class, exc, tb = task_result[1]
|
|
183
|
+
raise exc.with_traceback(tb)
|
|
184
|
+
yield task_result
|
|
185
|
+
|
|
186
|
+
def shutdown(self, force=False):
|
|
187
|
+
"""
|
|
188
|
+
Send shutdown sentinel to all executor threads. If `force` is True,
|
|
189
|
+
clean task_queue and result_queue.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
if force:
|
|
193
|
+
_consume_queue(self.task_queue)
|
|
194
|
+
_consume_queue(self.result_queue)
|
|
195
|
+
for _ in range(self.pool_size):
|
|
196
|
+
self.task_queue.put(None)
|
|
197
|
+
|
|
198
|
+
def _init_pool(self):
|
|
199
|
+
if self.pool_size < 2:
|
|
200
|
+
return []
|
|
201
|
+
pool = []
|
|
202
|
+
for _ in range(self.pool_size):
|
|
203
|
+
t = ThreadWorker(self.task_queue, self.result_queue)
|
|
204
|
+
t.daemon = True
|
|
205
|
+
t.start()
|
|
206
|
+
pool.append(t)
|
|
207
|
+
return pool
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def imap(func, *args):
|
|
211
|
+
pool = ThreadPool(min(len(args[0]), MAX_MAP_ASYNC_THREADS))
|
|
212
|
+
return pool.imap(func, *args)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def starmap(func, args):
|
|
216
|
+
pool = ThreadPool(min(len(args[0]), MAX_MAP_ASYNC_THREADS))
|
|
217
|
+
return pool.starmap(func, args)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def starcall(args):
|
|
221
|
+
pool = ThreadPool(min(len(args[0]), MAX_MAP_ASYNC_THREADS))
|
|
222
|
+
return pool.starcall(args)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def run_non_blocking(func, args, kw={}):
|
|
226
|
+
return func(*args, **kw)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
Pool = ThreadPool
|
|
@@ -0,0 +1,134 @@
|
|
|
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 absolute_import
|
|
17
|
+
from collections import deque
|
|
18
|
+
from itertools import islice
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LRU(object):
|
|
22
|
+
"""
|
|
23
|
+
Least Recently Used dictionary.
|
|
24
|
+
|
|
25
|
+
Stores `size` key-value pairs. Removes last used key-value
|
|
26
|
+
when dict is full.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
This LRU was developed for sizes <1000.
|
|
30
|
+
Set new: O(1)
|
|
31
|
+
Get/Set existing: O(1) newest to O(n) for oldest entry
|
|
32
|
+
Contains: O(1)
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, size=100):
|
|
36
|
+
self.size = size
|
|
37
|
+
self.values = {}
|
|
38
|
+
self.last_used = deque()
|
|
39
|
+
|
|
40
|
+
def get(self, key, default=None):
|
|
41
|
+
if key not in self.values:
|
|
42
|
+
return default
|
|
43
|
+
else:
|
|
44
|
+
return self[key]
|
|
45
|
+
|
|
46
|
+
def __repr__(self):
|
|
47
|
+
last_values = []
|
|
48
|
+
for k in islice(self.last_used, 10):
|
|
49
|
+
last_values.append((k, self.values[k]))
|
|
50
|
+
|
|
51
|
+
return '<LRU size=%d values=%s%s>' % (
|
|
52
|
+
self.size, repr(last_values)[:-1],
|
|
53
|
+
', ...]' if len(self) > 10 else ']')
|
|
54
|
+
|
|
55
|
+
def __getitem__(self, key):
|
|
56
|
+
result = self.values[key]
|
|
57
|
+
try:
|
|
58
|
+
self.last_used.remove(key)
|
|
59
|
+
except ValueError:
|
|
60
|
+
pass
|
|
61
|
+
self.last_used.appendleft(key)
|
|
62
|
+
return result
|
|
63
|
+
|
|
64
|
+
def __setitem__(self, key, value):
|
|
65
|
+
if key in self.values:
|
|
66
|
+
try:
|
|
67
|
+
self.last_used.remove(key)
|
|
68
|
+
except ValueError:
|
|
69
|
+
pass
|
|
70
|
+
self.last_used.appendleft(key)
|
|
71
|
+
self.values[key] = value
|
|
72
|
+
|
|
73
|
+
while len(self.values) > self.size:
|
|
74
|
+
del self.values[self.last_used.pop()]
|
|
75
|
+
|
|
76
|
+
def __len__(self):
|
|
77
|
+
return len(self.values)
|
|
78
|
+
|
|
79
|
+
def __delitem__(self, key):
|
|
80
|
+
if key in self.values:
|
|
81
|
+
try:
|
|
82
|
+
self.last_used.remove(key)
|
|
83
|
+
except ValueError:
|
|
84
|
+
pass
|
|
85
|
+
del self.values[key]
|
|
86
|
+
|
|
87
|
+
def __contains__(self, key):
|
|
88
|
+
return key in self.values
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class ImmutableDictList(object):
|
|
92
|
+
"""
|
|
93
|
+
A dictionary where each item can also be accessed by the
|
|
94
|
+
integer index of the initial position.
|
|
95
|
+
|
|
96
|
+
>>> d = ImmutableDictList([('foo', 23), ('bar', 24)])
|
|
97
|
+
>>> d['bar']
|
|
98
|
+
24
|
|
99
|
+
>>> d[0], d[1]
|
|
100
|
+
(23, 24)
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def __init__(self, items):
|
|
104
|
+
self._names = []
|
|
105
|
+
self._values = {}
|
|
106
|
+
for name, value in items:
|
|
107
|
+
self._values[name] = value
|
|
108
|
+
self._names.append(name)
|
|
109
|
+
|
|
110
|
+
def __getitem__(self, name):
|
|
111
|
+
if isinstance(name, str):
|
|
112
|
+
return self._values[name]
|
|
113
|
+
else:
|
|
114
|
+
return self._values[self._names[name]]
|
|
115
|
+
|
|
116
|
+
def __contains__(self, name):
|
|
117
|
+
try:
|
|
118
|
+
self[name]
|
|
119
|
+
return True
|
|
120
|
+
except KeyError:
|
|
121
|
+
return False
|
|
122
|
+
|
|
123
|
+
def __len__(self):
|
|
124
|
+
return len(self._values)
|
|
125
|
+
|
|
126
|
+
def __str__(self):
|
|
127
|
+
values = []
|
|
128
|
+
for name in self._names:
|
|
129
|
+
values.append('%s: %s' % (name, self._values[name]))
|
|
130
|
+
return '[%s]' % (', '.join(values),)
|
|
131
|
+
|
|
132
|
+
def iteritems(self):
|
|
133
|
+
for idx in self._names:
|
|
134
|
+
yield idx, self._values[idx]
|