MapProxy 1.16.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. mapproxy/__init__.py +0 -0
  2. mapproxy/cache/__init__.py +36 -0
  3. mapproxy/cache/azureblob.py +145 -0
  4. mapproxy/cache/base.py +111 -0
  5. mapproxy/cache/compact.py +664 -0
  6. mapproxy/cache/couchdb.py +295 -0
  7. mapproxy/cache/dummy.py +34 -0
  8. mapproxy/cache/file.py +185 -0
  9. mapproxy/cache/geopackage.py +609 -0
  10. mapproxy/cache/legend.py +83 -0
  11. mapproxy/cache/mbtiles.py +392 -0
  12. mapproxy/cache/meta.py +78 -0
  13. mapproxy/cache/path.py +250 -0
  14. mapproxy/cache/redis.py +88 -0
  15. mapproxy/cache/renderd.py +95 -0
  16. mapproxy/cache/riak.py +202 -0
  17. mapproxy/cache/s3.py +177 -0
  18. mapproxy/cache/tile.py +699 -0
  19. mapproxy/client/__init__.py +0 -0
  20. mapproxy/client/arcgis.py +79 -0
  21. mapproxy/client/cgi.py +139 -0
  22. mapproxy/client/http.py +315 -0
  23. mapproxy/client/log.py +33 -0
  24. mapproxy/client/tile.py +150 -0
  25. mapproxy/client/wms.py +254 -0
  26. mapproxy/compat/__init__.py +46 -0
  27. mapproxy/compat/image.py +79 -0
  28. mapproxy/compat/itertools.py +29 -0
  29. mapproxy/compat/modules.py +13 -0
  30. mapproxy/config/__init__.py +22 -0
  31. mapproxy/config/config.py +201 -0
  32. mapproxy/config/coverage.py +107 -0
  33. mapproxy/config/defaults.py +98 -0
  34. mapproxy/config/loader.py +2286 -0
  35. mapproxy/config/spec.py +644 -0
  36. mapproxy/config/validator.py +239 -0
  37. mapproxy/config_template/__init__.py +0 -0
  38. mapproxy/config_template/base_config/config.wsgi +10 -0
  39. mapproxy/config_template/base_config/full_example.yaml +593 -0
  40. mapproxy/config_template/base_config/full_seed_example.yaml +79 -0
  41. mapproxy/config_template/base_config/log.ini +35 -0
  42. mapproxy/config_template/base_config/mapproxy.yaml +60 -0
  43. mapproxy/config_template/base_config/seed.yaml +27 -0
  44. mapproxy/exception.py +142 -0
  45. mapproxy/featureinfo.py +252 -0
  46. mapproxy/grid.py +1170 -0
  47. mapproxy/image/__init__.py +536 -0
  48. mapproxy/image/fonts/DejaVuSans.ttf +0 -0
  49. mapproxy/image/fonts/DejaVuSansMono.ttf +0 -0
  50. mapproxy/image/fonts/LICENSE +99 -0
  51. mapproxy/image/fonts/__init__.py +0 -0
  52. mapproxy/image/mask.py +75 -0
  53. mapproxy/image/merge.py +316 -0
  54. mapproxy/image/message.py +347 -0
  55. mapproxy/image/opts.py +182 -0
  56. mapproxy/image/tile.py +167 -0
  57. mapproxy/image/transform.py +350 -0
  58. mapproxy/layer.py +470 -0
  59. mapproxy/multiapp.py +231 -0
  60. mapproxy/proj.py +302 -0
  61. mapproxy/request/__init__.py +18 -0
  62. mapproxy/request/arcgis.py +259 -0
  63. mapproxy/request/base.py +476 -0
  64. mapproxy/request/tile.py +128 -0
  65. mapproxy/request/wms/__init__.py +793 -0
  66. mapproxy/request/wms/exception.py +99 -0
  67. mapproxy/request/wmts.py +436 -0
  68. mapproxy/response.py +237 -0
  69. mapproxy/script/__init__.py +0 -0
  70. mapproxy/script/conf/__init__.py +0 -0
  71. mapproxy/script/conf/app.py +195 -0
  72. mapproxy/script/conf/caches.py +45 -0
  73. mapproxy/script/conf/layers.py +54 -0
  74. mapproxy/script/conf/seeds.py +37 -0
  75. mapproxy/script/conf/sources.py +86 -0
  76. mapproxy/script/conf/utils.py +143 -0
  77. mapproxy/script/defrag.py +184 -0
  78. mapproxy/script/export.py +333 -0
  79. mapproxy/script/grids.py +188 -0
  80. mapproxy/script/scales.py +126 -0
  81. mapproxy/script/util.py +406 -0
  82. mapproxy/script/wms_capabilities.py +152 -0
  83. mapproxy/seed/__init__.py +0 -0
  84. mapproxy/seed/cachelock.py +121 -0
  85. mapproxy/seed/cleanup.py +187 -0
  86. mapproxy/seed/config.py +469 -0
  87. mapproxy/seed/script.py +388 -0
  88. mapproxy/seed/seeder.py +538 -0
  89. mapproxy/seed/spec.py +64 -0
  90. mapproxy/seed/util.py +254 -0
  91. mapproxy/service/__init__.py +14 -0
  92. mapproxy/service/base.py +46 -0
  93. mapproxy/service/demo.py +356 -0
  94. mapproxy/service/kml.py +331 -0
  95. mapproxy/service/ows.py +38 -0
  96. mapproxy/service/template_helper.py +53 -0
  97. mapproxy/service/templates/demo/capabilities_demo.html +16 -0
  98. mapproxy/service/templates/demo/demo.html +181 -0
  99. mapproxy/service/templates/demo/openlayers-demo.cfg +16 -0
  100. mapproxy/service/templates/demo/static/img/blank.gif +0 -0
  101. mapproxy/service/templates/demo/static/img/east-mini.png +0 -0
  102. mapproxy/service/templates/demo/static/img/north-mini.png +0 -0
  103. mapproxy/service/templates/demo/static/img/south-mini.png +0 -0
  104. mapproxy/service/templates/demo/static/img/west-mini.png +0 -0
  105. mapproxy/service/templates/demo/static/img/zoom-minus-mini.png +0 -0
  106. mapproxy/service/templates/demo/static/img/zoom-plus-mini.png +0 -0
  107. mapproxy/service/templates/demo/static/img/zoom-world-mini.png +0 -0
  108. mapproxy/service/templates/demo/static/logo.png +0 -0
  109. mapproxy/service/templates/demo/static/ol.css +345 -0
  110. mapproxy/service/templates/demo/static/ol.js +4 -0
  111. mapproxy/service/templates/demo/static/proj4.min.js +1 -0
  112. mapproxy/service/templates/demo/static/proj4defs.js +1 -0
  113. mapproxy/service/templates/demo/static/site.css +137 -0
  114. mapproxy/service/templates/demo/static/theme/default/framedCloud.css +0 -0
  115. mapproxy/service/templates/demo/static/theme/default/google.css +17 -0
  116. mapproxy/service/templates/demo/static/theme/default/ie6-style.css +10 -0
  117. mapproxy/service/templates/demo/static/theme/default/style.css +482 -0
  118. mapproxy/service/templates/demo/static.html +34 -0
  119. mapproxy/service/templates/demo/tms_demo.html +103 -0
  120. mapproxy/service/templates/demo/wms_demo.html +140 -0
  121. mapproxy/service/templates/demo/wmts_demo.html +110 -0
  122. mapproxy/service/templates/tms_capabilities.xml +13 -0
  123. mapproxy/service/templates/tms_exception.xml +4 -0
  124. mapproxy/service/templates/tms_root_resource.xml +7 -0
  125. mapproxy/service/templates/tms_tilemap_capabilities.xml +14 -0
  126. mapproxy/service/templates/wms100capabilities.xml +112 -0
  127. mapproxy/service/templates/wms100exception.xml +4 -0
  128. mapproxy/service/templates/wms110capabilities.xml +152 -0
  129. mapproxy/service/templates/wms110exception.xml +5 -0
  130. mapproxy/service/templates/wms111capabilities.xml +183 -0
  131. mapproxy/service/templates/wms111exception.xml +5 -0
  132. mapproxy/service/templates/wms130capabilities.xml +326 -0
  133. mapproxy/service/templates/wms130exception.xml +8 -0
  134. mapproxy/service/templates/wmts100capabilities.xml +155 -0
  135. mapproxy/service/templates/wmts100exception.xml +9 -0
  136. mapproxy/service/tile.py +536 -0
  137. mapproxy/service/wms.py +851 -0
  138. mapproxy/service/wmts.py +381 -0
  139. mapproxy/source/__init__.py +75 -0
  140. mapproxy/source/arcgis.py +39 -0
  141. mapproxy/source/error.py +39 -0
  142. mapproxy/source/mapnik.py +259 -0
  143. mapproxy/source/tile.py +96 -0
  144. mapproxy/source/wms.py +270 -0
  145. mapproxy/srs.py +726 -0
  146. mapproxy/template.py +54 -0
  147. mapproxy/test/__init__.py +0 -0
  148. mapproxy/test/conftest.py +7 -0
  149. mapproxy/test/helper.py +247 -0
  150. mapproxy/test/http.py +494 -0
  151. mapproxy/test/image.py +210 -0
  152. mapproxy/test/mocker.py +2268 -0
  153. mapproxy/test/schemas/inspire/common/1.0/common.xsd +1461 -0
  154. mapproxy/test/schemas/inspire/common/1.0/enums/enum_bul.xsd +108 -0
  155. mapproxy/test/schemas/inspire/common/1.0/enums/enum_cze.xsd +108 -0
  156. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dan.xsd +108 -0
  157. mapproxy/test/schemas/inspire/common/1.0/enums/enum_dut.xsd +108 -0
  158. mapproxy/test/schemas/inspire/common/1.0/enums/enum_eng.xsd +155 -0
  159. mapproxy/test/schemas/inspire/common/1.0/enums/enum_est.xsd +108 -0
  160. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fin.xsd +108 -0
  161. mapproxy/test/schemas/inspire/common/1.0/enums/enum_fre.xsd +108 -0
  162. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ger.xsd +108 -0
  163. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gle.xsd +109 -0
  164. mapproxy/test/schemas/inspire/common/1.0/enums/enum_gre.xsd +108 -0
  165. mapproxy/test/schemas/inspire/common/1.0/enums/enum_hun.xsd +108 -0
  166. mapproxy/test/schemas/inspire/common/1.0/enums/enum_ita.xsd +108 -0
  167. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lav.xsd +108 -0
  168. mapproxy/test/schemas/inspire/common/1.0/enums/enum_lit.xsd +108 -0
  169. mapproxy/test/schemas/inspire/common/1.0/enums/enum_mlt.xsd +108 -0
  170. mapproxy/test/schemas/inspire/common/1.0/enums/enum_pol.xsd +108 -0
  171. mapproxy/test/schemas/inspire/common/1.0/enums/enum_por.xsd +108 -0
  172. mapproxy/test/schemas/inspire/common/1.0/enums/enum_rum.xsd +108 -0
  173. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slo.xsd +108 -0
  174. mapproxy/test/schemas/inspire/common/1.0/enums/enum_slv.xsd +108 -0
  175. mapproxy/test/schemas/inspire/common/1.0/enums/enum_spa.xsd +108 -0
  176. mapproxy/test/schemas/inspire/common/1.0/enums/enum_swe.xsd +108 -0
  177. mapproxy/test/schemas/inspire/common/1.0/network.xsd +521 -0
  178. mapproxy/test/schemas/inspire/inspire_vs/1.0/inspire_vs.xsd +19 -0
  179. mapproxy/test/schemas/kml/2.2.0/ReadMe.txt +14 -0
  180. mapproxy/test/schemas/kml/2.2.0/atom-author-link.xsd +66 -0
  181. mapproxy/test/schemas/kml/2.2.0/ogckml22.xsd +1646 -0
  182. mapproxy/test/schemas/kml/2.2.0/xAL.xsd +1680 -0
  183. mapproxy/test/schemas/ows/1.1.0/ReadMe.txt +87 -0
  184. mapproxy/test/schemas/ows/1.1.0/ows19115subset.xsd +235 -0
  185. mapproxy/test/schemas/ows/1.1.0/owsAll.xsd +23 -0
  186. mapproxy/test/schemas/ows/1.1.0/owsCommon.xsd +157 -0
  187. mapproxy/test/schemas/ows/1.1.0/owsContents.xsd +86 -0
  188. mapproxy/test/schemas/ows/1.1.0/owsDataIdentification.xsd +127 -0
  189. mapproxy/test/schemas/ows/1.1.0/owsDomainType.xsd +279 -0
  190. mapproxy/test/schemas/ows/1.1.0/owsExceptionReport.xsd +76 -0
  191. mapproxy/test/schemas/ows/1.1.0/owsGetCapabilities.xsd +112 -0
  192. mapproxy/test/schemas/ows/1.1.0/owsGetResourceByID.xsd +51 -0
  193. mapproxy/test/schemas/ows/1.1.0/owsInputOutputData.xsd +59 -0
  194. mapproxy/test/schemas/ows/1.1.0/owsManifest.xsd +125 -0
  195. mapproxy/test/schemas/ows/1.1.0/owsOperationsMetadata.xsd +140 -0
  196. mapproxy/test/schemas/ows/1.1.0/owsServiceIdentification.xsd +60 -0
  197. mapproxy/test/schemas/ows/1.1.0/owsServiceProvider.xsd +47 -0
  198. mapproxy/test/schemas/sld/1.1.0/sld_capabilities.xsd +27 -0
  199. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.dtd +353 -0
  200. mapproxy/test/schemas/wms/1.0.0/capabilities_1_0_0.xml +188 -0
  201. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.dtd +524 -0
  202. mapproxy/test/schemas/wms/1.0.7/capabilities_1_0_7.xml +260 -0
  203. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.dtd +273 -0
  204. mapproxy/test/schemas/wms/1.1.0/capabilities_1_1_0.xml +303 -0
  205. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.dtd +6 -0
  206. mapproxy/test/schemas/wms/1.1.0/exception_1_1_0.xml +33 -0
  207. mapproxy/test/schemas/wms/1.1.1/OGC-exception.xsd +68 -0
  208. mapproxy/test/schemas/wms/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  209. mapproxy/test/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd +274 -0
  210. mapproxy/test/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  211. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.dtd +276 -0
  212. mapproxy/test/schemas/wms/1.1.1/capabilities_1_1_1.xml +303 -0
  213. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.dtd +6 -0
  214. mapproxy/test/schemas/wms/1.1.1/exception_1_1_1.xml +33 -0
  215. mapproxy/test/schemas/wms/1.3.0/ReadMe.txt +8 -0
  216. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xml +277 -0
  217. mapproxy/test/schemas/wms/1.3.0/capabilities_1_3_0.xsd +611 -0
  218. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xml +34 -0
  219. mapproxy/test/schemas/wms/1.3.0/exceptions_1_3_0.xsd +28 -0
  220. mapproxy/test/schemas/wmsc/1.1.1/OGC-exception.xsd +68 -0
  221. mapproxy/test/schemas/wmsc/1.1.1/WMS_DescribeLayerResponse.dtd +22 -0
  222. mapproxy/test/schemas/wmsc/1.1.1/WMS_MS_Capabilities.dtd +283 -0
  223. mapproxy/test/schemas/wmsc/1.1.1/WMS_exception_1_1_1.dtd +5 -0
  224. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.dtd +276 -0
  225. mapproxy/test/schemas/wmsc/1.1.1/capabilities_1_1_1.xml +303 -0
  226. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.dtd +6 -0
  227. mapproxy/test/schemas/wmsc/1.1.1/exception_1_1_1.xml +33 -0
  228. mapproxy/test/schemas/wmts/1.0/ReadMe.txt +32 -0
  229. mapproxy/test/schemas/wmts/1.0/wmts.xsd +28 -0
  230. mapproxy/test/schemas/wmts/1.0/wmtsAbstract.wsdl +151 -0
  231. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_request.xsd +38 -0
  232. mapproxy/test/schemas/wmts/1.0/wmtsGetCapabilities_response.xsd +564 -0
  233. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_request.xsd +57 -0
  234. mapproxy/test/schemas/wmts/1.0/wmtsGetFeatureInfo_response.xsd +72 -0
  235. mapproxy/test/schemas/wmts/1.0/wmtsGetTile_request.xsd +91 -0
  236. mapproxy/test/schemas/wmts/1.0/wmtsKVP.xsd +76 -0
  237. mapproxy/test/schemas/wmts/1.0/wmtsPayload_response.xsd +70 -0
  238. mapproxy/test/schemas/xlink/1.0.0/ReadMe.txt +6 -0
  239. mapproxy/test/schemas/xlink/1.0.0/xlinks.xsd +122 -0
  240. mapproxy/test/schemas/xml.xsd +287 -0
  241. mapproxy/test/system/__init__.py +98 -0
  242. mapproxy/test/system/fixture/arcgis.yaml +57 -0
  243. mapproxy/test/system/fixture/auth.yaml +70 -0
  244. mapproxy/test/system/fixture/cache.mbtiles +0 -0
  245. mapproxy/test/system/fixture/cache_azureblob.yaml +59 -0
  246. mapproxy/test/system/fixture/cache_band_merge.yaml +73 -0
  247. mapproxy/test/system/fixture/cache_bulk_meta_tiles.yaml +24 -0
  248. mapproxy/test/system/fixture/cache_data/dop_cache_EPSG3857/00/000/000/000/000/000/000.png +0 -0
  249. mapproxy/test/system/fixture/cache_data/wms_cache_EPSG900913/01/000/000/000/000/000/001.jpeg +0 -0
  250. mapproxy/test/system/fixture/cache_data/wms_cache_transparent_EPSG900913/01/000/000/000/000/000/001.png +0 -0
  251. mapproxy/test/system/fixture/cache_geopackage.yaml +56 -0
  252. mapproxy/test/system/fixture/cache_grid_names.yaml +50 -0
  253. mapproxy/test/system/fixture/cache_mbtiles.yaml +28 -0
  254. mapproxy/test/system/fixture/cache_s3.yaml +58 -0
  255. mapproxy/test/system/fixture/cache_source.yaml +81 -0
  256. mapproxy/test/system/fixture/combined_sources.yaml +130 -0
  257. mapproxy/test/system/fixture/coverage.yaml +77 -0
  258. mapproxy/test/system/fixture/demo.yaml +135 -0
  259. mapproxy/test/system/fixture/dimension.yaml +59 -0
  260. mapproxy/test/system/fixture/disable_storage.yaml +25 -0
  261. mapproxy/test/system/fixture/empty_ogrdata.geojson +1 -0
  262. mapproxy/test/system/fixture/formats.yaml +72 -0
  263. mapproxy/test/system/fixture/inspire.yaml +101 -0
  264. mapproxy/test/system/fixture/inspire_full.yaml +124 -0
  265. mapproxy/test/system/fixture/kml_layer.yaml +66 -0
  266. mapproxy/test/system/fixture/layer.yaml +260 -0
  267. mapproxy/test/system/fixture/layergroups.yaml +57 -0
  268. mapproxy/test/system/fixture/layergroups_root.yaml +106 -0
  269. mapproxy/test/system/fixture/legendgraphic.yaml +93 -0
  270. mapproxy/test/system/fixture/mapnik_source.yaml +66 -0
  271. mapproxy/test/system/fixture/mapproxy_export.yaml +12 -0
  272. mapproxy/test/system/fixture/mapserver.yaml +23 -0
  273. mapproxy/test/system/fixture/minimal_cgi.py +16 -0
  274. mapproxy/test/system/fixture/mixed_mode.yaml +49 -0
  275. mapproxy/test/system/fixture/multi_cache_layers.yaml +100 -0
  276. mapproxy/test/system/fixture/multiapp1.yaml +20 -0
  277. mapproxy/test/system/fixture/multiapp2.yaml +19 -0
  278. mapproxy/test/system/fixture/renderd_client.yaml +55 -0
  279. mapproxy/test/system/fixture/scalehints.yaml +70 -0
  280. mapproxy/test/system/fixture/seed.yaml +94 -0
  281. mapproxy/test/system/fixture/seed_mapproxy.yaml +39 -0
  282. mapproxy/test/system/fixture/seed_old.yaml +12 -0
  283. mapproxy/test/system/fixture/seed_timeouts.yaml +12 -0
  284. mapproxy/test/system/fixture/seed_timeouts_mapproxy.yaml +27 -0
  285. mapproxy/test/system/fixture/seedonly.yaml +51 -0
  286. mapproxy/test/system/fixture/sld.yaml +35 -0
  287. mapproxy/test/system/fixture/source_errors.yaml +84 -0
  288. mapproxy/test/system/fixture/source_errors_raise.yaml +82 -0
  289. mapproxy/test/system/fixture/tileservice_origin.yaml +26 -0
  290. mapproxy/test/system/fixture/tileservice_refresh.yaml +59 -0
  291. mapproxy/test/system/fixture/tilesource_minmax_res.yaml +22 -0
  292. mapproxy/test/system/fixture/util-conf-base-grids.yaml +5 -0
  293. mapproxy/test/system/fixture/util-conf-overwrite.yaml +13 -0
  294. mapproxy/test/system/fixture/util-conf-wms-111-cap.xml +90 -0
  295. mapproxy/test/system/fixture/util_grids.yaml +30 -0
  296. mapproxy/test/system/fixture/util_wms_capabilities111.xml +130 -0
  297. mapproxy/test/system/fixture/util_wms_capabilities130.xml +100 -0
  298. mapproxy/test/system/fixture/util_wms_capabilities_service_exception.xml +5 -0
  299. mapproxy/test/system/fixture/watermark.yaml +50 -0
  300. mapproxy/test/system/fixture/wms_srs_extent.yaml +39 -0
  301. mapproxy/test/system/fixture/wms_versions.yaml +38 -0
  302. mapproxy/test/system/fixture/wmts.yaml +134 -0
  303. mapproxy/test/system/fixture/wmts_dimensions.yaml +57 -0
  304. mapproxy/test/system/fixture/xslt_featureinfo.yaml +54 -0
  305. mapproxy/test/system/fixture/xslt_featureinfo_input.yaml +51 -0
  306. mapproxy/test/system/test_arcgis.py +156 -0
  307. mapproxy/test/system/test_auth.py +1134 -0
  308. mapproxy/test/system/test_behind_proxy.py +75 -0
  309. mapproxy/test/system/test_bulk_meta_tiles.py +106 -0
  310. mapproxy/test/system/test_cache_azureblob.py +127 -0
  311. mapproxy/test/system/test_cache_band_merge.py +103 -0
  312. mapproxy/test/system/test_cache_geopackage.py +144 -0
  313. mapproxy/test/system/test_cache_grid_names.py +89 -0
  314. mapproxy/test/system/test_cache_mbtiles.py +85 -0
  315. mapproxy/test/system/test_cache_s3.py +115 -0
  316. mapproxy/test/system/test_cache_source.py +146 -0
  317. mapproxy/test/system/test_combined_sources.py +335 -0
  318. mapproxy/test/system/test_coverage.py +140 -0
  319. mapproxy/test/system/test_decorate_img.py +214 -0
  320. mapproxy/test/system/test_demo.py +106 -0
  321. mapproxy/test/system/test_demo_with_extra_service.py +53 -0
  322. mapproxy/test/system/test_dimensions.py +278 -0
  323. mapproxy/test/system/test_disable_storage.py +42 -0
  324. mapproxy/test/system/test_formats.py +219 -0
  325. mapproxy/test/system/test_inspire_vs.py +173 -0
  326. mapproxy/test/system/test_kml.py +262 -0
  327. mapproxy/test/system/test_layergroups.py +160 -0
  328. mapproxy/test/system/test_legendgraphic.py +308 -0
  329. mapproxy/test/system/test_mapnik.py +161 -0
  330. mapproxy/test/system/test_mapserver.py +81 -0
  331. mapproxy/test/system/test_mixed_mode_format.py +195 -0
  332. mapproxy/test/system/test_multi_cache_layers.py +167 -0
  333. mapproxy/test/system/test_multiapp.py +92 -0
  334. mapproxy/test/system/test_refresh.py +207 -0
  335. mapproxy/test/system/test_renderd_client.py +304 -0
  336. mapproxy/test/system/test_response_headers.py +54 -0
  337. mapproxy/test/system/test_scalehints.py +140 -0
  338. mapproxy/test/system/test_seed.py +422 -0
  339. mapproxy/test/system/test_seed_only.py +93 -0
  340. mapproxy/test/system/test_sld.py +120 -0
  341. mapproxy/test/system/test_source_errors.py +377 -0
  342. mapproxy/test/system/test_tilesource_minmax_res.py +54 -0
  343. mapproxy/test/system/test_tms.py +276 -0
  344. mapproxy/test/system/test_tms_origin.py +46 -0
  345. mapproxy/test/system/test_util_conf.py +304 -0
  346. mapproxy/test/system/test_util_export.py +210 -0
  347. mapproxy/test/system/test_util_grids.py +88 -0
  348. mapproxy/test/system/test_util_wms_capabilities.py +182 -0
  349. mapproxy/test/system/test_watermark.py +91 -0
  350. mapproxy/test/system/test_wms.py +1611 -0
  351. mapproxy/test/system/test_wms_srs_extent.py +165 -0
  352. mapproxy/test/system/test_wms_version.py +85 -0
  353. mapproxy/test/system/test_wmsc.py +116 -0
  354. mapproxy/test/system/test_wmts.py +334 -0
  355. mapproxy/test/system/test_wmts_dimensions.py +206 -0
  356. mapproxy/test/system/test_wmts_restful.py +198 -0
  357. mapproxy/test/system/test_xslt_featureinfo.py +425 -0
  358. mapproxy/test/test_http_helper.py +219 -0
  359. mapproxy/test/unit/__init__.py +0 -0
  360. mapproxy/test/unit/epsg +2 -0
  361. mapproxy/test/unit/polygons/polygons.dbf +0 -0
  362. mapproxy/test/unit/polygons/polygons.shp +0 -0
  363. mapproxy/test/unit/polygons/polygons.shx +0 -0
  364. mapproxy/test/unit/test_async.py +245 -0
  365. mapproxy/test/unit/test_auth.py +419 -0
  366. mapproxy/test/unit/test_cache.py +1193 -0
  367. mapproxy/test/unit/test_cache_azureblob.py +94 -0
  368. mapproxy/test/unit/test_cache_compact.py +319 -0
  369. mapproxy/test/unit/test_cache_couchdb.py +114 -0
  370. mapproxy/test/unit/test_cache_geopackage.py +221 -0
  371. mapproxy/test/unit/test_cache_redis.py +67 -0
  372. mapproxy/test/unit/test_cache_riak.py +76 -0
  373. mapproxy/test/unit/test_cache_s3.py +84 -0
  374. mapproxy/test/unit/test_cache_tile.py +427 -0
  375. mapproxy/test/unit/test_client.py +479 -0
  376. mapproxy/test/unit/test_client_arcgis.py +73 -0
  377. mapproxy/test/unit/test_client_cgi.py +136 -0
  378. mapproxy/test/unit/test_collections.py +116 -0
  379. mapproxy/test/unit/test_concat_legends.py +37 -0
  380. mapproxy/test/unit/test_conf_loader.py +1061 -0
  381. mapproxy/test/unit/test_conf_validator.py +416 -0
  382. mapproxy/test/unit/test_config.py +117 -0
  383. mapproxy/test/unit/test_decorate_img.py +185 -0
  384. mapproxy/test/unit/test_exceptions.py +258 -0
  385. mapproxy/test/unit/test_featureinfo.py +291 -0
  386. mapproxy/test/unit/test_file_lock_load.py +49 -0
  387. mapproxy/test/unit/test_geom.py +503 -0
  388. mapproxy/test/unit/test_grid.py +1258 -0
  389. mapproxy/test/unit/test_image.py +1053 -0
  390. mapproxy/test/unit/test_image_mask.py +181 -0
  391. mapproxy/test/unit/test_image_messages.py +197 -0
  392. mapproxy/test/unit/test_image_options.py +160 -0
  393. mapproxy/test/unit/test_isodate.py +122 -0
  394. mapproxy/test/unit/test_multiapp.py +163 -0
  395. mapproxy/test/unit/test_ogr_reader.py +50 -0
  396. mapproxy/test/unit/test_request.py +745 -0
  397. mapproxy/test/unit/test_request_wmts.py +178 -0
  398. mapproxy/test/unit/test_response.py +79 -0
  399. mapproxy/test/unit/test_seed.py +365 -0
  400. mapproxy/test/unit/test_seed_cachelock.py +90 -0
  401. mapproxy/test/unit/test_srs.py +215 -0
  402. mapproxy/test/unit/test_tiled_source.py +122 -0
  403. mapproxy/test/unit/test_tilefilter.py +31 -0
  404. mapproxy/test/unit/test_times.py +25 -0
  405. mapproxy/test/unit/test_timeutils.py +50 -0
  406. mapproxy/test/unit/test_util_conf_utils.py +75 -0
  407. mapproxy/test/unit/test_utils.py +476 -0
  408. mapproxy/test/unit/test_wms_capabilities.py +44 -0
  409. mapproxy/test/unit/test_wms_layer.py +113 -0
  410. mapproxy/test/unit/test_yaml.py +69 -0
  411. mapproxy/tilefilter.py +59 -0
  412. mapproxy/util/__init__.py +0 -0
  413. mapproxy/util/async_.py +227 -0
  414. mapproxy/util/collections.py +132 -0
  415. mapproxy/util/coverage.py +329 -0
  416. mapproxy/util/escape.py +10 -0
  417. mapproxy/util/ext/__init__.py +14 -0
  418. mapproxy/util/ext/dictspec/__init__.py +1 -0
  419. mapproxy/util/ext/dictspec/spec.py +124 -0
  420. mapproxy/util/ext/dictspec/test/__init__.py +0 -0
  421. mapproxy/util/ext/dictspec/test/test_validator.py +274 -0
  422. mapproxy/util/ext/dictspec/validator.py +189 -0
  423. mapproxy/util/ext/local.py +196 -0
  424. mapproxy/util/ext/lockfile.py +138 -0
  425. mapproxy/util/ext/odict.py +330 -0
  426. mapproxy/util/ext/serving.py +508 -0
  427. mapproxy/util/ext/tempita/__init__.py +1174 -0
  428. mapproxy/util/ext/tempita/_looper.py +163 -0
  429. mapproxy/util/ext/tempita/compat3.py +46 -0
  430. mapproxy/util/ext/wmsparse/__init__.py +3 -0
  431. mapproxy/util/ext/wmsparse/duration.py +597 -0
  432. mapproxy/util/ext/wmsparse/parse.py +305 -0
  433. mapproxy/util/ext/wmsparse/test/__init__.py +0 -0
  434. mapproxy/util/ext/wmsparse/test/test_parse.py +162 -0
  435. mapproxy/util/ext/wmsparse/test/test_util.py +23 -0
  436. mapproxy/util/ext/wmsparse/test/wms-large-111.xml +2114 -0
  437. mapproxy/util/ext/wmsparse/test/wms-omniscale-111.xml +90 -0
  438. mapproxy/util/ext/wmsparse/test/wms-omniscale-130.xml +120 -0
  439. mapproxy/util/ext/wmsparse/test/wms_nasa_cap.xml +386 -0
  440. mapproxy/util/ext/wmsparse/util.py +187 -0
  441. mapproxy/util/fs.py +156 -0
  442. mapproxy/util/geom.py +295 -0
  443. mapproxy/util/lib.py +115 -0
  444. mapproxy/util/lock.py +163 -0
  445. mapproxy/util/ogr.py +231 -0
  446. mapproxy/util/py.py +81 -0
  447. mapproxy/util/times.py +75 -0
  448. mapproxy/util/yaml.py +56 -0
  449. mapproxy/version.py +31 -0
  450. mapproxy/wsgiapp.py +164 -0
  451. mapproxy-1.16.1.dist-info/METADATA +151 -0
  452. mapproxy-1.16.1.dist-info/RECORD +458 -0
  453. mapproxy-1.16.1.dist-info/WHEEL +5 -0
  454. mapproxy-1.16.1.dist-info/entry_points.txt +3 -0
  455. mapproxy-1.16.1.dist-info/licenses/AUTHORS.txt +33 -0
  456. mapproxy-1.16.1.dist-info/licenses/COPYING.txt +60 -0
  457. mapproxy-1.16.1.dist-info/licenses/LICENSE.txt +202 -0
  458. mapproxy-1.16.1.dist-info/top_level.txt +1 -0
mapproxy/response.py ADDED
@@ -0,0 +1,237 @@
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
+ """
17
+ Service responses.
18
+ """
19
+
20
+ import hashlib
21
+ from mapproxy.util.times import format_httpdate, parse_httpdate, timestamp
22
+ from mapproxy.compat import PY2, text_type, iteritems
23
+
24
+ class Response(object):
25
+ charset = 'utf-8'
26
+ default_content_type = 'text/plain'
27
+ block_size = 1024 * 32
28
+
29
+ def __init__(self, response, status=None, content_type=None, mimetype=None):
30
+ self.response = response
31
+ if status is None:
32
+ status = 200
33
+ self.status = status
34
+ self._timestamp = None
35
+ self.headers = {}
36
+ if mimetype:
37
+ if mimetype.startswith('text/'):
38
+ content_type = mimetype + '; charset=' + self.charset
39
+ else:
40
+ content_type = mimetype
41
+ if content_type is None:
42
+ content_type = self.default_content_type
43
+ self.headers['Content-type'] = content_type
44
+
45
+ if content_type.startswith(('text/', 'application/')):
46
+ # Capability documents can be dependent on the value of a few X-headers.
47
+ # Tell this caching proxies via the Vary HTTP header. This also prevents
48
+ # malicious cache poisoning.
49
+ self.headers['Vary'] = 'X-Script-Name, X-Forwarded-Host, X-Forwarded-Proto'
50
+
51
+ def _status_set(self, status):
52
+ if isinstance(status, int):
53
+ status = status_code(status)
54
+ self._status = status
55
+
56
+ def _status_get(self):
57
+ return self._status
58
+
59
+ status = property(_status_get, _status_set)
60
+
61
+ def _last_modified_set(self, date):
62
+ if not date: return
63
+ self._timestamp = timestamp(date)
64
+ self.headers['Last-modified'] = format_httpdate(self._timestamp)
65
+ def _last_modified_get(self):
66
+ return self.headers.get('Last-modified', None)
67
+
68
+ last_modified = property(_last_modified_get, _last_modified_set)
69
+
70
+ def _etag_set(self, value):
71
+ self.headers['ETag'] = value
72
+
73
+ def _etag_get(self):
74
+ return self.headers.get('ETag', None)
75
+
76
+ etag = property(_etag_get, _etag_set)
77
+
78
+ def cache_headers(self, timestamp=None, etag_data=None, max_age=None, no_cache=False):
79
+ """
80
+ Set cache-related headers.
81
+
82
+ :param timestamp: local timestamp of the last modification of the
83
+ response content
84
+ :param etag_data: list that will be used to build an ETag hash.
85
+ calls the str function on each item.
86
+ :param max_age: the maximum cache age in seconds
87
+ """
88
+ if etag_data:
89
+ hash_src = ''.join((str(x) for x in etag_data)).encode('ascii')
90
+ self.etag = hashlib.md5(hash_src).hexdigest()
91
+
92
+ if no_cache:
93
+ assert not timestamp and not max_age
94
+ self.headers['Cache-Control'] = 'no-cache, no-store'
95
+ self.headers['Pragma'] = 'no-cache'
96
+ self.headers['Expires'] = '-1'
97
+
98
+ self.last_modified = timestamp
99
+ if (timestamp or etag_data) and max_age is not None:
100
+ self.headers['Cache-control'] = 'public, max-age=%d, s-maxage=%d' % (max_age, max_age)
101
+
102
+ def make_conditional(self, req):
103
+ """
104
+ Make the response conditional to the HTTP headers in the CGI/WSGI `environ`.
105
+ Checks for ``If-none-match`` and ``If-modified-since`` headers and compares
106
+ to the etag and timestamp of this response. If the content was not modified
107
+ the repsonse will changed to HTTP 304 Not Modified.
108
+ """
109
+ if req is None:
110
+ return
111
+ environ = req.environ
112
+
113
+ not_modified = False
114
+
115
+
116
+ if self.etag == environ.get('HTTP_IF_NONE_MATCH', -1):
117
+ not_modified = True
118
+ elif self._timestamp is not None:
119
+ date = environ.get('HTTP_IF_MODIFIED_SINCE', None)
120
+ timestamp = parse_httpdate(date)
121
+ if timestamp is not None and self._timestamp <= timestamp:
122
+ not_modified = True
123
+
124
+ if not_modified:
125
+ self.status = 304
126
+ self.response = []
127
+ if 'Content-type' in self.headers:
128
+ del self.headers['Content-type']
129
+
130
+ @property
131
+ def content_length(self):
132
+ return int(self.headers.get('Content-length', 0))
133
+
134
+ @property
135
+ def content_type(self):
136
+ return self.headers['Content-type']
137
+
138
+ @property
139
+ def data(self):
140
+ if hasattr(self.response, 'read'):
141
+ return self.response.read()
142
+ else:
143
+ return b''.join(chunk.encode() for chunk in self.response)
144
+
145
+ @property
146
+ def fixed_headers(self):
147
+ headers = []
148
+ for key, value in iteritems(self.headers):
149
+ if type(value) != text_type:
150
+ # for str subclasses like ImageFormat
151
+ value = str(value)
152
+ if PY2 and isinstance(value, unicode):
153
+ value = value.encode('utf-8')
154
+ headers.append((key, value))
155
+ return headers
156
+
157
+ def __call__(self, environ, start_response):
158
+ if hasattr(self.response, 'read'):
159
+ if ((not hasattr(self.response, 'ok_to_seek') or
160
+ self.response.ok_to_seek) and
161
+ (hasattr(self.response, 'seek') and
162
+ hasattr(self.response, 'tell'))):
163
+ self.response.seek(0, 2) # to EOF
164
+ self.headers['Content-length'] = str(self.response.tell())
165
+ self.response.seek(0)
166
+ if 'wsgi.file_wrapper' in environ:
167
+ resp_iter = environ['wsgi.file_wrapper'](self.response, self.block_size)
168
+ else:
169
+ resp_iter = iter(lambda: self.response.read(self.block_size), b'')
170
+ elif not self.response:
171
+ resp_iter = iter([])
172
+ elif isinstance(self.response, text_type):
173
+ self.response = self.response.encode(self.charset)
174
+ self.headers['Content-length'] = str(len(self.response))
175
+ resp_iter = iter([self.response])
176
+ elif isinstance(self.response, bytes):
177
+ self.headers['Content-length'] = str(len(self.response))
178
+ resp_iter = iter([self.response])
179
+ else:
180
+ resp_iter = self.response
181
+
182
+ start_response(self.status, self.fixed_headers)
183
+ return resp_iter
184
+
185
+ def iter_encode(self, chunks):
186
+ for chunk in chunks:
187
+ if isinstance(chunk, text_type):
188
+ chunk = chunk.encode(self.charset)
189
+ yield chunk
190
+
191
+
192
+ # http://www.faqs.org/rfcs/rfc2616.html
193
+ _status_codes = {
194
+ 100: 'Continue',
195
+ 101: 'Switching Protocols',
196
+ 200: 'OK',
197
+ 201: 'Created',
198
+ 202: 'Accepted',
199
+ 203: 'Non-Authoritative Information',
200
+ 204: 'No Content',
201
+ 205: 'Reset Content',
202
+ 206: 'Partial Content',
203
+ 300: 'Multiple Choices',
204
+ 301: 'Moved Permanently',
205
+ 302: 'Found',
206
+ 303: 'See Other',
207
+ 304: 'Not Modified',
208
+ 305: 'Use Proxy',
209
+ 307: 'Temporary Redirect',
210
+ 400: 'Bad Request',
211
+ 401: 'Unauthorized',
212
+ 402: 'Payment Required',
213
+ 403: 'Forbidden',
214
+ 404: 'Not Found',
215
+ 405: 'Method Not Allowed',
216
+ 406: 'Not Acceptable',
217
+ 407: 'Proxy Authentication Required',
218
+ 408: 'Request Time-out',
219
+ 409: 'Conflict',
220
+ 410: 'Gone',
221
+ 411: 'Length Required',
222
+ 412: 'Precondition Failed',
223
+ 413: 'Request Entity Too Large',
224
+ 414: 'Request-URI Too Large',
225
+ 415: 'Unsupported Media Type',
226
+ 416: 'Requested range not satisfiable',
227
+ 417: 'Expectation Failed',
228
+ 500: 'Internal Server Error',
229
+ 501: 'Not Implemented',
230
+ 502: 'Bad Gateway',
231
+ 503: 'Service Unavailable',
232
+ 504: 'Gateway Time-out',
233
+ 505: 'HTTP Version not supported',
234
+ }
235
+
236
+ def status_code(code):
237
+ return str(code) + ' ' + _status_codes[code]
File without changes
File without changes
@@ -0,0 +1,195 @@
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 __future__ import print_function
18
+
19
+ import codecs
20
+ import sys
21
+ import os
22
+ import optparse
23
+ import logging
24
+ import textwrap
25
+ import datetime
26
+ import xml.etree.ElementTree
27
+ import yaml
28
+
29
+ from contextlib import contextmanager
30
+ from io import BytesIO
31
+
32
+ from .sources import sources
33
+ from .layers import layers
34
+ from .caches import caches
35
+ from .seeds import seeds
36
+ from .utils import update_config, MapProxyYAMLDumper, download_capabilities
37
+
38
+ from mapproxy.compat import iteritems
39
+ from mapproxy.config.loader import load_configuration
40
+ from mapproxy.util.ext.wmsparse import parse_capabilities
41
+
42
+ def setup_logging(level=logging.INFO):
43
+ mapproxy_log = logging.getLogger('mapproxy')
44
+ mapproxy_log.setLevel(level)
45
+
46
+ # do not init logging when stdout is captured
47
+ # eg. when running in tests
48
+ if isinstance(sys.stdout, BytesIO):
49
+ return
50
+
51
+ ch = logging.StreamHandler(sys.stdout)
52
+ ch.setLevel(logging.DEBUG)
53
+ formatter = logging.Formatter(
54
+ "[%(asctime)s] %(name)s - %(levelname)s - %(message)s")
55
+ ch.setFormatter(formatter)
56
+ mapproxy_log.addHandler(ch)
57
+
58
+ def write_header(f, capabilities):
59
+ print('# MapProxy configuration automatically generated from:', file=f)
60
+ print('# %s' % capabilities, file=f)
61
+ print('#', file=f)
62
+ print('# NOTE: The generated configuration can be highly inefficient,', file=f)
63
+ print('# especially when multiple layers and caches are requested at once.', file=f)
64
+ print('# Make sure you understand the generated configuration!', file=f)
65
+ print('#', file=f)
66
+ print('# Created on %s with:' % datetime.datetime.now(), file=f)
67
+ print(' \\\n'.join(textwrap.wrap(' '.join(sys.argv), initial_indent='# ', subsequent_indent='# ')), file=f)
68
+ print('', file=f)
69
+
70
+
71
+ @contextmanager
72
+ def file_or_stdout(name):
73
+ if name == '-':
74
+ if hasattr(sys.stdout, 'buffer'):
75
+ yield codecs.getwriter('utf-8')(sys.stdout.buffer)
76
+ else:
77
+ yield codecs.getwriter('utf-8')(sys.stdout)
78
+ else:
79
+ with open(name, 'wb') as f:
80
+ yield codecs.getwriter('utf-8')(f)
81
+
82
+ def config_command(args):
83
+ parser = optparse.OptionParser("usage: %prog autoconfig [options]")
84
+
85
+ parser.add_option('--capabilities',
86
+ help="URL or filename of WMS 1.1.1/1.3.0 capabilities document")
87
+ parser.add_option('--output', help="filename for created MapProxy config [default: -]", default="-")
88
+ parser.add_option('--output-seed', help="filename for created seeding config")
89
+
90
+ parser.add_option('--base', help='base config to include in created MapProxy config')
91
+
92
+ parser.add_option('--overwrite',
93
+ help='YAML file with overwrites for the created MapProxy config')
94
+ parser.add_option('--overwrite-seed',
95
+ help='YAML file with overwrites for the created seeding config')
96
+
97
+ parser.add_option('--force', default=False, action='store_true',
98
+ help="overwrite existing files")
99
+
100
+ options, args = parser.parse_args(args)
101
+
102
+ if not options.capabilities:
103
+ parser.print_help()
104
+ print("\nERROR: --capabilities required", file=sys.stderr)
105
+ return 2
106
+
107
+ if not options.output and not options.output_seed:
108
+ parser.print_help()
109
+ print("\nERROR: --output and/or --output-seed required", file=sys.stderr)
110
+ return 2
111
+
112
+ if not options.force:
113
+ if options.output and options.output != '-' and os.path.exists(options.output):
114
+ print("\nERROR: %s already exists, use --force to overwrite" % options.output, file=sys.stderr)
115
+ return 2
116
+ if options.output_seed and options.output_seed != '-' and os.path.exists(options.output_seed):
117
+ print("\nERROR: %s already exists, use --force to overwrite" % options.output_seed, file=sys.stderr)
118
+ return 2
119
+
120
+ log = logging.getLogger('mapproxy_conf_cmd')
121
+ log.addHandler(logging.StreamHandler())
122
+
123
+ setup_logging(logging.WARNING)
124
+
125
+ srs_grids = {}
126
+ if options.base:
127
+ base = load_configuration(options.base)
128
+ for name, grid_conf in iteritems(base.grids):
129
+ if name.startswith('GLOBAL_'):
130
+ continue
131
+ srs_grids[grid_conf.tile_grid().srs.srs_code] = name
132
+
133
+ cap_doc = options.capabilities
134
+ if cap_doc.startswith(('http://', 'https://')):
135
+ cap_doc = download_capabilities(options.capabilities).read()
136
+ else:
137
+ cap_doc = open(cap_doc, 'rb').read()
138
+
139
+ try:
140
+ cap = parse_capabilities(BytesIO(cap_doc))
141
+ except (xml.etree.ElementTree.ParseError, ValueError) as ex:
142
+ print(ex, file=sys.stderr)
143
+ print(cap_doc[:1000] + ('...' if len(cap_doc) > 1000 else ''), file=sys.stderr)
144
+ return 3
145
+
146
+ overwrite = None
147
+ if options.overwrite:
148
+ with open(options.overwrite, 'rb') as f:
149
+ overwrite = yaml.safe_load(f)
150
+
151
+ overwrite_seed = None
152
+ if options.overwrite_seed:
153
+ with open(options.overwrite_seed, 'rb') as f:
154
+ overwrite_seed = yaml.safe_load(f)
155
+
156
+ conf = {}
157
+ if options.base:
158
+ conf['base'] = os.path.abspath(options.base)
159
+
160
+ conf['services'] = {'wms': {'md': {'title': cap.metadata()['title']}}}
161
+ if overwrite:
162
+ conf['services'] = update_config(conf['services'], overwrite.pop('service', {}))
163
+
164
+ conf['sources'] = sources(cap)
165
+ if overwrite:
166
+ conf['sources'] = update_config(conf['sources'], overwrite.pop('sources', {}))
167
+
168
+ conf['caches'] = caches(cap, conf['sources'], srs_grids=srs_grids)
169
+ if overwrite:
170
+ conf['caches'] = update_config(conf['caches'], overwrite.pop('caches', {}))
171
+
172
+ conf['layers'] = layers(cap, conf['caches'])
173
+ if overwrite:
174
+ conf['layers'] = update_config(conf['layers'], overwrite.pop('layers', {}))
175
+
176
+ if overwrite:
177
+ conf = update_config(conf, overwrite)
178
+
179
+
180
+ seed_conf = {}
181
+ seed_conf['seeds'], seed_conf['cleanups'] = seeds(cap, conf['caches'])
182
+ if overwrite_seed:
183
+ seed_conf = update_config(seed_conf, overwrite_seed)
184
+
185
+
186
+ if options.output:
187
+ with file_or_stdout(options.output) as f:
188
+ write_header(f, options.capabilities)
189
+ yaml.dump(conf, f, default_flow_style=False, Dumper=MapProxyYAMLDumper)
190
+ if options.output_seed:
191
+ with file_or_stdout(options.output_seed) as f:
192
+ write_header(f, options.capabilities)
193
+ yaml.dump(seed_conf, f, default_flow_style=False, Dumper=MapProxyYAMLDumper)
194
+
195
+ return 0
@@ -0,0 +1,45 @@
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 mapproxy.compat import iteritems
18
+
19
+ def caches(cap, sources, srs_grids):
20
+ caches = {}
21
+ for name, source in iteritems(sources):
22
+ conf = for_source(name, source, srs_grids)
23
+ if not conf:
24
+ continue
25
+ caches[name[:-len('_wms')] + '_cache'] = conf
26
+
27
+ return caches
28
+
29
+ def for_source(name, source, srs_grids):
30
+ cache = {
31
+ 'sources': [name]
32
+ }
33
+
34
+ grids = []
35
+ for srs in source['supported_srs']:
36
+ if srs in srs_grids:
37
+ grids.append(srs_grids[srs])
38
+
39
+ if not grids:
40
+ return None
41
+
42
+ cache['grids'] = grids
43
+
44
+ return cache
45
+
@@ -0,0 +1,54 @@
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
+ def layers(cap, caches):
18
+ return [_layer(cap.layers(), caches)]
19
+
20
+ def _layer(layer, caches):
21
+ name, conf = for_layer(layer, caches)
22
+ child_layers = []
23
+
24
+ for child_layer in layer['layers']:
25
+ child_layers.append(_layer(child_layer, caches))
26
+
27
+ if child_layers:
28
+ conf['layers'] = child_layers
29
+
30
+ return conf
31
+
32
+
33
+ def for_layer(layer, caches):
34
+ conf = {
35
+ 'title': layer['title'],
36
+ }
37
+
38
+ if layer['name']:
39
+ conf['name'] = layer['name']
40
+
41
+ if layer['name'] + '_cache' in caches:
42
+ conf['sources'] = [layer['name'] + '_cache']
43
+ else:
44
+ conf['sources'] = [layer['name'] + '_wms']
45
+
46
+ md = {}
47
+ if layer['abstract']:
48
+ md['abstract'] = layer['abstract']
49
+
50
+ if md:
51
+ conf['md'] = md
52
+
53
+ return layer['name'], conf
54
+
@@ -0,0 +1,37 @@
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 mapproxy.compat import iteritems
18
+
19
+ def seeds(cap, caches):
20
+ seeds = {}
21
+ cleanups = {}
22
+
23
+ for cache_name, cache in iteritems(caches):
24
+ for grid in cache['grids']:
25
+ seeds[cache_name + '_' + grid] = {
26
+ 'caches': [cache_name],
27
+ 'grids': [grid],
28
+ }
29
+ cleanups[cache_name + '_' + grid] = {
30
+ 'caches': [cache_name],
31
+ 'grids': [grid],
32
+ 'remove_before': {
33
+ 'time': '1900-01-01T00:00:00',
34
+ }
35
+ }
36
+
37
+ return seeds, cleanups
@@ -0,0 +1,86 @@
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 mapproxy.srs import SRS
18
+
19
+ import logging
20
+
21
+ def sources(cap):
22
+ sources = {}
23
+ for layer in cap.layers_list():
24
+ name, conf = for_layer(cap, layer)
25
+ sources[name+'_wms'] = conf
26
+
27
+ return sources
28
+
29
+ _checked_srs = {}
30
+
31
+ def check_srs(srs):
32
+ if srs not in _checked_srs:
33
+ try:
34
+ SRS(srs)
35
+ _checked_srs[srs] = True
36
+ except Exception as ex:
37
+ logging.getLogger(__name__).warning('unable to initialize srs for %s: %s', srs, ex)
38
+ _checked_srs[srs] = False
39
+
40
+ return _checked_srs[srs]
41
+
42
+ def for_layer(cap, layer):
43
+ source = {'type': 'wms'}
44
+
45
+ req = {
46
+ 'url': layer['url'],
47
+ 'layers': layer['name'],
48
+ }
49
+
50
+ if not layer['opaque']:
51
+ req['transparent'] = True
52
+
53
+ wms_opts = {}
54
+ if cap.version != '1.1.1':
55
+ wms_opts['version'] = cap.version
56
+ if layer['queryable']:
57
+ wms_opts['featureinfo'] = True
58
+ if layer['legend']:
59
+ wms_opts['legendurl'] = layer['legend']['url']
60
+ if wms_opts:
61
+ source['wms_opts'] = wms_opts
62
+
63
+ source['req'] = req
64
+
65
+ source['supported_srs'] = []
66
+ for srs in layer['srs']:
67
+ if check_srs(srs):
68
+ source['supported_srs'].append(srs)
69
+ source['supported_srs'].sort()
70
+
71
+ if layer['llbbox']:
72
+ source['coverage'] = {
73
+ 'srs': 'EPSG:4326',
74
+ 'bbox': layer['llbbox'],
75
+ }
76
+
77
+ res_hint = layer['res_hint']
78
+ if res_hint:
79
+ if res_hint[0]:
80
+ source['min_res'] = res_hint[0]
81
+ if res_hint[1]:
82
+ source['max_res'] = res_hint[1]
83
+
84
+ return layer['name'], source
85
+
86
+