pygments.rb 1.2.1 → 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 (378) 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 -6
  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 +10 -21
  11. data/bench.rb +8 -7
  12. data/cache-lexers.rb +3 -2
  13. data/lib/pygments.rb +10 -11
  14. data/lib/pygments/lexer.rb +5 -5
  15. data/lib/pygments/mentos.py +23 -66
  16. data/lib/pygments/popen.rb +152 -204
  17. data/lib/pygments/version.rb +2 -2
  18. data/pygments.rb.gemspec +11 -9
  19. data/test/test_pygments.rb +51 -84
  20. data/vendor/pygments-main/{AUTHORS → Pygments-2.7.3.dist-info/AUTHORS} +21 -3
  21. data/vendor/pygments-main/Pygments-2.7.3.dist-info/INSTALLER +1 -0
  22. data/vendor/pygments-main/{LICENSE → Pygments-2.7.3.dist-info/LICENSE} +1 -1
  23. data/vendor/pygments-main/Pygments-2.7.3.dist-info/METADATA +49 -0
  24. data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +482 -0
  25. data/vendor/pygments-main/Pygments-2.7.3.dist-info/REQUESTED +0 -0
  26. data/vendor/pygments-main/Pygments-2.7.3.dist-info/WHEEL +5 -0
  27. data/vendor/pygments-main/Pygments-2.7.3.dist-info/entry_points.txt +3 -0
  28. data/vendor/pygments-main/Pygments-2.7.3.dist-info/top_level.txt +1 -0
  29. data/vendor/pygments-main/bin/pygmentize +8 -0
  30. data/vendor/pygments-main/pygments/__init__.py +6 -11
  31. data/vendor/pygments-main/pygments/__main__.py +18 -0
  32. data/vendor/pygments-main/pygments/cmdline.py +38 -29
  33. data/vendor/pygments-main/pygments/console.py +6 -9
  34. data/vendor/pygments-main/pygments/filter.py +4 -6
  35. data/vendor/pygments-main/pygments/filters/__init__.py +609 -21
  36. data/vendor/pygments-main/pygments/formatter.py +4 -4
  37. data/vendor/pygments-main/pygments/formatters/__init__.py +9 -8
  38. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -3
  39. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
  40. data/vendor/pygments-main/pygments/formatters/html.py +223 -135
  41. data/vendor/pygments-main/pygments/formatters/img.py +68 -41
  42. data/vendor/pygments-main/pygments/formatters/irc.py +39 -39
  43. data/vendor/pygments-main/pygments/formatters/latex.py +56 -26
  44. data/vendor/pygments-main/pygments/formatters/other.py +12 -8
  45. data/vendor/pygments-main/pygments/formatters/rtf.py +29 -29
  46. data/vendor/pygments-main/pygments/formatters/svg.py +38 -4
  47. data/vendor/pygments-main/pygments/formatters/terminal.py +25 -31
  48. data/vendor/pygments-main/pygments/formatters/terminal256.py +22 -12
  49. data/vendor/pygments-main/pygments/lexer.py +41 -39
  50. data/vendor/pygments-main/pygments/lexers/__init__.py +342 -0
  51. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1645 -0
  52. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +232 -0
  53. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +71 -0
  54. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1725 -0
  55. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5327 -0
  56. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +293 -0
  57. data/vendor/pygments-main/pygments/lexers/_mapping.py +551 -0
  58. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1172 -0
  59. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
  60. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2547 -0
  61. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4753 -0
  62. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +678 -0
  63. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3094 -0
  64. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1161 -0
  65. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +558 -0
  66. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +421 -0
  67. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1004 -0
  68. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +113 -0
  69. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +280 -0
  70. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1939 -0
  71. data/vendor/pygments-main/pygments/lexers/actionscript.py +245 -0
  72. data/vendor/pygments-main/pygments/lexers/agile.py +24 -0
  73. data/vendor/pygments-main/pygments/lexers/algebra.py +240 -0
  74. data/vendor/pygments-main/pygments/lexers/ambient.py +76 -0
  75. data/vendor/pygments-main/pygments/lexers/ampl.py +87 -0
  76. data/vendor/pygments-main/pygments/lexers/apl.py +101 -0
  77. data/vendor/pygments-main/pygments/lexers/archetype.py +318 -0
  78. data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
  79. data/vendor/pygments-main/pygments/lexers/asm.py +1005 -0
  80. data/vendor/pygments-main/pygments/lexers/automation.py +374 -0
  81. data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
  82. data/vendor/pygments-main/pygments/lexers/basic.py +662 -0
  83. data/vendor/pygments-main/pygments/lexers/bibtex.py +160 -0
  84. data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
  85. data/vendor/pygments-main/pygments/lexers/business.py +627 -0
  86. data/vendor/pygments-main/pygments/lexers/c_cpp.py +344 -0
  87. data/vendor/pygments-main/pygments/lexers/c_like.py +566 -0
  88. data/vendor/pygments-main/pygments/lexers/capnproto.py +78 -0
  89. data/vendor/pygments-main/pygments/lexers/chapel.py +112 -0
  90. data/vendor/pygments-main/pygments/lexers/clean.py +179 -0
  91. data/vendor/pygments-main/pygments/lexers/compiled.py +34 -0
  92. data/vendor/pygments-main/pygments/lexers/configs.py +984 -0
  93. data/vendor/pygments-main/pygments/lexers/console.py +114 -0
  94. data/vendor/pygments-main/pygments/lexers/crystal.py +392 -0
  95. data/vendor/pygments-main/pygments/lexers/csound.py +467 -0
  96. data/vendor/pygments-main/pygments/lexers/css.py +691 -0
  97. data/vendor/pygments-main/pygments/lexers/d.py +256 -0
  98. data/vendor/pygments-main/pygments/lexers/dalvik.py +125 -0
  99. data/vendor/pygments-main/pygments/lexers/data.py +698 -0
  100. data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
  101. data/vendor/pygments-main/pygments/lexers/diff.py +165 -0
  102. data/vendor/pygments-main/pygments/lexers/dotnet.py +707 -0
  103. data/vendor/pygments-main/pygments/lexers/dsls.py +960 -0
  104. data/vendor/pygments-main/pygments/lexers/dylan.py +287 -0
  105. data/vendor/pygments-main/pygments/lexers/ecl.py +139 -0
  106. data/vendor/pygments-main/pygments/lexers/eiffel.py +65 -0
  107. data/vendor/pygments-main/pygments/lexers/elm.py +121 -0
  108. data/vendor/pygments-main/pygments/lexers/email.py +151 -0
  109. data/vendor/pygments-main/pygments/lexers/erlang.py +530 -0
  110. data/vendor/pygments-main/pygments/lexers/esoteric.py +304 -0
  111. data/vendor/pygments-main/pygments/lexers/ezhil.py +77 -0
  112. data/vendor/pygments-main/pygments/lexers/factor.py +344 -0
  113. data/vendor/pygments-main/pygments/lexers/fantom.py +250 -0
  114. data/vendor/pygments-main/pygments/lexers/felix.py +273 -0
  115. data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
  116. data/vendor/pygments-main/pygments/lexers/forth.py +178 -0
  117. data/vendor/pygments-main/pygments/lexers/fortran.py +206 -0
  118. data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
  119. data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
  120. data/vendor/pygments-main/pygments/lexers/functional.py +21 -0
  121. data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
  122. data/vendor/pygments-main/pygments/lexers/go.py +101 -0
  123. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +270 -0
  124. data/vendor/pygments-main/pygments/lexers/graph.py +85 -0
  125. data/vendor/pygments-main/pygments/lexers/graphics.py +800 -0
  126. data/vendor/pygments-main/pygments/lexers/haskell.py +870 -0
  127. data/vendor/pygments-main/pygments/lexers/haxe.py +936 -0
  128. data/vendor/pygments-main/pygments/lexers/hdl.py +472 -0
  129. data/vendor/pygments-main/pygments/lexers/hexdump.py +103 -0
  130. data/vendor/pygments-main/pygments/lexers/html.py +614 -0
  131. data/vendor/pygments-main/pygments/lexers/idl.py +281 -0
  132. data/vendor/pygments-main/pygments/lexers/igor.py +420 -0
  133. data/vendor/pygments-main/pygments/lexers/inferno.py +96 -0
  134. data/vendor/pygments-main/pygments/lexers/installers.py +322 -0
  135. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1368 -0
  136. data/vendor/pygments-main/pygments/lexers/iolang.py +63 -0
  137. data/vendor/pygments-main/pygments/lexers/j.py +146 -0
  138. data/vendor/pygments-main/pygments/lexers/javascript.py +1540 -0
  139. data/vendor/pygments-main/pygments/lexers/julia.py +331 -0
  140. data/vendor/pygments-main/pygments/lexers/jvm.py +1673 -0
  141. data/vendor/pygments-main/pygments/lexers/lisp.py +2699 -0
  142. data/vendor/pygments-main/pygments/lexers/make.py +206 -0
  143. data/vendor/pygments-main/pygments/lexers/markup.py +765 -0
  144. data/vendor/pygments-main/pygments/lexers/math.py +21 -0
  145. data/vendor/pygments-main/pygments/lexers/matlab.py +720 -0
  146. data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
  147. data/vendor/pygments-main/pygments/lexers/ml.py +958 -0
  148. data/vendor/pygments-main/pygments/lexers/modeling.py +366 -0
  149. data/vendor/pygments-main/pygments/lexers/modula2.py +1580 -0
  150. data/vendor/pygments-main/pygments/lexers/monte.py +204 -0
  151. data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
  152. data/vendor/pygments-main/pygments/lexers/ncl.py +894 -0
  153. data/vendor/pygments-main/pygments/lexers/nimrod.py +159 -0
  154. data/vendor/pygments-main/pygments/lexers/nit.py +64 -0
  155. data/vendor/pygments-main/pygments/lexers/nix.py +136 -0
  156. data/vendor/pygments-main/pygments/lexers/oberon.py +121 -0
  157. data/vendor/pygments-main/pygments/lexers/objective.py +504 -0
  158. data/vendor/pygments-main/pygments/lexers/ooc.py +85 -0
  159. data/vendor/pygments-main/pygments/lexers/other.py +41 -0
  160. data/vendor/pygments-main/pygments/lexers/parasail.py +79 -0
  161. data/vendor/pygments-main/pygments/lexers/parsers.py +800 -0
  162. data/vendor/pygments-main/pygments/lexers/pascal.py +644 -0
  163. data/vendor/pygments-main/pygments/lexers/pawn.py +205 -0
  164. data/vendor/pygments-main/pygments/lexers/perl.py +732 -0
  165. data/vendor/pygments-main/pygments/lexers/php.py +321 -0
  166. data/vendor/pygments-main/pygments/lexers/pointless.py +71 -0
  167. data/vendor/pygments-main/pygments/lexers/pony.py +94 -0
  168. data/vendor/pygments-main/pygments/lexers/praat.py +302 -0
  169. data/vendor/pygments-main/pygments/lexers/prolog.py +306 -0
  170. data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
  171. data/vendor/pygments-main/pygments/lexers/python.py +1151 -0
  172. data/vendor/pygments-main/pygments/lexers/qvt.py +152 -0
  173. data/vendor/pygments-main/pygments/lexers/r.py +191 -0
  174. data/vendor/pygments-main/pygments/lexers/rdf.py +463 -0
  175. data/vendor/pygments-main/pygments/lexers/rebol.py +431 -0
  176. data/vendor/pygments-main/pygments/lexers/resource.py +85 -0
  177. data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
  178. data/vendor/pygments-main/pygments/lexers/rnc.py +67 -0
  179. data/vendor/pygments-main/pygments/lexers/roboconf.py +82 -0
  180. data/vendor/pygments-main/pygments/lexers/robotframework.py +552 -0
  181. data/vendor/pygments-main/pygments/lexers/ruby.py +517 -0
  182. data/vendor/pygments-main/pygments/lexers/rust.py +224 -0
  183. data/vendor/pygments-main/pygments/lexers/sas.py +228 -0
  184. data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
  185. data/vendor/pygments-main/pygments/lexers/scripting.py +1284 -0
  186. data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
  187. data/vendor/pygments-main/pygments/lexers/shell.py +914 -0
  188. data/vendor/pygments-main/pygments/lexers/sieve.py +69 -0
  189. data/vendor/pygments-main/pygments/lexers/slash.py +185 -0
  190. data/vendor/pygments-main/pygments/lexers/smalltalk.py +195 -0
  191. data/vendor/pygments-main/pygments/lexers/smv.py +79 -0
  192. data/vendor/pygments-main/pygments/lexers/snobol.py +83 -0
  193. data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
  194. data/vendor/pygments-main/pygments/lexers/special.py +105 -0
  195. data/vendor/pygments-main/pygments/lexers/sql.py +837 -0
  196. data/vendor/pygments-main/pygments/lexers/stata.py +171 -0
  197. data/vendor/pygments-main/pygments/lexers/supercollider.py +95 -0
  198. data/vendor/pygments-main/pygments/lexers/tcl.py +145 -0
  199. data/vendor/pygments-main/pygments/lexers/templates.py +2264 -0
  200. data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
  201. data/vendor/pygments-main/pygments/lexers/testing.py +207 -0
  202. data/vendor/pygments-main/pygments/lexers/text.py +26 -0
  203. data/vendor/pygments-main/pygments/lexers/textedit.py +169 -0
  204. data/vendor/pygments-main/pygments/lexers/textfmts.py +430 -0
  205. data/vendor/pygments-main/pygments/lexers/theorem.py +474 -0
  206. data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
  207. data/vendor/pygments-main/pygments/lexers/trafficscript.py +54 -0
  208. data/vendor/pygments-main/pygments/lexers/typoscript.py +219 -0
  209. data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
  210. data/vendor/pygments-main/pygments/lexers/urbi.py +146 -0
  211. data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
  212. data/vendor/pygments-main/pygments/lexers/varnish.py +190 -0
  213. data/vendor/pygments-main/pygments/lexers/verification.py +114 -0
  214. data/vendor/pygments-main/pygments/lexers/web.py +24 -0
  215. data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
  216. data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
  217. data/vendor/pygments-main/pygments/lexers/whiley.py +116 -0
  218. data/vendor/pygments-main/pygments/lexers/x10.py +69 -0
  219. data/vendor/pygments-main/pygments/lexers/xorg.py +37 -0
  220. data/vendor/pygments-main/pygments/lexers/yang.py +104 -0
  221. data/vendor/pygments-main/pygments/lexers/zig.py +124 -0
  222. data/vendor/pygments-main/pygments/modeline.py +1 -1
  223. data/vendor/pygments-main/pygments/plugin.py +4 -2
  224. data/vendor/pygments-main/pygments/regexopt.py +1 -1
  225. data/vendor/pygments-main/pygments/scanner.py +2 -2
  226. data/vendor/pygments-main/pygments/sphinxext.py +2 -4
  227. data/vendor/pygments-main/pygments/style.py +61 -24
  228. data/vendor/pygments-main/pygments/styles/__init__.py +10 -4
  229. data/vendor/pygments-main/pygments/styles/abap.py +1 -1
  230. data/vendor/pygments-main/pygments/styles/algol.py +1 -1
  231. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -1
  232. data/vendor/pygments-main/pygments/styles/arduino.py +2 -2
  233. data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
  234. data/vendor/pygments-main/pygments/styles/borland.py +1 -1
  235. data/vendor/pygments-main/pygments/styles/bw.py +1 -1
  236. data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
  237. data/vendor/pygments-main/pygments/styles/default.py +1 -1
  238. data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
  239. data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
  240. data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
  241. data/vendor/pygments-main/pygments/styles/igor.py +1 -1
  242. data/vendor/pygments-main/pygments/styles/inkpot.py +67 -0
  243. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -1
  244. data/vendor/pygments-main/pygments/styles/manni.py +1 -1
  245. data/vendor/pygments-main/pygments/styles/monokai.py +4 -3
  246. data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
  247. data/vendor/pygments-main/pygments/styles/native.py +1 -1
  248. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -1
  249. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -1
  250. data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
  251. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
  252. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -1
  253. data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
  254. data/vendor/pygments-main/pygments/styles/sas.py +1 -1
  255. data/vendor/pygments-main/pygments/styles/solarized.py +134 -0
  256. data/vendor/pygments-main/pygments/styles/stata_dark.py +41 -0
  257. data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -15
  258. data/vendor/pygments-main/pygments/styles/tango.py +1 -1
  259. data/vendor/pygments-main/pygments/styles/trac.py +1 -1
  260. data/vendor/pygments-main/pygments/styles/vim.py +1 -1
  261. data/vendor/pygments-main/pygments/styles/vs.py +1 -1
  262. data/vendor/pygments-main/pygments/styles/xcode.py +1 -1
  263. data/vendor/pygments-main/pygments/token.py +1 -1
  264. data/vendor/pygments-main/pygments/unistring.py +47 -108
  265. data/vendor/pygments-main/pygments/util.py +15 -92
  266. metadata +69 -136
  267. data/CHANGELOG.md +0 -111
  268. data/README.md +0 -121
  269. data/circle.yml +0 -20
  270. data/test/test_data.py +0 -514
  271. data/test/test_data_generated +0 -2582
  272. data/vendor/custom_lexers/github.py +0 -565
  273. data/vendor/pygments-main/CHANGES +0 -1186
  274. data/vendor/pygments-main/MANIFEST.in +0 -6
  275. data/vendor/pygments-main/Makefile +0 -65
  276. data/vendor/pygments-main/README.rst +0 -39
  277. data/vendor/pygments-main/REVISION +0 -1
  278. data/vendor/pygments-main/TODO +0 -12
  279. data/vendor/pygments-main/doc/Makefile +0 -153
  280. data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
  281. data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
  282. data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
  283. data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
  284. data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
  285. data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
  286. data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
  287. data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
  288. data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
  289. data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
  290. data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
  291. data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
  292. data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
  293. data/vendor/pygments-main/doc/conf.py +0 -241
  294. data/vendor/pygments-main/doc/docs/api.rst +0 -354
  295. data/vendor/pygments-main/doc/docs/authors.rst +0 -4
  296. data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
  297. data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
  298. data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
  299. data/vendor/pygments-main/doc/docs/filters.rst +0 -41
  300. data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
  301. data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
  302. data/vendor/pygments-main/doc/docs/index.rst +0 -66
  303. data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
  304. data/vendor/pygments-main/doc/docs/java.rst +0 -70
  305. data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
  306. data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
  307. data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
  308. data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
  309. data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
  310. data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
  311. data/vendor/pygments-main/doc/docs/styles.rst +0 -201
  312. data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
  313. data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
  314. data/vendor/pygments-main/doc/download.rst +0 -41
  315. data/vendor/pygments-main/doc/faq.rst +0 -139
  316. data/vendor/pygments-main/doc/index.rst +0 -54
  317. data/vendor/pygments-main/doc/languages.rst +0 -154
  318. data/vendor/pygments-main/doc/make.bat +0 -190
  319. data/vendor/pygments-main/doc/pygmentize.1 +0 -94
  320. data/vendor/pygments-main/external/autopygmentize +0 -101
  321. data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
  322. data/vendor/pygments-main/external/markdown-processor.py +0 -67
  323. data/vendor/pygments-main/external/moin-parser.py +0 -112
  324. data/vendor/pygments-main/external/pygments.bashcomp +0 -38
  325. data/vendor/pygments-main/external/rst-directive.py +0 -82
  326. data/vendor/pygments-main/pygmentize +0 -8
  327. data/vendor/pygments-main/requirements.txt +0 -5
  328. data/vendor/pygments-main/scripts/check_sources.py +0 -211
  329. data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
  330. data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
  331. data/vendor/pygments-main/scripts/epydoc.css +0 -280
  332. data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
  333. data/vendor/pygments-main/scripts/pylintrc +0 -301
  334. data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
  335. data/vendor/pygments-main/setup.cfg +0 -10
  336. data/vendor/pygments-main/setup.py +0 -77
  337. data/vendor/pygments-main/tox.ini +0 -7
  338. data/vendor/simplejson/.gitignore +0 -10
  339. data/vendor/simplejson/.travis.yml +0 -5
  340. data/vendor/simplejson/CHANGES.txt +0 -291
  341. data/vendor/simplejson/LICENSE.txt +0 -19
  342. data/vendor/simplejson/MANIFEST.in +0 -5
  343. data/vendor/simplejson/README.rst +0 -19
  344. data/vendor/simplejson/conf.py +0 -179
  345. data/vendor/simplejson/index.rst +0 -628
  346. data/vendor/simplejson/scripts/make_docs.py +0 -18
  347. data/vendor/simplejson/setup.py +0 -104
  348. data/vendor/simplejson/simplejson/__init__.py +0 -510
  349. data/vendor/simplejson/simplejson/_speedups.c +0 -2745
  350. data/vendor/simplejson/simplejson/decoder.py +0 -425
  351. data/vendor/simplejson/simplejson/encoder.py +0 -567
  352. data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
  353. data/vendor/simplejson/simplejson/scanner.py +0 -77
  354. data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
  355. data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
  356. data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
  357. data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
  358. data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
  359. data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
  360. data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
  361. data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
  362. data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
  363. data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
  364. data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
  365. data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
  366. data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
  367. data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
  368. data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
  369. data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
  370. data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
  371. data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
  372. data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
  373. data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
  374. data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
  375. data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
  376. data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
  377. data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
  378. data/vendor/simplejson/simplejson/tool.py +0 -39
@@ -1,111 +0,0 @@
1
- CHANGELOG
2
- ===========
3
-
4
- Version 1.2.1 (2017/12/07)
5
- -----------------------------
6
-
7
- * Automatically update `lexers` cache on build [186](https://github.com/tmm1/pygments.rb/pull/186)
8
- * See [#185](https://github.com/tmm1/pygments.rb/pull/185) for the reason
9
-
10
- Version 1.2.0 (2017/09/13)
11
- -----------------------------
12
-
13
- * Exclude symlinks from the gem package to solve Windows issues [#181](https://github.com/tmm1/pygments.rb/pull/181)
14
- * Upgrade pygments to 2.0.0 [#180](https://github.com/tmm1/pygments.rb/pull/180)
15
-
16
- Version 1.1.2 (2017/04/03)
17
- -----------------------------
18
-
19
- * Resolves #176 exclude find_error.py symlink from gem [#177](https://github.com/tmm1/pygments.rb/pull/177)
20
-
21
- Version 1.1.1 (2016/12/28)
22
- -----------------------------
23
-
24
- * Suppress Ruby 2.4.0's warnings [#172](https://github.com/tmm1/pygments.rb/pull/172)
25
- * Enable `frozen_string_literal` [#173](https://github.com/tmm1/pygments.rb/pull/173)
26
-
27
- Version 1.1.0 (2016/12/24)
28
- -----------------------------
29
-
30
- * Support JRuby [#170](https://github.com/tmm1/pygments.rb/pull/170)
31
- * Make pygments.rb thread safe [#171](https://github.com/tmm1/pygments.rb/pull/171)
32
-
33
- Version 1.0.0 (2016/12/11)
34
- -----------------------------
35
-
36
- * Upgrade bundled pygments to 2.2.0-HEAD [#167](https://github.com/tmm1/pygments.rb/pull/167)
37
- * This includes **incompatible changes* because of upgrade of pygments.
38
- See http://pygments.org/ for details.
39
- * Relax yajl-ruby dependency to "~> 1.2" [#164](https://github.com/tmm1/pygments.rb/pull/164)
40
- * Python binary can be configured by `PYTMENTS_RB_PYTHON` env [#168](https://github.com/tmm1/pygments.rb/pull/168)
41
- * Improved error messages when python binary is missing [#158](https://github.com/tmm1/pygments.rb/pull/158)
42
-
43
-
44
- Version 0.5.4 (Nov 3, 2013)
45
- -----------------------------
46
-
47
- * Update lexers file
48
-
49
- Version 0.5.3 (Sep 17, 2013)
50
- -----------------------------
51
-
52
- * Fixes for Slash lexer
53
- * Improve highlighting for Slash lexer
54
- * Upgrade to latest pygments (1.7, changes summary follows. See pygments changelog for details)
55
- * Add Clay lexer
56
- * Add Perl 6 lexer
57
- * Add Swig lexer
58
- * Add nesC lexer
59
- * Add BlitzBasic lexer
60
- * Add EBNF lexer
61
- * Add Igor Pro lexer
62
- * Add Rexx lexer
63
- * Add Agda lexer
64
- * Recognize vim modelines
65
- * Improve Python 3 lexer
66
- * Improve Opa lexer
67
- * Improve Julia lexer
68
- * Improve Lasso lexer
69
- * Improve Objective C/C++ lexer
70
- * Improve Ruby lexer
71
- * Improve Stan lexer
72
- * Improve JavaScript lexer
73
- * Improve HTTP lexer
74
- * Improve Koka lexer
75
- * Improve Haxe lexer
76
- * Improve Prolog lexer
77
- * Improve F# lexer
78
-
79
- Version 0.5.2 (July 17, 2013)
80
- -----------------------------
81
-
82
- * Add Slash lexer
83
-
84
- Version 0.5.1 (June 25, 2013)
85
- -----------------------------
86
-
87
- * Ensure compatability across distros by detecting if `python2` is available
88
-
89
- Version 0.5.0 (Apr 13, 2013)
90
- -----------------------------
91
-
92
- * Use #rstrip to fix table mode bug
93
-
94
- Version 0.4.2 (Feb 25, 2013)
95
- -----------------------------
96
-
97
- * Add new lexers, including custom lexers
98
-
99
- Version 0.3.7 (Jan 2, 2013)
100
- -----------------------------
101
-
102
- * Fixed missing custom lexers
103
- * Added syntax highlighting for Hxml
104
-
105
- Version 0.3.4 (Dec 28, 2012)
106
- -----------------------------
107
-
108
- * Add support for Windows
109
- * Add MIT license
110
-
111
-
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