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,178 @@
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
+ from mapproxy.exception import RequestError
17
+ from mapproxy.request.wmts import wmts_request, WMTS100CapabilitiesRequest
18
+ from mapproxy.request.wmts import (
19
+ URLTemplateConverter,
20
+ FeatureInfoURLTemplateConverter,
21
+ InvalidWMTSTemplate,
22
+ make_wmts_rest_request_parser,
23
+ WMTS100RestTileRequest,
24
+ WMTS100RestFeatureInfoRequest,
25
+ )
26
+ from mapproxy.request.base import url_decode
27
+
28
+ import pytest
29
+
30
+
31
+ def dummy_req(args):
32
+ return DummyRequest(url_decode(args.replace("\n", "")))
33
+
34
+
35
+ def dummy_rest_req(path):
36
+ return DummyRequest(args="", path=path)
37
+
38
+
39
+ class DummyRequest(object):
40
+
41
+ def __init__(self, args, path="", url=""):
42
+ self.args = args
43
+ self.path = path
44
+ self.base_url = url
45
+
46
+
47
+ def test_tile_request():
48
+ args = """requeST=GetTile&service=wmts&tileMatrixset=EPSG900913&
49
+ tilematrix=2&tileROW=4&TILECOL=2&FORMAT=image/png&Style=&layer=Foo&version=1.0.0"""
50
+ req = wmts_request(dummy_req(args))
51
+
52
+ assert req.params.coord == (2, 4, "2")
53
+ assert req.params.layer == "Foo"
54
+ assert req.params.format == "png"
55
+ assert req.params.tilematrixset == "EPSG900913"
56
+
57
+
58
+ def test_featureinfo_request():
59
+ args = """requeST=GetFeatureInfo&service=wmts&tileMatrixset=EPSG900913&
60
+ tilematrix=2&tileROW=4&TILECOL=2&FORMAT=image/png&Style=&layer=Foo&version=1.0.0&
61
+ i=5&j=10&infoformat=application/json"""
62
+ req = wmts_request(dummy_req(args))
63
+
64
+ assert req.params.coord == (2, 4, "2")
65
+ assert req.params.layer == "Foo"
66
+ assert req.params.format == "png"
67
+ assert req.params.tilematrixset == "EPSG900913"
68
+ assert req.params.pos == (5, 10)
69
+ assert req.params.infoformat == "application/json"
70
+
71
+
72
+ def test_capabilities_request():
73
+ args = """requeST=GetCapabilities&service=wmts"""
74
+ req = wmts_request(dummy_req(args))
75
+
76
+ assert isinstance(req, WMTS100CapabilitiesRequest)
77
+
78
+
79
+ def test_template_converter():
80
+ regexp = URLTemplateConverter(
81
+ "/{Layer}/{Style}/{TileMatrixSet}-{TileMatrix}-{TileCol}-{TileRow}/tile"
82
+ ).regexp()
83
+ match = regexp.match("/wmts/test/bar/foo-EPSG4326-4-12-99/tile")
84
+ assert match
85
+ assert match.groupdict()["Layer"] == "test"
86
+ assert match.groupdict()["TileMatrixSet"] == "foo-EPSG4326"
87
+ assert match.groupdict()["TileMatrix"] == "4"
88
+ assert match.groupdict()["TileCol"] == "12"
89
+ assert match.groupdict()["TileRow"] == "99"
90
+ assert match.groupdict()["Style"] == "bar"
91
+
92
+
93
+ def test_template_converter_deprecated_format():
94
+ # old format that doesn't match the WMTS spec, now deprecated
95
+ regexp = URLTemplateConverter(
96
+ "/{{Layer}}/{{Style}}/{{TileMatrixSet}}-{{TileMatrix}}-{{TileCol}}-{{TileRow}}/tile"
97
+ ).regexp()
98
+ match = regexp.match("/wmts/test/bar/foo-EPSG4326-4-12-99/tile")
99
+ assert match
100
+ assert match.groupdict()["Layer"] == "test"
101
+ assert match.groupdict()["TileMatrixSet"] == "foo-EPSG4326"
102
+ assert match.groupdict()["TileMatrix"] == "4"
103
+ assert match.groupdict()["TileCol"] == "12"
104
+ assert match.groupdict()["TileRow"] == "99"
105
+ assert match.groupdict()["Style"] == "bar"
106
+
107
+
108
+ def test_template_converter_missing_vars():
109
+ with pytest.raises(InvalidWMTSTemplate):
110
+ URLTemplateConverter("/wmts/{Style}/{TileMatrixSet}/{TileCol}.png").regexp()
111
+
112
+
113
+ def test_template_converter_dimensions():
114
+ converter = URLTemplateConverter(
115
+ "/{Layer}/{Dim1}/{Dim2}/{TileMatrixSet}-{TileMatrix}-{TileCol}-{TileRow}/tile"
116
+ )
117
+ assert converter.dimensions == ["Dim1", "Dim2"]
118
+
119
+
120
+ class TestRestRequestParser(object):
121
+
122
+ @pytest.fixture
123
+ def parser(self):
124
+ return make_wmts_rest_request_parser(
125
+ URLTemplateConverter(
126
+ "/{Layer}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}.{Format}"
127
+ ),
128
+ FeatureInfoURLTemplateConverter(
129
+ "/{Layer}/{TileMatrixSet}/{TileMatrix}/{TileCol}/{TileRow}/{I}/{J}.{InfoFormat}"
130
+ ),
131
+ )
132
+
133
+ @pytest.mark.parametrize(
134
+ "url,tile,pos",
135
+ [
136
+ ["/wmts/roads/webmercator/09/201/123/10/30.json", (201, 123, 9), (10, 30)],
137
+ ["/wmts/roads/webmercator/10/201/1/0/999.json", (201, 1, 10), (0, 999)],
138
+ ["/wmts/roads/webmercator/09/201/123/10/30json", None, None],
139
+ ["/wmts/roads/webmercator/09/201/123/10.json", None, None],
140
+ ["/wmts/roads-webmercator/09/201/123/10/30.json", None, None],
141
+ ["/roads/webmercator/09/201/123/10/30.json", None, None],
142
+ ],
143
+ )
144
+ def test_featureinfo(self, parser, url, tile, pos):
145
+ if tile is None:
146
+ with pytest.raises(RequestError):
147
+ parser(dummy_rest_req(url))
148
+ else:
149
+ req = parser(dummy_rest_req(url))
150
+ assert isinstance(req, WMTS100RestFeatureInfoRequest)
151
+ req.make_request()
152
+ assert req.pos == pos
153
+ assert req.tile == tile
154
+ assert req.infoformat == "json"
155
+ assert req.tilematrixset == "webmercator"
156
+
157
+ @pytest.mark.parametrize(
158
+ "url,tile",
159
+ [
160
+ ["/wmts/roads/webmercator/09/201/123.png", (201, 123, 9)],
161
+ ["/wmts/roads/webmercator/10/201/123.png", (201, 123, 10)],
162
+ ["/wmts/roads/webmercator/10/201/123a.png", None],
163
+ ["/wmts/roads/webmercator/10/201/123png", None],
164
+ ["/wmts/roads/webmercator/10/2013.png", None],
165
+ ["/wmts/roads-webmercator/10/201/123.png", None],
166
+ ],
167
+ )
168
+ def test_tile(self, parser, url, tile):
169
+ if tile is None:
170
+ with pytest.raises(RequestError):
171
+ parser(dummy_rest_req(url))
172
+ else:
173
+ req = parser(dummy_rest_req(url))
174
+ assert isinstance(req, WMTS100RestTileRequest)
175
+ req.make_request()
176
+ assert req.tile == tile
177
+ assert req.format == "png"
178
+ assert req.tilematrixset == "webmercator"
@@ -0,0 +1,79 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from io import BytesIO
17
+
18
+ from mapproxy.test.helper import Mocker
19
+ from mapproxy.test.mocker import ANY
20
+ from mapproxy.response import Response
21
+ from mapproxy.compat import string_type
22
+
23
+
24
+ class TestResponse(Mocker):
25
+
26
+ def test_str_response(self):
27
+ resp = Response("string content")
28
+ assert isinstance(resp.response, string_type)
29
+ start_response = self.mock()
30
+ self.expect(start_response("200 OK", ANY))
31
+ self.replay()
32
+ result = resp({"REQUEST_METHOD": "GET"}, start_response)
33
+ assert next(result) == b"string content"
34
+
35
+ def test_itr_response(self):
36
+ resp = Response(iter(["string content", "as iterable"]))
37
+ assert hasattr(resp.response, "next") or hasattr(resp.response, "__next__")
38
+ start_response = self.mock()
39
+ self.expect(start_response("200 OK", ANY))
40
+ self.replay()
41
+ result = resp({"REQUEST_METHOD": "GET"}, start_response)
42
+ assert next(result) == "string content"
43
+ assert next(result) == "as iterable"
44
+
45
+ def test_file_response(self):
46
+ data = BytesIO(b"foobar")
47
+ resp = Response(data)
48
+ assert resp.response == data
49
+ start_response = self.mock()
50
+ self.expect(start_response("200 OK", ANY))
51
+ self.replay()
52
+ result = resp({"REQUEST_METHOD": "GET"}, start_response)
53
+ assert next(result) == b"foobar"
54
+
55
+ def test_file_response_w_file_wrapper(self):
56
+ data = BytesIO(b"foobar")
57
+ resp = Response(data)
58
+ assert resp.response == data
59
+ start_response = self.mock()
60
+ self.expect(start_response("200 OK", ANY))
61
+
62
+ file_wrapper = self.mock()
63
+ self.expect(file_wrapper(data, resp.block_size)).result("DUMMY")
64
+ self.replay()
65
+
66
+ result = resp(
67
+ {"REQUEST_METHOD": "GET", "wsgi.file_wrapper": file_wrapper}, start_response
68
+ )
69
+ assert result == "DUMMY"
70
+
71
+ def test_file_response_content_length(self):
72
+ data = BytesIO(b"*" * 342)
73
+ resp = Response(data)
74
+ assert resp.response == data
75
+ start_response = self.mock()
76
+ self.expect(start_response("200 OK", ANY))
77
+ self.replay()
78
+ resp({"REQUEST_METHOD": "GET"}, start_response)
79
+ assert resp.content_length == 342
@@ -0,0 +1,365 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010-2012 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 time
20
+ from collections import defaultdict
21
+
22
+ try:
23
+ import cPickle as pickle
24
+ except ImportError:
25
+ import pickle
26
+
27
+ import pytest
28
+
29
+ from mapproxy.seed.seeder import TileWalker, SeedTask, SeedProgress
30
+ from mapproxy.cache.dummy import DummyLocker
31
+ from mapproxy.cache.tile import TileManager
32
+ from mapproxy.source.tile import TiledSource
33
+ from mapproxy.grid import tile_grid_for_epsg
34
+ from mapproxy.grid import TileGrid
35
+ from mapproxy.srs import SRS
36
+ from mapproxy.util.coverage import BBOXCoverage, GeomCoverage
37
+ from mapproxy.seed.config import before_timestamp_from_options, SeedConfigurationError
38
+ from mapproxy.seed.config import (
39
+ LevelsList,
40
+ LevelsRange,
41
+ LevelsResolutionList,
42
+ LevelsResolutionRange,
43
+ )
44
+ from mapproxy.seed.util import ProgressStore
45
+ from mapproxy.test.helper import TempFile
46
+
47
+
48
+ try:
49
+ from shapely.wkt import loads as load_wkt
50
+
51
+ load_wkt # prevent lint warning
52
+ except ImportError:
53
+ load_wkt = None
54
+
55
+
56
+ class MockSeedPool(object):
57
+
58
+ def __init__(self):
59
+ self.seeded_tiles = defaultdict(set)
60
+
61
+ def process(self, tiles, progess):
62
+ for x, y, level in tiles:
63
+ self.seeded_tiles[level].add((x, y))
64
+
65
+
66
+ class MockCache(object):
67
+
68
+ def is_cached(self, tile,dimensions=None):
69
+ return False
70
+
71
+
72
+ class TestSeeder(object):
73
+
74
+ def setup(self):
75
+ self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
76
+ self.source = TiledSource(self.grid, None)
77
+ self.tile_mgr = TileManager(
78
+ self.grid, MockCache(), [self.source], "png", locker=DummyLocker()
79
+ )
80
+ self.seed_pool = MockSeedPool()
81
+
82
+ def make_bbox_task(self, bbox, srs, levels):
83
+ md = dict(name="", cache_name="", grid_name="")
84
+ coverage = BBOXCoverage(bbox, srs)
85
+ return SeedTask(
86
+ md, self.tile_mgr, levels, refresh_timestamp=None, coverage=coverage
87
+ )
88
+
89
+ def make_geom_task(self, geom, srs, levels):
90
+ md = dict(name="", cache_name="", grid_name="")
91
+ coverage = GeomCoverage(geom, srs)
92
+ return SeedTask(
93
+ md, self.tile_mgr, levels, refresh_timestamp=None, coverage=coverage
94
+ )
95
+
96
+ def test_seed_full_bbox(self):
97
+ task = self.make_bbox_task([-180, -90, 180, 90], SRS(4326), [0, 1, 2])
98
+ seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
99
+ seeder.walk()
100
+
101
+ assert len(self.seed_pool.seeded_tiles) == 3
102
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
103
+ assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
104
+ assert self.seed_pool.seeded_tiles[2] == set(
105
+ [(0, 0), (1, 0), (2, 0), (3, 0), (0, 1), (1, 1), (2, 1), (3, 1)]
106
+ )
107
+
108
+ def test_seed_small_bbox(self):
109
+ task = self.make_bbox_task([-45, 0, 180, 90], SRS(4326), [0, 1, 2])
110
+ seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
111
+ seeder.walk()
112
+
113
+ assert len(self.seed_pool.seeded_tiles) == 3
114
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
115
+ assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
116
+ assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1), (3, 1)])
117
+
118
+ def test_seed_small_bbox_iregular_levels(self):
119
+ task = self.make_bbox_task([-45, 0, 180, 90], SRS(4326), [0, 2])
120
+ seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
121
+ seeder.walk()
122
+
123
+ assert len(self.seed_pool.seeded_tiles) == 2
124
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
125
+ assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1), (3, 1)])
126
+
127
+ def test_seed_small_bbox_transformed(self):
128
+ bbox = SRS(4326).transform_bbox_to(SRS(900913), [-45, 0, 179, 80])
129
+ task = self.make_bbox_task(bbox, SRS(900913), [0, 1, 2])
130
+ seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
131
+ seeder.walk()
132
+
133
+ assert len(self.seed_pool.seeded_tiles) == 3
134
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
135
+ assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
136
+ assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1), (3, 1)])
137
+
138
+ @pytest.mark.skipif(not load_wkt, reason="Shapely not installed")
139
+ def test_seed_with_geom(self):
140
+ # box from 10 10 to 80 80 with small spike/corner to -10 60 (upper left)
141
+ geom = load_wkt("POLYGON((10 10, 10 50, -10 60, 10 80, 80 80, 80 10, 10 10))")
142
+ task = self.make_geom_task(geom, SRS(4326), [0, 1, 2, 3, 4])
143
+ seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
144
+ seeder.walk()
145
+
146
+ assert len(self.seed_pool.seeded_tiles) == 5
147
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
148
+ assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
149
+ assert self.seed_pool.seeded_tiles[2] == set([(1, 1), (2, 1)])
150
+ assert self.seed_pool.seeded_tiles[3] == set(
151
+ [(4, 2), (5, 2), (4, 3), (5, 3), (3, 3)]
152
+ )
153
+ assert len(self.seed_pool.seeded_tiles[4]) == 4 * 4 + 2
154
+
155
+ @pytest.mark.skipif(not load_wkt, reason="Shapely not installed")
156
+ def test_seed_with_res_list(self):
157
+ # box from 10 10 to 80 80 with small spike/corner to -10 60 (upper left)
158
+ geom = load_wkt("POLYGON((10 10, 10 50, -10 60, 10 80, 80 80, 80 10, 10 10))")
159
+
160
+ self.grid = TileGrid(
161
+ SRS(4326),
162
+ bbox=[-180, -90, 180, 90],
163
+ res=[360 / 256, 360 / 720, 360 / 2000, 360 / 5000, 360 / 8000],
164
+ )
165
+ self.tile_mgr = TileManager(
166
+ self.grid, MockCache(), [self.source], "png", locker=DummyLocker()
167
+ )
168
+ task = self.make_geom_task(geom, SRS(4326), [0, 1, 2, 3, 4])
169
+ seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
170
+ seeder.walk()
171
+
172
+ assert len(self.seed_pool.seeded_tiles) == 5
173
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
174
+ assert self.grid.grid_sizes[1] == (3, 2)
175
+ assert self.seed_pool.seeded_tiles[1] == set([(1, 0), (1, 1), (2, 0), (2, 1)])
176
+ assert self.grid.grid_sizes[2] == (8, 4)
177
+ assert self.seed_pool.seeded_tiles[2] == set(
178
+ [(4, 2), (5, 2), (4, 3), (5, 3), (3, 3)]
179
+ )
180
+ assert self.grid.grid_sizes[3] == (20, 10)
181
+ assert len(self.seed_pool.seeded_tiles[3]) == 5 * 5 + 2
182
+
183
+ def test_seed_full_bbox_continue(self):
184
+ task = self.make_bbox_task([-180, -90, 180, 90], SRS(4326), [0, 1, 2])
185
+ seed_progress = SeedProgress([(0, 1), (1, 2)])
186
+ seeder = TileWalker(
187
+ task, self.seed_pool, handle_uncached=True, seed_progress=seed_progress
188
+ )
189
+ seeder.walk()
190
+
191
+ assert len(self.seed_pool.seeded_tiles) == 3
192
+ assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
193
+ assert self.seed_pool.seeded_tiles[1] == set([(0, 0), (1, 0)])
194
+ assert self.seed_pool.seeded_tiles[2] == set([(2, 0), (3, 0), (2, 1), (3, 1)])
195
+
196
+
197
+ class TestLevels(object):
198
+
199
+ def test_level_list(self):
200
+ levels = LevelsList([-10, 3, 1, 3, 5, 7, 50])
201
+ assert levels.for_grid(tile_grid_for_epsg(4326)) == [1, 3, 5, 7]
202
+
203
+ def test_level_range(self):
204
+ levels = LevelsRange([1, 5])
205
+ assert levels.for_grid(tile_grid_for_epsg(4326)) == [1, 2, 3, 4, 5]
206
+
207
+ def test_level_range_open_from(self):
208
+ levels = LevelsRange([None, 5])
209
+ assert levels.for_grid(tile_grid_for_epsg(4326)) == [0, 1, 2, 3, 4, 5]
210
+
211
+ def test_level_range_open_to(self):
212
+ levels = LevelsRange([13, None])
213
+ assert levels.for_grid(tile_grid_for_epsg(4326)) == [13, 14, 15, 16, 17, 18, 19]
214
+
215
+ def test_level_range_open_tos_range(self):
216
+ levels = LevelsResolutionRange([1000, 100])
217
+ assert levels.for_grid(tile_grid_for_epsg(900913)) == [8, 9, 10, 11]
218
+
219
+ def test_res_range_open_from(self):
220
+ levels = LevelsResolutionRange([None, 100])
221
+ assert levels.for_grid(tile_grid_for_epsg(900913)) == [
222
+ 0,
223
+ 1,
224
+ 2,
225
+ 3,
226
+ 4,
227
+ 5,
228
+ 6,
229
+ 7,
230
+ 8,
231
+ 9,
232
+ 10,
233
+ 11,
234
+ ]
235
+
236
+ def test_res_range_open_to(self):
237
+ levels = LevelsResolutionRange([1000, None])
238
+ assert levels.for_grid(tile_grid_for_epsg(900913)) == [
239
+ 8,
240
+ 9,
241
+ 10,
242
+ 11,
243
+ 12,
244
+ 13,
245
+ 14,
246
+ 15,
247
+ 16,
248
+ 17,
249
+ 18,
250
+ 19,
251
+ ]
252
+
253
+ def test_resolution_list(self):
254
+ levels = LevelsResolutionList([1000, 100, 500])
255
+ assert levels.for_grid(tile_grid_for_epsg(900913)) == [8, 9, 11]
256
+
257
+
258
+ class TestProgressStore(object):
259
+
260
+ def test_load_empty(self):
261
+ store = ProgressStore("doesnotexist.no_realy.txt")
262
+ store.load()
263
+ assert store.get(("foo", "bar", "baz")) == None
264
+
265
+ def test_load_store(self):
266
+ with TempFile(no_create=True) as tmp:
267
+ with open(tmp, "wb") as f:
268
+ f.write(pickle.dumps({("view", "cache", "grid"): [(0, 1), (2, 4)]}))
269
+ store = ProgressStore(tmp)
270
+ assert store.get(("view", "cache", "grid")) == [(0, 1), (2, 4)]
271
+ assert store.get(("view", "cache", "grid2")) == None
272
+ store.add(("view", "cache", "grid"), [])
273
+ store.add(("view", "cache", "grid2"), [(0, 1)])
274
+ store.write()
275
+
276
+ store = ProgressStore(tmp)
277
+ assert store.get(("view", "cache", "grid")) == []
278
+ assert store.get(("view", "cache", "grid2")) == [(0, 1)]
279
+
280
+ def test_load_broken(self):
281
+ with TempFile(no_create=True) as tmp:
282
+ with open(tmp, "wb") as f:
283
+ f.write(b"##invaliddata")
284
+ f.write(pickle.dumps({("view", "cache", "grid"): [(0, 1), (2, 4)]}))
285
+
286
+ store = ProgressStore(tmp)
287
+ assert store.status == {}
288
+
289
+
290
+ class TestRemovebreforeTimetamp(object):
291
+
292
+ def test_from_time(self):
293
+ ts = before_timestamp_from_options({"time": "2010-12-01T20:12:00"})
294
+ # we don't know the timezone this test will run
295
+ assert (1291230720.0 - 14 * 3600) < ts < (1291230720.0 + 14 * 3600)
296
+
297
+ def test_from_mtime(self):
298
+ with TempFile() as tmp:
299
+ os.utime(tmp, (12376512, 12376512))
300
+ assert before_timestamp_from_options({"mtime": tmp}) == 12376512
301
+
302
+ def test_from_mtime_missing_file(self):
303
+ with pytest.raises(SeedConfigurationError):
304
+ before_timestamp_from_options(
305
+ {"mtime": "/tmp/does-not-exist-at-all,really"}
306
+ )
307
+
308
+ def test_from_empty(self):
309
+ assert before_timestamp_from_options({}) == pytest.approx(time.time(), 1)
310
+
311
+ def test_from_delta(self):
312
+ assert (
313
+ before_timestamp_from_options({"minutes": 15}) + 60 * 15
314
+ ) == pytest.approx(time.time(), 1)
315
+
316
+
317
+ class TestSeedProgress(object):
318
+
319
+ def test_progress_identifier(self):
320
+ old = SeedProgress()
321
+ with old.step_down(0, 2):
322
+ with old.step_down(0, 4):
323
+ assert old.current_progress_identifier() == [(0, 2), (0, 4)]
324
+ # previous leafs are still present
325
+ assert old.current_progress_identifier() == [(0, 2), (0, 4)]
326
+ with old.step_down(1, 4):
327
+ assert old.current_progress_identifier() == [(0, 2), (1, 4)]
328
+ assert old.current_progress_identifier() == [(0, 2), (1, 4)]
329
+
330
+ assert old.current_progress_identifier() == [] # empty list after seed
331
+
332
+ with old.step_down(1, 2):
333
+ assert old.current_progress_identifier() == [(1, 2)]
334
+ with old.step_down(0, 4):
335
+ with old.step_down(1, 4):
336
+ assert old.current_progress_identifier() == [(1, 2), (0, 4), (1, 4)]
337
+
338
+ def test_already_processed(self):
339
+ new = SeedProgress([(0, 2)])
340
+ with new.step_down(0, 2):
341
+ assert not new.already_processed()
342
+ with new.step_down(0, 2):
343
+ assert not new.already_processed()
344
+
345
+ new = SeedProgress([(1, 2)])
346
+ with new.step_down(0, 2):
347
+ assert new.already_processed()
348
+ with new.step_down(0, 2):
349
+ assert new.already_processed()
350
+
351
+ new = SeedProgress([(0, 2), (1, 4), (2, 4)])
352
+ with new.step_down(0, 2):
353
+ assert not new.already_processed()
354
+ with new.step_down(0, 4):
355
+ assert new.already_processed()
356
+ with new.step_down(1, 4):
357
+ assert not new.already_processed()
358
+ with new.step_down(1, 4):
359
+ assert new.already_processed()
360
+ with new.step_down(2, 4):
361
+ assert not new.already_processed()
362
+ with new.step_down(3, 4):
363
+ assert not new.already_processed()
364
+ with new.step_down(2, 4):
365
+ assert not new.already_processed()