oj 2.17.2 → 2.17.3

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: fda157680e8bdefb8ada5e768266c624ec23e190
4
- data.tar.gz: 4b19f21033006a9e652be232bbcd7bce56b7f8cf
3
+ metadata.gz: e6db88500e6a8f5b5243b53140952b8956fdad9b
4
+ data.tar.gz: bd67bf4dd52102f84c728f9349a57a79f28cacd8
5
5
  SHA512:
6
- metadata.gz: a61a6aa2f2f1a6c22dc20628fa19519c381eaffcde90e39c1fbb366861cfd7cc06e81ec972dd18d0e08d07805bbaf3c187332a64d28575b51f72eb3c835fd7af
7
- data.tar.gz: ca4a307de685a1d122cfe579ed551627a6e5b78c3045888d0fc1e3d3941d326bf0ec2eb0afa43adbe2ea62afb871eb30b62e68dc44ace762c6ac10273d29c73d
6
+ metadata.gz: a85842674b8da8c33f9526c14a675535da412be6f52ad136f6ba48fad5cadf99ec5810ebc076fbf2e27dbda4758b5432dc697a11cdcbff5d7955482dfea92f9c
7
+ data.tar.gz: d5e3c117f7cea742867e06ca02fdcef961ff6b14c58d9b21979d4df556b780d052bb6de5695ecf9b11d2084091102e752553390bb31d666d6205f39708f52b0b
data/README.md CHANGED
@@ -170,6 +170,11 @@ Oj.default_options = {:mode => :compat }
170
170
 
171
171
  ## Releases
172
172
 
173
+ **Release 2.17.3**
174
+
175
+ - Updated mimic_JSON to monkey patch OpenStruct, Range, Rational, Regexp, Struct, Symbol,
176
+ and Time like the JSON gem does. Also added the JSON.create_id accessor.
177
+
173
178
  **Release 2.17.2**
174
179
 
175
180
  - Worked around a problem with DateTime and ActiveSupport that causes a hang
@@ -1860,7 +1860,7 @@ no_op1(VALUE self, VALUE obj) {
1860
1860
  }
1861
1861
 
1862
1862
  static VALUE
1863
- mimic_create_id(VALUE self, VALUE id) {
1863
+ mimic_set_create_id(VALUE self, VALUE id) {
1864
1864
  Check_Type(id, T_STRING);
1865
1865
 
1866
1866
  if (0 != oj_default_options.create_id) {
@@ -1880,6 +1880,14 @@ mimic_create_id(VALUE self, VALUE id) {
1880
1880
  return id;
1881
1881
  }
1882
1882
 
1883
+ static VALUE
1884
+ mimic_create_id(VALUE self) {
1885
+ if (0 != oj_default_options.create_id) {
1886
+ return oj_encode(rb_str_new_cstr(oj_default_options.create_id));
1887
+ }
1888
+ return rb_str_new_cstr(json_class);
1889
+ }
1890
+
1883
1891
  static struct _Options mimic_object_to_json_options = {
1884
1892
  0, // indent
1885
1893
  No, // circular
@@ -2005,7 +2013,8 @@ define_mimic_json(int argc, VALUE *argv, VALUE self) {
2005
2013
  }
2006
2014
  rb_define_module_function(mimic, "parser=", no_op1, 1);
2007
2015
  rb_define_module_function(mimic, "generator=", no_op1, 1);
2008
- rb_define_module_function(mimic, "create_id=", mimic_create_id, 1);
2016
+ rb_define_module_function(mimic, "create_id=", mimic_set_create_id, 1);
2017
+ rb_define_module_function(mimic, "create_id", mimic_create_id, 0);
2009
2018
 
2010
2019
  rb_define_module_function(mimic, "dump", mimic_dump, -1);
2011
2020
  rb_define_module_function(mimic, "load", mimic_load, -1);
@@ -1,4 +1,10 @@
1
1
 
2
+ begin
3
+ require 'ostruct'
4
+ rescue Exception
5
+ # ignore
6
+ end
7
+
2
8
  module Oj
3
9
 
4
10
  def self.mimic_loaded(mimic_paths=[])
@@ -14,5 +20,107 @@ module Oj
14
20
  end
15
21
  mimic_paths.each { |p| $LOADED_FEATURES << p }
16
22
  $LOADED_FEATURES << 'json' unless $LOADED_FEATURES.include?('json')
23
+
24
+ if Object.const_defined?('OpenStruct')
25
+ OpenStruct.class_eval do
26
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
27
+ unless defined?(self.as_json)
28
+ def as_json(*)
29
+ name = self.class.name.to_s
30
+ raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
31
+ { JSON.create_id => name, 't' => table }
32
+ end
33
+ end
34
+ def self.json_create(h)
35
+ new(h['t'])
36
+ end
37
+ end
38
+ end
39
+
40
+ Range.class_eval do
41
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
42
+ unless defined?(self.as_json)
43
+ def as_json(*)
44
+ {JSON.create_id => 'Range', 'a' => [first, last, exclude_end?]}
45
+ end
46
+ end
47
+ def self.json_create(h)
48
+ new(h['a'])
49
+ end
50
+ end
51
+
52
+ Rational.class_eval do
53
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
54
+ unless defined?(self.as_json)
55
+ def as_json(*)
56
+ {JSON.create_id => 'Rational', 'n' => numerator, 'd' => denominator }
57
+ end
58
+ end
59
+ def self.json_create(h)
60
+ Rational(h['n'], h['d'])
61
+ end
62
+ end
63
+
64
+ Regexp.class_eval do
65
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
66
+ unless defined?(self.as_json)
67
+ def as_json(*)
68
+ {JSON.create_id => 'Regexp', 'o' => options, 's' => source }
69
+ end
70
+ end
71
+ def self.json_create(h)
72
+ new(h['s'], h['o'])
73
+ end
74
+ end
75
+
76
+ Struct.class_eval do
77
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
78
+ unless defined?(self.as_json)
79
+ def as_json(*)
80
+ name = self.class.name.to_s
81
+ raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
82
+ { JSON.create_id => name, 'v' => values }
83
+ end
84
+ end
85
+ def self.json_create(h)
86
+ new(h['v'])
87
+ end
88
+ end
89
+
90
+ Symbol.class_eval do
91
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
92
+ unless defined?(self.as_json)
93
+ def as_json(*)
94
+ {JSON.create_id => 'Symbol', 's' => to_s }
95
+ end
96
+ end
97
+ def self.json_create(h)
98
+ h['s'].to_sym
99
+ end
100
+ end
101
+
102
+ Time.class_eval do
103
+ # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
104
+ unless defined?(self.as_json)
105
+ def as_json(*)
106
+ {JSON.create_id => 'Symbol', 's' => to_s }
107
+ nsecs = [ tv_usec * 1000 ]
108
+ nsecs << tv_nsec if respond_to?(:tv_nsec)
109
+ nsecs = nsecs.max
110
+ { JSON.create_id => 'Time', 's' => tv_sec, 'n' => nsecs }
111
+ end
112
+ end
113
+ def self.json_create(h)
114
+ if usec = h.delete('u')
115
+ h['n'] = usec * 1000
116
+ end
117
+ if instance_methods.include?(:tv_nsec)
118
+ at(h['s'], Rational(h['n'], 1000))
119
+ else
120
+ at(h['s'], h['n'] / 1000)
121
+ end
122
+ end
123
+ end
124
+
17
125
  end
18
126
  end
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Oj
3
3
  # Current version of the module.
4
- VERSION = '2.17.2'
4
+ VERSION = '2.17.3'
5
5
  end
@@ -1,5 +1,11 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ # The rails tests set this to true. Both Rails and the JSON gem monkey patch the
4
+ # as_json methods on several base classes. Depending on which one replaces the
5
+ # method last the behavior will be different. Oj.mimic_JSON abides by the same
6
+ # conflicting behavior and the tests reflect that.
7
+ $rails_monkey = false unless defined?($rails_monkey)
8
+
3
9
  class SharedMimicTest < Minitest::Test
4
10
  class Jam
5
11
  attr_accessor :x, :y
@@ -56,37 +62,66 @@ class SharedMimicTest < Minitest::Test
56
62
  # dump
57
63
  def test_dump_string
58
64
  json = JSON.dump([1, true, nil, @time])
59
- assert_equal(%{[1,true,null,#{@expected_time_string}]}, json)
65
+ if $rails_monkey
66
+ assert_equal(%{[1,true,null,#{@expected_time_string}]}, json)
67
+ else
68
+ assert_equal(%{[1,true,null,{"json_class":"Time","s":1400000000,"n":0}]}, json)
69
+ end
60
70
  end
61
71
 
62
72
  def test_dump_with_options
63
73
  Oj.default_options= {:indent => 2} # JSON this will not change anything
64
74
  json = JSON.dump([1, true, nil, @time])
65
- assert_equal(%{[
75
+ if $rails_monkey
76
+ assert_equal(%{[
66
77
  1,
67
78
  true,
68
79
  null,
69
80
  #{@expected_time_string}
70
81
  ]
71
82
  }, json)
83
+ else
84
+ assert_equal(%{[
85
+ 1,
86
+ true,
87
+ null,
88
+ {
89
+ "json_class":"Time",
90
+ "s":1400000000,
91
+ "n\":0
92
+ }
93
+ ]
94
+ }, json)
95
+ end
72
96
  end
73
97
 
74
98
  def test_dump_io
75
99
  s = StringIO.new()
76
100
  json = JSON.dump([1, true, nil, @time], s)
77
101
  assert_equal(s, json)
78
- assert_equal(%{[1,true,null,#{@expected_time_string}]}, s.string)
102
+ if $rails_monkey
103
+ assert_equal(%{[1,true,null,#{@expected_time_string}]}, s.string)
104
+ else
105
+ assert_equal(%{[1,true,null,{"json_class":"Time","s":1400000000,"n":0}]}, s.string)
106
+ end
79
107
  end
80
108
  # TBD options
81
109
 
82
110
  def test_dump_struct
83
- # anonymous Struct
84
- s = Struct.new(:a, :b, :c)
111
+ # anonymous Struct not supported by json so name it
112
+ if Object.const_defined?("Struct::Abc")
113
+ s = Struct::Abc
114
+ else
115
+ s = Struct.new("Abc", :a, :b, :c)
116
+ end
85
117
  o = s.new(1, 'two', [true, false])
86
118
  json = JSON.dump(o)
87
- # Rails add the as_json method and changes the behavior.
88
119
  if o.respond_to?(:as_json)
89
- assert_equal(%|{"a":1,"b":"two","c":[true,false]}|, json)
120
+ if $rails_monkey
121
+ assert_equal(%|{"a":1,"b":"two","c":[true,false]}|, json)
122
+ else
123
+ assert_equal(%|{"json_class":"Struct::Abc","v":[1,"two",[true,false]]}|, json)
124
+ end
90
125
  else
91
126
  j = '"' + o.to_s.gsub('"', '\\"') + '"'
92
127
  assert_equal(j, json)
File without changes
@@ -16,5 +16,7 @@ Oj.mimic_JSON
16
16
 
17
17
  require 'isolated/shared'
18
18
 
19
+ $rails_monkey = true
20
+
19
21
  class MimicRailsAfter < SharedMimicRailsTest
20
22
  end # MimicRailsAfter
@@ -15,6 +15,7 @@ end
15
15
 
16
16
  require 'isolated/shared'
17
17
 
18
+ $rails_monkey = true
19
+
18
20
  class MimicRailsBefore < SharedMimicRailsTest
19
21
  end # MimicRailsBefore
20
-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oj
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.17.2
4
+ version: 2.17.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-13 00:00:00.000000000 Z
11
+ date: 2016-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler