pygments.rb 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4098ca01dc51f86056c5d9b00813932fcec3e55d
4
- data.tar.gz: b1b4b997afea29463fe50d1d71f5149e038f44a9
3
+ metadata.gz: 95f44f119ac71a42def88c2cc6684c051d6a7bc1
4
+ data.tar.gz: d44710b3e2e2d6b694379a8edb394caf45d7e1ac
5
5
  SHA512:
6
- metadata.gz: 6966a5a27fc61a380855b779220a4b699672e5fe5cb40d554a44b6f81cf48034db918513d1a12a410185685053cd42debbf684675706fcae19a656a811ccb61a
7
- data.tar.gz: 05175fe08f110359cbbaf62a6324f4eb1e2231679af5cac40129476d55ac5588dc821e805b658976a363a243cbea48bd69b965ef862858cb878dc47b172f36c7
6
+ metadata.gz: 8aa00980332c0b813fb5c1bbffdcbeca857dcf306c8504a1dbd3c77e77a5b442723d3e112a5e04906706def6115dac67153ed3d0f2a5e80aaf978f0868484de8
7
+ data.tar.gz: fb638bccbcc5b1ddd9ea6c9ce46df79c4019f44bf342571f800f21313ef6b93f1a46c1f17c9ce120dc945ac9910b88d79b259af767dd725f2f79463f49c2d2bb
@@ -1,6 +1,13 @@
1
1
  changelog
2
2
  ===========
3
3
 
4
+
5
+ Version 1.1.0 (2016/12/24)
6
+ -----------------------------
7
+
8
+ * Support JRuby [#170](https://github.com/tmm1/pygments.rb/pull/170)
9
+ * Make pygments.rb thread safe [#171](https://github.com/tmm1/pygments.rb/pull/171)
10
+
4
11
  Version 1.0.0 (2016/12/11)
5
12
  -----------------------------
6
13
 
data/circle.yml CHANGED
@@ -1,7 +1,20 @@
1
1
  machine:
2
2
  ruby:
3
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
4
16
 
5
17
  test:
6
18
  override:
19
+ - rvm-exec $JRUBY bundle exec rake test
7
20
  - bundle exec rake test
@@ -1,8 +1,33 @@
1
1
  require File.join(File.dirname(__FILE__), 'pygments/popen')
2
-
2
+ require 'forwardable'
3
3
 
4
4
  module Pygments
5
- extend Pygments::Popen
6
5
 
7
6
  autoload :Lexer, 'pygments/lexer'
7
+
8
+ class << self
9
+ extend Forwardable
10
+
11
+ def engine
12
+ Thread.current.thread_variable_get(:pygments_engine) ||
13
+ Thread.current.thread_variable_set(:pygments_engine, Pygments::Popen.new)
14
+ end
15
+
16
+ def_delegators :engine,
17
+ # public
18
+ :formatters,
19
+ :lexers,
20
+ :lexers!,
21
+ :filters,
22
+ :styles,
23
+ :css,
24
+ :lexer_name_for,
25
+ :highlight,
26
+ # not public but documented
27
+ :start,
28
+ # only for testing
29
+ :size_check,
30
+ :get_fixed_bits_from_header,
31
+ :add_ids
32
+ end
8
33
  end
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
- require 'posix/spawn'
3
- require 'yajl'
2
+ require 'open3'
3
+ require 'multi_json'
4
4
  require 'timeout'
5
5
  require 'logger'
6
6
  require 'time'
@@ -12,9 +12,12 @@ end
12
12
  # Pygments provides access to the Pygments library via a pipe and a long-running
13
13
  # Python process.
14
14
  module Pygments
15
- module Popen
16
- include POSIX::Spawn
17
- extend self
15
+ class Popen
16
+
17
+ def popen4(cmd)
18
+ stdin, stdout, stderr, wait_thr = Open3.popen3(cmd)
19
+ [wait_thr[:pid], stdin, stdout, stderr]
20
+ end
18
21
 
19
22
  # Get things started by opening a pipe to mentos (the freshmaker), a
20
23
  # Python process that talks to the Pygments library. We'll talk back and
@@ -262,7 +265,7 @@ module Pygments
262
265
 
263
266
  kwargs.freeze
264
267
  kwargs = kwargs.merge("fd" => @out.to_i, "id" => id, "bytes" => bytesize)
265
- out_header = Yajl.dump(:method => method, :args => args, :kwargs => kwargs)
268
+ out_header = MultiJson.dump(:method => method, :args => args, :kwargs => kwargs)
266
269
 
267
270
  # Get the size of the header itself and write that.
268
271
  bits = get_fixed_bits_from_header(out_header)
@@ -322,12 +325,12 @@ module Pygments
322
325
  def handle_header_and_return(header, id)
323
326
  if header
324
327
  header = header_to_json(header)
325
- bytes = header["bytes"]
328
+ bytes = header[:bytes]
326
329
 
327
330
  # Read more bytes (the actual response body)
328
331
  res = @out.read(bytes.to_i)
329
332
 
330
- if header["method"] == "highlight"
333
+ if header[:method] == "highlight"
331
334
  # Make sure we have a result back; else consider this an error.
332
335
  if res.nil?
333
336
  @log.warn "No highlight result back from mentos."
@@ -423,7 +426,7 @@ module Pygments
423
426
  # want them, text otherwise.
424
427
  def return_result(res, method)
425
428
  unless method == :lexer_name_for || method == :highlight || method == :css
426
- res = Yajl.load(res, :symbolize_keys => true)
429
+ res = MultiJson.load(res, :symbolize_keys => true)
427
430
  end
428
431
  res = res.rstrip if res.class == String
429
432
  res
@@ -432,14 +435,14 @@ module Pygments
432
435
  # Convert a text header into JSON for easy access.
433
436
  def header_to_json(header)
434
437
  @log.info "[In header: #{header} "
435
- header = Yajl.load(header)
438
+ header = MultiJson.load(header, :symbolize_keys => true)
436
439
 
437
- if header["error"]
440
+ if header[:error]
438
441
  # Raise this as a Ruby exception of the MentosError class.
439
442
  # Stop so we don't leave the pipe in an inconsistent state.
440
443
  @log.error "Failed to convert header to JSON."
441
- stop header["error"]
442
- raise MentosError, header["error"]
444
+ stop header[:error]
445
+ raise MentosError, header[:error]
443
446
  else
444
447
  header
445
448
  end
@@ -1,3 +1,3 @@
1
1
  module Pygments
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -14,8 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.email = ['aman@tmm1.net']
15
15
  s.license = 'MIT'
16
16
 
17
- s.add_dependency 'yajl-ruby', '~> 1.2'
18
- s.add_dependency 'posix-spawn', '~> 0.3.6'
17
+ s.add_dependency 'multi_json', '>= 1.0.0'
19
18
  s.add_development_dependency 'rake-compiler', '~> 0.7.6'
20
19
  s.add_development_dependency 'test-unit', '~> 3.0.0'
21
20
 
@@ -111,6 +111,17 @@ class PygmentsHighlightTest < Test::Unit::TestCase
111
111
  code = P.highlight("importr python; wat?", :lexer => 'py')
112
112
  assert_match ">importr</span>", code
113
113
  end
114
+
115
+ def test_highlight_on_multi_threads
116
+ 10.times.map do
117
+ Thread.new do
118
+ test_full_html_highlight
119
+ end
120
+ end.each do |thread|
121
+ thread.join
122
+ end
123
+ end
124
+
114
125
  end
115
126
 
116
127
  # Philosophically, I'm not the biggest fan of testing private
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pygments.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aman Gupta
@@ -9,36 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-12-11 00:00:00.000000000 Z
12
+ date: 2016-12-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: yajl-ruby
15
+ name: multi_json
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '1.2'
20
+ version: 1.0.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "~>"
26
- - !ruby/object:Gem::Version
27
- version: '1.2'
28
- - !ruby/object:Gem::Dependency
29
- name: posix-spawn
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - "~>"
33
- - !ruby/object:Gem::Version
34
- version: 0.3.6
35
- type: :runtime
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "~>"
25
+ - - ">="
40
26
  - !ruby/object:Gem::Version
41
- version: 0.3.6
27
+ version: 1.0.0
42
28
  - !ruby/object:Gem::Dependency
43
29
  name: rake-compiler
44
30
  requirement: !ruby/object:Gem::Requirement