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.
Files changed (459) hide show
  1. MapProxy-2.1.0.dist-info/AUTHORS.txt +33 -0
  2. MapProxy-2.1.0.dist-info/COPYING.txt +60 -0
  3. MapProxy-2.1.0.dist-info/LICENSE.txt +202 -0
  4. MapProxy-2.1.0.dist-info/METADATA +165 -0
  5. MapProxy-2.1.0.dist-info/RECORD +459 -0
  6. MapProxy-2.1.0.dist-info/WHEEL +5 -0
  7. MapProxy-2.1.0.dist-info/entry_points.txt +4 -0
  8. MapProxy-2.1.0.dist-info/top_level.txt +1 -0
  9. mapproxy/__init__.py +0 -0
  10. mapproxy/cache/__init__.py +36 -0
  11. mapproxy/cache/azureblob.py +145 -0
  12. mapproxy/cache/base.py +120 -0
  13. mapproxy/cache/compact.py +665 -0
  14. mapproxy/cache/couchdb.py +301 -0
  15. mapproxy/cache/dummy.py +36 -0
  16. mapproxy/cache/file.py +200 -0
  17. mapproxy/cache/geopackage.py +647 -0
  18. mapproxy/cache/legend.py +87 -0
  19. mapproxy/cache/mbtiles.py +411 -0
  20. mapproxy/cache/meta.py +80 -0
  21. mapproxy/cache/path.py +261 -0
  22. mapproxy/cache/redis.py +152 -0
  23. mapproxy/cache/renderd.py +100 -0
  24. mapproxy/cache/riak.py +206 -0
  25. mapproxy/cache/s3.py +209 -0
  26. mapproxy/cache/tile.py +736 -0
  27. mapproxy/client/__init__.py +0 -0
  28. mapproxy/client/arcgis.py +82 -0
  29. mapproxy/client/cgi.py +141 -0
  30. mapproxy/client/http.py +295 -0
  31. mapproxy/client/log.py +33 -0
  32. mapproxy/client/tile.py +158 -0
  33. mapproxy/client/wms.py +255 -0
  34. mapproxy/compat/__init__.py +0 -0
  35. mapproxy/compat/image.py +86 -0
  36. mapproxy/config/__init__.py +22 -0
  37. mapproxy/config/config-schema.json +813 -0
  38. mapproxy/config/config.py +213 -0
  39. mapproxy/config/coverage.py +108 -0
  40. mapproxy/config/defaults.py +102 -0
  41. mapproxy/config/loader.py +2399 -0
  42. mapproxy/config/spec.py +657 -0
  43. mapproxy/config/validator.py +242 -0
  44. mapproxy/config_template/__init__.py +0 -0
  45. mapproxy/config_template/base_config/config.wsgi +10 -0
  46. mapproxy/config_template/base_config/full_example.yaml +598 -0
  47. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  48. mapproxy/config_template/base_config/log.ini +35 -0
  49. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  50. mapproxy/config_template/base_config/seed.yaml +27 -0
  51. mapproxy/exception.py +149 -0
  52. mapproxy/featureinfo.py +251 -0
  53. mapproxy/grid.py +1199 -0
  54. mapproxy/image/__init__.py +549 -0
  55. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  56. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  57. mapproxy/image/fonts/LICENSE +99 -0
  58. mapproxy/image/fonts/__init__.py +0 -0
  59. mapproxy/image/mask.py +79 -0
  60. mapproxy/image/merge.py +323 -0
  61. mapproxy/image/message.py +357 -0
  62. mapproxy/image/opts.py +185 -0
  63. mapproxy/image/tile.py +171 -0
  64. mapproxy/image/transform.py +350 -0
  65. mapproxy/layer.py +489 -0
  66. mapproxy/multiapp.py +230 -0
  67. mapproxy/proj.py +309 -0
  68. mapproxy/request/__init__.py +18 -0
  69. mapproxy/request/arcgis.py +268 -0
  70. mapproxy/request/base.py +466 -0
  71. mapproxy/request/tile.py +131 -0
  72. mapproxy/request/wms/__init__.py +829 -0
  73. mapproxy/request/wms/exception.py +107 -0
  74. mapproxy/request/wmts.py +442 -0
  75. mapproxy/response.py +237 -0
  76. mapproxy/script/__init__.py +0 -0
  77. mapproxy/script/conf/__init__.py +0 -0
  78. mapproxy/script/conf/app.py +222 -0
  79. mapproxy/script/conf/caches.py +44 -0
  80. mapproxy/script/conf/geopackage.py +136 -0
  81. mapproxy/script/conf/layers.py +54 -0
  82. mapproxy/script/conf/seeds.py +36 -0
  83. mapproxy/script/conf/sources.py +88 -0
  84. mapproxy/script/conf/utils.py +148 -0
  85. mapproxy/script/defrag.py +187 -0
  86. mapproxy/script/export.py +337 -0
  87. mapproxy/script/grids.py +198 -0
  88. mapproxy/script/scales.py +134 -0
  89. mapproxy/script/util.py +410 -0
  90. mapproxy/script/wms_capabilities.py +160 -0
  91. mapproxy/seed/__init__.py +0 -0
  92. mapproxy/seed/cachelock.py +127 -0
  93. mapproxy/seed/cleanup.py +191 -0
  94. mapproxy/seed/config.py +481 -0
  95. mapproxy/seed/script.py +391 -0
  96. mapproxy/seed/seeder.py +551 -0
  97. mapproxy/seed/spec.py +66 -0
  98. mapproxy/seed/util.py +266 -0
  99. mapproxy/service/__init__.py +14 -0
  100. mapproxy/service/base.py +45 -0
  101. mapproxy/service/demo.py +364 -0
  102. mapproxy/service/kml.py +333 -0
  103. mapproxy/service/ows.py +39 -0
  104. mapproxy/service/template_helper.py +55 -0
  105. mapproxy/service/templates/demo/capabilities_demo.html +18 -0
  106. mapproxy/service/templates/demo/demo.html +181 -0
  107. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  108. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  109. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  110. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  111. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  112. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  113. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  114. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  115. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  116. mapproxy/service/templates/demo/static/logo.png +0 -0
  117. mapproxy/service/templates/demo/static/ol.css +345 -0
  118. mapproxy/service/templates/demo/static/ol.js +4 -0
  119. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  120. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  121. mapproxy/service/templates/demo/static/site.css +137 -0
  122. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  123. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  124. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  125. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  126. mapproxy/service/templates/demo/static.html +34 -0
  127. mapproxy/service/templates/demo/tms_demo.html +117 -0
  128. mapproxy/service/templates/demo/wms_demo.html +144 -0
  129. mapproxy/service/templates/demo/wmts_demo.html +118 -0
  130. mapproxy/service/templates/tms_capabilities.xml +13 -0
  131. mapproxy/service/templates/tms_exception.xml +4 -0
  132. mapproxy/service/templates/tms_root_resource.xml +7 -0
  133. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  134. mapproxy/service/templates/wms100capabilities.xml +112 -0
  135. mapproxy/service/templates/wms100exception.xml +4 -0
  136. mapproxy/service/templates/wms110capabilities.xml +152 -0
  137. mapproxy/service/templates/wms110exception.xml +5 -0
  138. mapproxy/service/templates/wms111capabilities.xml +183 -0
  139. mapproxy/service/templates/wms111exception.xml +5 -0
  140. mapproxy/service/templates/wms130capabilities.xml +326 -0
  141. mapproxy/service/templates/wms130exception.xml +8 -0
  142. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  143. mapproxy/service/templates/wmts100exception.xml +9 -0
  144. mapproxy/service/tile.py +540 -0
  145. mapproxy/service/wms.py +868 -0
  146. mapproxy/service/wmts.py +387 -0
  147. mapproxy/source/__init__.py +83 -0
  148. mapproxy/source/arcgis.py +39 -0
  149. mapproxy/source/error.py +40 -0
  150. mapproxy/source/mapnik.py +262 -0
  151. mapproxy/source/tile.py +97 -0
  152. mapproxy/source/wms.py +273 -0
  153. mapproxy/srs.py +734 -0
  154. mapproxy/template.py +54 -0
  155. mapproxy/test/__init__.py +0 -0
  156. mapproxy/test/conftest.py +8 -0
  157. mapproxy/test/helper.py +255 -0
  158. mapproxy/test/http.py +511 -0
  159. mapproxy/test/image.py +219 -0
  160. mapproxy/test/mocker.py +2291 -0
  161. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  178. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  179. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  180. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  181. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  182. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  183. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  184. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  185. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  186. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  187. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  188. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  189. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  190. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  191. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  192. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  198. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  199. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  200. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  201. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  202. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  203. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  204. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  205. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  206. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  207. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  208. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  209. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  210. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  211. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  212. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  215. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  216. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  217. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  218. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  219. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  220. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  221. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  222. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  223. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  224. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  225. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  226. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  227. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  228. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  229. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  230. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  231. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  232. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  233. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  234. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  235. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  236. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  237. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  238. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  239. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  240. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  241. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  242. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  243. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  244. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  245. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  246. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  247. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  248. mapproxy/test/schemas/xml.xsd +287 -0
  249. mapproxy/test/system/__init__.py +98 -0
  250. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  251. mapproxy/test/system/fixture/auth.yaml +70 -0
  252. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  253. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  254. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  255. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  256. mapproxy/test/system/fixture/cache_coverage.yaml +84 -0
  257. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  258. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  259. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  260. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  261. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  262. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  263. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  264. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  265. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  266. mapproxy/test/system/fixture/coverage.yaml +77 -0
  267. mapproxy/test/system/fixture/demo.yaml +135 -0
  268. mapproxy/test/system/fixture/dimension.yaml +59 -0
  269. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  270. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  271. mapproxy/test/system/fixture/formats.yaml +72 -0
  272. mapproxy/test/system/fixture/inspire.yaml +101 -0
  273. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  274. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  275. mapproxy/test/system/fixture/layer.yaml +260 -0
  276. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  277. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  278. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  279. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  280. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  281. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  282. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  283. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  284. mapproxy/test/system/fixture/multi_cache_layers.yaml +111 -0
  285. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  286. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  287. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  288. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  289. mapproxy/test/system/fixture/seed.yaml +94 -0
  290. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  291. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  292. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  293. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  294. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  295. mapproxy/test/system/fixture/sld.yaml +35 -0
  296. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  297. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  298. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  299. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  300. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  301. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  302. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  303. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  304. mapproxy/test/system/fixture/util_grids.yaml +29 -0
  305. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  306. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  307. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  308. mapproxy/test/system/fixture/watermark.yaml +50 -0
  309. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  310. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  311. mapproxy/test/system/fixture/wmts.yaml +134 -0
  312. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  313. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  314. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  315. mapproxy/test/system/test_arcgis.py +156 -0
  316. mapproxy/test/system/test_auth.py +1133 -0
  317. mapproxy/test/system/test_behind_proxy.py +75 -0
  318. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  319. mapproxy/test/system/test_cache_azureblob.py +127 -0
  320. mapproxy/test/system/test_cache_band_merge.py +103 -0
  321. mapproxy/test/system/test_cache_coverage.py +168 -0
  322. mapproxy/test/system/test_cache_geopackage.py +144 -0
  323. mapproxy/test/system/test_cache_grid_names.py +89 -0
  324. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  325. mapproxy/test/system/test_cache_s3.py +115 -0
  326. mapproxy/test/system/test_cache_source.py +146 -0
  327. mapproxy/test/system/test_combined_sources.py +335 -0
  328. mapproxy/test/system/test_coverage.py +140 -0
  329. mapproxy/test/system/test_decorate_img.py +214 -0
  330. mapproxy/test/system/test_demo.py +56 -0
  331. mapproxy/test/system/test_demo_with_extra_service.py +57 -0
  332. mapproxy/test/system/test_dimensions.py +279 -0
  333. mapproxy/test/system/test_disable_storage.py +42 -0
  334. mapproxy/test/system/test_formats.py +219 -0
  335. mapproxy/test/system/test_inspire_vs.py +173 -0
  336. mapproxy/test/system/test_kml.py +264 -0
  337. mapproxy/test/system/test_layergroups.py +160 -0
  338. mapproxy/test/system/test_legendgraphic.py +308 -0
  339. mapproxy/test/system/test_mapnik.py +162 -0
  340. mapproxy/test/system/test_mapserver.py +83 -0
  341. mapproxy/test/system/test_mixed_mode_format.py +201 -0
  342. mapproxy/test/system/test_multi_cache_layers.py +169 -0
  343. mapproxy/test/system/test_multiapp.py +92 -0
  344. mapproxy/test/system/test_refresh.py +206 -0
  345. mapproxy/test/system/test_renderd_client.py +304 -0
  346. mapproxy/test/system/test_response_headers.py +54 -0
  347. mapproxy/test/system/test_scalehints.py +140 -0
  348. mapproxy/test/system/test_seed.py +425 -0
  349. mapproxy/test/system/test_seed_only.py +93 -0
  350. mapproxy/test/system/test_sld.py +120 -0
  351. mapproxy/test/system/test_source_errors.py +377 -0
  352. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  353. mapproxy/test/system/test_tms.py +277 -0
  354. mapproxy/test/system/test_tms_origin.py +46 -0
  355. mapproxy/test/system/test_util_conf.py +434 -0
  356. mapproxy/test/system/test_util_export.py +210 -0
  357. mapproxy/test/system/test_util_grids.py +88 -0
  358. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  359. mapproxy/test/system/test_watermark.py +91 -0
  360. mapproxy/test/system/test_wms.py +1616 -0
  361. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  362. mapproxy/test/system/test_wms_version.py +85 -0
  363. mapproxy/test/system/test_wmsc.py +116 -0
  364. mapproxy/test/system/test_wmts.py +334 -0
  365. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  366. mapproxy/test/system/test_wmts_restful.py +198 -0
  367. mapproxy/test/system/test_xslt_featureinfo.py +423 -0
  368. mapproxy/test/test_http_helper.py +217 -0
  369. mapproxy/test/unit/__init__.py +0 -0
  370. mapproxy/test/unit/epsg +2 -0
  371. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  372. mapproxy/test/unit/polygons/polygons.shp +0 -0
  373. mapproxy/test/unit/polygons/polygons.shx +0 -0
  374. mapproxy/test/unit/test_async.py +242 -0
  375. mapproxy/test/unit/test_auth.py +430 -0
  376. mapproxy/test/unit/test_cache.py +1356 -0
  377. mapproxy/test/unit/test_cache_azureblob.py +97 -0
  378. mapproxy/test/unit/test_cache_compact.py +324 -0
  379. mapproxy/test/unit/test_cache_couchdb.py +118 -0
  380. mapproxy/test/unit/test_cache_geopackage.py +256 -0
  381. mapproxy/test/unit/test_cache_redis.py +123 -0
  382. mapproxy/test/unit/test_cache_riak.py +80 -0
  383. mapproxy/test/unit/test_cache_s3.py +93 -0
  384. mapproxy/test/unit/test_cache_tile.py +477 -0
  385. mapproxy/test/unit/test_client.py +488 -0
  386. mapproxy/test/unit/test_client_arcgis.py +74 -0
  387. mapproxy/test/unit/test_client_cgi.py +140 -0
  388. mapproxy/test/unit/test_collections.py +116 -0
  389. mapproxy/test/unit/test_concat_legends.py +37 -0
  390. mapproxy/test/unit/test_conf_loader.py +1267 -0
  391. mapproxy/test/unit/test_conf_validator.py +427 -0
  392. mapproxy/test/unit/test_config.py +118 -0
  393. mapproxy/test/unit/test_decorate_img.py +185 -0
  394. mapproxy/test/unit/test_exceptions.py +270 -0
  395. mapproxy/test/unit/test_featureinfo.py +313 -0
  396. mapproxy/test/unit/test_file_lock_load.py +49 -0
  397. mapproxy/test/unit/test_geom.py +512 -0
  398. mapproxy/test/unit/test_grid.py +1279 -0
  399. mapproxy/test/unit/test_image.py +1051 -0
  400. mapproxy/test/unit/test_image_mask.py +181 -0
  401. mapproxy/test/unit/test_image_messages.py +209 -0
  402. mapproxy/test/unit/test_image_options.py +160 -0
  403. mapproxy/test/unit/test_isodate.py +118 -0
  404. mapproxy/test/unit/test_multiapp.py +163 -0
  405. mapproxy/test/unit/test_ogr_reader.py +51 -0
  406. mapproxy/test/unit/test_request.py +745 -0
  407. mapproxy/test/unit/test_request_wmts.py +178 -0
  408. mapproxy/test/unit/test_response.py +78 -0
  409. mapproxy/test/unit/test_seed.py +365 -0
  410. mapproxy/test/unit/test_seed_cachelock.py +91 -0
  411. mapproxy/test/unit/test_srs.py +215 -0
  412. mapproxy/test/unit/test_tiled_source.py +122 -0
  413. mapproxy/test/unit/test_tilefilter.py +31 -0
  414. mapproxy/test/unit/test_times.py +25 -0
  415. mapproxy/test/unit/test_timeutils.py +50 -0
  416. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  417. mapproxy/test/unit/test_utils.py +476 -0
  418. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  419. mapproxy/test/unit/test_wms_layer.py +113 -0
  420. mapproxy/test/unit/test_yaml.py +68 -0
  421. mapproxy/tilefilter.py +61 -0
  422. mapproxy/util/__init__.py +0 -0
  423. mapproxy/util/async_.py +229 -0
  424. mapproxy/util/collections.py +134 -0
  425. mapproxy/util/coverage.py +337 -0
  426. mapproxy/util/ext/__init__.py +14 -0
  427. mapproxy/util/ext/dictspec/__init__.py +1 -0
  428. mapproxy/util/ext/dictspec/spec.py +131 -0
  429. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  430. mapproxy/util/ext/dictspec/test/test_validator.py +278 -0
  431. mapproxy/util/ext/dictspec/validator.py +194 -0
  432. mapproxy/util/ext/local.py +198 -0
  433. mapproxy/util/ext/lockfile.py +140 -0
  434. mapproxy/util/ext/odict.py +321 -0
  435. mapproxy/util/ext/serving.py +491 -0
  436. mapproxy/util/ext/tempita/__init__.py +1093 -0
  437. mapproxy/util/ext/tempita/_looper.py +163 -0
  438. mapproxy/util/ext/tempita/string_utils.py +24 -0
  439. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  440. mapproxy/util/ext/wmsparse/duration.py +600 -0
  441. mapproxy/util/ext/wmsparse/parse.py +307 -0
  442. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  443. mapproxy/util/ext/wmsparse/test/test_parse.py +111 -0
  444. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  445. mapproxy/util/ext/wmsparse/test/wms-example-111.xml +90 -0
  446. mapproxy/util/ext/wmsparse/test/wms-example-130.xml +120 -0
  447. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  448. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  449. mapproxy/util/ext/wmsparse/util.py +189 -0
  450. mapproxy/util/fs.py +164 -0
  451. mapproxy/util/geom.py +307 -0
  452. mapproxy/util/lib.py +117 -0
  453. mapproxy/util/lock.py +171 -0
  454. mapproxy/util/ogr.py +247 -0
  455. mapproxy/util/py.py +75 -0
  456. mapproxy/util/times.py +78 -0
  457. mapproxy/util/yaml.py +58 -0
  458. mapproxy/version.py +33 -0
  459. mapproxy/wsgiapp.py +167 -0
@@ -0,0 +1,430 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2018 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.exception import RequestError
19
+ from mapproxy.grid import tile_grid
20
+ from mapproxy.image import BlankImageSource
21
+ from mapproxy.image.opts import ImageOptions
22
+ from mapproxy.layer import MapLayer, DefaultMapExtent
23
+ from mapproxy.request.base import Request
24
+ from mapproxy.request.tile import tile_request
25
+ from mapproxy.request.wms import wms_request
26
+ from mapproxy.service.kml import KMLServer, kml_request
27
+ from mapproxy.service.tile import TileServer
28
+ from mapproxy.service.wms import WMSLayer, WMSGroupLayer, WMSServer
29
+ from mapproxy.test.http import make_wsgi_env
30
+
31
+
32
+ class DummyLayer(MapLayer):
33
+ transparent = True
34
+ extent = DefaultMapExtent()
35
+ has_legend = False
36
+ queryable = False
37
+
38
+ def __init__(self, name):
39
+ MapLayer.__init__(self)
40
+ self.name = name
41
+ self.requested = False
42
+ self.queried = False
43
+
44
+ def get_map(self, query):
45
+ self.requested = True
46
+
47
+ def get_info(self, query):
48
+ self.queried = True
49
+
50
+ def map_layers_for_query(self, query):
51
+ return [(self.name, self)]
52
+
53
+ def info_layers_for_query(self, query):
54
+ return [(self.name, self)]
55
+
56
+
57
+ MAP_REQ = "FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG%3A4326&BBOX=5,46,8,48&WIDTH=60&HEIGHT=40" # noqa
58
+ FI_REQ = "FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&STYLES=&SRS=EPSG%3A4326&BBOX=5,46,8,48&WIDTH=60&HEIGHT=40&X=30&Y=20" # noqa
59
+
60
+
61
+ class TestWMSAuth(object):
62
+ def setup_method(self):
63
+ layers = {}
64
+ wms_layers = {}
65
+
66
+ # create test layer tree
67
+ # - unnamed root
68
+ # - layer1
69
+ # - layer1a
70
+ # - layer1b
71
+ # - layer2
72
+ # - layer2a
73
+ # - layer2b
74
+ # - layer2b1
75
+
76
+ layers['layer1a'] = DummyLayer('layer1a')
77
+ wms_layers['layer1a'] = WMSLayer('layer1a', None, [layers['layer1a']],
78
+ info_layers=[layers['layer1a']])
79
+ layers['layer1b'] = DummyLayer('layer1b')
80
+ wms_layers['layer1b'] = WMSLayer('layer1b', None, [layers['layer1b']],
81
+ info_layers=[layers['layer1b']])
82
+ wms_layers['layer1'] = WMSGroupLayer('layer1', None, None,
83
+ [wms_layers['layer1a'], wms_layers['layer1b']])
84
+
85
+ layers['layer2a'] = DummyLayer('layer2a')
86
+ wms_layers['layer2a'] = WMSLayer('layer2a', None, [layers['layer2a']],
87
+ info_layers=[layers['layer2a']])
88
+ layers['layer2b1'] = DummyLayer('layer2b1')
89
+ wms_layers['layer2b1'] = WMSLayer('layer2b1', None, [layers['layer2b1']],
90
+ info_layers=[layers['layer2b1']])
91
+ layers['layer2b'] = DummyLayer('layer2b')
92
+ wms_layers['layer2b'] = WMSGroupLayer('layer2b', None, layers['layer2b'],
93
+ [wms_layers['layer2b1']])
94
+ wms_layers['layer2'] = WMSGroupLayer('layer2', None, None,
95
+ [wms_layers['layer2a'], wms_layers['layer2b']])
96
+
97
+ root_layer = WMSGroupLayer(None, 'root layer', None, [wms_layers['layer1'],
98
+ wms_layers['layer2']])
99
+ self.wms_layers = wms_layers
100
+ self.layers = layers
101
+ self.server = WMSServer(md={}, root_layer=root_layer, srs=['EPSG:4326'],
102
+ image_formats={'image/png': ImageOptions(format='image/png')})
103
+
104
+
105
+ # ###
106
+ # see mapproxy.test.system.test_auth for WMS GetCapabilities request tests
107
+ # ###
108
+
109
+ class TestWMSGetMapAuth(TestWMSAuth):
110
+ def map_request(self, layers, auth):
111
+ env = make_wsgi_env(MAP_REQ+'&layers=' + layers, extra_environ={'mapproxy.authorize': auth})
112
+ req = Request(env)
113
+ return wms_request(req)
114
+
115
+ def test_allow_all(self):
116
+ def auth(service, layers, **kw):
117
+ assert layers == 'layer1a layer1b'.split()
118
+ return {'authorized': 'full'}
119
+ self.server.map(self.map_request('layer1', auth))
120
+ assert self.layers['layer1a'].requested
121
+ assert self.layers['layer1b'].requested
122
+
123
+ def test_root_with_partial_sublayers(self):
124
+ # filter out sublayer layer1b
125
+ def auth(service, layers, **kw):
126
+ assert layers == 'layer1a layer1b'.split()
127
+ return {
128
+ 'authorized': 'partial',
129
+ 'layers': {
130
+ 'layer1': {'map': True},
131
+ 'layer1a': {'map': True},
132
+ 'layer1b': {'map': False},
133
+ }
134
+ }
135
+ self.server.map(self.map_request('layer1', auth))
136
+ assert self.layers['layer1a'].requested
137
+ assert not self.layers['layer1b'].requested
138
+
139
+ def test_accept_sublayer(self):
140
+ def auth(service, layers, **kw):
141
+ assert layers == 'layer1a'.split()
142
+ return {
143
+ 'authorized': 'partial',
144
+ 'layers': {
145
+ 'layer1': {'map': True},
146
+ 'layer1a': {'map': True},
147
+ 'layer1b': {'map': False},
148
+ }
149
+ }
150
+ self.server.map(self.map_request('layer1a', auth))
151
+ assert self.layers['layer1a'].requested
152
+ assert not self.layers['layer1b'].requested
153
+
154
+ def test_accept_sublayer_w_root_denied(self):
155
+ def auth(service, layers, **kw):
156
+ assert layers == 'layer1a'.split()
157
+ return {
158
+ 'authorized': 'partial',
159
+ 'layers': {
160
+ 'layer1': {'map': False},
161
+ 'layer1a': {'map': True},
162
+ 'layer1b': {'map': False},
163
+ }
164
+ }
165
+ self.server.map(self.map_request('layer1a', auth))
166
+ assert self.layers['layer1a'].requested
167
+ assert not self.layers['layer1b'].requested
168
+
169
+ def test_deny_sublayer(self):
170
+ def auth(service, layers, **kw):
171
+ assert layers == 'layer1b'.split()
172
+ return {
173
+ 'authorized': 'partial',
174
+ 'layers': {
175
+ 'layer1': {'map': True},
176
+ 'layer1a': {'map': True},
177
+ 'layer1b': {'map': False},
178
+ }
179
+ }
180
+
181
+ with pytest.raises(RequestError):
182
+ self.server.map(self.map_request('layer1b', auth))
183
+
184
+ def test_deny_group_layer_w_source(self):
185
+ def auth(service, layers, **kw):
186
+ assert layers == 'layer2b'.split()
187
+ return {
188
+ 'authorized': 'partial',
189
+ 'layers': {
190
+ 'layer2b': {'map': False},
191
+ }
192
+ }
193
+ with pytest.raises(RequestError):
194
+ self.server.map(self.map_request('layer2b', auth))
195
+
196
+ def test_nested_layers_with_partial_sublayers(self):
197
+ def auth(service, layers, **kw):
198
+ assert layers == 'layer1a layer1b layer2a layer2b'.split()
199
+ return {
200
+ 'authorized': 'partial',
201
+ 'layers': {
202
+ 'layer1a': {'map': False},
203
+ # deny is the default
204
+ # 'layer1b': {'map': False},
205
+ 'layer2a': {'map': True},
206
+ 'layer2b': {'map': False},
207
+ }
208
+ }
209
+ self.server.map(self.map_request('layer1,layer2', auth))
210
+ assert self.layers['layer2a'].requested
211
+ assert not self.layers['layer2b'].requested
212
+ assert not self.layers['layer1a'].requested
213
+ assert not self.layers['layer1b'].requested
214
+
215
+ def test_unauthenticated(self):
216
+ def auth(service, layers, **kw):
217
+ assert layers == 'layer1b'.split()
218
+ return {
219
+ 'authorized': 'unauthenticated',
220
+ }
221
+ try:
222
+ self.server.map(self.map_request('layer1b', auth))
223
+ except RequestError as ex:
224
+ assert ex.status == 401, '%s != 401' % (ex.status, )
225
+ else:
226
+ assert False, 'expected RequestError'
227
+
228
+
229
+ class TestWMSGetFeatureInfoAuth(TestWMSAuth):
230
+ def fi_request(self, layers, auth):
231
+ env = make_wsgi_env(FI_REQ+'&layers=%s&query_layers=%s' % (layers, layers),
232
+ extra_environ={'mapproxy.authorize': auth})
233
+ req = Request(env)
234
+ return wms_request(req)
235
+
236
+ def test_root_with_partial_sublayers(self):
237
+ # filter out sublayer layer1b
238
+ def auth(service, layers, **kw):
239
+ assert layers == 'layer1a layer1b'.split()
240
+ return {
241
+ 'authorized': 'partial',
242
+ 'layers': {
243
+ 'layer1': {'featureinfo': True},
244
+ 'layer1a': {'featureinfo': True},
245
+ 'layer1b': {'featureinfo': False},
246
+ }
247
+ }
248
+ self.server.featureinfo(self.fi_request('layer1', auth))
249
+ assert self.layers['layer1a'].queried
250
+ assert not self.layers['layer1b'].queried
251
+
252
+ def test_accept_sublayer(self):
253
+ def auth(service, layers, **kw):
254
+ assert layers == 'layer1a'.split()
255
+ return {
256
+ 'authorized': 'partial',
257
+ 'layers': {
258
+ 'layer1': {'featureinfo': True},
259
+ 'layer1a': {'featureinfo': True},
260
+ 'layer1b': {'featureinfo': False},
261
+ }
262
+ }
263
+ self.server.featureinfo(self.fi_request('layer1a', auth))
264
+ assert self.layers['layer1a'].queried
265
+ assert not self.layers['layer1b'].queried
266
+
267
+ def test_accept_sublayer_w_root_denied(self):
268
+ def auth(service, layers, **kw):
269
+ assert layers == 'layer1a'.split()
270
+ return {
271
+ 'authorized': 'partial',
272
+ 'layers': {
273
+ 'layer1': {'featureinfo': False},
274
+ 'layer1a': {'featureinfo': True},
275
+ 'layer1b': {'featureinfo': False},
276
+ }
277
+ }
278
+ self.server.featureinfo(self.fi_request('layer1a', auth))
279
+ assert self.layers['layer1a'].queried
280
+ assert not self.layers['layer1b'].queried
281
+
282
+ def test_deny_sublayer(self):
283
+ def auth(service, layers, **kw):
284
+ assert layers == 'layer1b'.split()
285
+ return {
286
+ 'authorized': 'partial',
287
+ 'layers': {
288
+ 'layer1': {'featureinfo': True},
289
+ 'layer1a': {'featureinfo': True},
290
+ 'layer1b': {'featureinfo': False},
291
+ }
292
+ }
293
+ with pytest.raises(RequestError):
294
+ self.server.featureinfo(self.fi_request('layer1b', auth))
295
+
296
+ def test_deny_group_layer_w_source(self):
297
+ def auth(service, layers, **kw):
298
+ assert layers == 'layer2b'.split()
299
+ return {
300
+ 'authorized': 'partial',
301
+ 'layers': {
302
+ 'layer2b': {'featureinfo': False},
303
+ }
304
+ }
305
+ with pytest.raises(RequestError):
306
+ self.server.featureinfo(self.fi_request('layer2b', auth))
307
+
308
+ def test_nested_layers_with_partial_sublayers(self):
309
+ def auth(service, layers, **kw):
310
+ assert layers == 'layer1a layer1b layer2a layer2b'.split()
311
+ return {
312
+ 'authorized': 'partial',
313
+ 'layers': {
314
+ 'layer1a': {'featureinfo': False},
315
+ # deny is the default
316
+ # 'layer1b': {'featureinfo': False},
317
+ 'layer2a': {'featureinfo': True},
318
+ 'layer2b': {'featureinfo': False},
319
+ }
320
+ }
321
+ self.server.featureinfo(self.fi_request('layer1,layer2', auth))
322
+ assert self.layers['layer2a'].queried
323
+ assert not self.layers['layer2b'].queried
324
+ assert not self.layers['layer1a'].queried
325
+ assert not self.layers['layer1b'].queried
326
+
327
+
328
+ class DummyTileLayer(object):
329
+ def __init__(self, name):
330
+ self.requested = False
331
+ self.name = name
332
+ self.grid = tile_grid(900913)
333
+
334
+ def tile_bbox(self, request, use_profiles=False):
335
+ # this dummy code does not handle profiles and different tile origins!
336
+ return self.grid.tile_bbox(request.tile)
337
+
338
+ def render(self, tile_request, use_profiles=None, coverage=None, decorate_img=None):
339
+ self.requested = True
340
+ resp = BlankImageSource((256, 256), image_opts=ImageOptions(format='image/png'))
341
+ resp.timestamp = 0
342
+ return resp
343
+
344
+
345
+ class TestTMSAuth(object):
346
+ service = 'tms'
347
+
348
+ def setup_method(self):
349
+ self.layers = {}
350
+
351
+ self.layers['layer1'] = DummyTileLayer('layer1')
352
+ self.layers['layer2'] = DummyTileLayer('layer2')
353
+ self.layers['layer3'] = DummyTileLayer('layer3')
354
+ self.server = TileServer(self.layers, {})
355
+
356
+ def tile_request(self, tile, auth):
357
+ env = make_wsgi_env('', extra_environ={'mapproxy.authorize': auth,
358
+ 'PATH_INFO': '/tms/1.0.0/'+tile})
359
+ req = Request(env)
360
+ return tile_request(req)
361
+
362
+ def test_deny_all(self):
363
+ def auth(service, layers, **kw):
364
+ assert service == self.service
365
+ assert layers == 'layer1'.split()
366
+ return {
367
+ 'authorized': 'none',
368
+ }
369
+ with pytest.raises(RequestError):
370
+ self.server.map(self.tile_request('layer1/0/0/0.png', auth))
371
+
372
+ def test_deny_layer(self):
373
+ def auth(service, layers, **kw):
374
+ assert service == self.service
375
+ assert layers == 'layer1'.split()
376
+ return {
377
+ 'authorized': 'partial',
378
+ 'layers': {
379
+ 'layer1': {'tile': False},
380
+ 'layer2': {'tile': True},
381
+ }
382
+ }
383
+ with pytest.raises(RequestError):
384
+ self.server.map(self.tile_request('layer1/0/0/0.png', auth))
385
+
386
+ def test_allow_all(self):
387
+ def auth(service, layers, **kw):
388
+ assert service == self.service
389
+ assert layers == 'layer1'.split()
390
+ return {
391
+ 'authorized': 'full',
392
+ }
393
+ self.server.map(self.tile_request('layer1/0/0/0.png', auth))
394
+ assert self.layers['layer1'].requested
395
+
396
+ def test_allow_layer(self):
397
+ def auth(service, layers, **kw):
398
+ assert service == self.service
399
+ assert layers == 'layer1'.split()
400
+ return {
401
+ 'authorized': 'partial',
402
+ 'layers': {
403
+ 'layer1': {'tile': True},
404
+ 'layer2': {'tile': False},
405
+ }
406
+ }
407
+ self.server.map(self.tile_request('layer1/0/0/0.png', auth))
408
+ assert self.layers['layer1'].requested
409
+
410
+
411
+ class TestTileAuth(TestTMSAuth):
412
+ def tile_request(self, tile, auth):
413
+ env = make_wsgi_env('', extra_environ={'mapproxy.authorize': auth,
414
+ 'PATH_INFO': '/tiles/'+tile})
415
+ req = Request(env)
416
+ return tile_request(req)
417
+
418
+
419
+ class TestKMLAuth(TestTMSAuth):
420
+ service = 'kml'
421
+
422
+ def setup_method(self):
423
+ TestTMSAuth.setup_method(self)
424
+ self.server = KMLServer(self.layers, {})
425
+
426
+ def tile_request(self, tile, auth):
427
+ env = make_wsgi_env('', extra_environ={'mapproxy.authorize': auth,
428
+ 'PATH_INFO': '/kml/'+tile})
429
+ req = Request(env)
430
+ return kml_request(req)