pygments.rb 1.0.0 → 1.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 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