rigid 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (364) hide show
  1. checksums.yaml +7 -0
  2. data/bin/rigid +4 -0
  3. data/rigid +16 -0
  4. data/vendor/PyYAML-3.12.dist-info/DESCRIPTION.rst +12 -0
  5. data/vendor/PyYAML-3.12.dist-info/INSTALLER +1 -0
  6. data/vendor/PyYAML-3.12.dist-info/METADATA +35 -0
  7. data/vendor/PyYAML-3.12.dist-info/RECORD +42 -0
  8. data/vendor/PyYAML-3.12.dist-info/WHEEL +5 -0
  9. data/vendor/PyYAML-3.12.dist-info/metadata.json +1 -0
  10. data/vendor/PyYAML-3.12.dist-info/top_level.txt +2 -0
  11. data/vendor/_yaml.so +0 -0
  12. data/vendor/click/__init__.py +98 -0
  13. data/vendor/click/__init__.pyc +0 -0
  14. data/vendor/click/_bashcomplete.py +83 -0
  15. data/vendor/click/_bashcomplete.pyc +0 -0
  16. data/vendor/click/_compat.py +642 -0
  17. data/vendor/click/_compat.pyc +0 -0
  18. data/vendor/click/_termui_impl.py +547 -0
  19. data/vendor/click/_termui_impl.pyc +0 -0
  20. data/vendor/click/_textwrap.py +38 -0
  21. data/vendor/click/_textwrap.pyc +0 -0
  22. data/vendor/click/_unicodefun.py +119 -0
  23. data/vendor/click/_unicodefun.pyc +0 -0
  24. data/vendor/click/_winconsole.py +273 -0
  25. data/vendor/click/_winconsole.pyc +0 -0
  26. data/vendor/click/core.py +1738 -0
  27. data/vendor/click/core.pyc +0 -0
  28. data/vendor/click/decorators.py +304 -0
  29. data/vendor/click/decorators.pyc +0 -0
  30. data/vendor/click/exceptions.py +201 -0
  31. data/vendor/click/exceptions.pyc +0 -0
  32. data/vendor/click/formatting.py +256 -0
  33. data/vendor/click/formatting.pyc +0 -0
  34. data/vendor/click/globals.py +48 -0
  35. data/vendor/click/globals.pyc +0 -0
  36. data/vendor/click/parser.py +426 -0
  37. data/vendor/click/parser.pyc +0 -0
  38. data/vendor/click/termui.py +539 -0
  39. data/vendor/click/termui.pyc +0 -0
  40. data/vendor/click/testing.py +322 -0
  41. data/vendor/click/testing.pyc +0 -0
  42. data/vendor/click/types.py +550 -0
  43. data/vendor/click/types.pyc +0 -0
  44. data/vendor/click/utils.py +415 -0
  45. data/vendor/click/utils.pyc +0 -0
  46. data/vendor/click-6.6.dist-info/DESCRIPTION.rst +3 -0
  47. data/vendor/click-6.6.dist-info/INSTALLER +1 -0
  48. data/vendor/click-6.6.dist-info/METADATA +16 -0
  49. data/vendor/click-6.6.dist-info/RECORD +41 -0
  50. data/vendor/click-6.6.dist-info/WHEEL +6 -0
  51. data/vendor/click-6.6.dist-info/metadata.json +1 -0
  52. data/vendor/click-6.6.dist-info/top_level.txt +1 -0
  53. data/vendor/easy_install.py +5 -0
  54. data/vendor/easy_install.pyc +0 -0
  55. data/vendor/pip-9.0.1.dist-info/DESCRIPTION.rst +39 -0
  56. data/vendor/pip-9.0.1.dist-info/INSTALLER +1 -0
  57. data/vendor/pip-9.0.1.dist-info/METADATA +69 -0
  58. data/vendor/pip-9.0.1.dist-info/RECORD +501 -0
  59. data/vendor/pip-9.0.1.dist-info/WHEEL +6 -0
  60. data/vendor/pip-9.0.1.dist-info/entry_points.txt +5 -0
  61. data/vendor/pip-9.0.1.dist-info/metadata.json +1 -0
  62. data/vendor/pip-9.0.1.dist-info/top_level.txt +1 -0
  63. data/vendor/pkg_resources/__init__.py +3051 -0
  64. data/vendor/pkg_resources/__init__.pyc +0 -0
  65. data/vendor/pkg_resources/_vendor/__init__.py +0 -0
  66. data/vendor/pkg_resources/_vendor/__init__.pyc +0 -0
  67. data/vendor/pkg_resources/_vendor/appdirs.py +552 -0
  68. data/vendor/pkg_resources/_vendor/appdirs.pyc +0 -0
  69. data/vendor/pkg_resources/_vendor/packaging/__about__.py +21 -0
  70. data/vendor/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
  71. data/vendor/pkg_resources/_vendor/packaging/__init__.py +14 -0
  72. data/vendor/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
  73. data/vendor/pkg_resources/_vendor/packaging/_compat.py +30 -0
  74. data/vendor/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
  75. data/vendor/pkg_resources/_vendor/packaging/_structures.py +68 -0
  76. data/vendor/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
  77. data/vendor/pkg_resources/_vendor/packaging/markers.py +287 -0
  78. data/vendor/pkg_resources/_vendor/packaging/markers.pyc +0 -0
  79. data/vendor/pkg_resources/_vendor/packaging/requirements.py +127 -0
  80. data/vendor/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
  81. data/vendor/pkg_resources/_vendor/packaging/specifiers.py +774 -0
  82. data/vendor/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
  83. data/vendor/pkg_resources/_vendor/packaging/utils.py +14 -0
  84. data/vendor/pkg_resources/_vendor/packaging/utils.pyc +0 -0
  85. data/vendor/pkg_resources/_vendor/packaging/version.py +393 -0
  86. data/vendor/pkg_resources/_vendor/packaging/version.pyc +0 -0
  87. data/vendor/pkg_resources/_vendor/pyparsing.py +5696 -0
  88. data/vendor/pkg_resources/_vendor/pyparsing.pyc +0 -0
  89. data/vendor/pkg_resources/_vendor/six.py +868 -0
  90. data/vendor/pkg_resources/_vendor/six.pyc +0 -0
  91. data/vendor/pkg_resources/extern/__init__.py +73 -0
  92. data/vendor/pkg_resources/extern/__init__.pyc +0 -0
  93. data/vendor/requests/__init__.py +86 -0
  94. data/vendor/requests/__init__.pyc +0 -0
  95. data/vendor/requests/adapters.py +503 -0
  96. data/vendor/requests/adapters.pyc +0 -0
  97. data/vendor/requests/api.py +148 -0
  98. data/vendor/requests/api.pyc +0 -0
  99. data/vendor/requests/auth.py +252 -0
  100. data/vendor/requests/auth.pyc +0 -0
  101. data/vendor/requests/cacert.pem +5616 -0
  102. data/vendor/requests/certs.py +25 -0
  103. data/vendor/requests/certs.pyc +0 -0
  104. data/vendor/requests/compat.py +66 -0
  105. data/vendor/requests/compat.pyc +0 -0
  106. data/vendor/requests/cookies.py +540 -0
  107. data/vendor/requests/cookies.pyc +0 -0
  108. data/vendor/requests/exceptions.py +114 -0
  109. data/vendor/requests/exceptions.pyc +0 -0
  110. data/vendor/requests/hooks.py +34 -0
  111. data/vendor/requests/hooks.pyc +0 -0
  112. data/vendor/requests/models.py +873 -0
  113. data/vendor/requests/models.pyc +0 -0
  114. data/vendor/requests/packages/__init__.py +36 -0
  115. data/vendor/requests/packages/__init__.pyc +0 -0
  116. data/vendor/requests/packages/chardet/__init__.py +32 -0
  117. data/vendor/requests/packages/chardet/__init__.pyc +0 -0
  118. data/vendor/requests/packages/chardet/big5freq.py +925 -0
  119. data/vendor/requests/packages/chardet/big5freq.pyc +0 -0
  120. data/vendor/requests/packages/chardet/big5prober.py +42 -0
  121. data/vendor/requests/packages/chardet/big5prober.pyc +0 -0
  122. data/vendor/requests/packages/chardet/chardetect.py +80 -0
  123. data/vendor/requests/packages/chardet/chardetect.pyc +0 -0
  124. data/vendor/requests/packages/chardet/chardistribution.py +231 -0
  125. data/vendor/requests/packages/chardet/chardistribution.pyc +0 -0
  126. data/vendor/requests/packages/chardet/charsetgroupprober.py +106 -0
  127. data/vendor/requests/packages/chardet/charsetgroupprober.pyc +0 -0
  128. data/vendor/requests/packages/chardet/charsetprober.py +62 -0
  129. data/vendor/requests/packages/chardet/charsetprober.pyc +0 -0
  130. data/vendor/requests/packages/chardet/codingstatemachine.py +61 -0
  131. data/vendor/requests/packages/chardet/codingstatemachine.pyc +0 -0
  132. data/vendor/requests/packages/chardet/compat.py +34 -0
  133. data/vendor/requests/packages/chardet/compat.pyc +0 -0
  134. data/vendor/requests/packages/chardet/constants.py +39 -0
  135. data/vendor/requests/packages/chardet/constants.pyc +0 -0
  136. data/vendor/requests/packages/chardet/cp949prober.py +44 -0
  137. data/vendor/requests/packages/chardet/cp949prober.pyc +0 -0
  138. data/vendor/requests/packages/chardet/escprober.py +86 -0
  139. data/vendor/requests/packages/chardet/escprober.pyc +0 -0
  140. data/vendor/requests/packages/chardet/escsm.py +242 -0
  141. data/vendor/requests/packages/chardet/escsm.pyc +0 -0
  142. data/vendor/requests/packages/chardet/eucjpprober.py +90 -0
  143. data/vendor/requests/packages/chardet/eucjpprober.pyc +0 -0
  144. data/vendor/requests/packages/chardet/euckrfreq.py +596 -0
  145. data/vendor/requests/packages/chardet/euckrfreq.pyc +0 -0
  146. data/vendor/requests/packages/chardet/euckrprober.py +42 -0
  147. data/vendor/requests/packages/chardet/euckrprober.pyc +0 -0
  148. data/vendor/requests/packages/chardet/euctwfreq.py +428 -0
  149. data/vendor/requests/packages/chardet/euctwfreq.pyc +0 -0
  150. data/vendor/requests/packages/chardet/euctwprober.py +41 -0
  151. data/vendor/requests/packages/chardet/euctwprober.pyc +0 -0
  152. data/vendor/requests/packages/chardet/gb2312freq.py +472 -0
  153. data/vendor/requests/packages/chardet/gb2312freq.pyc +0 -0
  154. data/vendor/requests/packages/chardet/gb2312prober.py +41 -0
  155. data/vendor/requests/packages/chardet/gb2312prober.pyc +0 -0
  156. data/vendor/requests/packages/chardet/hebrewprober.py +283 -0
  157. data/vendor/requests/packages/chardet/hebrewprober.pyc +0 -0
  158. data/vendor/requests/packages/chardet/jisfreq.py +569 -0
  159. data/vendor/requests/packages/chardet/jisfreq.pyc +0 -0
  160. data/vendor/requests/packages/chardet/jpcntx.py +227 -0
  161. data/vendor/requests/packages/chardet/jpcntx.pyc +0 -0
  162. data/vendor/requests/packages/chardet/langbulgarianmodel.py +229 -0
  163. data/vendor/requests/packages/chardet/langbulgarianmodel.pyc +0 -0
  164. data/vendor/requests/packages/chardet/langcyrillicmodel.py +329 -0
  165. data/vendor/requests/packages/chardet/langcyrillicmodel.pyc +0 -0
  166. data/vendor/requests/packages/chardet/langgreekmodel.py +225 -0
  167. data/vendor/requests/packages/chardet/langgreekmodel.pyc +0 -0
  168. data/vendor/requests/packages/chardet/langhebrewmodel.py +201 -0
  169. data/vendor/requests/packages/chardet/langhebrewmodel.pyc +0 -0
  170. data/vendor/requests/packages/chardet/langhungarianmodel.py +225 -0
  171. data/vendor/requests/packages/chardet/langhungarianmodel.pyc +0 -0
  172. data/vendor/requests/packages/chardet/langthaimodel.py +200 -0
  173. data/vendor/requests/packages/chardet/langthaimodel.pyc +0 -0
  174. data/vendor/requests/packages/chardet/latin1prober.py +139 -0
  175. data/vendor/requests/packages/chardet/latin1prober.pyc +0 -0
  176. data/vendor/requests/packages/chardet/mbcharsetprober.py +86 -0
  177. data/vendor/requests/packages/chardet/mbcharsetprober.pyc +0 -0
  178. data/vendor/requests/packages/chardet/mbcsgroupprober.py +54 -0
  179. data/vendor/requests/packages/chardet/mbcsgroupprober.pyc +0 -0
  180. data/vendor/requests/packages/chardet/mbcssm.py +572 -0
  181. data/vendor/requests/packages/chardet/mbcssm.pyc +0 -0
  182. data/vendor/requests/packages/chardet/sbcharsetprober.py +120 -0
  183. data/vendor/requests/packages/chardet/sbcharsetprober.pyc +0 -0
  184. data/vendor/requests/packages/chardet/sbcsgroupprober.py +69 -0
  185. data/vendor/requests/packages/chardet/sbcsgroupprober.pyc +0 -0
  186. data/vendor/requests/packages/chardet/sjisprober.py +91 -0
  187. data/vendor/requests/packages/chardet/sjisprober.pyc +0 -0
  188. data/vendor/requests/packages/chardet/universaldetector.py +170 -0
  189. data/vendor/requests/packages/chardet/universaldetector.pyc +0 -0
  190. data/vendor/requests/packages/chardet/utf8prober.py +76 -0
  191. data/vendor/requests/packages/chardet/utf8prober.pyc +0 -0
  192. data/vendor/requests/packages/urllib3/__init__.py +96 -0
  193. data/vendor/requests/packages/urllib3/__init__.pyc +0 -0
  194. data/vendor/requests/packages/urllib3/_collections.py +324 -0
  195. data/vendor/requests/packages/urllib3/_collections.pyc +0 -0
  196. data/vendor/requests/packages/urllib3/connection.py +330 -0
  197. data/vendor/requests/packages/urllib3/connection.pyc +0 -0
  198. data/vendor/requests/packages/urllib3/connectionpool.py +866 -0
  199. data/vendor/requests/packages/urllib3/connectionpool.pyc +0 -0
  200. data/vendor/requests/packages/urllib3/contrib/__init__.py +0 -0
  201. data/vendor/requests/packages/urllib3/contrib/__init__.pyc +0 -0
  202. data/vendor/requests/packages/urllib3/contrib/appengine.py +231 -0
  203. data/vendor/requests/packages/urllib3/contrib/appengine.pyc +0 -0
  204. data/vendor/requests/packages/urllib3/contrib/ntlmpool.py +115 -0
  205. data/vendor/requests/packages/urllib3/contrib/ntlmpool.pyc +0 -0
  206. data/vendor/requests/packages/urllib3/contrib/pyopenssl.py +358 -0
  207. data/vendor/requests/packages/urllib3/contrib/pyopenssl.pyc +0 -0
  208. data/vendor/requests/packages/urllib3/contrib/socks.py +172 -0
  209. data/vendor/requests/packages/urllib3/contrib/socks.pyc +0 -0
  210. data/vendor/requests/packages/urllib3/exceptions.py +209 -0
  211. data/vendor/requests/packages/urllib3/exceptions.pyc +0 -0
  212. data/vendor/requests/packages/urllib3/fields.py +178 -0
  213. data/vendor/requests/packages/urllib3/fields.pyc +0 -0
  214. data/vendor/requests/packages/urllib3/filepost.py +94 -0
  215. data/vendor/requests/packages/urllib3/filepost.pyc +0 -0
  216. data/vendor/requests/packages/urllib3/packages/__init__.py +5 -0
  217. data/vendor/requests/packages/urllib3/packages/__init__.pyc +0 -0
  218. data/vendor/requests/packages/urllib3/packages/ordered_dict.py +259 -0
  219. data/vendor/requests/packages/urllib3/packages/ordered_dict.pyc +0 -0
  220. data/vendor/requests/packages/urllib3/packages/six.py +868 -0
  221. data/vendor/requests/packages/urllib3/packages/six.pyc +0 -0
  222. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +13 -0
  223. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc +0 -0
  224. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +105 -0
  225. data/vendor/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc +0 -0
  226. data/vendor/requests/packages/urllib3/poolmanager.py +367 -0
  227. data/vendor/requests/packages/urllib3/poolmanager.pyc +0 -0
  228. data/vendor/requests/packages/urllib3/request.py +151 -0
  229. data/vendor/requests/packages/urllib3/request.pyc +0 -0
  230. data/vendor/requests/packages/urllib3/response.py +530 -0
  231. data/vendor/requests/packages/urllib3/response.pyc +0 -0
  232. data/vendor/requests/packages/urllib3/util/__init__.py +46 -0
  233. data/vendor/requests/packages/urllib3/util/__init__.pyc +0 -0
  234. data/vendor/requests/packages/urllib3/util/connection.py +144 -0
  235. data/vendor/requests/packages/urllib3/util/connection.pyc +0 -0
  236. data/vendor/requests/packages/urllib3/util/request.py +72 -0
  237. data/vendor/requests/packages/urllib3/util/request.pyc +0 -0
  238. data/vendor/requests/packages/urllib3/util/response.py +74 -0
  239. data/vendor/requests/packages/urllib3/util/response.pyc +0 -0
  240. data/vendor/requests/packages/urllib3/util/retry.py +300 -0
  241. data/vendor/requests/packages/urllib3/util/retry.pyc +0 -0
  242. data/vendor/requests/packages/urllib3/util/ssl_.py +320 -0
  243. data/vendor/requests/packages/urllib3/util/ssl_.pyc +0 -0
  244. data/vendor/requests/packages/urllib3/util/timeout.py +242 -0
  245. data/vendor/requests/packages/urllib3/util/timeout.pyc +0 -0
  246. data/vendor/requests/packages/urllib3/util/url.py +217 -0
  247. data/vendor/requests/packages/urllib3/util/url.pyc +0 -0
  248. data/vendor/requests/sessions.py +712 -0
  249. data/vendor/requests/sessions.pyc +0 -0
  250. data/vendor/requests/status_codes.py +91 -0
  251. data/vendor/requests/status_codes.pyc +0 -0
  252. data/vendor/requests/structures.py +105 -0
  253. data/vendor/requests/structures.pyc +0 -0
  254. data/vendor/requests/utils.py +817 -0
  255. data/vendor/requests/utils.pyc +0 -0
  256. data/vendor/requests-2.11.1.dist-info/DESCRIPTION.rst +1294 -0
  257. data/vendor/requests-2.11.1.dist-info/INSTALLER +1 -0
  258. data/vendor/requests-2.11.1.dist-info/METADATA +1323 -0
  259. data/vendor/requests-2.11.1.dist-info/RECORD +170 -0
  260. data/vendor/requests-2.11.1.dist-info/WHEEL +6 -0
  261. data/vendor/requests-2.11.1.dist-info/metadata.json +1 -0
  262. data/vendor/requests-2.11.1.dist-info/top_level.txt +1 -0
  263. data/vendor/rigid/__init__.py +1 -0
  264. data/vendor/rigid/__init__.pyc +0 -0
  265. data/vendor/rigid/api.py +129 -0
  266. data/vendor/rigid/api.pyc +0 -0
  267. data/vendor/rigid/commands/__init__.py +260 -0
  268. data/vendor/rigid/commands/__init__.pyc +0 -0
  269. data/vendor/rigid/commands/deploy.py +0 -0
  270. data/vendor/rigid/commands/deploy.pyc +0 -0
  271. data/vendor/rigid/deploy.py +70 -0
  272. data/vendor/rigid/deploy.pyc +0 -0
  273. data/vendor/rigid/file_scanner.py +63 -0
  274. data/vendor/rigid/file_scanner.pyc +0 -0
  275. data/vendor/rigid/utils.py +17 -0
  276. data/vendor/rigid/utils.pyc +0 -0
  277. data/vendor/rigid-0.2.0.dist-info/DESCRIPTION.rst +3 -0
  278. data/vendor/rigid-0.2.0.dist-info/INSTALLER +1 -0
  279. data/vendor/rigid-0.2.0.dist-info/METADATA +23 -0
  280. data/vendor/rigid-0.2.0.dist-info/RECORD +49 -0
  281. data/vendor/rigid-0.2.0.dist-info/WHEEL +5 -0
  282. data/vendor/rigid-0.2.0.dist-info/entry_points.txt +3 -0
  283. data/vendor/rigid-0.2.0.dist-info/metadata.json +1 -0
  284. data/vendor/rigid-0.2.0.dist-info/top_level.txt +2 -0
  285. data/vendor/setuptools-28.8.0.dist-info/DESCRIPTION.rst +243 -0
  286. data/vendor/setuptools-28.8.0.dist-info/INSTALLER +1 -0
  287. data/vendor/setuptools-28.8.0.dist-info/METADATA +272 -0
  288. data/vendor/setuptools-28.8.0.dist-info/RECORD +143 -0
  289. data/vendor/setuptools-28.8.0.dist-info/WHEEL +6 -0
  290. data/vendor/setuptools-28.8.0.dist-info/dependency_links.txt +2 -0
  291. data/vendor/setuptools-28.8.0.dist-info/entry_points.txt +63 -0
  292. data/vendor/setuptools-28.8.0.dist-info/metadata.json +1 -0
  293. data/vendor/setuptools-28.8.0.dist-info/top_level.txt +3 -0
  294. data/vendor/setuptools-28.8.0.dist-info/zip-safe +1 -0
  295. data/vendor/tests/__init__.py +0 -0
  296. data/vendor/tests/__init__.pyc +0 -0
  297. data/vendor/tests/integration/__init__.py +0 -0
  298. data/vendor/tests/integration/__init__.pyc +0 -0
  299. data/vendor/tests/integration/test_app.py +63 -0
  300. data/vendor/tests/integration/test_app.pyc +0 -0
  301. data/vendor/tests/integration/test_apps.py +27 -0
  302. data/vendor/tests/integration/test_apps.pyc +0 -0
  303. data/vendor/tests/integration/test_deploy.py +128 -0
  304. data/vendor/tests/integration/test_deploy.pyc +0 -0
  305. data/vendor/tests/integration/test_domains.py +35 -0
  306. data/vendor/tests/integration/test_domains.pyc +0 -0
  307. data/vendor/tests/integration/test_login.py +37 -0
  308. data/vendor/tests/integration/test_login.pyc +0 -0
  309. data/vendor/tests/integration/test_promote.py +24 -0
  310. data/vendor/tests/integration/test_promote.pyc +0 -0
  311. data/vendor/tests/integration/test_token.py +33 -0
  312. data/vendor/tests/integration/test_token.pyc +0 -0
  313. data/vendor/tests/integration/test_whoami.py +24 -0
  314. data/vendor/tests/integration/test_whoami.pyc +0 -0
  315. data/vendor/tests/test_deploy.py +33 -0
  316. data/vendor/tests/test_deploy.pyc +0 -0
  317. data/vendor/tests/test_file_scanner.py +89 -0
  318. data/vendor/tests/test_file_scanner.pyc +0 -0
  319. data/vendor/tests/utils.py +78 -0
  320. data/vendor/tests/utils.pyc +0 -0
  321. data/vendor/wheel-0.30.0a0.dist-info/DESCRIPTION.rst +325 -0
  322. data/vendor/wheel-0.30.0a0.dist-info/INSTALLER +1 -0
  323. data/vendor/wheel-0.30.0a0.dist-info/LICENSE.txt +22 -0
  324. data/vendor/wheel-0.30.0a0.dist-info/METADATA +357 -0
  325. data/vendor/wheel-0.30.0a0.dist-info/RECORD +86 -0
  326. data/vendor/wheel-0.30.0a0.dist-info/WHEEL +6 -0
  327. data/vendor/wheel-0.30.0a0.dist-info/entry_points.txt +6 -0
  328. data/vendor/wheel-0.30.0a0.dist-info/metadata.json +1 -0
  329. data/vendor/wheel-0.30.0a0.dist-info/top_level.txt +1 -0
  330. data/vendor/yaml/__init__.py +315 -0
  331. data/vendor/yaml/__init__.pyc +0 -0
  332. data/vendor/yaml/composer.py +139 -0
  333. data/vendor/yaml/composer.pyc +0 -0
  334. data/vendor/yaml/constructor.py +675 -0
  335. data/vendor/yaml/constructor.pyc +0 -0
  336. data/vendor/yaml/cyaml.py +85 -0
  337. data/vendor/yaml/cyaml.pyc +0 -0
  338. data/vendor/yaml/dumper.py +62 -0
  339. data/vendor/yaml/dumper.pyc +0 -0
  340. data/vendor/yaml/emitter.py +1140 -0
  341. data/vendor/yaml/emitter.pyc +0 -0
  342. data/vendor/yaml/error.py +75 -0
  343. data/vendor/yaml/error.pyc +0 -0
  344. data/vendor/yaml/events.py +86 -0
  345. data/vendor/yaml/events.pyc +0 -0
  346. data/vendor/yaml/loader.py +40 -0
  347. data/vendor/yaml/loader.pyc +0 -0
  348. data/vendor/yaml/nodes.py +49 -0
  349. data/vendor/yaml/nodes.pyc +0 -0
  350. data/vendor/yaml/parser.py +589 -0
  351. data/vendor/yaml/parser.pyc +0 -0
  352. data/vendor/yaml/reader.py +190 -0
  353. data/vendor/yaml/reader.pyc +0 -0
  354. data/vendor/yaml/representer.py +486 -0
  355. data/vendor/yaml/representer.pyc +0 -0
  356. data/vendor/yaml/resolver.py +227 -0
  357. data/vendor/yaml/resolver.pyc +0 -0
  358. data/vendor/yaml/scanner.py +1453 -0
  359. data/vendor/yaml/scanner.pyc +0 -0
  360. data/vendor/yaml/serializer.py +111 -0
  361. data/vendor/yaml/serializer.pyc +0 -0
  362. data/vendor/yaml/tokens.py +104 -0
  363. data/vendor/yaml/tokens.pyc +0 -0
  364. metadata +407 -0
@@ -0,0 +1,1140 @@
1
+
2
+ # Emitter expects events obeying the following grammar:
3
+ # stream ::= STREAM-START document* STREAM-END
4
+ # document ::= DOCUMENT-START node DOCUMENT-END
5
+ # node ::= SCALAR | sequence | mapping
6
+ # sequence ::= SEQUENCE-START node* SEQUENCE-END
7
+ # mapping ::= MAPPING-START (node node)* MAPPING-END
8
+
9
+ __all__ = ['Emitter', 'EmitterError']
10
+
11
+ from error import YAMLError
12
+ from events import *
13
+
14
+ class EmitterError(YAMLError):
15
+ pass
16
+
17
+ class ScalarAnalysis(object):
18
+ def __init__(self, scalar, empty, multiline,
19
+ allow_flow_plain, allow_block_plain,
20
+ allow_single_quoted, allow_double_quoted,
21
+ allow_block):
22
+ self.scalar = scalar
23
+ self.empty = empty
24
+ self.multiline = multiline
25
+ self.allow_flow_plain = allow_flow_plain
26
+ self.allow_block_plain = allow_block_plain
27
+ self.allow_single_quoted = allow_single_quoted
28
+ self.allow_double_quoted = allow_double_quoted
29
+ self.allow_block = allow_block
30
+
31
+ class Emitter(object):
32
+
33
+ DEFAULT_TAG_PREFIXES = {
34
+ u'!' : u'!',
35
+ u'tag:yaml.org,2002:' : u'!!',
36
+ }
37
+
38
+ def __init__(self, stream, canonical=None, indent=None, width=None,
39
+ allow_unicode=None, line_break=None):
40
+
41
+ # The stream should have the methods `write` and possibly `flush`.
42
+ self.stream = stream
43
+
44
+ # Encoding can be overriden by STREAM-START.
45
+ self.encoding = None
46
+
47
+ # Emitter is a state machine with a stack of states to handle nested
48
+ # structures.
49
+ self.states = []
50
+ self.state = self.expect_stream_start
51
+
52
+ # Current event and the event queue.
53
+ self.events = []
54
+ self.event = None
55
+
56
+ # The current indentation level and the stack of previous indents.
57
+ self.indents = []
58
+ self.indent = None
59
+
60
+ # Flow level.
61
+ self.flow_level = 0
62
+
63
+ # Contexts.
64
+ self.root_context = False
65
+ self.sequence_context = False
66
+ self.mapping_context = False
67
+ self.simple_key_context = False
68
+
69
+ # Characteristics of the last emitted character:
70
+ # - current position.
71
+ # - is it a whitespace?
72
+ # - is it an indention character
73
+ # (indentation space, '-', '?', or ':')?
74
+ self.line = 0
75
+ self.column = 0
76
+ self.whitespace = True
77
+ self.indention = True
78
+
79
+ # Whether the document requires an explicit document indicator
80
+ self.open_ended = False
81
+
82
+ # Formatting details.
83
+ self.canonical = canonical
84
+ self.allow_unicode = allow_unicode
85
+ self.best_indent = 2
86
+ if indent and 1 < indent < 10:
87
+ self.best_indent = indent
88
+ self.best_width = 80
89
+ if width and width > self.best_indent*2:
90
+ self.best_width = width
91
+ self.best_line_break = u'\n'
92
+ if line_break in [u'\r', u'\n', u'\r\n']:
93
+ self.best_line_break = line_break
94
+
95
+ # Tag prefixes.
96
+ self.tag_prefixes = None
97
+
98
+ # Prepared anchor and tag.
99
+ self.prepared_anchor = None
100
+ self.prepared_tag = None
101
+
102
+ # Scalar analysis and style.
103
+ self.analysis = None
104
+ self.style = None
105
+
106
+ def dispose(self):
107
+ # Reset the state attributes (to clear self-references)
108
+ self.states = []
109
+ self.state = None
110
+
111
+ def emit(self, event):
112
+ self.events.append(event)
113
+ while not self.need_more_events():
114
+ self.event = self.events.pop(0)
115
+ self.state()
116
+ self.event = None
117
+
118
+ # In some cases, we wait for a few next events before emitting.
119
+
120
+ def need_more_events(self):
121
+ if not self.events:
122
+ return True
123
+ event = self.events[0]
124
+ if isinstance(event, DocumentStartEvent):
125
+ return self.need_events(1)
126
+ elif isinstance(event, SequenceStartEvent):
127
+ return self.need_events(2)
128
+ elif isinstance(event, MappingStartEvent):
129
+ return self.need_events(3)
130
+ else:
131
+ return False
132
+
133
+ def need_events(self, count):
134
+ level = 0
135
+ for event in self.events[1:]:
136
+ if isinstance(event, (DocumentStartEvent, CollectionStartEvent)):
137
+ level += 1
138
+ elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)):
139
+ level -= 1
140
+ elif isinstance(event, StreamEndEvent):
141
+ level = -1
142
+ if level < 0:
143
+ return False
144
+ return (len(self.events) < count+1)
145
+
146
+ def increase_indent(self, flow=False, indentless=False):
147
+ self.indents.append(self.indent)
148
+ if self.indent is None:
149
+ if flow:
150
+ self.indent = self.best_indent
151
+ else:
152
+ self.indent = 0
153
+ elif not indentless:
154
+ self.indent += self.best_indent
155
+
156
+ # States.
157
+
158
+ # Stream handlers.
159
+
160
+ def expect_stream_start(self):
161
+ if isinstance(self.event, StreamStartEvent):
162
+ if self.event.encoding and not getattr(self.stream, 'encoding', None):
163
+ self.encoding = self.event.encoding
164
+ self.write_stream_start()
165
+ self.state = self.expect_first_document_start
166
+ else:
167
+ raise EmitterError("expected StreamStartEvent, but got %s"
168
+ % self.event)
169
+
170
+ def expect_nothing(self):
171
+ raise EmitterError("expected nothing, but got %s" % self.event)
172
+
173
+ # Document handlers.
174
+
175
+ def expect_first_document_start(self):
176
+ return self.expect_document_start(first=True)
177
+
178
+ def expect_document_start(self, first=False):
179
+ if isinstance(self.event, DocumentStartEvent):
180
+ if (self.event.version or self.event.tags) and self.open_ended:
181
+ self.write_indicator(u'...', True)
182
+ self.write_indent()
183
+ if self.event.version:
184
+ version_text = self.prepare_version(self.event.version)
185
+ self.write_version_directive(version_text)
186
+ self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy()
187
+ if self.event.tags:
188
+ handles = self.event.tags.keys()
189
+ handles.sort()
190
+ for handle in handles:
191
+ prefix = self.event.tags[handle]
192
+ self.tag_prefixes[prefix] = handle
193
+ handle_text = self.prepare_tag_handle(handle)
194
+ prefix_text = self.prepare_tag_prefix(prefix)
195
+ self.write_tag_directive(handle_text, prefix_text)
196
+ implicit = (first and not self.event.explicit and not self.canonical
197
+ and not self.event.version and not self.event.tags
198
+ and not self.check_empty_document())
199
+ if not implicit:
200
+ self.write_indent()
201
+ self.write_indicator(u'---', True)
202
+ if self.canonical:
203
+ self.write_indent()
204
+ self.state = self.expect_document_root
205
+ elif isinstance(self.event, StreamEndEvent):
206
+ if self.open_ended:
207
+ self.write_indicator(u'...', True)
208
+ self.write_indent()
209
+ self.write_stream_end()
210
+ self.state = self.expect_nothing
211
+ else:
212
+ raise EmitterError("expected DocumentStartEvent, but got %s"
213
+ % self.event)
214
+
215
+ def expect_document_end(self):
216
+ if isinstance(self.event, DocumentEndEvent):
217
+ self.write_indent()
218
+ if self.event.explicit:
219
+ self.write_indicator(u'...', True)
220
+ self.write_indent()
221
+ self.flush_stream()
222
+ self.state = self.expect_document_start
223
+ else:
224
+ raise EmitterError("expected DocumentEndEvent, but got %s"
225
+ % self.event)
226
+
227
+ def expect_document_root(self):
228
+ self.states.append(self.expect_document_end)
229
+ self.expect_node(root=True)
230
+
231
+ # Node handlers.
232
+
233
+ def expect_node(self, root=False, sequence=False, mapping=False,
234
+ simple_key=False):
235
+ self.root_context = root
236
+ self.sequence_context = sequence
237
+ self.mapping_context = mapping
238
+ self.simple_key_context = simple_key
239
+ if isinstance(self.event, AliasEvent):
240
+ self.expect_alias()
241
+ elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)):
242
+ self.process_anchor(u'&')
243
+ self.process_tag()
244
+ if isinstance(self.event, ScalarEvent):
245
+ self.expect_scalar()
246
+ elif isinstance(self.event, SequenceStartEvent):
247
+ if self.flow_level or self.canonical or self.event.flow_style \
248
+ or self.check_empty_sequence():
249
+ self.expect_flow_sequence()
250
+ else:
251
+ self.expect_block_sequence()
252
+ elif isinstance(self.event, MappingStartEvent):
253
+ if self.flow_level or self.canonical or self.event.flow_style \
254
+ or self.check_empty_mapping():
255
+ self.expect_flow_mapping()
256
+ else:
257
+ self.expect_block_mapping()
258
+ else:
259
+ raise EmitterError("expected NodeEvent, but got %s" % self.event)
260
+
261
+ def expect_alias(self):
262
+ if self.event.anchor is None:
263
+ raise EmitterError("anchor is not specified for alias")
264
+ self.process_anchor(u'*')
265
+ self.state = self.states.pop()
266
+
267
+ def expect_scalar(self):
268
+ self.increase_indent(flow=True)
269
+ self.process_scalar()
270
+ self.indent = self.indents.pop()
271
+ self.state = self.states.pop()
272
+
273
+ # Flow sequence handlers.
274
+
275
+ def expect_flow_sequence(self):
276
+ self.write_indicator(u'[', True, whitespace=True)
277
+ self.flow_level += 1
278
+ self.increase_indent(flow=True)
279
+ self.state = self.expect_first_flow_sequence_item
280
+
281
+ def expect_first_flow_sequence_item(self):
282
+ if isinstance(self.event, SequenceEndEvent):
283
+ self.indent = self.indents.pop()
284
+ self.flow_level -= 1
285
+ self.write_indicator(u']', False)
286
+ self.state = self.states.pop()
287
+ else:
288
+ if self.canonical or self.column > self.best_width:
289
+ self.write_indent()
290
+ self.states.append(self.expect_flow_sequence_item)
291
+ self.expect_node(sequence=True)
292
+
293
+ def expect_flow_sequence_item(self):
294
+ if isinstance(self.event, SequenceEndEvent):
295
+ self.indent = self.indents.pop()
296
+ self.flow_level -= 1
297
+ if self.canonical:
298
+ self.write_indicator(u',', False)
299
+ self.write_indent()
300
+ self.write_indicator(u']', False)
301
+ self.state = self.states.pop()
302
+ else:
303
+ self.write_indicator(u',', False)
304
+ if self.canonical or self.column > self.best_width:
305
+ self.write_indent()
306
+ self.states.append(self.expect_flow_sequence_item)
307
+ self.expect_node(sequence=True)
308
+
309
+ # Flow mapping handlers.
310
+
311
+ def expect_flow_mapping(self):
312
+ self.write_indicator(u'{', True, whitespace=True)
313
+ self.flow_level += 1
314
+ self.increase_indent(flow=True)
315
+ self.state = self.expect_first_flow_mapping_key
316
+
317
+ def expect_first_flow_mapping_key(self):
318
+ if isinstance(self.event, MappingEndEvent):
319
+ self.indent = self.indents.pop()
320
+ self.flow_level -= 1
321
+ self.write_indicator(u'}', False)
322
+ self.state = self.states.pop()
323
+ else:
324
+ if self.canonical or self.column > self.best_width:
325
+ self.write_indent()
326
+ if not self.canonical and self.check_simple_key():
327
+ self.states.append(self.expect_flow_mapping_simple_value)
328
+ self.expect_node(mapping=True, simple_key=True)
329
+ else:
330
+ self.write_indicator(u'?', True)
331
+ self.states.append(self.expect_flow_mapping_value)
332
+ self.expect_node(mapping=True)
333
+
334
+ def expect_flow_mapping_key(self):
335
+ if isinstance(self.event, MappingEndEvent):
336
+ self.indent = self.indents.pop()
337
+ self.flow_level -= 1
338
+ if self.canonical:
339
+ self.write_indicator(u',', False)
340
+ self.write_indent()
341
+ self.write_indicator(u'}', False)
342
+ self.state = self.states.pop()
343
+ else:
344
+ self.write_indicator(u',', False)
345
+ if self.canonical or self.column > self.best_width:
346
+ self.write_indent()
347
+ if not self.canonical and self.check_simple_key():
348
+ self.states.append(self.expect_flow_mapping_simple_value)
349
+ self.expect_node(mapping=True, simple_key=True)
350
+ else:
351
+ self.write_indicator(u'?', True)
352
+ self.states.append(self.expect_flow_mapping_value)
353
+ self.expect_node(mapping=True)
354
+
355
+ def expect_flow_mapping_simple_value(self):
356
+ self.write_indicator(u':', False)
357
+ self.states.append(self.expect_flow_mapping_key)
358
+ self.expect_node(mapping=True)
359
+
360
+ def expect_flow_mapping_value(self):
361
+ if self.canonical or self.column > self.best_width:
362
+ self.write_indent()
363
+ self.write_indicator(u':', True)
364
+ self.states.append(self.expect_flow_mapping_key)
365
+ self.expect_node(mapping=True)
366
+
367
+ # Block sequence handlers.
368
+
369
+ def expect_block_sequence(self):
370
+ indentless = (self.mapping_context and not self.indention)
371
+ self.increase_indent(flow=False, indentless=indentless)
372
+ self.state = self.expect_first_block_sequence_item
373
+
374
+ def expect_first_block_sequence_item(self):
375
+ return self.expect_block_sequence_item(first=True)
376
+
377
+ def expect_block_sequence_item(self, first=False):
378
+ if not first and isinstance(self.event, SequenceEndEvent):
379
+ self.indent = self.indents.pop()
380
+ self.state = self.states.pop()
381
+ else:
382
+ self.write_indent()
383
+ self.write_indicator(u'-', True, indention=True)
384
+ self.states.append(self.expect_block_sequence_item)
385
+ self.expect_node(sequence=True)
386
+
387
+ # Block mapping handlers.
388
+
389
+ def expect_block_mapping(self):
390
+ self.increase_indent(flow=False)
391
+ self.state = self.expect_first_block_mapping_key
392
+
393
+ def expect_first_block_mapping_key(self):
394
+ return self.expect_block_mapping_key(first=True)
395
+
396
+ def expect_block_mapping_key(self, first=False):
397
+ if not first and isinstance(self.event, MappingEndEvent):
398
+ self.indent = self.indents.pop()
399
+ self.state = self.states.pop()
400
+ else:
401
+ self.write_indent()
402
+ if self.check_simple_key():
403
+ self.states.append(self.expect_block_mapping_simple_value)
404
+ self.expect_node(mapping=True, simple_key=True)
405
+ else:
406
+ self.write_indicator(u'?', True, indention=True)
407
+ self.states.append(self.expect_block_mapping_value)
408
+ self.expect_node(mapping=True)
409
+
410
+ def expect_block_mapping_simple_value(self):
411
+ self.write_indicator(u':', False)
412
+ self.states.append(self.expect_block_mapping_key)
413
+ self.expect_node(mapping=True)
414
+
415
+ def expect_block_mapping_value(self):
416
+ self.write_indent()
417
+ self.write_indicator(u':', True, indention=True)
418
+ self.states.append(self.expect_block_mapping_key)
419
+ self.expect_node(mapping=True)
420
+
421
+ # Checkers.
422
+
423
+ def check_empty_sequence(self):
424
+ return (isinstance(self.event, SequenceStartEvent) and self.events
425
+ and isinstance(self.events[0], SequenceEndEvent))
426
+
427
+ def check_empty_mapping(self):
428
+ return (isinstance(self.event, MappingStartEvent) and self.events
429
+ and isinstance(self.events[0], MappingEndEvent))
430
+
431
+ def check_empty_document(self):
432
+ if not isinstance(self.event, DocumentStartEvent) or not self.events:
433
+ return False
434
+ event = self.events[0]
435
+ return (isinstance(event, ScalarEvent) and event.anchor is None
436
+ and event.tag is None and event.implicit and event.value == u'')
437
+
438
+ def check_simple_key(self):
439
+ length = 0
440
+ if isinstance(self.event, NodeEvent) and self.event.anchor is not None:
441
+ if self.prepared_anchor is None:
442
+ self.prepared_anchor = self.prepare_anchor(self.event.anchor)
443
+ length += len(self.prepared_anchor)
444
+ if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \
445
+ and self.event.tag is not None:
446
+ if self.prepared_tag is None:
447
+ self.prepared_tag = self.prepare_tag(self.event.tag)
448
+ length += len(self.prepared_tag)
449
+ if isinstance(self.event, ScalarEvent):
450
+ if self.analysis is None:
451
+ self.analysis = self.analyze_scalar(self.event.value)
452
+ length += len(self.analysis.scalar)
453
+ return (length < 128 and (isinstance(self.event, AliasEvent)
454
+ or (isinstance(self.event, ScalarEvent)
455
+ and not self.analysis.empty and not self.analysis.multiline)
456
+ or self.check_empty_sequence() or self.check_empty_mapping()))
457
+
458
+ # Anchor, Tag, and Scalar processors.
459
+
460
+ def process_anchor(self, indicator):
461
+ if self.event.anchor is None:
462
+ self.prepared_anchor = None
463
+ return
464
+ if self.prepared_anchor is None:
465
+ self.prepared_anchor = self.prepare_anchor(self.event.anchor)
466
+ if self.prepared_anchor:
467
+ self.write_indicator(indicator+self.prepared_anchor, True)
468
+ self.prepared_anchor = None
469
+
470
+ def process_tag(self):
471
+ tag = self.event.tag
472
+ if isinstance(self.event, ScalarEvent):
473
+ if self.style is None:
474
+ self.style = self.choose_scalar_style()
475
+ if ((not self.canonical or tag is None) and
476
+ ((self.style == '' and self.event.implicit[0])
477
+ or (self.style != '' and self.event.implicit[1]))):
478
+ self.prepared_tag = None
479
+ return
480
+ if self.event.implicit[0] and tag is None:
481
+ tag = u'!'
482
+ self.prepared_tag = None
483
+ else:
484
+ if (not self.canonical or tag is None) and self.event.implicit:
485
+ self.prepared_tag = None
486
+ return
487
+ if tag is None:
488
+ raise EmitterError("tag is not specified")
489
+ if self.prepared_tag is None:
490
+ self.prepared_tag = self.prepare_tag(tag)
491
+ if self.prepared_tag:
492
+ self.write_indicator(self.prepared_tag, True)
493
+ self.prepared_tag = None
494
+
495
+ def choose_scalar_style(self):
496
+ if self.analysis is None:
497
+ self.analysis = self.analyze_scalar(self.event.value)
498
+ if self.event.style == '"' or self.canonical:
499
+ return '"'
500
+ if not self.event.style and self.event.implicit[0]:
501
+ if (not (self.simple_key_context and
502
+ (self.analysis.empty or self.analysis.multiline))
503
+ and (self.flow_level and self.analysis.allow_flow_plain
504
+ or (not self.flow_level and self.analysis.allow_block_plain))):
505
+ return ''
506
+ if self.event.style and self.event.style in '|>':
507
+ if (not self.flow_level and not self.simple_key_context
508
+ and self.analysis.allow_block):
509
+ return self.event.style
510
+ if not self.event.style or self.event.style == '\'':
511
+ if (self.analysis.allow_single_quoted and
512
+ not (self.simple_key_context and self.analysis.multiline)):
513
+ return '\''
514
+ return '"'
515
+
516
+ def process_scalar(self):
517
+ if self.analysis is None:
518
+ self.analysis = self.analyze_scalar(self.event.value)
519
+ if self.style is None:
520
+ self.style = self.choose_scalar_style()
521
+ split = (not self.simple_key_context)
522
+ #if self.analysis.multiline and split \
523
+ # and (not self.style or self.style in '\'\"'):
524
+ # self.write_indent()
525
+ if self.style == '"':
526
+ self.write_double_quoted(self.analysis.scalar, split)
527
+ elif self.style == '\'':
528
+ self.write_single_quoted(self.analysis.scalar, split)
529
+ elif self.style == '>':
530
+ self.write_folded(self.analysis.scalar)
531
+ elif self.style == '|':
532
+ self.write_literal(self.analysis.scalar)
533
+ else:
534
+ self.write_plain(self.analysis.scalar, split)
535
+ self.analysis = None
536
+ self.style = None
537
+
538
+ # Analyzers.
539
+
540
+ def prepare_version(self, version):
541
+ major, minor = version
542
+ if major != 1:
543
+ raise EmitterError("unsupported YAML version: %d.%d" % (major, minor))
544
+ return u'%d.%d' % (major, minor)
545
+
546
+ def prepare_tag_handle(self, handle):
547
+ if not handle:
548
+ raise EmitterError("tag handle must not be empty")
549
+ if handle[0] != u'!' or handle[-1] != u'!':
550
+ raise EmitterError("tag handle must start and end with '!': %r"
551
+ % (handle.encode('utf-8')))
552
+ for ch in handle[1:-1]:
553
+ if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \
554
+ or ch in u'-_'):
555
+ raise EmitterError("invalid character %r in the tag handle: %r"
556
+ % (ch.encode('utf-8'), handle.encode('utf-8')))
557
+ return handle
558
+
559
+ def prepare_tag_prefix(self, prefix):
560
+ if not prefix:
561
+ raise EmitterError("tag prefix must not be empty")
562
+ chunks = []
563
+ start = end = 0
564
+ if prefix[0] == u'!':
565
+ end = 1
566
+ while end < len(prefix):
567
+ ch = prefix[end]
568
+ if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \
569
+ or ch in u'-;/?!:@&=+$,_.~*\'()[]':
570
+ end += 1
571
+ else:
572
+ if start < end:
573
+ chunks.append(prefix[start:end])
574
+ start = end = end+1
575
+ data = ch.encode('utf-8')
576
+ for ch in data:
577
+ chunks.append(u'%%%02X' % ord(ch))
578
+ if start < end:
579
+ chunks.append(prefix[start:end])
580
+ return u''.join(chunks)
581
+
582
+ def prepare_tag(self, tag):
583
+ if not tag:
584
+ raise EmitterError("tag must not be empty")
585
+ if tag == u'!':
586
+ return tag
587
+ handle = None
588
+ suffix = tag
589
+ prefixes = self.tag_prefixes.keys()
590
+ prefixes.sort()
591
+ for prefix in prefixes:
592
+ if tag.startswith(prefix) \
593
+ and (prefix == u'!' or len(prefix) < len(tag)):
594
+ handle = self.tag_prefixes[prefix]
595
+ suffix = tag[len(prefix):]
596
+ chunks = []
597
+ start = end = 0
598
+ while end < len(suffix):
599
+ ch = suffix[end]
600
+ if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \
601
+ or ch in u'-;/?:@&=+$,_.~*\'()[]' \
602
+ or (ch == u'!' and handle != u'!'):
603
+ end += 1
604
+ else:
605
+ if start < end:
606
+ chunks.append(suffix[start:end])
607
+ start = end = end+1
608
+ data = ch.encode('utf-8')
609
+ for ch in data:
610
+ chunks.append(u'%%%02X' % ord(ch))
611
+ if start < end:
612
+ chunks.append(suffix[start:end])
613
+ suffix_text = u''.join(chunks)
614
+ if handle:
615
+ return u'%s%s' % (handle, suffix_text)
616
+ else:
617
+ return u'!<%s>' % suffix_text
618
+
619
+ def prepare_anchor(self, anchor):
620
+ if not anchor:
621
+ raise EmitterError("anchor must not be empty")
622
+ for ch in anchor:
623
+ if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \
624
+ or ch in u'-_'):
625
+ raise EmitterError("invalid character %r in the anchor: %r"
626
+ % (ch.encode('utf-8'), anchor.encode('utf-8')))
627
+ return anchor
628
+
629
+ def analyze_scalar(self, scalar):
630
+
631
+ # Empty scalar is a special case.
632
+ if not scalar:
633
+ return ScalarAnalysis(scalar=scalar, empty=True, multiline=False,
634
+ allow_flow_plain=False, allow_block_plain=True,
635
+ allow_single_quoted=True, allow_double_quoted=True,
636
+ allow_block=False)
637
+
638
+ # Indicators and special characters.
639
+ block_indicators = False
640
+ flow_indicators = False
641
+ line_breaks = False
642
+ special_characters = False
643
+
644
+ # Important whitespace combinations.
645
+ leading_space = False
646
+ leading_break = False
647
+ trailing_space = False
648
+ trailing_break = False
649
+ break_space = False
650
+ space_break = False
651
+
652
+ # Check document indicators.
653
+ if scalar.startswith(u'---') or scalar.startswith(u'...'):
654
+ block_indicators = True
655
+ flow_indicators = True
656
+
657
+ # First character or preceded by a whitespace.
658
+ preceeded_by_whitespace = True
659
+
660
+ # Last character or followed by a whitespace.
661
+ followed_by_whitespace = (len(scalar) == 1 or
662
+ scalar[1] in u'\0 \t\r\n\x85\u2028\u2029')
663
+
664
+ # The previous character is a space.
665
+ previous_space = False
666
+
667
+ # The previous character is a break.
668
+ previous_break = False
669
+
670
+ index = 0
671
+ while index < len(scalar):
672
+ ch = scalar[index]
673
+
674
+ # Check for indicators.
675
+ if index == 0:
676
+ # Leading indicators are special characters.
677
+ if ch in u'#,[]{}&*!|>\'\"%@`':
678
+ flow_indicators = True
679
+ block_indicators = True
680
+ if ch in u'?:':
681
+ flow_indicators = True
682
+ if followed_by_whitespace:
683
+ block_indicators = True
684
+ if ch == u'-' and followed_by_whitespace:
685
+ flow_indicators = True
686
+ block_indicators = True
687
+ else:
688
+ # Some indicators cannot appear within a scalar as well.
689
+ if ch in u',?[]{}':
690
+ flow_indicators = True
691
+ if ch == u':':
692
+ flow_indicators = True
693
+ if followed_by_whitespace:
694
+ block_indicators = True
695
+ if ch == u'#' and preceeded_by_whitespace:
696
+ flow_indicators = True
697
+ block_indicators = True
698
+
699
+ # Check for line breaks, special, and unicode characters.
700
+ if ch in u'\n\x85\u2028\u2029':
701
+ line_breaks = True
702
+ if not (ch == u'\n' or u'\x20' <= ch <= u'\x7E'):
703
+ if (ch == u'\x85' or u'\xA0' <= ch <= u'\uD7FF'
704
+ or u'\uE000' <= ch <= u'\uFFFD') and ch != u'\uFEFF':
705
+ unicode_characters = True
706
+ if not self.allow_unicode:
707
+ special_characters = True
708
+ else:
709
+ special_characters = True
710
+
711
+ # Detect important whitespace combinations.
712
+ if ch == u' ':
713
+ if index == 0:
714
+ leading_space = True
715
+ if index == len(scalar)-1:
716
+ trailing_space = True
717
+ if previous_break:
718
+ break_space = True
719
+ previous_space = True
720
+ previous_break = False
721
+ elif ch in u'\n\x85\u2028\u2029':
722
+ if index == 0:
723
+ leading_break = True
724
+ if index == len(scalar)-1:
725
+ trailing_break = True
726
+ if previous_space:
727
+ space_break = True
728
+ previous_space = False
729
+ previous_break = True
730
+ else:
731
+ previous_space = False
732
+ previous_break = False
733
+
734
+ # Prepare for the next character.
735
+ index += 1
736
+ preceeded_by_whitespace = (ch in u'\0 \t\r\n\x85\u2028\u2029')
737
+ followed_by_whitespace = (index+1 >= len(scalar) or
738
+ scalar[index+1] in u'\0 \t\r\n\x85\u2028\u2029')
739
+
740
+ # Let's decide what styles are allowed.
741
+ allow_flow_plain = True
742
+ allow_block_plain = True
743
+ allow_single_quoted = True
744
+ allow_double_quoted = True
745
+ allow_block = True
746
+
747
+ # Leading and trailing whitespaces are bad for plain scalars.
748
+ if (leading_space or leading_break
749
+ or trailing_space or trailing_break):
750
+ allow_flow_plain = allow_block_plain = False
751
+
752
+ # We do not permit trailing spaces for block scalars.
753
+ if trailing_space:
754
+ allow_block = False
755
+
756
+ # Spaces at the beginning of a new line are only acceptable for block
757
+ # scalars.
758
+ if break_space:
759
+ allow_flow_plain = allow_block_plain = allow_single_quoted = False
760
+
761
+ # Spaces followed by breaks, as well as special character are only
762
+ # allowed for double quoted scalars.
763
+ if space_break or special_characters:
764
+ allow_flow_plain = allow_block_plain = \
765
+ allow_single_quoted = allow_block = False
766
+
767
+ # Although the plain scalar writer supports breaks, we never emit
768
+ # multiline plain scalars.
769
+ if line_breaks:
770
+ allow_flow_plain = allow_block_plain = False
771
+
772
+ # Flow indicators are forbidden for flow plain scalars.
773
+ if flow_indicators:
774
+ allow_flow_plain = False
775
+
776
+ # Block indicators are forbidden for block plain scalars.
777
+ if block_indicators:
778
+ allow_block_plain = False
779
+
780
+ return ScalarAnalysis(scalar=scalar,
781
+ empty=False, multiline=line_breaks,
782
+ allow_flow_plain=allow_flow_plain,
783
+ allow_block_plain=allow_block_plain,
784
+ allow_single_quoted=allow_single_quoted,
785
+ allow_double_quoted=allow_double_quoted,
786
+ allow_block=allow_block)
787
+
788
+ # Writers.
789
+
790
+ def flush_stream(self):
791
+ if hasattr(self.stream, 'flush'):
792
+ self.stream.flush()
793
+
794
+ def write_stream_start(self):
795
+ # Write BOM if needed.
796
+ if self.encoding and self.encoding.startswith('utf-16'):
797
+ self.stream.write(u'\uFEFF'.encode(self.encoding))
798
+
799
+ def write_stream_end(self):
800
+ self.flush_stream()
801
+
802
+ def write_indicator(self, indicator, need_whitespace,
803
+ whitespace=False, indention=False):
804
+ if self.whitespace or not need_whitespace:
805
+ data = indicator
806
+ else:
807
+ data = u' '+indicator
808
+ self.whitespace = whitespace
809
+ self.indention = self.indention and indention
810
+ self.column += len(data)
811
+ self.open_ended = False
812
+ if self.encoding:
813
+ data = data.encode(self.encoding)
814
+ self.stream.write(data)
815
+
816
+ def write_indent(self):
817
+ indent = self.indent or 0
818
+ if not self.indention or self.column > indent \
819
+ or (self.column == indent and not self.whitespace):
820
+ self.write_line_break()
821
+ if self.column < indent:
822
+ self.whitespace = True
823
+ data = u' '*(indent-self.column)
824
+ self.column = indent
825
+ if self.encoding:
826
+ data = data.encode(self.encoding)
827
+ self.stream.write(data)
828
+
829
+ def write_line_break(self, data=None):
830
+ if data is None:
831
+ data = self.best_line_break
832
+ self.whitespace = True
833
+ self.indention = True
834
+ self.line += 1
835
+ self.column = 0
836
+ if self.encoding:
837
+ data = data.encode(self.encoding)
838
+ self.stream.write(data)
839
+
840
+ def write_version_directive(self, version_text):
841
+ data = u'%%YAML %s' % version_text
842
+ if self.encoding:
843
+ data = data.encode(self.encoding)
844
+ self.stream.write(data)
845
+ self.write_line_break()
846
+
847
+ def write_tag_directive(self, handle_text, prefix_text):
848
+ data = u'%%TAG %s %s' % (handle_text, prefix_text)
849
+ if self.encoding:
850
+ data = data.encode(self.encoding)
851
+ self.stream.write(data)
852
+ self.write_line_break()
853
+
854
+ # Scalar streams.
855
+
856
+ def write_single_quoted(self, text, split=True):
857
+ self.write_indicator(u'\'', True)
858
+ spaces = False
859
+ breaks = False
860
+ start = end = 0
861
+ while end <= len(text):
862
+ ch = None
863
+ if end < len(text):
864
+ ch = text[end]
865
+ if spaces:
866
+ if ch is None or ch != u' ':
867
+ if start+1 == end and self.column > self.best_width and split \
868
+ and start != 0 and end != len(text):
869
+ self.write_indent()
870
+ else:
871
+ data = text[start:end]
872
+ self.column += len(data)
873
+ if self.encoding:
874
+ data = data.encode(self.encoding)
875
+ self.stream.write(data)
876
+ start = end
877
+ elif breaks:
878
+ if ch is None or ch not in u'\n\x85\u2028\u2029':
879
+ if text[start] == u'\n':
880
+ self.write_line_break()
881
+ for br in text[start:end]:
882
+ if br == u'\n':
883
+ self.write_line_break()
884
+ else:
885
+ self.write_line_break(br)
886
+ self.write_indent()
887
+ start = end
888
+ else:
889
+ if ch is None or ch in u' \n\x85\u2028\u2029' or ch == u'\'':
890
+ if start < end:
891
+ data = text[start:end]
892
+ self.column += len(data)
893
+ if self.encoding:
894
+ data = data.encode(self.encoding)
895
+ self.stream.write(data)
896
+ start = end
897
+ if ch == u'\'':
898
+ data = u'\'\''
899
+ self.column += 2
900
+ if self.encoding:
901
+ data = data.encode(self.encoding)
902
+ self.stream.write(data)
903
+ start = end + 1
904
+ if ch is not None:
905
+ spaces = (ch == u' ')
906
+ breaks = (ch in u'\n\x85\u2028\u2029')
907
+ end += 1
908
+ self.write_indicator(u'\'', False)
909
+
910
+ ESCAPE_REPLACEMENTS = {
911
+ u'\0': u'0',
912
+ u'\x07': u'a',
913
+ u'\x08': u'b',
914
+ u'\x09': u't',
915
+ u'\x0A': u'n',
916
+ u'\x0B': u'v',
917
+ u'\x0C': u'f',
918
+ u'\x0D': u'r',
919
+ u'\x1B': u'e',
920
+ u'\"': u'\"',
921
+ u'\\': u'\\',
922
+ u'\x85': u'N',
923
+ u'\xA0': u'_',
924
+ u'\u2028': u'L',
925
+ u'\u2029': u'P',
926
+ }
927
+
928
+ def write_double_quoted(self, text, split=True):
929
+ self.write_indicator(u'"', True)
930
+ start = end = 0
931
+ while end <= len(text):
932
+ ch = None
933
+ if end < len(text):
934
+ ch = text[end]
935
+ if ch is None or ch in u'"\\\x85\u2028\u2029\uFEFF' \
936
+ or not (u'\x20' <= ch <= u'\x7E'
937
+ or (self.allow_unicode
938
+ and (u'\xA0' <= ch <= u'\uD7FF'
939
+ or u'\uE000' <= ch <= u'\uFFFD'))):
940
+ if start < end:
941
+ data = text[start:end]
942
+ self.column += len(data)
943
+ if self.encoding:
944
+ data = data.encode(self.encoding)
945
+ self.stream.write(data)
946
+ start = end
947
+ if ch is not None:
948
+ if ch in self.ESCAPE_REPLACEMENTS:
949
+ data = u'\\'+self.ESCAPE_REPLACEMENTS[ch]
950
+ elif ch <= u'\xFF':
951
+ data = u'\\x%02X' % ord(ch)
952
+ elif ch <= u'\uFFFF':
953
+ data = u'\\u%04X' % ord(ch)
954
+ else:
955
+ data = u'\\U%08X' % ord(ch)
956
+ self.column += len(data)
957
+ if self.encoding:
958
+ data = data.encode(self.encoding)
959
+ self.stream.write(data)
960
+ start = end+1
961
+ if 0 < end < len(text)-1 and (ch == u' ' or start >= end) \
962
+ and self.column+(end-start) > self.best_width and split:
963
+ data = text[start:end]+u'\\'
964
+ if start < end:
965
+ start = end
966
+ self.column += len(data)
967
+ if self.encoding:
968
+ data = data.encode(self.encoding)
969
+ self.stream.write(data)
970
+ self.write_indent()
971
+ self.whitespace = False
972
+ self.indention = False
973
+ if text[start] == u' ':
974
+ data = u'\\'
975
+ self.column += len(data)
976
+ if self.encoding:
977
+ data = data.encode(self.encoding)
978
+ self.stream.write(data)
979
+ end += 1
980
+ self.write_indicator(u'"', False)
981
+
982
+ def determine_block_hints(self, text):
983
+ hints = u''
984
+ if text:
985
+ if text[0] in u' \n\x85\u2028\u2029':
986
+ hints += unicode(self.best_indent)
987
+ if text[-1] not in u'\n\x85\u2028\u2029':
988
+ hints += u'-'
989
+ elif len(text) == 1 or text[-2] in u'\n\x85\u2028\u2029':
990
+ hints += u'+'
991
+ return hints
992
+
993
+ def write_folded(self, text):
994
+ hints = self.determine_block_hints(text)
995
+ self.write_indicator(u'>'+hints, True)
996
+ if hints[-1:] == u'+':
997
+ self.open_ended = True
998
+ self.write_line_break()
999
+ leading_space = True
1000
+ spaces = False
1001
+ breaks = True
1002
+ start = end = 0
1003
+ while end <= len(text):
1004
+ ch = None
1005
+ if end < len(text):
1006
+ ch = text[end]
1007
+ if breaks:
1008
+ if ch is None or ch not in u'\n\x85\u2028\u2029':
1009
+ if not leading_space and ch is not None and ch != u' ' \
1010
+ and text[start] == u'\n':
1011
+ self.write_line_break()
1012
+ leading_space = (ch == u' ')
1013
+ for br in text[start:end]:
1014
+ if br == u'\n':
1015
+ self.write_line_break()
1016
+ else:
1017
+ self.write_line_break(br)
1018
+ if ch is not None:
1019
+ self.write_indent()
1020
+ start = end
1021
+ elif spaces:
1022
+ if ch != u' ':
1023
+ if start+1 == end and self.column > self.best_width:
1024
+ self.write_indent()
1025
+ else:
1026
+ data = text[start:end]
1027
+ self.column += len(data)
1028
+ if self.encoding:
1029
+ data = data.encode(self.encoding)
1030
+ self.stream.write(data)
1031
+ start = end
1032
+ else:
1033
+ if ch is None or ch in u' \n\x85\u2028\u2029':
1034
+ data = text[start:end]
1035
+ self.column += len(data)
1036
+ if self.encoding:
1037
+ data = data.encode(self.encoding)
1038
+ self.stream.write(data)
1039
+ if ch is None:
1040
+ self.write_line_break()
1041
+ start = end
1042
+ if ch is not None:
1043
+ breaks = (ch in u'\n\x85\u2028\u2029')
1044
+ spaces = (ch == u' ')
1045
+ end += 1
1046
+
1047
+ def write_literal(self, text):
1048
+ hints = self.determine_block_hints(text)
1049
+ self.write_indicator(u'|'+hints, True)
1050
+ if hints[-1:] == u'+':
1051
+ self.open_ended = True
1052
+ self.write_line_break()
1053
+ breaks = True
1054
+ start = end = 0
1055
+ while end <= len(text):
1056
+ ch = None
1057
+ if end < len(text):
1058
+ ch = text[end]
1059
+ if breaks:
1060
+ if ch is None or ch not in u'\n\x85\u2028\u2029':
1061
+ for br in text[start:end]:
1062
+ if br == u'\n':
1063
+ self.write_line_break()
1064
+ else:
1065
+ self.write_line_break(br)
1066
+ if ch is not None:
1067
+ self.write_indent()
1068
+ start = end
1069
+ else:
1070
+ if ch is None or ch in u'\n\x85\u2028\u2029':
1071
+ data = text[start:end]
1072
+ if self.encoding:
1073
+ data = data.encode(self.encoding)
1074
+ self.stream.write(data)
1075
+ if ch is None:
1076
+ self.write_line_break()
1077
+ start = end
1078
+ if ch is not None:
1079
+ breaks = (ch in u'\n\x85\u2028\u2029')
1080
+ end += 1
1081
+
1082
+ def write_plain(self, text, split=True):
1083
+ if self.root_context:
1084
+ self.open_ended = True
1085
+ if not text:
1086
+ return
1087
+ if not self.whitespace:
1088
+ data = u' '
1089
+ self.column += len(data)
1090
+ if self.encoding:
1091
+ data = data.encode(self.encoding)
1092
+ self.stream.write(data)
1093
+ self.whitespace = False
1094
+ self.indention = False
1095
+ spaces = False
1096
+ breaks = False
1097
+ start = end = 0
1098
+ while end <= len(text):
1099
+ ch = None
1100
+ if end < len(text):
1101
+ ch = text[end]
1102
+ if spaces:
1103
+ if ch != u' ':
1104
+ if start+1 == end and self.column > self.best_width and split:
1105
+ self.write_indent()
1106
+ self.whitespace = False
1107
+ self.indention = False
1108
+ else:
1109
+ data = text[start:end]
1110
+ self.column += len(data)
1111
+ if self.encoding:
1112
+ data = data.encode(self.encoding)
1113
+ self.stream.write(data)
1114
+ start = end
1115
+ elif breaks:
1116
+ if ch not in u'\n\x85\u2028\u2029':
1117
+ if text[start] == u'\n':
1118
+ self.write_line_break()
1119
+ for br in text[start:end]:
1120
+ if br == u'\n':
1121
+ self.write_line_break()
1122
+ else:
1123
+ self.write_line_break(br)
1124
+ self.write_indent()
1125
+ self.whitespace = False
1126
+ self.indention = False
1127
+ start = end
1128
+ else:
1129
+ if ch is None or ch in u' \n\x85\u2028\u2029':
1130
+ data = text[start:end]
1131
+ self.column += len(data)
1132
+ if self.encoding:
1133
+ data = data.encode(self.encoding)
1134
+ self.stream.write(data)
1135
+ start = end
1136
+ if ch is not None:
1137
+ spaces = (ch == u' ')
1138
+ breaks = (ch in u'\n\x85\u2028\u2029')
1139
+ end += 1
1140
+