skn_utils 2.0.6 → 3.0.0
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/.ruby-version +1 -1
- data/README.md +108 -149
- data/README.rdoc +130 -161
- data/bin/console +8 -0
- data/lib/skn_utils/exploring/configuration.rb +6 -6
- data/lib/skn_utils/nested_result.rb +382 -0
- data/lib/skn_utils/notifier_base.rb +94 -0
- data/lib/skn_utils/version.rb +2 -2
- data/lib/skn_utils.rb +1 -6
- data/skn_utils.gemspec +4 -20
- data/spec/lib/skn_utils/nested_result_spec.rb +268 -0
- data/spec/spec_helper.rb +2 -1
- metadata +27 -36
- data/lib/skn_utils/attribute_helpers.rb +0 -188
- data/lib/skn_utils/generic_bean.rb +0 -20
- data/lib/skn_utils/nested_result_base.rb +0 -123
- data/lib/skn_utils/page_controls.rb +0 -21
- data/lib/skn_utils/result_bean.rb +0 -17
- data/lib/skn_utils/value_bean.rb +0 -20
- data/spec/lib/skn_utils/generic_bean_spec.rb +0 -96
- data/spec/lib/skn_utils/page_controls_spec.rb +0 -124
- data/spec/lib/skn_utils/result_bean_spec.rb +0 -98
- data/spec/lib/skn_utils/value_bean_spec.rb +0 -96
- data/spec/support/shared_example_marshalable_ruby_pojo.rb +0 -54
- data/spec/support/shared_example_ruby_pojo.rb +0 -60
@@ -1,123 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# <project.root>/lib/skn_utils/nested_result_base.rb
|
3
|
-
#
|
4
|
-
# Creates an Object with instance variables and associated getters and setters for hash each input key.
|
5
|
-
# If the key's value is also a hash itself, it too will become an Object.
|
6
|
-
# if the key's value is a Array of Hashes, each element of the Array will become an Object.
|
7
|
-
#
|
8
|
-
# This nesting action is controlled by the value of the option key ':depth'.
|
9
|
-
# The key :depth defaults to :multi, an has options of :single, or :multi_with_arrays
|
10
|
-
#
|
11
|
-
# The ability of the resulting Object to be Marshalled(dump/load) can be preserved by merging
|
12
|
-
# input params key ':enable_serialization' set to true. It defaults to false for speed purposes
|
13
|
-
#
|
14
|
-
##
|
15
|
-
# Operational Options
|
16
|
-
# --------------------------------
|
17
|
-
# :enable_serialization = false -- [ true | false ], for speed, omits creation of attr_accessor
|
18
|
-
# :depth = :multi -- [ :single | :multi | :multi_with_arrays ]
|
19
|
-
##
|
20
|
-
# NOTE: Cannot be Marshalled/Serialized unless input params.merge({enable_serialization: true}) -- default is false
|
21
|
-
# Use GenericBean if serialization is needed, it sets this value to true automatically
|
22
|
-
##
|
23
|
-
|
24
|
-
|
25
|
-
module SknUtils
|
26
|
-
|
27
|
-
class NestedResultBase
|
28
|
-
include AttributeHelpers
|
29
|
-
|
30
|
-
# :depth controls how deep into input hash/arrays we convert
|
31
|
-
# :depth => :single | :multi | :multi_with_arrays
|
32
|
-
# :depth defaults to :multi
|
33
|
-
# :enable_serialization controls the use of singleton_method() to preserve the ability to Marshal
|
34
|
-
# :enable_serialization defaults to false
|
35
|
-
#:nodoc:
|
36
|
-
def initialize(params={})
|
37
|
-
@skn_enabled_depth = params.delete(:depth) {|not_found| :multi }
|
38
|
-
@skn_enable_serialization = params.delete(:enable_serialization) {|not_found| false }
|
39
|
-
case @skn_enabled_depth
|
40
|
-
when :single
|
41
|
-
single_level_initializer(params)
|
42
|
-
when :multi_with_arrays
|
43
|
-
multi_level_incl_arrays_initializer(params)
|
44
|
-
else
|
45
|
-
multi_level_initializer(params)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
#:nodoc:
|
50
|
-
def single_level_initializer(params={}) # Single Level Initializer -- ignore value eql hash
|
51
|
-
params.each do |k,v|
|
52
|
-
key = clean_key(k)
|
53
|
-
singleton_class.send(:attr_accessor, key) unless respond_to?(key) or serialization_required?
|
54
|
-
instance_variable_set("@#{key}".to_sym,v)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
#:nodoc:
|
59
|
-
def multi_level_initializer(params={}) # Multi Level Initializer -- value eql hash then interate
|
60
|
-
params.each do |k,v|
|
61
|
-
key = clean_key(k)
|
62
|
-
singleton_class.send(:attr_accessor, key) unless respond_to?(key) or serialization_required?
|
63
|
-
if v.kind_of?(Hash)
|
64
|
-
instance_variable_set("@#{key}".to_sym, self.class.new(v))
|
65
|
-
else
|
66
|
-
instance_variable_set("@#{key}".to_sym,v)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
#:nodoc:
|
72
|
-
def multi_level_incl_arrays_initializer(params={}) # Multi Level Initializer including Arrays of Hashes
|
73
|
-
params.each do |k,v|
|
74
|
-
key = clean_key(k)
|
75
|
-
singleton_class.send(:attr_accessor, key) unless respond_to?(key) or serialization_required?
|
76
|
-
if v.kind_of?(Array) and v.first.kind_of?(Hash)
|
77
|
-
instance_variable_set("@#{key}".to_sym, (v.map {|nobj| self.class.new(nobj)}) )
|
78
|
-
elsif v.kind_of?(Hash)
|
79
|
-
instance_variable_set("@#{key}".to_sym, self.class.new(v))
|
80
|
-
else
|
81
|
-
instance_variable_set("@#{key}".to_sym,v)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# enablement for latter additions
|
87
|
-
def serialization_required?
|
88
|
-
@skn_enable_serialization
|
89
|
-
end
|
90
|
-
|
91
|
-
# enablement for latter additions
|
92
|
-
def depth_level
|
93
|
-
@skn_enabled_depth
|
94
|
-
end
|
95
|
-
|
96
|
-
# determines if this is one of our objects
|
97
|
-
#:nodoc:
|
98
|
-
def attribute_helper_object
|
99
|
-
true
|
100
|
-
end
|
101
|
-
|
102
|
-
# Some keys have chars not suitable for symbol keys => @,#,:,-
|
103
|
-
#:nodoc:
|
104
|
-
def clean_key(original)
|
105
|
-
formatted_key = original.to_s.gsub(/[#|@]/,'').gsub(/[:|-]/,'_')
|
106
|
-
|
107
|
-
# if /^[#|@|:]/.match(formatted_key) # filter out (@xsi) from '@xsi:type' keys
|
108
|
-
# label = /@(.+):(.+)/.match(formatted_key) || /[#|@|:](.+)/.match(formatted_key) || []
|
109
|
-
# formatted_key = case label.size
|
110
|
-
# when 1
|
111
|
-
# label[1].to_s
|
112
|
-
# when 2
|
113
|
-
# "#{label[1]}_#{label[2]}"
|
114
|
-
# else
|
115
|
-
# original # who knows what it was, give it back
|
116
|
-
# end
|
117
|
-
# end
|
118
|
-
# formatted_key
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
end
|
123
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# <project.root>/lib/skn_utils/page_controls.rb
|
3
|
-
#
|
4
|
-
# *** See SknUtils::NestedResultBase for details ***
|
5
|
-
#
|
6
|
-
##
|
7
|
-
# (Defaults)
|
8
|
-
# :enable_serialization = true -- for function
|
9
|
-
# :depth = :multi_with_arrays
|
10
|
-
##
|
11
|
-
|
12
|
-
module SknUtils
|
13
|
-
|
14
|
-
class PageControls < NestedResultBase
|
15
|
-
#:nodoc:
|
16
|
-
def initialize(params={})
|
17
|
-
super( params.merge({enable_serialization: true, depth: :multi_with_arrays}) )
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# <project.root>/lib/skn_utils/result_bean.rb
|
3
|
-
#
|
4
|
-
# *** See SknUtils::NestedResultBase for details ***
|
5
|
-
#
|
6
|
-
##
|
7
|
-
# (Defaults)
|
8
|
-
# :enable_serialization = false -- for speed
|
9
|
-
# :depth = :multi
|
10
|
-
##
|
11
|
-
|
12
|
-
module SknUtils
|
13
|
-
|
14
|
-
class ResultBean < NestedResultBase
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
data/lib/skn_utils/value_bean.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# <project.root>/lib/skn_utils/generic_bean.rb
|
3
|
-
#
|
4
|
-
# *** See SknUtils::NestedResultBase for details ***
|
5
|
-
#
|
6
|
-
##
|
7
|
-
# (Defaults)
|
8
|
-
# :enable_serialization = true
|
9
|
-
# :depth = :single
|
10
|
-
|
11
|
-
module SknUtils
|
12
|
-
|
13
|
-
class ValueBean < NestedResultBase
|
14
|
-
#:nodoc:
|
15
|
-
def initialize(params={})
|
16
|
-
super( params.merge({enable_serialization: true, depth: :single}) )
|
17
|
-
end
|
18
|
-
end # end class
|
19
|
-
|
20
|
-
end # end module
|
@@ -1,96 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# spec/lib/skn_utils/generic_bean_spec.rb
|
3
|
-
#
|
4
|
-
|
5
|
-
RSpec.describe SknUtils::GenericBean, "Generic Marshal'able Bean class " do
|
6
|
-
let(:object) {
|
7
|
-
SknUtils::GenericBean.new({one: "one",
|
8
|
-
two: "two",
|
9
|
-
three: {four: 4, five: 5, six: {seven: 7, eight: "eight" }},
|
10
|
-
four: {any_key: "any value"}, five: []}
|
11
|
-
)
|
12
|
-
}
|
13
|
-
|
14
|
-
context "Internal Operations, assuming :dept => :multi and enable_serialization => true" do
|
15
|
-
it "Creates an empty bean if no params are passed" do
|
16
|
-
is_expected.to be
|
17
|
-
end
|
18
|
-
it "Can be Marshalled after dynamically adding a key/value." do
|
19
|
-
expect { object.fifty = {any_key: "any value"} }.not_to raise_error
|
20
|
-
expect { object.sixty = 60 }.not_to raise_error
|
21
|
-
dmp = obj = ""
|
22
|
-
expect { dmp = Marshal.dump(object) }.not_to raise_error
|
23
|
-
expect { obj = Marshal.load(dmp) }.not_to raise_error
|
24
|
-
expect(obj).to be_a(SknUtils::GenericBean)
|
25
|
-
expect(obj.fifty.any_key).to eql "any value"
|
26
|
-
expect(obj.sixty).to eql 60
|
27
|
-
end
|
28
|
-
it "Initializes from a hash" do
|
29
|
-
expect(SknUtils::GenericBean.new({one: "one", two: "two"})).to be
|
30
|
-
end
|
31
|
-
it "Does not modify the base class, only singleton instance methods" do
|
32
|
-
obj1 = SknUtils::GenericBean.new({one: "one", two: "two"})
|
33
|
-
obj2 = SknUtils::GenericBean.new({three: "3", four: "4"})
|
34
|
-
expect(obj1.one).to eql "one"
|
35
|
-
expect(obj2.three).to eql "3"
|
36
|
-
expect(obj2.one?).to be false
|
37
|
-
expect(obj1.three?).to be false
|
38
|
-
expect { obj1.three }.to raise_error NoMethodError
|
39
|
-
expect { obj2.one }.to raise_error NoMethodError
|
40
|
-
end
|
41
|
-
it "Supports - respond_to? - method, because it has accessors or method_missing coverage" do
|
42
|
-
expect(object).to respond_to(:one)
|
43
|
-
expect(object.one).to eql "one"
|
44
|
-
expect{ object.fifty = {any_key: "any value"} }.not_to raise_error
|
45
|
-
expect( object.fifty).to respond_to(:any_key)
|
46
|
-
end
|
47
|
-
it "nest objects if multi-level hash is given" do
|
48
|
-
expect(object.one).to be_eql("one")
|
49
|
-
expect(object.two).to be_eql("two")
|
50
|
-
expect(object.three).to be_a(SknUtils::GenericBean)
|
51
|
-
expect(object.three.five).to eq(5)
|
52
|
-
end
|
53
|
-
it "#attributes method returns a hash of all attributes and their values." do
|
54
|
-
expect(object.to_hash).to be_a(Hash)
|
55
|
-
expect(object.to_hash[:one]).to be_eql("one")
|
56
|
-
expect(object.to_hash[:three]).to be_a(Hash)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
shared_examples_for "retains initialization options" do
|
61
|
-
it "retains depth_level option flag" do
|
62
|
-
expect(@obj.depth_level).to eql(:multi)
|
63
|
-
end
|
64
|
-
it "retains serialization option flag" do
|
65
|
-
expect(@obj.serialization_required?).to be true
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context "Basic Operations without marshaling " do
|
70
|
-
before :each do
|
71
|
-
@obj = object
|
72
|
-
end
|
73
|
-
|
74
|
-
it_behaves_like "retains initialization options"
|
75
|
-
it_behaves_like "marshalable ruby pojo"
|
76
|
-
end
|
77
|
-
context "Basic Operations after Yaml marshaling " do
|
78
|
-
before :each do
|
79
|
-
dmp = YAML::dump(object)
|
80
|
-
@obj = YAML::load(dmp)
|
81
|
-
end
|
82
|
-
|
83
|
-
it_behaves_like "retains initialization options"
|
84
|
-
it_behaves_like "marshalable ruby pojo"
|
85
|
-
end
|
86
|
-
context "Basic Operations after Marshal marshaling " do
|
87
|
-
before :each do
|
88
|
-
dmp = Marshal.dump(object)
|
89
|
-
@obj = Marshal.load(dmp)
|
90
|
-
end
|
91
|
-
|
92
|
-
it_behaves_like "retains initialization options"
|
93
|
-
it_behaves_like "marshalable ruby pojo"
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
@@ -1,124 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# spec/lib/skn_utils/generic_bean_spec.rb
|
3
|
-
#
|
4
|
-
|
5
|
-
RSpec.describe SknUtils::PageControls, "PageControls Marshal'able Bean class " do
|
6
|
-
let(:object) {
|
7
|
-
SknUtils::PageControls.new({one: "one",
|
8
|
-
two: "two",
|
9
|
-
three: {four: 4, five: 5, six: {seven: 7, eight: "eight" }},
|
10
|
-
four: {any_key: "any value"},
|
11
|
-
five: [],
|
12
|
-
six: [{any_key: "any value"},
|
13
|
-
{four: 4,
|
14
|
-
five: 5,
|
15
|
-
six: {seven: 7, eight: "eight" },
|
16
|
-
twenty:[{seven: 7, eight: 8 }, {nine: 9, ten: 10 }]
|
17
|
-
}
|
18
|
-
]
|
19
|
-
})
|
20
|
-
}
|
21
|
-
|
22
|
-
context "Internal Operations, assuming :dept => :multi_with_arrays and enable_serialization => true" do
|
23
|
-
it "Creates an empty bean if no params are passed" do
|
24
|
-
is_expected.to be
|
25
|
-
end
|
26
|
-
it "Can be Marshalled after dynamically adding a key/value." do
|
27
|
-
expect { object.fifty = {any_key: "any value"} }.not_to raise_error
|
28
|
-
expect { object.sixty = 60 }.not_to raise_error
|
29
|
-
dmp = obj = ""
|
30
|
-
expect { dmp = Marshal.dump(object) }.not_to raise_error
|
31
|
-
expect { obj = Marshal.load(dmp) }.not_to raise_error
|
32
|
-
expect(obj).to be_a(SknUtils::PageControls)
|
33
|
-
expect( obj.fifty.any_key).to eql "any value"
|
34
|
-
expect( obj.sixty).to eql 60
|
35
|
-
end
|
36
|
-
it "Initializes from a hash" do
|
37
|
-
expect(object).to be
|
38
|
-
end
|
39
|
-
it "Does not modify the base class, only singleton instance methods" do
|
40
|
-
obj1 = SknUtils::PageControls.new({one: "one", two: "two"})
|
41
|
-
obj2 = SknUtils::PageControls.new({three: "3", four: "4"})
|
42
|
-
expect(obj1.one).to eql "one"
|
43
|
-
expect(obj2.three).to eql "3"
|
44
|
-
expect(obj2.one?).to be false
|
45
|
-
expect(obj1.three?).to be false
|
46
|
-
expect { obj1.three }.to raise_error NoMethodError
|
47
|
-
expect { obj2.one }.to raise_error NoMethodError
|
48
|
-
end
|
49
|
-
it "Supports predicates(?)" do
|
50
|
-
expect(object.one?).to be true
|
51
|
-
expect(object.three.five?).to be true
|
52
|
-
expect(object.fourtyfive?).to be false
|
53
|
-
end
|
54
|
-
it "Supports - respond_to? - method, because it has accessor or method_missing coverage" do
|
55
|
-
expect(object).to respond_to(:one)
|
56
|
-
expect(object.one).to eql "one"
|
57
|
-
end
|
58
|
-
it "nest objects if multi-level hash is given" do
|
59
|
-
expect(object.three).to be_a(SknUtils::PageControls)
|
60
|
-
expect(object.three.five).to eq(5)
|
61
|
-
end
|
62
|
-
it "nest objects if multi-level array of hashes is given" do
|
63
|
-
expect(object.six).to be_a(Array)
|
64
|
-
expect(object.six.first).to be_a(SknUtils::PageControls)
|
65
|
-
expect(object.six.last).to be_a(SknUtils::PageControls)
|
66
|
-
expect(object.six.last.six.eight).to eq('eight')
|
67
|
-
end
|
68
|
-
it "nest objects if multi-level array of hashes, and an element contains another array of hashes, is given" do
|
69
|
-
expect(object.six.first).to be_a(SknUtils::PageControls)
|
70
|
-
expect(object.six).to be_a(Array)
|
71
|
-
expect(object.six.last.twenty).to be_a(Array)
|
72
|
-
expect(object.six.last.twenty.first).to be_a(SknUtils::PageControls)
|
73
|
-
expect(object.six.last.twenty.last).to be_a(SknUtils::PageControls)
|
74
|
-
expect(object.six.last.twenty.first.eight).to eq(8)
|
75
|
-
expect(object.six.last.twenty.last.ten).to eq(10)
|
76
|
-
end
|
77
|
-
it "nest arrays of objects if array of hashes is dynamically given (post-create)" do
|
78
|
-
expect { object.one_array = [{one: "one", two: "two"},{one: 1, two: 2}] }.not_to raise_error
|
79
|
-
expect(object.one_array.first.one).to eql("one")
|
80
|
-
expect(object.one_array.last.two).to eql(2)
|
81
|
-
expect(object.one_array[0]).to be_a(SknUtils::PageControls)
|
82
|
-
end
|
83
|
-
it "#attributes method returns a hash of all attributes and their values." do
|
84
|
-
expect(object.to_hash).to be_a(Hash)
|
85
|
-
expect(object.to_hash[:one]).to be_eql("one")
|
86
|
-
expect(object.to_hash[:three]).to be_a(Hash)
|
87
|
-
expect(object.to_hash[:six].last[:six][:eight]).to eql('eight')
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
shared_examples_for "retains initialization options" do
|
92
|
-
it "retains depth_level option flag" do
|
93
|
-
expect(@obj.depth_level).to eql(:multi_with_arrays)
|
94
|
-
end
|
95
|
-
it "retains serialization option flag" do
|
96
|
-
expect(@obj.serialization_required?).to be true
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "Basic Operations without marshaling " do
|
101
|
-
before :each do
|
102
|
-
@obj = object
|
103
|
-
end
|
104
|
-
it_behaves_like "retains initialization options"
|
105
|
-
it_behaves_like "marshalable ruby pojo"
|
106
|
-
end
|
107
|
-
context "Basic Operations after Yaml marshaling " do
|
108
|
-
before :each do
|
109
|
-
dmp = YAML::dump(object)
|
110
|
-
@obj = YAML::load(dmp)
|
111
|
-
end
|
112
|
-
it_behaves_like "retains initialization options"
|
113
|
-
it_behaves_like "marshalable ruby pojo"
|
114
|
-
end
|
115
|
-
context "Basic Operations after Marshal marshaling " do
|
116
|
-
before :each do
|
117
|
-
dmp = Marshal.dump(object)
|
118
|
-
@obj = Marshal.load(dmp)
|
119
|
-
end
|
120
|
-
it_behaves_like "retains initialization options"
|
121
|
-
it_behaves_like "marshalable ruby pojo"
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
@@ -1,98 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# spec/lib/skn_utils/result_bean_spec.rb
|
3
|
-
#
|
4
|
-
|
5
|
-
RSpec.describe SknUtils::ResultBean, "Result Bean class - Basic usage." do
|
6
|
-
let(:object) {
|
7
|
-
SknUtils::ResultBean.new({one: "one",
|
8
|
-
two: "two",
|
9
|
-
three: {four: 4, five: 5, six: {seven: 7, eight: "eight" }},
|
10
|
-
four: {any_key: "any value"},
|
11
|
-
five: [],
|
12
|
-
six: [{four: 4, five: 5, six: {seven: 7, eight: "eight" }},
|
13
|
-
{four: 4, five: 5, six: {nine: 9, ten: "ten" }}
|
14
|
-
]
|
15
|
-
})
|
16
|
-
}
|
17
|
-
|
18
|
-
context "Internal Operations, assuming :dept => :multi and enable_serialization => false" do
|
19
|
-
it "Creates an empty bean if no params are passed" do
|
20
|
-
is_expected.to be
|
21
|
-
end
|
22
|
-
it "Initializes from a hash" do
|
23
|
-
expect(SknUtils::ResultBean.new({one: "one", two: "two"})).to be
|
24
|
-
end
|
25
|
-
it "Does not modify the base class, only singleton instance methods" do
|
26
|
-
obj1 = SknUtils::ResultBean.new({one: "one", two: "two"})
|
27
|
-
obj2 = SknUtils::ResultBean.new({three: 3, four: "4"})
|
28
|
-
expect(obj1.one).to eql "one"
|
29
|
-
expect(obj2.three).to eql 3
|
30
|
-
expect(obj2.one?).to be false
|
31
|
-
expect(obj1.three?).to be false
|
32
|
-
expect { obj1.three }.to raise_error NoMethodError
|
33
|
-
expect { obj2.one }.to raise_error NoMethodError
|
34
|
-
end
|
35
|
-
it "Supports - respond_to - methods, because it has accessor methods" do
|
36
|
-
expect(object).to respond_to(:one)
|
37
|
-
end
|
38
|
-
it "Supports - respond_to - methods, because it has respond_to_missing? method" do
|
39
|
-
expect(object.method(:one)).to be
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
shared_examples_for "retains initialization options" do
|
44
|
-
it "retains depth_level option flag" do
|
45
|
-
expect(@obj.depth_level).to eql(:multi)
|
46
|
-
end
|
47
|
-
it "retains serialization option flag" do
|
48
|
-
expect(@obj.serialization_required?).to be false
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "Basic Operations after Marshal marshaling " do
|
53
|
-
it "Singleton objects (like ResultBean) cannot be marshaled" do
|
54
|
-
expect { Marshal.dump(object) }.to raise_error TypeError
|
55
|
-
end
|
56
|
-
end
|
57
|
-
context "Basic Operations without marshaling " do
|
58
|
-
before :each do
|
59
|
-
@obj = object
|
60
|
-
end
|
61
|
-
it_behaves_like "retains initialization options"
|
62
|
-
it_behaves_like "ruby pojo"
|
63
|
-
end
|
64
|
-
context "Basic Operations after Yaml marshaling " do
|
65
|
-
before :each do
|
66
|
-
dmp = YAML::dump(object)
|
67
|
-
@obj = YAML::load(dmp)
|
68
|
-
end
|
69
|
-
it_behaves_like "retains initialization options"
|
70
|
-
it_behaves_like "ruby pojo"
|
71
|
-
end
|
72
|
-
context "ResultBeans stripped of their internal singleton accessors can be Marshaled! " do
|
73
|
-
before :each do
|
74
|
-
dmp = YAML::dump(object)
|
75
|
-
obj = YAML::load(dmp) # Yaml'ing removes singleton accessor methods'
|
76
|
-
# by initializing object without using its
|
77
|
-
# initialize() method
|
78
|
-
|
79
|
-
dmp = Marshal.dump(obj) # Now Marshal load/dump will work
|
80
|
-
@obj = Marshal.load(dmp) # Use GenericBean if Marshal support is needed
|
81
|
-
end
|
82
|
-
it_behaves_like "retains initialization options"
|
83
|
-
it_behaves_like "ruby pojo"
|
84
|
-
end
|
85
|
-
context "Basic Operations after Yaml marshaling via restored accessors " do
|
86
|
-
before :each do
|
87
|
-
dmp = YAML::dump(object)
|
88
|
-
@obj = YAML::load(dmp)
|
89
|
-
# Restore setters
|
90
|
-
# @obj.attributes.keys.each do |k|
|
91
|
-
# @obj.singleton_class.send(:attr_accessor, k)
|
92
|
-
# end
|
93
|
-
end
|
94
|
-
it_behaves_like "retains initialization options"
|
95
|
-
it_behaves_like "ruby pojo"
|
96
|
-
end
|
97
|
-
|
98
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# spec/lib/skn_utils/Value_bean_spec.rb
|
3
|
-
#
|
4
|
-
|
5
|
-
RSpec.describe SknUtils::ValueBean, "Basic Value Bean class " do
|
6
|
-
let(:object) {
|
7
|
-
SknUtils::ValueBean.new({one: "one",
|
8
|
-
two: "two",
|
9
|
-
three: {four: 4, five: 5, six: {seven: 7, eight: "eight" }},
|
10
|
-
four: {any_key: "any value"}, five: []}
|
11
|
-
)
|
12
|
-
}
|
13
|
-
|
14
|
-
context "Internal Operations, assuming :dept => :multi and enable_serialization => true" do
|
15
|
-
it "Creates an empty bean if no params are passed" do
|
16
|
-
is_expected.to be
|
17
|
-
end
|
18
|
-
it "Can be Marshalled after dynamically adding a key/value." do
|
19
|
-
expect { object.fifty = {any_key: "any value"} }.not_to raise_error
|
20
|
-
expect { object.sixty = 60 }.not_to raise_error
|
21
|
-
dmp = obj = ""
|
22
|
-
expect { dmp = Marshal.dump(object) }.not_to raise_error
|
23
|
-
expect { obj = Marshal.load(dmp) }.not_to raise_error
|
24
|
-
expect(obj).to be_a(SknUtils::ValueBean)
|
25
|
-
expect(obj.fifty[:any_key]).to eql "any value"
|
26
|
-
expect(obj.sixty).to eql 60
|
27
|
-
end
|
28
|
-
it "Initializes from a hash" do
|
29
|
-
expect(SknUtils::ValueBean.new({one: "one", two: "two"})).to be
|
30
|
-
end
|
31
|
-
it "Does not modify the base class, only singleton instance methods" do
|
32
|
-
obj1 = SknUtils::ValueBean.new({one: "one", two: "two"})
|
33
|
-
obj2 = SknUtils::ValueBean.new({three: "3", four: "4"})
|
34
|
-
expect(obj1.one).to eql "one"
|
35
|
-
expect(obj2.three).to eql "3"
|
36
|
-
expect(obj2.one?).to be false
|
37
|
-
expect(obj1.three?).to be false
|
38
|
-
expect { obj1.three }.to raise_error NoMethodError
|
39
|
-
expect { obj2.one }.to raise_error NoMethodError
|
40
|
-
end
|
41
|
-
it "Supports - respond_to? - method, because it has accessors or method_missing coverage" do
|
42
|
-
expect(object).to respond_to(:one)
|
43
|
-
expect(object.one).to eql "one"
|
44
|
-
expect{ object.fifty = {any_key: "any value"} }.not_to raise_error
|
45
|
-
expect( object.fifty).not_to respond_to(:any_key)
|
46
|
-
end
|
47
|
-
it "nest objects if multi-level hash is given" do
|
48
|
-
expect(object.one).to be_eql("one")
|
49
|
-
expect(object.two).to be_eql("two")
|
50
|
-
expect(object.three).to be_a(Hash)
|
51
|
-
expect(object.three[:five]).to eq(5)
|
52
|
-
end
|
53
|
-
it "#attributes method returns a hash of all attributes and their values." do
|
54
|
-
expect(object.to_hash).to be_a(Hash)
|
55
|
-
expect(object.to_hash[:one]).to be_eql("one")
|
56
|
-
expect(object.to_hash[:three]).to be_a(Hash)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
shared_examples_for "retains initialization options" do
|
61
|
-
it "retains depth_level option flag" do
|
62
|
-
expect(@obj.depth_level).to eql(:single)
|
63
|
-
end
|
64
|
-
it "retains serialization option flag" do
|
65
|
-
expect(@obj.serialization_required?).to be true
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context "Basic Operations without marshaling " do
|
70
|
-
before :each do
|
71
|
-
@obj = object
|
72
|
-
end
|
73
|
-
|
74
|
-
it_behaves_like "retains initialization options"
|
75
|
-
it_behaves_like "marshalable ruby pojo"
|
76
|
-
end
|
77
|
-
context "Basic Operations after Yaml marshaling " do
|
78
|
-
before :each do
|
79
|
-
dmp = YAML::dump(object)
|
80
|
-
@obj = YAML::load(dmp)
|
81
|
-
end
|
82
|
-
|
83
|
-
it_behaves_like "retains initialization options"
|
84
|
-
it_behaves_like "marshalable ruby pojo"
|
85
|
-
end
|
86
|
-
context "Basic Operations after Marshal marshaling " do
|
87
|
-
before :each do
|
88
|
-
dmp = Marshal.dump(object)
|
89
|
-
@obj = Marshal.load(dmp)
|
90
|
-
end
|
91
|
-
|
92
|
-
it_behaves_like "retains initialization options"
|
93
|
-
it_behaves_like "marshalable ruby pojo"
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# <root>/spec/support/shared_example_marshalable_ruby_pojo.rb
|
3
|
-
#
|
4
|
-
# refs: page_controls, generic_bean
|
5
|
-
#
|
6
|
-
|
7
|
-
RSpec.shared_examples "marshalable ruby pojo" do
|
8
|
-
it "provides getters" do
|
9
|
-
expect(@obj.one).to be_eql("one")
|
10
|
-
expect(@obj.two).to be_eql("two")
|
11
|
-
end
|
12
|
-
it "provides setters" do
|
13
|
-
@obj.one = "1"
|
14
|
-
@obj.two = "2"
|
15
|
-
expect(@obj.two).to be_eql("2")
|
16
|
-
expect(@obj.one).to be_eql("1")
|
17
|
-
end
|
18
|
-
it "#clear_attribute sets given attribute to nil." do
|
19
|
-
expect(@obj.two).to be_eql("two")
|
20
|
-
expect(@obj.clear_two).to be_nil
|
21
|
-
end
|
22
|
-
it "#attribute? returns true or false based on true presence and non-blank contents of attribute." do
|
23
|
-
expect(@obj.two?).to be true
|
24
|
-
@obj.two = false
|
25
|
-
expect(@obj.two?).to be true
|
26
|
-
@obj.clear_two
|
27
|
-
expect(@obj.two?).to be false
|
28
|
-
expect(@obj.three?).to be true
|
29
|
-
expect(@obj.four?).to be true
|
30
|
-
@obj.clear_three
|
31
|
-
expect(@obj.three?).to be false
|
32
|
-
@obj.clear_four
|
33
|
-
expect(@obj.four?).to be false
|
34
|
-
end
|
35
|
-
it "#attribute? returns false when attribute is not defined or unknown" do
|
36
|
-
expect(@obj.address?).to be false
|
37
|
-
end
|
38
|
-
it "raises an 'NoMethodError' error when attribute does not exist" do
|
39
|
-
expect { @obj.address }.to raise_error NoMethodError
|
40
|
-
end
|
41
|
-
it "#to_hash method excludes internal attributes unless overridden." do
|
42
|
-
expect(@obj.to_hash[:skn_enabled_depth]).to be_nil
|
43
|
-
expect(@obj.to_hash(false)[:skn_enabled_depth]).to be_nil
|
44
|
-
expect(@obj.to_hash(true)[:skn_enabled_depth]).to eql @obj.depth_level
|
45
|
-
end
|
46
|
-
context "transformations are enabled with " do
|
47
|
-
it "#to_hash method returns a serialized version of this object." do
|
48
|
-
expect(@obj.to_hash).to be_a(Hash)
|
49
|
-
end
|
50
|
-
it "#attributes method returns original input hash." do
|
51
|
-
expect(@obj.attributes).to be_a(Hash)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|