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.
- checksums.yaml +5 -5
- data/.github/dependabot.yml +13 -0
- data/.github/workflows/ci.yml +28 -0
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +5 -6
- data/CHANGELOG.adoc +119 -0
- data/Gemfile +3 -1
- data/LICENSE +1 -1
- data/README.adoc +161 -0
- data/Rakefile +10 -21
- data/bench.rb +8 -7
- data/cache-lexers.rb +3 -2
- data/lib/pygments.rb +10 -11
- data/lib/pygments/lexer.rb +5 -5
- data/lib/pygments/mentos.py +23 -66
- data/lib/pygments/popen.rb +152 -204
- data/lib/pygments/version.rb +2 -2
- data/pygments.rb.gemspec +11 -9
- data/test/test_pygments.rb +51 -84
- data/vendor/pygments-main/{AUTHORS → Pygments-2.7.3.dist-info/AUTHORS} +21 -3
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/INSTALLER +1 -0
- data/vendor/pygments-main/{LICENSE → Pygments-2.7.3.dist-info/LICENSE} +1 -1
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/METADATA +49 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/RECORD +482 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/REQUESTED +0 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/WHEEL +5 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/entry_points.txt +3 -0
- data/vendor/pygments-main/Pygments-2.7.3.dist-info/top_level.txt +1 -0
- data/vendor/pygments-main/bin/pygmentize +8 -0
- data/vendor/pygments-main/pygments/__init__.py +6 -11
- data/vendor/pygments-main/pygments/__main__.py +18 -0
- data/vendor/pygments-main/pygments/cmdline.py +38 -29
- data/vendor/pygments-main/pygments/console.py +6 -9
- data/vendor/pygments-main/pygments/filter.py +4 -6
- data/vendor/pygments-main/pygments/filters/__init__.py +609 -21
- data/vendor/pygments-main/pygments/formatter.py +4 -4
- data/vendor/pygments-main/pygments/formatters/__init__.py +9 -8
- data/vendor/pygments-main/pygments/formatters/_mapping.py +1 -3
- data/vendor/pygments-main/pygments/formatters/bbcode.py +1 -1
- data/vendor/pygments-main/pygments/formatters/html.py +223 -135
- data/vendor/pygments-main/pygments/formatters/img.py +68 -41
- data/vendor/pygments-main/pygments/formatters/irc.py +39 -39
- data/vendor/pygments-main/pygments/formatters/latex.py +56 -26
- data/vendor/pygments-main/pygments/formatters/other.py +12 -8
- data/vendor/pygments-main/pygments/formatters/rtf.py +29 -29
- data/vendor/pygments-main/pygments/formatters/svg.py +38 -4
- data/vendor/pygments-main/pygments/formatters/terminal.py +25 -31
- data/vendor/pygments-main/pygments/formatters/terminal256.py +22 -12
- data/vendor/pygments-main/pygments/lexer.py +41 -39
- data/vendor/pygments-main/pygments/lexers/__init__.py +342 -0
- data/vendor/pygments-main/pygments/lexers/_asy_builtins.py +1645 -0
- data/vendor/pygments-main/pygments/lexers/_cl_builtins.py +232 -0
- data/vendor/pygments-main/pygments/lexers/_cocoa_builtins.py +71 -0
- data/vendor/pygments-main/pygments/lexers/_csound_builtins.py +1725 -0
- data/vendor/pygments-main/pygments/lexers/_lasso_builtins.py +5327 -0
- data/vendor/pygments-main/pygments/lexers/_lua_builtins.py +293 -0
- data/vendor/pygments-main/pygments/lexers/_mapping.py +551 -0
- data/vendor/pygments-main/pygments/lexers/_mql_builtins.py +1172 -0
- data/vendor/pygments-main/pygments/lexers/_mysql_builtins.py +1282 -0
- data/vendor/pygments-main/pygments/lexers/_openedge_builtins.py +2547 -0
- data/vendor/pygments-main/pygments/lexers/_php_builtins.py +4753 -0
- data/vendor/pygments-main/pygments/lexers/_postgres_builtins.py +678 -0
- data/vendor/pygments-main/pygments/lexers/_scilab_builtins.py +3094 -0
- data/vendor/pygments-main/pygments/lexers/_sourcemod_builtins.py +1161 -0
- data/vendor/pygments-main/pygments/lexers/_stan_builtins.py +558 -0
- data/vendor/pygments-main/pygments/lexers/_stata_builtins.py +421 -0
- data/vendor/pygments-main/pygments/lexers/_tsql_builtins.py +1004 -0
- data/vendor/pygments-main/pygments/lexers/_usd_builtins.py +113 -0
- data/vendor/pygments-main/pygments/lexers/_vbscript_builtins.py +280 -0
- data/vendor/pygments-main/pygments/lexers/_vim_builtins.py +1939 -0
- data/vendor/pygments-main/pygments/lexers/actionscript.py +245 -0
- data/vendor/pygments-main/pygments/lexers/agile.py +24 -0
- data/vendor/pygments-main/pygments/lexers/algebra.py +240 -0
- data/vendor/pygments-main/pygments/lexers/ambient.py +76 -0
- data/vendor/pygments-main/pygments/lexers/ampl.py +87 -0
- data/vendor/pygments-main/pygments/lexers/apl.py +101 -0
- data/vendor/pygments-main/pygments/lexers/archetype.py +318 -0
- data/vendor/pygments-main/pygments/lexers/arrow.py +117 -0
- data/vendor/pygments-main/pygments/lexers/asm.py +1005 -0
- data/vendor/pygments-main/pygments/lexers/automation.py +374 -0
- data/vendor/pygments-main/pygments/lexers/bare.py +104 -0
- data/vendor/pygments-main/pygments/lexers/basic.py +662 -0
- data/vendor/pygments-main/pygments/lexers/bibtex.py +160 -0
- data/vendor/pygments-main/pygments/lexers/boa.py +102 -0
- data/vendor/pygments-main/pygments/lexers/business.py +627 -0
- data/vendor/pygments-main/pygments/lexers/c_cpp.py +344 -0
- data/vendor/pygments-main/pygments/lexers/c_like.py +566 -0
- data/vendor/pygments-main/pygments/lexers/capnproto.py +78 -0
- data/vendor/pygments-main/pygments/lexers/chapel.py +112 -0
- data/vendor/pygments-main/pygments/lexers/clean.py +179 -0
- data/vendor/pygments-main/pygments/lexers/compiled.py +34 -0
- data/vendor/pygments-main/pygments/lexers/configs.py +984 -0
- data/vendor/pygments-main/pygments/lexers/console.py +114 -0
- data/vendor/pygments-main/pygments/lexers/crystal.py +392 -0
- data/vendor/pygments-main/pygments/lexers/csound.py +467 -0
- data/vendor/pygments-main/pygments/lexers/css.py +691 -0
- data/vendor/pygments-main/pygments/lexers/d.py +256 -0
- data/vendor/pygments-main/pygments/lexers/dalvik.py +125 -0
- data/vendor/pygments-main/pygments/lexers/data.py +698 -0
- data/vendor/pygments-main/pygments/lexers/devicetree.py +109 -0
- data/vendor/pygments-main/pygments/lexers/diff.py +165 -0
- data/vendor/pygments-main/pygments/lexers/dotnet.py +707 -0
- data/vendor/pygments-main/pygments/lexers/dsls.py +960 -0
- data/vendor/pygments-main/pygments/lexers/dylan.py +287 -0
- data/vendor/pygments-main/pygments/lexers/ecl.py +139 -0
- data/vendor/pygments-main/pygments/lexers/eiffel.py +65 -0
- data/vendor/pygments-main/pygments/lexers/elm.py +121 -0
- data/vendor/pygments-main/pygments/lexers/email.py +151 -0
- data/vendor/pygments-main/pygments/lexers/erlang.py +530 -0
- data/vendor/pygments-main/pygments/lexers/esoteric.py +304 -0
- data/vendor/pygments-main/pygments/lexers/ezhil.py +77 -0
- data/vendor/pygments-main/pygments/lexers/factor.py +344 -0
- data/vendor/pygments-main/pygments/lexers/fantom.py +250 -0
- data/vendor/pygments-main/pygments/lexers/felix.py +273 -0
- data/vendor/pygments-main/pygments/lexers/floscript.py +83 -0
- data/vendor/pygments-main/pygments/lexers/forth.py +178 -0
- data/vendor/pygments-main/pygments/lexers/fortran.py +206 -0
- data/vendor/pygments-main/pygments/lexers/foxpro.py +428 -0
- data/vendor/pygments-main/pygments/lexers/freefem.py +898 -0
- data/vendor/pygments-main/pygments/lexers/functional.py +21 -0
- data/vendor/pygments-main/pygments/lexers/gdscript.py +346 -0
- data/vendor/pygments-main/pygments/lexers/go.py +101 -0
- data/vendor/pygments-main/pygments/lexers/grammar_notation.py +270 -0
- data/vendor/pygments-main/pygments/lexers/graph.py +85 -0
- data/vendor/pygments-main/pygments/lexers/graphics.py +800 -0
- data/vendor/pygments-main/pygments/lexers/haskell.py +870 -0
- data/vendor/pygments-main/pygments/lexers/haxe.py +936 -0
- data/vendor/pygments-main/pygments/lexers/hdl.py +472 -0
- data/vendor/pygments-main/pygments/lexers/hexdump.py +103 -0
- data/vendor/pygments-main/pygments/lexers/html.py +614 -0
- data/vendor/pygments-main/pygments/lexers/idl.py +281 -0
- data/vendor/pygments-main/pygments/lexers/igor.py +420 -0
- data/vendor/pygments-main/pygments/lexers/inferno.py +96 -0
- data/vendor/pygments-main/pygments/lexers/installers.py +322 -0
- data/vendor/pygments-main/pygments/lexers/int_fiction.py +1368 -0
- data/vendor/pygments-main/pygments/lexers/iolang.py +63 -0
- data/vendor/pygments-main/pygments/lexers/j.py +146 -0
- data/vendor/pygments-main/pygments/lexers/javascript.py +1540 -0
- data/vendor/pygments-main/pygments/lexers/julia.py +331 -0
- data/vendor/pygments-main/pygments/lexers/jvm.py +1673 -0
- data/vendor/pygments-main/pygments/lexers/lisp.py +2699 -0
- data/vendor/pygments-main/pygments/lexers/make.py +206 -0
- data/vendor/pygments-main/pygments/lexers/markup.py +765 -0
- data/vendor/pygments-main/pygments/lexers/math.py +21 -0
- data/vendor/pygments-main/pygments/lexers/matlab.py +720 -0
- data/vendor/pygments-main/pygments/lexers/mime.py +226 -0
- data/vendor/pygments-main/pygments/lexers/ml.py +958 -0
- data/vendor/pygments-main/pygments/lexers/modeling.py +366 -0
- data/vendor/pygments-main/pygments/lexers/modula2.py +1580 -0
- data/vendor/pygments-main/pygments/lexers/monte.py +204 -0
- data/vendor/pygments-main/pygments/lexers/mosel.py +448 -0
- data/vendor/pygments-main/pygments/lexers/ncl.py +894 -0
- data/vendor/pygments-main/pygments/lexers/nimrod.py +159 -0
- data/vendor/pygments-main/pygments/lexers/nit.py +64 -0
- data/vendor/pygments-main/pygments/lexers/nix.py +136 -0
- data/vendor/pygments-main/pygments/lexers/oberon.py +121 -0
- data/vendor/pygments-main/pygments/lexers/objective.py +504 -0
- data/vendor/pygments-main/pygments/lexers/ooc.py +85 -0
- data/vendor/pygments-main/pygments/lexers/other.py +41 -0
- data/vendor/pygments-main/pygments/lexers/parasail.py +79 -0
- data/vendor/pygments-main/pygments/lexers/parsers.py +800 -0
- data/vendor/pygments-main/pygments/lexers/pascal.py +644 -0
- data/vendor/pygments-main/pygments/lexers/pawn.py +205 -0
- data/vendor/pygments-main/pygments/lexers/perl.py +732 -0
- data/vendor/pygments-main/pygments/lexers/php.py +321 -0
- data/vendor/pygments-main/pygments/lexers/pointless.py +71 -0
- data/vendor/pygments-main/pygments/lexers/pony.py +94 -0
- data/vendor/pygments-main/pygments/lexers/praat.py +302 -0
- data/vendor/pygments-main/pygments/lexers/prolog.py +306 -0
- data/vendor/pygments-main/pygments/lexers/promql.py +183 -0
- data/vendor/pygments-main/pygments/lexers/python.py +1151 -0
- data/vendor/pygments-main/pygments/lexers/qvt.py +152 -0
- data/vendor/pygments-main/pygments/lexers/r.py +191 -0
- data/vendor/pygments-main/pygments/lexers/rdf.py +463 -0
- data/vendor/pygments-main/pygments/lexers/rebol.py +431 -0
- data/vendor/pygments-main/pygments/lexers/resource.py +85 -0
- data/vendor/pygments-main/pygments/lexers/ride.py +139 -0
- data/vendor/pygments-main/pygments/lexers/rnc.py +67 -0
- data/vendor/pygments-main/pygments/lexers/roboconf.py +82 -0
- data/vendor/pygments-main/pygments/lexers/robotframework.py +552 -0
- data/vendor/pygments-main/pygments/lexers/ruby.py +517 -0
- data/vendor/pygments-main/pygments/lexers/rust.py +224 -0
- data/vendor/pygments-main/pygments/lexers/sas.py +228 -0
- data/vendor/pygments-main/pygments/lexers/scdoc.py +83 -0
- data/vendor/pygments-main/pygments/lexers/scripting.py +1284 -0
- data/vendor/pygments-main/pygments/lexers/sgf.py +61 -0
- data/vendor/pygments-main/pygments/lexers/shell.py +914 -0
- data/vendor/pygments-main/pygments/lexers/sieve.py +69 -0
- data/vendor/pygments-main/pygments/lexers/slash.py +185 -0
- data/vendor/pygments-main/pygments/lexers/smalltalk.py +195 -0
- data/vendor/pygments-main/pygments/lexers/smv.py +79 -0
- data/vendor/pygments-main/pygments/lexers/snobol.py +83 -0
- data/vendor/pygments-main/pygments/lexers/solidity.py +92 -0
- data/vendor/pygments-main/pygments/lexers/special.py +105 -0
- data/vendor/pygments-main/pygments/lexers/sql.py +837 -0
- data/vendor/pygments-main/pygments/lexers/stata.py +171 -0
- data/vendor/pygments-main/pygments/lexers/supercollider.py +95 -0
- data/vendor/pygments-main/pygments/lexers/tcl.py +145 -0
- data/vendor/pygments-main/pygments/lexers/templates.py +2264 -0
- data/vendor/pygments-main/pygments/lexers/teraterm.py +335 -0
- data/vendor/pygments-main/pygments/lexers/testing.py +207 -0
- data/vendor/pygments-main/pygments/lexers/text.py +26 -0
- data/vendor/pygments-main/pygments/lexers/textedit.py +169 -0
- data/vendor/pygments-main/pygments/lexers/textfmts.py +430 -0
- data/vendor/pygments-main/pygments/lexers/theorem.py +474 -0
- data/vendor/pygments-main/pygments/lexers/tnt.py +263 -0
- data/vendor/pygments-main/pygments/lexers/trafficscript.py +54 -0
- data/vendor/pygments-main/pygments/lexers/typoscript.py +219 -0
- data/vendor/pygments-main/pygments/lexers/unicon.py +412 -0
- data/vendor/pygments-main/pygments/lexers/urbi.py +146 -0
- data/vendor/pygments-main/pygments/lexers/usd.py +90 -0
- data/vendor/pygments-main/pygments/lexers/varnish.py +190 -0
- data/vendor/pygments-main/pygments/lexers/verification.py +114 -0
- data/vendor/pygments-main/pygments/lexers/web.py +24 -0
- data/vendor/pygments-main/pygments/lexers/webidl.py +299 -0
- data/vendor/pygments-main/pygments/lexers/webmisc.py +991 -0
- data/vendor/pygments-main/pygments/lexers/whiley.py +116 -0
- data/vendor/pygments-main/pygments/lexers/x10.py +69 -0
- data/vendor/pygments-main/pygments/lexers/xorg.py +37 -0
- data/vendor/pygments-main/pygments/lexers/yang.py +104 -0
- data/vendor/pygments-main/pygments/lexers/zig.py +124 -0
- data/vendor/pygments-main/pygments/modeline.py +1 -1
- data/vendor/pygments-main/pygments/plugin.py +4 -2
- data/vendor/pygments-main/pygments/regexopt.py +1 -1
- data/vendor/pygments-main/pygments/scanner.py +2 -2
- data/vendor/pygments-main/pygments/sphinxext.py +2 -4
- data/vendor/pygments-main/pygments/style.py +61 -24
- data/vendor/pygments-main/pygments/styles/__init__.py +10 -4
- data/vendor/pygments-main/pygments/styles/abap.py +1 -1
- data/vendor/pygments-main/pygments/styles/algol.py +1 -1
- data/vendor/pygments-main/pygments/styles/algol_nu.py +1 -1
- data/vendor/pygments-main/pygments/styles/arduino.py +2 -2
- data/vendor/pygments-main/pygments/styles/autumn.py +1 -1
- data/vendor/pygments-main/pygments/styles/borland.py +1 -1
- data/vendor/pygments-main/pygments/styles/bw.py +1 -1
- data/vendor/pygments-main/pygments/styles/colorful.py +1 -1
- data/vendor/pygments-main/pygments/styles/default.py +1 -1
- data/vendor/pygments-main/pygments/styles/emacs.py +1 -1
- data/vendor/pygments-main/pygments/styles/friendly.py +1 -1
- data/vendor/pygments-main/pygments/styles/fruity.py +1 -1
- data/vendor/pygments-main/pygments/styles/igor.py +1 -1
- data/vendor/pygments-main/pygments/styles/inkpot.py +67 -0
- data/vendor/pygments-main/pygments/styles/lovelace.py +1 -1
- data/vendor/pygments-main/pygments/styles/manni.py +1 -1
- data/vendor/pygments-main/pygments/styles/monokai.py +4 -3
- data/vendor/pygments-main/pygments/styles/murphy.py +1 -1
- data/vendor/pygments-main/pygments/styles/native.py +1 -1
- data/vendor/pygments-main/pygments/styles/paraiso_dark.py +1 -1
- data/vendor/pygments-main/pygments/styles/paraiso_light.py +1 -1
- data/vendor/pygments-main/pygments/styles/pastie.py +1 -1
- data/vendor/pygments-main/pygments/styles/perldoc.py +1 -1
- data/vendor/pygments-main/pygments/styles/rainbow_dash.py +1 -1
- data/vendor/pygments-main/pygments/styles/rrt.py +1 -1
- data/vendor/pygments-main/pygments/styles/sas.py +1 -1
- data/vendor/pygments-main/pygments/styles/solarized.py +134 -0
- data/vendor/pygments-main/pygments/styles/stata_dark.py +41 -0
- data/vendor/pygments-main/pygments/styles/{stata.py → stata_light.py} +14 -15
- data/vendor/pygments-main/pygments/styles/tango.py +1 -1
- data/vendor/pygments-main/pygments/styles/trac.py +1 -1
- data/vendor/pygments-main/pygments/styles/vim.py +1 -1
- data/vendor/pygments-main/pygments/styles/vs.py +1 -1
- data/vendor/pygments-main/pygments/styles/xcode.py +1 -1
- data/vendor/pygments-main/pygments/token.py +1 -1
- data/vendor/pygments-main/pygments/unistring.py +47 -108
- data/vendor/pygments-main/pygments/util.py +15 -92
- metadata +69 -136
- data/CHANGELOG.md +0 -111
- data/README.md +0 -121
- data/circle.yml +0 -20
- data/test/test_data.py +0 -514
- data/test/test_data_generated +0 -2582
- data/vendor/custom_lexers/github.py +0 -565
- data/vendor/pygments-main/CHANGES +0 -1186
- data/vendor/pygments-main/MANIFEST.in +0 -6
- data/vendor/pygments-main/Makefile +0 -65
- data/vendor/pygments-main/README.rst +0 -39
- data/vendor/pygments-main/REVISION +0 -1
- data/vendor/pygments-main/TODO +0 -12
- data/vendor/pygments-main/doc/Makefile +0 -153
- data/vendor/pygments-main/doc/_static/favicon.ico +0 -0
- data/vendor/pygments-main/doc/_static/logo_new.png +0 -0
- data/vendor/pygments-main/doc/_static/logo_only.png +0 -0
- data/vendor/pygments-main/doc/_templates/docssidebar.html +0 -3
- data/vendor/pygments-main/doc/_templates/indexsidebar.html +0 -25
- data/vendor/pygments-main/doc/_themes/pygments14/layout.html +0 -98
- data/vendor/pygments-main/doc/_themes/pygments14/static/bodybg.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/docbg.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/listitem.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/logo.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/pocoo.png +0 -0
- data/vendor/pygments-main/doc/_themes/pygments14/static/pygments14.css_t +0 -401
- data/vendor/pygments-main/doc/_themes/pygments14/theme.conf +0 -15
- data/vendor/pygments-main/doc/conf.py +0 -241
- data/vendor/pygments-main/doc/docs/api.rst +0 -354
- data/vendor/pygments-main/doc/docs/authors.rst +0 -4
- data/vendor/pygments-main/doc/docs/changelog.rst +0 -1
- data/vendor/pygments-main/doc/docs/cmdline.rst +0 -166
- data/vendor/pygments-main/doc/docs/filterdevelopment.rst +0 -71
- data/vendor/pygments-main/doc/docs/filters.rst +0 -41
- data/vendor/pygments-main/doc/docs/formatterdevelopment.rst +0 -169
- data/vendor/pygments-main/doc/docs/formatters.rst +0 -48
- data/vendor/pygments-main/doc/docs/index.rst +0 -66
- data/vendor/pygments-main/doc/docs/integrate.rst +0 -40
- data/vendor/pygments-main/doc/docs/java.rst +0 -70
- data/vendor/pygments-main/doc/docs/lexerdevelopment.rst +0 -728
- data/vendor/pygments-main/doc/docs/lexers.rst +0 -69
- data/vendor/pygments-main/doc/docs/moinmoin.rst +0 -39
- data/vendor/pygments-main/doc/docs/plugins.rst +0 -93
- data/vendor/pygments-main/doc/docs/quickstart.rst +0 -205
- data/vendor/pygments-main/doc/docs/rstdirective.rst +0 -22
- data/vendor/pygments-main/doc/docs/styles.rst +0 -201
- data/vendor/pygments-main/doc/docs/tokens.rst +0 -372
- data/vendor/pygments-main/doc/docs/unicode.rst +0 -58
- data/vendor/pygments-main/doc/download.rst +0 -41
- data/vendor/pygments-main/doc/faq.rst +0 -139
- data/vendor/pygments-main/doc/index.rst +0 -54
- data/vendor/pygments-main/doc/languages.rst +0 -154
- data/vendor/pygments-main/doc/make.bat +0 -190
- data/vendor/pygments-main/doc/pygmentize.1 +0 -94
- data/vendor/pygments-main/external/autopygmentize +0 -101
- data/vendor/pygments-main/external/lasso-builtins-generator-9.lasso +0 -162
- data/vendor/pygments-main/external/markdown-processor.py +0 -67
- data/vendor/pygments-main/external/moin-parser.py +0 -112
- data/vendor/pygments-main/external/pygments.bashcomp +0 -38
- data/vendor/pygments-main/external/rst-directive.py +0 -82
- data/vendor/pygments-main/pygmentize +0 -8
- data/vendor/pygments-main/requirements.txt +0 -5
- data/vendor/pygments-main/scripts/check_sources.py +0 -211
- data/vendor/pygments-main/scripts/debug_lexer.py +0 -246
- data/vendor/pygments-main/scripts/detect_missing_analyse_text.py +0 -33
- data/vendor/pygments-main/scripts/epydoc.css +0 -280
- data/vendor/pygments-main/scripts/get_vimkw.py +0 -74
- data/vendor/pygments-main/scripts/pylintrc +0 -301
- data/vendor/pygments-main/scripts/vim2pygments.py +0 -935
- data/vendor/pygments-main/setup.cfg +0 -10
- data/vendor/pygments-main/setup.py +0 -77
- data/vendor/pygments-main/tox.ini +0 -7
- data/vendor/simplejson/.gitignore +0 -10
- data/vendor/simplejson/.travis.yml +0 -5
- data/vendor/simplejson/CHANGES.txt +0 -291
- data/vendor/simplejson/LICENSE.txt +0 -19
- data/vendor/simplejson/MANIFEST.in +0 -5
- data/vendor/simplejson/README.rst +0 -19
- data/vendor/simplejson/conf.py +0 -179
- data/vendor/simplejson/index.rst +0 -628
- data/vendor/simplejson/scripts/make_docs.py +0 -18
- data/vendor/simplejson/setup.py +0 -104
- data/vendor/simplejson/simplejson/__init__.py +0 -510
- data/vendor/simplejson/simplejson/_speedups.c +0 -2745
- data/vendor/simplejson/simplejson/decoder.py +0 -425
- data/vendor/simplejson/simplejson/encoder.py +0 -567
- data/vendor/simplejson/simplejson/ordered_dict.py +0 -119
- data/vendor/simplejson/simplejson/scanner.py +0 -77
- data/vendor/simplejson/simplejson/tests/__init__.py +0 -67
- data/vendor/simplejson/simplejson/tests/test_bigint_as_string.py +0 -55
- data/vendor/simplejson/simplejson/tests/test_check_circular.py +0 -30
- data/vendor/simplejson/simplejson/tests/test_decimal.py +0 -66
- data/vendor/simplejson/simplejson/tests/test_decode.py +0 -83
- data/vendor/simplejson/simplejson/tests/test_default.py +0 -9
- data/vendor/simplejson/simplejson/tests/test_dump.py +0 -67
- data/vendor/simplejson/simplejson/tests/test_encode_basestring_ascii.py +0 -46
- data/vendor/simplejson/simplejson/tests/test_encode_for_html.py +0 -32
- data/vendor/simplejson/simplejson/tests/test_errors.py +0 -34
- data/vendor/simplejson/simplejson/tests/test_fail.py +0 -91
- data/vendor/simplejson/simplejson/tests/test_float.py +0 -19
- data/vendor/simplejson/simplejson/tests/test_indent.py +0 -86
- data/vendor/simplejson/simplejson/tests/test_item_sort_key.py +0 -20
- data/vendor/simplejson/simplejson/tests/test_namedtuple.py +0 -121
- data/vendor/simplejson/simplejson/tests/test_pass1.py +0 -76
- data/vendor/simplejson/simplejson/tests/test_pass2.py +0 -14
- data/vendor/simplejson/simplejson/tests/test_pass3.py +0 -20
- data/vendor/simplejson/simplejson/tests/test_recursion.py +0 -67
- data/vendor/simplejson/simplejson/tests/test_scanstring.py +0 -117
- data/vendor/simplejson/simplejson/tests/test_separators.py +0 -42
- data/vendor/simplejson/simplejson/tests/test_speedups.py +0 -20
- data/vendor/simplejson/simplejson/tests/test_tuple.py +0 -49
- data/vendor/simplejson/simplejson/tests/test_unicode.py +0 -109
- data/vendor/simplejson/simplejson/tool.py +0 -39
data/CHANGELOG.md
DELETED
|
@@ -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 [](https://circleci.com/gh/tmm1/pygments.rb) [](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
|
data/test/test_data.py
DELETED
|
@@ -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
|