json_pure 2.1.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +50 -0
  3. data/Gemfile +0 -2
  4. data/LICENSE +56 -0
  5. data/README.md +54 -21
  6. data/VERSION +1 -1
  7. data/json_pure.gemspec +49 -26
  8. data/lib/json.rb +549 -29
  9. data/lib/json/add/bigdecimal.rb +2 -2
  10. data/lib/json/add/complex.rb +2 -3
  11. data/lib/json/add/ostruct.rb +1 -1
  12. data/lib/json/add/rational.rb +2 -3
  13. data/lib/json/add/regexp.rb +2 -2
  14. data/lib/json/add/set.rb +29 -0
  15. data/lib/json/common.rb +341 -115
  16. data/lib/json/pure/generator.rb +31 -10
  17. data/lib/json/pure/parser.rb +31 -5
  18. data/lib/json/version.rb +1 -1
  19. data/tests/fixtures/fail29.json +1 -0
  20. data/tests/fixtures/fail30.json +1 -0
  21. data/tests/fixtures/fail31.json +1 -0
  22. data/tests/fixtures/fail32.json +1 -0
  23. data/tests/json_addition_test.rb +6 -0
  24. data/tests/json_common_interface_test.rb +47 -4
  25. data/tests/json_fixtures_test.rb +9 -1
  26. data/tests/json_generator_test.rb +55 -0
  27. data/tests/json_parser_test.rb +40 -14
  28. data/tests/test_helper.rb +3 -7
  29. metadata +24 -52
  30. data/.gitignore +0 -17
  31. data/.travis.yml +0 -19
  32. data/README-json-jruby.md +0 -33
  33. data/Rakefile +0 -408
  34. data/data/example.json +0 -1
  35. data/data/index.html +0 -38
  36. data/data/prototype.js +0 -4184
  37. data/diagrams/.keep +0 -0
  38. data/ext/json/ext/fbuffer/fbuffer.h +0 -187
  39. data/ext/json/ext/generator/depend +0 -1
  40. data/ext/json/ext/generator/extconf.rb +0 -4
  41. data/ext/json/ext/generator/generator.c +0 -1443
  42. data/ext/json/ext/generator/generator.h +0 -171
  43. data/ext/json/ext/parser/depend +0 -1
  44. data/ext/json/ext/parser/extconf.rb +0 -6
  45. data/ext/json/ext/parser/parser.c +0 -2109
  46. data/ext/json/ext/parser/parser.h +0 -91
  47. data/ext/json/ext/parser/parser.rl +0 -869
  48. data/ext/json/extconf.rb +0 -2
  49. data/install.rb +0 -23
  50. data/java/src/json/ext/ByteListTranscoder.java +0 -166
  51. data/java/src/json/ext/Generator.java +0 -443
  52. data/java/src/json/ext/GeneratorMethods.java +0 -231
  53. data/java/src/json/ext/GeneratorService.java +0 -42
  54. data/java/src/json/ext/GeneratorState.java +0 -490
  55. data/java/src/json/ext/OptionsReader.java +0 -113
  56. data/java/src/json/ext/Parser.java +0 -2362
  57. data/java/src/json/ext/Parser.rl +0 -893
  58. data/java/src/json/ext/ParserService.java +0 -34
  59. data/java/src/json/ext/RuntimeInfo.java +0 -116
  60. data/java/src/json/ext/StringDecoder.java +0 -166
  61. data/java/src/json/ext/StringEncoder.java +0 -111
  62. data/java/src/json/ext/Utils.java +0 -88
  63. data/json-java.gemspec +0 -38
  64. data/json.gemspec +0 -0
  65. data/references/rfc7159.txt +0 -899
  66. data/tools/diff.sh +0 -18
  67. data/tools/fuzz.rb +0 -131
  68. data/tools/server.rb +0 -62
@@ -4,6 +4,7 @@ require 'test_helper'
4
4
  require 'stringio'
5
5
  require 'tempfile'
6
6
  require 'ostruct'
7
+ require 'bigdecimal'
7
8
 
8
9
  class JSONParserTest < Test::Unit::TestCase
9
10
  include JSON
@@ -90,27 +91,27 @@ class JSONParserTest < Test::Unit::TestCase
90
91
  assert_raise(JSON::ParserError) { parse('+23') }
91
92
  assert_raise(JSON::ParserError) { parse('.23') }
92
93
  assert_raise(JSON::ParserError) { parse('023') }
93
- assert_equal 23, parse('23')
94
- assert_equal -23, parse('-23')
95
- assert_equal_float 3.141, parse('3.141')
96
- assert_equal_float -3.141, parse('-3.141')
97
- assert_equal_float 3.141, parse('3141e-3')
98
- assert_equal_float 3.141, parse('3141.1e-3')
99
- assert_equal_float 3.141, parse('3141E-3')
100
- assert_equal_float 3.141, parse('3141.0E-3')
101
- assert_equal_float -3.141, parse('-3141.0e-3')
102
- assert_equal_float -3.141, parse('-3141e-3')
94
+ assert_equal(23, parse('23'))
95
+ assert_equal(-23, parse('-23'))
96
+ assert_equal_float(3.141, parse('3.141'))
97
+ assert_equal_float(-3.141, parse('-3.141'))
98
+ assert_equal_float(3.141, parse('3141e-3'))
99
+ assert_equal_float(3.141, parse('3141.1e-3'))
100
+ assert_equal_float(3.141, parse('3141E-3'))
101
+ assert_equal_float(3.141, parse('3141.0E-3'))
102
+ assert_equal_float(-3.141, parse('-3141.0e-3'))
103
+ assert_equal_float(-3.141, parse('-3141e-3'))
103
104
  assert_raise(ParserError) { parse('NaN') }
104
105
  assert parse('NaN', :allow_nan => true).nan?
105
106
  assert_raise(ParserError) { parse('Infinity') }
106
- assert_equal 1.0/0, parse('Infinity', :allow_nan => true)
107
+ assert_equal(1.0/0, parse('Infinity', :allow_nan => true))
107
108
  assert_raise(ParserError) { parse('-Infinity') }
108
- assert_equal -1.0/0, parse('-Infinity', :allow_nan => true)
109
+ assert_equal(-1.0/0, parse('-Infinity', :allow_nan => true))
109
110
  end
110
111
 
111
112
  def test_parse_bigdecimals
112
- assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
113
- assert_equal(BigDecimal.new("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
113
+ assert_equal(BigDecimal, JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"].class)
114
+ assert_equal(BigDecimal("0.901234567890123456789E1"),JSON.parse('{"foo": 9.01234567890123456789}', decimal_class: BigDecimal)["foo"] )
114
115
  end
115
116
 
116
117
  if Array.method_defined?(:permutation)
@@ -217,6 +218,17 @@ class JSONParserTest < Test::Unit::TestCase
217
218
  end
218
219
  end
219
220
 
221
+ def test_freeze
222
+ assert_predicate parse('{}', :freeze => true), :frozen?
223
+ assert_predicate parse('[]', :freeze => true), :frozen?
224
+ assert_predicate parse('"foo"', :freeze => true), :frozen?
225
+
226
+ if string_deduplication_available?
227
+ assert_same(-'foo', parse('"foo"', :freeze => true))
228
+ assert_same(-'foo', parse('{"foo": 1}', :freeze => true).keys.first)
229
+ end
230
+ end
231
+
220
232
  def test_parse_comments
221
233
  json = <<EOT
222
234
  {
@@ -292,6 +304,10 @@ EOT
292
304
  json = '["\\\'"]'
293
305
  data = ["'"]
294
306
  assert_equal data, parse(json)
307
+
308
+ json = '["\/"]'
309
+ data = [ '/' ]
310
+ assert_equal data, parse(json)
295
311
  end
296
312
 
297
313
  class SubArray < Array
@@ -463,6 +479,16 @@ EOT
463
479
 
464
480
  private
465
481
 
482
+ def string_deduplication_available?
483
+ r1 = rand.to_s
484
+ r2 = r1.dup
485
+ begin
486
+ (-r1).equal?(-r2)
487
+ rescue NoMethodError
488
+ false # No String#-@
489
+ end
490
+ end
491
+
466
492
  def assert_equal_float(expected, actual, delta = 1e-2)
467
493
  Array === expected and expected = expected.first
468
494
  Array === actual and actual = actual.first
@@ -1,12 +1,12 @@
1
1
  case ENV['JSON']
2
2
  when 'pure'
3
- $:.unshift 'lib'
3
+ $:.unshift File.join(__dir__, '../lib')
4
4
  require 'json/pure'
5
5
  when 'ext'
6
- $:.unshift 'ext', 'lib'
6
+ $:.unshift File.join(__dir__, '../ext'), File.join(__dir__, '../lib')
7
7
  require 'json/ext'
8
8
  else
9
- $:.unshift 'ext', 'lib'
9
+ $:.unshift File.join(__dir__, '../ext'), File.join(__dir__, '../lib')
10
10
  require 'json'
11
11
  end
12
12
 
@@ -15,7 +15,3 @@ begin
15
15
  require 'byebug'
16
16
  rescue LoadError
17
17
  end
18
- if ENV['START_SIMPLECOV'].to_i == 1
19
- require 'simplecov'
20
- SimpleCov.start
21
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_pure
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-18 00:00:00.000000000 Z
11
+ date: 2020-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: test-unit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: '0'
41
41
  description: This is a JSON implementation in pure Ruby.
42
42
  email: flori@ping.de
43
43
  executables: []
@@ -46,45 +46,11 @@ extra_rdoc_files:
46
46
  - README.md
47
47
  files:
48
48
  - "./tests/test_helper.rb"
49
- - ".gitignore"
50
- - ".travis.yml"
51
49
  - CHANGES.md
52
50
  - Gemfile
53
- - README-json-jruby.md
51
+ - LICENSE
54
52
  - README.md
55
- - Rakefile
56
53
  - VERSION
57
- - data/example.json
58
- - data/index.html
59
- - data/prototype.js
60
- - diagrams/.keep
61
- - ext/json/ext/fbuffer/fbuffer.h
62
- - ext/json/ext/generator/depend
63
- - ext/json/ext/generator/extconf.rb
64
- - ext/json/ext/generator/generator.c
65
- - ext/json/ext/generator/generator.h
66
- - ext/json/ext/parser/depend
67
- - ext/json/ext/parser/extconf.rb
68
- - ext/json/ext/parser/parser.c
69
- - ext/json/ext/parser/parser.h
70
- - ext/json/ext/parser/parser.rl
71
- - ext/json/extconf.rb
72
- - install.rb
73
- - java/src/json/ext/ByteListTranscoder.java
74
- - java/src/json/ext/Generator.java
75
- - java/src/json/ext/GeneratorMethods.java
76
- - java/src/json/ext/GeneratorService.java
77
- - java/src/json/ext/GeneratorState.java
78
- - java/src/json/ext/OptionsReader.java
79
- - java/src/json/ext/Parser.java
80
- - java/src/json/ext/Parser.rl
81
- - java/src/json/ext/ParserService.java
82
- - java/src/json/ext/RuntimeInfo.java
83
- - java/src/json/ext/StringDecoder.java
84
- - java/src/json/ext/StringEncoder.java
85
- - java/src/json/ext/Utils.java
86
- - json-java.gemspec
87
- - json.gemspec
88
54
  - json_pure.gemspec
89
55
  - lib/json.rb
90
56
  - lib/json/add/bigdecimal.rb
@@ -97,6 +63,7 @@ files:
97
63
  - lib/json/add/range.rb
98
64
  - lib/json/add/rational.rb
99
65
  - lib/json/add/regexp.rb
66
+ - lib/json/add/set.rb
100
67
  - lib/json/add/struct.rb
101
68
  - lib/json/add/symbol.rb
102
69
  - lib/json/add/time.rb
@@ -108,7 +75,6 @@ files:
108
75
  - lib/json/pure/generator.rb
109
76
  - lib/json/pure/parser.rb
110
77
  - lib/json/version.rb
111
- - references/rfc7159.txt
112
78
  - tests/fixtures/fail10.json
113
79
  - tests/fixtures/fail11.json
114
80
  - tests/fixtures/fail12.json
@@ -125,7 +91,11 @@ files:
125
91
  - tests/fixtures/fail25.json
126
92
  - tests/fixtures/fail27.json
127
93
  - tests/fixtures/fail28.json
94
+ - tests/fixtures/fail29.json
128
95
  - tests/fixtures/fail3.json
96
+ - tests/fixtures/fail30.json
97
+ - tests/fixtures/fail31.json
98
+ - tests/fixtures/fail32.json
129
99
  - tests/fixtures/fail4.json
130
100
  - tests/fixtures/fail5.json
131
101
  - tests/fixtures/fail6.json
@@ -150,14 +120,17 @@ files:
150
120
  - tests/json_parser_test.rb
151
121
  - tests/json_string_matching_test.rb
152
122
  - tests/test_helper.rb
153
- - tools/diff.sh
154
- - tools/fuzz.rb
155
- - tools/server.rb
156
123
  homepage: http://flori.github.com/json
157
124
  licenses:
158
125
  - Ruby
159
- metadata: {}
160
- post_install_message:
126
+ metadata:
127
+ bug_tracker_uri: https://github.com/flori/json/issues
128
+ changelog_uri: https://github.com/flori/json/blob/master/CHANGES.md
129
+ documentation_uri: http://flori.github.io/json/doc/index.html
130
+ homepage_uri: http://flori.github.io/json/
131
+ source_code_uri: https://github.com/flori/json
132
+ wiki_uri: https://github.com/flori/json/wiki
133
+ post_install_message:
161
134
  rdoc_options:
162
135
  - "--title"
163
136
  - JSON implemention for ruby
@@ -169,16 +142,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
169
142
  requirements:
170
143
  - - ">="
171
144
  - !ruby/object:Gem::Version
172
- version: '1.9'
145
+ version: '2.0'
173
146
  required_rubygems_version: !ruby/object:Gem::Requirement
174
147
  requirements:
175
148
  - - ">="
176
149
  - !ruby/object:Gem::Version
177
150
  version: '0'
178
151
  requirements: []
179
- rubyforge_project:
180
- rubygems_version: 2.6.11
181
- signing_key:
152
+ rubygems_version: 3.2.1
153
+ signing_key:
182
154
  specification_version: 4
183
155
  summary: JSON Implementation for Ruby
184
156
  test_files:
data/.gitignore DELETED
@@ -1,17 +0,0 @@
1
- .*.sw[pon]
2
- *.bundle
3
- coverage
4
- tags
5
- pkg
6
- .nfs.*
7
- .idea
8
- java/Json.iml
9
- Gemfile.lock
10
- .rvmrc
11
- *.rbc
12
- .rbx
13
- .AppleDouble
14
- .DS_Store
15
- */**/Makefile
16
- */**/*.o
17
- .byebug_history
@@ -1,19 +0,0 @@
1
- # Passes arguments to bundle install (http://gembundler.com/man/bundle-install.1.html)
2
- #bundler_args: --binstubs
3
- language: ruby
4
-
5
- # Specify which ruby versions you wish to run your tests on, each version will be used
6
- rvm:
7
- - 1.9.3
8
- - 2.0.0
9
- - 2.1
10
- - 2.2
11
- - 2.3.3
12
- - 2.4.1
13
- - jruby
14
- - ruby-head
15
- matrix:
16
- allow_failures:
17
- - rvm: ruby-head
18
- script: "bundle exec rake"
19
- sudo: false
@@ -1,33 +0,0 @@
1
- JSON-JRuby
2
- ==========
3
-
4
- JSON-JRuby is a port of Florian Frank's native
5
- [`json` library](http://json.rubyforge.org/) to JRuby.
6
- It aims to be a perfect drop-in replacement for `json_pure`.
7
-
8
-
9
- Development version
10
- ===================
11
-
12
- The latest version is available from the
13
- [Git repository](http://github.com/mernen/json-jruby/tree):
14
-
15
- git clone git://github.com/mernen/json-jruby.git
16
-
17
-
18
- Compiling
19
- =========
20
-
21
- You'll need JRuby version 1.2 or greater to build JSON-JRuby.
22
- Its path must be set on the `jruby.dir` property of
23
- `nbproject/project.properties` (defaults to `../jruby`).
24
-
25
- Additionally, you'll need [Ant](http://ant.apache.org/), and
26
- [Ragel](http://www.cs.queensu.ca/~thurston/ragel/) 6.4 or greater.
27
-
28
- Then, from the folder where the sources are located, type:
29
-
30
- ant clean jar
31
-
32
- to clean any leftovers from previous builds and generate the `.jar` files.
33
- To generate a RubyGem, specify the `gem` action rather than `jar`.
data/Rakefile DELETED
@@ -1,408 +0,0 @@
1
- begin
2
- require 'rubygems/package_task'
3
- rescue LoadError
4
- end
5
-
6
- require 'rbconfig'
7
- include\
8
- begin
9
- RbConfig
10
- rescue NameError
11
- Config
12
- end
13
-
14
- require 'rake/clean'
15
- CLOBBER.include 'doc', 'Gemfile.lock'
16
- CLEAN.include FileList['diagrams/*.*'], 'doc', 'coverage', 'tmp',
17
- FileList["ext/**/{Makefile,mkmf.log}"], 'build', 'dist', FileList['**/*.rbc'],
18
- FileList["{ext,lib}/**/*.{so,bundle,#{CONFIG['DLEXT']},o,obj,pdb,lib,manifest,exp,def,jar,class,dSYM}"],
19
- FileList['java/src/**/*.class']
20
-
21
- require 'rake/testtask'
22
- class UndocumentedTestTask < Rake::TestTask
23
- def desc(*) end
24
- end
25
-
26
- MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
27
- BUNDLE = ENV['BUNDLE'] || %w[bundle].find { |c| system(c, '-v') }
28
- PKG_NAME = 'json'
29
- PKG_TITLE = 'JSON Implementation for Ruby'
30
- PKG_VERSION = File.read('VERSION').chomp
31
- PKG_FILES = FileList[`git ls-files`.split(/\n/)]
32
-
33
- EXT_ROOT_DIR = 'ext/json/ext'
34
- EXT_PARSER_DIR = "#{EXT_ROOT_DIR}/parser"
35
- EXT_PARSER_DL = "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}"
36
- RAGEL_PATH = "#{EXT_PARSER_DIR}/parser.rl"
37
- EXT_PARSER_SRC = "#{EXT_PARSER_DIR}/parser.c"
38
- EXT_GENERATOR_DIR = "#{EXT_ROOT_DIR}/generator"
39
- EXT_GENERATOR_DL = "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}"
40
- EXT_GENERATOR_SRC = "#{EXT_GENERATOR_DIR}/generator.c"
41
-
42
- JAVA_DIR = "java/src/json/ext"
43
- JAVA_RAGEL_PATH = "#{JAVA_DIR}/Parser.rl"
44
- JAVA_PARSER_SRC = "#{JAVA_DIR}/Parser.java"
45
- JAVA_SOURCES = FileList["#{JAVA_DIR}/*.java"]
46
- JAVA_CLASSES = []
47
- JRUBY_PARSER_JAR = File.expand_path("lib/json/ext/parser.jar")
48
- JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
49
-
50
- RAGEL_CODEGEN = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
51
- RAGEL_DOTGEN = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
52
-
53
- desc "Installing library (pure)"
54
- task :install_pure => :version do
55
- ruby 'install.rb'
56
- end
57
-
58
- task :install_ext_really do
59
- sitearchdir = CONFIG["sitearchdir"]
60
- cd 'ext' do
61
- for file in Dir["json/ext/*.#{CONFIG['DLEXT']}"]
62
- d = File.join(sitearchdir, file)
63
- mkdir_p File.dirname(d)
64
- install(file, d)
65
- end
66
- warn " *** Installed EXT ruby library."
67
- end
68
- end
69
-
70
- desc "Installing library (extension)"
71
- task :install_ext => [ :compile, :install_pure, :install_ext_really ]
72
-
73
- desc "Installing library (extension)"
74
- task :install => :install_ext
75
-
76
- if defined?(Gem) and defined?(Gem::PackageTask)
77
- spec_pure = Gem::Specification.new do |s|
78
- s.name = 'json_pure'
79
- s.version = PKG_VERSION
80
- s.summary = PKG_TITLE
81
- s.description = "This is a JSON implementation in pure Ruby."
82
-
83
- s.files = PKG_FILES
84
-
85
- s.require_path = 'lib'
86
- s.add_development_dependency 'rake'
87
- s.add_development_dependency 'test-unit', '~> 2.0'
88
-
89
- s.extra_rdoc_files << 'README.md'
90
- s.rdoc_options <<
91
- '--title' << 'JSON implemention for ruby' << '--main' << 'README.md'
92
- s.test_files.concat Dir['./tests/test_*.rb']
93
-
94
- s.author = "Florian Frank"
95
- s.email = "flori@ping.de"
96
- s.homepage = "http://flori.github.com/#{PKG_NAME}"
97
- s.license = 'Ruby'
98
- s.required_ruby_version = '>= 1.9'
99
- end
100
-
101
- desc 'Creates a json_pure.gemspec file'
102
- task :gemspec_pure => :version do
103
- File.open('json_pure.gemspec', 'w') do |gemspec|
104
- gemspec.write spec_pure.to_ruby
105
- end
106
- end
107
-
108
- Gem::PackageTask.new(spec_pure) do |pkg|
109
- pkg.need_tar = true
110
- pkg.package_files = PKG_FILES
111
- end
112
-
113
- spec_ext = Gem::Specification.new do |s|
114
- s.name = 'json'
115
- s.version = PKG_VERSION
116
- s.summary = PKG_TITLE
117
- s.description = "This is a JSON implementation as a Ruby extension in C."
118
-
119
- s.files = PKG_FILES
120
-
121
- s.extensions = FileList['ext/**/extconf.rb']
122
-
123
- s.require_path = 'lib'
124
- s.add_development_dependency 'rake'
125
- s.add_development_dependency 'test-unit', '~> 2.0'
126
-
127
- s.extra_rdoc_files << 'README.md'
128
- s.rdoc_options <<
129
- '--title' << 'JSON implemention for Ruby' << '--main' << 'README.md'
130
- s.test_files.concat Dir['./tests/test_*.rb']
131
-
132
- s.author = "Florian Frank"
133
- s.email = "flori@ping.de"
134
- s.homepage = "http://flori.github.com/#{PKG_NAME}"
135
- s.license = 'Ruby'
136
- s.required_ruby_version = '>= 1.9'
137
- end
138
-
139
- desc 'Creates a json.gemspec file'
140
- task :gemspec_ext => :version do
141
- File.open('json.gemspec', 'w') do |gemspec|
142
- gemspec.write spec_ext.to_ruby
143
- end
144
- end
145
-
146
- Gem::PackageTask.new(spec_ext) do |pkg|
147
- pkg.need_tar = true
148
- pkg.package_files = PKG_FILES
149
- end
150
-
151
-
152
- desc 'Create all gemspec files'
153
- task :gemspec => [ :gemspec_pure, :gemspec_ext ]
154
- end
155
-
156
- desc m = "Writing version information for #{PKG_VERSION}"
157
- task :version do
158
- puts m
159
- File.open(File.join('lib', 'json', 'version.rb'), 'w') do |v|
160
- v.puts <<EOT
161
- # frozen_string_literal: false
162
- module JSON
163
- # JSON version
164
- VERSION = '#{PKG_VERSION}'
165
- VERSION_ARRAY = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
166
- VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
167
- VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
168
- VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
169
- end
170
- EOT
171
- end
172
- end
173
-
174
- task :check_env do
175
- ENV.key?('JSON') or fail "JSON env var is required"
176
- end
177
-
178
- desc "Testing library (pure ruby)"
179
- task :test_pure => [ :clean, :check_env, :do_test_pure ]
180
-
181
- UndocumentedTestTask.new do |t|
182
- t.name = 'do_test_pure'
183
- t.libs << 'lib' << 'tests'
184
- t.test_files = FileList['tests/*_test.rb']
185
- t.verbose = true
186
- t.options = '-v'
187
- end
188
-
189
- desc "Testing library (pure ruby and extension)"
190
- task :test do
191
- sh "env JSON=pure #{BUNDLE} exec rake test_pure" or exit 1
192
- sh "env JSON=ext #{BUNDLE} exec rake test_ext" or exit 1
193
- end
194
-
195
- namespace :gems do
196
- desc 'Install all development gems'
197
- task :install do
198
- sh "#{BUNDLE}"
199
- end
200
- end
201
-
202
- if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
203
- ENV['JAVA_HOME'] ||= [
204
- '/usr/local/java/jdk',
205
- '/usr/lib/jvm/java-6-openjdk',
206
- '/Library/Java/Home',
207
- ].find { |c| File.directory?(c) }
208
- if ENV['JAVA_HOME']
209
- warn " *** JAVA_HOME is set to #{ENV['JAVA_HOME'].inspect}"
210
- ENV['PATH'] = ENV['PATH'].split(/:/).unshift(java_path = "#{ENV['JAVA_HOME']}/bin") * ':'
211
- warn " *** java binaries are assumed to be in #{java_path.inspect}"
212
- else
213
- warn " *** JAVA_HOME was not set or could not be guessed!"
214
- exit 1
215
- end
216
-
217
- file JAVA_PARSER_SRC => JAVA_RAGEL_PATH do
218
- cd JAVA_DIR do
219
- if RAGEL_CODEGEN == 'ragel'
220
- sh "ragel Parser.rl -J -o Parser.java"
221
- else
222
- sh "ragel -x Parser.rl | #{RAGEL_CODEGEN} -J"
223
- end
224
- end
225
- end
226
-
227
- desc "Generate parser for java with ragel"
228
- task :ragel => JAVA_PARSER_SRC
229
-
230
- desc "Delete the ragel generated Java source"
231
- task :ragel_clean do
232
- rm_rf JAVA_PARSER_SRC
233
- end
234
-
235
- JRUBY_JAR = File.join(CONFIG["libdir"], "jruby.jar")
236
- if File.exist?(JRUBY_JAR)
237
- JAVA_SOURCES.each do |src|
238
- classpath = (Dir['java/lib/*.jar'] << 'java/src' << JRUBY_JAR) * ':'
239
- obj = src.sub(/\.java\Z/, '.class')
240
- file obj => src do
241
- sh 'javac', '-classpath', classpath, '-source', '1.5', '-target', '1.5', src
242
- end
243
- JAVA_CLASSES << obj
244
- end
245
- else
246
- warn "WARNING: Cannot find jruby in path => Cannot build jruby extension!"
247
- end
248
-
249
- desc "Compiling jruby extension"
250
- task :compile => JAVA_CLASSES
251
-
252
- desc "Package the jruby gem"
253
- task :jruby_gem => :create_jar do
254
- sh 'gem build json-java.gemspec'
255
- mkdir_p 'pkg'
256
- mv "json-#{PKG_VERSION}-java.gem", 'pkg'
257
- end
258
-
259
- desc "Testing library (jruby)"
260
- task :test_ext => [ :check_env, :create_jar, :do_test_ext ]
261
-
262
- UndocumentedTestTask.new do |t|
263
- t.name = 'do_test_ext'
264
- t.libs << 'lib' << 'tests'
265
- t.test_files = FileList['tests/*_test.rb']
266
- t.verbose = true
267
- t.options = '-v'
268
- end
269
-
270
- file JRUBY_PARSER_JAR => :compile do
271
- cd 'java/src' do
272
- parser_classes = FileList[
273
- "json/ext/ByteListTranscoder*.class",
274
- "json/ext/OptionsReader*.class",
275
- "json/ext/Parser*.class",
276
- "json/ext/RuntimeInfo*.class",
277
- "json/ext/StringDecoder*.class",
278
- "json/ext/Utils*.class"
279
- ]
280
- sh 'jar', 'cf', File.basename(JRUBY_PARSER_JAR), *parser_classes
281
- mv File.basename(JRUBY_PARSER_JAR), File.dirname(JRUBY_PARSER_JAR)
282
- end
283
- end
284
-
285
- desc "Create parser jar"
286
- task :create_parser_jar => JRUBY_PARSER_JAR
287
-
288
- file JRUBY_GENERATOR_JAR => :compile do
289
- cd 'java/src' do
290
- generator_classes = FileList[
291
- "json/ext/ByteListTranscoder*.class",
292
- "json/ext/OptionsReader*.class",
293
- "json/ext/Generator*.class",
294
- "json/ext/RuntimeInfo*.class",
295
- "json/ext/StringEncoder*.class",
296
- "json/ext/Utils*.class"
297
- ]
298
- sh 'jar', 'cf', File.basename(JRUBY_GENERATOR_JAR), *generator_classes
299
- mv File.basename(JRUBY_GENERATOR_JAR), File.dirname(JRUBY_GENERATOR_JAR)
300
- end
301
- end
302
-
303
- desc "Create generator jar"
304
- task :create_generator_jar => JRUBY_GENERATOR_JAR
305
-
306
- desc "Create parser and generator jars"
307
- task :create_jar => [ :create_parser_jar, :create_generator_jar ]
308
-
309
- desc "Build all gems and archives for a new release of the jruby extension."
310
- task :build => [ :clean, :version, :jruby_gem ]
311
-
312
- task :release => :build
313
- else
314
- desc "Compiling extension"
315
- task :compile => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
316
-
317
- file EXT_PARSER_DL => EXT_PARSER_SRC do
318
- cd EXT_PARSER_DIR do
319
- ruby 'extconf.rb'
320
- sh MAKE
321
- end
322
- cp "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
323
- end
324
-
325
- file EXT_GENERATOR_DL => EXT_GENERATOR_SRC do
326
- cd EXT_GENERATOR_DIR do
327
- ruby 'extconf.rb'
328
- sh MAKE
329
- end
330
- cp "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
331
- end
332
-
333
- desc "Testing library (extension)"
334
- task :test_ext => [ :check_env, :compile, :do_test_ext ]
335
-
336
- UndocumentedTestTask.new do |t|
337
- t.name = 'do_test_ext'
338
- t.libs << 'ext' << 'lib' << 'tests'
339
- t.test_files = FileList['tests/*_test.rb']
340
- t.verbose = true
341
- t.options = '-v'
342
- end
343
-
344
- desc "Generate parser with ragel"
345
- task :ragel => EXT_PARSER_SRC
346
-
347
- desc "Delete the ragel generated C source"
348
- task :ragel_clean do
349
- rm_rf EXT_PARSER_SRC
350
- end
351
-
352
- desc "Update the tags file"
353
- task :tags do
354
- system 'ctags', *Dir['**/*.{rb,c,h,java}']
355
- end
356
-
357
- file EXT_PARSER_SRC => RAGEL_PATH do
358
- cd EXT_PARSER_DIR do
359
- if RAGEL_CODEGEN == 'ragel'
360
- sh "ragel parser.rl -G2 -o parser.c"
361
- else
362
- sh "ragel -x parser.rl | #{RAGEL_CODEGEN} -G2"
363
- end
364
- src = File.read("parser.c").gsub(/[ \t]+$/, '')
365
- src.gsub!(/^static const int (JSON_.*=.*);$/, 'enum {\1};')
366
- File.open("parser.c", "w") {|f| f.print src}
367
- end
368
- end
369
-
370
- desc "Generate diagrams of ragel parser (ps)"
371
- task :ragel_dot_ps do
372
- root = 'diagrams'
373
- specs = []
374
- File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
375
- for s in specs
376
- if RAGEL_DOTGEN == 'ragel'
377
- sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tps -o#{root}/#{s}.ps"
378
- else
379
- sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tps -o#{root}/#{s}.ps"
380
- end
381
- end
382
- end
383
-
384
- desc "Generate diagrams of ragel parser (png)"
385
- task :ragel_dot_png do
386
- root = 'diagrams'
387
- specs = []
388
- File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
389
- for s in specs
390
- if RAGEL_DOTGEN == 'ragel'
391
- sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tpng -o#{root}/#{s}.png"
392
- else
393
- sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tpng -o#{root}/#{s}.png"
394
- end
395
- end
396
- end
397
-
398
- desc "Generate diagrams of ragel parser"
399
- task :ragel_dot => [ :ragel_dot_png, :ragel_dot_ps ]
400
-
401
- desc "Build all gems and archives for a new release of json and json_pure."
402
- task :build => [ :clean, :gemspec, :package ]
403
-
404
- task :release => :build
405
- end
406
-
407
- desc "Compile in the the source directory"
408
- task :default => [ :clean, :gemspec, :test ]