pygments.rb 2.0.0 → 2.1.0

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +12 -0
  3. data/.rubocop.yml +18 -0
  4. data/CHANGELOG.adoc +4 -0
  5. data/Rakefile +1 -3
  6. data/bench.rb +9 -4
  7. data/{cache-lexers.rb → cache_lexers.rb} +0 -0
  8. data/lib/pygments/lexer.rb +1 -1
  9. data/lib/pygments/popen.rb +129 -127
  10. data/lib/pygments/version.rb +1 -1
  11. data/pygments.rb.gemspec +1 -1
  12. data/test/test_pygments.rb +6 -8
  13. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/AUTHORS +5 -0
  14. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/INSTALLER +0 -0
  15. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/LICENSE +1 -1
  16. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/METADATA +8 -9
  17. data/vendor/pygments-main/Pygments-2.8.0.dist-info/RECORD +494 -0
  18. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/REQUESTED +0 -0
  19. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/WHEEL +0 -0
  20. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/entry_points.txt +0 -0
  21. data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/top_level.txt +0 -0
  22. data/vendor/pygments-main/pygments/__init__.py +2 -3
  23. data/vendor/pygments-main/pygments/__main__.py +1 -2
  24. data/vendor/pygments-main/pygments/cmdline.py +179 -159
  25. data/vendor/pygments-main/pygments/console.py +1 -2
  26. data/vendor/pygments-main/pygments/filter.py +1 -2
  27. data/vendor/pygments-main/pygments/filters/__init__.py +1 -2
  28. data/vendor/pygments-main/pygments/formatter.py +1 -2
  29. data/vendor/pygments-main/pygments/formatters/__init__.py +2 -3
  30. data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -2
  31. data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -2
  32. data/vendor/pygments-main/pygments/formatters/html.py +33 -18
  33. data/vendor/pygments-main/pygments/formatters/img.py +24 -10
  34. data/vendor/pygments-main/pygments/formatters/irc.py +1 -2
  35. data/vendor/pygments-main/pygments/formatters/latex.py +8 -9
  36. data/vendor/pygments-main/pygments/formatters/other.py +7 -10
  37. data/vendor/pygments-main/pygments/formatters/rtf.py +1 -2
  38. data/vendor/pygments-main/pygments/formatters/svg.py +5 -4
  39. data/vendor/pygments-main/pygments/formatters/terminal.py +1 -2
  40. data/vendor/pygments-main/pygments/formatters/terminal256.py +24 -3
  41. data/vendor/pygments-main/pygments/lexer.py +7 -6
  42. data/vendor/pygments-main/pygments/lexers/__init__.py +2 -3
  43. data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1 -2
  44. data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +1 -2
  45. data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +16 -12
  46. data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1 -2
  47. data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +1 -2
  48. data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +1 -2
  49. data/vendor/pygments-main/pygments/lexers/_mapping.py +6 -3
  50. data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1 -2
  51. data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +2 -3
  52. data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +439 -386
  53. data/vendor/pygments-main/pygments/lexers/_php_builtins.py +1 -2
  54. data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +1 -2
  55. data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +1 -2
  56. data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1 -2
  57. data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +1 -2
  58. data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +91 -55
  59. data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1 -2
  60. data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +1 -2
  61. data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +1 -2
  62. data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1 -2
  63. data/vendor/pygments-main/pygments/lexers/actionscript.py +7 -8
  64. data/vendor/pygments-main/pygments/lexers/agile.py +1 -2
  65. data/vendor/pygments-main/pygments/lexers/algebra.py +1 -2
  66. data/vendor/pygments-main/pygments/lexers/ambient.py +2 -3
  67. data/vendor/pygments-main/pygments/lexers/amdgpu.py +48 -0
  68. data/vendor/pygments-main/pygments/lexers/ampl.py +1 -2
  69. data/vendor/pygments-main/pygments/lexers/apl.py +1 -2
  70. data/vendor/pygments-main/pygments/lexers/archetype.py +2 -3
  71. data/vendor/pygments-main/pygments/lexers/arrow.py +1 -2
  72. data/vendor/pygments-main/pygments/lexers/asm.py +1 -2
  73. data/vendor/pygments-main/pygments/lexers/automation.py +7 -2
  74. data/vendor/pygments-main/pygments/lexers/bare.py +1 -2
  75. data/vendor/pygments-main/pygments/lexers/basic.py +3 -4
  76. data/vendor/pygments-main/pygments/lexers/bibtex.py +1 -2
  77. data/vendor/pygments-main/pygments/lexers/boa.py +4 -5
  78. data/vendor/pygments-main/pygments/lexers/business.py +3 -4
  79. data/vendor/pygments-main/pygments/lexers/c_cpp.py +2 -4
  80. data/vendor/pygments-main/pygments/lexers/c_like.py +1 -2
  81. data/vendor/pygments-main/pygments/lexers/capnproto.py +1 -2
  82. data/vendor/pygments-main/pygments/lexers/cddl.py +190 -0
  83. data/vendor/pygments-main/pygments/lexers/chapel.py +3 -4
  84. data/vendor/pygments-main/pygments/lexers/clean.py +1 -2
  85. data/vendor/pygments-main/pygments/lexers/compiled.py +1 -2
  86. data/vendor/pygments-main/pygments/lexers/configs.py +6 -5
  87. data/vendor/pygments-main/pygments/lexers/console.py +1 -2
  88. data/vendor/pygments-main/pygments/lexers/crystal.py +53 -79
  89. data/vendor/pygments-main/pygments/lexers/csound.py +1 -2
  90. data/vendor/pygments-main/pygments/lexers/css.py +11 -8
  91. data/vendor/pygments-main/pygments/lexers/d.py +3 -4
  92. data/vendor/pygments-main/pygments/lexers/dalvik.py +1 -2
  93. data/vendor/pygments-main/pygments/lexers/data.py +2 -3
  94. data/vendor/pygments-main/pygments/lexers/devicetree.py +1 -2
  95. data/vendor/pygments-main/pygments/lexers/diff.py +1 -2
  96. data/vendor/pygments-main/pygments/lexers/dotnet.py +7 -8
  97. data/vendor/pygments-main/pygments/lexers/dsls.py +3 -4
  98. data/vendor/pygments-main/pygments/lexers/dylan.py +1 -2
  99. data/vendor/pygments-main/pygments/lexers/ecl.py +4 -6
  100. data/vendor/pygments-main/pygments/lexers/eiffel.py +2 -3
  101. data/vendor/pygments-main/pygments/lexers/elm.py +1 -2
  102. data/vendor/pygments-main/pygments/lexers/email.py +1 -2
  103. data/vendor/pygments-main/pygments/lexers/erlang.py +1 -2
  104. data/vendor/pygments-main/pygments/lexers/esoteric.py +1 -2
  105. data/vendor/pygments-main/pygments/lexers/ezhil.py +1 -2
  106. data/vendor/pygments-main/pygments/lexers/factor.py +3 -4
  107. data/vendor/pygments-main/pygments/lexers/fantom.py +1 -2
  108. data/vendor/pygments-main/pygments/lexers/felix.py +1 -2
  109. data/vendor/pygments-main/pygments/lexers/floscript.py +1 -2
  110. data/vendor/pygments-main/pygments/lexers/forth.py +2 -3
  111. data/vendor/pygments-main/pygments/lexers/fortran.py +9 -7
  112. data/vendor/pygments-main/pygments/lexers/foxpro.py +1 -2
  113. data/vendor/pygments-main/pygments/lexers/freefem.py +1 -2
  114. data/vendor/pygments-main/pygments/lexers/functional.py +1 -2
  115. data/vendor/pygments-main/pygments/lexers/futhark.py +110 -0
  116. data/vendor/pygments-main/pygments/lexers/gdscript.py +1 -2
  117. data/vendor/pygments-main/pygments/lexers/go.py +2 -3
  118. data/vendor/pygments-main/pygments/lexers/grammar_notation.py +1 -2
  119. data/vendor/pygments-main/pygments/lexers/graph.py +1 -2
  120. data/vendor/pygments-main/pygments/lexers/graphics.py +3 -4
  121. data/vendor/pygments-main/pygments/lexers/graphviz.py +57 -0
  122. data/vendor/pygments-main/pygments/lexers/haskell.py +1 -2
  123. data/vendor/pygments-main/pygments/lexers/haxe.py +3 -4
  124. data/vendor/pygments-main/pygments/lexers/hdl.py +2 -6
  125. data/vendor/pygments-main/pygments/lexers/hexdump.py +1 -2
  126. data/vendor/pygments-main/pygments/lexers/html.py +7 -8
  127. data/vendor/pygments-main/pygments/lexers/idl.py +1 -2
  128. data/vendor/pygments-main/pygments/lexers/igor.py +1 -2
  129. data/vendor/pygments-main/pygments/lexers/inferno.py +1 -2
  130. data/vendor/pygments-main/pygments/lexers/installers.py +1 -2
  131. data/vendor/pygments-main/pygments/lexers/int_fiction.py +1 -2
  132. data/vendor/pygments-main/pygments/lexers/iolang.py +2 -3
  133. data/vendor/pygments-main/pygments/lexers/j.py +2 -3
  134. data/vendor/pygments-main/pygments/lexers/javascript.py +57 -61
  135. data/vendor/pygments-main/pygments/lexers/julia.py +1 -2
  136. data/vendor/pygments-main/pygments/lexers/jvm.py +174 -108
  137. data/vendor/pygments-main/pygments/lexers/lisp.py +7 -8
  138. data/vendor/pygments-main/pygments/lexers/make.py +3 -4
  139. data/vendor/pygments-main/pygments/lexers/markup.py +11 -14
  140. data/vendor/pygments-main/pygments/lexers/math.py +1 -2
  141. data/vendor/pygments-main/pygments/lexers/matlab.py +2644 -84
  142. data/vendor/pygments-main/pygments/lexers/mime.py +2 -3
  143. data/vendor/pygments-main/pygments/lexers/ml.py +7 -8
  144. data/vendor/pygments-main/pygments/lexers/modeling.py +1 -2
  145. data/vendor/pygments-main/pygments/lexers/modula2.py +3 -4
  146. data/vendor/pygments-main/pygments/lexers/monte.py +1 -2
  147. data/vendor/pygments-main/pygments/lexers/mosel.py +1 -2
  148. data/vendor/pygments-main/pygments/lexers/ncl.py +1 -2
  149. data/vendor/pygments-main/pygments/lexers/nimrod.py +1 -2
  150. data/vendor/pygments-main/pygments/lexers/nit.py +1 -2
  151. data/vendor/pygments-main/pygments/lexers/nix.py +1 -2
  152. data/vendor/pygments-main/pygments/lexers/oberon.py +1 -2
  153. data/vendor/pygments-main/pygments/lexers/objective.py +3 -4
  154. data/vendor/pygments-main/pygments/lexers/ooc.py +1 -2
  155. data/vendor/pygments-main/pygments/lexers/other.py +1 -2
  156. data/vendor/pygments-main/pygments/lexers/parasail.py +1 -2
  157. data/vendor/pygments-main/pygments/lexers/parsers.py +25 -26
  158. data/vendor/pygments-main/pygments/lexers/pascal.py +1 -2
  159. data/vendor/pygments-main/pygments/lexers/pawn.py +2 -5
  160. data/vendor/pygments-main/pygments/lexers/perl.py +1 -2
  161. data/vendor/pygments-main/pygments/lexers/php.py +3 -4
  162. data/vendor/pygments-main/pygments/lexers/pointless.py +1 -2
  163. data/vendor/pygments-main/pygments/lexers/pony.py +1 -2
  164. data/vendor/pygments-main/pygments/lexers/praat.py +1 -2
  165. data/vendor/pygments-main/pygments/lexers/prolog.py +3 -4
  166. data/vendor/pygments-main/pygments/lexers/promql.py +1 -2
  167. data/vendor/pygments-main/pygments/lexers/python.py +19 -12
  168. data/vendor/pygments-main/pygments/lexers/qvt.py +1 -2
  169. data/vendor/pygments-main/pygments/lexers/r.py +1 -2
  170. data/vendor/pygments-main/pygments/lexers/rdf.py +1 -2
  171. data/vendor/pygments-main/pygments/lexers/rebol.py +1 -2
  172. data/vendor/pygments-main/pygments/lexers/resource.py +1 -2
  173. data/vendor/pygments-main/pygments/lexers/ride.py +1 -2
  174. data/vendor/pygments-main/pygments/lexers/rnc.py +1 -2
  175. data/vendor/pygments-main/pygments/lexers/roboconf.py +1 -2
  176. data/vendor/pygments-main/pygments/lexers/robotframework.py +1 -2
  177. data/vendor/pygments-main/pygments/lexers/ruby.py +30 -24
  178. data/vendor/pygments-main/pygments/lexers/rust.py +1 -2
  179. data/vendor/pygments-main/pygments/lexers/sas.py +1 -2
  180. data/vendor/pygments-main/pygments/lexers/scdoc.py +1 -2
  181. data/vendor/pygments-main/pygments/lexers/scripting.py +5 -6
  182. data/vendor/pygments-main/pygments/lexers/sgf.py +1 -2
  183. data/vendor/pygments-main/pygments/lexers/shell.py +5 -10
  184. data/vendor/pygments-main/pygments/lexers/sieve.py +1 -2
  185. data/vendor/pygments-main/pygments/lexers/slash.py +1 -2
  186. data/vendor/pygments-main/pygments/lexers/smalltalk.py +1 -2
  187. data/vendor/pygments-main/pygments/lexers/smv.py +1 -2
  188. data/vendor/pygments-main/pygments/lexers/snobol.py +1 -2
  189. data/vendor/pygments-main/pygments/lexers/solidity.py +1 -2
  190. data/vendor/pygments-main/pygments/lexers/special.py +29 -28
  191. data/vendor/pygments-main/pygments/lexers/sql.py +8 -13
  192. data/vendor/pygments-main/pygments/lexers/stata.py +1 -2
  193. data/vendor/pygments-main/pygments/lexers/supercollider.py +3 -4
  194. data/vendor/pygments-main/pygments/lexers/tcl.py +1 -2
  195. data/vendor/pygments-main/pygments/lexers/templates.py +15 -16
  196. data/vendor/pygments-main/pygments/lexers/teraterm.py +1 -2
  197. data/vendor/pygments-main/pygments/lexers/testing.py +1 -2
  198. data/vendor/pygments-main/pygments/lexers/text.py +1 -2
  199. data/vendor/pygments-main/pygments/lexers/textedit.py +3 -4
  200. data/vendor/pygments-main/pygments/lexers/textfmts.py +1 -2
  201. data/vendor/pygments-main/pygments/lexers/theorem.py +7 -5
  202. data/vendor/pygments-main/pygments/lexers/tnt.py +1 -2
  203. data/vendor/pygments-main/pygments/lexers/trafficscript.py +1 -2
  204. data/vendor/pygments-main/pygments/lexers/typoscript.py +1 -2
  205. data/vendor/pygments-main/pygments/lexers/unicon.py +1 -2
  206. data/vendor/pygments-main/pygments/lexers/urbi.py +3 -4
  207. data/vendor/pygments-main/pygments/lexers/usd.py +1 -2
  208. data/vendor/pygments-main/pygments/lexers/varnish.py +2 -3
  209. data/vendor/pygments-main/pygments/lexers/verification.py +1 -2
  210. data/vendor/pygments-main/pygments/lexers/web.py +1 -2
  211. data/vendor/pygments-main/pygments/lexers/webidl.py +1 -2
  212. data/vendor/pygments-main/pygments/lexers/webmisc.py +5 -5
  213. data/vendor/pygments-main/pygments/lexers/whiley.py +1 -2
  214. data/vendor/pygments-main/pygments/lexers/x10.py +2 -3
  215. data/vendor/pygments-main/pygments/lexers/xorg.py +1 -2
  216. data/vendor/pygments-main/pygments/lexers/yang.py +1 -2
  217. data/vendor/pygments-main/pygments/lexers/zig.py +1 -2
  218. data/vendor/pygments-main/pygments/modeline.py +1 -2
  219. data/vendor/pygments-main/pygments/plugin.py +2 -3
  220. data/vendor/pygments-main/pygments/regexopt.py +1 -2
  221. data/vendor/pygments-main/pygments/scanner.py +1 -2
  222. data/vendor/pygments-main/pygments/sphinxext.py +1 -2
  223. data/vendor/pygments-main/pygments/style.py +3 -4
  224. data/vendor/pygments-main/pygments/styles/__init__.py +3 -2
  225. data/vendor/pygments-main/pygments/styles/abap.py +1 -2
  226. data/vendor/pygments-main/pygments/styles/algol.py +1 -2
  227. data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -2
  228. data/vendor/pygments-main/pygments/styles/arduino.py +1 -2
  229. data/vendor/pygments-main/pygments/styles/autumn.py +1 -2
  230. data/vendor/pygments-main/pygments/styles/borland.py +1 -2
  231. data/vendor/pygments-main/pygments/styles/bw.py +1 -2
  232. data/vendor/pygments-main/pygments/styles/colorful.py +1 -2
  233. data/vendor/pygments-main/pygments/styles/default.py +1 -2
  234. data/vendor/pygments-main/pygments/styles/emacs.py +1 -2
  235. data/vendor/pygments-main/pygments/styles/friendly.py +1 -2
  236. data/vendor/pygments-main/pygments/styles/fruity.py +1 -2
  237. data/vendor/pygments-main/pygments/styles/igor.py +1 -2
  238. data/vendor/pygments-main/pygments/styles/inkpot.py +1 -2
  239. data/vendor/pygments-main/pygments/styles/lovelace.py +1 -2
  240. data/vendor/pygments-main/pygments/styles/manni.py +1 -2
  241. data/vendor/pygments-main/pygments/styles/material.py +118 -0
  242. data/vendor/pygments-main/pygments/styles/monokai.py +1 -2
  243. data/vendor/pygments-main/pygments/styles/murphy.py +1 -2
  244. data/vendor/pygments-main/pygments/styles/native.py +1 -2
  245. data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -2
  246. data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -2
  247. data/vendor/pygments-main/pygments/styles/pastie.py +1 -2
  248. data/vendor/pygments-main/pygments/styles/perldoc.py +1 -2
  249. data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -2
  250. data/vendor/pygments-main/pygments/styles/rrt.py +1 -2
  251. data/vendor/pygments-main/pygments/styles/sas.py +1 -2
  252. data/vendor/pygments-main/pygments/styles/solarized.py +4 -2
  253. data/vendor/pygments-main/pygments/styles/stata_dark.py +1 -2
  254. data/vendor/pygments-main/pygments/styles/stata_light.py +1 -2
  255. data/vendor/pygments-main/pygments/styles/tango.py +1 -2
  256. data/vendor/pygments-main/pygments/styles/trac.py +1 -2
  257. data/vendor/pygments-main/pygments/styles/vim.py +1 -2
  258. data/vendor/pygments-main/pygments/styles/vs.py +1 -2
  259. data/vendor/pygments-main/pygments/styles/xcode.py +1 -2
  260. data/vendor/pygments-main/pygments/styles/zenburn.py +80 -0
  261. data/vendor/pygments-main/pygments/token.py +1 -2
  262. data/vendor/pygments-main/pygments/unistring.py +1 -2
  263. data/vendor/pygments-main/pygments/util.py +2 -5
  264. metadata +21 -14
  265. data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +0 -482
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 82a1b6e9549afec22e94b2690983b55a5a3029e986b3d7201c2c6558a2968bc5
4
- data.tar.gz: 63ac418bfb998653fc4472c1cfd3c8268a006b002754b1759bc11132889f3e2b
3
+ metadata.gz: a81b37936d77daa0478878031e065f4c4248ec09f8e5aad0955cb9d3906fdde2
4
+ data.tar.gz: f4eeaa4c16489986301798f0d760c924b8c5dbe600fe915b3d41607ead341287
5
5
  SHA512:
6
- metadata.gz: a54ab6bc824be2d4fcdd0c61e52d0838b55ac7cc5ed023f8392ff784fa79d3f1fc32b159c422b46cc91646a8d07853ce2d934fd03e8c06de8903901f45a589c9
7
- data.tar.gz: e3910502b53d5c3f6ad729bc558e1baffdbc8af8958fa8867e7489df10bbfd1d1e832f0791a90592418b6bf1c19ba3aa0289b7f043f81aabb071fc036fec29ad
6
+ metadata.gz: 764c90e3afefa3914a4c9dc21e0bef73f6ab94c87a30aa86e56e4080166a83f943bdd0058fc204ae878f7d2ccf7f23bc849f1363fce510f1062babe8aff66fb5
7
+ data.tar.gz: f90e47da1207df3ff7913f0acdee8ddd11438015c0664030908f42587bfd97ef67eedae6dcb0f668c2955c1022f3a8fe2127195b339618a4925b4632f0926710
@@ -5,6 +5,18 @@ on:
5
5
  tags-ignore: [ '**' ]
6
6
  pull_request:
7
7
  jobs:
8
+ rubocop:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - name: Checkout
12
+ uses: actions/checkout@v2
13
+ - name: Set up Ruby
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: '3.0'
17
+ bundler-cache: true
18
+ - name: Rubocop
19
+ run: bundle exec rubocop
8
20
  build:
9
21
  strategy:
10
22
  matrix:
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ Metrics/AbcSize:
2
+ Enabled: false
3
+ Metrics/BlockLength:
4
+ Enabled: false
5
+ Metrics/ClassLength:
6
+ Enabled: false
7
+ Metrics/CyclomaticComplexity:
8
+ Enabled: false
9
+ Layout/LineLength:
10
+ Max: 120
11
+ Metrics/MethodLength:
12
+ Enabled: false
13
+ Security/MarshalLoad:
14
+ Enabled: false
15
+ Style/StructInheritance:
16
+ Enabled: false
17
+ Style/Documentation:
18
+ Enabled: false
data/CHANGELOG.adoc CHANGED
@@ -5,6 +5,10 @@
5
5
  This document provides a high-level view of the changes to the {project-name} by release.
6
6
  For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
7
7
 
8
+ == 2.1.0 (2021-02-14) - @slonopotamus
9
+
10
+ * Update Pygments to 2.8.0
11
+
8
12
  == 2.0.0 (2021-01-08) - @slonopotamus
9
13
 
10
14
  * stop sending/receiving `ids` between Ruby and Python
data/Rakefile CHANGED
@@ -9,8 +9,6 @@ task default: :test
9
9
  # Packaging
10
10
  # ==========================================================
11
11
 
12
- GEMSPEC = eval(File.read('pygments.rb.gemspec'))
13
-
14
12
  require 'rubygems/package_task'
15
13
 
16
14
  # ==========================================================
@@ -36,7 +34,7 @@ end
36
34
 
37
35
  # Write all the lexers to a file for easy lookup
38
36
  task :lexers do
39
- sh 'ruby cache-lexers.rb'
37
+ sh 'ruby cache_lexers.rb'
40
38
  end
41
39
 
42
40
  task(:test).enhance([:lexers])
data/bench.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  require File.join(File.dirname(__FILE__), '/lib/pygments.rb')
4
4
  require 'benchmark'
5
5
 
6
- include Benchmark
7
6
  # number of iterations
8
7
  num = ARGV[0] ? ARGV[0].to_i : 10
9
8
 
@@ -17,7 +16,13 @@ puts 'Size: ' + code.bytesize.to_s + " bytes\n"
17
16
  puts 'Iterations: ' + num.to_s + "\n"
18
17
 
19
18
  Benchmark.bm(40) do |x|
20
- x.report('pygments popen ') { (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); } }
21
- x.report('pygments popen (process already started) ') { (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); } }
22
- x.report('pygments popen (process already started 2) ') { (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); } }
19
+ x.report('pygments popen ') do
20
+ (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); }
21
+ end
22
+ x.report('pygments popen (process already started) ') do
23
+ (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); }
24
+ end
25
+ x.report('pygments popen (process already started 2) ') do
26
+ (1..num).each { |_i|; Pygments.highlight(code, lexer: 'python'); }
27
+ end
23
28
  end
File without changes
@@ -30,7 +30,7 @@ module Pygments
30
30
  extnames = []
31
31
 
32
32
  extname = File.extname(filename)
33
- if m = extname.match(/\[(.+)\]/)
33
+ if (m = extname.match(/\[(.+)\]/))
34
34
  m[1].scan(/./).each do |s|
35
35
  extnames << extname.sub(m[0], s)
36
36
  end
@@ -13,23 +13,13 @@ end
13
13
  # Python process.
14
14
  module Pygments
15
15
  class Popen
16
- def popen4(argv)
17
- stdin, stdout, stderr, wait_thr = Open3.popen3(*argv, { close_others: true })
18
- while (pid = wait_thr.pid).nil? && wait_thr.alive?
19
- # For unknown reasons, wait_thr.pid is not immediately available on JRuby
20
- end
21
- [pid, stdin, stdout, stderr]
22
- end
23
-
24
16
  # Get things started by opening a pipe to mentos (the freshmaker), a
25
17
  # Python process that talks to the Pygments library. We'll talk back and
26
18
  # forth across this pipe.
27
- def start(pygments_path = File.expand_path('../../vendor/pygments-main', __dir__))
28
- begin
29
- @log = Logger.new(ENV['MENTOS_LOG'] || File::NULL)
30
- @log.level = Logger::INFO
31
- @log.datetime_format = '%Y-%m-%d %H:%M '
32
- end
19
+ def start(pygments_path = File.join(__dir__, '..', '..', 'vendor', 'pygments-main'))
20
+ @log = Logger.new(ENV['MENTOS_LOG'] || File::NULL)
21
+ @log.level = Logger::INFO
22
+ @log.datetime_format = '%Y-%m-%d %H:%M '
33
23
 
34
24
  ENV['PYGMENTS_PATH'] = pygments_path
35
25
 
@@ -38,7 +28,7 @@ module Pygments
38
28
 
39
29
  # A pipe to the mentos python process. #popen4 gives us
40
30
  # the pid and three IO objects to write and read.
41
- argv = [*python_binary, File.expand_path('mentos.py', __dir__)]
31
+ argv = [*python_binary, File.join(__dir__, 'mentos.py')]
42
32
  @pid, @in, @out, @err = popen4(argv)
43
33
  @in.binmode
44
34
  @out.binmode
@@ -53,29 +43,6 @@ module Pygments
53
43
  @python_bin = python_bin
54
44
  end
55
45
 
56
- # Detect a suitable Python binary to use.
57
- def find_python_binary
58
- if Gem.win_platform?
59
- return %w[py python3 python].first { |py| !which(py).nil? }
60
- end
61
-
62
- # On non-Windows platforms, we simply rely on shebang
63
- []
64
- end
65
-
66
- # Cross platform which command
67
- # from http://stackoverflow.com/a/5471032/284795
68
- def which(command)
69
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
70
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
71
- exts.each do |ext|
72
- path = File.join(dir, "#{command}#{ext}")
73
- return path if File.executable?(path) && !File.directory?(path)
74
- end
75
- end
76
- nil
77
- end
78
-
79
46
  # Stop the child process by issuing a kill -9.
80
47
  #
81
48
  # We then call waitpid() with the pid, which waits for that particular
@@ -88,13 +55,15 @@ module Pygments
88
55
  # Technically, kill() can also fail with EPERM or EINVAL (wherein
89
56
  # the signal isn't sent); but we have permissions, and
90
57
  # we're not doing anything invalid here.
58
+ # @param reason [String]
91
59
  def stop(reason)
92
60
  unless @pid.nil?
93
61
  @log.info "Killing pid: #{@pid}. Reason: #{reason}"
94
62
  begin
95
63
  Process.kill('KILL', @pid)
96
64
  Process.waitpid(@pid)
97
- rescue Errno::ESRCH, Errno::ECHILD
65
+ rescue Errno::ESRCH, Errno::ECHILD => e
66
+ @log.warn(e)
98
67
  end
99
68
  end
100
69
  @pid = nil
@@ -108,7 +77,7 @@ module Pygments
108
77
  # process and the pid has already been re-used) we'll want to raise
109
78
  # that as a more informative Mentos exception.
110
79
  #
111
- # Returns true if the child is alive.
80
+ # @return [Boolean] true if the child is alive.
112
81
  def alive?
113
82
  return true if defined?(@pid) && @pid && Process.kill(0, @pid)
114
83
 
@@ -121,7 +90,7 @@ module Pygments
121
90
 
122
91
  # Public: Get an array of available Pygments formatters
123
92
  #
124
- # Returns an array of formatters.
93
+ # @return [Array<String>] an array of formatters
125
94
  def formatters
126
95
  mentos(:get_all_formatters).each_with_object({}) do |(name, desc, aliases), hash|
127
96
  # Remove the long-winded and repetitive 'Formatter' suffix
@@ -134,23 +103,27 @@ module Pygments
134
103
  end
135
104
  end
136
105
 
137
- # Public: Get all lexers from a serialized array. This avoids needing to spawn
138
- # mentos when it's not really needed (e.g., one-off jobs, loading the Rails env, etc).
106
+ # Get all lexers from a serialized array.
107
+ # This avoids needing to spawn mentos when it's not really needed
108
+ # (e.g., one-off jobs, loading the Rails env, etc).
139
109
  #
140
110
  # Should be preferred to #lexers!
141
111
  #
142
- # Returns an array of lexers.
112
+ # @return [Array<String>] an array of lexers
143
113
  def lexers
144
- lexer_file = File.expand_path('../../lexers', __dir__)
145
- raw = File.open(lexer_file, 'rb').read
146
- Marshal.load(raw)
147
- rescue Errno::ENOENT
148
- raise MentosError, 'Error loading lexer file. Was it created and vendored?'
114
+ lexer_file = File.join(__dir__, '..', '..', 'lexers')
115
+ begin
116
+ File.open(lexer_file, 'rb') do |f|
117
+ Marshal.load(f)
118
+ end
119
+ rescue Errno::ENOENT
120
+ raise MentosError, %(Error loading #{lexer_file}. Was it created and vendored?)
121
+ end
149
122
  end
150
123
 
151
- # Public: Get back all available lexers from mentos itself
124
+ # Get back all available lexers from mentos itself
152
125
  #
153
- # Returns an array of lexers.
126
+ # @return [Array<String>] an array of lexers
154
127
  def lexers!
155
128
  mentos(:get_all_lexers).each_with_object({}) do |lxr, hash|
156
129
  name = lxr[0]
@@ -163,17 +136,17 @@ module Pygments
163
136
  end
164
137
  end
165
138
 
166
- # Public: Return an array of all available filters
139
+ # @return [Array<String>] an array of all available filters
167
140
  def filters
168
141
  mentos(:get_all_filters)
169
142
  end
170
143
 
171
- # Public: Return an array of all available styles
144
+ # @return [Array<String>] an array of all available styles
172
145
  def styles
173
146
  mentos(:get_all_styles)
174
147
  end
175
148
 
176
- # Public: Return css for highlighted code
149
+ # @return [String] css for highlighted code
177
150
  def css(klass = '', opts = {})
178
151
  if klass.is_a?(Hash)
179
152
  opts = klass
@@ -182,7 +155,7 @@ module Pygments
182
155
  mentos(:css, ['html', klass], opts)
183
156
  end
184
157
 
185
- # Public: Return the name of a lexer.
158
+ # @return [String, nil] the name of a lexer.
186
159
  def lexer_name_for(*args)
187
160
  # Pop off the last arg if it's a hash, which becomes our opts
188
161
  opts = if args.last.is_a?(Hash)
@@ -198,8 +171,9 @@ module Pygments
198
171
 
199
172
  # Public: Highlight code.
200
173
  #
201
- # Takes a first-position argument of the code to be highlighted, and a
202
- # second-position hash of various arguments specifying highlighting properties.
174
+ # Takes a first-position argument of the code to be highlighted,
175
+ # and a second-position hash of various arguments specifying
176
+ # highlighting properties.
203
177
  #
204
178
  # Returns the highlighted string
205
179
  # or nil when the request to the Python process timed out.
@@ -216,29 +190,63 @@ module Pygments
216
190
 
217
191
  # Get back the string from mentos and force encoding if we can
218
192
  str = mentos(:highlight, nil, opts, code)
219
- if str.respond_to?(:force_encoding)
220
- str.force_encoding(opts[:options][:outencoding])
221
- end
193
+ str.force_encoding(opts[:options][:outencoding]) if str.respond_to?(:force_encoding)
222
194
  str
223
195
  end
224
196
 
225
197
  private
226
198
 
227
- def with_watchdog(timeout_time, error_message)
199
+ # @param argv [Array<String>]
200
+ def popen4(argv)
201
+ stdin, stdout, stderr, wait_thr = Open3.popen3(*argv, { close_others: true })
202
+ while (pid = wait_thr.pid).nil? && wait_thr.alive?
203
+ # wait_thr.pid is not immediately available on JRuby. Why???
204
+ end
205
+ [pid, stdin, stdout, stderr]
206
+ end
207
+
208
+ # Detect a suitable Python binary to use.
209
+ def find_python_binary
210
+ return %w[py python3 python].first { |py| !which(py).nil? } if Gem.win_platform?
211
+
212
+ # On non-Windows platforms, we simply rely on shebang
213
+ []
214
+ end
215
+
216
+ # Cross platform which command
217
+ # from http://stackoverflow.com/a/5471032/284795
218
+ def which(command)
219
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
220
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
221
+ exts.each do |ext|
222
+ path = File.join(dir, "#{command}#{ext}")
223
+ return path if File.executable?(path) && !File.directory?(path)
224
+ end
225
+ end
226
+ nil
227
+ end
228
+
229
+ # @param timeout [Integer]
230
+ # @param error_message [String]
231
+ # @yield
232
+ def with_watchdog(timeout, error_message)
228
233
  state_mutex = Mutex.new
229
234
  state = :alive
230
235
  wd_cleanup = ConditionVariable.new
231
236
 
232
- watchdog = timeout_time > 0 ? Thread.new do
233
- state_mutex.synchronize do
234
- wd_cleanup.wait(state_mutex, timeout_time) if state != :finished
235
- if state != :finished
236
- @log.error error_message
237
- stop error_message
238
- state = :timeout
239
- end
240
- end
241
- end : nil
237
+ watchdog = if timeout.positive?
238
+ Thread.new do
239
+ state_mutex.synchronize do
240
+ wd_cleanup.wait(state_mutex, timeout) if state != :finished
241
+ if state != :finished
242
+ @log.error error_message
243
+ stop error_message
244
+ state = :timeout
245
+ end
246
+ end
247
+ end
248
+ end
249
+
242
250
  begin
243
251
  yield
244
252
  ensure
@@ -261,43 +269,16 @@ module Pygments
261
269
  # Open the pipe if necessary
262
270
  start unless alive?
263
271
 
264
- # Timeout requests that take too long.
265
- # Invalid MENTOS_TIMEOUT results in just using default.
266
- timeout_time = kwargs.delete(:timeout)
267
- if timeout_time.nil?
268
- timeout_time = begin
269
- Integer(ENV['MENTOS_TIMEOUT'])
270
- rescue TypeError
271
- 0
272
- end
273
- end
274
-
275
272
  # Add metadata to the header and generate it.
276
- bytesize = if code
277
- code.bytesize
278
- else
279
- 0
280
- end
281
-
282
- kwargs.freeze
283
- kwargs = kwargs.merge('bytes' => bytesize)
273
+ kwargs = kwargs.merge('bytes' => (code.nil? ? 0 : code.bytesize))
284
274
  out_header = JSON.generate(method: method, args: args, kwargs: kwargs)
285
275
 
286
276
  begin
287
- res = with_watchdog(timeout_time, "Timeout on a mentos #{method} call") do
288
- # Get the size of the header itself and write that.
289
- @in.write([out_header.bytesize].pack('N'))
290
- @log.info "Size out: #{out_header.bytesize}"
291
-
292
- # mentos is now waiting for the header, and, potentially, code.
293
- @in.write(out_header)
294
- @log.info "Out header: #{out_header}"
295
- @in.write(code) unless code.nil?
296
-
297
- @in.flush
277
+ timeout = get_timeout(kwargs.delete(:timeout))
278
+ res = with_watchdog(timeout, "Timeout on a mentos #{method} call") do
279
+ write_header(out_header, code)
298
280
 
299
281
  # mentos will now return data to us. First it sends the header.
300
-
301
282
  header_len_bytes = @out.read(4)
302
283
  if header_len_bytes.nil?
303
284
  raise Errno::EPIPE, %(Failed to read response from Python process on a mentos #{method} call)
@@ -331,49 +312,70 @@ module Pygments
331
312
  end
332
313
  end
333
314
 
315
+ # @param header [String]
316
+ # @param code [String, nil]
317
+ def write_header(header, code)
318
+ # Get the size of the header itself and write that.
319
+ @in.write([header.bytesize].pack('N'))
320
+ @log.info "Size out: #{header.bytesize}"
321
+
322
+ # mentos is now waiting for the header, and, potentially, code.
323
+ @in.write(header)
324
+ @log.info "Out header: #{header}"
325
+ @in.write(code) unless code.nil?
326
+ @in.flush
327
+ end
328
+
329
+ # @param timeout [Integer, nil]
330
+ # @return [Integer]
331
+ def get_timeout(timeout)
332
+ return timeout unless timeout.nil?
333
+
334
+ begin
335
+ Integer(ENV['MENTOS_TIMEOUT'])
336
+ rescue TypeError
337
+ 0
338
+ end
339
+ end
340
+
334
341
  # Based on the header we receive, determine if we need
335
342
  # to read more bytes, and read those bytes if necessary.
336
343
  #
337
- # Returns a result - either highlighted text or metadata.
344
+ # @param header [String, nil]
345
+ # @return [String, nil] either highlighted text or metadata.
338
346
  def handle_header_and_return(header)
339
- if header
340
- @log.info "In header: #{header}"
341
- header = header_to_json(header)
342
- bytes = header[:bytes]
347
+ raise MentosError, 'No header received back.' if header.nil?
343
348
 
344
- # Read more bytes (the actual response body)
345
- res = @out.read(bytes.to_i)
349
+ @log.info "In header: #{header}"
350
+ header = header_to_json(header)
351
+ bytes = header[:bytes]
346
352
 
347
- if header[:method] == 'highlight'
348
- # Make sure we have a result back; else consider this an error.
349
- raise MentosError, 'No highlight result back from mentos.' if res.nil?
350
- end
353
+ # Read more bytes (the actual response body)
354
+ res = @out.read(bytes.to_i)
351
355
 
352
- res
353
- else
354
- raise MentosError, 'No header received back.'
356
+ if header[:method] == 'highlight'
357
+ # Make sure we have a result back; else consider this an error.
358
+ raise MentosError, 'No highlight result back from mentos.' if res.nil?
355
359
  end
360
+
361
+ res
356
362
  end
357
363
 
358
- # Return the final result for the API. Return Ruby objects for the methods that
359
- # want them, text otherwise.
364
+ # @return Ruby objects for the methods that want them, text otherwise.
360
365
  def return_result(res, method)
361
- unless method == :lexer_name_for || method == :highlight || method == :css
362
- res = JSON.parse(res, symbolize_names: true)
363
- end
366
+ res = JSON.parse(res, symbolize_names: true) unless %i[lexer_name_for highlight css].include?(method)
364
367
  res = res.rstrip if res.class == String
365
368
  res
366
369
  end
367
370
 
368
371
  # Convert a text header into JSON for easy access.
372
+ # @param header [String]
373
+ # @return [JSON]
369
374
  def header_to_json(header)
370
- header = JSON.parse(header, symbolize_names: true)
375
+ json = JSON.parse(header, symbolize_names: true)
376
+ raise MentosError, json[:error] unless json[:error].nil?
371
377
 
372
- if header[:error]
373
- raise MentosError, header[:error]
374
- else
375
- header
376
- end
378
+ json
377
379
  end
378
380
  end
379
381
  end