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,304 @@
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 json
17
+
18
+ import pytest
19
+
20
+ from mapproxy.test.image import img_from_buf
21
+ from mapproxy.test.http import mock_single_req_httpd
22
+ from mapproxy.test.system import SysTest
23
+ from mapproxy.request.wms import (
24
+ WMS111MapRequest,
25
+ WMS111FeatureInfoRequest,
26
+ WMS111CapabilitiesRequest,
27
+ )
28
+ from mapproxy.test.helper import validate_with_dtd
29
+ from mapproxy.test.http import mock_httpd
30
+ from mapproxy.test.image import create_tmp_image
31
+ from mapproxy.test.system.test_wms import is_111_exception
32
+ from mapproxy.cache.renderd import has_renderd_support
33
+
34
+
35
+ @pytest.fixture(scope="module")
36
+ def config_file():
37
+ return "renderd_client.yaml"
38
+
39
+
40
+ pytestmark = pytest.mark.skipif(not has_renderd_support(), reason="requests required")
41
+
42
+ try:
43
+ from http.server import BaseHTTPRequestHandler
44
+ except ImportError:
45
+ from BaseHTTPServer import BaseHTTPRequestHandler
46
+
47
+
48
+ class TestWMS111(SysTest):
49
+
50
+ def setup(self):
51
+ self.common_req = WMS111MapRequest(
52
+ url="/service?", param=dict(service="WMS", version="1.1.1")
53
+ )
54
+ self.common_map_req = WMS111MapRequest(
55
+ url="/service?",
56
+ param=dict(
57
+ service="WMS",
58
+ version="1.1.1",
59
+ bbox="-180,0,0,80",
60
+ width="200",
61
+ height="200",
62
+ layers="wms_cache",
63
+ srs="EPSG:4326",
64
+ format="image/png",
65
+ exceptions="xml",
66
+ styles="",
67
+ request="GetMap",
68
+ ),
69
+ )
70
+ self.common_fi_req = WMS111FeatureInfoRequest(
71
+ url="/service?",
72
+ param=dict(
73
+ x="10",
74
+ y="20",
75
+ width="200",
76
+ height="200",
77
+ layers="wms_cache",
78
+ format="image/png",
79
+ query_layers="wms_cache",
80
+ styles="",
81
+ bbox="1000,400,2000,1400",
82
+ srs="EPSG:900913",
83
+ ),
84
+ )
85
+
86
+ def test_wms_capabilities(self, app):
87
+ req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
88
+ self.common_req
89
+ )
90
+ resp = app.get(req)
91
+ assert resp.content_type == "application/vnd.ogc.wms_xml"
92
+ xml = resp.lxml
93
+ assert (
94
+ xml.xpath(
95
+ "//GetMap//OnlineResource/@xlink:href",
96
+ namespaces=dict(xlink="http://www.w3.org/1999/xlink"),
97
+ )[0]
98
+ == "http://localhost/service?"
99
+ )
100
+
101
+ layer_names = set(xml.xpath("//Layer/Layer/Name/text()"))
102
+ expected_names = set(["direct", "wms_cache", "tms_cache"])
103
+ assert layer_names == expected_names
104
+ assert validate_with_dtd(xml, dtd_name="wms/1.1.1/WMS_MS_Capabilities.dtd")
105
+
106
+ def test_get_map(self, app, cache_dir):
107
+
108
+ class req_handler(BaseHTTPRequestHandler):
109
+
110
+ def do_POST(self):
111
+ length = int(self.headers["content-length"])
112
+ json_data = self.rfile.read(length)
113
+ task = json.loads(json_data.decode("utf-8"))
114
+ assert task["command"] == "tile"
115
+ # request main tile of metatile
116
+ assert task["tiles"] == [[15, 17, 5]]
117
+ assert task["cache_identifier"] == "wms_cache_GLOBAL_MERCATOR"
118
+ assert task["priority"] == 100
119
+ # this id should not change for the same tile/cache_identifier combination
120
+ assert task["id"] == "aeb52b506e4e82d0a1edf649d56e0451cfd5862c"
121
+
122
+ # manually create tile renderd should create
123
+ cache_dir.join(
124
+ "wms_cache_EPSG900913/05/000/000/016/000/000/016.jpeg"
125
+ ).write_binary(
126
+ create_tmp_image((256, 256), format="jpeg", color=(255, 0, 100)),
127
+ ensure=True,
128
+ )
129
+
130
+ self.send_response(200)
131
+ self.send_header("Content-type", "application/json")
132
+ self.end_headers()
133
+ self.wfile.write(b'{"status": "ok"}')
134
+
135
+ def log_request(self, code, size=None):
136
+ pass
137
+
138
+ with mock_single_req_httpd(("localhost", 42423), req_handler):
139
+ self.common_map_req.params["bbox"] = "0,0,9,9"
140
+ resp = app.get(self.common_map_req)
141
+
142
+ img = img_from_buf(resp.body)
143
+ main_color = sorted(img.convert("RGBA").getcolors())[-1]
144
+ # check for red color (jpeg/png conversion requires fuzzy comparision)
145
+ assert main_color[0] == 40000
146
+ assert main_color[1][0] > 250
147
+ assert main_color[1][1] < 5
148
+ assert 95 < main_color[1][2] < 105
149
+ assert main_color[1][3] == 255
150
+
151
+ assert resp.content_type == "image/png"
152
+ assert cache_dir.join(
153
+ "wms_cache_EPSG900913/05/000/000/016/000/000/016.jpeg"
154
+ ).check()
155
+
156
+ def test_get_map_error(self, app):
157
+
158
+ class req_handler(BaseHTTPRequestHandler):
159
+
160
+ def do_POST(self):
161
+ length = int(self.headers["content-length"])
162
+ json_data = self.rfile.read(length)
163
+ task = json.loads(json_data.decode("utf-8"))
164
+ assert task["command"] == "tile"
165
+ # request main tile of metatile
166
+ assert task["tiles"] == [[15, 17, 5]]
167
+ assert task["cache_identifier"] == "wms_cache_GLOBAL_MERCATOR"
168
+ assert task["priority"] == 100
169
+ # this id should not change for the same tile/cache_identifier combination
170
+ assert task["id"] == "aeb52b506e4e82d0a1edf649d56e0451cfd5862c"
171
+
172
+ self.send_response(200)
173
+ self.send_header("Content-type", "application/json")
174
+ self.end_headers()
175
+ self.wfile.write(b'{"status": "error", "error_message": "barf"}')
176
+
177
+ def log_request(self, code, size=None):
178
+ pass
179
+
180
+ with mock_single_req_httpd(("localhost", 42423), req_handler):
181
+ self.common_map_req.params["bbox"] = "0,0,9,9"
182
+ resp = app.get(self.common_map_req)
183
+
184
+ assert resp.content_type == "application/vnd.ogc.se_xml"
185
+ is_111_exception(resp.lxml, re_msg="Error from renderd: barf")
186
+
187
+ def test_get_map_connection_error(self, app):
188
+ self.common_map_req.params["bbox"] = "0,0,9,9"
189
+ resp = app.get(self.common_map_req)
190
+
191
+ assert resp.content_type == "application/vnd.ogc.se_xml"
192
+ is_111_exception(resp.lxml, re_msg="Error while communicating with renderd:")
193
+
194
+ def test_get_map_non_json_response(self, app):
195
+
196
+ class req_handler(BaseHTTPRequestHandler):
197
+
198
+ def do_POST(self):
199
+ length = int(self.headers["content-length"])
200
+ json_data = self.rfile.read(length)
201
+ json.loads(json_data.decode("utf-8"))
202
+
203
+ self.send_response(200)
204
+ self.send_header("Content-type", "application/json")
205
+ self.end_headers()
206
+ self.wfile.write(b'{"invalid')
207
+
208
+ def log_request(self, code, size=None):
209
+ pass
210
+
211
+ with mock_single_req_httpd(("localhost", 42423), req_handler):
212
+ self.common_map_req.params["bbox"] = "0,0,9,9"
213
+ resp = app.get(self.common_map_req)
214
+
215
+ assert resp.content_type == "application/vnd.ogc.se_xml"
216
+ is_111_exception(
217
+ resp.lxml, re_msg="Error while communicating with renderd: invalid JSON"
218
+ )
219
+
220
+ def test_get_featureinfo(self, app):
221
+ expected_req = (
222
+ {
223
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fpng"
224
+ "&REQUEST=GetFeatureInfo&HEIGHT=200&SRS=EPSG%3A900913"
225
+ "&VERSION=1.1.1&BBOX=1000.0,400.0,2000.0,1400.0&styles="
226
+ "&WIDTH=200&QUERY_LAYERS=foo,bar&X=10&Y=20&feature_count=100"
227
+ },
228
+ {"body": b"info", "headers": {"content-type": "text/plain"}},
229
+ )
230
+ with mock_httpd(("localhost", 42423), [expected_req]):
231
+ self.common_fi_req.params["feature_count"] = 100
232
+ resp = app.get(self.common_fi_req)
233
+ assert resp.content_type == "text/plain"
234
+ assert resp.body == b"info"
235
+
236
+
237
+ class TestTiles(SysTest):
238
+
239
+ def test_get_tile(self, app, cache_dir):
240
+
241
+ class req_handler(BaseHTTPRequestHandler):
242
+
243
+ def do_POST(self):
244
+ length = int(self.headers["content-length"])
245
+ json_data = self.rfile.read(length)
246
+ task = json.loads(json_data.decode("utf-8"))
247
+ assert task["command"] == "tile"
248
+ assert task["tiles"] == [[10, 20, 6]]
249
+ assert task["cache_identifier"] == "tms_cache_GLOBAL_MERCATOR"
250
+ assert task["priority"] == 100
251
+ # this id should not change for the same tile/cache_identifier combination
252
+ assert task["id"] == "cf35c1c927158e188d8fbe0db380c1772b536da9"
253
+
254
+ # manually create tile renderd should create
255
+ cache_dir.join(
256
+ "tms_cache_EPSG900913/06/000/000/010/000/000/020.png"
257
+ ).write_binary(b"foobaz", ensure=True)
258
+
259
+ self.send_response(200)
260
+ self.send_header("Content-type", "application/json")
261
+ self.end_headers()
262
+ self.wfile.write(b'{"status": "ok"}')
263
+
264
+ def log_request(self, code, size=None):
265
+ pass
266
+
267
+ with mock_single_req_httpd(("localhost", 42423), req_handler):
268
+ resp = app.get("/tiles/tms_cache/EPSG900913/6/10/20.png")
269
+
270
+ assert resp.content_type == "image/png"
271
+ assert resp.body == b"foobaz"
272
+ assert cache_dir.join(
273
+ "tms_cache_EPSG900913/06/000/000/010/000/000/020.png"
274
+ ).check()
275
+
276
+ def test_get_tile_error(self, app):
277
+
278
+ class req_handler(BaseHTTPRequestHandler):
279
+
280
+ def do_POST(self):
281
+ length = int(self.headers["content-length"])
282
+ json_data = self.rfile.read(length)
283
+ task = json.loads(json_data.decode("utf-8"))
284
+ assert task["command"] == "tile"
285
+ assert task["tiles"] == [[10, 20, 7]]
286
+ assert task["cache_identifier"] == "tms_cache_GLOBAL_MERCATOR"
287
+ assert task["priority"] == 100
288
+ # this id should not change for the same tile/cache_identifier combination
289
+ assert task["id"] == "c24b8c3247afec34fd0a53e5d3706e977877ef47"
290
+
291
+ self.send_response(200)
292
+ self.send_header("Content-type", "application/json")
293
+ self.end_headers()
294
+ self.wfile.write(
295
+ b'{"status": "error", "error_message": "you told me to fail"}'
296
+ )
297
+
298
+ def log_request(self, code, size=None):
299
+ pass
300
+
301
+ with mock_single_req_httpd(("localhost", 42423), req_handler):
302
+ resp = app.get("/tiles/tms_cache/EPSG900913/7/10/20.png", status=500)
303
+ assert resp.content_type == "text/plain"
304
+ assert resp.body == b"Error from renderd: you told me to fail"
@@ -0,0 +1,54 @@
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 TestResponseHeaders(SysTest):
24
+ """
25
+ Check if the vary header is set for text / xml content like capabilities
26
+ """
27
+ @pytest.fixture(scope='class')
28
+ def config_file(self):
29
+ return 'auth.yaml'
30
+
31
+ def test_tms(self, app):
32
+ resp = app.get('http://localhost/tms')
33
+ assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
34
+
35
+ def test_wms(self, app):
36
+ resp = app.get('http://localhost/service?SERVICE=WMS&REQUEST=GetCapabilities'
37
+ '&VERSION=1.1.0')
38
+ assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
39
+
40
+ def test_wmts(self, app):
41
+ resp = app.get('http://localhost/service?SERVICE=WMTS&REQUEST=GetCapabilities')
42
+ assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
43
+
44
+ def test_restful_wmts(self, app):
45
+ resp = app.get('http://localhost/wmts/1.0.0/WMTSCapabilities.xml')
46
+ assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
47
+
48
+ def test_no_endpoint(self, app):
49
+ resp = app.get('http://localhost/service?')
50
+ assert resp.vary == ('X-Script-Name', 'X-Forwarded-Host', 'X-Forwarded-Proto')
51
+
52
+ def test_image_response(self, app):
53
+ resp = app.get('http://localhost/tms/1.0.0/layer1a/EPSG900913/0/0/0.png')
54
+ assert resp.vary == None
@@ -0,0 +1,140 @@
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
+ import math
18
+
19
+ import pytest
20
+
21
+ from mapproxy.request.wms import (
22
+ WMS111MapRequest,
23
+ WMS111CapabilitiesRequest,
24
+ WMS130CapabilitiesRequest,
25
+ )
26
+
27
+ from mapproxy.test.system import SysTest
28
+ from mapproxy.test.image import is_png, is_transparent, tmp_image
29
+ from mapproxy.test.http import mock_httpd
30
+ from mapproxy.test.system.test_wms import is_111_capa, is_130_capa, ns130
31
+
32
+
33
+ @pytest.fixture(scope="module")
34
+ def config_file():
35
+ return "scalehints.yaml"
36
+
37
+
38
+ def diagonal_res_to_pixel_res(res):
39
+ """
40
+ >>> '%.2f' % round(diagonal_res_to_pixel_res(14.14214), 4)
41
+ '10.00'
42
+ """
43
+ return math.sqrt((float(res) ** 2) / 2)
44
+
45
+
46
+ class TestWMS(SysTest):
47
+
48
+ def setup(self):
49
+ self.common_req = WMS111MapRequest(
50
+ url="/service?", param=dict(service="WMS", version="1.1.1")
51
+ )
52
+ self.common_map_req = WMS111MapRequest(
53
+ url="/service?",
54
+ param=dict(
55
+ service="WMS",
56
+ version="1.1.1",
57
+ bbox="-180,0,0,80",
58
+ width="200",
59
+ height="200",
60
+ layers="res",
61
+ srs="EPSG:4326",
62
+ format="image/png",
63
+ transparent="true",
64
+ styles="",
65
+ request="GetMap",
66
+ ),
67
+ )
68
+
69
+ def test_capabilities_111(self, app):
70
+ req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
71
+ self.common_req
72
+ )
73
+ resp = app.get(req)
74
+ xml = resp.lxml
75
+ assert is_111_capa(xml)
76
+ hints = xml.xpath("//Layer/Layer/ScaleHint")
77
+ assert diagonal_res_to_pixel_res(hints[0].attrib["min"]) == pytest.approx(10)
78
+ assert diagonal_res_to_pixel_res(hints[0].attrib["max"]) == pytest.approx(10000)
79
+
80
+ assert diagonal_res_to_pixel_res(hints[1].attrib["min"]) == pytest.approx(2.8)
81
+ assert diagonal_res_to_pixel_res(hints[1].attrib["max"]) == pytest.approx(280)
82
+
83
+ assert diagonal_res_to_pixel_res(hints[2].attrib["min"]) == pytest.approx(0.28)
84
+ assert diagonal_res_to_pixel_res(hints[2].attrib["max"]) == pytest.approx(2.8)
85
+
86
+ def test_capabilities_130(self, app):
87
+ req = WMS130CapabilitiesRequest(url="/service?").copy_with_request_params(
88
+ self.common_req
89
+ )
90
+ resp = app.get(req)
91
+ xml = resp.lxml
92
+ assert is_130_capa(xml)
93
+ min_scales = xml.xpath(
94
+ "//wms:Layer/wms:Layer/wms:MinScaleDenominator/text()", namespaces=ns130
95
+ )
96
+ max_scales = xml.xpath(
97
+ "//wms:Layer/wms:Layer/wms:MaxScaleDenominator/text()", namespaces=ns130
98
+ )
99
+
100
+ assert float(min_scales[0]) == pytest.approx(35714.28)
101
+ assert float(max_scales[0]) == pytest.approx(35714285.7)
102
+
103
+ assert float(min_scales[1]) == pytest.approx(10000)
104
+ assert float(max_scales[1]) == pytest.approx(1000000)
105
+
106
+ assert float(min_scales[2]) == pytest.approx(1000)
107
+ assert float(max_scales[2]) == pytest.approx(10000)
108
+
109
+ def test_get_map_above_res(self, app):
110
+ # no layer rendered
111
+ resp = app.get(self.common_map_req)
112
+ assert is_png(resp.body)
113
+ assert is_transparent(resp.body)
114
+
115
+ def test_get_map_mixed(self, app, cache_dir):
116
+ # only res layer matches resolution range
117
+ self.common_map_req.params["layers"] = "res,scale"
118
+ self.common_map_req.params["bbox"] = "0,0,100000,100000"
119
+ self.common_map_req.params["srs"] = "EPSG:900913"
120
+ self.common_map_req.params.size = 100, 100
121
+ with tmp_image((256, 256), format="jpeg") as img:
122
+ expected_req = (
123
+ {
124
+ "path": r"/service?LAYERs=reslayer&SERVICE=WMS&FORMAT=image%2Fjpeg"
125
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
126
+ "&VERSION=1.1.1&BBOX=0.0,0.0,156543.033928,156543.033928"
127
+ "&WIDTH=256"
128
+ },
129
+ {"body": img.read(), "headers": {"content-type": "image/png"}},
130
+ )
131
+ with mock_httpd(
132
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
133
+ ):
134
+ resp = app.get(self.common_map_req)
135
+ assert is_png(resp.body)
136
+ assert not is_transparent(resp.body)
137
+
138
+ assert cache_dir.join(
139
+ "res_cache_EPSG900913/08/000/000/128/000/000/128.jpeg"
140
+ ).check()