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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +12 -0
- data/.rubocop.yml +18 -0
- data/CHANGELOG.adoc +4 -0
- data/Rakefile +1 -3
- data/bench.rb +9 -4
- data/{cache-lexers.rb → cache_lexers.rb} +0 -0
- data/lib/pygments/lexer.rb +1 -1
- data/lib/pygments/popen.rb +129 -127
- data/lib/pygments/version.rb +1 -1
- data/pygments.rb.gemspec +1 -1
- data/test/test_pygments.rb +6 -8
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/AUTHORS +5 -0
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/INSTALLER +0 -0
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/LICENSE +1 -1
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/METADATA +8 -9
- data/vendor/pygments-main/Pygments-2.8.0.dist-info/RECORD +494 -0
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/REQUESTED +0 -0
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/WHEEL +0 -0
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/entry_points.txt +0 -0
- data/vendor/pygments-main/{Pygments-2.7.3.dist-info → Pygments-2.8.0.dist-info}/top_level.txt +0 -0
- data/vendor/pygments-main/pygments/__init__.py +2 -3
- data/vendor/pygments-main/pygments/__main__.py +1 -2
- data/vendor/pygments-main/pygments/cmdline.py +179 -159
- data/vendor/pygments-main/pygments/console.py +1 -2
- data/vendor/pygments-main/pygments/filter.py +1 -2
- data/vendor/pygments-main/pygments/filters/__init__.py +1 -2
- data/vendor/pygments-main/pygments/formatter.py +1 -2
- data/vendor/pygments-main/pygments/formatters/__init__.py +2 -3
- data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -2
- data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -2
- data/vendor/pygments-main/pygments/formatters/html.py +33 -18
- data/vendor/pygments-main/pygments/formatters/img.py +24 -10
- data/vendor/pygments-main/pygments/formatters/irc.py +1 -2
- data/vendor/pygments-main/pygments/formatters/latex.py +8 -9
- data/vendor/pygments-main/pygments/formatters/other.py +7 -10
- data/vendor/pygments-main/pygments/formatters/rtf.py +1 -2
- data/vendor/pygments-main/pygments/formatters/svg.py +5 -4
- data/vendor/pygments-main/pygments/formatters/terminal.py +1 -2
- data/vendor/pygments-main/pygments/formatters/terminal256.py +24 -3
- data/vendor/pygments-main/pygments/lexer.py +7 -6
- data/vendor/pygments-main/pygments/lexers/__init__.py +2 -3
- data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +16 -12
- data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_mapping.py +6 -3
- data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +2 -3
- data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +439 -386
- data/vendor/pygments-main/pygments/lexers/_php_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +91 -55
- data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1 -2
- data/vendor/pygments-main/pygments/lexers/actionscript.py +7 -8
- data/vendor/pygments-main/pygments/lexers/agile.py +1 -2
- data/vendor/pygments-main/pygments/lexers/algebra.py +1 -2
- data/vendor/pygments-main/pygments/lexers/ambient.py +2 -3
- data/vendor/pygments-main/pygments/lexers/amdgpu.py +48 -0
- data/vendor/pygments-main/pygments/lexers/ampl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/apl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/archetype.py +2 -3
- data/vendor/pygments-main/pygments/lexers/arrow.py +1 -2
- data/vendor/pygments-main/pygments/lexers/asm.py +1 -2
- data/vendor/pygments-main/pygments/lexers/automation.py +7 -2
- data/vendor/pygments-main/pygments/lexers/bare.py +1 -2
- data/vendor/pygments-main/pygments/lexers/basic.py +3 -4
- data/vendor/pygments-main/pygments/lexers/bibtex.py +1 -2
- data/vendor/pygments-main/pygments/lexers/boa.py +4 -5
- data/vendor/pygments-main/pygments/lexers/business.py +3 -4
- data/vendor/pygments-main/pygments/lexers/c_cpp.py +2 -4
- data/vendor/pygments-main/pygments/lexers/c_like.py +1 -2
- data/vendor/pygments-main/pygments/lexers/capnproto.py +1 -2
- data/vendor/pygments-main/pygments/lexers/cddl.py +190 -0
- data/vendor/pygments-main/pygments/lexers/chapel.py +3 -4
- data/vendor/pygments-main/pygments/lexers/clean.py +1 -2
- data/vendor/pygments-main/pygments/lexers/compiled.py +1 -2
- data/vendor/pygments-main/pygments/lexers/configs.py +6 -5
- data/vendor/pygments-main/pygments/lexers/console.py +1 -2
- data/vendor/pygments-main/pygments/lexers/crystal.py +53 -79
- data/vendor/pygments-main/pygments/lexers/csound.py +1 -2
- data/vendor/pygments-main/pygments/lexers/css.py +11 -8
- data/vendor/pygments-main/pygments/lexers/d.py +3 -4
- data/vendor/pygments-main/pygments/lexers/dalvik.py +1 -2
- data/vendor/pygments-main/pygments/lexers/data.py +2 -3
- data/vendor/pygments-main/pygments/lexers/devicetree.py +1 -2
- data/vendor/pygments-main/pygments/lexers/diff.py +1 -2
- data/vendor/pygments-main/pygments/lexers/dotnet.py +7 -8
- data/vendor/pygments-main/pygments/lexers/dsls.py +3 -4
- data/vendor/pygments-main/pygments/lexers/dylan.py +1 -2
- data/vendor/pygments-main/pygments/lexers/ecl.py +4 -6
- data/vendor/pygments-main/pygments/lexers/eiffel.py +2 -3
- data/vendor/pygments-main/pygments/lexers/elm.py +1 -2
- data/vendor/pygments-main/pygments/lexers/email.py +1 -2
- data/vendor/pygments-main/pygments/lexers/erlang.py +1 -2
- data/vendor/pygments-main/pygments/lexers/esoteric.py +1 -2
- data/vendor/pygments-main/pygments/lexers/ezhil.py +1 -2
- data/vendor/pygments-main/pygments/lexers/factor.py +3 -4
- data/vendor/pygments-main/pygments/lexers/fantom.py +1 -2
- data/vendor/pygments-main/pygments/lexers/felix.py +1 -2
- data/vendor/pygments-main/pygments/lexers/floscript.py +1 -2
- data/vendor/pygments-main/pygments/lexers/forth.py +2 -3
- data/vendor/pygments-main/pygments/lexers/fortran.py +9 -7
- data/vendor/pygments-main/pygments/lexers/foxpro.py +1 -2
- data/vendor/pygments-main/pygments/lexers/freefem.py +1 -2
- data/vendor/pygments-main/pygments/lexers/functional.py +1 -2
- data/vendor/pygments-main/pygments/lexers/futhark.py +110 -0
- data/vendor/pygments-main/pygments/lexers/gdscript.py +1 -2
- data/vendor/pygments-main/pygments/lexers/go.py +2 -3
- data/vendor/pygments-main/pygments/lexers/grammar_notation.py +1 -2
- data/vendor/pygments-main/pygments/lexers/graph.py +1 -2
- data/vendor/pygments-main/pygments/lexers/graphics.py +3 -4
- data/vendor/pygments-main/pygments/lexers/graphviz.py +57 -0
- data/vendor/pygments-main/pygments/lexers/haskell.py +1 -2
- data/vendor/pygments-main/pygments/lexers/haxe.py +3 -4
- data/vendor/pygments-main/pygments/lexers/hdl.py +2 -6
- data/vendor/pygments-main/pygments/lexers/hexdump.py +1 -2
- data/vendor/pygments-main/pygments/lexers/html.py +7 -8
- data/vendor/pygments-main/pygments/lexers/idl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/igor.py +1 -2
- data/vendor/pygments-main/pygments/lexers/inferno.py +1 -2
- data/vendor/pygments-main/pygments/lexers/installers.py +1 -2
- data/vendor/pygments-main/pygments/lexers/int_fiction.py +1 -2
- data/vendor/pygments-main/pygments/lexers/iolang.py +2 -3
- data/vendor/pygments-main/pygments/lexers/j.py +2 -3
- data/vendor/pygments-main/pygments/lexers/javascript.py +57 -61
- data/vendor/pygments-main/pygments/lexers/julia.py +1 -2
- data/vendor/pygments-main/pygments/lexers/jvm.py +174 -108
- data/vendor/pygments-main/pygments/lexers/lisp.py +7 -8
- data/vendor/pygments-main/pygments/lexers/make.py +3 -4
- data/vendor/pygments-main/pygments/lexers/markup.py +11 -14
- data/vendor/pygments-main/pygments/lexers/math.py +1 -2
- data/vendor/pygments-main/pygments/lexers/matlab.py +2644 -84
- data/vendor/pygments-main/pygments/lexers/mime.py +2 -3
- data/vendor/pygments-main/pygments/lexers/ml.py +7 -8
- data/vendor/pygments-main/pygments/lexers/modeling.py +1 -2
- data/vendor/pygments-main/pygments/lexers/modula2.py +3 -4
- data/vendor/pygments-main/pygments/lexers/monte.py +1 -2
- data/vendor/pygments-main/pygments/lexers/mosel.py +1 -2
- data/vendor/pygments-main/pygments/lexers/ncl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/nimrod.py +1 -2
- data/vendor/pygments-main/pygments/lexers/nit.py +1 -2
- data/vendor/pygments-main/pygments/lexers/nix.py +1 -2
- data/vendor/pygments-main/pygments/lexers/oberon.py +1 -2
- data/vendor/pygments-main/pygments/lexers/objective.py +3 -4
- data/vendor/pygments-main/pygments/lexers/ooc.py +1 -2
- data/vendor/pygments-main/pygments/lexers/other.py +1 -2
- data/vendor/pygments-main/pygments/lexers/parasail.py +1 -2
- data/vendor/pygments-main/pygments/lexers/parsers.py +25 -26
- data/vendor/pygments-main/pygments/lexers/pascal.py +1 -2
- data/vendor/pygments-main/pygments/lexers/pawn.py +2 -5
- data/vendor/pygments-main/pygments/lexers/perl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/php.py +3 -4
- data/vendor/pygments-main/pygments/lexers/pointless.py +1 -2
- data/vendor/pygments-main/pygments/lexers/pony.py +1 -2
- data/vendor/pygments-main/pygments/lexers/praat.py +1 -2
- data/vendor/pygments-main/pygments/lexers/prolog.py +3 -4
- data/vendor/pygments-main/pygments/lexers/promql.py +1 -2
- data/vendor/pygments-main/pygments/lexers/python.py +19 -12
- data/vendor/pygments-main/pygments/lexers/qvt.py +1 -2
- data/vendor/pygments-main/pygments/lexers/r.py +1 -2
- data/vendor/pygments-main/pygments/lexers/rdf.py +1 -2
- data/vendor/pygments-main/pygments/lexers/rebol.py +1 -2
- data/vendor/pygments-main/pygments/lexers/resource.py +1 -2
- data/vendor/pygments-main/pygments/lexers/ride.py +1 -2
- data/vendor/pygments-main/pygments/lexers/rnc.py +1 -2
- data/vendor/pygments-main/pygments/lexers/roboconf.py +1 -2
- data/vendor/pygments-main/pygments/lexers/robotframework.py +1 -2
- data/vendor/pygments-main/pygments/lexers/ruby.py +30 -24
- data/vendor/pygments-main/pygments/lexers/rust.py +1 -2
- data/vendor/pygments-main/pygments/lexers/sas.py +1 -2
- data/vendor/pygments-main/pygments/lexers/scdoc.py +1 -2
- data/vendor/pygments-main/pygments/lexers/scripting.py +5 -6
- data/vendor/pygments-main/pygments/lexers/sgf.py +1 -2
- data/vendor/pygments-main/pygments/lexers/shell.py +5 -10
- data/vendor/pygments-main/pygments/lexers/sieve.py +1 -2
- data/vendor/pygments-main/pygments/lexers/slash.py +1 -2
- data/vendor/pygments-main/pygments/lexers/smalltalk.py +1 -2
- data/vendor/pygments-main/pygments/lexers/smv.py +1 -2
- data/vendor/pygments-main/pygments/lexers/snobol.py +1 -2
- data/vendor/pygments-main/pygments/lexers/solidity.py +1 -2
- data/vendor/pygments-main/pygments/lexers/special.py +29 -28
- data/vendor/pygments-main/pygments/lexers/sql.py +8 -13
- data/vendor/pygments-main/pygments/lexers/stata.py +1 -2
- data/vendor/pygments-main/pygments/lexers/supercollider.py +3 -4
- data/vendor/pygments-main/pygments/lexers/tcl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/templates.py +15 -16
- data/vendor/pygments-main/pygments/lexers/teraterm.py +1 -2
- data/vendor/pygments-main/pygments/lexers/testing.py +1 -2
- data/vendor/pygments-main/pygments/lexers/text.py +1 -2
- data/vendor/pygments-main/pygments/lexers/textedit.py +3 -4
- data/vendor/pygments-main/pygments/lexers/textfmts.py +1 -2
- data/vendor/pygments-main/pygments/lexers/theorem.py +7 -5
- data/vendor/pygments-main/pygments/lexers/tnt.py +1 -2
- data/vendor/pygments-main/pygments/lexers/trafficscript.py +1 -2
- data/vendor/pygments-main/pygments/lexers/typoscript.py +1 -2
- data/vendor/pygments-main/pygments/lexers/unicon.py +1 -2
- data/vendor/pygments-main/pygments/lexers/urbi.py +3 -4
- data/vendor/pygments-main/pygments/lexers/usd.py +1 -2
- data/vendor/pygments-main/pygments/lexers/varnish.py +2 -3
- data/vendor/pygments-main/pygments/lexers/verification.py +1 -2
- data/vendor/pygments-main/pygments/lexers/web.py +1 -2
- data/vendor/pygments-main/pygments/lexers/webidl.py +1 -2
- data/vendor/pygments-main/pygments/lexers/webmisc.py +5 -5
- data/vendor/pygments-main/pygments/lexers/whiley.py +1 -2
- data/vendor/pygments-main/pygments/lexers/x10.py +2 -3
- data/vendor/pygments-main/pygments/lexers/xorg.py +1 -2
- data/vendor/pygments-main/pygments/lexers/yang.py +1 -2
- data/vendor/pygments-main/pygments/lexers/zig.py +1 -2
- data/vendor/pygments-main/pygments/modeline.py +1 -2
- data/vendor/pygments-main/pygments/plugin.py +2 -3
- data/vendor/pygments-main/pygments/regexopt.py +1 -2
- data/vendor/pygments-main/pygments/scanner.py +1 -2
- data/vendor/pygments-main/pygments/sphinxext.py +1 -2
- data/vendor/pygments-main/pygments/style.py +3 -4
- data/vendor/pygments-main/pygments/styles/__init__.py +3 -2
- data/vendor/pygments-main/pygments/styles/abap.py +1 -2
- data/vendor/pygments-main/pygments/styles/algol.py +1 -2
- data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -2
- data/vendor/pygments-main/pygments/styles/arduino.py +1 -2
- data/vendor/pygments-main/pygments/styles/autumn.py +1 -2
- data/vendor/pygments-main/pygments/styles/borland.py +1 -2
- data/vendor/pygments-main/pygments/styles/bw.py +1 -2
- data/vendor/pygments-main/pygments/styles/colorful.py +1 -2
- data/vendor/pygments-main/pygments/styles/default.py +1 -2
- data/vendor/pygments-main/pygments/styles/emacs.py +1 -2
- data/vendor/pygments-main/pygments/styles/friendly.py +1 -2
- data/vendor/pygments-main/pygments/styles/fruity.py +1 -2
- data/vendor/pygments-main/pygments/styles/igor.py +1 -2
- data/vendor/pygments-main/pygments/styles/inkpot.py +1 -2
- data/vendor/pygments-main/pygments/styles/lovelace.py +1 -2
- data/vendor/pygments-main/pygments/styles/manni.py +1 -2
- data/vendor/pygments-main/pygments/styles/material.py +118 -0
- data/vendor/pygments-main/pygments/styles/monokai.py +1 -2
- data/vendor/pygments-main/pygments/styles/murphy.py +1 -2
- data/vendor/pygments-main/pygments/styles/native.py +1 -2
- data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -2
- data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -2
- data/vendor/pygments-main/pygments/styles/pastie.py +1 -2
- data/vendor/pygments-main/pygments/styles/perldoc.py +1 -2
- data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -2
- data/vendor/pygments-main/pygments/styles/rrt.py +1 -2
- data/vendor/pygments-main/pygments/styles/sas.py +1 -2
- data/vendor/pygments-main/pygments/styles/solarized.py +4 -2
- data/vendor/pygments-main/pygments/styles/stata_dark.py +1 -2
- data/vendor/pygments-main/pygments/styles/stata_light.py +1 -2
- data/vendor/pygments-main/pygments/styles/tango.py +1 -2
- data/vendor/pygments-main/pygments/styles/trac.py +1 -2
- data/vendor/pygments-main/pygments/styles/vim.py +1 -2
- data/vendor/pygments-main/pygments/styles/vs.py +1 -2
- data/vendor/pygments-main/pygments/styles/xcode.py +1 -2
- data/vendor/pygments-main/pygments/styles/zenburn.py +80 -0
- data/vendor/pygments-main/pygments/token.py +1 -2
- data/vendor/pygments-main/pygments/unistring.py +1 -2
- data/vendor/pygments-main/pygments/util.py +2 -5
- metadata +21 -14
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a81b37936d77daa0478878031e065f4c4248ec09f8e5aad0955cb9d3906fdde2
|
4
|
+
data.tar.gz: f4eeaa4c16489986301798f0d760c924b8c5dbe600fe915b3d41607ead341287
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 764c90e3afefa3914a4c9dc21e0bef73f6ab94c87a30aa86e56e4080166a83f943bdd0058fc204ae878f7d2ccf7f23bc849f1363fce510f1062babe8aff66fb5
|
7
|
+
data.tar.gz: f90e47da1207df3ff7913f0acdee8ddd11438015c0664030908f42587bfd97ef67eedae6dcb0f668c2955c1022f3a8fe2127195b339618a4925b4632f0926710
|
data/.github/workflows/ci.yml
CHANGED
@@ -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
|
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 ')
|
21
|
-
|
22
|
-
|
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
|
data/lib/pygments/lexer.rb
CHANGED
data/lib/pygments/popen.rb
CHANGED
@@ -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.
|
28
|
-
|
29
|
-
|
30
|
-
|
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.
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
138
|
-
# mentos when it's not really needed
|
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
|
-
#
|
112
|
+
# @return [Array<String>] an array of lexers
|
143
113
|
def lexers
|
144
|
-
lexer_file = File.
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|
-
#
|
124
|
+
# Get back all available lexers from mentos itself
|
152
125
|
#
|
153
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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,
|
202
|
-
# second-position hash of various arguments specifying
|
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
|
-
|
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 =
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
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
|
-
|
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
|
-
|
288
|
-
|
289
|
-
|
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
|
-
#
|
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
|
-
|
345
|
-
|
349
|
+
@log.info "In header: #{header}"
|
350
|
+
header = header_to_json(header)
|
351
|
+
bytes = header[:bytes]
|
346
352
|
|
347
|
-
|
348
|
-
|
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
|
-
|
353
|
-
|
354
|
-
raise MentosError, 'No
|
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
|
-
#
|
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
|
-
|
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
|
-
|
375
|
+
json = JSON.parse(header, symbolize_names: true)
|
376
|
+
raise MentosError, json[:error] unless json[:error].nil?
|
371
377
|
|
372
|
-
|
373
|
-
raise MentosError, header[:error]
|
374
|
-
else
|
375
|
-
header
|
376
|
-
end
|
378
|
+
json
|
377
379
|
end
|
378
380
|
end
|
379
381
|
end
|