MapProxy 2.1.0__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 (459) hide show
  1. MapProxy-2.1.0.dist-info/AUTHORS.txt +33 -0
  2. MapProxy-2.1.0.dist-info/COPYING.txt +60 -0
  3. MapProxy-2.1.0.dist-info/LICENSE.txt +202 -0
  4. MapProxy-2.1.0.dist-info/METADATA +165 -0
  5. MapProxy-2.1.0.dist-info/RECORD +459 -0
  6. MapProxy-2.1.0.dist-info/WHEEL +5 -0
  7. MapProxy-2.1.0.dist-info/entry_points.txt +4 -0
  8. MapProxy-2.1.0.dist-info/top_level.txt +1 -0
  9. mapproxy/__init__.py +0 -0
  10. mapproxy/cache/__init__.py +36 -0
  11. mapproxy/cache/azureblob.py +145 -0
  12. mapproxy/cache/base.py +120 -0
  13. mapproxy/cache/compact.py +665 -0
  14. mapproxy/cache/couchdb.py +301 -0
  15. mapproxy/cache/dummy.py +36 -0
  16. mapproxy/cache/file.py +200 -0
  17. mapproxy/cache/geopackage.py +647 -0
  18. mapproxy/cache/legend.py +87 -0
  19. mapproxy/cache/mbtiles.py +411 -0
  20. mapproxy/cache/meta.py +80 -0
  21. mapproxy/cache/path.py +261 -0
  22. mapproxy/cache/redis.py +152 -0
  23. mapproxy/cache/renderd.py +100 -0
  24. mapproxy/cache/riak.py +206 -0
  25. mapproxy/cache/s3.py +209 -0
  26. mapproxy/cache/tile.py +736 -0
  27. mapproxy/client/__init__.py +0 -0
  28. mapproxy/client/arcgis.py +82 -0
  29. mapproxy/client/cgi.py +141 -0
  30. mapproxy/client/http.py +295 -0
  31. mapproxy/client/log.py +33 -0
  32. mapproxy/client/tile.py +158 -0
  33. mapproxy/client/wms.py +255 -0
  34. mapproxy/compat/__init__.py +0 -0
  35. mapproxy/compat/image.py +86 -0
  36. mapproxy/config/__init__.py +22 -0
  37. mapproxy/config/config-schema.json +813 -0
  38. mapproxy/config/config.py +213 -0
  39. mapproxy/config/coverage.py +108 -0
  40. mapproxy/config/defaults.py +102 -0
  41. mapproxy/config/loader.py +2399 -0
  42. mapproxy/config/spec.py +657 -0
  43. mapproxy/config/validator.py +242 -0
  44. mapproxy/config_template/__init__.py +0 -0
  45. mapproxy/config_template/base_config/config.wsgi +10 -0
  46. mapproxy/config_template/base_config/full_example.yaml +598 -0
  47. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  48. mapproxy/config_template/base_config/log.ini +35 -0
  49. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  50. mapproxy/config_template/base_config/seed.yaml +27 -0
  51. mapproxy/exception.py +149 -0
  52. mapproxy/featureinfo.py +251 -0
  53. mapproxy/grid.py +1199 -0
  54. mapproxy/image/__init__.py +549 -0
  55. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  56. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  57. mapproxy/image/fonts/LICENSE +99 -0
  58. mapproxy/image/fonts/__init__.py +0 -0
  59. mapproxy/image/mask.py +79 -0
  60. mapproxy/image/merge.py +323 -0
  61. mapproxy/image/message.py +357 -0
  62. mapproxy/image/opts.py +185 -0
  63. mapproxy/image/tile.py +171 -0
  64. mapproxy/image/transform.py +350 -0
  65. mapproxy/layer.py +489 -0
  66. mapproxy/multiapp.py +230 -0
  67. mapproxy/proj.py +309 -0
  68. mapproxy/request/__init__.py +18 -0
  69. mapproxy/request/arcgis.py +268 -0
  70. mapproxy/request/base.py +466 -0
  71. mapproxy/request/tile.py +131 -0
  72. mapproxy/request/wms/__init__.py +829 -0
  73. mapproxy/request/wms/exception.py +107 -0
  74. mapproxy/request/wmts.py +442 -0
  75. mapproxy/response.py +237 -0
  76. mapproxy/script/__init__.py +0 -0
  77. mapproxy/script/conf/__init__.py +0 -0
  78. mapproxy/script/conf/app.py +222 -0
  79. mapproxy/script/conf/caches.py +44 -0
  80. mapproxy/script/conf/geopackage.py +136 -0
  81. mapproxy/script/conf/layers.py +54 -0
  82. mapproxy/script/conf/seeds.py +36 -0
  83. mapproxy/script/conf/sources.py +88 -0
  84. mapproxy/script/conf/utils.py +148 -0
  85. mapproxy/script/defrag.py +187 -0
  86. mapproxy/script/export.py +337 -0
  87. mapproxy/script/grids.py +198 -0
  88. mapproxy/script/scales.py +134 -0
  89. mapproxy/script/util.py +410 -0
  90. mapproxy/script/wms_capabilities.py +160 -0
  91. mapproxy/seed/__init__.py +0 -0
  92. mapproxy/seed/cachelock.py +127 -0
  93. mapproxy/seed/cleanup.py +191 -0
  94. mapproxy/seed/config.py +481 -0
  95. mapproxy/seed/script.py +391 -0
  96. mapproxy/seed/seeder.py +551 -0
  97. mapproxy/seed/spec.py +66 -0
  98. mapproxy/seed/util.py +266 -0
  99. mapproxy/service/__init__.py +14 -0
  100. mapproxy/service/base.py +45 -0
  101. mapproxy/service/demo.py +364 -0
  102. mapproxy/service/kml.py +333 -0
  103. mapproxy/service/ows.py +39 -0
  104. mapproxy/service/template_helper.py +55 -0
  105. mapproxy/service/templates/demo/capabilities_demo.html +18 -0
  106. mapproxy/service/templates/demo/demo.html +181 -0
  107. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  108. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  109. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  110. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  111. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  112. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  113. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  114. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  115. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  116. mapproxy/service/templates/demo/static/logo.png +0 -0
  117. mapproxy/service/templates/demo/static/ol.css +345 -0
  118. mapproxy/service/templates/demo/static/ol.js +4 -0
  119. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  120. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  121. mapproxy/service/templates/demo/static/site.css +137 -0
  122. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  123. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  124. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  125. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  126. mapproxy/service/templates/demo/static.html +34 -0
  127. mapproxy/service/templates/demo/tms_demo.html +117 -0
  128. mapproxy/service/templates/demo/wms_demo.html +144 -0
  129. mapproxy/service/templates/demo/wmts_demo.html +118 -0
  130. mapproxy/service/templates/tms_capabilities.xml +13 -0
  131. mapproxy/service/templates/tms_exception.xml +4 -0
  132. mapproxy/service/templates/tms_root_resource.xml +7 -0
  133. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  134. mapproxy/service/templates/wms100capabilities.xml +112 -0
  135. mapproxy/service/templates/wms100exception.xml +4 -0
  136. mapproxy/service/templates/wms110capabilities.xml +152 -0
  137. mapproxy/service/templates/wms110exception.xml +5 -0
  138. mapproxy/service/templates/wms111capabilities.xml +183 -0
  139. mapproxy/service/templates/wms111exception.xml +5 -0
  140. mapproxy/service/templates/wms130capabilities.xml +326 -0
  141. mapproxy/service/templates/wms130exception.xml +8 -0
  142. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  143. mapproxy/service/templates/wmts100exception.xml +9 -0
  144. mapproxy/service/tile.py +540 -0
  145. mapproxy/service/wms.py +868 -0
  146. mapproxy/service/wmts.py +387 -0
  147. mapproxy/source/__init__.py +83 -0
  148. mapproxy/source/arcgis.py +39 -0
  149. mapproxy/source/error.py +40 -0
  150. mapproxy/source/mapnik.py +262 -0
  151. mapproxy/source/tile.py +97 -0
  152. mapproxy/source/wms.py +273 -0
  153. mapproxy/srs.py +734 -0
  154. mapproxy/template.py +54 -0
  155. mapproxy/test/__init__.py +0 -0
  156. mapproxy/test/conftest.py +8 -0
  157. mapproxy/test/helper.py +255 -0
  158. mapproxy/test/http.py +511 -0
  159. mapproxy/test/image.py +219 -0
  160. mapproxy/test/mocker.py +2291 -0
  161. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  178. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  179. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  180. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  181. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  182. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  183. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  184. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  185. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  186. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  187. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  188. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  189. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  190. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  191. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  192. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  198. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  199. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  200. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  201. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  202. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  203. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  204. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  205. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  206. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  207. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  208. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  209. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  210. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  211. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  212. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  215. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  216. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  217. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  218. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  219. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  220. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  221. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  222. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  223. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  224. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  225. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  226. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  227. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  228. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  229. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  230. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  231. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  232. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  233. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  234. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  235. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  236. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  237. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  238. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  239. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  240. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  241. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  242. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  243. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  244. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  245. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  246. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  247. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  248. mapproxy/test/schemas/xml.xsd +287 -0
  249. mapproxy/test/system/__init__.py +98 -0
  250. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  251. mapproxy/test/system/fixture/auth.yaml +70 -0
  252. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  253. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  254. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  255. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  256. mapproxy/test/system/fixture/cache_coverage.yaml +84 -0
  257. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  258. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  259. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  260. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  261. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  262. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  263. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  264. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  265. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  266. mapproxy/test/system/fixture/coverage.yaml +77 -0
  267. mapproxy/test/system/fixture/demo.yaml +135 -0
  268. mapproxy/test/system/fixture/dimension.yaml +59 -0
  269. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  270. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  271. mapproxy/test/system/fixture/formats.yaml +72 -0
  272. mapproxy/test/system/fixture/inspire.yaml +101 -0
  273. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  274. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  275. mapproxy/test/system/fixture/layer.yaml +260 -0
  276. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  277. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  278. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  279. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  280. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  281. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  282. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  283. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  284. mapproxy/test/system/fixture/multi_cache_layers.yaml +111 -0
  285. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  286. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  287. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  288. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  289. mapproxy/test/system/fixture/seed.yaml +94 -0
  290. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  291. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  292. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  293. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  294. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  295. mapproxy/test/system/fixture/sld.yaml +35 -0
  296. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  297. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  298. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  299. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  300. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  301. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  302. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  303. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  304. mapproxy/test/system/fixture/util_grids.yaml +29 -0
  305. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  306. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  307. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  308. mapproxy/test/system/fixture/watermark.yaml +50 -0
  309. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  310. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  311. mapproxy/test/system/fixture/wmts.yaml +134 -0
  312. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  313. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  314. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  315. mapproxy/test/system/test_arcgis.py +156 -0
  316. mapproxy/test/system/test_auth.py +1133 -0
  317. mapproxy/test/system/test_behind_proxy.py +75 -0
  318. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  319. mapproxy/test/system/test_cache_azureblob.py +127 -0
  320. mapproxy/test/system/test_cache_band_merge.py +103 -0
  321. mapproxy/test/system/test_cache_coverage.py +168 -0
  322. mapproxy/test/system/test_cache_geopackage.py +144 -0
  323. mapproxy/test/system/test_cache_grid_names.py +89 -0
  324. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  325. mapproxy/test/system/test_cache_s3.py +115 -0
  326. mapproxy/test/system/test_cache_source.py +146 -0
  327. mapproxy/test/system/test_combined_sources.py +335 -0
  328. mapproxy/test/system/test_coverage.py +140 -0
  329. mapproxy/test/system/test_decorate_img.py +214 -0
  330. mapproxy/test/system/test_demo.py +56 -0
  331. mapproxy/test/system/test_demo_with_extra_service.py +57 -0
  332. mapproxy/test/system/test_dimensions.py +279 -0
  333. mapproxy/test/system/test_disable_storage.py +42 -0
  334. mapproxy/test/system/test_formats.py +219 -0
  335. mapproxy/test/system/test_inspire_vs.py +173 -0
  336. mapproxy/test/system/test_kml.py +264 -0
  337. mapproxy/test/system/test_layergroups.py +160 -0
  338. mapproxy/test/system/test_legendgraphic.py +308 -0
  339. mapproxy/test/system/test_mapnik.py +162 -0
  340. mapproxy/test/system/test_mapserver.py +83 -0
  341. mapproxy/test/system/test_mixed_mode_format.py +201 -0
  342. mapproxy/test/system/test_multi_cache_layers.py +169 -0
  343. mapproxy/test/system/test_multiapp.py +92 -0
  344. mapproxy/test/system/test_refresh.py +206 -0
  345. mapproxy/test/system/test_renderd_client.py +304 -0
  346. mapproxy/test/system/test_response_headers.py +54 -0
  347. mapproxy/test/system/test_scalehints.py +140 -0
  348. mapproxy/test/system/test_seed.py +425 -0
  349. mapproxy/test/system/test_seed_only.py +93 -0
  350. mapproxy/test/system/test_sld.py +120 -0
  351. mapproxy/test/system/test_source_errors.py +377 -0
  352. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  353. mapproxy/test/system/test_tms.py +277 -0
  354. mapproxy/test/system/test_tms_origin.py +46 -0
  355. mapproxy/test/system/test_util_conf.py +434 -0
  356. mapproxy/test/system/test_util_export.py +210 -0
  357. mapproxy/test/system/test_util_grids.py +88 -0
  358. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  359. mapproxy/test/system/test_watermark.py +91 -0
  360. mapproxy/test/system/test_wms.py +1616 -0
  361. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  362. mapproxy/test/system/test_wms_version.py +85 -0
  363. mapproxy/test/system/test_wmsc.py +116 -0
  364. mapproxy/test/system/test_wmts.py +334 -0
  365. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  366. mapproxy/test/system/test_wmts_restful.py +198 -0
  367. mapproxy/test/system/test_xslt_featureinfo.py +423 -0
  368. mapproxy/test/test_http_helper.py +217 -0
  369. mapproxy/test/unit/__init__.py +0 -0
  370. mapproxy/test/unit/epsg +2 -0
  371. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  372. mapproxy/test/unit/polygons/polygons.shp +0 -0
  373. mapproxy/test/unit/polygons/polygons.shx +0 -0
  374. mapproxy/test/unit/test_async.py +242 -0
  375. mapproxy/test/unit/test_auth.py +430 -0
  376. mapproxy/test/unit/test_cache.py +1356 -0
  377. mapproxy/test/unit/test_cache_azureblob.py +97 -0
  378. mapproxy/test/unit/test_cache_compact.py +324 -0
  379. mapproxy/test/unit/test_cache_couchdb.py +118 -0
  380. mapproxy/test/unit/test_cache_geopackage.py +256 -0
  381. mapproxy/test/unit/test_cache_redis.py +123 -0
  382. mapproxy/test/unit/test_cache_riak.py +80 -0
  383. mapproxy/test/unit/test_cache_s3.py +93 -0
  384. mapproxy/test/unit/test_cache_tile.py +477 -0
  385. mapproxy/test/unit/test_client.py +488 -0
  386. mapproxy/test/unit/test_client_arcgis.py +74 -0
  387. mapproxy/test/unit/test_client_cgi.py +140 -0
  388. mapproxy/test/unit/test_collections.py +116 -0
  389. mapproxy/test/unit/test_concat_legends.py +37 -0
  390. mapproxy/test/unit/test_conf_loader.py +1267 -0
  391. mapproxy/test/unit/test_conf_validator.py +427 -0
  392. mapproxy/test/unit/test_config.py +118 -0
  393. mapproxy/test/unit/test_decorate_img.py +185 -0
  394. mapproxy/test/unit/test_exceptions.py +270 -0
  395. mapproxy/test/unit/test_featureinfo.py +313 -0
  396. mapproxy/test/unit/test_file_lock_load.py +49 -0
  397. mapproxy/test/unit/test_geom.py +512 -0
  398. mapproxy/test/unit/test_grid.py +1279 -0
  399. mapproxy/test/unit/test_image.py +1051 -0
  400. mapproxy/test/unit/test_image_mask.py +181 -0
  401. mapproxy/test/unit/test_image_messages.py +209 -0
  402. mapproxy/test/unit/test_image_options.py +160 -0
  403. mapproxy/test/unit/test_isodate.py +118 -0
  404. mapproxy/test/unit/test_multiapp.py +163 -0
  405. mapproxy/test/unit/test_ogr_reader.py +51 -0
  406. mapproxy/test/unit/test_request.py +745 -0
  407. mapproxy/test/unit/test_request_wmts.py +178 -0
  408. mapproxy/test/unit/test_response.py +78 -0
  409. mapproxy/test/unit/test_seed.py +365 -0
  410. mapproxy/test/unit/test_seed_cachelock.py +91 -0
  411. mapproxy/test/unit/test_srs.py +215 -0
  412. mapproxy/test/unit/test_tiled_source.py +122 -0
  413. mapproxy/test/unit/test_tilefilter.py +31 -0
  414. mapproxy/test/unit/test_times.py +25 -0
  415. mapproxy/test/unit/test_timeutils.py +50 -0
  416. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  417. mapproxy/test/unit/test_utils.py +476 -0
  418. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  419. mapproxy/test/unit/test_wms_layer.py +113 -0
  420. mapproxy/test/unit/test_yaml.py +68 -0
  421. mapproxy/tilefilter.py +61 -0
  422. mapproxy/util/__init__.py +0 -0
  423. mapproxy/util/async_.py +229 -0
  424. mapproxy/util/collections.py +134 -0
  425. mapproxy/util/coverage.py +337 -0
  426. mapproxy/util/ext/__init__.py +14 -0
  427. mapproxy/util/ext/dictspec/__init__.py +1 -0
  428. mapproxy/util/ext/dictspec/spec.py +131 -0
  429. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  430. mapproxy/util/ext/dictspec/test/test_validator.py +278 -0
  431. mapproxy/util/ext/dictspec/validator.py +194 -0
  432. mapproxy/util/ext/local.py +198 -0
  433. mapproxy/util/ext/lockfile.py +140 -0
  434. mapproxy/util/ext/odict.py +321 -0
  435. mapproxy/util/ext/serving.py +491 -0
  436. mapproxy/util/ext/tempita/__init__.py +1093 -0
  437. mapproxy/util/ext/tempita/_looper.py +163 -0
  438. mapproxy/util/ext/tempita/string_utils.py +24 -0
  439. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  440. mapproxy/util/ext/wmsparse/duration.py +600 -0
  441. mapproxy/util/ext/wmsparse/parse.py +307 -0
  442. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  443. mapproxy/util/ext/wmsparse/test/test_parse.py +111 -0
  444. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  445. mapproxy/util/ext/wmsparse/test/wms-example-111.xml +90 -0
  446. mapproxy/util/ext/wmsparse/test/wms-example-130.xml +120 -0
  447. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  448. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  449. mapproxy/util/ext/wmsparse/util.py +189 -0
  450. mapproxy/util/fs.py +164 -0
  451. mapproxy/util/geom.py +307 -0
  452. mapproxy/util/lib.py +117 -0
  453. mapproxy/util/lock.py +171 -0
  454. mapproxy/util/ogr.py +247 -0
  455. mapproxy/util/py.py +75 -0
  456. mapproxy/util/times.py +78 -0
  457. mapproxy/util/yaml.py +58 -0
  458. mapproxy/version.py +33 -0
  459. mapproxy/wsgiapp.py +167 -0
@@ -0,0 +1,56 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2022 Even Rouault
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 re
17
+ import pytest
18
+
19
+ from mapproxy.test.system import SysTest
20
+
21
+
22
+ @pytest.fixture(scope="module")
23
+ def config_file():
24
+ return "demo.yaml"
25
+
26
+
27
+ class TestDemo(SysTest):
28
+
29
+ def test_basic(self, app):
30
+ resp = app.get("/demo/", status=200)
31
+ assert resp.content_type == "text/html"
32
+ assert 'href="../service?REQUEST=GetCapabilities"' in resp
33
+ assert 'href="../service?REQUEST=GetCapabilities&tiled=true"' in resp
34
+ assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
35
+ assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
36
+
37
+ def test_previewmap(self, app):
38
+ resp = app.get("/demo/?srs=EPSG%3A3857&format=image%2Fpng&wms_layer=wms_cache", status=200)
39
+ assert resp.content_type == "text/html"
40
+ assert '<h2>Layer Preview - wms_cache</h2>' in resp
41
+
42
+ def test_layers_sorted_by_name(self, app):
43
+ resp = app.get("/demo/", status=200)
44
+
45
+ patternTable = re.compile(r'<table class="code">.*?</table>', re.DOTALL)
46
+ patternWMS = r'<td\s+rowspan="2">([\w\d-]+)</td>'
47
+ patternWMTS_TBS = r'<td\s+rowspan="1">([\w\d-]+)</td>'
48
+ tables = patternTable.findall(resp.text)
49
+
50
+ layersWMS = re.findall(patternWMS, resp.text, re.IGNORECASE)
51
+ layersWMTS = re.findall(patternWMTS_TBS, tables[1], re.IGNORECASE)
52
+ layersTBS = re.findall(patternWMTS_TBS, tables[2], re.IGNORECASE)
53
+
54
+ assert layersWMS == sorted(layersWMS)
55
+ assert layersWMTS == sorted(layersWMTS)
56
+ assert layersTBS == sorted(layersTBS)
@@ -0,0 +1,57 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2022 Even Rouault
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import pytest
17
+
18
+ from mapproxy.service.demo import (
19
+ extra_demo_server_handlers, extra_substitution_handlers, register_extra_demo_server_handler,
20
+ register_extra_demo_substitution_handler)
21
+ from mapproxy.test.system import SysTest
22
+
23
+
24
+ def demo_server_handler(demo_server, req):
25
+ if 'my_service' in req.args:
26
+ return 'my_return'
27
+ return None
28
+
29
+
30
+ def demo_substitution_handler(demo_server, req, substitutions):
31
+ substitutions['extra_services_html_beginning'] += '<h2>My extra service</h2>'
32
+
33
+
34
+ @pytest.fixture(scope="module")
35
+ def config_file():
36
+ register_extra_demo_server_handler(demo_server_handler)
37
+ register_extra_demo_substitution_handler(demo_substitution_handler)
38
+ yield "demo.yaml"
39
+ extra_demo_server_handlers.clear()
40
+ extra_substitution_handlers.clear()
41
+
42
+
43
+ class TestDemoWithExtraService(SysTest):
44
+
45
+ def test_basic(self, app):
46
+ resp = app.get("/demo/", status=200)
47
+ assert resp.content_type == "text/html"
48
+ assert 'href="../service?REQUEST=GetCapabilities"' in resp
49
+ assert 'href="../service?REQUEST=GetCapabilities&tiled=true"' in resp
50
+ assert 'href="../demo/?wmts_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
51
+ assert 'href="../demo/?tms_layer=wms_cache&format=jpeg&srs=EPSG%3A900913"' in resp
52
+ assert '<h2>My extra service</h2>' in resp
53
+
54
+ def test_my_service(self, app):
55
+ resp = app.get("/demo/?my_service=bar", status=200)
56
+ assert resp.content_type == "text/html"
57
+ assert 'my_return' in resp
@@ -0,0 +1,279 @@
1
+ # This file is part of the MapProxy project.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+
14
+ from __future__ import division
15
+ import pytest
16
+ from mapproxy.test.image import tmp_image
17
+ from mapproxy.test.http import mock_httpd
18
+ from mapproxy.test.system import SysTest
19
+
20
+ from mapproxy.request.wms import (
21
+ WMS100MapRequest,
22
+ WMS111MapRequest,
23
+ WMS130MapRequest,
24
+ WMS111CapabilitiesRequest,
25
+ WMS130CapabilitiesRequest,
26
+ WMS100CapabilitiesRequest,
27
+ WMS110MapRequest,
28
+ WMS110CapabilitiesRequest,
29
+ )
30
+
31
+ expected_dim = {'time': {
32
+ 'values': '2020-09-22T11:20:00Z,2020-09-22T13:20:00Z,2020-09-22T15:20:00Z',
33
+ 'default': '2020-09-22T14:20:00Z'},
34
+ 'dim_reference_time': {
35
+ 'values': '2020-09-22T11:20:00Z,2020-09-22T13:20:00Z,2020-09-22T15:20:00Z',
36
+ 'default': '2020-09-22T14:20:00Z'}}
37
+
38
+
39
+ @pytest.fixture(scope="module")
40
+ def config_file():
41
+ return "dimension.yaml"
42
+
43
+
44
+ class TestDimensionsWMS130(SysTest):
45
+
46
+ def setup_method(self):
47
+ self.common_req = WMS130MapRequest(
48
+ url="/service?", param=dict(service="WMS", version="1.3.0")
49
+ )
50
+ self.common_map_req = WMS130MapRequest(
51
+ url="/service?",
52
+ param=dict(
53
+ service="WMS",
54
+ version="1.3.0",
55
+ bbox="-180,0,0,80",
56
+ width="200",
57
+ height="200",
58
+ layers="test_cache",
59
+ srs="EPSG:4326",
60
+ format="image/png",
61
+ styles="",
62
+ request="GetMap",
63
+ time="2020-09-22T14:20:00Z",
64
+ ),
65
+ )
66
+
67
+ def test_get_capabilities_dimension(self, app):
68
+ req = WMS130CapabilitiesRequest(url="/service?").copy_with_request_params(
69
+ self.common_req
70
+ )
71
+ resp = app.get(req)
72
+ xml = resp.lxml
73
+
74
+ dimensions = xml.xpath('//xmlns:Layer/xmlns:Dimension', namespaces=dict(xmlns="http://www.opengis.net/wms"))
75
+ results = dict()
76
+
77
+ for dimension in dimensions:
78
+ temp_dict = dict()
79
+ temp_dict['values'] = dimension.text
80
+ temp_dict['default'] = dimension.attrib['default']
81
+ results[dimension.attrib['name']] = temp_dict
82
+
83
+ assert set(list(expected_dim.keys())) == set(list(results.keys()))
84
+
85
+ assert expected_dim['time']['default'] == results['time']['default']
86
+ assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
87
+ assert expected_dim['time']['values'] == results['time']['values']
88
+ assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
89
+
90
+ def test_get_map_dimensions(self, app, cache_dir):
91
+ with tmp_image((256, 256), format="jpeg") as img:
92
+ expected_req = (
93
+ {
94
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
95
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
96
+ "&VERSION=1.1.1&BBOX=0.0,0.0,20037508.3428,20037508.3428"
97
+ "&WIDTH=256&TIME=2020-09-22T14:20:00Z"
98
+ },
99
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
100
+ )
101
+ with mock_httpd(
102
+ ("localhost", 42422), [expected_req], bbox_aware_query_comparator=True
103
+ ):
104
+ self.common_map_req.params["bbox"] = "0,0,180,90"
105
+ resp = app.get(self.common_map_req)
106
+ assert 35000 < int(resp.headers["Content-length"]) < 75000
107
+ assert resp.content_type == "image/png"
108
+
109
+ assert cache_dir.join(
110
+ "test_cache_EPSG900913/time-2020-09-22T14:20:00Z/01/000/000/001/000/000/001.jpeg"
111
+ ).check()
112
+
113
+
114
+ class TestDimensionsWMS111(SysTest):
115
+
116
+ def setup_method(self):
117
+ self.common_req = WMS111MapRequest(
118
+ url="/service?", param=dict(service="WMS", version="1.1.1")
119
+ )
120
+ self.common_map_req = WMS111MapRequest(
121
+ url="/service?",
122
+ param=dict(
123
+ service="WMS",
124
+ version="1.1.1",
125
+ bbox="-180,0,0,80",
126
+ width="200",
127
+ height="200",
128
+ layers="test_cache",
129
+ srs="EPSG:4326",
130
+ format="image/png",
131
+ styles="",
132
+ request="GetMap",
133
+ time="2020-09-22T14:20:00Z",
134
+ ),
135
+ )
136
+
137
+ def test_get_capabilities_dimension(self, app):
138
+ req = WMS111CapabilitiesRequest(url="/service?").copy_with_request_params(
139
+ self.common_req
140
+ )
141
+ resp = app.get(req)
142
+ xml = resp.lxml
143
+ dimensions = xml.xpath('//Layer/Dimension')
144
+ results = dict()
145
+
146
+ for dimension in dimensions:
147
+ temp_dict = dict()
148
+ temp_dict['values'] = dimension.text
149
+ temp_dict['default'] = dimension.attrib['default']
150
+ results[dimension.attrib['name']] = temp_dict
151
+
152
+ assert set(list(expected_dim.keys())) == set(list(results.keys()))
153
+
154
+ assert expected_dim['time']['default'] == results['time']['default']
155
+ assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
156
+
157
+ def test_get_map_dimensions(self, app, cache_dir):
158
+ with tmp_image((256, 256), format="jpeg") as img:
159
+ expected_req = (
160
+ {
161
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
162
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
163
+ "&VERSION=1.1.1&BBOX=0.0,0.0,20037508.3428,20037508.3428"
164
+ "&WIDTH=256&TIME=2020-09-22T14:20:00Z"
165
+ },
166
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
167
+ )
168
+ with mock_httpd(
169
+ ("localhost", 42422), [expected_req], bbox_aware_query_comparator=True
170
+ ):
171
+ self.common_map_req.params["bbox"] = "0,0,180,90"
172
+ resp = app.get(self.common_map_req)
173
+ assert 35000 < int(resp.headers["Content-length"]) < 75000
174
+ assert resp.content_type == "image/png"
175
+
176
+ assert cache_dir.join(
177
+ "test_cache_EPSG900913/time-2020-09-22T14:20:00Z/01/000/000/001/000/000/001.jpeg"
178
+ ).check()
179
+
180
+
181
+ class TestDimensionsWMS110(SysTest):
182
+
183
+ def setup_method(self):
184
+ self.common_req = WMS110MapRequest(
185
+ url="/service?", param=dict(service="WMS", version="1.1.0")
186
+ )
187
+ self.common_map_req = WMS110MapRequest(
188
+ url="/service?",
189
+ param=dict(
190
+ service="WMS",
191
+ version="1.1.0",
192
+ bbox="-180,0,0,80",
193
+ width="200",
194
+ height="200",
195
+ layers="test_cache",
196
+ srs="EPSG:4326",
197
+ format="image/png",
198
+ styles="",
199
+ request="GetMap",
200
+ time="2020-09-22T14:20:00Z",
201
+ ),
202
+ )
203
+
204
+ def test_get_capabilities_dimension(self, app):
205
+ req = WMS110CapabilitiesRequest(url="/service?").copy_with_request_params(
206
+ self.common_req
207
+ )
208
+ resp = app.get(req)
209
+ xml = resp.lxml
210
+ dimensions = xml.xpath('//Layer/Dimension')
211
+ results = dict()
212
+
213
+ for dimension in dimensions:
214
+ temp_dict = dict()
215
+ temp_dict['values'] = dimension.text
216
+ temp_dict['default'] = dimension.attrib['default']
217
+ results[dimension.attrib['name']] = temp_dict
218
+ assert set(list(expected_dim.keys())) == set(list(results.keys()))
219
+
220
+ assert expected_dim['time']['default'] == results['time']['default']
221
+ assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
222
+ assert expected_dim['time']['values'] == results['time']['values']
223
+ assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
224
+ assert expected_dim['time']['values'] == results['time']['values']
225
+ assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
226
+
227
+ def test_get_map_dimensions(self, app, cache_dir):
228
+ with tmp_image((256, 256), format="jpeg") as img:
229
+ expected_req = (
230
+ {
231
+ "path": r"/service?LAYERs=foo,bar&SERVICE=WMS&FORMAT=image%2Fjpeg"
232
+ "&REQUEST=GetMap&HEIGHT=256&SRS=EPSG%3A900913&styles="
233
+ "&VERSION=1.1.1&BBOX=0.0,0.0,20037508.3428,20037508.3428"
234
+ "&WIDTH=256&TIME=2020-09-22T14:20:00Z"
235
+ },
236
+ {"body": img.read(), "headers": {"content-type": "image/jpeg"}},
237
+ )
238
+ with mock_httpd(
239
+ ("localhost", 42422), [expected_req], bbox_aware_query_comparator=True
240
+ ):
241
+ self.common_map_req.params["bbox"] = "0,0,180,90"
242
+ resp = app.get(self.common_map_req)
243
+ assert 35000 < int(resp.headers["Content-length"]) < 75000
244
+ assert resp.content_type == "image/png"
245
+
246
+ assert cache_dir.join(
247
+ "test_cache_EPSG900913/time-2020-09-22T14:20:00Z/01/000/000/001/000/000/001.jpeg"
248
+ ).check()
249
+
250
+
251
+ class TestDimensionsWMS100(SysTest):
252
+
253
+ def setup_method(self):
254
+ self.common_req = WMS100MapRequest(
255
+ url="/service?", param=dict(service="WMS", wmtver="1.0.0")
256
+ )
257
+
258
+ def test_get_capabilities_dimension(self, app):
259
+ req = WMS100CapabilitiesRequest(url="/service?").copy_with_request_params(
260
+ self.common_req
261
+ )
262
+ resp = app.get(req)
263
+ xml = resp.lxml
264
+ dimensions = xml.xpath('//Layer/Dimension')
265
+ results = dict()
266
+
267
+ for dimension in dimensions:
268
+ temp_dict = dict()
269
+ temp_dict['values'] = dimension.text
270
+ temp_dict['default'] = dimension.attrib['default']
271
+ results[dimension.attrib['name']] = temp_dict
272
+
273
+ assert set(list(expected_dim.keys())) == set(list(results.keys()))
274
+ assert expected_dim['time']['default'] == results['time']['default']
275
+ assert expected_dim['dim_reference_time']['default'] == results['dim_reference_time']['default']
276
+ assert expected_dim['time']['values'] == results['time']['values']
277
+ assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
278
+ assert expected_dim['time']['values'] == results['time']['values']
279
+ assert expected_dim['dim_reference_time']['values'] == results['dim_reference_time']['values']
@@ -0,0 +1,42 @@
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
+ import pytest
17
+
18
+ from mapproxy.test.image import is_png, tmp_image
19
+ from mapproxy.test.http import mock_httpd
20
+ from mapproxy.test.system import SysTest
21
+
22
+
23
+ @pytest.fixture(scope="module")
24
+ def config_file():
25
+ return "disable_storage.yaml"
26
+
27
+
28
+ class TestDisableStorage(SysTest):
29
+
30
+ def test_get_tile_without_caching(self, app, cache_dir):
31
+ for _ in range(2):
32
+ with tmp_image((256, 256), format="png") as img:
33
+ expected_req = (
34
+ {"path": r"/tile.png"},
35
+ {"body": img.read(), "headers": {"content-type": "image/png"}},
36
+ )
37
+ with mock_httpd(("localhost", 42423), [expected_req]):
38
+ resp = app.get("/tms/1.0.0/tiles/0/0/0.png")
39
+ assert resp.content_type == "image/png"
40
+ is_png(resp.body)
41
+
42
+ assert not cache_dir.check()
@@ -0,0 +1,219 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from __future__ import division
17
+
18
+ from io import BytesIO
19
+
20
+ import pytest
21
+
22
+ from mapproxy.request.wms import WMS111MapRequest, WMS111FeatureInfoRequest
23
+ from mapproxy.test.image import tmp_image, check_format
24
+ from mapproxy.test.http import mock_httpd
25
+ from mapproxy.test.system import SysTest
26
+
27
+
28
+ @pytest.fixture(scope="module")
29
+ def config_file():
30
+ return "formats.yaml"
31
+
32
+
33
+ def assert_file_format(filename, format):
34
+ assert filename.check()
35
+ check_format(filename.read_binary(), format)
36
+
37
+
38
+ class TestWMS111(SysTest):
39
+
40
+ def setup_method(self):
41
+ self.common_req = WMS111MapRequest(
42
+ url="/service?", param=dict(service="WMS", version="1.1.1")
43
+ )
44
+ self.common_map_req = WMS111MapRequest(
45
+ url="/service?",
46
+ param=dict(
47
+ service="WMS",
48
+ version="1.1.1",
49
+ bbox="0,0,180,80",
50
+ width="200",
51
+ height="200",
52
+ layers="wms_cache",
53
+ srs="EPSG:4326",
54
+ format="image/png",
55
+ styles="",
56
+ request="GetMap",
57
+ ),
58
+ )
59
+ self.common_direct_map_req = WMS111MapRequest(
60
+ url="/service?",
61
+ param=dict(
62
+ service="WMS",
63
+ version="1.1.1",
64
+ bbox="0,0,10,10",
65
+ width="200",
66
+ height="200",
67
+ layers="wms_cache",
68
+ srs="EPSG:4326",
69
+ format="image/png",
70
+ styles="",
71
+ request="GetMap",
72
+ ),
73
+ )
74
+ self.common_fi_req = WMS111FeatureInfoRequest(
75
+ url="/service?",
76
+ param=dict(
77
+ x="10",
78
+ y="20",
79
+ width="200",
80
+ height="200",
81
+ layers="wms_cache",
82
+ format="image/png",
83
+ query_layers="wms_cache",
84
+ styles="",
85
+ bbox="1000,400,2000,1400",
86
+ srs="EPSG:900913",
87
+ ),
88
+ )
89
+ self.expected_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=256" "&SRS=EPSG%3A900913&styles=&VERSION=1.1.1&WIDTH=256" "&BBOX=0.0,0.0,20037508.3428,20037508.3428" # noqa
90
+ self.expected_direct_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=200" "&SRS=EPSG%3A4326&styles=&VERSION=1.1.1&WIDTH=200" "&BBOX=0.0,0.0,10.0,10.0" # noqa
91
+
92
+ @pytest.mark.parametrize(
93
+ "layer,source,wms_format,cache_format,req_format",
94
+ [
95
+ ["jpeg_cache_tiff_source", "tiffsource", "png", "jpeg", "tiff"],
96
+ ["jpeg_cache_tiff_source", "tiffsource", "jpeg", "jpeg", "tiff"],
97
+ ["jpeg_cache_tiff_source", "tiffsource", "tiff", "jpeg", "tiff"],
98
+ ["jpeg_cache_tiff_source", "tiffsource", "gif", "jpeg", "tiff"],
99
+ ["png_cache_all_source", "allsource", "png", "png", "png"],
100
+ ["png_cache_all_source", "allsource", "jpeg", "png", "png"],
101
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "jpeg", "jpeg", "jpeg"],
102
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "png", "jpeg", "jpeg"],
103
+ ],
104
+ )
105
+ def test_get_cached(
106
+ self, app, cache_dir, layer, source, wms_format, cache_format, req_format
107
+ ):
108
+ with tmp_image((256, 256), format=req_format) as img:
109
+ expected_req = (
110
+ {
111
+ "path": self.expected_base_path
112
+ + "&layers="
113
+ + source
114
+ + "&format=image%2F"
115
+ + req_format
116
+ },
117
+ {
118
+ "body": img.read(),
119
+ "headers": {"content-type": "image/" + req_format},
120
+ },
121
+ )
122
+ with mock_httpd(
123
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
124
+ ):
125
+ self.common_map_req.params["layers"] = layer
126
+ self.common_map_req.params["format"] = "image/" + wms_format
127
+ resp = app.get(self.common_map_req)
128
+ assert resp.content_type == "image/" + wms_format
129
+ check_format(BytesIO(resp.body), wms_format)
130
+ assert_file_format(
131
+ cache_dir.join(
132
+ layer + "_EPSG900913/01/000/000/001/000/000/001." + cache_format
133
+ ),
134
+ cache_format,
135
+ )
136
+
137
+ @pytest.mark.parametrize(
138
+ "layer,source,wms_format,req_format",
139
+ [
140
+ ["jpeg_cache_tiff_source", "tiffsource", "gif", "tiff"],
141
+ ["jpeg_cache_tiff_source", "tiffsource", "jpeg", "tiff"],
142
+ ["jpeg_cache_tiff_source", "tiffsource", "png", "tiff"],
143
+ ["png_cache_all_source", "allsource", "gif", "gif"],
144
+ ["png_cache_all_source", "allsource", "png", "png"],
145
+ ["png_cache_all_source", "allsource", "tiff", "tiff"],
146
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "jpeg", "jpeg"],
147
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "png", "png"],
148
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "tiff", "png"],
149
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "gif", "png"],
150
+ ],
151
+ )
152
+ def test_get_direct(self, app, layer, source, wms_format, req_format):
153
+ with tmp_image((256, 256), format=req_format) as img:
154
+ expected_req = (
155
+ {
156
+ "path": self.expected_direct_base_path
157
+ + "&layers="
158
+ + source
159
+ + "&format=image%2F"
160
+ + req_format
161
+ },
162
+ {
163
+ "body": img.read(),
164
+ "headers": {"content-type": "image/" + req_format},
165
+ },
166
+ )
167
+ with mock_httpd(
168
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
169
+ ):
170
+ self.common_direct_map_req.params["layers"] = layer
171
+ self.common_direct_map_req.params["format"] = "image/" + wms_format
172
+ resp = app.get(self.common_direct_map_req)
173
+ assert resp.content_type == "image/" + wms_format
174
+ check_format(BytesIO(resp.body), wms_format)
175
+
176
+
177
+ class TestTMS(SysTest):
178
+
179
+ def setup_method(self):
180
+ self.expected_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=256" "&SRS=EPSG%3A900913&styles=&VERSION=1.1.1&WIDTH=256" "&BBOX=0.0,0.0,20037508.3428,20037508.3428" # noqa
181
+ self.expected_direct_base_path = "/service?SERVICE=WMS&REQUEST=GetMap&HEIGHT=200" "&SRS=EPSG%3A4326&styles=&VERSION=1.1.1&WIDTH=200" "&BBOX=0.0,0.0,10.0,10.0" # noqa
182
+
183
+ @pytest.mark.parametrize(
184
+ "layer,source,tms_format,cache_format,req_format",
185
+ [
186
+ ["jpeg_cache_tiff_source", "tiffsource", "jpeg", "jpeg", "tiff"],
187
+ ["png_cache_all_source", "allsource", "png", "png", "png"],
188
+ ["jpeg_cache_png_jpeg_source", "pngjpegsource", "jpeg", "jpeg", "jpeg"],
189
+ ],
190
+ )
191
+ def test_get_cached(
192
+ self, app, cache_dir, layer, source, tms_format, cache_format, req_format
193
+ ):
194
+ with tmp_image((256, 256), format=req_format) as img:
195
+ expected_req = (
196
+ {
197
+ "path": self.expected_base_path
198
+ + "&layers="
199
+ + source
200
+ + "&format=image%2F"
201
+ + req_format
202
+ },
203
+ {
204
+ "body": img.read(),
205
+ "headers": {"content-type": "image/" + req_format},
206
+ },
207
+ )
208
+ with mock_httpd(
209
+ ("localhost", 42423), [expected_req], bbox_aware_query_comparator=True
210
+ ):
211
+ resp = app.get("/tms/1.0.0/%s/0/1/1.%s" % (layer, tms_format))
212
+ assert resp.content_type == "image/" + tms_format
213
+ # check_format(BytesIO(resp.body), tms_format)
214
+ assert_file_format(
215
+ cache_dir.join(
216
+ layer + "_EPSG900913/01/000/000/001/000/000/001." + cache_format
217
+ ),
218
+ cache_format,
219
+ )