Skip to content

Commit 92c91e2

Browse files
authored
Merge pull request #565 from flori/optional-ostruct
Make OpenStruct support as optional
2 parents 7864324 + 202ffe2 commit 92c91e2

File tree

5 files changed

+50
-39
lines changed

5 files changed

+50
-39
lines changed

lib/json/add/ostruct.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
33
require 'json'
44
end
5-
require 'ostruct'
5+
begin
6+
require 'ostruct'
7+
rescue LoadError
8+
end
69

710
class OpenStruct
811

@@ -48,4 +51,4 @@ def as_json(*)
4851
def to_json(*args)
4952
as_json.to_json(*args)
5053
end
51-
end
54+
end if defined?(::OpenStruct)

lib/json/generic_object.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#frozen_string_literal: false
2-
require 'ostruct'
2+
begin
3+
require 'ostruct'
4+
rescue LoadError
5+
end
36

47
module JSON
58
class GenericObject < OpenStruct
@@ -67,5 +70,5 @@ def as_json(*)
6770
def to_json(*a)
6871
as_json.to_json(*a)
6972
end
70-
end
73+
end if defined?(::OpenStruct)
7174
end

tests/json_addition_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def test_ostruct
190190
# XXX this won't work; o.foo = { :bar => true }
191191
o.foo = { 'bar' => true }
192192
assert_equal o, parse(JSON(o), :create_additions => true)
193-
end
193+
end if defined?(::OpenStruct)
194194

195195
def test_set
196196
s = Set.new([:a, :b, :c, :a])

tests/json_generic_object_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,4 @@ def switch_json_creatable
7979
ensure
8080
JSON::GenericObject.json_creatable = false
8181
end
82-
end
82+
end if defined?(JSON::GenericObject)

tests/json_parser_test.rb

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
require_relative 'test_helper'
44
require 'stringio'
55
require 'tempfile'
6-
require 'ostruct'
6+
begin
7+
require 'ostruct'
8+
rescue LoadError
9+
end
710
begin
811
require 'bigdecimal'
912
rescue LoadError
@@ -412,46 +415,48 @@ def self.json_create(o)
412415
end
413416
end
414417

415-
class SubOpenStruct < OpenStruct
416-
def [](k)
417-
__send__(k)
418-
end
419-
420-
def []=(k, v)
421-
@item_set = true
422-
__send__("#{k}=", v)
423-
end
424-
425-
def item_set?
426-
@item_set
427-
end
428-
end
429-
430418
def test_parse_object_custom_hash_derived_class
431419
res = parse('{"foo":"bar"}', :object_class => SubHash)
432420
assert_equal({"foo" => "bar"}, res)
433421
assert_equal(SubHash, res.class)
434422
assert res.item_set?
435423
end
436424

437-
def test_parse_object_custom_non_hash_derived_class
438-
res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
439-
assert_equal "bar", res.foo
440-
assert_equal(SubOpenStruct, res.class)
441-
assert res.item_set?
442-
end
425+
if defined?(::OpenStruct)
426+
class SubOpenStruct < OpenStruct
427+
def [](k)
428+
__send__(k)
429+
end
443430

444-
def test_parse_generic_object
445-
res = parse(
446-
'{"foo":"bar", "baz":{}}',
447-
:object_class => JSON::GenericObject
448-
)
449-
assert_equal(JSON::GenericObject, res.class)
450-
assert_equal "bar", res.foo
451-
assert_equal "bar", res["foo"]
452-
assert_equal "bar", res[:foo]
453-
assert_equal "bar", res.to_hash[:foo]
454-
assert_equal(JSON::GenericObject, res.baz.class)
431+
def []=(k, v)
432+
@item_set = true
433+
__send__("#{k}=", v)
434+
end
435+
436+
def item_set?
437+
@item_set
438+
end
439+
end
440+
441+
def test_parse_object_custom_non_hash_derived_class
442+
res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
443+
assert_equal "bar", res.foo
444+
assert_equal(SubOpenStruct, res.class)
445+
assert res.item_set?
446+
end
447+
448+
def test_parse_generic_object
449+
res = parse(
450+
'{"foo":"bar", "baz":{}}',
451+
:object_class => JSON::GenericObject
452+
)
453+
assert_equal(JSON::GenericObject, res.class)
454+
assert_equal "bar", res.foo
455+
assert_equal "bar", res["foo"]
456+
assert_equal "bar", res[:foo]
457+
assert_equal "bar", res.to_hash[:foo]
458+
assert_equal(JSON::GenericObject, res.baz.class)
459+
end
455460
end
456461

457462
def test_generate_core_subclasses_with_new_to_json

0 commit comments

Comments
 (0)