MapProxy 1.16.1__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 (458) hide show
  1. mapproxy/__init__.py +0 -0
  2. mapproxy/cache/__init__.py +36 -0
  3. mapproxy/cache/azureblob.py +145 -0
  4. mapproxy/cache/base.py +111 -0
  5. mapproxy/cache/compact.py +664 -0
  6. mapproxy/cache/couchdb.py +295 -0
  7. mapproxy/cache/dummy.py +34 -0
  8. mapproxy/cache/file.py +185 -0
  9. mapproxy/cache/geopackage.py +609 -0
  10. mapproxy/cache/legend.py +83 -0
  11. mapproxy/cache/mbtiles.py +392 -0
  12. mapproxy/cache/meta.py +78 -0
  13. mapproxy/cache/path.py +250 -0
  14. mapproxy/cache/redis.py +88 -0
  15. mapproxy/cache/renderd.py +95 -0
  16. mapproxy/cache/riak.py +202 -0
  17. mapproxy/cache/s3.py +177 -0
  18. mapproxy/cache/tile.py +699 -0
  19. mapproxy/client/__init__.py +0 -0
  20. mapproxy/client/arcgis.py +79 -0
  21. mapproxy/client/cgi.py +139 -0
  22. mapproxy/client/http.py +315 -0
  23. mapproxy/client/log.py +33 -0
  24. mapproxy/client/tile.py +150 -0
  25. mapproxy/client/wms.py +254 -0
  26. mapproxy/compat/__init__.py +46 -0
  27. mapproxy/compat/image.py +79 -0
  28. mapproxy/compat/itertools.py +29 -0
  29. mapproxy/compat/modules.py +13 -0
  30. mapproxy/config/__init__.py +22 -0
  31. mapproxy/config/config.py +201 -0
  32. mapproxy/config/coverage.py +107 -0
  33. mapproxy/config/defaults.py +98 -0
  34. mapproxy/config/loader.py +2286 -0
  35. mapproxy/config/spec.py +644 -0
  36. mapproxy/config/validator.py +239 -0
  37. mapproxy/config_template/__init__.py +0 -0
  38. mapproxy/config_template/base_config/config.wsgi +10 -0
  39. mapproxy/config_template/base_config/full_example.yaml +593 -0
  40. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  41. mapproxy/config_template/base_config/log.ini +35 -0
  42. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  43. mapproxy/config_template/base_config/seed.yaml +27 -0
  44. mapproxy/exception.py +142 -0
  45. mapproxy/featureinfo.py +252 -0
  46. mapproxy/grid.py +1170 -0
  47. mapproxy/image/__init__.py +536 -0
  48. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  49. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  50. mapproxy/image/fonts/LICENSE +99 -0
  51. mapproxy/image/fonts/__init__.py +0 -0
  52. mapproxy/image/mask.py +75 -0
  53. mapproxy/image/merge.py +316 -0
  54. mapproxy/image/message.py +347 -0
  55. mapproxy/image/opts.py +182 -0
  56. mapproxy/image/tile.py +167 -0
  57. mapproxy/image/transform.py +350 -0
  58. mapproxy/layer.py +470 -0
  59. mapproxy/multiapp.py +231 -0
  60. mapproxy/proj.py +302 -0
  61. mapproxy/request/__init__.py +18 -0
  62. mapproxy/request/arcgis.py +259 -0
  63. mapproxy/request/base.py +476 -0
  64. mapproxy/request/tile.py +128 -0
  65. mapproxy/request/wms/__init__.py +793 -0
  66. mapproxy/request/wms/exception.py +99 -0
  67. mapproxy/request/wmts.py +436 -0
  68. mapproxy/response.py +237 -0
  69. mapproxy/script/__init__.py +0 -0
  70. mapproxy/script/conf/__init__.py +0 -0
  71. mapproxy/script/conf/app.py +195 -0
  72. mapproxy/script/conf/caches.py +45 -0
  73. mapproxy/script/conf/layers.py +54 -0
  74. mapproxy/script/conf/seeds.py +37 -0
  75. mapproxy/script/conf/sources.py +86 -0
  76. mapproxy/script/conf/utils.py +143 -0
  77. mapproxy/script/defrag.py +184 -0
  78. mapproxy/script/export.py +333 -0
  79. mapproxy/script/grids.py +188 -0
  80. mapproxy/script/scales.py +126 -0
  81. mapproxy/script/util.py +406 -0
  82. mapproxy/script/wms_capabilities.py +152 -0
  83. mapproxy/seed/__init__.py +0 -0
  84. mapproxy/seed/cachelock.py +121 -0
  85. mapproxy/seed/cleanup.py +187 -0
  86. mapproxy/seed/config.py +469 -0
  87. mapproxy/seed/script.py +388 -0
  88. mapproxy/seed/seeder.py +538 -0
  89. mapproxy/seed/spec.py +64 -0
  90. mapproxy/seed/util.py +254 -0
  91. mapproxy/service/__init__.py +14 -0
  92. mapproxy/service/base.py +46 -0
  93. mapproxy/service/demo.py +356 -0
  94. mapproxy/service/kml.py +331 -0
  95. mapproxy/service/ows.py +38 -0
  96. mapproxy/service/template_helper.py +53 -0
  97. mapproxy/service/templates/demo/capabilities_demo.html +16 -0
  98. mapproxy/service/templates/demo/demo.html +181 -0
  99. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  100. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  101. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  102. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  103. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  104. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  105. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  106. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  107. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  108. mapproxy/service/templates/demo/static/logo.png +0 -0
  109. mapproxy/service/templates/demo/static/ol.css +345 -0
  110. mapproxy/service/templates/demo/static/ol.js +4 -0
  111. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  112. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  113. mapproxy/service/templates/demo/static/site.css +137 -0
  114. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  115. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  116. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  117. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  118. mapproxy/service/templates/demo/static.html +34 -0
  119. mapproxy/service/templates/demo/tms_demo.html +103 -0
  120. mapproxy/service/templates/demo/wms_demo.html +140 -0
  121. mapproxy/service/templates/demo/wmts_demo.html +110 -0
  122. mapproxy/service/templates/tms_capabilities.xml +13 -0
  123. mapproxy/service/templates/tms_exception.xml +4 -0
  124. mapproxy/service/templates/tms_root_resource.xml +7 -0
  125. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  126. mapproxy/service/templates/wms100capabilities.xml +112 -0
  127. mapproxy/service/templates/wms100exception.xml +4 -0
  128. mapproxy/service/templates/wms110capabilities.xml +152 -0
  129. mapproxy/service/templates/wms110exception.xml +5 -0
  130. mapproxy/service/templates/wms111capabilities.xml +183 -0
  131. mapproxy/service/templates/wms111exception.xml +5 -0
  132. mapproxy/service/templates/wms130capabilities.xml +326 -0
  133. mapproxy/service/templates/wms130exception.xml +8 -0
  134. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  135. mapproxy/service/templates/wmts100exception.xml +9 -0
  136. mapproxy/service/tile.py +536 -0
  137. mapproxy/service/wms.py +851 -0
  138. mapproxy/service/wmts.py +381 -0
  139. mapproxy/source/__init__.py +75 -0
  140. mapproxy/source/arcgis.py +39 -0
  141. mapproxy/source/error.py +39 -0
  142. mapproxy/source/mapnik.py +259 -0
  143. mapproxy/source/tile.py +96 -0
  144. mapproxy/source/wms.py +270 -0
  145. mapproxy/srs.py +726 -0
  146. mapproxy/template.py +54 -0
  147. mapproxy/test/__init__.py +0 -0
  148. mapproxy/test/conftest.py +7 -0
  149. mapproxy/test/helper.py +247 -0
  150. mapproxy/test/http.py +494 -0
  151. mapproxy/test/image.py +210 -0
  152. mapproxy/test/mocker.py +2268 -0
  153. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  154. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  155. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  156. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  157. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  158. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  159. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  160. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  161. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  178. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  179. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  180. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  181. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  182. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  183. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  184. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  185. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  186. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  187. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  188. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  189. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  190. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  191. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  192. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  198. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  199. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  200. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  201. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  202. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  203. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  204. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  205. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  206. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  207. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  208. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  209. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  210. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  211. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  212. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  215. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  216. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  217. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  218. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  219. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  220. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  221. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  222. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  223. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  224. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  225. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  226. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  227. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  228. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  229. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  230. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  231. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  232. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  233. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  234. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  235. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  236. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  237. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  238. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  239. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  240. mapproxy/test/schemas/xml.xsd +287 -0
  241. mapproxy/test/system/__init__.py +98 -0
  242. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  243. mapproxy/test/system/fixture/auth.yaml +70 -0
  244. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  245. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  246. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  247. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  248. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  249. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  250. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  251. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  252. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  253. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  254. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  255. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  256. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  257. mapproxy/test/system/fixture/coverage.yaml +77 -0
  258. mapproxy/test/system/fixture/demo.yaml +135 -0
  259. mapproxy/test/system/fixture/dimension.yaml +59 -0
  260. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  261. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  262. mapproxy/test/system/fixture/formats.yaml +72 -0
  263. mapproxy/test/system/fixture/inspire.yaml +101 -0
  264. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  265. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  266. mapproxy/test/system/fixture/layer.yaml +260 -0
  267. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  268. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  269. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  270. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  271. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  272. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  273. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  274. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  275. mapproxy/test/system/fixture/multi_cache_layers.yaml +100 -0
  276. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  277. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  278. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  279. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  280. mapproxy/test/system/fixture/seed.yaml +94 -0
  281. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  282. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  283. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  284. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  285. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  286. mapproxy/test/system/fixture/sld.yaml +35 -0
  287. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  288. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  289. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  290. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  291. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  292. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  293. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  294. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  295. mapproxy/test/system/fixture/util_grids.yaml +30 -0
  296. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  297. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  298. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  299. mapproxy/test/system/fixture/watermark.yaml +50 -0
  300. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  301. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  302. mapproxy/test/system/fixture/wmts.yaml +134 -0
  303. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  304. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  305. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  306. mapproxy/test/system/test_arcgis.py +156 -0
  307. mapproxy/test/system/test_auth.py +1134 -0
  308. mapproxy/test/system/test_behind_proxy.py +75 -0
  309. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  310. mapproxy/test/system/test_cache_azureblob.py +127 -0
  311. mapproxy/test/system/test_cache_band_merge.py +103 -0
  312. mapproxy/test/system/test_cache_geopackage.py +144 -0
  313. mapproxy/test/system/test_cache_grid_names.py +89 -0
  314. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  315. mapproxy/test/system/test_cache_s3.py +115 -0
  316. mapproxy/test/system/test_cache_source.py +146 -0
  317. mapproxy/test/system/test_combined_sources.py +335 -0
  318. mapproxy/test/system/test_coverage.py +140 -0
  319. mapproxy/test/system/test_decorate_img.py +214 -0
  320. mapproxy/test/system/test_demo.py +106 -0
  321. mapproxy/test/system/test_demo_with_extra_service.py +53 -0
  322. mapproxy/test/system/test_dimensions.py +278 -0
  323. mapproxy/test/system/test_disable_storage.py +42 -0
  324. mapproxy/test/system/test_formats.py +219 -0
  325. mapproxy/test/system/test_inspire_vs.py +173 -0
  326. mapproxy/test/system/test_kml.py +262 -0
  327. mapproxy/test/system/test_layergroups.py +160 -0
  328. mapproxy/test/system/test_legendgraphic.py +308 -0
  329. mapproxy/test/system/test_mapnik.py +161 -0
  330. mapproxy/test/system/test_mapserver.py +81 -0
  331. mapproxy/test/system/test_mixed_mode_format.py +195 -0
  332. mapproxy/test/system/test_multi_cache_layers.py +167 -0
  333. mapproxy/test/system/test_multiapp.py +92 -0
  334. mapproxy/test/system/test_refresh.py +207 -0
  335. mapproxy/test/system/test_renderd_client.py +304 -0
  336. mapproxy/test/system/test_response_headers.py +54 -0
  337. mapproxy/test/system/test_scalehints.py +140 -0
  338. mapproxy/test/system/test_seed.py +422 -0
  339. mapproxy/test/system/test_seed_only.py +93 -0
  340. mapproxy/test/system/test_sld.py +120 -0
  341. mapproxy/test/system/test_source_errors.py +377 -0
  342. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  343. mapproxy/test/system/test_tms.py +276 -0
  344. mapproxy/test/system/test_tms_origin.py +46 -0
  345. mapproxy/test/system/test_util_conf.py +304 -0
  346. mapproxy/test/system/test_util_export.py +210 -0
  347. mapproxy/test/system/test_util_grids.py +88 -0
  348. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  349. mapproxy/test/system/test_watermark.py +91 -0
  350. mapproxy/test/system/test_wms.py +1611 -0
  351. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  352. mapproxy/test/system/test_wms_version.py +85 -0
  353. mapproxy/test/system/test_wmsc.py +116 -0
  354. mapproxy/test/system/test_wmts.py +334 -0
  355. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  356. mapproxy/test/system/test_wmts_restful.py +198 -0
  357. mapproxy/test/system/test_xslt_featureinfo.py +425 -0
  358. mapproxy/test/test_http_helper.py +219 -0
  359. mapproxy/test/unit/__init__.py +0 -0
  360. mapproxy/test/unit/epsg +2 -0
  361. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  362. mapproxy/test/unit/polygons/polygons.shp +0 -0
  363. mapproxy/test/unit/polygons/polygons.shx +0 -0
  364. mapproxy/test/unit/test_async.py +245 -0
  365. mapproxy/test/unit/test_auth.py +419 -0
  366. mapproxy/test/unit/test_cache.py +1193 -0
  367. mapproxy/test/unit/test_cache_azureblob.py +94 -0
  368. mapproxy/test/unit/test_cache_compact.py +319 -0
  369. mapproxy/test/unit/test_cache_couchdb.py +114 -0
  370. mapproxy/test/unit/test_cache_geopackage.py +221 -0
  371. mapproxy/test/unit/test_cache_redis.py +67 -0
  372. mapproxy/test/unit/test_cache_riak.py +76 -0
  373. mapproxy/test/unit/test_cache_s3.py +84 -0
  374. mapproxy/test/unit/test_cache_tile.py +427 -0
  375. mapproxy/test/unit/test_client.py +479 -0
  376. mapproxy/test/unit/test_client_arcgis.py +73 -0
  377. mapproxy/test/unit/test_client_cgi.py +136 -0
  378. mapproxy/test/unit/test_collections.py +116 -0
  379. mapproxy/test/unit/test_concat_legends.py +37 -0
  380. mapproxy/test/unit/test_conf_loader.py +1061 -0
  381. mapproxy/test/unit/test_conf_validator.py +416 -0
  382. mapproxy/test/unit/test_config.py +117 -0
  383. mapproxy/test/unit/test_decorate_img.py +185 -0
  384. mapproxy/test/unit/test_exceptions.py +258 -0
  385. mapproxy/test/unit/test_featureinfo.py +291 -0
  386. mapproxy/test/unit/test_file_lock_load.py +49 -0
  387. mapproxy/test/unit/test_geom.py +503 -0
  388. mapproxy/test/unit/test_grid.py +1258 -0
  389. mapproxy/test/unit/test_image.py +1053 -0
  390. mapproxy/test/unit/test_image_mask.py +181 -0
  391. mapproxy/test/unit/test_image_messages.py +197 -0
  392. mapproxy/test/unit/test_image_options.py +160 -0
  393. mapproxy/test/unit/test_isodate.py +122 -0
  394. mapproxy/test/unit/test_multiapp.py +163 -0
  395. mapproxy/test/unit/test_ogr_reader.py +50 -0
  396. mapproxy/test/unit/test_request.py +745 -0
  397. mapproxy/test/unit/test_request_wmts.py +178 -0
  398. mapproxy/test/unit/test_response.py +79 -0
  399. mapproxy/test/unit/test_seed.py +365 -0
  400. mapproxy/test/unit/test_seed_cachelock.py +90 -0
  401. mapproxy/test/unit/test_srs.py +215 -0
  402. mapproxy/test/unit/test_tiled_source.py +122 -0
  403. mapproxy/test/unit/test_tilefilter.py +31 -0
  404. mapproxy/test/unit/test_times.py +25 -0
  405. mapproxy/test/unit/test_timeutils.py +50 -0
  406. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  407. mapproxy/test/unit/test_utils.py +476 -0
  408. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  409. mapproxy/test/unit/test_wms_layer.py +113 -0
  410. mapproxy/test/unit/test_yaml.py +69 -0
  411. mapproxy/tilefilter.py +59 -0
  412. mapproxy/util/__init__.py +0 -0
  413. mapproxy/util/async_.py +227 -0
  414. mapproxy/util/collections.py +132 -0
  415. mapproxy/util/coverage.py +329 -0
  416. mapproxy/util/escape.py +10 -0
  417. mapproxy/util/ext/__init__.py +14 -0
  418. mapproxy/util/ext/dictspec/__init__.py +1 -0
  419. mapproxy/util/ext/dictspec/spec.py +124 -0
  420. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  421. mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
  422. mapproxy/util/ext/dictspec/validator.py +189 -0
  423. mapproxy/util/ext/local.py +196 -0
  424. mapproxy/util/ext/lockfile.py +138 -0
  425. mapproxy/util/ext/odict.py +330 -0
  426. mapproxy/util/ext/serving.py +508 -0
  427. mapproxy/util/ext/tempita/__init__.py +1174 -0
  428. mapproxy/util/ext/tempita/_looper.py +163 -0
  429. mapproxy/util/ext/tempita/compat3.py +46 -0
  430. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  431. mapproxy/util/ext/wmsparse/duration.py +597 -0
  432. mapproxy/util/ext/wmsparse/parse.py +305 -0
  433. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  434. mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
  435. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  436. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  437. mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
  438. mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
  439. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  440. mapproxy/util/ext/wmsparse/util.py +187 -0
  441. mapproxy/util/fs.py +156 -0
  442. mapproxy/util/geom.py +295 -0
  443. mapproxy/util/lib.py +115 -0
  444. mapproxy/util/lock.py +163 -0
  445. mapproxy/util/ogr.py +231 -0
  446. mapproxy/util/py.py +81 -0
  447. mapproxy/util/times.py +75 -0
  448. mapproxy/util/yaml.py +56 -0
  449. mapproxy/version.py +31 -0
  450. mapproxy/wsgiapp.py +164 -0
  451. mapproxy-1.16.1.dist-info/METADATA +151 -0
  452. mapproxy-1.16.1.dist-info/RECORD +458 -0
  453. mapproxy-1.16.1.dist-info/WHEEL +5 -0
  454. mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
  455. mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
  456. mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
  457. mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
  458. mapproxy-1.16.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,427 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2011-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 calendar
17
+ import datetime
18
+ import os
19
+ import shutil
20
+ import sqlite3
21
+ import sys
22
+ import tempfile
23
+ import threading
24
+ import time
25
+
26
+ from io import BytesIO
27
+
28
+ import pytest
29
+
30
+ from PIL import Image
31
+
32
+ from mapproxy.cache.file import FileCache
33
+ from mapproxy.cache.mbtiles import MBTilesCache, MBTilesLevelCache
34
+ from mapproxy.cache.tile import Tile
35
+ from mapproxy.image import ImageSource
36
+ from mapproxy.image.opts import ImageOptions
37
+ from mapproxy.test.helper import assert_files_in_dir
38
+ from mapproxy.test.image import create_tmp_image_buf, is_png
39
+
40
+
41
+ tile_image = create_tmp_image_buf((256, 256), color='blue')
42
+ tile_image2 = create_tmp_image_buf((256, 256), color='red')
43
+
44
+
45
+ class TileCacheTestBase(object):
46
+ always_loads_metadata = False
47
+ uses_utc = False
48
+
49
+ cache = None # set by subclasses
50
+
51
+ def setup(self):
52
+ self.cache_dir = tempfile.mkdtemp()
53
+
54
+ def teardown(self):
55
+ if hasattr(self.cache, 'cleanup'):
56
+ self.cache.cleanup()
57
+ if hasattr(self, 'cache_dir') and os.path.exists(self.cache_dir):
58
+ shutil.rmtree(self.cache_dir)
59
+
60
+ def create_tile(self, coord=(3009, 589, 12)):
61
+ return Tile(coord,
62
+ ImageSource(tile_image,
63
+ image_opts=ImageOptions(format='image/png')))
64
+
65
+ def create_another_tile(self, coord=(3009, 589, 12)):
66
+ return Tile(coord,
67
+ ImageSource(tile_image2,
68
+ image_opts=ImageOptions(format='image/png')))
69
+
70
+ def test_is_cached_miss(self):
71
+ assert not self.cache.is_cached(Tile((3009, 589, 12)))
72
+
73
+ def test_is_cached_hit(self):
74
+ tile = self.create_tile()
75
+ self.create_cached_tile(tile)
76
+ assert self.cache.is_cached(Tile((3009, 589, 12)))
77
+
78
+ def test_is_cached_none(self):
79
+ assert self.cache.is_cached(Tile(None))
80
+
81
+ def test_load_tile_none(self):
82
+ assert self.cache.load_tile(Tile(None))
83
+
84
+ def test_load_tile_not_cached(self):
85
+ tile = Tile((3009, 589, 12))
86
+ assert not self.cache.load_tile(tile)
87
+ assert tile.source is None
88
+ assert tile.is_missing()
89
+
90
+ def test_load_tile_cached(self):
91
+ tile = self.create_tile()
92
+ self.create_cached_tile(tile)
93
+ tile = Tile((3009, 589, 12))
94
+ assert self.cache.load_tile(tile) == True
95
+ assert not tile.is_missing()
96
+
97
+ def test_store_tiles(self):
98
+ tiles = [self.create_tile((x, 589, 12)) for x in range(4)]
99
+ tiles[0].stored = True
100
+ self.cache.store_tiles(tiles,dimensions=None)
101
+
102
+ tiles = [Tile((x, 589, 12)) for x in range(4)]
103
+ assert tiles[0].is_missing()
104
+ assert self.cache.load_tile(tiles[0]) == False
105
+ assert tiles[0].is_missing()
106
+
107
+ for tile in tiles[1:]:
108
+ assert tile.is_missing()
109
+ assert self.cache.load_tile(tile) == True
110
+ assert not tile.is_missing()
111
+
112
+ def test_load_tiles_cached(self):
113
+ self.cache.store_tile(self.create_tile((0, 0, 1)))
114
+ self.cache.store_tile(self.create_tile((0, 1, 1)))
115
+ tiles = [Tile((0, 0, 1)), Tile((0, 1, 1))]
116
+ assert self.cache.load_tiles(tiles)
117
+
118
+ assert not tiles[0].is_missing()
119
+ assert not tiles[1].is_missing()
120
+
121
+ def test_load_tiles_mixed(self):
122
+ tile = self.create_tile((1, 0, 4))
123
+ self.create_cached_tile(tile)
124
+ tiles = [Tile(None), Tile((0, 0, 4)), Tile((1, 0, 4))]
125
+ assert self.cache.load_tiles(tiles) == False
126
+ assert not tiles[0].is_missing()
127
+ assert tiles[1].is_missing()
128
+ assert not tiles[2].is_missing()
129
+
130
+ def test_load_stored_tile(self):
131
+ tile = self.create_tile((5, 12, 4))
132
+ self.cache.store_tile(tile)
133
+ size = tile.size
134
+
135
+ # check stored tile
136
+ tile = Tile((5, 12, 4))
137
+ assert tile.source is None
138
+
139
+ assert self.cache.load_tile(tile)
140
+ if not self.always_loads_metadata:
141
+ assert tile.source is not None
142
+ assert tile.timestamp is None
143
+ assert tile.size is None
144
+ stored_size = len(tile.source.as_buffer().read())
145
+ assert stored_size == size
146
+
147
+ # check loading of metadata (timestamp, size)
148
+ tile = Tile((5, 12, 4))
149
+ assert tile.source is None
150
+ assert self.cache.load_tile(tile, with_metadata=True)
151
+ assert tile.source is not None
152
+ if tile.timestamp:
153
+ now = time.time()
154
+ if self.uses_utc:
155
+ now = calendar.timegm(datetime.datetime.utcnow().timetuple())
156
+ assert abs(tile.timestamp - now) <= 10
157
+ if tile.size:
158
+ assert tile.size == size
159
+
160
+ def test_overwrite_tile(self):
161
+ tile = self.create_tile((5, 12, 4))
162
+ self.cache.store_tile(tile)
163
+
164
+ tile = Tile((5, 12, 4))
165
+ self.cache.load_tile(tile)
166
+ tile1_content = tile.source.as_buffer().read()
167
+ assert tile1_content == tile_image.getvalue()
168
+
169
+ tile = self.create_another_tile((5, 12, 4))
170
+ self.cache.store_tile(tile)
171
+
172
+ tile = Tile((5, 12, 4))
173
+ self.cache.load_tile(tile)
174
+ tile2_content = tile.source.as_buffer().read()
175
+ assert tile2_content == tile_image2.getvalue()
176
+
177
+ assert tile1_content != tile2_content
178
+
179
+ def test_store_tile_already_stored(self):
180
+ # tile object is marked as stored,
181
+ # check that is is not stored 'again'
182
+ # (used for disable_storage)
183
+ tile = Tile((1234, 589, 12), ImageSource(BytesIO(b'foo')))
184
+ tile.stored = True
185
+ self.cache.store_tile(tile)
186
+
187
+ assert self.cache.is_cached(tile)
188
+
189
+ tile = Tile((1234, 589, 12))
190
+ assert not self.cache.is_cached(tile)
191
+
192
+ def test_remove(self):
193
+ tile = self.create_tile((1, 0, 4))
194
+ self.create_cached_tile(tile)
195
+ assert self.cache.is_cached(Tile((1, 0, 4)))
196
+
197
+ self.cache.remove_tile(Tile((1, 0, 4)))
198
+ assert not self.cache.is_cached(Tile((1, 0, 4)))
199
+
200
+ # check if we can recreate a removed tile
201
+ tile = self.create_tile((1, 0, 4))
202
+ self.create_cached_tile(tile)
203
+ assert self.cache.is_cached(Tile((1, 0, 4)))
204
+
205
+ def create_cached_tile(self, tile):
206
+ self.cache.store_tile(tile)
207
+
208
+ class TestFileTileCache(TileCacheTestBase):
209
+ def setup(self):
210
+ TileCacheTestBase.setup(self)
211
+ self.cache = FileCache(self.cache_dir, 'png')
212
+
213
+ def test_store_tile(self):
214
+ tile = self.create_tile((5, 12, 4))
215
+ self.cache.store_tile(tile)
216
+ tile_location = os.path.join(self.cache_dir,
217
+ '04', '000', '000', '005', '000', '000', '012.png' )
218
+ assert os.path.exists(tile_location), tile_location
219
+
220
+ @pytest.mark.skipif(sys.platform == 'win32',
221
+ reason='link_single_color_tiles not supported on windows')
222
+ def test_single_color_tile_store(self):
223
+ img = Image.new('RGB', (256, 256), color='#ff0105')
224
+ tile = Tile((0, 0, 4), ImageSource(img, image_opts=ImageOptions(format='image/png')))
225
+ self.cache.link_single_color_images = True
226
+ self.cache.store_tile(tile)
227
+ assert self.cache.is_cached(tile)
228
+ loc = self.cache.tile_location(tile)
229
+ assert os.path.islink(loc)
230
+ assert os.path.realpath(loc).endswith('ff0105.png')
231
+ assert is_png(open(loc, 'rb'))
232
+
233
+ tile2 = Tile((0, 0, 1), ImageSource(img))
234
+ self.cache.store_tile(tile2)
235
+ assert self.cache.is_cached(tile2)
236
+ loc2 = self.cache.tile_location(tile2)
237
+ assert os.path.islink(loc2)
238
+ assert os.path.realpath(loc2).endswith('ff0105.png')
239
+ assert is_png(open(loc2, 'rb'))
240
+
241
+ assert loc != loc2
242
+ assert os.path.samefile(loc, loc2)
243
+
244
+ @pytest.mark.skipif(sys.platform == 'win32',
245
+ reason='link_single_color_tiles not supported on windows')
246
+ def test_single_color_tile_store_w_alpha(self):
247
+ img = Image.new('RGBA', (256, 256), color='#ff0105')
248
+ tile = Tile((0, 0, 4), ImageSource(img, image_opts=ImageOptions(format='image/png')))
249
+ self.cache.link_single_color_images = True
250
+ self.cache.store_tile(tile)
251
+ assert self.cache.is_cached(tile)
252
+ loc = self.cache.tile_location(tile)
253
+ assert os.path.islink(loc)
254
+ assert os.path.realpath(loc).endswith('ff0105ff.png')
255
+ assert is_png(open(loc, 'rb'))
256
+
257
+ def test_load_metadata_missing_tile(self):
258
+ tile = Tile((0, 0, 0))
259
+ self.cache.load_tile_metadata(tile)
260
+ assert tile.timestamp == 0
261
+ assert tile.size == 0
262
+
263
+ def create_cached_tile(self, tile):
264
+ loc = self.cache.tile_location(tile, create_dir=True)
265
+ with open(loc, 'wb') as f:
266
+ f.write(b'foo')
267
+
268
+ @pytest.mark.parametrize('layout,tile_coord,path', [
269
+ ['mp', (12345, 67890, 2), '/tmp/foo/02/0001/2345/0006/7890.png'],
270
+ ['mp', (12345, 67890, 12), '/tmp/foo/12/0001/2345/0006/7890.png'],
271
+
272
+ ['tc', (12345, 67890, 2), '/tmp/foo/02/000/012/345/000/067/890.png'],
273
+ ['tc', (12345, 67890, 12), '/tmp/foo/12/000/012/345/000/067/890.png'],
274
+
275
+ ['tms', (12345, 67890, 2), '/tmp/foo/2/12345/67890.png'],
276
+ ['tms', (12345, 67890, 12), '/tmp/foo/12/12345/67890.png'],
277
+
278
+ ['quadkey', (0, 0, 0), '/tmp/foo/.png'],
279
+ ['quadkey', (0, 0, 1), '/tmp/foo/0.png'],
280
+ ['quadkey', (1, 1, 1), '/tmp/foo/3.png'],
281
+ ['quadkey', (12345, 67890, 12), '/tmp/foo/200200331021.png'],
282
+
283
+ ['arcgis', (1, 2, 3), '/tmp/foo/L03/R00000002/C00000001.png'],
284
+ ['arcgis', (9, 2, 3), '/tmp/foo/L03/R00000002/C00000009.png'],
285
+ ['arcgis', (10, 2, 3), '/tmp/foo/L03/R00000002/C0000000a.png'],
286
+ ['arcgis', (12345, 67890, 12), '/tmp/foo/L12/R00010932/C00003039.png'],
287
+ ])
288
+ def test_tile_location(self, layout, tile_coord, path):
289
+ cache = FileCache('/tmp/foo', 'png', directory_layout=layout)
290
+ assert os.path.abspath(cache.tile_location(Tile(tile_coord))) == os.path.abspath(path)
291
+
292
+ @pytest.mark.parametrize('layout,level,path', [
293
+ ['mp', 2, '/tmp/foo/02'],
294
+ ['mp', 12, '/tmp/foo/12'],
295
+
296
+ ['tc', 2, '/tmp/foo/02'],
297
+ ['tc', 12, '/tmp/foo/12'],
298
+
299
+ ['tms', '2', '/tmp/foo/2'],
300
+ ['tms', 12, '/tmp/foo/12'],
301
+
302
+ ['arcgis', 3, '/tmp/foo/L03'],
303
+ ['arcgis', 3, '/tmp/foo/L03'],
304
+ ['arcgis', 3, '/tmp/foo/L03'],
305
+ ['arcgis', 12, '/tmp/foo/L12'],
306
+ ])
307
+ def test_level_location(self, layout, level, path):
308
+ cache = FileCache('/tmp/foo', 'png', directory_layout=layout)
309
+ assert os.path.abspath(cache.level_location(level)) == os.path.abspath(path)
310
+
311
+ def test_level_location_quadkey(self):
312
+ cache = FileCache('/tmp/foo', 'png', directory_layout='quadkey')
313
+ with pytest.raises(NotImplementedError):
314
+ cache.level_location(0)
315
+
316
+ class TestMBTileCache(TileCacheTestBase):
317
+ def setup(self):
318
+ TileCacheTestBase.setup(self)
319
+ self.cache = MBTilesCache(os.path.join(self.cache_dir, 'tmp.mbtiles'))
320
+
321
+ def teardown(self):
322
+ if self.cache:
323
+ self.cache.cleanup()
324
+ TileCacheTestBase.teardown(self)
325
+
326
+ def test_load_empty_tileset(self):
327
+ assert self.cache.load_tiles([Tile(None)]) == True
328
+ assert self.cache.load_tiles([Tile(None), Tile(None), Tile(None)]) == True
329
+
330
+ def test_load_more_than_2000_tiles(self):
331
+ # prepare data
332
+ for i in range(0, 2010):
333
+ assert self.cache.store_tile(Tile((i, 0, 10), ImageSource(BytesIO(b'foo'))))
334
+
335
+ tiles = [Tile((i, 0, 10)) for i in range(0, 2010)]
336
+ assert self.cache.load_tiles(tiles)
337
+
338
+ def test_timeouts(self):
339
+ self.cache._db_conn_cache.db = sqlite3.connect(self.cache.mbtile_file, timeout=0.05)
340
+
341
+ def block():
342
+ # block database by delaying the commit
343
+ db = sqlite3.connect(self.cache.mbtile_file)
344
+ cur = db.cursor()
345
+ stmt = "INSERT OR REPLACE INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES (?,?,?,?)"
346
+ cur.execute(stmt, (3, 1, 1, '1234'))
347
+ time.sleep(0.2)
348
+ db.commit()
349
+
350
+ try:
351
+ assert self.cache.store_tile(self.create_tile((0, 0, 1))) == True
352
+
353
+ t = threading.Thread(target=block)
354
+ t.start()
355
+ time.sleep(0.05)
356
+ assert self.cache.store_tile(self.create_tile((0, 0, 1))) == False
357
+ finally:
358
+ t.join()
359
+
360
+ assert self.cache.store_tile(self.create_tile((0, 0, 1))) == True
361
+
362
+
363
+ class TestQuadkeyFileTileCache(TileCacheTestBase):
364
+ def setup(self):
365
+ TileCacheTestBase.setup(self)
366
+ self.cache = FileCache(self.cache_dir, 'png', directory_layout='quadkey')
367
+
368
+ def test_store_tile(self):
369
+ tile = self.create_tile((3, 4, 2))
370
+ self.cache.store_tile(tile)
371
+ tile_location = os.path.join(self.cache_dir, '11.png' )
372
+ assert os.path.exists(tile_location), tile_location
373
+
374
+
375
+ class TestMBTileLevelCache(TileCacheTestBase):
376
+ always_loads_metadata = True
377
+
378
+ def setup(self):
379
+ TileCacheTestBase.setup(self)
380
+ self.cache = MBTilesLevelCache(self.cache_dir)
381
+
382
+ def test_level_files(self):
383
+ assert_files_in_dir(self.cache_dir, [])
384
+
385
+ self.cache.store_tile(self.create_tile((0, 0, 1)))
386
+ assert_files_in_dir(self.cache_dir, ['1.mbtile'], glob='*.mbtile')
387
+
388
+ self.cache.store_tile(self.create_tile((0, 0, 5)))
389
+ assert_files_in_dir(self.cache_dir, ['1.mbtile', '5.mbtile'], glob='*.mbtile')
390
+
391
+ def test_remove_level_files(self):
392
+ self.cache.store_tile(self.create_tile((0, 0, 1)))
393
+ self.cache.store_tile(self.create_tile((0, 0, 2)))
394
+ assert_files_in_dir(self.cache_dir, ['1.mbtile', '2.mbtile'], glob='*.mbtile')
395
+
396
+ self.cache.remove_level_tiles_before(1, timestamp=0)
397
+ assert_files_in_dir(self.cache_dir, ['2.mbtile'], glob='*.mbtile')
398
+
399
+ def test_remove_level_tiles_before(self):
400
+ self.cache.store_tile(self.create_tile((0, 0, 1)))
401
+ self.cache.store_tile(self.create_tile((0, 0, 2)))
402
+
403
+ assert_files_in_dir(self.cache_dir, ['1.mbtile', '2.mbtile'], glob='*.mbtile')
404
+ assert self.cache.is_cached(Tile((0, 0, 1)))
405
+
406
+ self.cache.remove_level_tiles_before(1, timestamp=time.time() - 60)
407
+ assert self.cache.is_cached(Tile((0, 0, 1)))
408
+
409
+ self.cache.remove_level_tiles_before(1, timestamp=time.time() + 60)
410
+ assert not self.cache.is_cached(Tile((0, 0, 1)))
411
+
412
+ assert_files_in_dir(self.cache_dir, ['1.mbtile', '2.mbtile'], glob='*.mbtile')
413
+ assert self.cache.is_cached(Tile((0, 0, 2)))
414
+
415
+ def test_bulk_store_tiles_with_different_levels(self):
416
+ self.cache.store_tiles([
417
+ self.create_tile((0, 0, 1)),
418
+ self.create_tile((0, 0, 2)),
419
+ self.create_tile((1, 0, 2)),
420
+ self.create_tile((1, 0, 1)),
421
+ ],dimensions=None)
422
+
423
+ assert_files_in_dir(self.cache_dir, ['1.mbtile', '2.mbtile'], glob='*.mbtile')
424
+ assert self.cache.is_cached(Tile((0, 0, 1)))
425
+ assert self.cache.is_cached(Tile((1, 0, 1)))
426
+ assert self.cache.is_cached(Tile((0, 0, 2)))
427
+ assert self.cache.is_cached(Tile((1, 0, 2)))