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,422 @@
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
+ import os
17
+ import time
18
+ import shutil
19
+ import tempfile
20
+
21
+ from mapproxy.config.loader import load_configuration
22
+ from mapproxy.cache.tile import Tile
23
+ from mapproxy.image import ImageSource
24
+ from mapproxy.image.opts import ImageOptions
25
+ from mapproxy.seed.seeder import seed
26
+ from mapproxy.seed.cleanup import cleanup
27
+ from mapproxy.seed.config import load_seed_tasks_conf
28
+ from mapproxy.config import local_base_config
29
+ from mapproxy.util.fs import ensure_directory
30
+
31
+ from mapproxy.test.helper import assert_files_in_dir
32
+ from mapproxy.test.http import mock_httpd
33
+ from mapproxy.test.image import tmp_image, create_tmp_image_buf, create_tmp_image
34
+
35
+
36
+ FIXTURE_DIR = os.path.join(os.path.dirname(__file__), 'fixture')
37
+
38
+ class SeedTestEnvironment(object):
39
+ def setup(self):
40
+ self.dir = tempfile.mkdtemp()
41
+ shutil.copy(os.path.join(FIXTURE_DIR, self.seed_conf_name), self.dir)
42
+ shutil.copy(os.path.join(FIXTURE_DIR, self.mapproxy_conf_name), self.dir)
43
+ shutil.copy(os.path.join(FIXTURE_DIR, self.empty_ogrdata), self.dir)
44
+ self.seed_conf_file = os.path.join(self.dir, self.seed_conf_name)
45
+ self.mapproxy_conf_file = os.path.join(self.dir, self.mapproxy_conf_name)
46
+ self.mapproxy_conf = load_configuration(self.mapproxy_conf_file, seed=True)
47
+
48
+ def teardown(self):
49
+ shutil.rmtree(self.dir)
50
+
51
+ def make_tile(self, coord=(0, 0, 0), timestamp=None):
52
+ """
53
+ Create file for tile at `coord` with given timestamp.
54
+ """
55
+ tile_dir = os.path.join(self.dir, 'cache/one_EPSG4326/%02d/000/000/%03d/000/000/' %
56
+ (coord[2], coord[0]))
57
+
58
+ ensure_directory(tile_dir)
59
+ tile = os.path.join(tile_dir + '%03d.png' % coord[1])
60
+ open(tile, 'wb').write(b'')
61
+ if timestamp:
62
+ os.utime(tile, (timestamp, timestamp))
63
+ return tile
64
+
65
+ def tile_exists(self, coord):
66
+ tile_dir = os.path.join(self.dir, 'cache/one_EPSG4326/%02d/000/000/%03d/000/000/' %
67
+ (coord[2], coord[0]))
68
+ tile = os.path.join(tile_dir + '%03d.png' % coord[1])
69
+ return os.path.exists(tile)
70
+
71
+ class SeedTestBase(SeedTestEnvironment):
72
+
73
+ def test_seed_dry_run(self):
74
+ with local_base_config(self.mapproxy_conf.base_config):
75
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
76
+ tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
77
+ seed(tasks, dry_run=True)
78
+ cleanup(cleanup_tasks, verbose=False, dry_run=True)
79
+
80
+ def test_seed(self):
81
+ with tmp_image((256, 256), format='png') as img:
82
+ img_data = img.read()
83
+ expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
84
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
85
+ '&width=256&height=128&srs=EPSG:4326'},
86
+ {'body': img_data, 'headers': {'content-type': 'image/png'}})
87
+ with mock_httpd(('localhost', 42423), [expected_req]):
88
+ with local_base_config(self.mapproxy_conf.base_config):
89
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
90
+ tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
91
+ seed(tasks, dry_run=False)
92
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
93
+
94
+ def test_seed_skip_uncached(self):
95
+ with tmp_image((256, 256), format='png') as img:
96
+ img_data = img.read()
97
+ with local_base_config(self.mapproxy_conf.base_config):
98
+ expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
99
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
100
+ '&width=256&height=128&srs=EPSG:4326'},
101
+ {'body': img_data, 'headers': {'content-type': 'image/png'}})
102
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
103
+ tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
104
+
105
+ # tile not in cache => skipped by seeder
106
+ seed(tasks, dry_run=False, skip_uncached=True)
107
+ assert not self.tile_exists((0, 0, 0))
108
+
109
+ with mock_httpd(('localhost', 42423), [expected_req]):
110
+ # force tile generation in cache (via skip_uncached=False)
111
+ seed(tasks, dry_run=False, skip_uncached=False)
112
+ assert self.tile_exists((0, 0, 0))
113
+
114
+ # no refresh since tile is not older than 1 day (cf. config seed.yaml)
115
+ seed(tasks, dry_run=False, skip_uncached=True)
116
+
117
+ # create stale tile (older than 1 day)
118
+ self.make_tile((0, 0, 0), timestamp=time.time() - (60*60*25))
119
+ with mock_httpd(('localhost', 42423), [expected_req]):
120
+ # check that old tile in cache is refreshed
121
+ seed(tasks, dry_run=False, skip_uncached=True)
122
+ assert self.tile_exists((0, 0, 0))
123
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
124
+
125
+ def test_reseed_uptodate(self):
126
+ # tile already there.
127
+ self.make_tile((0, 0, 0))
128
+ with local_base_config(self.mapproxy_conf.base_config):
129
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
130
+ tasks, cleanup_tasks = seed_conf.seeds(['one']), seed_conf.cleanups()
131
+ seed(tasks, dry_run=False)
132
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
133
+
134
+ class TestSeedOldConfiguration(SeedTestBase):
135
+ seed_conf_name = 'seed_old.yaml'
136
+ mapproxy_conf_name = 'seed_mapproxy.yaml'
137
+ empty_ogrdata = 'empty_ogrdata.geojson'
138
+
139
+ def test_reseed_remove_before(self):
140
+ # tile already there but too old
141
+ t000 = self.make_tile((0, 0, 0), timestamp=time.time() - (60*60*25))
142
+ # old tile outside the seed view (should be removed)
143
+ t001 = self.make_tile((0, 0, 1), timestamp=time.time() - (60*60*25))
144
+ assert os.path.exists(t000)
145
+ assert os.path.exists(t001)
146
+ with tmp_image((256, 256), format='png') as img:
147
+ img_data = img.read()
148
+ expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
149
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
150
+ '&width=256&height=128&srs=EPSG:4326'},
151
+ {'body': img_data, 'headers': {'content-type': 'image/png'}})
152
+ with mock_httpd(('localhost', 42423), [expected_req]):
153
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
154
+ tasks, cleanup_tasks = seed_conf.seeds(), seed_conf.cleanups()
155
+ seed(tasks, dry_run=False)
156
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
157
+
158
+ assert os.path.exists(t000)
159
+ assert os.path.getmtime(t000) - 5 < time.time() < os.path.getmtime(t000) + 5
160
+ assert not os.path.exists(t001)
161
+
162
+
163
+ tile_image_buf = create_tmp_image_buf((256, 256), color='blue')
164
+ tile_image = create_tmp_image((256, 256), color='blue')
165
+
166
+ class TestSeed(SeedTestBase):
167
+ seed_conf_name = 'seed.yaml'
168
+ mapproxy_conf_name = 'seed_mapproxy.yaml'
169
+ empty_ogrdata = 'empty_ogrdata.geojson'
170
+
171
+ def test_cleanup_levels(self):
172
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
173
+ cleanup_tasks = seed_conf.cleanups(['cleanup'])
174
+
175
+ self.make_tile((0, 0, 0))
176
+ self.make_tile((0, 0, 1))
177
+ self.make_tile((0, 0, 2))
178
+ self.make_tile((0, 0, 3))
179
+
180
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
181
+ assert not self.tile_exists((0, 0, 0))
182
+ assert not self.tile_exists((0, 0, 1))
183
+ assert self.tile_exists((0, 0, 2))
184
+ assert not self.tile_exists((0, 0, 3))
185
+
186
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'one_EPSG4326'),
187
+ ['02'])
188
+
189
+ def test_cleanup_remove_all(self):
190
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
191
+ cleanup_tasks = seed_conf.cleanups(['remove_all'])
192
+
193
+ self.make_tile((0, 0, 0))
194
+ self.make_tile((0, 0, 1))
195
+ self.make_tile((1, 0, 1))
196
+ self.make_tile((0, 1, 1))
197
+ self.make_tile((1, 1, 1))
198
+ self.make_tile((0, 0, 2))
199
+ self.make_tile((0, 0, 3))
200
+
201
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'one_EPSG4326'),
202
+ ['00', '01', '02', '03'])
203
+
204
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
205
+ assert self.tile_exists((0, 0, 0))
206
+ assert not self.tile_exists((0, 0, 1))
207
+ assert not self.tile_exists((1, 0, 1))
208
+ assert not self.tile_exists((0, 1, 1))
209
+ assert not self.tile_exists((1, 1, 1))
210
+ assert not self.tile_exists((0, 0, 1))
211
+ assert self.tile_exists((0, 0, 2))
212
+ assert self.tile_exists((0, 0, 3))
213
+
214
+ # remove_all should remove the whole directory
215
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'one_EPSG4326'),
216
+ ['00', '02', '03'])
217
+
218
+ def test_cleanup_coverage(self):
219
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
220
+ cleanup_tasks = seed_conf.cleanups(['with_coverage'])
221
+
222
+ self.make_tile((0, 0, 0))
223
+ self.make_tile((1, 0, 1))
224
+ self.make_tile((2, 0, 2))
225
+ self.make_tile((2, 0, 3))
226
+ self.make_tile((4, 0, 3))
227
+
228
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
229
+ assert not self.tile_exists((0, 0, 0))
230
+ assert not self.tile_exists((1, 0, 1))
231
+ assert self.tile_exists((2, 0, 2))
232
+ assert not self.tile_exists((2, 0, 3))
233
+ assert self.tile_exists((4, 0, 3))
234
+
235
+ def test_seed_mbtile(self):
236
+ with tmp_image((256, 256), format='png') as img:
237
+ img_data = img.read()
238
+ expected_req = ({'path': r'/service?LAYERS=bar&SERVICE=WMS&FORMAT=image%2Fpng'
239
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
240
+ '&width=256&height=128&srs=EPSG:4326'},
241
+ {'body': img_data, 'headers': {'content-type': 'image/png'}})
242
+ with mock_httpd(('localhost', 42423), [expected_req]):
243
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
244
+ tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache']), seed_conf.cleanups(['cleanup_mbtile_cache'])
245
+ seed(tasks, dry_run=False)
246
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
247
+
248
+ def create_tile(self, coord=(0, 0, 0)):
249
+ return Tile(coord,
250
+ ImageSource(tile_image_buf,
251
+ image_opts=ImageOptions(format='image/png')))
252
+
253
+ def test_reseed_mbtiles(self):
254
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
255
+ tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache']), seed_conf.cleanups(['cleanup_mbtile_cache'])
256
+
257
+ cache = tasks[0].tile_manager.cache
258
+ cache.store_tile(self.create_tile())
259
+ # no refresh before
260
+ seed(tasks, dry_run=False)
261
+
262
+ def test_reseed_mbtiles_with_refresh(self):
263
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
264
+ tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache_refresh']), seed_conf.cleanups(['cleanup_mbtile_cache'])
265
+
266
+ cache = tasks[0].tile_manager.cache
267
+ cache.store_tile(self.create_tile())
268
+
269
+ expected_req = ({'path': r'/service?LAYERS=bar&SERVICE=WMS&FORMAT=image%2Fpng'
270
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
271
+ '&width=256&height=128&srs=EPSG:4326'},
272
+ {'body': tile_image, 'headers': {'content-type': 'image/png'}})
273
+ with mock_httpd(('localhost', 42423), [expected_req]):
274
+ # mbtiles does not support timestamps, refresh all tiles
275
+ seed(tasks, dry_run=False)
276
+
277
+ def test_cleanup_mbtiles(self):
278
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
279
+ tasks, cleanup_tasks = seed_conf.seeds(['mbtile_cache_refresh']), seed_conf.cleanups(['cleanup_mbtile_cache'])
280
+
281
+ cache = tasks[0].tile_manager.cache
282
+ cache.store_tile(self.create_tile())
283
+
284
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
285
+
286
+ def test_cleanup_sqlite(self):
287
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
288
+ cleanup_tasks = seed_conf.cleanups(['sqlite_cache'])
289
+
290
+ cache = cleanup_tasks[0].tile_manager.cache
291
+ cache.store_tile(self.create_tile((0, 0, 2)))
292
+ cache.store_tile(self.create_tile((0, 0, 3)))
293
+ assert cache.is_cached(Tile((0, 0, 2)))
294
+ assert cache.is_cached(Tile((0, 0, 3)))
295
+
296
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
297
+ ['2.mbtile', '3.mbtile'],
298
+ glob='*.mbtile')
299
+
300
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
301
+
302
+ # 3.mbtile file is still there
303
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
304
+ ['2.mbtile', '3.mbtile'],
305
+ glob='*.mbtile')
306
+ assert cache.is_cached(Tile((0, 0, 2)))
307
+ assert not cache.is_cached(Tile((0, 0, 3)))
308
+
309
+ def test_cleanup_sqlite_remove_all(self):
310
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
311
+ cleanup_tasks = seed_conf.cleanups(['sqlite_cache_remove_all'])
312
+
313
+ cache = cleanup_tasks[0].tile_manager.cache
314
+ cache.store_tile(self.create_tile((0, 0, 2)))
315
+ cache.store_tile(self.create_tile((0, 0, 3)))
316
+ assert cache.is_cached(Tile((0, 0, 2)))
317
+ assert cache.is_cached(Tile((0, 0, 3)))
318
+
319
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
320
+ ['2.mbtile', '3.mbtile'],
321
+ glob='*.mbtile')
322
+
323
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
324
+
325
+ # 3.mbtile file should be removed completely
326
+ assert_files_in_dir(os.path.join(self.dir, 'cache', 'sqlite_cache', 'GLOBAL_GEODETIC'),
327
+ ['3.mbtile'],
328
+ glob='*.mbtile')
329
+ assert not cache.is_cached(Tile((0, 0, 2)))
330
+ assert cache.is_cached(Tile((0, 0, 3)))
331
+
332
+ def test_active_seed_tasks(self):
333
+ with local_base_config(self.mapproxy_conf.base_config):
334
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
335
+ assert len(seed_conf.seed_tasks_names()) == 5
336
+ assert len(seed_conf.seeds()) == 5
337
+
338
+ def test_seed_refresh_remove_before_from_file(self):
339
+ # tile already there but old
340
+ t000 = self.make_tile((0, 0, 0), timestamp=time.time() - (60*60*25))
341
+
342
+ # mtime is older than tile, no create of the tile
343
+ timestamp = time.time() - (60*60*30)
344
+ os.utime(self.seed_conf_file, (timestamp, timestamp))
345
+ with local_base_config(self.mapproxy_conf.base_config):
346
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
347
+ tasks = seed_conf.seeds(['refresh_from_file'])
348
+ seed(tasks, dry_run=False)
349
+
350
+
351
+ # touch the seed_conf file and refresh everything
352
+ os.utime(self.seed_conf_file, None)
353
+ img_data = create_tmp_image((256, 256), format='png')
354
+ expected_req = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
355
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
356
+ '&width=256&height=128&srs=EPSG:4326'},
357
+ {'body': img_data, 'headers': {'content-type': 'image/png'}})
358
+ with mock_httpd(('localhost', 42423), [expected_req]):
359
+ # touch the seed_conf file and refresh everything
360
+ timestamp = time.time() - 60
361
+ os.utime(self.seed_conf_file, (timestamp, timestamp))
362
+
363
+ with local_base_config(self.mapproxy_conf.base_config):
364
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
365
+ tasks = seed_conf.seeds(['refresh_from_file'])
366
+ seed(tasks, dry_run=False)
367
+
368
+ assert os.path.exists(t000)
369
+ assert os.path.getmtime(t000) - 5 < time.time() < os.path.getmtime(t000) + 5
370
+
371
+ # mtime is older than tile, no cleanup
372
+ timestamp = time.time() - 5
373
+ os.utime(self.seed_conf_file, (timestamp, timestamp))
374
+ with local_base_config(self.mapproxy_conf.base_config):
375
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
376
+ cleanup_tasks = seed_conf.cleanups(['remove_from_file'])
377
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
378
+ assert os.path.exists(t000)
379
+
380
+ # now touch the seed_conf again and remove everything
381
+ timestamp = time.time() + 5
382
+ os.utime(self.seed_conf_file, (timestamp, timestamp))
383
+ with local_base_config(self.mapproxy_conf.base_config):
384
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
385
+ cleanup_tasks = seed_conf.cleanups(['remove_from_file'])
386
+ cleanup(cleanup_tasks, verbose=False, dry_run=False)
387
+ assert not os.path.exists(t000)
388
+
389
+ class TestConcurrentRequestsSeed(SeedTestEnvironment):
390
+ seed_conf_name = 'seed_timeouts.yaml'
391
+ mapproxy_conf_name = 'seed_timeouts_mapproxy.yaml'
392
+ empty_ogrdata = 'empty_ogrdata.geojson'
393
+
394
+ def test_timeout(self):
395
+ # test concurrent seeding where seed concurrency is higher than the permitted
396
+ # concurrent_request value of the source and a lock times out
397
+
398
+ seed_conf = load_seed_tasks_conf(self.seed_conf_file, self.mapproxy_conf)
399
+ tasks = seed_conf.seeds(['test'])
400
+
401
+ expected_req1 = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
402
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
403
+ '&width=256&height=128&srs=EPSG:4326'},
404
+ {'body': tile_image, 'headers': {'content-type': 'image/png'}, 'duration': 0.1})
405
+
406
+ expected_req2 = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
407
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
408
+ '&width=512&height=256&srs=EPSG:4326'},
409
+ {'body': tile_image, 'headers': {'content-type': 'image/png'}, 'duration': 0.1})
410
+
411
+ expected_req3 = ({'path': r'/service?LAYERS=foo&SERVICE=WMS&FORMAT=image%2Fpng'
412
+ '&REQUEST=GetMap&VERSION=1.1.1&bbox=-180.0,-90.0,180.0,90.0'
413
+ '&width=1024&height=512&srs=EPSG:4326'},
414
+ {'body': tile_image, 'headers': {'content-type': 'image/png'}, 'duration': 0.1})
415
+
416
+
417
+ with mock_httpd(('localhost', 42423), [expected_req1, expected_req2, expected_req3], unordered=True):
418
+ seed(tasks, dry_run=False, concurrency=3)
419
+ # concurrency=3, concurrent_request=1, client_timeout=0.2, response delay=0.1
420
+ # the third request should time out (3x0.1 > 0.2), but exp_backoff() in the seeder ignores this
421
+ # timeout exception and tries a second time
422
+
@@ -0,0 +1,93 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from __future__ import division
17
+
18
+ from io import BytesIO
19
+
20
+ import pytest
21
+
22
+ from mapproxy.request.wms import WMS111MapRequest
23
+ from mapproxy.compat.image import Image
24
+ from mapproxy.test.image import is_png, is_jpeg
25
+ from mapproxy.test.system import SysTest
26
+
27
+
28
+ @pytest.fixture(scope="module")
29
+ def config_file():
30
+ return "seedonly.yaml"
31
+
32
+
33
+ class TestSeedOnlyWMS(SysTest):
34
+
35
+ def setup(self):
36
+ self.common_map_req = WMS111MapRequest(
37
+ url="/service?",
38
+ param=dict(
39
+ service="WMS",
40
+ version="1.1.1",
41
+ bbox="-180,0,0,80",
42
+ width="200",
43
+ height="200",
44
+ layers="wms_cache",
45
+ srs="EPSG:4326",
46
+ format="image/png",
47
+ styles="",
48
+ request="GetMap",
49
+ transparent=True,
50
+ ),
51
+ )
52
+
53
+ def test_get_map_cached(self, app, fixture_cache_data):
54
+ resp = app.get(self.common_map_req)
55
+ assert resp.content_type == "image/png"
56
+ data = BytesIO(resp.body)
57
+ assert is_png(data)
58
+ img = Image.open(data)
59
+ assert img.mode == "RGB"
60
+ # cached image has more that 256 colors, getcolors -> None
61
+ assert img.getcolors() == None
62
+
63
+ def test_get_map_uncached(self, app):
64
+ self.common_map_req.params["bbox"] = "10,10,20,20"
65
+ resp = app.get(self.common_map_req)
66
+ assert resp.content_type == "image/png"
67
+ data = BytesIO(resp.body)
68
+ assert is_png(data)
69
+ img = Image.open(data)
70
+ assert img.mode == "RGBA"
71
+ assert img.getcolors() == [(200 * 200, (255, 255, 255, 0))]
72
+
73
+
74
+ class TestSeedOnlyTMS(SysTest):
75
+
76
+ def test_get_tile_cached(self, app, fixture_cache_data):
77
+ resp = app.get("/tms/1.0.0/wms_cache/0/0/1.jpeg")
78
+ assert resp.content_type == "image/jpeg"
79
+ data = BytesIO(resp.body)
80
+ assert is_jpeg(data)
81
+ img = Image.open(data)
82
+ assert img.mode == "RGB"
83
+ # cached image has more that 256 colors, getcolors -> None
84
+ assert img.getcolors() == None
85
+
86
+ def test_get_tile_uncached(self, app):
87
+ resp = app.get("/tms/1.0.0/wms_cache/0/0/0.jpeg")
88
+ assert resp.content_type == "image/png"
89
+ data = BytesIO(resp.body)
90
+ assert is_png(data)
91
+ img = Image.open(data)
92
+ assert img.mode == "RGBA"
93
+ assert img.getcolors() == [(256 * 256, (255, 255, 255, 0))]
@@ -0,0 +1,120 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from __future__ import division
17
+
18
+ import pytest
19
+
20
+ try:
21
+ from urllib.parse import quote
22
+ except ImportError:
23
+ from urllib import quote
24
+
25
+ from mapproxy.request.wms import WMS111MapRequest
26
+ from mapproxy.test.system import SysTest
27
+ from mapproxy.test.http import mock_httpd
28
+ from mapproxy.test.image import create_tmp_image
29
+
30
+
31
+ @pytest.fixture(scope="module")
32
+ def config_file():
33
+ return "sld.yaml"
34
+
35
+
36
+ TESTSERVER_ADDRESS = "localhost", 42423
37
+
38
+
39
+ class TestWMS(SysTest):
40
+
41
+ @pytest.fixture(scope="class")
42
+ def additional_files(self, base_dir):
43
+ base_dir.join("mysld.xml").write("<sld>")
44
+
45
+ def setup(self):
46
+ self.common_map_req = WMS111MapRequest(
47
+ url="/service?",
48
+ param=dict(
49
+ service="WMS",
50
+ version="1.1.1",
51
+ bbox="0,0,10,10",
52
+ width="200",
53
+ height="200",
54
+ srs="EPSG:4326",
55
+ format="image/png",
56
+ styles="",
57
+ request="GetMap",
58
+ exceptions="xml",
59
+ ),
60
+ )
61
+ self.common_wms_url = (
62
+ "/service?styles=&srs=EPSG%3A4326&version=1.1.1&"
63
+ "bbox=0.0,0.0,10.0,10.0&service=WMS&format=image%2Fpng&request=GetMap"
64
+ "&width=200&height=200"
65
+ )
66
+
67
+ def test_sld_url(self, app):
68
+ self.common_map_req.params["layers"] = "sld_url"
69
+ with mock_httpd(
70
+ TESTSERVER_ADDRESS,
71
+ [
72
+ (
73
+ {
74
+ "path": self.common_wms_url
75
+ + "&sld="
76
+ + quote("http://example.org/sld.xml"),
77
+ "method": "GET",
78
+ },
79
+ {"body": create_tmp_image((200, 200), format="png")},
80
+ )
81
+ ],
82
+ ):
83
+ resp = app.get(self.common_map_req)
84
+ assert resp.content_type == "image/png"
85
+
86
+ def test_sld_file(self, app):
87
+ self.common_map_req.params["layers"] = "sld_file"
88
+ with mock_httpd(
89
+ TESTSERVER_ADDRESS,
90
+ [
91
+ (
92
+ {
93
+ "path": self.common_wms_url + "&sld_body=" + quote("<sld>"),
94
+ "method": "GET",
95
+ },
96
+ {"body": create_tmp_image((200, 200), format="png")},
97
+ )
98
+ ],
99
+ ):
100
+ resp = app.get(self.common_map_req)
101
+ assert resp.content_type == "image/png"
102
+
103
+ def test_sld_body(self, app):
104
+ self.common_map_req.params["layers"] = "sld_body"
105
+ with mock_httpd(
106
+ TESTSERVER_ADDRESS,
107
+ [
108
+ (
109
+ {
110
+ "path": self.common_wms_url
111
+ + "&sld_body="
112
+ + quote("<sld:StyledLayerDescriptor />"),
113
+ "method": "POST",
114
+ },
115
+ {"body": create_tmp_image((200, 200), format="png")},
116
+ )
117
+ ],
118
+ ):
119
+ resp = app.get(self.common_map_req)
120
+ assert resp.content_type == "image/png"