ffi-yajl 2.2.0-universal-java → 2.2.1-universal-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/Rakefile +11 -12
- data/bin/ffi-yajl-bench +4 -5
- data/ext/ffi_yajl/ext/dlopen/extconf.rb +1 -0
- data/ext/ffi_yajl/ext/encoder/encoder.c +9 -4
- data/ext/ffi_yajl/ext/encoder/extconf.rb +2 -1
- data/ext/ffi_yajl/ext/parser/extconf.rb +2 -1
- data/ext/ffi_yajl/ext/parser/parser.c +1 -0
- data/lib/ffi_yajl/benchmark.rb +0 -1
- data/lib/ffi_yajl/benchmark/encode.rb +32 -90
- data/lib/ffi_yajl/benchmark/encode_json_and_marshal.rb +14 -14
- data/lib/ffi_yajl/benchmark/encode_json_and_yaml.rb +13 -19
- data/lib/ffi_yajl/benchmark/encode_profile.rb +11 -15
- data/lib/ffi_yajl/benchmark/http.rb +9 -13
- data/lib/ffi_yajl/benchmark/parse.rb +71 -124
- data/lib/ffi_yajl/benchmark/parse_json_and_marshal.rb +17 -17
- data/lib/ffi_yajl/benchmark/parse_json_and_yaml.rb +19 -19
- data/lib/ffi_yajl/benchmark/parse_profile.rb +10 -14
- data/lib/ffi_yajl/benchmark/parse_profile_ruby_prof.rb +11 -16
- data/lib/ffi_yajl/benchmark/parse_stream.rb +17 -17
- data/lib/ffi_yajl/encoder.rb +3 -3
- data/lib/ffi_yajl/ffi.rb +23 -24
- data/lib/ffi_yajl/ffi/encoder.rb +29 -32
- data/lib/ffi_yajl/ffi/parser.rb +30 -37
- data/lib/ffi_yajl/map_library_name.rb +0 -1
- data/lib/ffi_yajl/parser.rb +5 -6
- data/lib/ffi_yajl/version.rb +1 -1
- data/spec/ffi_yajl/encoder_spec.rb +24 -25
- data/spec/ffi_yajl/map_library_name_spec.rb +0 -2
- data/spec/ffi_yajl/parser_spec.rb +54 -56
- data/spec/spec_helper.rb +8 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80f96b6e7e007230b2fddacded3a80394a68257c
|
4
|
+
data.tar.gz: 399e10697124eda792a662aa1c43e4764211e9f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7b3d59115395597da775029b4d96f89cf3ccf26d067b79589b42758dc2076d44025fbc9fa7bfdc4ff13e3cbe67204559b5444f09a69ffed417ce9f92d10b449
|
7
|
+
data.tar.gz: 1cf49ace03a77061306d8e8dd9fe015d1acdaa1be90c6c4100993466006512d0da49438ec63be8962f2dc916487b6a5938267122a4942c1f7a9a780961a1e4cf
|
data/README.md
CHANGED
@@ -45,7 +45,7 @@ Ruby 1.8.7 support was dropped in 2.2.0
|
|
45
45
|
Start by requiring it:
|
46
46
|
|
47
47
|
```ruby
|
48
|
-
require '
|
48
|
+
require 'ffi_yajl'
|
49
49
|
```
|
50
50
|
|
51
51
|
You can encode and parse with class objects:
|
@@ -146,4 +146,3 @@ preserved and this source code has deliberately not been dual licensed under
|
|
146
146
|
Chef's typical Apache License. See the
|
147
147
|
[LICENSE](https://github.com/chef/ffi-yajl/blob/master/LICENSE) file in this
|
148
148
|
project.
|
149
|
-
|
data/Rakefile
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname( __FILE__ ), "lib"))
|
2
2
|
|
3
3
|
require 'rspec/core/rake_task'
|
4
4
|
require 'rubygems/package_task'
|
5
5
|
require 'rake/extensiontask'
|
6
6
|
require 'ffi_yajl/version'
|
7
7
|
|
8
|
-
Dir[File.expand_path("../*gemspec", __FILE__)].
|
8
|
+
Dir[File.expand_path("../*gemspec", __FILE__)].reverse_each do |gemspec_path|
|
9
9
|
gemspec = eval(IO.read(gemspec_path))
|
10
10
|
Gem::PackageTask.new(gemspec).define
|
11
11
|
end
|
12
12
|
|
13
13
|
desc "Build it and ship it"
|
14
|
-
task :
|
14
|
+
task ship: [:clean, :gem] do
|
15
15
|
sh("git tag #{FFI_Yajl::VERSION}")
|
16
16
|
sh("git push --tags")
|
17
|
-
Dir[File.expand_path("../pkg/*.gem", __FILE__)].
|
17
|
+
Dir[File.expand_path("../pkg/*.gem", __FILE__)].reverse_each do |built_gem|
|
18
18
|
sh("gem push #{built_gem}")
|
19
19
|
end
|
20
20
|
end
|
@@ -27,7 +27,7 @@ task :clean do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
desc "install the gem locally"
|
30
|
-
task :
|
30
|
+
task install: [:package] do
|
31
31
|
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
32
32
|
sh %{gem install pkg/#{unix_gemspec.name}-#{unix_gemspec.version}-universal-java.gem}
|
33
33
|
else
|
@@ -123,7 +123,7 @@ if RUBY_VERSION.to_f >= 1.9
|
|
123
123
|
puts "rubocop gem is not installed"
|
124
124
|
end
|
125
125
|
else
|
126
|
-
|
126
|
+
RuboCop::RakeTask.new(:rubocop) do |t|
|
127
127
|
t.fail_on_error = false
|
128
128
|
end
|
129
129
|
end
|
@@ -138,7 +138,7 @@ if RUBY_VERSION.to_f >= 1.9
|
|
138
138
|
else
|
139
139
|
Reek::Rake::Task.new(:reek) do |t|
|
140
140
|
t.fail_on_error = false
|
141
|
-
# t.config_files = '.reek.yml'
|
141
|
+
# t.config_files = '.reek.yml'
|
142
142
|
end
|
143
143
|
end
|
144
144
|
end
|
@@ -161,14 +161,13 @@ else
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
|
165
164
|
desc 'Run all style checks'
|
166
|
-
task :
|
165
|
+
task style: ['style:rubocop', 'style:reek']
|
167
166
|
|
168
167
|
desc 'Run style + spec tests by default on travis'
|
169
|
-
task :
|
168
|
+
task travis: %w{style spec}
|
170
169
|
|
171
170
|
desc 'Run style, spec and test kichen on travis'
|
172
|
-
task :
|
171
|
+
task travis_all: ['style', 'spec', 'integration:cloud']
|
173
172
|
|
174
|
-
task :
|
173
|
+
task default: ['style', 'spec', 'integration:vagrant']
|
data/bin/ffi-yajl-bench
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
$: << File.expand_path(File.join(File.dirname( File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ ), "../lib"))
|
3
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname( File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__ ), "../lib"))
|
5
4
|
|
6
5
|
require 'optparse'
|
7
6
|
require 'ffi_yajl/benchmark'
|
@@ -30,8 +29,8 @@ ENV['FORCE_FFI_YAJL'] = 'ffi' if opts[:ffi]
|
|
30
29
|
ENV['FORCE_FFI_YAJL'] = 'ext' if opts[:ext]
|
31
30
|
|
32
31
|
if opts[:profile]
|
33
|
-
FFI_Yajl::Benchmark::ParseProfileRubyProf.new
|
32
|
+
FFI_Yajl::Benchmark::ParseProfileRubyProf.new.run
|
34
33
|
else
|
35
|
-
FFI_Yajl::Benchmark::Parse.new
|
36
|
-
FFI_Yajl::Benchmark::Encode.new
|
34
|
+
FFI_Yajl::Benchmark::Parse.new.run
|
35
|
+
FFI_Yajl::Benchmark::Encode.new.run
|
37
36
|
end
|
@@ -362,10 +362,15 @@ void Init_encoder() {
|
|
362
362
|
cYajl_Gen = rb_define_class_under(mEncoder, "YajlGen", rb_cObject);
|
363
363
|
rb_define_method(mEncoder, "do_yajl_encode", mEncoder_do_yajl_encode, 3);
|
364
364
|
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
365
|
+
/* use rb_const_get instead of rb_define_class so that we don't get superclass mismatches */
|
366
|
+
ID sym_Date = rb_intern("Date");
|
367
|
+
cDate = rb_const_get(rb_cObject, sym_Date);
|
368
|
+
ID sym_Time = rb_intern("Time");
|
369
|
+
cTime = rb_const_get(rb_cObject, sym_Time);
|
370
|
+
ID sym_DateTime = rb_intern("DateTime");
|
371
|
+
cDateTime = rb_const_get(rb_cObject, sym_DateTime);
|
372
|
+
ID sym_StringIO = rb_intern("StringIO");
|
373
|
+
cStringIO = rb_const_get(rb_cObject, sym_StringIO);
|
369
374
|
|
370
375
|
rb_define_method(rb_cHash, "ffi_yajl", rb_cHash_ffi_yajl, 2);
|
371
376
|
rb_define_method(rb_cArray, "ffi_yajl", rb_cArray_ffi_yajl, 2);
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:disable Style/GlobalVars
|
1
2
|
require 'mkmf'
|
2
3
|
require 'rubygems'
|
3
4
|
require 'libyajl2'
|
@@ -54,7 +55,7 @@ if !windows? && !find_header('yajl/yajl_tree.h')
|
|
54
55
|
dir_config('yajl', HEADER_DIRS, LIB_DIRS)
|
55
56
|
|
56
57
|
# here we use find_library in order to deliberately link with -lyajl as a useful side-effect
|
57
|
-
|
58
|
+
unless find_header('yajl/yajl_tree.h') && find_library('yajl', 'yajl_complete_parse')
|
58
59
|
abort "libyajl2 is missing. please install libyajl2"
|
59
60
|
end
|
60
61
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:disable Style/GlobalVars
|
1
2
|
require 'mkmf'
|
2
3
|
require 'rubygems'
|
3
4
|
require 'libyajl2'
|
@@ -54,7 +55,7 @@ if !windows? && !find_header('yajl/yajl_tree.h')
|
|
54
55
|
dir_config('yajl', HEADER_DIRS, LIB_DIRS)
|
55
56
|
|
56
57
|
# here we use find_library in order to deliberately link with -lyajl as a useful side-effect
|
57
|
-
|
58
|
+
unless find_header('yajl/yajl_tree.h') && find_library('yajl', 'yajl_complete_parse')
|
58
59
|
abort "libyajl2 is missing. please install libyajl2"
|
59
60
|
end
|
60
61
|
end
|
@@ -184,6 +184,7 @@ static VALUE mParser_do_yajl_parse(VALUE self, VALUE str, VALUE yajl_opts) {
|
|
184
184
|
unsigned char *err;
|
185
185
|
volatile CTX ctx;
|
186
186
|
|
187
|
+
rb_ivar_set(self, rb_intern("key"), Qnil);
|
187
188
|
rb_ivar_set(self, rb_intern("stack"), rb_ary_new());
|
188
189
|
rb_ivar_set(self, rb_intern("key_stack"), rb_ary_new());
|
189
190
|
|
data/lib/ffi_yajl/benchmark.rb
CHANGED
@@ -5,14 +5,10 @@ require 'rubygems'
|
|
5
5
|
require 'benchmark'
|
6
6
|
require 'stringio'
|
7
7
|
if !defined?(RUBY_ENGINE) || RUBY_ENGINE !~ /jruby/
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
puts "INFO: yajl-ruby not installed"
|
13
|
-
end
|
14
|
-
else
|
15
|
-
puts "INFO: skipping yajl-ruby because we're using the C extension"
|
8
|
+
begin
|
9
|
+
require 'yajl'
|
10
|
+
rescue LoadError
|
11
|
+
puts "INFO: yajl-ruby not installed"
|
16
12
|
end
|
17
13
|
else
|
18
14
|
puts "INFO: skipping yajl-ruby on jruby"
|
@@ -20,121 +16,67 @@ end
|
|
20
16
|
require 'ffi_yajl'
|
21
17
|
begin
|
22
18
|
require 'json'
|
23
|
-
rescue
|
19
|
+
rescue LoadError
|
24
20
|
puts "INFO: json gem not installed"
|
25
21
|
end
|
26
|
-
begin
|
27
|
-
require 'psych'
|
28
|
-
rescue Exception
|
29
|
-
puts "INFO: psych gem not installed"
|
30
|
-
end
|
31
|
-
begin
|
32
|
-
require 'active_support'
|
33
|
-
rescue Exception
|
34
|
-
puts "INFO: active_support gem not installed"
|
35
|
-
end
|
36
22
|
begin
|
37
23
|
require 'oj'
|
38
|
-
rescue
|
24
|
+
rescue LoadError
|
39
25
|
puts "INFO: oj gem not installed"
|
40
26
|
end
|
41
27
|
|
42
28
|
module FFI_Yajl
|
43
29
|
class Benchmark
|
44
30
|
class Encode
|
45
|
-
|
46
31
|
def run
|
47
|
-
#filename = ARGV[0] || 'benchmark/subjects/ohai.json'
|
32
|
+
# filename = ARGV[0] || 'benchmark/subjects/ohai.json'
|
48
33
|
filename = File.expand_path(File.join(File.dirname(__FILE__), "subjects", "ohai.json"))
|
49
34
|
hash = File.open(filename, 'rb') { |f| FFI_Yajl::Parser.parse(f.read) }
|
50
35
|
|
51
36
|
times = ARGV[1] ? ARGV[1].to_i : 1000
|
52
37
|
puts "Starting benchmark encoding #{filename} #{times} times\n\n"
|
53
|
-
::Benchmark.bmbm
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
output = FFI_Yajl::Encoder.encode(hash)
|
58
|
-
}
|
59
|
-
}
|
38
|
+
::Benchmark.bmbm do |x|
|
39
|
+
x.report("FFI_Yajl::Encoder.encode (to a String)") do
|
40
|
+
times.times { FFI_Yajl::Encoder.encode(hash) }
|
41
|
+
end
|
60
42
|
|
61
43
|
ffi_string_encoder = FFI_Yajl::Encoder.new
|
62
|
-
x.report("FFI_Yajl::Encoder#encode (to a String)")
|
63
|
-
times.times {
|
64
|
-
|
65
|
-
}
|
66
|
-
}
|
44
|
+
x.report("FFI_Yajl::Encoder#encode (to a String)") do
|
45
|
+
times.times { ffi_string_encoder.encode(hash) }
|
46
|
+
end
|
67
47
|
|
68
48
|
if defined?(Oj)
|
69
|
-
x.report("Oj.dump (to a String)")
|
70
|
-
times.times {
|
71
|
-
|
72
|
-
}
|
73
|
-
}
|
49
|
+
x.report("Oj.dump (to a String)") do
|
50
|
+
times.times { Oj.dump(hash) }
|
51
|
+
end
|
74
52
|
end
|
75
53
|
|
76
54
|
if defined?(Yajl::Encoder)
|
77
|
-
x.report("Yajl::Encoder.encode (to a String)")
|
78
|
-
times.times {
|
79
|
-
|
80
|
-
}
|
81
|
-
}
|
55
|
+
x.report("Yajl::Encoder.encode (to a String)") do
|
56
|
+
times.times { Yajl::Encoder.encode(hash) }
|
57
|
+
end
|
82
58
|
|
83
59
|
io_encoder = Yajl::Encoder.new
|
84
|
-
x.report("Yajl::Encoder#encode (to an IO)")
|
85
|
-
times.times {
|
86
|
-
|
87
|
-
}
|
88
|
-
}
|
60
|
+
x.report("Yajl::Encoder#encode (to an IO)") do
|
61
|
+
times.times { io_encoder.encode(hash, StringIO.new) }
|
62
|
+
end
|
89
63
|
|
90
64
|
string_encoder = Yajl::Encoder.new
|
91
|
-
x.report("Yajl::Encoder#encode (to a String)")
|
92
|
-
times.times {
|
93
|
-
|
94
|
-
}
|
95
|
-
}
|
65
|
+
x.report("Yajl::Encoder#encode (to a String)") do
|
66
|
+
times.times { string_encoder.encode(hash) }
|
67
|
+
end
|
96
68
|
end
|
97
69
|
|
98
70
|
if defined?(JSON)
|
99
|
-
x.report("JSON.generate")
|
100
|
-
times.times {
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
x.report("JSON.fast_generate") {
|
105
|
-
times.times {
|
106
|
-
JSON.fast_generate(hash)
|
107
|
-
}
|
108
|
-
}
|
109
|
-
end
|
110
|
-
if defined?(Psych)
|
111
|
-
x.report("Psych.to_json") {
|
112
|
-
times.times {
|
113
|
-
Psych.to_json(hash)
|
114
|
-
}
|
115
|
-
}
|
116
|
-
if defined?(Psych::JSON::Stream)
|
117
|
-
x.report("Psych::JSON::Stream") {
|
118
|
-
times.times {
|
119
|
-
io = StringIO.new
|
120
|
-
stream = Psych::JSON::Stream.new io
|
121
|
-
stream.start
|
122
|
-
stream.push hash
|
123
|
-
stream.finish
|
124
|
-
}
|
125
|
-
}
|
71
|
+
x.report("JSON.generate") do
|
72
|
+
times.times { JSON.generate(hash) }
|
73
|
+
end
|
74
|
+
x.report("JSON.fast_generate") do
|
75
|
+
times.times { JSON.fast_generate(hash) }
|
126
76
|
end
|
127
77
|
end
|
128
|
-
|
129
|
-
# x.report("ActiveSupport::JSON.encode") {
|
130
|
-
# times.times {
|
131
|
-
# ActiveSupport::JSON.encode(hash)
|
132
|
-
# }
|
133
|
-
# }
|
134
|
-
# end
|
135
|
-
}
|
78
|
+
end
|
136
79
|
end
|
137
80
|
end
|
138
81
|
end
|
139
|
-
|
140
82
|
end
|
@@ -17,26 +17,26 @@ hash = Yajl::Parser.new.parse(json)
|
|
17
17
|
json.close
|
18
18
|
|
19
19
|
puts "Starting benchmark encoding #{filename} #{times} times\n\n"
|
20
|
-
Benchmark.bmbm
|
20
|
+
Benchmark.bmbm do |x|
|
21
21
|
encoder = Yajl::Encoder.new
|
22
|
-
x.report
|
22
|
+
x.report do
|
23
23
|
puts "Yajl::Encoder#encode"
|
24
|
-
times.times
|
24
|
+
times.times do
|
25
25
|
encoder.encode(hash, StringIO.new)
|
26
|
-
|
27
|
-
|
26
|
+
end
|
27
|
+
end
|
28
28
|
if defined?(JSON)
|
29
|
-
x.report
|
29
|
+
x.report do
|
30
30
|
puts "JSON's #to_json"
|
31
|
-
times.times
|
31
|
+
times.times do
|
32
32
|
JSON.generate(hash)
|
33
|
-
|
34
|
-
|
33
|
+
end
|
34
|
+
end
|
35
35
|
end
|
36
|
-
x.report
|
36
|
+
x.report do
|
37
37
|
puts "Marshal.dump"
|
38
|
-
times.times
|
38
|
+
times.times do
|
39
39
|
Marshal.dump(hash)
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -18,23 +18,19 @@ json.close
|
|
18
18
|
|
19
19
|
times = ARGV[0] ? ARGV[0].to_i : 1000
|
20
20
|
puts "Starting benchmark encoding #{filename} into JSON #{times} times\n\n"
|
21
|
-
Benchmark.bmbm
|
21
|
+
Benchmark.bmbm do |x|
|
22
22
|
encoder = Yajl::Encoder.new
|
23
|
-
x.report
|
23
|
+
x.report do
|
24
24
|
puts "Yajl::Encoder#encode"
|
25
|
-
times.times {
|
26
|
-
|
27
|
-
}
|
28
|
-
}
|
25
|
+
times.times { encoder.encode(hash, StringIO.new) }
|
26
|
+
end
|
29
27
|
if defined?(JSON)
|
30
|
-
x.report
|
28
|
+
x.report do
|
31
29
|
puts "JSON's #to_json"
|
32
|
-
times.times {
|
33
|
-
|
34
|
-
}
|
35
|
-
}
|
30
|
+
times.times { JSON.generate(hash) }
|
31
|
+
end
|
36
32
|
end
|
37
|
-
|
33
|
+
end
|
38
34
|
|
39
35
|
# YAML Section
|
40
36
|
filename = 'benchmark/subjects/ohai.yml'
|
@@ -43,11 +39,9 @@ data = YAML.load_stream(yml)
|
|
43
39
|
yml.close
|
44
40
|
|
45
41
|
puts "Starting benchmark encoding #{filename} into YAML #{times} times\n\n"
|
46
|
-
Benchmark.bmbm
|
47
|
-
x.report
|
42
|
+
Benchmark.bmbm do |x|
|
43
|
+
x.report do
|
48
44
|
puts "YAML.dump"
|
49
|
-
times.times {
|
50
|
-
|
51
|
-
|
52
|
-
}
|
53
|
-
}
|
45
|
+
times.times { YAML.dump(data, StringIO.new) }
|
46
|
+
end
|
47
|
+
end
|