ffi-yajl 1.1.0 → 1.2.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: c235f85b05fe53002a80aabdbb3fcb9eaef46055
4
- data.tar.gz: b4c886b8c0bdf41a77f1c38b5a7387031b063f2f
3
+ metadata.gz: f424af28e01cb3f1253f61010285bd3811b7a76e
4
+ data.tar.gz: 1008ba36c8873d22d35a50de9fc03a8efb26c803
5
5
  SHA512:
6
- metadata.gz: 3bbddb072b8f2da7e76eac038af416adfadbb765d077bdd54a794246d71bd8051726a5ebb3f4e4178e260ee7cde3f299d16bde585b276432bcdb98cca1a570ea
7
- data.tar.gz: de43d07a727f67bb6c4d1816b813fc2c79531fb65e97e778b0ba41f424feaa3e25fcf7d3b99104c60f672b3e0da91c11a246af2ec1c6059a33bd5e4048b6821b
6
+ metadata.gz: 0094f0e84b108549bf70bc2f4e5e37509ca3a06498201e8a26034f0d2142e52dc023656cd8abab5946d607dce10cec4d080fe50810b3c654662499d11717b1ff
7
+ data.tar.gz: de12c5a201956bcb7b35d5ca71b99e515063c94b181cabe698f9969075dd5c4cb180ded3fba81c8e97dbfa12db88a6d1da15fd0952bc3f622ea0df9c73246ac6
@@ -272,14 +272,20 @@ static VALUE rb_cObject_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
272
272
  yajl_gen_status status;
273
273
  ID sym_to_json = rb_intern("to_json");
274
274
  VALUE str;
275
- VALUE json_opts = rb_hash_aref(state, rb_str_new2("json_opts"));
276
- struct yajl_gen_t *yajl_gen;
277
- Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
278
275
 
279
- str = rb_funcall(self, sym_to_json, 1, json_opts);
280
- CHECK_STATUS(
281
- yajl_gen_number(yajl_gen, (char *)RSTRING_PTR(str), RSTRING_LEN(str))
282
- );
276
+ if ( rb_respond_to(self, sym_to_json) ) {
277
+ VALUE json_opts = rb_hash_aref(state, rb_str_new2("json_opts"));
278
+ struct yajl_gen_t *yajl_gen;
279
+ Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
280
+
281
+ str = rb_funcall(self, sym_to_json, 1, json_opts);
282
+ CHECK_STATUS(
283
+ yajl_gen_number(yajl_gen, (char *)RSTRING_PTR(str), RSTRING_LEN(str))
284
+ );
285
+ } else {
286
+ object_to_s_ffi_yajl(self, rb_yajl_gen, state);
287
+ }
288
+
283
289
  return Qnil;
284
290
  }
285
291
 
data/lib/ffi_yajl/ext.rb CHANGED
@@ -10,6 +10,8 @@ module FFI_Yajl
10
10
  # FIXME: extract map_library_name from FFI and stop requiring it at the top level
11
11
  # so that the C-library can be installed without FFI
12
12
  libname = ::FFI.map_library_name("yajl")
13
+ # awful windows patch, but there is an open issue to entirely replace FFI.map_library_name already
14
+ libname = "libyajl.so" if libname == "yajl.dll"
13
15
  libpath = File.expand_path(File.join(Libyajl2.opt_path, libname))
14
16
  libpath.gsub!(/dylib/, 'bundle')
15
17
  libpath = ::FFI.map_library_name("yajl") unless File.exist?(libpath)
@@ -48,7 +50,7 @@ module FFI_Yajl
48
50
  extend ::FFI::Library
49
51
  ffi_lib 'dl'
50
52
  attach_function 'dlopen', :dlopen, [:string, :int], :void
51
- if Config::CONFIG['host_os'] =~ /linux/i
53
+ if RbConfig::CONFIG['host_os'] =~ /linux/i
52
54
  dlopen libpath, 0x102 # linux: RTLD_GLOBAL | RTLD_NOW
53
55
  else
54
56
  dlopen libpath, 0
data/lib/ffi_yajl/ffi.rb CHANGED
@@ -7,6 +7,8 @@ module FFI_Yajl
7
7
  extend ::FFI::Library
8
8
 
9
9
  libname = ::FFI.map_library_name("yajl")
10
+ # XXX: need to replace ::FFI.map_library_name here as well
11
+ libname = "libyajl.so" if libname == "yajl.dll"
10
12
  libpath = File.expand_path(File.join(Libyajl2.opt_path, libname))
11
13
  libpath.gsub!(/dylib/, 'bundle')
12
14
 
@@ -201,8 +201,15 @@ end
201
201
  # I feel dirty
202
202
  class Object
203
203
  def ffi_yajl(yajl_gen, state)
204
- json = self.to_json(state[:json_opts])
205
- if ( status = FFI_Yajl.yajl_gen_number(yajl_gen, json, json.bytesize) ) != 0
204
+ if self.respond_to?(:to_json)
205
+ json = self.to_json(state[:json_opts])
206
+ # #yajl_gen_number outputs a string without quotes around it
207
+ status = FFI_Yajl.yajl_gen_number(yajl_gen, json, json.bytesize)
208
+ else
209
+ str = self.to_s
210
+ status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize)
211
+ end
212
+ if ( status ) != 0
206
213
  FFI_Yajl::Encoder.raise_error_for_status(status)
207
214
  end
208
215
  end
@@ -1,3 +1,3 @@
1
1
  module FFI_Yajl
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -87,4 +87,21 @@ describe "FFI_Yajl::Encoder" do
87
87
  expect(encoder.encode(ruby)).to eq( %q{"2001-02-03T04:05:06+07:00"} )
88
88
  end
89
89
 
90
+ describe "testing .to_json for Objects" do
91
+ class NoToJson; end
92
+ class HasToJson
93
+ def to_json(*args)
94
+ "{}"
95
+ end
96
+ end
97
+
98
+ it "calls .to_s for objects without .to_json" do
99
+ expect(encoder.encode(NoToJson.new)).to match(/^"#<NoToJson:\w+>"$/)
100
+ end
101
+
102
+ it "calls .to_json for objects wit .to_json" do
103
+ expect(encoder.encode(HasToJson.new)).to eq("{}")
104
+ end
105
+ end
106
+
90
107
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-yajl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lamont Granquist
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-26 00:00:00.000000000 Z
11
+ date: 2014-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake