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