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,91 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2012 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import multiprocessing
17
+ import time
18
+ import sys
19
+
20
+ import pytest
21
+
22
+ from mapproxy.seed.cachelock import CacheLocker, CacheLockedError
23
+
24
+
25
+ @pytest.mark.skipif(sys.platform == "win32", reason="test not supported for Windows")
26
+ @pytest.mark.skipif(sys.platform == "darwin" and sys.version_info >= (3, 8),
27
+ reason="test not supported for MacOS with Python >=3.8")
28
+ class TestCacheLock(object):
29
+
30
+ @pytest.fixture
31
+ def lock_file(self, tmpdir):
32
+ return (tmpdir / "lock").strpath
33
+
34
+ def test_free_lock(self, lock_file):
35
+ locker = CacheLocker(lock_file)
36
+ with locker.lock("foo"):
37
+ assert True
38
+
39
+ def test_locked_by_process_no_block(self, lock_file):
40
+ proc_is_locked = multiprocessing.Event()
41
+
42
+ def lock():
43
+ locker = CacheLocker(lock_file)
44
+ with locker.lock("foo"):
45
+ proc_is_locked.set()
46
+ time.sleep(10)
47
+
48
+ p = multiprocessing.Process(target=lock)
49
+ p.start()
50
+ # wait for process to start
51
+ proc_is_locked.wait()
52
+
53
+ locker = CacheLocker(lock_file)
54
+
55
+ # test unlocked bar
56
+ with locker.lock("bar", no_block=True):
57
+ assert True
58
+
59
+ # test locked foo
60
+ try:
61
+ with locker.lock("foo", no_block=True):
62
+ assert False
63
+ except CacheLockedError:
64
+ pass
65
+ finally:
66
+ p.terminate()
67
+ p.join()
68
+
69
+ def test_locked_by_process_waiting(self, lock_file):
70
+ proc_is_locked = multiprocessing.Event()
71
+
72
+ def lock():
73
+ locker = CacheLocker(lock_file)
74
+ with locker.lock("foo"):
75
+ proc_is_locked.set()
76
+ time.sleep(.1)
77
+
78
+ p = multiprocessing.Process(target=lock)
79
+ start_time = time.time()
80
+ p.start()
81
+ # wait for process to start
82
+ proc_is_locked.wait()
83
+
84
+ locker = CacheLocker(lock_file, polltime=0.02)
85
+ try:
86
+ with locker.lock("foo", no_block=False):
87
+ diff = time.time() - start_time
88
+ assert diff > 0.1
89
+ finally:
90
+ p.terminate()
91
+ p.join()
@@ -0,0 +1,215 @@
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
+ import os
17
+
18
+ import pytest
19
+
20
+ from mapproxy.config import base_config
21
+ from mapproxy import srs, proj
22
+ from mapproxy.srs import SRS, PreferredSrcSRS, SupportedSRS
23
+
24
+
25
+ class TestSRS(object):
26
+
27
+ def test_epsg4326(self):
28
+ srs = SRS(4326)
29
+
30
+ assert srs.is_latlong
31
+ assert not srs.is_axis_order_en
32
+ assert srs.is_axis_order_ne
33
+
34
+ assert srs.get_geographic_srs() == srs
35
+
36
+ def test_crs84(self):
37
+ srs = SRS("CRS:84")
38
+
39
+ assert srs.is_latlong
40
+ assert srs.is_axis_order_en
41
+ assert not srs.is_axis_order_ne
42
+
43
+ assert srs == SRS("EPSG:4326")
44
+
45
+ def test_epsg31467(self):
46
+ srs = SRS("EPSG:31467")
47
+
48
+ assert not srs.is_latlong
49
+ assert not srs.is_axis_order_en
50
+ assert srs.is_axis_order_ne
51
+
52
+ assert srs.get_geographic_srs() == SRS(4326)
53
+
54
+ def test_epsg900913(self):
55
+ srs = SRS("epsg:900913")
56
+
57
+ assert not srs.is_latlong
58
+ assert srs.is_axis_order_en
59
+ assert not srs.is_axis_order_ne
60
+
61
+ def test_non_epsg_auth(self):
62
+ srs = SRS("IGNF:ETRS89UTM28")
63
+
64
+ assert not srs.is_latlong
65
+ assert srs.is_axis_order_en
66
+ assert not srs.is_axis_order_ne
67
+
68
+ assert srs.get_geographic_srs() == SRS(4326)
69
+
70
+ def test_iau_crs(self):
71
+ try:
72
+ srs = SRS("IAU:49900") # "Mars (2015) - Sphere / Ocentric"
73
+ except Exception:
74
+ pytest.skip('Requires recent pyproj version')
75
+
76
+ assert srs.is_latlong
77
+ assert '49900' in str(srs.get_geographic_srs())
78
+
79
+ def test_iau_crs_projected(self):
80
+ try:
81
+ srs = SRS("IAU:49910") # "Mars (2015) - Sphere / Ocentric / Equirectangular, clon = 0"
82
+ except Exception:
83
+ pytest.skip('Requires recent pyproj version')
84
+
85
+ assert not srs.is_latlong
86
+ assert '49900' in str(srs.get_geographic_srs())
87
+
88
+ def test_from_srs(self):
89
+ srs1 = SRS("epsg:4326")
90
+ srs2 = SRS(srs1)
91
+ assert srs1 == srs2
92
+
93
+ # proj_data_dir test relies on old Proj4 epsg files.
94
+
95
+
96
+ @pytest.mark.skipif(not proj.USE_PROJ4_API, reason="only for old proj4 lib")
97
+ class Test_0_ProjDefaultDataPath(object):
98
+
99
+ def test_known_srs(self):
100
+ srs.SRS(4326)
101
+
102
+ def test_unknown_srs(self):
103
+ with pytest.raises(RuntimeError):
104
+ srs.SRS(1234)
105
+
106
+
107
+ @pytest.fixture(scope="class")
108
+ def custom_proj_data_dir():
109
+ srs._proj_initalized = False
110
+ srs._srs_cache = {}
111
+ base_config().srs.proj_data_dir = os.path.dirname(__file__)
112
+
113
+ yield
114
+
115
+ srs._proj_initalized = False
116
+ srs._srs_cache = {}
117
+ srs.set_datapath(None)
118
+ base_config().srs.proj_data_dir = None
119
+
120
+
121
+ @pytest.mark.skipif(not proj.USE_PROJ4_API, reason="only for old proj4 lib")
122
+ @pytest.mark.usefixtures("custom_proj_data_dir")
123
+ class Test_1_ProjDataPath(object):
124
+
125
+ def test_dummy_srs(self):
126
+ srs.SRS(1234)
127
+
128
+ def test_unknown_srs(self):
129
+ with pytest.raises(RuntimeError):
130
+ srs.SRS(2339)
131
+
132
+
133
+ class TestPreferredSrcSRS(object):
134
+
135
+ # test selection of preferred SRS
136
+ # unprojected: 4326, 4258
137
+ # projected: 3857, 25831, 25832, 31467
138
+ @pytest.mark.parametrize("target,available,expected", [
139
+
140
+ # always return target if available
141
+ (4326, [25832, 4326, 3857], 4326),
142
+
143
+ (4326, [25832, 4326, 3857], 4326),
144
+ (4326, [25831, 3857], 3857),
145
+
146
+ (3857, [25832, 4258, 3857, 31466], 3857),
147
+ (3857, [25832, 4258, 31467, 25831, 31466], 25832),
148
+ (3857, [4258, 31467, 25831, 31466], 25831),
149
+ (3857, [4258, 31467, 31466], 31467),
150
+ (3857, [4258, 31466], 31466),
151
+ (3857, [4258], 4258),
152
+
153
+ # always return first preferred, regardless of order in available
154
+ (4326, [3857, 4258], 4258),
155
+ (4326, [4258, 3857], 4258),
156
+
157
+ # no preferred, return first that is also projected/unprojected
158
+ (31467, [4326, 25831, 3857], 25831),
159
+ (4258, [25831, 4326, 3857], 4326),
160
+
161
+ # no preferred and no srs that is also projected/unprojected, return first
162
+ (31467, [4326, 4258], 4326),
163
+ (4258, [3857, 25832, 31467], 3857),
164
+ ])
165
+ def test_preferred(self, target, available, expected):
166
+ preferredSRS = PreferredSrcSRS()
167
+ preferredSRS.add(SRS(4326), [SRS(4258), SRS(3857)])
168
+ preferredSRS.add(SRS(3857), [SRS(25832), SRS(25831), SRS(31467), SRS(4326)])
169
+
170
+ assert preferredSRS.preferred_src(SRS(target), [SRS(c) for c in available]) == SRS(expected)
171
+
172
+ def test_no_available(self):
173
+ preferredSRS = PreferredSrcSRS()
174
+ preferredSRS.add(SRS(4326), [SRS(4258), SRS(3857)])
175
+
176
+ with pytest.raises(ValueError):
177
+ preferredSRS.preferred_src(SRS(4326), [])
178
+
179
+
180
+ class TestSupportedSRS(object):
181
+ @pytest.fixture
182
+ def preferred(self):
183
+ preferredSRS = PreferredSrcSRS()
184
+ preferredSRS.add(SRS(4326), [SRS(4258), SRS(3857)])
185
+ preferredSRS.add(SRS(3857), [SRS(25832), SRS(25831), SRS(31467), SRS(4326)])
186
+ return preferredSRS
187
+
188
+ def test_supported(self, preferred):
189
+ supported = SupportedSRS([SRS(4326), SRS(25832)], preferred)
190
+ assert SRS(4326) in supported
191
+ assert SRS(4258) not in supported
192
+ assert SRS(25832) in supported
193
+
194
+ def test_iter(self, preferred):
195
+ supported = SupportedSRS([SRS(4326), SRS(25832)], preferred)
196
+ assert [SRS(4326), SRS(25832)] == [srs for srs in supported]
197
+
198
+ def test_best_srs(self, preferred):
199
+ supported = SupportedSRS([SRS(4326), SRS(25832)], preferred)
200
+ assert supported.best_srs(SRS(4326)) == SRS(4326)
201
+ assert supported.best_srs(SRS(4258)) == SRS(4326)
202
+ assert supported.best_srs(SRS(25832)) == SRS(25832)
203
+ assert supported.best_srs(SRS(25831)) == SRS(25832)
204
+ assert supported.best_srs(SRS(3857)) == SRS(25832)
205
+ supported = SupportedSRS([SRS(4326), SRS(31467), SRS(25831)], preferred)
206
+ assert supported.best_srs(SRS(3857)) == SRS(25831)
207
+ assert supported.best_srs(SRS(25831)) == SRS(25831)
208
+
209
+ def test_best_srs_no_preferred(self, preferred):
210
+ supported = SupportedSRS([SRS(4326), SRS(25832)], None)
211
+ assert supported.best_srs(SRS(4326)) == SRS(4326)
212
+ assert supported.best_srs(SRS(4258)) == SRS(4326)
213
+ assert supported.best_srs(SRS(25832)) == SRS(25832)
214
+ assert supported.best_srs(SRS(25831)) == SRS(25832)
215
+ assert supported.best_srs(SRS(3857)) == SRS(25832)
@@ -0,0 +1,122 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2012 Omniscale <http://omniscale.de>
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+
17
+ from mapproxy.client.tile import TileClient, TileURLTemplate
18
+ from mapproxy.grid import TileGrid
19
+ from mapproxy.srs import SRS
20
+ from mapproxy.source.tile import TiledSource
21
+ from mapproxy.source.error import HTTPSourceErrorHandler
22
+ from mapproxy.layer import MapQuery
23
+ from mapproxy.test.http import mock_httpd
24
+
25
+
26
+ TEST_SERVER_ADDRESS = ("127.0.0.1", 56413)
27
+ TESTSERVER_URL = ("http://%s:%d" % TEST_SERVER_ADDRESS) + "/%(tms_path)s.png"
28
+
29
+
30
+ class TestTileClientOnError(object):
31
+
32
+ def setup_method(self):
33
+ self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
34
+ self.client = TileClient(TileURLTemplate(TESTSERVER_URL))
35
+
36
+ def test_cacheable_response(self):
37
+ error_handler = HTTPSourceErrorHandler()
38
+ error_handler.add_handler(500, (255, 0, 0), cacheable=True)
39
+ self.source = TiledSource(self.grid, self.client, error_handler=error_handler)
40
+
41
+ with mock_httpd(
42
+ TEST_SERVER_ADDRESS,
43
+ [
44
+ (
45
+ {"path": "/1/0/0.png"},
46
+ {
47
+ "body": b"error",
48
+ "status": 500,
49
+ "headers": {"content-type": "text/plain"},
50
+ },
51
+ )
52
+ ],
53
+ ):
54
+ resp = self.source.get_map(
55
+ MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
56
+ )
57
+ assert resp.cacheable
58
+ assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 0))]
59
+
60
+ def test_image_response(self):
61
+ error_handler = HTTPSourceErrorHandler()
62
+ error_handler.add_handler(500, (255, 0, 0), cacheable=False)
63
+ self.source = TiledSource(self.grid, self.client, error_handler=error_handler)
64
+
65
+ with mock_httpd(
66
+ TEST_SERVER_ADDRESS,
67
+ [
68
+ (
69
+ {"path": "/1/0/0.png"},
70
+ {
71
+ "body": b"error",
72
+ "status": 500,
73
+ "headers": {"content-type": "text/plain"},
74
+ },
75
+ )
76
+ ],
77
+ ):
78
+ resp = self.source.get_map(
79
+ MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
80
+ )
81
+ assert not resp.cacheable
82
+ assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 0))]
83
+
84
+ def test_multiple_image_responses(self):
85
+ error_handler = HTTPSourceErrorHandler()
86
+ error_handler.add_handler(500, (255, 0, 0), cacheable=False)
87
+ error_handler.add_handler(204, (255, 0, 127, 200), cacheable=True)
88
+ self.source = TiledSource(self.grid, self.client, error_handler=error_handler)
89
+
90
+ with mock_httpd(
91
+ TEST_SERVER_ADDRESS,
92
+ [
93
+ (
94
+ {"path": "/1/0/0.png"},
95
+ {
96
+ "body": b"error",
97
+ "status": 500,
98
+ "headers": {"content-type": "text/plain"},
99
+ },
100
+ ),
101
+ (
102
+ {"path": "/1/0/0.png"},
103
+ {
104
+ "body": b"error",
105
+ "status": 204,
106
+ "headers": {"content-type": "text/plain"},
107
+ },
108
+ ),
109
+ ],
110
+ ):
111
+
112
+ resp = self.source.get_map(
113
+ MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
114
+ )
115
+ assert not resp.cacheable
116
+ assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 0))]
117
+
118
+ resp = self.source.get_map(
119
+ MapQuery([-180, -90, 0, 90], (256, 256), SRS(4326), format="png")
120
+ )
121
+ assert resp.cacheable
122
+ assert resp.as_image().getcolors() == [((256 * 256), (255, 0, 127, 200))]
@@ -0,0 +1,31 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010, 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 mapproxy.tilefilter import tile_watermark_placement
17
+
18
+
19
+ def test_tile_watermark_placement():
20
+ assert tile_watermark_placement((0, 0, 0)) == "c"
21
+ assert tile_watermark_placement((1, 0, 0)) == "c"
22
+ assert tile_watermark_placement((0, 1, 0)) == "b"
23
+ assert tile_watermark_placement((1, 1, 0)) == "b"
24
+
25
+ assert tile_watermark_placement((0, 0, 0), True) is None
26
+ assert tile_watermark_placement((1, 0, 0), True) == "c"
27
+ assert tile_watermark_placement((2, 0, 0), True) is None
28
+
29
+ assert tile_watermark_placement((0, 1, 0), True) == "c"
30
+ assert tile_watermark_placement((1, 1, 0), True) is None
31
+ assert tile_watermark_placement((2, 1, 0), True) == "c"
@@ -0,0 +1,25 @@
1
+ # This file is part of the MapProxy project.
2
+ # Copyright (C) 2010, 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
+ from mapproxy.util.times import timestamp_from_isodate
16
+
17
+ import pytest
18
+
19
+
20
+ def test_timestamp_from_isodate():
21
+ ts = timestamp_from_isodate("2009-06-09T10:57:00")
22
+ assert (1244537820.0 - 14 * 3600) < ts < (1244537820.0 + 14 * 3600)
23
+
24
+ with pytest.raises(ValueError):
25
+ timestamp_from_isodate("2009-06-09T10:57")
@@ -0,0 +1,50 @@
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 datetime import datetime
17
+ from mapproxy.util.times import parse_httpdate, format_httpdate, timestamp
18
+
19
+ import pytest
20
+
21
+
22
+ class TestHTTPDate(object):
23
+
24
+ def test_parse_httpdate(self):
25
+ for date in (
26
+ "Fri, 13 Feb 2009 23:31:30 GMT",
27
+ "Friday, 13-Feb-09 23:31:30 GMT",
28
+ "Fri Feb 13 23:31:30 2009",
29
+ ):
30
+ assert parse_httpdate(date) == 1234567890
31
+
32
+ def test_parse_invalid(self):
33
+ for date in (None, "foobar", "4823764923", "Fri, 13 Foo 2009 23:31:30 GMT"):
34
+ assert parse_httpdate(date) is None
35
+
36
+ def test_format_httpdate(self):
37
+ assert (
38
+ format_httpdate(datetime.fromtimestamp(1234567890))
39
+ == "Fri, 13 Feb 2009 23:31:30 GMT"
40
+ )
41
+ assert format_httpdate(1234567890) == "Fri, 13 Feb 2009 23:31:30 GMT"
42
+
43
+ def test_format_invalid(self):
44
+ with pytest.raises(AssertionError):
45
+ format_httpdate("foobar")
46
+
47
+
48
+ def test_timestamp():
49
+ assert timestamp(1234567890) == 1234567890
50
+ assert timestamp(datetime.fromtimestamp(1234567890)) == 1234567890
@@ -0,0 +1,75 @@
1
+ # -:- encoding: utf-8 -:-
2
+ # This file is part of the MapProxy project.
3
+ # Copyright (C) 2013 Omniscale <http://omniscale.de>
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ from copy import deepcopy
18
+
19
+ from mapproxy.script.conf.utils import update_config
20
+
21
+
22
+ class TestUpdateConfig(object):
23
+
24
+ def test_empty(self):
25
+ a = {"a": "foo", "b": 42}
26
+ b = {}
27
+ assert update_config(deepcopy(a), b) == a
28
+
29
+ def test_add(self):
30
+ a = {"a": "foo", "b": 42}
31
+ b = {"c": [1, 2, 3]}
32
+ assert update_config(a, b) == {"a": "foo", "b": 42, "c": [1, 2, 3]}
33
+
34
+ def test_mod(self):
35
+ a = {"a": "foo", "b": 42, "c": {}}
36
+ b = {"a": [1, 2, 3], "c": 1}
37
+ assert update_config(a, b) == {"b": 42, "a": [1, 2, 3], "c": 1}
38
+
39
+ def test_nested_add_mod(self):
40
+ a = {"a": "foo", "b": {"ba": 42, "bb": {}}}
41
+ b = {"b": {"bb": {"bba": 1}, "bc": [1, 2, 3]}}
42
+ assert update_config(a, b) == {
43
+ "a": "foo",
44
+ "b": {"ba": 42, "bb": {"bba": 1}, "bc": [1, 2, 3]},
45
+ }
46
+
47
+ def test_add_all(self):
48
+ a = {"a": "foo", "b": {"ba": 42, "bb": {}}}
49
+ b = {"__all__": {"ba": 1}}
50
+ assert update_config(a, b) == {"a": {"ba": 1}, "b": {"ba": 1, "bb": {}}}
51
+
52
+ def test_extend(self):
53
+ a = {"a": "foo", "b": ["ba"]}
54
+ b = {"b__extend__": ["bb", "bc"]}
55
+ assert update_config(a, b) == {"a": "foo", "b": ["ba", "bb", "bc"]}
56
+
57
+ def test_prefix_wildcard(self):
58
+ a = {"test_foo": "foo", "test_bar": "ba", "test2_foo": "test2", "nounderfoo": 1}
59
+ b = {"____foo": 42}
60
+ assert update_config(a, b) == {
61
+ "test_foo": 42,
62
+ "test_bar": "ba",
63
+ "test2_foo": 42,
64
+ "nounderfoo": 1,
65
+ }
66
+
67
+ def test_suffix_wildcard(self):
68
+ a = {"test_foo": "foo", "test_bar": "ba", "test2_foo": "test2", "nounderfoo": 1}
69
+ b = {"test____": 42}
70
+ assert update_config(a, b) == {
71
+ "test_foo": 42,
72
+ "test_bar": 42,
73
+ "test2_foo": "test2",
74
+ "nounderfoo": 1,
75
+ }