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,75 @@
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 __future__ import division
17
+
18
+ import pytest
19
+
20
+ from mapproxy.test.system import SysTest
21
+
22
+
23
+ class TestWMSBehindProxy(SysTest):
24
+ """
25
+ Check WMS OnlineResources for requests behind HTTP proxies.
26
+ """
27
+ @pytest.fixture(scope='class')
28
+ def config_file(self):
29
+ return 'layer.yaml'
30
+
31
+ def test_no_proxy(self, app):
32
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
33
+ '&VERSION=1.1.0')
34
+ assert '"http://localhost/service' in resp
35
+
36
+ def test_with_script_name(self, app):
37
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
38
+ '&VERSION=1.1.0', extra_environ={'HTTP_X_SCRIPT_NAME': '/foo'})
39
+ assert '"http://localhost/service' not in resp
40
+ assert '"http://localhost/foo/service' in resp
41
+
42
+ def test_with_host(self, app):
43
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
44
+ '&VERSION=1.1.0', extra_environ={'HTTP_HOST': 'example.org'})
45
+ assert '"http://localhost/service' not in resp
46
+ assert '"http://example.org/service' in resp
47
+
48
+ def test_with_host_and_script_name(self, app):
49
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
50
+ '&VERSION=1.1.0', extra_environ={'HTTP_X_SCRIPT_NAME': '/foo', 'HTTP_HOST': 'example.org'})
51
+ assert '"http://localhost/service' not in resp
52
+ assert '"http://example.org/foo/service' in resp
53
+
54
+ def test_with_forwarded_host(self, app):
55
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
56
+ '&VERSION=1.1.0', extra_environ={'HTTP_X_FORWARDED_HOST': 'example.org, bar.org'})
57
+ assert '"http://localhost/service' not in resp
58
+ assert '"http://example.org/service' in resp
59
+
60
+ def test_with_forwarded_host_and_script_name(self, app):
61
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
62
+ '&VERSION=1.1.0', extra_environ={'HTTP_X_FORWARDED_HOST': 'example.org', 'HTTP_X_SCRIPT_NAME': '/foo'})
63
+ assert '"http://localhost/service' not in resp
64
+ assert '"http://example.org/foo/service' in resp
65
+
66
+ def test_with_forwarded_proto_and_script_name_and_host(self, app):
67
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
68
+ '&VERSION=1.1.0', extra_environ={
69
+ 'HTTP_X_FORWARDED_PROTO': 'https',
70
+ 'HTTP_X_SCRIPT_NAME': '/foo',
71
+ 'HTTP_HOST': 'example.org:443'
72
+ })
73
+ assert '"http://localhost/service' not in resp
74
+ assert '"https://example.org/foo/service' in resp
75
+
@@ -0,0 +1,106 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2016 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import pytest
17
+
18
+ from mapproxy.request.wms import WMS111MapRequest
19
+ from mapproxy.test.image import tmp_image
20
+ from mapproxy.test.http import mock_httpd
21
+ from mapproxy.test.system import SysTest
22
+
23
+
24
+ @pytest.fixture(scope="module")
25
+ def config_file():
26
+ return "cache_bulk_meta_tiles.yaml"
27
+
28
+
29
+ class TestCacheSource(SysTest):
30
+
31
+ def test_tms_capabilities(self, app):
32
+ resp = app.get("/tms/1.0.0/")
33
+ xml = resp.lxml
34
+
35
+ assert xml.xpath("count(//TileMap)") == 1
36
+
37
+ def test_get_map(self, app):
38
+ # request single tile via WMS and check that
39
+ map_req = WMS111MapRequest(
40
+ url="/service?",
41
+ param=dict(
42
+ service="WMS",
43
+ version="1.1.1",
44
+ width="100",
45
+ height="100",
46
+ bbox="0,0,100000,100000",
47
+ layers="bulk",
48
+ srs="EPSG:3857",
49
+ format="image/png",
50
+ styles="",
51
+ request="GetMap",
52
+ ),
53
+ )
54
+
55
+ expected_reqs = []
56
+ with tmp_image((256, 256), format="jpeg") as img:
57
+ img = img.read()
58
+ # bulk_cache has meta_size of [2, 2]
59
+ for tile in [(128, 128, 8), (128, 129, 8), (129, 128, 8), (129, 129, 8)]:
60
+ expected_reqs.append(
61
+ (
62
+ {
63
+ "path": r"/tiles/%02d/000/000/%03d/000/000/%03d.png"
64
+ % (tile[2], tile[0], tile[1])
65
+ },
66
+ {"body": img, "headers": {"content-type": "image/png"}},
67
+ )
68
+ )
69
+ with mock_httpd(("localhost", 42423), expected_reqs, unordered=True):
70
+ resp = app.get(map_req)
71
+ assert resp.content_type == "image/png"
72
+
73
+ def test_get_tile(self, app, cache_dir):
74
+ expected_reqs = []
75
+ with tmp_image((256, 256), format="jpeg") as img:
76
+ # bulk_cache has meta_size of [2, 2]
77
+ for tile in [(4, 3, 5), (5, 3, 5), (4, 2, 5), (5, 2, 5)]:
78
+ expected_reqs.append(
79
+ (
80
+ {
81
+ "path": r"/tiles/%02d/000/000/%03d/000/000/%03d.png"
82
+ % (tile[2], tile[0], tile[1])
83
+ },
84
+ {"body": img.read(), "headers": {"content-type": "image/png"}},
85
+ )
86
+ )
87
+ with mock_httpd(("localhost", 42423), expected_reqs, unordered=True):
88
+ resp = app.get("/tiles/1.0.0/bulk/EPSG900913/5/4/3.png")
89
+ assert resp.content_type == "image/png"
90
+
91
+ assert cache_dir.join(
92
+ "bulk_cache_EPSG900913/05/000/000/004/000/000/002.png"
93
+ ).check()
94
+ assert cache_dir.join(
95
+ "bulk_cache_EPSG900913/05/000/000/004/000/000/003.png"
96
+ ).check()
97
+ assert cache_dir.join(
98
+ "bulk_cache_EPSG900913/05/000/000/005/000/000/002.png"
99
+ ).check()
100
+ assert cache_dir.join(
101
+ "bulk_cache_EPSG900913/05/000/000/005/000/000/003.png"
102
+ ).check()
103
+
104
+ # access tile cached by previous bulk_meta_tile request
105
+ resp = app.get("/tiles/1.0.0/bulk/EPSG900913/5/5/3.png")
106
+ assert resp.content_type == "image/png"
@@ -0,0 +1,127 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2022 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
+ from io import BytesIO
20
+
21
+ import pytest
22
+
23
+ from mapproxy.request.wms import WMS111MapRequest
24
+ from mapproxy.test.image import is_png, create_tmp_image
25
+ from mapproxy.test.system import SysTest
26
+
27
+ try:
28
+ from mapproxy.cache.azureblob import AzureBlobCache
29
+ except ImportError:
30
+ AzureBlobCache = None
31
+
32
+
33
+ def azureblob_connection():
34
+ # Use default storage account of Azurite emulator
35
+ host = os.environ['MAPPROXY_TEST_AZURE_BLOB']
36
+ return 'DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=' \
37
+ 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr' \
38
+ '/KBHBeksoGMGw==;BlobEndpoint=' + host + '/devstoreaccount1;'
39
+
40
+
41
+ def azure_container_client(connection_string, container_name):
42
+ return AzureBlobCache(
43
+ base_path="",
44
+ file_ext="",
45
+ connection_string=connection_string,
46
+ container_name=container_name).container_client
47
+
48
+
49
+ @pytest.fixture(scope="module")
50
+ def config_file():
51
+ return "cache_azureblob.yaml"
52
+
53
+
54
+ @pytest.fixture(scope="module")
55
+ def azureblob_containers():
56
+ container = azure_container_client(azureblob_connection(), 'default-container')
57
+ if not container.exists():
58
+ container.create_container()
59
+ container = azure_container_client(azureblob_connection(), 'tiles')
60
+ if not container.exists():
61
+ container.create_container()
62
+
63
+ yield
64
+
65
+
66
+ @pytest.mark.skipif(not AzureBlobCache or not os.environ.get('MAPPROXY_TEST_AZURE_BLOB'),
67
+ reason="azure-storage-blob package and MAPPROXY_TEST_AZURE_BLOB env required")
68
+ @pytest.mark.usefixtures("azureblob_containers")
69
+ class TestAzureBlobCache(SysTest):
70
+
71
+ def setup(self):
72
+ self.common_map_req = WMS111MapRequest(
73
+ url="/service?",
74
+ param=dict(
75
+ service="WMS",
76
+ version="1.1.1",
77
+ bbox="-150,-40,-140,-30",
78
+ width="100",
79
+ height="100",
80
+ layers="default",
81
+ srs="EPSG:4326",
82
+ format="image/png",
83
+ styles="",
84
+ request="GetMap",
85
+ ),
86
+ )
87
+
88
+ def test_get_map_cached(self, app):
89
+ tile = create_tmp_image((256, 256))
90
+ container = azure_container_client(azureblob_connection(), 'default-container')
91
+ container.upload_blob(
92
+ name="default_cache/WebMerc/4/1/9.png",
93
+ data=BytesIO(tile),
94
+ overwrite=True
95
+ )
96
+ resp = app.get(self.common_map_req)
97
+ assert resp.content_type == "image/png"
98
+ data = BytesIO(resp.body)
99
+ assert is_png(data)
100
+
101
+ def test_get_map_cached_quadkey(self, app):
102
+ tile = create_tmp_image((256, 256))
103
+ container = azure_container_client(azureblob_connection(), 'tiles')
104
+ container.upload_blob(
105
+ name="quadkeytiles/2003.png",
106
+ data=BytesIO(tile),
107
+ overwrite=True
108
+ )
109
+ self.common_map_req.params.layers = "quadkey"
110
+ resp = app.get(self.common_map_req)
111
+ assert resp.content_type == "image/png"
112
+ data = BytesIO(resp.body)
113
+ assert is_png(data)
114
+
115
+ def test_get_map_cached_reverse_tms(self, app):
116
+ tile = create_tmp_image((256, 256))
117
+ container = azure_container_client(azureblob_connection(), 'tiles')
118
+ container.upload_blob(
119
+ name="reversetiles/9/1/4.png",
120
+ data=BytesIO(tile),
121
+ overwrite=True
122
+ )
123
+ self.common_map_req.params.layers = "reverse"
124
+ resp = app.get(self.common_map_req)
125
+ assert resp.content_type == "image/png"
126
+ data = BytesIO(resp.body)
127
+ assert is_png(data)
@@ -0,0 +1,103 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2016 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import pytest
17
+
18
+ from mapproxy.request.wms import WMS111MapRequest
19
+ from mapproxy.request.wmts import WMTS100CapabilitiesRequest
20
+ from mapproxy.test.image import img_from_buf
21
+ from mapproxy.test.system import SysTest
22
+
23
+
24
+ @pytest.fixture(scope="module")
25
+ def config_file():
26
+ return "cache_band_merge.yaml"
27
+
28
+
29
+ @pytest.mark.usefixtures("fixture_cache_data")
30
+ class TestCacheSource(SysTest):
31
+
32
+ # test various band merge configurations with
33
+ # cached base tile 0/0/0.png (R: 50 G: 100 B: 200)
34
+
35
+ def setup(self):
36
+ self.common_cap_req = WMTS100CapabilitiesRequest(
37
+ url="/service?",
38
+ param=dict(service="WMTS", version="1.0.0", request="GetCapabilities"),
39
+ )
40
+ self.common_map_req = WMS111MapRequest(
41
+ url="/service?",
42
+ param=dict(
43
+ service="WMS",
44
+ version="1.1.1",
45
+ bbox="-180,0,0,80",
46
+ width="100",
47
+ height="100",
48
+ layers="dop_l",
49
+ srs="EPSG:4326",
50
+ format="image/png",
51
+ styles="",
52
+ request="GetMap",
53
+ ),
54
+ )
55
+
56
+ def test_capabilities(self, app):
57
+ req = str(self.common_cap_req)
58
+ resp = app.get(req)
59
+ assert resp.content_type == "application/xml"
60
+
61
+ def test_get_tile_021(self, app):
62
+ resp = app.get("/wmts/dop_021/GLOBAL_WEBMERCATOR/0/0/0.png")
63
+ assert resp.content_type == "image/png"
64
+ img = img_from_buf(resp.body)
65
+ assert img.mode == "RGB"
66
+ assert img.getpixel((0, 0)) == (50, 200, 100)
67
+
68
+ def test_get_tile_l(self, app):
69
+ resp = app.get("/wmts/dop_l/GLOBAL_WEBMERCATOR/0/0/0.png")
70
+ assert resp.content_type == "image/png"
71
+ img = img_from_buf(resp.body)
72
+ assert img.mode == "L"
73
+ assert img.getpixel((0, 0)) == int(50 * 0.25 + 0.7 * 100 + 0.05 * 200)
74
+
75
+ def test_get_tile_0(self, app):
76
+ resp = app.get("/wmts/dop_0/GLOBAL_WEBMERCATOR/0/0/0.png")
77
+ assert resp.content_type == "image/png"
78
+ img = img_from_buf(resp.body)
79
+ assert img.mode == "RGB" # forced with image.mode
80
+ assert img.getpixel((0, 0)) == (50, 50, 50)
81
+
82
+ def test_get_tile_0122(self, app):
83
+ resp = app.get("/wmts/dop_0122/GLOBAL_WEBMERCATOR/0/0/0.png")
84
+ assert resp.content_type == "image/png"
85
+ img = img_from_buf(resp.body)
86
+ assert img.mode == "RGBA"
87
+ assert img.getpixel((0, 0)) == (50, 100, 200, 50)
88
+
89
+ def test_get_map_l(self, app):
90
+ resp = app.get(str(self.common_map_req))
91
+ assert resp.content_type == "image/png"
92
+ img = img_from_buf(resp.body)
93
+ assert img.mode == "L"
94
+ assert img.getpixel((0, 0)) == int(50 * 0.25 + 0.7 * 100 + 0.05 * 200)
95
+
96
+ def test_get_map_l_jpeg(self, app):
97
+ self.common_map_req.params.format = "image/jpeg"
98
+ resp = app.get(str(self.common_map_req))
99
+ assert resp.content_type == "image/jpeg"
100
+ img = img_from_buf(resp.body)
101
+ assert img.mode == "RGB"
102
+ # L converted to RGB for jpeg
103
+ assert img.getpixel((0, 0)) == (92, 92, 92)
@@ -0,0 +1,144 @@
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 __future__ import division
17
+
18
+ import os
19
+ import shutil
20
+ import sqlite3
21
+
22
+ from io import BytesIO
23
+
24
+ import pytest
25
+
26
+ from mapproxy.request.wms import WMS111MapRequest
27
+ from mapproxy.test.http import MockServ
28
+ from mapproxy.test.image import is_png, create_tmp_image
29
+ from mapproxy.test.system import SysTest
30
+ from mapproxy.cache.geopackage import GeopackageCache
31
+ from mapproxy.grid import TileGrid
32
+
33
+
34
+ @pytest.fixture(scope="module")
35
+ def config_file():
36
+ return "cache_geopackage.yaml"
37
+
38
+
39
+ @pytest.fixture(scope="class")
40
+ def fixture_gpkg(base_dir):
41
+ shutil.copy(
42
+ os.path.join(os.path.dirname(__file__), "fixture", "cache.gpkg"),
43
+ base_dir.strpath,
44
+ )
45
+
46
+
47
+ @pytest.mark.usefixtures("fixture_gpkg")
48
+ class TestGeopackageCache(SysTest):
49
+
50
+ def setup(self):
51
+ self.common_map_req = WMS111MapRequest(
52
+ url="/service?",
53
+ param=dict(
54
+ service="WMS",
55
+ version="1.1.1",
56
+ bbox="-180,-80,0,0",
57
+ width="200",
58
+ height="200",
59
+ layers="gpkg",
60
+ srs="EPSG:4326",
61
+ format="image/png",
62
+ styles="",
63
+ request="GetMap",
64
+ ),
65
+ )
66
+
67
+ def test_get_map_cached(self, app):
68
+ resp = app.get(self.common_map_req)
69
+ assert resp.content_type == "image/png"
70
+ data = BytesIO(resp.body)
71
+ assert is_png(data)
72
+
73
+ def test_get_map_uncached(self, app, base_dir):
74
+ assert base_dir.join("cache.gpkg").check()
75
+ # already created on startup
76
+
77
+ self.common_map_req.params.bbox = "-180,0,0,80"
78
+ serv = MockServ(port=42423)
79
+ serv.expects("/tiles/01/000/000/000/000/000/001.png")
80
+ serv.returns(create_tmp_image((256, 256)))
81
+ with serv:
82
+ resp = app.get(self.common_map_req)
83
+ assert resp.content_type == "image/png"
84
+ data = BytesIO(resp.body)
85
+ assert is_png(data)
86
+
87
+ # now cached
88
+ resp = app.get(self.common_map_req)
89
+ assert resp.content_type == "image/png"
90
+ data = BytesIO(resp.body)
91
+ assert is_png(data)
92
+
93
+ def test_bad_config_geopackage_no_gpkg_contents(self, app, base_dir):
94
+ gpkg_file = base_dir.join("cache.gpkg").strpath
95
+ table_name = "no_gpkg_contents"
96
+
97
+ with sqlite3.connect(gpkg_file) as db:
98
+ cur = db.execute(
99
+ """SELECT name FROM sqlite_master WHERE type='table' AND name=?""",
100
+ (table_name,),
101
+ )
102
+ content = cur.fetchone()
103
+ assert content[0] == table_name
104
+
105
+ with sqlite3.connect(gpkg_file) as db:
106
+ cur = db.execute(
107
+ """SELECT table_name FROM gpkg_contents WHERE table_name=?""",
108
+ (table_name,),
109
+ )
110
+ content = cur.fetchone()
111
+ assert not content
112
+
113
+ GeopackageCache(gpkg_file, TileGrid(srs=4326), table_name=table_name)
114
+
115
+ with sqlite3.connect(gpkg_file) as db:
116
+ cur = db.execute(
117
+ """SELECT table_name FROM gpkg_contents WHERE table_name=?""",
118
+ (table_name,),
119
+ )
120
+ content = cur.fetchone()
121
+ assert content[0] == table_name
122
+
123
+ def test_bad_config_geopackage_no_spatial_ref_sys(self, base_dir):
124
+ gpkg_file = base_dir.join("cache.gpkg").strpath
125
+ organization_coordsys_id = 3785
126
+ table_name = "no_gpkg_spatial_ref_sys"
127
+
128
+ with sqlite3.connect(gpkg_file) as db:
129
+ cur = db.execute(
130
+ """SELECT organization_coordsys_id FROM gpkg_spatial_ref_sys WHERE organization_coordsys_id=?""",
131
+ (organization_coordsys_id,),
132
+ )
133
+ content = cur.fetchone()
134
+ assert not content
135
+
136
+ GeopackageCache(gpkg_file, TileGrid(srs=3785), table_name=table_name)
137
+
138
+ with sqlite3.connect(gpkg_file) as db:
139
+ cur = db.execute(
140
+ """SELECT organization_coordsys_id FROM gpkg_spatial_ref_sys WHERE organization_coordsys_id=?""",
141
+ (organization_coordsys_id,),
142
+ )
143
+ content = cur.fetchone()
144
+ assert content[0] == organization_coordsys_id
@@ -0,0 +1,89 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 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
+ import pytest
17
+
18
+ from mapproxy.test.image import tmp_image
19
+ from mapproxy.test.http import mock_httpd
20
+ from mapproxy.test.system import SysTest
21
+
22
+
23
+ @pytest.fixture(scope="module")
24
+ def config_file():
25
+ return "cache_grid_names.yaml"
26
+
27
+
28
+ class TestCacheGridNames(SysTest):
29
+
30
+ def test_tms_capabilities(self, app):
31
+ resp = app.get("/tms/1.0.0/")
32
+ assert "Cached Layer" in resp
33
+ assert "wms_cache/utm32n" in resp
34
+ assert "wms_cache_utm32n" not in resp
35
+ xml = resp.lxml
36
+ assert xml.xpath("count(//TileMap)") == 2
37
+
38
+ def test_tms_layer_capabilities(self, app):
39
+ resp = app.get("/tms/1.0.0/wms_cache/utm32n")
40
+ assert "Cached Layer" in resp
41
+ assert "wms_cache/utm32n" in resp
42
+ assert "wms_cache_utm32n" not in resp
43
+ xml = resp.lxml
44
+ assert xml.xpath("count(//TileSet)") == 12
45
+
46
+ def test_kml(self, app):
47
+ resp = app.get("/kml/wms_cache/utm32n/4/2/2.kml")
48
+ assert b"wms_cache/utm32n" in resp.body
49
+
50
+ def test_get_tile(self, app, cache_dir):
51
+ with tmp_image((256, 256), format="jpeg") as img:
52
+ expected_req = (
53
+ {
54
+ "path": r"/service?LAYERs=bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
55
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A25832&styles="
56
+ "&VERSION=1.1.1&&WIDTH=256"
57
+ "&BBOX=283803.311362,5609091.90862,319018.942566,5644307.53982"
58
+ },
59
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
60
+ )
61
+ with mock_httpd(
62
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
63
+ ):
64
+ resp = app.get("/tms/1.0.0/wms_cache/utm32n/4/2/2.jpeg")
65
+ assert resp.content_type == "image/jpeg"
66
+ assert cache_dir.join(
67
+ "wms_cache/utm32n/04/000/000/002/000/000/002.jpeg"
68
+ ).check()
69
+
70
+ def test_get_tile_no_grid_name(self, app, cache_dir):
71
+ # access tiles with grid name from TMS but cache still uses old SRS-code path
72
+ with tmp_image((256, 256), format="jpeg") as img:
73
+ expected_req = (
74
+ {
75
+ "path": r"/service?LAYERs=bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
76
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A25832&styles="
77
+ "&VERSION=1.1.1&WIDTH=256"
78
+ "&BBOX=283803.311362,5609091.90862,319018.942566,5644307.53982"
79
+ },
80
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
81
+ )
82
+ with mock_httpd(
83
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
84
+ ):
85
+ resp = app.get("/tms/1.0.0/wms_cache_no_grid_name/utm32n/4/2/2.jpeg")
86
+ assert resp.content_type == "image/jpeg"
87
+ assert cache_dir.join(
88
+ "wms_cache_no_grid_name_EPSG25832/04/000/000/002/000/000/002.jpeg"
89
+ ).check()