pygments.rb 1.1.0 → 2.0.0.rc2

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 (382) hide show
  1. checksums.yaml +5 -5
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ci.yml +28 -0
  4. data/.github/workflows/release.yml +24 -0
  5. data/.gitignore +5 -5
  6. data/CHANGELOG.adoc +119 -0
  7. data/Gemfile +3 -1
  8. data/LICENSE +1 -1
  9. data/README.adoc +161 -0
  10. data/Rakefile +12 -19
  11. data/bench.rb +8 -7
  12. data/cache-lexers.rb +3 -2
  13. data/lexers +0 -0
  14. data/lib/pygments.rb +11 -16
  15. data/lib/pygments/lexer.rb +6 -4
  16. data/lib/pygments/mentos.py +23 -66
  17. data/lib/pygments/popen.rb +155 -207
  18. data/lib/pygments/version.rb +3 -1
  19. data/pygments.rb.gemspec +11 -9
  20. data/test/test_pygments.rb +53 -83
  21. data/vendor/pygments-main/{AUTHORS → Pygments-2.7.3.dist-info/AUTHORS} +23 -3
  22. data/vendor/pygments-main/Pygments-2.7.3.dist-info/INSTALLER +1 -0
  23. data/vendor/pygments-main/{LICENSE → Pygments-2.7.3.dist-info/LICENSE} +1 -1
  24. data/vendor/pygments-main/Pygments-2.7.3.dist-info/METADATA +49 -0
  25. data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +482 -0
  26. data/vendor/pygments-main/Pygments-2.7.3.dist-info/REQUESTED +0 -0
  27. data/vendor/pygments-main/Pygments-2.7.3.dist-info/WHEEL +5 -0
  28. data/vendor/pygments-main/Pygments-2.7.3.dist-info/entry_points.txt +3 -0
  29. data/vendor/pygments-main/Pygments-2.7.3.dist-info/top_level.txt +1 -0
  30. data/vendor/pygments-main/bin/pygmentize +8 -0
  31. data/vendor/pygments-main/pygments/__init__.py +6 -11
  32. data/vendor/pygments-main/pygments/__main__.py +18 -0
  33. data/vendor/pygments-main/pygments/cmdline.py +94 -41
  34. data/vendor/pygments-main/pygments/console.py +6 -9
  35. data/vendor/pygments-main/pygments/filter.py +4 -6
  36. data/vendor/pygments-main/pygments/filters/__init__.py +609 -21
  37. data/vendor/pygments-main/pygments/formatter.py +4 -4
  38. data/vendor/pygments-main/pygments/formatters/__init__.py +42 -6
  39. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -3
  40. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
  41. data/vendor/pygments-main/pygments/formatters/html.py +223 -135
  42. data/vendor/pygments-main/pygments/formatters/img.py +102 -38
  43. data/vendor/pygments-main/pygments/formatters/irc.py +39 -39
  44. data/vendor/pygments-main/pygments/formatters/latex.py +56 -26
  45. data/vendor/pygments-main/pygments/formatters/other.py +12 -8
  46. data/vendor/pygments-main/pygments/formatters/rtf.py +29 -29
  47. data/vendor/pygments-main/pygments/formatters/svg.py +38 -4
  48. data/vendor/pygments-main/pygments/formatters/terminal.py +25 -31
  49. data/vendor/pygments-main/pygments/formatters/terminal256.py +22 -12
  50. data/vendor/pygments-main/pygments/lexer.py +41 -39
  51. data/vendor/pygments-main/pygments/lexers/__init__.py +62 -15
  52. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +5 -5
  53. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +15 -15
  54. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +11 -12
  55. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1717 -1338
  56. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +8 -1
  57. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +2 -4
  58. data/vendor/pygments-main/pygments/lexers/_mapping.py +79 -33
  59. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +2 -2
  60. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
  61. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +1 -1
  62. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +17 -20
  63. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +73 -16
  64. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +2 -2
  65. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1 -3
  66. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +151 -125
  67. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +6 -4
  68. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1 -1
  69. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +113 -0
  70. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +280 -0
  71. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1 -1
  72. data/vendor/pygments-main/pygments/lexers/actionscript.py +8 -3
  73. data/vendor/pygments-main/pygments/lexers/agile.py +1 -1
  74. data/vendor/pygments-main/pygments/lexers/algebra.py +20 -1
  75. data/vendor/pygments-main/pygments/lexers/ambient.py +1 -1
  76. data/vendor/pygments-main/pygments/lexers/ampl.py +3 -3
  77. data/vendor/pygments-main/pygments/lexers/apl.py +15 -15
  78. data/vendor/pygments-main/pygments/lexers/archetype.py +3 -3
  79. data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
  80. data/vendor/pygments-main/pygments/lexers/asm.py +445 -70
  81. data/vendor/pygments-main/pygments/lexers/automation.py +3 -3
  82. data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
  83. data/vendor/pygments-main/pygments/lexers/basic.py +166 -4
  84. data/vendor/pygments-main/pygments/lexers/bibtex.py +13 -9
  85. data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
  86. data/vendor/pygments-main/pygments/lexers/business.py +69 -36
  87. data/vendor/pygments-main/pygments/lexers/c_cpp.py +137 -45
  88. data/vendor/pygments-main/pygments/lexers/c_like.py +68 -43
  89. data/vendor/pygments-main/pygments/lexers/capnproto.py +20 -21
  90. data/vendor/pygments-main/pygments/lexers/chapel.py +25 -14
  91. data/vendor/pygments-main/pygments/lexers/clean.py +135 -244
  92. data/vendor/pygments-main/pygments/lexers/compiled.py +1 -1
  93. data/vendor/pygments-main/pygments/lexers/configs.py +188 -37
  94. data/vendor/pygments-main/pygments/lexers/console.py +1 -1
  95. data/vendor/pygments-main/pygments/lexers/crystal.py +31 -23
  96. data/vendor/pygments-main/pygments/lexers/csound.py +288 -187
  97. data/vendor/pygments-main/pygments/lexers/css.py +18 -16
  98. data/vendor/pygments-main/pygments/lexers/d.py +10 -5
  99. data/vendor/pygments-main/pygments/lexers/dalvik.py +1 -1
  100. data/vendor/pygments-main/pygments/lexers/data.py +240 -97
  101. data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
  102. data/vendor/pygments-main/pygments/lexers/diff.py +4 -4
  103. data/vendor/pygments-main/pygments/lexers/dotnet.py +40 -24
  104. data/vendor/pygments-main/pygments/lexers/dsls.py +147 -65
  105. data/vendor/pygments-main/pygments/lexers/dylan.py +16 -18
  106. data/vendor/pygments-main/pygments/lexers/ecl.py +16 -2
  107. data/vendor/pygments-main/pygments/lexers/eiffel.py +1 -1
  108. data/vendor/pygments-main/pygments/lexers/elm.py +5 -5
  109. data/vendor/pygments-main/pygments/lexers/email.py +151 -0
  110. data/vendor/pygments-main/pygments/lexers/erlang.py +29 -32
  111. data/vendor/pygments-main/pygments/lexers/esoteric.py +54 -25
  112. data/vendor/pygments-main/pygments/lexers/ezhil.py +24 -15
  113. data/vendor/pygments-main/pygments/lexers/factor.py +1 -1
  114. data/vendor/pygments-main/pygments/lexers/fantom.py +1 -1
  115. data/vendor/pygments-main/pygments/lexers/felix.py +1 -1
  116. data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
  117. data/vendor/pygments-main/pygments/lexers/forth.py +41 -40
  118. data/vendor/pygments-main/pygments/lexers/fortran.py +5 -4
  119. data/vendor/pygments-main/pygments/lexers/foxpro.py +2 -2
  120. data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
  121. data/vendor/pygments-main/pygments/lexers/functional.py +1 -1
  122. data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
  123. data/vendor/pygments-main/pygments/lexers/go.py +1 -1
  124. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +63 -6
  125. data/vendor/pygments-main/pygments/lexers/graph.py +14 -9
  126. data/vendor/pygments-main/pygments/lexers/graphics.py +272 -25
  127. data/vendor/pygments-main/pygments/lexers/haskell.py +52 -22
  128. data/vendor/pygments-main/pygments/lexers/haxe.py +6 -6
  129. data/vendor/pygments-main/pygments/lexers/hdl.py +176 -86
  130. data/vendor/pygments-main/pygments/lexers/hexdump.py +18 -12
  131. data/vendor/pygments-main/pygments/lexers/html.py +31 -19
  132. data/vendor/pygments-main/pygments/lexers/idl.py +20 -9
  133. data/vendor/pygments-main/pygments/lexers/igor.py +244 -112
  134. data/vendor/pygments-main/pygments/lexers/inferno.py +2 -2
  135. data/vendor/pygments-main/pygments/lexers/installers.py +1 -1
  136. data/vendor/pygments-main/pygments/lexers/int_fiction.py +40 -15
  137. data/vendor/pygments-main/pygments/lexers/iolang.py +2 -2
  138. data/vendor/pygments-main/pygments/lexers/j.py +3 -3
  139. data/vendor/pygments-main/pygments/lexers/javascript.py +100 -66
  140. data/vendor/pygments-main/pygments/lexers/julia.py +46 -48
  141. data/vendor/pygments-main/pygments/lexers/jvm.py +265 -165
  142. data/vendor/pygments-main/pygments/lexers/lisp.py +882 -804
  143. data/vendor/pygments-main/pygments/lexers/make.py +10 -6
  144. data/vendor/pygments-main/pygments/lexers/markup.py +213 -43
  145. data/vendor/pygments-main/pygments/lexers/math.py +1 -1
  146. data/vendor/pygments-main/pygments/lexers/matlab.py +98 -41
  147. data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
  148. data/vendor/pygments-main/pygments/lexers/ml.py +198 -9
  149. data/vendor/pygments-main/pygments/lexers/modeling.py +26 -18
  150. data/vendor/pygments-main/pygments/lexers/modula2.py +25 -6
  151. data/vendor/pygments-main/pygments/lexers/monte.py +4 -3
  152. data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
  153. data/vendor/pygments-main/pygments/lexers/ncl.py +85 -244
  154. data/vendor/pygments-main/pygments/lexers/nimrod.py +4 -4
  155. data/vendor/pygments-main/pygments/lexers/nit.py +1 -1
  156. data/vendor/pygments-main/pygments/lexers/nix.py +1 -1
  157. data/vendor/pygments-main/pygments/lexers/oberon.py +17 -1
  158. data/vendor/pygments-main/pygments/lexers/objective.py +16 -16
  159. data/vendor/pygments-main/pygments/lexers/ooc.py +1 -1
  160. data/vendor/pygments-main/pygments/lexers/other.py +1 -1
  161. data/vendor/pygments-main/pygments/lexers/parasail.py +1 -1
  162. data/vendor/pygments-main/pygments/lexers/parsers.py +23 -58
  163. data/vendor/pygments-main/pygments/lexers/pascal.py +23 -23
  164. data/vendor/pygments-main/pygments/lexers/pawn.py +30 -24
  165. data/vendor/pygments-main/pygments/lexers/perl.py +276 -160
  166. data/vendor/pygments-main/pygments/lexers/php.py +64 -10
  167. data/vendor/pygments-main/pygments/lexers/pointless.py +71 -0
  168. data/vendor/pygments-main/pygments/lexers/pony.py +94 -0
  169. data/vendor/pygments-main/pygments/lexers/praat.py +38 -30
  170. data/vendor/pygments-main/pygments/lexers/prolog.py +36 -36
  171. data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
  172. data/vendor/pygments-main/pygments/lexers/python.py +439 -226
  173. data/vendor/pygments-main/pygments/lexers/qvt.py +6 -6
  174. data/vendor/pygments-main/pygments/lexers/r.py +13 -275
  175. data/vendor/pygments-main/pygments/lexers/rdf.py +232 -39
  176. data/vendor/pygments-main/pygments/lexers/rebol.py +8 -8
  177. data/vendor/pygments-main/pygments/lexers/resource.py +2 -2
  178. data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
  179. data/vendor/pygments-main/pygments/lexers/rnc.py +1 -1
  180. data/vendor/pygments-main/pygments/lexers/roboconf.py +1 -1
  181. data/vendor/pygments-main/pygments/lexers/robotframework.py +23 -31
  182. data/vendor/pygments-main/pygments/lexers/ruby.py +22 -24
  183. data/vendor/pygments-main/pygments/lexers/rust.py +86 -71
  184. data/vendor/pygments-main/pygments/lexers/sas.py +7 -7
  185. data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
  186. data/vendor/pygments-main/pygments/lexers/scripting.py +75 -13
  187. data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
  188. data/vendor/pygments-main/pygments/lexers/shell.py +175 -51
  189. data/vendor/pygments-main/pygments/lexers/sieve.py +69 -0
  190. data/vendor/pygments-main/pygments/lexers/slash.py +185 -0
  191. data/vendor/pygments-main/pygments/lexers/smalltalk.py +2 -2
  192. data/vendor/pygments-main/pygments/lexers/smv.py +30 -26
  193. data/vendor/pygments-main/pygments/lexers/snobol.py +1 -1
  194. data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
  195. data/vendor/pygments-main/pygments/lexers/special.py +5 -3
  196. data/vendor/pygments-main/pygments/lexers/sql.py +333 -177
  197. data/vendor/pygments-main/pygments/lexers/stata.py +107 -42
  198. data/vendor/pygments-main/pygments/lexers/supercollider.py +6 -1
  199. data/vendor/pygments-main/pygments/lexers/tcl.py +1 -1
  200. data/vendor/pygments-main/pygments/lexers/templates.py +144 -132
  201. data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
  202. data/vendor/pygments-main/pygments/lexers/testing.py +6 -6
  203. data/vendor/pygments-main/pygments/lexers/text.py +2 -1
  204. data/vendor/pygments-main/pygments/lexers/textedit.py +4 -4
  205. data/vendor/pygments-main/pygments/lexers/textfmts.py +146 -13
  206. data/vendor/pygments-main/pygments/lexers/theorem.py +69 -53
  207. data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
  208. data/vendor/pygments-main/pygments/lexers/trafficscript.py +1 -1
  209. data/vendor/pygments-main/pygments/lexers/typoscript.py +8 -14
  210. data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
  211. data/vendor/pygments-main/pygments/lexers/urbi.py +14 -1
  212. data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
  213. data/vendor/pygments-main/pygments/lexers/varnish.py +5 -5
  214. data/vendor/pygments-main/pygments/lexers/verification.py +15 -12
  215. data/vendor/pygments-main/pygments/lexers/web.py +1 -1
  216. data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
  217. data/vendor/pygments-main/pygments/lexers/webmisc.py +50 -38
  218. data/vendor/pygments-main/pygments/lexers/whiley.py +11 -12
  219. data/vendor/pygments-main/pygments/lexers/x10.py +1 -1
  220. data/vendor/pygments-main/pygments/lexers/xorg.py +37 -0
  221. data/vendor/pygments-main/pygments/lexers/yang.py +104 -0
  222. data/vendor/pygments-main/pygments/lexers/zig.py +124 -0
  223. data/vendor/pygments-main/pygments/modeline.py +6 -5
  224. data/vendor/pygments-main/pygments/plugin.py +14 -18
  225. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  226. data/vendor/pygments-main/pygments/scanner.py +2 -2
  227. data/vendor/pygments-main/pygments/sphinxext.py +2 -4
  228. data/vendor/pygments-main/pygments/style.py +61 -24
  229. data/vendor/pygments-main/pygments/styles/__init__.py +13 -5
  230. data/vendor/pygments-main/pygments/styles/abap.py +29 -0
  231. data/vendor/pygments-main/pygments/styles/algol.py +1 -1
  232. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -1
  233. data/vendor/pygments-main/pygments/styles/arduino.py +2 -2
  234. data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
  235. data/vendor/pygments-main/pygments/styles/borland.py +1 -1
  236. data/vendor/pygments-main/pygments/styles/bw.py +1 -1
  237. data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
  238. data/vendor/pygments-main/pygments/styles/default.py +1 -1
  239. data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
  240. data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
  241. data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
  242. data/vendor/pygments-main/pygments/styles/igor.py +1 -1
  243. data/vendor/pygments-main/pygments/styles/inkpot.py +67 -0
  244. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -1
  245. data/vendor/pygments-main/pygments/styles/manni.py +1 -1
  246. data/vendor/pygments-main/pygments/styles/monokai.py +4 -3
  247. data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
  248. data/vendor/pygments-main/pygments/styles/native.py +1 -1
  249. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -1
  250. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -1
  251. data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
  252. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
  253. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +89 -0
  254. data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
  255. data/vendor/pygments-main/pygments/styles/sas.py +3 -0
  256. data/vendor/pygments-main/pygments/styles/solarized.py +134 -0
  257. data/vendor/pygments-main/pygments/styles/stata_dark.py +41 -0
  258. data/vendor/pygments-main/pygments/styles/stata_light.py +39 -0
  259. data/vendor/pygments-main/pygments/styles/tango.py +1 -1
  260. data/vendor/pygments-main/pygments/styles/trac.py +1 -1
  261. data/vendor/pygments-main/pygments/styles/vim.py +1 -1
  262. data/vendor/pygments-main/pygments/styles/vs.py +1 -1
  263. data/vendor/pygments-main/pygments/styles/xcode.py +1 -1
  264. data/vendor/pygments-main/pygments/token.py +1 -1
  265. data/vendor/pygments-main/pygments/unistring.py +47 -108
  266. data/vendor/pygments-main/pygments/util.py +19 -95
  267. metadata +72 -137
  268. data/CHANGELOG.md +0 -89
  269. data/README.md +0 -121
  270. data/circle.yml +0 -20
  271. data/test/test_data.py +0 -514
  272. data/test/test_data_generated +0 -2582
  273. data/vendor/custom_lexers/github.py +0 -565
  274. data/vendor/pygments-main/CHANGES +0 -1163
  275. data/vendor/pygments-main/MANIFEST.in +0 -6
  276. data/vendor/pygments-main/Makefile +0 -65
  277. data/vendor/pygments-main/README.rst +0 -39
  278. data/vendor/pygments-main/REVISION +0 -1
  279. data/vendor/pygments-main/TODO +0 -12
  280. data/vendor/pygments-main/doc/Makefile +0 -153
  281. data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
  282. data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
  283. data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
  284. data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
  285. data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
  286. data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
  287. data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
  288. data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
  289. data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
  290. data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
  291. data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
  292. data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
  293. data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
  294. data/vendor/pygments-main/doc/conf.py +0 -241
  295. data/vendor/pygments-main/doc/docs/api.rst +0 -331
  296. data/vendor/pygments-main/doc/docs/authors.rst +0 -4
  297. data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
  298. data/vendor/pygments-main/doc/docs/cmdline.rst +0 -149
  299. data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
  300. data/vendor/pygments-main/doc/docs/filters.rst +0 -41
  301. data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
  302. data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
  303. data/vendor/pygments-main/doc/docs/index.rst +0 -66
  304. data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
  305. data/vendor/pygments-main/doc/docs/java.rst +0 -70
  306. data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -689
  307. data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
  308. data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
  309. data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
  310. data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
  311. data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
  312. data/vendor/pygments-main/doc/docs/styles.rst +0 -201
  313. data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
  314. data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
  315. data/vendor/pygments-main/doc/download.rst +0 -41
  316. data/vendor/pygments-main/doc/faq.rst +0 -139
  317. data/vendor/pygments-main/doc/index.rst +0 -54
  318. data/vendor/pygments-main/doc/languages.rst +0 -154
  319. data/vendor/pygments-main/doc/make.bat +0 -190
  320. data/vendor/pygments-main/doc/pygmentize.1 +0 -94
  321. data/vendor/pygments-main/external/autopygmentize +0 -84
  322. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
  323. data/vendor/pygments-main/external/markdown-processor.py +0 -67
  324. data/vendor/pygments-main/external/moin-parser.py +0 -112
  325. data/vendor/pygments-main/external/pygments.bashcomp +0 -38
  326. data/vendor/pygments-main/external/rst-directive.py +0 -82
  327. data/vendor/pygments-main/pygmentize +0 -8
  328. data/vendor/pygments-main/pygments/lexers/github.py +0 -565
  329. data/vendor/pygments-main/pygments/styles/stata.py +0 -37
  330. data/vendor/pygments-main/requirements.txt +0 -5
  331. data/vendor/pygments-main/scripts/check_sources.py +0 -211
  332. data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
  333. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
  334. data/vendor/pygments-main/scripts/epydoc.css +0 -280
  335. data/vendor/pygments-main/scripts/find_error.py +0 -1
  336. data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
  337. data/vendor/pygments-main/scripts/pylintrc +0 -301
  338. data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
  339. data/vendor/pygments-main/setup.cfg +0 -10
  340. data/vendor/pygments-main/setup.py +0 -77
  341. data/vendor/pygments-main/tox.ini +0 -7
  342. data/vendor/simplejson/.gitignore +0 -10
  343. data/vendor/simplejson/.travis.yml +0 -5
  344. data/vendor/simplejson/CHANGES.txt +0 -291
  345. data/vendor/simplejson/LICENSE.txt +0 -19
  346. data/vendor/simplejson/MANIFEST.in +0 -5
  347. data/vendor/simplejson/README.rst +0 -19
  348. data/vendor/simplejson/conf.py +0 -179
  349. data/vendor/simplejson/index.rst +0 -628
  350. data/vendor/simplejson/scripts/make_docs.py +0 -18
  351. data/vendor/simplejson/setup.py +0 -104
  352. data/vendor/simplejson/simplejson/__init__.py +0 -510
  353. data/vendor/simplejson/simplejson/_speedups.c +0 -2745
  354. data/vendor/simplejson/simplejson/decoder.py +0 -425
  355. data/vendor/simplejson/simplejson/encoder.py +0 -567
  356. data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
  357. data/vendor/simplejson/simplejson/scanner.py +0 -77
  358. data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
  359. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
  360. data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
  361. data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
  362. data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
  363. data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
  364. data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
  365. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
  366. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
  367. data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
  368. data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
  369. data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
  370. data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
  371. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
  372. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
  373. data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
  374. data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
  375. data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
  376. data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
  377. data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
  378. data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
  379. data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
  380. data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
  381. data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
  382. data/vendor/simplejson/simplejson/tool.py +0 -39
@@ -1,89 +0,0 @@
1
- changelog
2
- ===========
3
-
4
-
5
- Version 1.1.0 (2016/12/24)
6
- -----------------------------
7
-
8
- * Support JRuby [#170](https://github.com/tmm1/pygments.rb/pull/170)
9
- * Make pygments.rb thread safe [#171](https://github.com/tmm1/pygments.rb/pull/171)
10
-
11
- Version 1.0.0 (2016/12/11)
12
- -----------------------------
13
-
14
- * Upgrade bundled pygments to 2.2.0-HEAD [#167](https://github.com/tmm1/pygments.rb/pull/167)
15
- * This includes **incompatible changes* because of upgrade of pygments.
16
- See http://pygments.org/ for details.
17
- * Relax yajl-ruby dependency to "~> 1.2" [#164](https://github.com/tmm1/pygments.rb/pull/164)
18
- * Python binary can be configured by `PYTMENTS_RB_PYTHON` env [#168](https://github.com/tmm1/pygments.rb/pull/168)
19
- * Improved error messages when python binary is missing [#158](https://github.com/tmm1/pygments.rb/pull/158)
20
-
21
-
22
- Version 0.5.4 (Nov 3, 2013)
23
- -----------------------------
24
-
25
- * Update lexers file
26
-
27
- Version 0.5.3 (Sep 17, 2013)
28
- -----------------------------
29
-
30
- * Fixes for Slash lexer
31
- * Improve highlighting for Slash lexer
32
- * Upgrade to latest pygments (1.7, changes summary follows. See pygments changelog for details)
33
- * Add Clay lexer
34
- * Add Perl 6 lexer
35
- * Add Swig lexer
36
- * Add nesC lexer
37
- * Add BlitzBasic lexer
38
- * Add EBNF lexer
39
- * Add Igor Pro lexer
40
- * Add Rexx lexer
41
- * Add Agda lexer
42
- * Recognize vim modelines
43
- * Improve Python 3 lexer
44
- * Improve Opa lexer
45
- * Improve Julia lexer
46
- * Improve Lasso lexer
47
- * Improve Objective C/C++ lexer
48
- * Improve Ruby lexer
49
- * Improve Stan lexer
50
- * Improve JavaScript lexer
51
- * Improve HTTP lexer
52
- * Improve Koka lexer
53
- * Improve Haxe lexer
54
- * Improve Prolog lexer
55
- * Improve F# lexer
56
-
57
- Version 0.5.2 (July 17, 2013)
58
- -----------------------------
59
-
60
- * Add Slash lexer
61
-
62
- Version 0.5.1 (June 25, 2013)
63
- -----------------------------
64
-
65
- * Ensure compatability across distros by detecting if `python2` is available
66
-
67
- Version 0.5.0 (Apr 13, 2013)
68
- -----------------------------
69
-
70
- * Use #rstrip to fix table mode bug
71
-
72
- Version 0.4.2 (Feb 25, 2013)
73
- -----------------------------
74
-
75
- * Add new lexers, including custom lexers
76
-
77
- Version 0.3.7 (Jan 2, 2013)
78
- -----------------------------
79
-
80
- * Fixed missing custom lexers
81
- * Added syntax highlighting for Hxml
82
-
83
- Version 0.3.4 (Dec 28, 2012)
84
- -----------------------------
85
-
86
- * Add support for Windows
87
- * Add MIT license
88
-
89
-
data/README.md DELETED
@@ -1,121 +0,0 @@
1
- # pygments.rb [![CircleCI](https://circleci.com/gh/tmm1/pygments.rb.svg?style=svg)](https://circleci.com/gh/tmm1/pygments.rb) [![Gem Version](https://badge.fury.io/rb/pygments.rb.svg)](https://badge.fury.io/rb/pygments.rb)
2
-
3
- A Ruby wrapper for the Python [pygments syntax highlighter](http://pygments.org/).
4
-
5
- pygments.rb works by talking over a simple pipe to a long-lived
6
- Python child process. This library replaces [github/albino](https://github.com/github/albino),
7
- as well as a version of pygments.rb that used an embedded Python
8
- interpreter.
9
-
10
- Each Ruby process that runs has its own 'personal Python';
11
- for example, 4 Unicorn workers will have one Python process each.
12
- If a Python process dies, a new one will be spawned on the next
13
- pygments.rb request.
14
-
15
- ## system requirements
16
-
17
- - Python 2.5, Python 2.6, or Python 2.7. You can always use Python 2.x from a `virtualenv` if
18
- your default Python install is 3.x.
19
-
20
- ## usage
21
-
22
- ``` ruby
23
- require 'pygments'
24
- ```
25
-
26
- ``` ruby
27
- Pygments.highlight(File.read(__FILE__), :lexer => 'ruby')
28
- ```
29
-
30
- Encoding and other lexer/formatter options can be passed in via an
31
- options hash:
32
-
33
- ``` ruby
34
- Pygments.highlight('code', :options => {:encoding => 'utf-8'})
35
- ```
36
-
37
- pygments.rb defaults to using an HTML formatter.
38
- To use a formatter other than `html`, specify it explicitly
39
- like so:
40
-
41
- ``` ruby
42
- Pygments.highlight('code', :formatter => 'bbcode')
43
- Pygments.highlight('code', :formatter => 'terminal')
44
- ```
45
-
46
- To generate CSS for HTML formatted code, use the `#css` method:
47
-
48
- ``` ruby
49
- Pygments.css
50
- Pygments.css('.highlight')
51
- ```
52
-
53
- To use a specific pygments style, pass the `:style` option to the `#css` method:
54
-
55
- ``` ruby
56
- Pygments.css(:style => "monokai")
57
- ```
58
-
59
- Other Pygments high-level API methods are also available.
60
- These methods return arrays detailing all the available lexers, formatters,
61
- and styles.
62
-
63
- ``` ruby
64
- Pygments.lexers
65
- Pygments.formatters
66
- Pygments.styles
67
- ```
68
-
69
- To use a custom pygments installation, specify the path to
70
- `Pygments#start`:
71
-
72
- ``` ruby
73
- Pygments.start("/path/to/pygments")
74
- ```
75
-
76
- If you'd like logging, set the environmental variable `MENTOS_LOG` to a file path for your logfile.
77
-
78
- By default pygments.rb will timeout calls to pygments that take over 8 seconds. You can change this
79
- by setting the environmental variable `MENTOS_TIMEOUT` to a different positive integer value.
80
-
81
- ## benchmarks
82
-
83
-
84
- $ ruby bench.rb 50
85
- Benchmarking....
86
- Size: 698 bytes
87
- Iterations: 50
88
- user system total real
89
- pygments popen 0.010000 0.010000 0.020000 ( 0.460370)
90
- pygments popen (process already started) 0.010000 0.000000 0.010000 ( 0.272975)
91
- pygments popen (process already started 2) 0.000000 0.000000 0.000000 ( 0.273589)
92
-
93
- $ ruby bench.rb 10
94
- Benchmarking....
95
- Size: 15523 bytes
96
- Iterations: 10
97
- user system total real
98
- pygments popen 0.000000 0.000000 0.000000 ( 0.819419)
99
- pygments popen (process already started) 0.010000 0.000000 0.010000 ( 0.676515)
100
- pygments popen (process already started 2) 0.000000 0.010000 0.010000 ( 0.674189)
101
-
102
- ## license
103
-
104
- The MIT License (MIT)
105
-
106
- Copyright (c) Ted Nyman and Aman Gupta, 2012-2013
107
-
108
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
109
- associated documentation files (the "Software"), to deal in the Software without restriction,
110
- including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
111
- and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
112
- subject to the following conditions:
113
-
114
- The above copyright notice and this permission notice shall be included in all copies or substantial
115
- portions of the Software.
116
-
117
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
118
- LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
119
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
120
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
121
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/circle.yml DELETED
@@ -1,20 +0,0 @@
1
- machine:
2
- ruby:
3
- version: 2.3.1
4
- java:
5
- version: oraclejdk8
6
- environment:
7
- JRUBY_OPTS: '--dev --debug'
8
- JRUBY: jruby-9.1.6.0
9
-
10
- dependencies:
11
- pre:
12
- - echo rvm_autoupdate_flag=0 >> ~/.rvmrc
13
- - rvm install $JRUBY
14
- post:
15
- - rvm-exec $JRUBY bundle install
16
-
17
- test:
18
- override:
19
- - rvm-exec $JRUBY bundle exec rake test
20
- - bundle exec rake test
@@ -1,514 +0,0 @@
1
- # -*- coding: utf-8 -
2
- #
3
- # This file is part of gunicorn released under the MIT license.
4
- # See the NOTICE for more information.
5
-
6
- from __future__ import with_statement
7
-
8
- import errno
9
- import os
10
- import select
11
- import signal
12
- import sys
13
- import time
14
- import traceback
15
-
16
-
17
- from gunicorn.errors import HaltServer
18
- from gunicorn.pidfile import Pidfile
19
- from gunicorn.sock import create_socket
20
- from gunicorn import util
21
-
22
- from gunicorn import __version__, SERVER_SOFTWARE
23
-
24
- class Arbiter(object):
25
- """
26
- Arbiter maintain the workers processes alive. It launches or
27
- kills them if needed. It also manages application reloading
28
- via SIGHUP/USR2.
29
- """
30
-
31
- # A flag indicating if a worker failed to
32
- # to boot. If a worker process exist with
33
- # this error code, the arbiter will terminate.
34
- WORKER_BOOT_ERROR = 3
35
-
36
- START_CTX = {}
37
-
38
- LISTENER = None
39
- WORKERS = {}
40
- PIPE = []
41
-
42
- # I love dynamic languages
43
- SIG_QUEUE = []
44
- SIGNALS = map(
45
- lambda x: getattr(signal, "SIG%s" % x),
46
- "HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCH".split()
47
- )
48
- SIG_NAMES = dict(
49
- (getattr(signal, name), name[3:].lower()) for name in dir(signal)
50
- if name[:3] == "SIG" and name[3] != "_"
51
- )
52
-
53
- def __init__(self, app):
54
- os.environ["SERVER_SOFTWARE"] = SERVER_SOFTWARE
55
-
56
- self.setup(app)
57
-
58
- self.pidfile = None
59
- self.worker_age = 0
60
- self.reexec_pid = 0
61
- self.master_name = "Master"
62
-
63
- # get current path, try to use PWD env first
64
- try:
65
- a = os.stat(os.environ['PWD'])
66
- b = os.stat(os.getcwd())
67
- if a.ino == b.ino and a.dev == b.dev:
68
- cwd = os.environ['PWD']
69
- else:
70
- cwd = os.getcwd()
71
- except:
72
- cwd = os.getcwd()
73
-
74
- args = sys.argv[:]
75
- args.insert(0, sys.executable)
76
-
77
- # init start context
78
- self.START_CTX = {
79
- "args": args,
80
- "cwd": cwd,
81
- 0: sys.executable
82
- }
83
-
84
- def setup(self, app):
85
- self.app = app
86
- self.cfg = app.cfg
87
- self.log = self.cfg.logger_class(app.cfg)
88
-
89
- # reopen files
90
- if 'GUNICORN_FD' in os.environ:
91
- self.log.reopen_files()
92
-
93
- self.address = self.cfg.address
94
- self.num_workers = self.cfg.workers
95
- self.debug = self.cfg.debug
96
- self.timeout = self.cfg.timeout
97
- self.proc_name = self.cfg.proc_name
98
- self.worker_class = self.cfg.worker_class
99
-
100
- if self.cfg.debug:
101
- self.log.debug("Current configuration:")
102
- for config, value in sorted(self.cfg.settings.iteritems()):
103
- self.log.debug(" %s: %s", config, value.value)
104
-
105
- if self.cfg.preload_app:
106
- if not self.cfg.debug:
107
- self.app.wsgi()
108
- else:
109
- self.log.warning("debug mode: app isn't preloaded.")
110
-
111
- def start(self):
112
- """\
113
- Initialize the arbiter. Start listening and set pidfile if needed.
114
- """
115
- self.log.info("Starting gunicorn %s", __version__)
116
- self.cfg.on_starting(self)
117
- self.pid = os.getpid()
118
- self.init_signals()
119
- if not self.LISTENER:
120
- self.LISTENER = create_socket(self.cfg, self.log)
121
-
122
- if self.cfg.pidfile is not None:
123
- self.pidfile = Pidfile(self.cfg.pidfile)
124
- self.pidfile.create(self.pid)
125
- self.log.debug("Arbiter booted")
126
- self.log.info("Listening at: %s (%s)", self.LISTENER,
127
- self.pid)
128
- self.log.info("Using worker: %s",
129
- self.cfg.settings['worker_class'].get())
130
-
131
- self.cfg.when_ready(self)
132
-
133
- def init_signals(self):
134
- """\
135
- Initialize master signal handling. Most of the signals
136
- are queued. Child signals only wake up the master.
137
- """
138
- if self.PIPE:
139
- map(os.close, self.PIPE)
140
- self.PIPE = pair = os.pipe()
141
- map(util.set_non_blocking, pair)
142
- map(util.close_on_exec, pair)
143
- self.log.close_on_exec()
144
- map(lambda s: signal.signal(s, self.signal), self.SIGNALS)
145
- signal.signal(signal.SIGCHLD, self.handle_chld)
146
-
147
- def signal(self, sig, frame):
148
- if len(self.SIG_QUEUE) < 5:
149
- self.SIG_QUEUE.append(sig)
150
- self.wakeup()
151
-
152
- def run(self):
153
- "Main master loop."
154
- self.start()
155
- util._setproctitle("master [%s]" % self.proc_name)
156
-
157
- self.manage_workers()
158
- while True:
159
- try:
160
- self.reap_workers()
161
- sig = self.SIG_QUEUE.pop(0) if len(self.SIG_QUEUE) else None
162
- if sig is None:
163
- self.sleep()
164
- self.murder_workers()
165
- self.manage_workers()
166
- continue
167
-
168
- if sig not in self.SIG_NAMES:
169
- self.log.info("Ignoring unknown signal: %s", sig)
170
- continue
171
-
172
- signame = self.SIG_NAMES.get(sig)
173
- handler = getattr(self, "handle_%s" % signame, None)
174
- if not handler:
175
- self.log.error("Unhandled signal: %s", signame)
176
- continue
177
- self.log.info("Handling signal: %s", signame)
178
- handler()
179
- self.wakeup()
180
- except StopIteration:
181
- self.halt()
182
- except KeyboardInterrupt:
183
- self.halt()
184
- except HaltServer, inst:
185
- self.halt(reason=inst.reason, exit_status=inst.exit_status)
186
- except SystemExit:
187
- raise
188
- except Exception:
189
- self.log.info("Unhandled exception in main loop:\n%s",
190
- traceback.format_exc())
191
- self.stop(False)
192
- if self.pidfile is not None:
193
- self.pidfile.unlink()
194
- sys.exit(-1)
195
-
196
- def handle_chld(self, sig, frame):
197
- "SIGCHLD handling"
198
- self.wakeup()
199
-
200
- def handle_hup(self):
201
- """\
202
- HUP handling.
203
- - Reload configuration
204
- - Start the new worker processes with a new configuration
205
- - Gracefully shutdown the old worker processes
206
- """
207
- self.log.info("Hang up: %s", self.master_name)
208
- self.reload()
209
-
210
- def handle_quit(self):
211
- "SIGQUIT handling"
212
- raise StopIteration
213
-
214
- def handle_int(self):
215
- "SIGINT handling"
216
- self.stop(False)
217
- raise StopIteration
218
-
219
- def handle_term(self):
220
- "SIGTERM handling"
221
- self.stop(False)
222
- raise StopIteration
223
-
224
- def handle_ttin(self):
225
- """\
226
- SIGTTIN handling.
227
- Increases the number of workers by one.
228
- """
229
- self.num_workers += 1
230
- self.manage_workers()
231
-
232
- def handle_ttou(self):
233
- """\
234
- SIGTTOU handling.
235
- Decreases the number of workers by one.
236
- """
237
- if self.num_workers <= 1:
238
- return
239
- self.num_workers -= 1
240
- self.manage_workers()
241
-
242
- def handle_usr1(self):
243
- """\
244
- SIGUSR1 handling.
245
- Kill all workers by sending them a SIGUSR1
246
- """
247
- self.kill_workers(signal.SIGUSR1)
248
- self.log.reopen_files()
249
-
250
- def handle_usr2(self):
251
- """\
252
- SIGUSR2 handling.
253
- Creates a new master/worker set as a slave of the current
254
- master without affecting old workers. Use this to do live
255
- deployment with the ability to backout a change.
256
- """
257
- self.reexec()
258
-
259
- def handle_winch(self):
260
- "SIGWINCH handling"
261
- if os.getppid() == 1 or os.getpgrp() != os.getpid():
262
- self.log.info("graceful stop of workers")
263
- self.num_workers = 0
264
- self.kill_workers(signal.SIGQUIT)
265
- else:
266
- self.log.info("SIGWINCH ignored. Not daemonized")
267
-
268
- def wakeup(self):
269
- """\
270
- Wake up the arbiter by writing to the PIPE
271
- """
272
- try:
273
- os.write(self.PIPE[1], '.')
274
- except IOError, e:
275
- if e.errno not in [errno.EAGAIN, errno.EINTR]:
276
- raise
277
-
278
- def halt(self, reason=None, exit_status=0):
279
- """ halt arbiter """
280
- self.stop()
281
- self.log.info("Shutting down: %s", self.master_name)
282
- if reason is not None:
283
- self.log.info("Reason: %s", reason)
284
- if self.pidfile is not None:
285
- self.pidfile.unlink()
286
- sys.exit(exit_status)
287
-
288
- def sleep(self):
289
- """\
290
- Sleep until PIPE is readable or we timeout.
291
- A readable PIPE means a signal occurred.
292
- """
293
- try:
294
- ready = select.select([self.PIPE[0]], [], [], 1.0)
295
- if not ready[0]:
296
- return
297
- while os.read(self.PIPE[0], 1):
298
- pass
299
- except select.error, e:
300
- if e[0] not in [errno.EAGAIN, errno.EINTR]:
301
- raise
302
- except OSError, e:
303
- if e.errno not in [errno.EAGAIN, errno.EINTR]:
304
- raise
305
- except KeyboardInterrupt:
306
- sys.exit()
307
-
308
-
309
- def stop(self, graceful=True):
310
- """\
311
- Stop workers
312
-
313
- :attr graceful: boolean, If True (the default) workers will be
314
- killed gracefully (ie. trying to wait for the current connection)
315
- """
316
- try:
317
- self.LISTENER.close()
318
- except Exception:
319
- pass
320
- self.LISTENER = None
321
- sig = signal.SIGQUIT
322
- if not graceful:
323
- sig = signal.SIGTERM
324
- limit = time.time() + self.cfg.graceful_timeout
325
- while self.WORKERS and time.time() < limit:
326
- self.kill_workers(sig)
327
- time.sleep(0.1)
328
- self.reap_workers()
329
- self.kill_workers(signal.SIGKILL)
330
-
331
- def reexec(self):
332
- """\
333
- Relaunch the master and workers.
334
- """
335
- if self.pidfile is not None:
336
- self.pidfile.rename("%s.oldbin" % self.pidfile.fname)
337
-
338
- self.reexec_pid = os.fork()
339
- if self.reexec_pid != 0:
340
- self.master_name = "Old Master"
341
- return
342
-
343
- os.environ['GUNICORN_FD'] = str(self.LISTENER.fileno())
344
- os.chdir(self.START_CTX['cwd'])
345
- self.cfg.pre_exec(self)
346
- util.closerange(3, self.LISTENER.fileno())
347
- util.closerange(self.LISTENER.fileno()+1, util.get_maxfd())
348
- os.execvpe(self.START_CTX[0], self.START_CTX['args'], os.environ)
349
-
350
- def reload(self):
351
- old_address = self.cfg.address
352
-
353
- # reload conf
354
- self.app.reload()
355
- self.setup(self.app)
356
-
357
- # reopen log files
358
- self.log.reopen_files()
359
-
360
- # do we need to change listener ?
361
- if old_address != self.cfg.address:
362
- self.LISTENER.close()
363
- self.LISTENER = create_socket(self.cfg, self.log)
364
- self.log.info("Listening at: %s", self.LISTENER)
365
-
366
- # do some actions on reload
367
- self.cfg.on_reload(self)
368
-
369
- # unlink pidfile
370
- if self.pidfile is not None:
371
- self.pidfile.unlink()
372
-
373
- # create new pidfile
374
- if self.cfg.pidfile is not None:
375
- self.pidfile = Pidfile(self.cfg.pidfile)
376
- self.pidfile.create(self.pid)
377
-
378
- # set new proc_name
379
- util._setproctitle("master [%s]" % self.proc_name)
380
-
381
- # spawn new workers
382
- for i in range(self.cfg.workers):
383
- self.spawn_worker()
384
-
385
- # manage workers
386
- self.manage_workers()
387
-
388
- def murder_workers(self):
389
- """\
390
- Kill unused/idle workers
391
- """
392
- for (pid, worker) in self.WORKERS.items():
393
- try:
394
- if time.time() - worker.tmp.last_update() <= self.timeout:
395
- continue
396
- except ValueError:
397
- continue
398
-
399
- self.log.critical("WORKER TIMEOUT (pid:%s)", pid)
400
- self.kill_worker(pid, signal.SIGKILL)
401
-
402
- def reap_workers(self):
403
- """\
404
- Reap workers to avoid zombie processes
405
- """
406
- try:
407
- while True:
408
- wpid, status = os.waitpid(-1, os.WNOHANG)
409
- if not wpid:
410
- break
411
- if self.reexec_pid == wpid:
412
- self.reexec_pid = 0
413
- else:
414
- # A worker said it cannot boot. We'll shutdown
415
- # to avoid infinite start/stop cycles.
416
- exitcode = status >> 8
417
- if exitcode == self.WORKER_BOOT_ERROR:
418
- reason = "Worker failed to boot."
419
- raise HaltServer(reason, self.WORKER_BOOT_ERROR)
420
- worker = self.WORKERS.pop(wpid, None)
421
- if not worker:
422
- continue
423
- worker.tmp.close()
424
- except OSError, e:
425
- if e.errno == errno.ECHILD:
426
- pass
427
-
428
- def manage_workers(self):
429
- """\
430
- Maintain the number of workers by spawning or killing
431
- as required.
432
- """
433
- if len(self.WORKERS.keys()) < self.num_workers:
434
- self.spawn_workers()
435
-
436
- workers = self.WORKERS.items()
437
- workers.sort(key=lambda w: w[1].age)
438
- while len(workers) > self.num_workers:
439
- (pid, _) = workers.pop(0)
440
- self.kill_worker(pid, signal.SIGQUIT)
441
-
442
- def spawn_worker(self):
443
- self.worker_age += 1
444
- worker = self.worker_class(self.worker_age, self.pid, self.LISTENER,
445
- self.app, self.timeout/2.0,
446
- self.cfg, self.log)
447
- self.cfg.pre_fork(self, worker)
448
- pid = os.fork()
449
- if pid != 0:
450
- self.WORKERS[pid] = worker
451
- return pid
452
-
453
- # Process Child
454
- worker_pid = os.getpid()
455
- try:
456
- util._setproctitle("worker [%s]" % self.proc_name)
457
- self.log.info("Booting worker with pid: %s", worker_pid)
458
- self.cfg.post_fork(self, worker)
459
- worker.init_process()
460
- sys.exit(0)
461
- except SystemExit:
462
- raise
463
- except:
464
- self.log.debug("Exception in worker process:\n%s",
465
- traceback.format_exc())
466
- if not worker.booted:
467
- sys.exit(self.WORKER_BOOT_ERROR)
468
- sys.exit(-1)
469
- finally:
470
- self.log.info("Worker exiting (pid: %s)", worker_pid)
471
- try:
472
- worker.tmp.close()
473
- self.cfg.worker_exit(self, worker)
474
- except:
475
- pass
476
-
477
- def spawn_workers(self):
478
- """\
479
- Spawn new workers as needed.
480
-
481
- This is where a worker process leaves the main loop
482
- of the master process.
483
- """
484
-
485
- for i in range(self.num_workers - len(self.WORKERS.keys())):
486
- self.spawn_worker()
487
-
488
- def kill_workers(self, sig):
489
- """\
490
- Kill all workers with the signal `sig`
491
- :attr sig: `signal.SIG*` value
492
- """
493
- for pid in self.WORKERS.keys():
494
- self.kill_worker(pid, sig)
495
-
496
- def kill_worker(self, pid, sig):
497
- """\
498
- Kill a worker
499
-
500
- :attr pid: int, worker pid
501
- :attr sig: `signal.SIG*` value
502
- """
503
- try:
504
- os.kill(pid, sig)
505
- except OSError, e:
506
- if e.errno == errno.ESRCH:
507
- try:
508
- worker = self.WORKERS.pop(pid)
509
- worker.tmp.close()
510
- self.cfg.worker_exit(self, worker)
511
- return
512
- except (KeyError, OSError):
513
- return
514
- raise