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,308 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from __future__ import division
17
+
18
+ from io import BytesIO
19
+
20
+ import pytest
21
+ import json
22
+
23
+ from mapproxy.compat.image import Image
24
+ from mapproxy.request.wms import (
25
+ WMS111MapRequest,
26
+ WMS111CapabilitiesRequest,
27
+ WMS130CapabilitiesRequest,
28
+ WMS111LegendGraphicRequest,
29
+ WMS130LegendGraphicRequest,
30
+ )
31
+
32
+ from mapproxy.test.image import is_png, tmp_image
33
+ from mapproxy.test.helper import validate_with_dtd, validate_with_xsd
34
+ from mapproxy.test.http import mock_httpd
35
+ from mapproxy.test.system import SysTest
36
+ from mapproxy.test.system.test_wms import is_111_capa, assert_xpath_wms130, ns130
37
+
38
+
39
+ @pytest.fixture(scope="module")
40
+ def config_file():
41
+ return "legendgraphic.yaml"
42
+
43
+
44
+ def is_130_capa(xml):
45
+ return validate_with_xsd(xml, xsd_name="sld/1.1.0/sld_capabilities.xsd")
46
+
47
+
48
+ class TestWMSLegendgraphic(SysTest):
49
+
50
+ # we use a class scoped cache_dir as tests build up on each other
51
+ @pytest.fixture(scope="class")
52
+ def cache_dir(self, base_dir):
53
+ return base_dir.join("cache_data")
54
+
55
+ def setup(self):
56
+ self.common_req = WMS111MapRequest(
57
+ url="/service?", param=dict(service="WMS", version="1.1.1")
58
+ )
59
+ self.common_lg_req_111 = WMS111LegendGraphicRequest(
60
+ url="/service?",
61
+ param=dict(format="image/png", layer="wms_legend", sld_version="1.1.0"),
62
+ )
63
+ self.common_lg_req_130 = WMS130LegendGraphicRequest(
64
+ url="/service?",
65
+ param=dict(format="image/png", layer="wms_legend", sld_version="1.1.0"),
66
+ )
67
+
68
+ # test_00, test_01, test_02 need to run first in order to run the other tests properly
69
+ def test_00_get_legendgraphic_multiple_sources_111(self, app):
70
+ self.common_lg_req_111.params["layer"] = "wms_mult_sources"
71
+ with tmp_image((256, 256), format="png") as img:
72
+ img_data = img.read()
73
+ expected_req1 = (
74
+ {
75
+ "path": r"/service?LAYER=foo&SERVICE=WMS&FORMAT=image%2Fpng"
76
+ "&REQUEST=GetLegendGraphic&"
77
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
78
+ },
79
+ {"body": img_data, "headers": {"content-type": "image/png"}},
80
+ )
81
+ expected_req2 = (
82
+ {
83
+ "path": r"/service?LAYER=bar&SERVICE=WMS&FORMAT=image%2Fpng"
84
+ "&REQUEST=GetLegendGraphic&"
85
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
86
+ },
87
+ {"body": img_data, "headers": {"content-type": "image/png"}},
88
+ )
89
+ expected_req3 = (
90
+ {
91
+ "path": r"/service?LAYER=spam&SERVICE=WMS&FORMAT=image%2Fpng"
92
+ "&REQUEST=GetLegendGraphic&"
93
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
94
+ },
95
+ {"body": img_data, "headers": {"content-type": "image/png"}},
96
+ )
97
+ with mock_httpd(
98
+ ("localhost", 42423), [expected_req1, expected_req2, expected_req3]
99
+ ):
100
+ resp = app.get(self.common_lg_req_111)
101
+ assert resp.content_type == "image/png"
102
+ data = BytesIO(resp.body)
103
+ assert is_png(data)
104
+ assert Image.open(data).size == (256, 768)
105
+
106
+ def test_01_get_legendgraphic_source_static_url(self, app):
107
+ self.common_lg_req_111.params["layer"] = "wms_source_static_url"
108
+ with tmp_image((256, 256), format="png") as img:
109
+ img_data = img.read()
110
+ expected_req1 = (
111
+ {"path": r"/staticlegend_source.png"},
112
+ {"body": img_data, "headers": {"content-type": "image/png"}},
113
+ )
114
+ with mock_httpd(("localhost", 42423), [expected_req1]):
115
+ resp = app.get(self.common_lg_req_111)
116
+ assert resp.content_type == "image/png"
117
+ data = BytesIO(resp.body)
118
+ assert is_png(data)
119
+ assert Image.open(data).size == (256, 256)
120
+
121
+ def test_02_get_legendgraphic_layer_static_url(self, app):
122
+ self.common_lg_req_111.params["layer"] = "wms_layer_static_url"
123
+ with tmp_image((256, 256), format="png") as img:
124
+ img_data = img.read()
125
+ expected_req1 = (
126
+ {"path": r"/staticlegend_layer.png"},
127
+ {"body": img_data, "headers": {"content-type": "image/png"}},
128
+ )
129
+ with mock_httpd(("localhost", 42423), [expected_req1]):
130
+ resp = app.get(self.common_lg_req_111)
131
+ assert resp.content_type == "image/png"
132
+ data = BytesIO(resp.body)
133
+ assert is_png(data)
134
+ assert Image.open(data).size == (256, 256)
135
+
136
+ def test_capabilities_111(self, app):
137
+ req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
138
+ self.common_req
139
+ )
140
+ resp = app.get(req)
141
+ xml = resp.lxml
142
+ assert xml.xpath("//Request/GetLegendGraphic")[0].tag == "GetLegendGraphic"
143
+ legend_sizes = (
144
+ xml.xpath("//Layer/Style/LegendURL/@width"),
145
+ xml.xpath("//Layer/Style/LegendURL/@height"),
146
+ )
147
+ assert legend_sizes == (
148
+ ["256", "256", "256", "256"],
149
+ ["512", "768", "256", "256"],
150
+ )
151
+ layer_urls = xml.xpath(
152
+ "//Layer/Style/LegendURL/OnlineResource/@xlink:href", namespaces=ns130
153
+ )
154
+ for layer_url in layer_urls:
155
+ assert layer_url.startswith("http://")
156
+ assert "GetLegendGraphic" in layer_url
157
+ assert is_111_capa(xml)
158
+
159
+ def test_capabilities_130(self, app):
160
+ req = WMS130CapabilitiesRequest(url="/service?").copy_with_request_params(
161
+ self.common_req
162
+ )
163
+ resp = app.get(req)
164
+ xml = resp.lxml
165
+ assert xml.xpath("//wms:Request/sld:GetLegendGraphic", namespaces=ns130)[
166
+ 0
167
+ ].tag == "{%s}GetLegendGraphic" % (ns130["sld"])
168
+ layer_urls = xml.xpath(
169
+ "//Layer/Style/LegendURL/OnlineResource/@xlink:href", namespaces=ns130
170
+ )
171
+ for layer_url in layer_urls:
172
+ assert layer_url.startswith("http://")
173
+ assert "GetLegendGraphic" in layer_url
174
+ assert is_130_capa(xml)
175
+
176
+ def test_get_legendgraphic_111(self, app):
177
+ self.common_lg_req_111.params["scale"] = "5.0"
178
+ with tmp_image((256, 256), format="png") as img:
179
+ img_data = img.read()
180
+ expected_req1 = (
181
+ {
182
+ "path": r"/service?LAYER=foo&SERVICE=WMS&FORMAT=image%2Fpng"
183
+ "&REQUEST=GetLegendGraphic&SCALE=5.0&"
184
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
185
+ },
186
+ {"body": img_data, "headers": {"content-type": "image/png"}},
187
+ )
188
+ expected_req2 = (
189
+ {
190
+ "path": r"/service?LAYER=bar&SERVICE=WMS&FORMAT=image%2Fpng"
191
+ "&REQUEST=GetLegendGraphic&SCALE=5.0&"
192
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
193
+ },
194
+ {"body": img_data, "headers": {"content-type": "image/png"}},
195
+ )
196
+ with mock_httpd(("localhost", 42423), [expected_req1, expected_req2]):
197
+ resp = app.get(self.common_lg_req_111)
198
+ assert resp.content_type == "image/png"
199
+ data = BytesIO(resp.body)
200
+ assert is_png(data)
201
+ assert Image.open(data).size == (256, 512)
202
+
203
+ def test_get_legendgraphic_no_legend_111(self, app):
204
+ self.common_lg_req_111.params["layer"] = "wms_no_legend"
205
+ resp = app.get(self.common_lg_req_111)
206
+ assert resp.content_type == "application/vnd.ogc.se_xml"
207
+ xml = resp.lxml
208
+ assert (
209
+ "wms_no_legend has no legend graphic"
210
+ in xml.xpath("//ServiceException/text()")[0]
211
+ )
212
+ assert validate_with_dtd(xml, "wms/1.1.1/exception_1_1_1.dtd")
213
+
214
+ def test_get_legendgraphic_missing_params_111(self, app):
215
+ req = (
216
+ str(self.common_lg_req_111)
217
+ .replace("sld_version", "invalid")
218
+ .replace("format", "invalid")
219
+ )
220
+ resp = app.get(req)
221
+ assert resp.content_type == "application/vnd.ogc.se_xml"
222
+ xml = resp.lxml
223
+ assert "missing parameters" in xml.xpath("//ServiceException/text()")[0]
224
+ assert validate_with_dtd(xml, "wms/1.1.1/exception_1_1_1.dtd")
225
+
226
+ def test_get_legendgraphic_invalid_sld_version_111(self, app):
227
+ req = str(self.common_lg_req_111).replace(
228
+ "sld_version=1.1.0", "sld_version=1.0.0"
229
+ )
230
+ resp = app.get(req)
231
+ assert resp.content_type == "application/vnd.ogc.se_xml"
232
+ xml = resp.lxml
233
+ assert "invalid sld_version" in xml.xpath("//ServiceException/text()")[0]
234
+ assert validate_with_dtd(xml, "wms/1.1.1/exception_1_1_1.dtd")
235
+
236
+ def test_get_legendgraphic_no_legend_130(self, app):
237
+ self.common_lg_req_130.params["layer"] = "wms_no_legend"
238
+ resp = app.get(self.common_lg_req_130)
239
+ assert resp.content_type == "text/xml"
240
+ xml = resp.lxml
241
+ assert_xpath_wms130(xml, "/ogc:ServiceExceptionReport/@version", "1.3.0")
242
+ assert_xpath_wms130(
243
+ xml,
244
+ "//ogc:ServiceException/text()",
245
+ "layer wms_no_legend has no legend graphic",
246
+ )
247
+ assert validate_with_xsd(xml, xsd_name="wms/1.3.0/exceptions_1_3_0.xsd")
248
+
249
+ def test_get_legendgraphic_missing_params_130(self, app):
250
+ req = str(self.common_lg_req_130).replace("format", "invalid")
251
+ resp = app.get(req)
252
+ assert resp.content_type == "text/xml"
253
+ xml = resp.lxml
254
+ assert_xpath_wms130(xml, "/ogc:ServiceExceptionReport/@version", "1.3.0")
255
+ assert_xpath_wms130(
256
+ xml, "//ogc:ServiceException/text()", "missing parameters ['format']"
257
+ )
258
+ assert validate_with_xsd(xml, xsd_name="wms/1.3.0/exceptions_1_3_0.xsd")
259
+
260
+ def test_get_legendgraphic_invalid_sld_version_130(self, app):
261
+ req = str(self.common_lg_req_130).replace(
262
+ "sld_version=1.1.0", "sld_version=1.0.0"
263
+ )
264
+ resp = app.get(req)
265
+ assert resp.content_type == "text/xml"
266
+ xml = resp.lxml
267
+ assert_xpath_wms130(xml, "/ogc:ServiceExceptionReport/@version", "1.3.0")
268
+ assert_xpath_wms130(
269
+ xml, "//ogc:ServiceException/text()", "invalid sld_version 1.0.0"
270
+ )
271
+ assert validate_with_xsd(xml, xsd_name="wms/1.3.0/exceptions_1_3_0.xsd")
272
+
273
+ def test_get_legendgraphic_json_single_source_multiple_sub_layers(self, app):
274
+ """
275
+ this.common_lg_req_130 request fetches layer 'wms_legend'
276
+ layer 'wms_legend' contains:
277
+ - single source 'legend_cache'
278
+ - multiple sub layers: 'foo' and 'bar'
279
+ - see also 'test/system/fixture/legendgraphic.yaml'
280
+ """
281
+ self.common_lg_req_130.params["format"] = "application/json"
282
+ json_data_foo = "{\"Legend\": [{\"layerName\": \"foo\"}]}"
283
+ json_data_bar = "{\"Legend\": [{\"layerName\": \"bar\"}]}"
284
+ expected_req1 = (
285
+ {
286
+ "path": r"/service?LAYER=foo&SERVICE=WMS&FORMAT=application%2Fjson"
287
+ "&REQUEST=GetLegendGraphic&"
288
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
289
+ },
290
+ {"body": json_data_foo.encode(), "headers": {"content-type": "application/json"}},
291
+ )
292
+ expected_req2 = (
293
+ {
294
+ "path": r"/service?LAYER=bar&SERVICE=WMS&FORMAT=application%2Fjson"
295
+ "&REQUEST=GetLegendGraphic&"
296
+ "&VERSION=1.1.1&SLD_VERSION=1.1.0"
297
+ },
298
+ {"body": json_data_bar.encode(), "headers": {"content-type": "application/json"}},
299
+ )
300
+ with mock_httpd(
301
+ ("localhost", 42423), [expected_req1, expected_req2]
302
+ ):
303
+ resp = app.get(self.common_lg_req_130)
304
+ assert resp.content_type == "application/json"
305
+ json_str = resp.body.decode("utf-8")
306
+ json_data = json.loads(json_str)
307
+ assert json_data['Legend'][0]['layerName'] == 'foo'
308
+ assert json_data['Legend'][1]['layerName'] == 'bar'
@@ -0,0 +1,161 @@
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
+ from io import BytesIO
19
+
20
+ import pytest
21
+
22
+ from mapproxy.compat.image import Image
23
+ from mapproxy.test.system import SysTest
24
+
25
+
26
+ has_mapnik = True
27
+ try:
28
+ import mapnik
29
+ except ImportError:
30
+ try:
31
+ import mapnik2 as mapnik
32
+ except ImportError:
33
+ has_mapnik = False
34
+
35
+
36
+ mapnik_xml = (
37
+ b"""
38
+ <?xml version="1.0"?>
39
+ <!DOCTYPE Map>
40
+ <Map background-color="#ff0000" bgcolor="#ff0000" srs="+proj=latlong +datum=WGS84">
41
+ <Layer name="marker">
42
+ <StyleName>marker</StyleName>
43
+ <Datasource>
44
+ <Parameter name="type">ogr</Parameter>
45
+ <Parameter name="file">test_point.geojson</Parameter>
46
+ <Parameter name="layer">OGRGeoJSON</Parameter>
47
+ </Datasource>
48
+ </Layer>
49
+ <Style name="marker">
50
+ <Rule>
51
+ <MarkersSymbolizer fill="transparent" width="10" height="10" stroke="black" stroke-width="3" placement="point" marker-type="ellipse"/>
52
+ </Rule>
53
+ </Style>
54
+ </Map>
55
+ """.strip()
56
+ )
57
+
58
+ test_point_geojson = (
59
+ b"""
60
+ {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-45, -45]}, "properties": {}}
61
+ """.strip()
62
+ )
63
+
64
+ mapnik_transp_xml = (
65
+ b"""
66
+ <?xml version="1.0"?>
67
+ <!DOCTYPE Map>
68
+ <Map background-color="transparent" srs="+proj=latlong +datum=WGS84">
69
+ </Map>
70
+ """.strip()
71
+ )
72
+
73
+
74
+ @pytest.mark.skipif(not has_mapnik, reason="requires mapnik")
75
+ class TestMapnikSource(SysTest):
76
+
77
+ @pytest.fixture(scope="class")
78
+ def config_file(self):
79
+ return "mapnik_source.yaml"
80
+
81
+ @pytest.fixture(scope="class")
82
+ def additional_files(self, base_dir):
83
+ base_dir.join("test_point.geojson").write_binary(test_point_geojson)
84
+ base_dir.join("mapnik.xml").write_binary(mapnik_xml)
85
+ base_dir.join("mapnik-transparent.xml").write_binary(mapnik_transp_xml)
86
+
87
+ def test_get_map(self, app):
88
+ req = (
89
+ r"/service?LAYERs=mapnik&SERVICE=WMS&FORMAT=image%2Fpng"
90
+ "&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
91
+ "&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
92
+ "&WIDTH=200&"
93
+ )
94
+
95
+ resp = app.get(req)
96
+ data = BytesIO(resp.body)
97
+ img = Image.open(data)
98
+ colors = sorted(img.getcolors(), reverse=True)
99
+ # map bg color + black marker
100
+ assert 39700 < colors[0][0] < 39900, colors[0][0]
101
+ assert colors[0][1] == (255, 0, 0, 255)
102
+ assert 50 < colors[1][0] < 150, colors[1][0]
103
+ assert colors[1][1] == (0, 0, 0, 255)
104
+
105
+ def test_get_map_hq(self, app):
106
+ req = (
107
+ r"/service?LAYERs=mapnik_hq&SERVICE=WMS&FORMAT=image%2Fpng"
108
+ "&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
109
+ "&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
110
+ "&WIDTH=200&"
111
+ )
112
+
113
+ resp = app.get(req)
114
+ data = BytesIO(resp.body)
115
+ img = Image.open(data)
116
+ colors = sorted(img.getcolors(), reverse=True)
117
+ # map bg color + black marker (like above, but marker is scaled up)
118
+ assert 39500 < colors[0][0] < 39600, colors[0][0]
119
+ assert colors[0][1] == (255, 0, 0, 255)
120
+ assert 250 < colors[1][0] < 350, colors[1][0]
121
+ assert colors[1][1] == (0, 0, 0, 255)
122
+
123
+ def test_get_map_outside_coverage(self, app):
124
+ req = (
125
+ r"/service?LAYERs=mapnik&SERVICE=WMS&FORMAT=image%2Fpng"
126
+ "&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
127
+ "&VERSION=1.1.1&BBOX=-175,-85,-172,-82&styles="
128
+ "&WIDTH=200&&BGCOLOR=0x00ff00"
129
+ )
130
+
131
+ resp = app.get(req)
132
+ data = BytesIO(resp.body)
133
+ img = Image.open(data)
134
+ colors = sorted(img.getcolors(), reverse=True)
135
+ # wms request bg color
136
+ assert colors[0] == (40000, (0, 255, 0))
137
+
138
+ def test_get_map_unknown_file(self, app):
139
+ req = (
140
+ r"/service?LAYERs=mapnik_unknown&SERVICE=WMS&FORMAT=image%2Fpng"
141
+ "&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
142
+ "&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
143
+ "&WIDTH=200&&BGCOLOR=0x00ff00"
144
+ )
145
+
146
+ resp = app.get(req)
147
+ assert "unknown.xml" in resp.body, resp.body
148
+
149
+ def test_get_map_transparent(self, app):
150
+ req = (
151
+ r"/service?LAYERs=mapnik_transparent&SERVICE=WMS&FORMAT=image%2Fpng"
152
+ "&REQUEST=GetMap&HEIGHT=200&SRS=EPSG%3A4326"
153
+ "&VERSION=1.1.1&BBOX=-90,-90,0,0&styles="
154
+ "&WIDTH=200&transparent=True"
155
+ )
156
+
157
+ resp = app.get(req)
158
+ data = BytesIO(resp.body)
159
+ img = Image.open(data)
160
+ colors = sorted(img.getcolors(), reverse=True)
161
+ assert colors[0] == (40000, (0, 0, 0, 0))
@@ -0,0 +1,81 @@
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 sys
20
+ import stat
21
+ import shutil
22
+
23
+ from io import BytesIO
24
+
25
+ import pytest
26
+
27
+ from mapproxy.request.wms import WMS111MapRequest
28
+ from mapproxy.compat.image import Image
29
+ from mapproxy.test.image import is_png
30
+ from mapproxy.test.system import SysTest
31
+
32
+
33
+ pytestmark = pytest.mark.skipif(
34
+ sys.platform == "win32", reason="CGI tests not ported for Windows"
35
+ )
36
+
37
+ @pytest.fixture(scope="module")
38
+ def config_file():
39
+ return "mapserver.yaml"
40
+
41
+ @pytest.mark.skipif(sys.version_info < (3, 0), reason="tests skipped for python 2")
42
+ class TestMapServerCGI(SysTest):
43
+
44
+ @pytest.fixture(scope="class")
45
+ def additional_files(self, base_dir):
46
+ shutil.copy(
47
+ os.path.join(os.path.dirname(__file__), "fixture", "minimal_cgi.py"),
48
+ base_dir.strpath,
49
+ )
50
+
51
+ os.chmod(
52
+ base_dir.join("minimal_cgi.py").strpath, stat.S_IXUSR | stat.S_IRUSR | stat.S_IWUSR
53
+ )
54
+
55
+ base_dir.join("tmp").mkdir()
56
+
57
+ def setup(self):
58
+ self.common_map_req = WMS111MapRequest(
59
+ url="/service?",
60
+ param=dict(
61
+ service="WMS",
62
+ version="1.1.1",
63
+ bbox="-180,0,0,80",
64
+ width="200",
65
+ height="200",
66
+ layers="ms",
67
+ srs="EPSG:4326",
68
+ format="image/png",
69
+ styles="",
70
+ request="GetMap",
71
+ ),
72
+ )
73
+
74
+ def test_get_map(self, app):
75
+ resp = app.get(self.common_map_req)
76
+ assert resp.content_type == "image/png"
77
+ data = BytesIO(resp.body)
78
+ assert is_png(data)
79
+ img = Image.open(data)
80
+ img = img.convert("RGB")
81
+ assert img.getcolors() == [(200 * 200, (255, 0, 0))]