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,173 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2015 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 print_function, division
17
+
18
+ import functools
19
+
20
+ import pytest
21
+
22
+ from mapproxy.request.wms import WMS130CapabilitiesRequest
23
+ from mapproxy.test.helper import validate_with_xsd
24
+ from mapproxy.test.system import SysTest
25
+
26
+
27
+ def is_inpire_vs_capa(xml):
28
+ return validate_with_xsd(xml, xsd_name="inspire/inspire_vs/1.0/inspire_vs.xsd")
29
+
30
+
31
+ def bbox_srs_from_boundingbox(bbox_elem):
32
+ return [
33
+ float(bbox_elem.attrib["minx"]),
34
+ float(bbox_elem.attrib["miny"]),
35
+ float(bbox_elem.attrib["maxx"]),
36
+ float(bbox_elem.attrib["maxy"]),
37
+ ]
38
+
39
+
40
+ ns130 = {
41
+ "wms": "http://www.opengis.net/wms",
42
+ "ogc": "http://www.opengis.net/ogc",
43
+ "sld": "http://www.opengis.net/sld",
44
+ "xlink": "http://www.w3.org/1999/xlink",
45
+ "ic": "http://inspire.ec.europa.eu/schemas/common/1.0",
46
+ "iv": "http://inspire.ec.europa.eu/schemas/inspire_vs/1.0",
47
+ }
48
+
49
+
50
+ def assert_xpath(xml, xpath, expected, namespaces=None):
51
+ elems = xml.xpath(xpath, namespaces=namespaces)
52
+ assert len(elems) == 1, elems
53
+ assert elems[0] == expected
54
+
55
+
56
+ def xpath_130(xml, xpath):
57
+ return xml.xpath(xpath, namespaces=ns130)
58
+
59
+
60
+ assert_xpath_wms130 = functools.partial(assert_xpath, namespaces=ns130)
61
+
62
+
63
+ class TestLinkedMD(SysTest):
64
+
65
+ @pytest.fixture(scope="class")
66
+ def config_file(self):
67
+ return "inspire.yaml"
68
+
69
+ def test_wms_capabilities(self, app):
70
+ req = WMS130CapabilitiesRequest(url="/service?")
71
+ resp = app.get(req)
72
+ assert resp.content_type == "text/xml"
73
+ print(resp.body)
74
+ xml = resp.lxml
75
+ assert is_inpire_vs_capa(xml)
76
+
77
+ ext_cap = xpath_130(
78
+ xml, "/wms:WMS_Capabilities/wms:Capability/iv:ExtendedCapabilities"
79
+ )
80
+
81
+ assert len(ext_cap) == 1, ext_cap
82
+ ext_cap = ext_cap[0]
83
+
84
+ assert_xpath_wms130(
85
+ ext_cap, "./ic:MetadataUrl/ic:URL/text()", u"http://example.org/metadata"
86
+ )
87
+ assert_xpath_wms130(
88
+ ext_cap,
89
+ "./ic:MetadataUrl/ic:MediaType/text()",
90
+ u"application/vnd.iso.19139+xml",
91
+ )
92
+
93
+ assert_xpath_wms130(
94
+ ext_cap,
95
+ "./ic:SupportedLanguages/ic:DefaultLanguage/ic:Language/text()",
96
+ u"eng",
97
+ )
98
+ assert_xpath_wms130(ext_cap, "./ic:ResponseLanguage/ic:Language/text()", u"eng")
99
+
100
+ # test for extended layer metadata
101
+ assert_xpath_wms130(
102
+ xml,
103
+ "/wms:WMS_Capabilities/wms:Capability/wms:Layer/wms:Attribution/wms:Title/text()",
104
+ u"My attribution title",
105
+ )
106
+
107
+ layer_names = set(xml.xpath("//wms:Layer/wms:Name/text()", namespaces=ns130))
108
+ expected_names = set(["inspire_example"])
109
+ assert layer_names == expected_names
110
+
111
+
112
+ class TestFullMD(SysTest):
113
+
114
+ @pytest.fixture(scope="class")
115
+ def config_file(self):
116
+ return "inspire_full.yaml"
117
+
118
+ def test_wms_capabilities(self, app):
119
+ req = WMS130CapabilitiesRequest(url="/service?")
120
+ resp = app.get(req)
121
+ assert resp.content_type == "text/xml"
122
+ print(resp.body)
123
+
124
+ xml = resp.lxml
125
+ assert is_inpire_vs_capa(xml)
126
+
127
+ ext_cap = xpath_130(
128
+ xml, "/wms:WMS_Capabilities/wms:Capability/iv:ExtendedCapabilities"
129
+ )
130
+
131
+ assert len(ext_cap) == 1, ext_cap
132
+ ext_cap = ext_cap[0]
133
+
134
+ assert_xpath_wms130(
135
+ ext_cap,
136
+ "./ic:ResourceLocator/ic:URL/text()",
137
+ u"http://example.org/metadata",
138
+ )
139
+ assert_xpath_wms130(
140
+ ext_cap,
141
+ "./ic:ResourceLocator/ic:MediaType/text()",
142
+ u"application/vnd.iso.19139+xml",
143
+ )
144
+
145
+ assert_xpath_wms130(
146
+ ext_cap,
147
+ "./ic:Keyword/ic:OriginatingControlledVocabulary/ic:Title/text()",
148
+ u"GEMET - INSPIRE themes",
149
+ )
150
+
151
+ assert_xpath_wms130(
152
+ ext_cap,
153
+ "./ic:SupportedLanguages/ic:DefaultLanguage/ic:Language/text()",
154
+ u"eng",
155
+ )
156
+ assert_xpath_wms130(ext_cap, "./ic:ResponseLanguage/ic:Language/text()", u"eng")
157
+
158
+ # check dates from string and datetime
159
+ assert_xpath_wms130(
160
+ ext_cap, "./ic:TemporalReference/ic:DateOfCreation/text()", u"2015-05-01"
161
+ )
162
+ assert_xpath_wms130(ext_cap, "./ic:MetadataDate/text()", u"2015-07-23")
163
+
164
+ # test for extended layer metadata
165
+ assert_xpath_wms130(
166
+ xml,
167
+ "/wms:WMS_Capabilities/wms:Capability/wms:Layer/wms:Attribution/wms:Title/text()",
168
+ u"My attribution title",
169
+ )
170
+
171
+ layer_names = set(xml.xpath("//wms:Layer/wms:Name/text()", namespaces=ns130))
172
+ expected_names = set(["inspire_example"])
173
+ assert layer_names == expected_names
@@ -0,0 +1,262 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010-2012 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import os
17
+ import hashlib
18
+
19
+ from io import BytesIO
20
+
21
+ import pytest
22
+
23
+ from mapproxy.srs import bbox_equals
24
+ from mapproxy.util.times import format_httpdate
25
+ from mapproxy.test.image import is_jpeg, tmp_image
26
+ from mapproxy.test.http import mock_httpd
27
+ from mapproxy.test.helper import validate_with_xsd
28
+ from mapproxy.test.system import SysTest
29
+
30
+
31
+ @pytest.fixture(scope="module")
32
+ def config_file():
33
+ return "kml_layer.yaml"
34
+
35
+
36
+ ns = {"kml": "http://www.opengis.net/kml/2.2"}
37
+
38
+
39
+ class TestKML(SysTest):
40
+
41
+ def test_get_out_of_bounds_tile(self, app):
42
+ for coord in [(0, 0, -1), (-1, 0, 0), (0, -1, 0), (4, 2, 1), (1, 3, 0)]:
43
+ x, y, z = coord
44
+ url = "/kml/wms_cache/%d/%d/%d.kml" % (z, x, y)
45
+ resp = app.get(url, status=404)
46
+ assert "outside the bounding box" in resp
47
+
48
+ def test_invalid_layer(self, app):
49
+ resp = app.get("/kml/inVAlid/0/0/0.png", status=404)
50
+ assert resp.content_type == "text/plain"
51
+ assert "unknown layer: inVAlid" in resp
52
+
53
+ def test_invalid_format(self, app):
54
+ resp = app.get("/kml/wms_cache/0/0/1.png", status=404)
55
+ assert resp.content_type == "text/plain"
56
+ assert "invalid format" in resp
57
+
58
+ def test_get_tile_tile_source_error(self, app):
59
+ resp = app.get("/kml/wms_cache/0/0/0.jpeg", status=500)
60
+ assert resp.content_type == "text/plain"
61
+ assert "No response from URL" in resp
62
+
63
+ def _check_tile_resp(self, resp):
64
+ assert resp.content_type == "image/jpeg"
65
+ assert resp.content_length == len(resp.body)
66
+ data = BytesIO(resp.body)
67
+ assert is_jpeg(data)
68
+
69
+ def _update_timestamp(self, base_config, cache_dir):
70
+ timestamp = 1234567890.0
71
+ size = 10214
72
+ os.utime(
73
+ cache_dir.join(
74
+ "wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg"
75
+ ).strpath,
76
+ (timestamp, timestamp),
77
+ )
78
+ max_age = base_config.tiles.expires_hours * 60 * 60
79
+ etag = hashlib.md5((str(timestamp) + str(size)).encode("ascii")).hexdigest()
80
+ return etag, max_age
81
+
82
+ def _check_cache_control_headers(self, resp, etag, max_age, timestamp=1234567890.0):
83
+ assert resp.headers["ETag"] == etag
84
+ if timestamp is None:
85
+ assert "Last-modified" not in resp.headers
86
+ else:
87
+ assert resp.headers["Last-modified"] == format_httpdate(timestamp)
88
+ assert resp.headers["Cache-control"] == "public, max-age=%d, s-maxage=%d" % (
89
+ max_age,
90
+ max_age,
91
+ )
92
+
93
+ def test_get_cached_tile(self, app, base_config, cache_dir, fixture_cache_data):
94
+ etag, max_age = self._update_timestamp(base_config, cache_dir)
95
+ resp = app.get("/kml/wms_cache/1/0/1.jpeg")
96
+ self._check_cache_control_headers(resp, etag, max_age)
97
+ self._check_tile_resp(resp)
98
+
99
+ def test_if_none_match(self, app, base_config, cache_dir, fixture_cache_data):
100
+ etag, max_age = self._update_timestamp(base_config, cache_dir)
101
+ resp = app.get("/kml/wms_cache/1/0/1.jpeg", headers={"If-None-Match": etag})
102
+ assert resp.status == "304 Not Modified"
103
+ self._check_cache_control_headers(resp, etag, max_age)
104
+
105
+ resp = app.get(
106
+ "/kml/wms_cache/1/0/1.jpeg", headers={"If-None-Match": etag + "foo"}
107
+ )
108
+ self._check_cache_control_headers(resp, etag, max_age)
109
+ assert resp.status == "200 OK"
110
+ self._check_tile_resp(resp)
111
+
112
+ def test_get_kml(self, app, base_config):
113
+ resp = app.get("/kml/wms_cache/0/0/0.kml")
114
+ xml = resp.lxml
115
+ assert validate_with_xsd(xml, "kml/2.2.0/ogckml22.xsd")
116
+ assert bbox_equals(
117
+ self._bbox(xml.xpath("/kml:kml/kml:Document", namespaces=ns)[0]),
118
+ (-180, -90, 180, 90),
119
+ )
120
+ assert bbox_equals(
121
+ self._bbox(
122
+ xml.xpath("/kml:kml/kml:Document/kml:GroundOverlay", namespaces=ns)[0]
123
+ ),
124
+ (-180, 0, 0, 90),
125
+ )
126
+ assert xml.xpath(
127
+ "/kml:kml/kml:Document/kml:GroundOverlay/kml:Icon/kml:href/text()",
128
+ namespaces=ns,
129
+ ) == [
130
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/1.jpeg",
131
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/1.jpeg",
132
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/0.jpeg",
133
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/0.jpeg",
134
+ ]
135
+ assert xml.xpath(
136
+ "/kml:kml/kml:Document/kml:NetworkLink/kml:Link/kml:href/text()",
137
+ namespaces=ns,
138
+ ) == [
139
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/1.kml",
140
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/1.kml",
141
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/0.kml",
142
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/0.kml",
143
+ ]
144
+
145
+ etag = hashlib.md5(resp.body).hexdigest()
146
+ max_age = base_config.tiles.expires_hours * 60 * 60
147
+ self._check_cache_control_headers(resp, etag, max_age, None)
148
+
149
+ resp = app.get("/kml/wms_cache/0/0/0.kml", headers={"If-None-Match": etag})
150
+ assert resp.status == "304 Not Modified"
151
+
152
+ def test_get_kml_init(self, app):
153
+ resp = app.get("/kml/wms_cache")
154
+ xml = resp.lxml
155
+ assert validate_with_xsd(xml, "kml/2.2.0/ogckml22.xsd")
156
+ assert xml.xpath(
157
+ "/kml:kml/kml:Document/kml:GroundOverlay/kml:Icon/kml:href/text()",
158
+ namespaces=ns,
159
+ ) == [
160
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/1.jpeg",
161
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/1.jpeg",
162
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/0.jpeg",
163
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/0.jpeg",
164
+ ]
165
+ assert xml.xpath(
166
+ "/kml:kml/kml:Document/kml:NetworkLink/kml:Link/kml:href/text()",
167
+ namespaces=ns,
168
+ ) == [
169
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/1.kml",
170
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/1.kml",
171
+ "http://localhost/kml/wms_cache/EPSG900913/1/0/0.kml",
172
+ "http://localhost/kml/wms_cache/EPSG900913/1/1/0.kml",
173
+ ]
174
+
175
+ def test_get_kml_nw(self, app):
176
+ resp = app.get("/kml/wms_cache_nw/1/0/0.kml")
177
+ xml = resp.lxml
178
+
179
+ assert validate_with_xsd(xml, "kml/2.2.0/ogckml22.xsd")
180
+
181
+ assert bbox_equals(
182
+ self._bbox(xml.xpath("/kml:kml/kml:Document", namespaces=ns)[0]),
183
+ (-180, -90, 0, 0),
184
+ )
185
+ assert bbox_equals(
186
+ self._bbox(
187
+ xml.xpath("/kml:kml/kml:Document/kml:GroundOverlay", namespaces=ns)[0]
188
+ ),
189
+ (-180, -66.51326, -90, 0),
190
+ )
191
+
192
+ assert xml.xpath(
193
+ "/kml:kml/kml:Document/kml:GroundOverlay/kml:Icon/kml:href/text()",
194
+ namespaces=ns,
195
+ ) == [
196
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/0/1.jpeg",
197
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/1/1.jpeg",
198
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/0/0.jpeg",
199
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/1/0.jpeg",
200
+ ]
201
+ assert xml.xpath(
202
+ "/kml:kml/kml:Document/kml:NetworkLink/kml:Link/kml:href/text()",
203
+ namespaces=ns,
204
+ ) == [
205
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/0/1.kml",
206
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/1/1.kml",
207
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/0/0.kml",
208
+ "http://localhost/kml/wms_cache_nw/EPSG900913/2/1/0.kml",
209
+ ]
210
+
211
+ def test_get_kml2(self, app):
212
+ resp = app.get("/kml/wms_cache/1/0/1.kml")
213
+ xml = resp.lxml
214
+ assert validate_with_xsd(xml, "kml/2.2.0/ogckml22.xsd")
215
+
216
+ def test_get_kml_multi_layer(self, app):
217
+ resp = app.get("/kml/wms_cache_multi/1/0/0.kml")
218
+ xml = resp.lxml
219
+ assert validate_with_xsd(xml, "kml/2.2.0/ogckml22.xsd")
220
+ assert xml.xpath(
221
+ "/kml:kml/kml:Document/kml:GroundOverlay/kml:Icon/kml:href/text()",
222
+ namespaces=ns,
223
+ ) == [
224
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/0/1.jpeg",
225
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/1/1.jpeg",
226
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/0/0.jpeg",
227
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/1/0.jpeg",
228
+ ]
229
+ assert xml.xpath(
230
+ "/kml:kml/kml:Document/kml:NetworkLink/kml:Link/kml:href/text()",
231
+ namespaces=ns,
232
+ ) == [
233
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/0/1.kml",
234
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/1/1.kml",
235
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/0/0.kml",
236
+ "http://localhost/kml/wms_cache_multi/EPSG4326/2/1/0.kml",
237
+ ]
238
+
239
+ def test_get_tile(self, app, cache_dir):
240
+ with tmp_image((256, 256), format="jpeg") as img:
241
+ expected_req = (
242
+ {
243
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
244
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
245
+ "&VERSION=1.1.1&BBOX=-20037508.3428,-20037508.3428,0.0,0.0"
246
+ "&WIDTH=256"
247
+ },
248
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
249
+ )
250
+ with mock_httpd(
251
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
252
+ ):
253
+ resp = app.get("/kml/wms_cache/1/0/0.jpeg")
254
+ assert resp.content_type == "image/jpeg"
255
+ assert cache_dir.join(
256
+ "wms_cache_EPSG900913/01/000/000/000/000/000/000.jpeg"
257
+ ).check()
258
+
259
+ def _bbox(self, elem):
260
+ elems = elem.xpath("kml:Region/kml:LatLonAltBox", namespaces=ns)[0]
261
+ n, s, e, w = [float(elem.text) for elem in elems.getchildren()]
262
+ return w, s, e, n
@@ -0,0 +1,160 @@
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
+ from mapproxy.test.system import SysTest
21
+ from mapproxy.test.system.test_wms import (
22
+ is_111_capa,
23
+ is_110_capa,
24
+ is_100_capa,
25
+ is_130_capa,
26
+ ns130,
27
+ )
28
+
29
+
30
+ TESTSERVER_ADDRESS = "localhost", 42423
31
+
32
+
33
+ class TestWMSWithRoot(SysTest):
34
+
35
+ @pytest.fixture(scope="class")
36
+ def config_file(self):
37
+ return "layergroups_root.yaml"
38
+
39
+ def _check_layernames(self, xml):
40
+ assert xml.xpath("//Capability/Layer/Title/text()") == ["Root Layer"]
41
+ assert xml.xpath("//Capability/Layer/Name/text()") == ["root"]
42
+ assert xml.xpath("//Capability/Layer/Layer/Name/text()") == ["layer1", "layer2"]
43
+ assert xml.xpath("//Capability/Layer/Layer[1]/Layer/Name/text()") == [
44
+ "layer1a",
45
+ "layer1b",
46
+ ]
47
+
48
+ def _check_layernames_with_namespace(self, xml, namespaces=None):
49
+ assert xml.xpath(
50
+ "//wms:Capability/wms:Layer/wms:Title/text()", namespaces=namespaces
51
+ ) == ["Root Layer"]
52
+ assert xml.xpath(
53
+ "//wms:Capability/wms:Layer/wms:Name/text()", namespaces=namespaces
54
+ ) == ["root"]
55
+ assert xml.xpath(
56
+ "//wms:Capability/wms:Layer/wms:Layer/wms:Name/text()",
57
+ namespaces=namespaces,
58
+ ) == ["layer1", "layer2"]
59
+ assert xml.xpath(
60
+ "//wms:Capability/wms:Layer/wms:Layer[1]/wms:Layer/wms:Name/text()",
61
+ namespaces=namespaces,
62
+ ) == ["layer1a", "layer1b"]
63
+
64
+ def test_100_capa(self, app):
65
+ resp = app.get("/service?request=GetCapabilities&service=WMS&wmtver=1.0.0")
66
+ xml = resp.lxml
67
+ assert is_100_capa(xml)
68
+ self._check_layernames(xml)
69
+
70
+ def test_110_capa(self, app):
71
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.1.0")
72
+ xml = resp.lxml
73
+ assert is_110_capa(xml)
74
+ self._check_layernames(xml)
75
+
76
+ def test_111_capa(self, app):
77
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.1.1")
78
+ xml = resp.lxml
79
+ assert is_111_capa(xml)
80
+ self._check_layernames(xml)
81
+
82
+ def test_130_capa(self, app):
83
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.3.0")
84
+ xml = resp.lxml
85
+ assert is_130_capa(xml)
86
+ self._check_layernames_with_namespace(xml, ns130)
87
+
88
+
89
+ class TestWMSWithoutRoot(SysTest):
90
+
91
+ @pytest.fixture(scope="class")
92
+ def config_file(self):
93
+ return "layergroups.yaml"
94
+
95
+ def _check_layernames(self, xml):
96
+ assert xml.xpath("//Capability/Layer/Title/text()") == ["My WMS"]
97
+ assert xml.xpath("//Capability/Layer/Name/text()") == []
98
+ assert xml.xpath("//Capability/Layer/Layer/Name/text()") == ["layer1", "layer2"]
99
+ assert xml.xpath("//Capability/Layer/Layer[1]/Layer/Name/text()") == [
100
+ "layer1a",
101
+ "layer1b",
102
+ ]
103
+ assert xml.xpath("//Capability/Layer/Layer[2]/Layer/Name/text()") == [
104
+ "layer2a",
105
+ "layer2b",
106
+ ]
107
+ assert xml.xpath("//Capability/Layer/Layer[2]/Layer/Layer[1]/Name/text()") == [
108
+ "layer2b1"
109
+ ]
110
+
111
+ def _check_layernames_with_namespace(self, xml, namespaces=None):
112
+ assert xml.xpath(
113
+ "//wms:Capability/wms:Layer/wms:Title/text()", namespaces=namespaces
114
+ ) == ["My WMS"]
115
+ assert (
116
+ xml.xpath(
117
+ "//wms:Capability/wms:Layer/wms:Name/text()", namespaces=namespaces
118
+ )
119
+ == []
120
+ )
121
+ assert xml.xpath(
122
+ "//wms:Capability/wms:Layer/wms:Layer/wms:Name/text()",
123
+ namespaces=namespaces,
124
+ ), ["layer1" == "layer2"]
125
+ assert xml.xpath(
126
+ "//wms:Capability/wms:Layer/wms:Layer[1]/wms:Layer/wms:Name/text()",
127
+ namespaces=namespaces,
128
+ ) == ["layer1a", "layer1b"]
129
+ assert xml.xpath(
130
+ "//wms:Capability/wms:Layer/wms:Layer[2]/wms:Layer/wms:Name/text()",
131
+ namespaces=namespaces,
132
+ ) == ["layer2a", "layer2b"]
133
+ assert xml.xpath(
134
+ "//wms:Capability/wms:Layer/wms:Layer[2]/wms:Layer/wms:Layer[1]/wms:Name/text()",
135
+ namespaces=namespaces,
136
+ ) == ["layer2b1"]
137
+
138
+ def test_100_capa(self, app):
139
+ resp = app.get("/service?request=GetCapabilities&service=WMS&wmtver=1.0.0")
140
+ xml = resp.lxml
141
+ assert is_100_capa(xml)
142
+ self._check_layernames(xml)
143
+
144
+ def test_110_capa(self, app):
145
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.1.0")
146
+ xml = resp.lxml
147
+ assert is_110_capa(xml)
148
+ self._check_layernames(xml)
149
+
150
+ def test_111_capa(self, app):
151
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.1.1")
152
+ xml = resp.lxml
153
+ assert is_111_capa(xml)
154
+ self._check_layernames(xml)
155
+
156
+ def test_130_capa(self, app):
157
+ resp = app.get("/service?request=GetCapabilities&service=WMS&version=1.3.0")
158
+ xml = resp.lxml
159
+ assert is_130_capa(xml)
160
+ self._check_layernames_with_namespace(xml, ns130)