astruct 2.7.1 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/bench/add_more_vs_ostruct.rb +26 -0
- data/bench/delete_vs_ostruct.rb +25 -0
- data/bench/dump_vs_ostruct.rb +25 -0
- data/bench/dynamic_vs_ostruct.rb +29 -0
- data/bench/inspect_vs_ostruct.rb +25 -0
- data/bench/load_vs_ostruct.rb +25 -0
- data/bench/nested_vs_ostruct.rb +29 -0
- data/bench/new_vs_ostruct.rb +23 -0
- data/lib/astruct/module.rb +7 -3
- data/lib/astruct/version.rb +1 -1
- data/test/lib/astruct_test.rb +0 -9
- data/test/lib/ostruct_test.rb +227 -0
- metadata +15 -11
- data/benchmark/basic_vs_ostruct.rb +0 -17
- data/benchmark/deep_inspect_vs_ostruct.rb +0 -34
- data/benchmark/delete_vs_ostruct.rb +0 -19
- data/benchmark/dump_vs_ostruct.rb +0 -25
- data/benchmark/dynamic_vs_ostruct +0 -23
- data/benchmark/inspect_vs_ostruct.rb +0 -19
- data/benchmark/load_vs_ostruct.rb +0 -19
data/.travis.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
- 1.9.3
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
DATA2 = (10_000..20_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
7
|
+
|
8
|
+
Benchmark.ips do |x|
|
9
|
+
x.report "OStruct new with data then load with more data" do
|
10
|
+
class OProfile < OpenStruct; end
|
11
|
+
op = OProfile.new DATA.dup
|
12
|
+
op.marshal_load DATA2.dup
|
13
|
+
end
|
14
|
+
|
15
|
+
x.report "AStruct new with data then load with more data" do
|
16
|
+
class AProfile < AltStruct; end
|
17
|
+
ap = AProfile.new DATA.dup
|
18
|
+
ap.load DATA2.dup
|
19
|
+
end
|
20
|
+
end
|
21
|
+
# Calculating -------------------------------------
|
22
|
+
# OStruct new with data then load with more data 1 i/100ms
|
23
|
+
# AStruct new with data then load with more data 1 i/100ms
|
24
|
+
# -------------------------------------------------
|
25
|
+
# OStruct new with data then load with more data 3.2 (±0.0%) i/s - 16 in 5.032341s
|
26
|
+
# AStruct new with data then load with more data 4.4 (±23.0%) i/s - 21 in 5.033214s
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct new with data then delete" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
op = OProfile.new DATA.dup
|
11
|
+
op.delete_field :item1
|
12
|
+
end
|
13
|
+
|
14
|
+
x.report "AStruct new with data then delete" do
|
15
|
+
class AProfile < AltStruct; end
|
16
|
+
ap = AProfile.new DATA.dup
|
17
|
+
ap.delete :item1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
# Calculating -------------------------------------
|
21
|
+
# OStruct new with data then delete 1 i/100ms
|
22
|
+
# AStruct new with data then delete 1 i/100ms
|
23
|
+
# -------------------------------------------------
|
24
|
+
# OStruct new with data then delete 8.9 (±11.3%) i/s - 44 in 5.014542s
|
25
|
+
# AStruct new with data then delete 10.2 (±29.5%) i/s - 48 in 5.014586s
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct dump with data" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
op = OProfile.new DATA.dup
|
11
|
+
op.marshal_dump
|
12
|
+
end
|
13
|
+
|
14
|
+
x.report "AStruct dump with data" do
|
15
|
+
class AProfile < AltStruct; end
|
16
|
+
ap = AProfile.new DATA.dup
|
17
|
+
ap.dump
|
18
|
+
end
|
19
|
+
end
|
20
|
+
# Calculating -------------------------------------
|
21
|
+
# OStruct dump with data 1 i/100ms
|
22
|
+
# AStruct dump with data 1 i/100ms
|
23
|
+
# -------------------------------------------------
|
24
|
+
# OStruct dump with data 9.0 (±22.2%) i/s - 44 in 5.055799s
|
25
|
+
# AStruct dump with data 10.2 (±29.4%) i/s - 48 in 5.073042s
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct new with data then assign new data" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
op = OProfile.new DATA.dup
|
11
|
+
op.example1 = "red"
|
12
|
+
op.example2 = "blue"
|
13
|
+
op.example3 = "green"
|
14
|
+
end
|
15
|
+
|
16
|
+
x.report "AStructt new with data then assign new data" do
|
17
|
+
class AProfile < AltStruct; end
|
18
|
+
ap = AProfile.new DATA.dup
|
19
|
+
ap.example1 = "red"
|
20
|
+
ap.example2 = "blue"
|
21
|
+
ap.example3 = "green"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# Calculating -------------------------------------
|
25
|
+
# OStruct new with data then assign new data 1 i/100ms
|
26
|
+
# AStructt new with data then assign new data 1 i/100ms
|
27
|
+
# -------------------------------------------------
|
28
|
+
# OStruct new with data then assign new data 8.5 (±11.8%) i/s - 42 in 5.078029s
|
29
|
+
# AStructt new with data then assign new data 9.4 (±32.0%) i/s - 43 in 5.005849s
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct inspect with data" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
op = OProfile.new DATA.dup
|
11
|
+
op.inspect
|
12
|
+
end
|
13
|
+
|
14
|
+
x.report "AStruct inspect with data" do
|
15
|
+
class AProfile < AltStruct; end
|
16
|
+
ap = AProfile.new DATA.dup
|
17
|
+
ap.inspect
|
18
|
+
end
|
19
|
+
end
|
20
|
+
# Calculating -------------------------------------
|
21
|
+
# OStruct inspect with data 1 i/100ms
|
22
|
+
# AStruct inspect with data 1 i/100ms
|
23
|
+
# -------------------------------------------------
|
24
|
+
# OStruct inspect with data 8.2 (±24.4%) i/s - 40 in 5.085258s
|
25
|
+
# AStruct inspect with data 9.1 (±21.9%) i/s - 45 in 5.063373s
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct load with data" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
op = OProfile.new
|
11
|
+
op.marshal_load DATA.dup
|
12
|
+
end
|
13
|
+
|
14
|
+
x.report "AStruct load with data" do
|
15
|
+
class AProfile < AltStruct; end
|
16
|
+
ap = AProfile.new
|
17
|
+
ap.load DATA.dup
|
18
|
+
end
|
19
|
+
end
|
20
|
+
# Calculating -------------------------------------
|
21
|
+
# OStruct load with data 1 i/100ms
|
22
|
+
# AStruct load with data 1 i/100ms
|
23
|
+
# -------------------------------------------------
|
24
|
+
# OStruct load with data 10.1 (±19.9%) i/s - 49 in 5.017475s
|
25
|
+
# AStruct load with data 10.3 (±29.1%) i/s - 50 in 5.090294s
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct new with data then 3 deep and inspect" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
op = OProfile.new DATA.dup
|
11
|
+
op.op2 = OProfile.new DATA.dup
|
12
|
+
op.op2.op3 = OProfile.new DATA.dup
|
13
|
+
op.inspect
|
14
|
+
end
|
15
|
+
|
16
|
+
x.report "AStruct new with data then 3 deep and inspect" do
|
17
|
+
class AProfile < AltStruct; end
|
18
|
+
ap = AProfile.new DATA.dup
|
19
|
+
ap.ap2 = AProfile.new DATA.dup
|
20
|
+
ap.ap2.ap3 = AProfile.new DATA.dup
|
21
|
+
ap.inspect
|
22
|
+
end
|
23
|
+
end
|
24
|
+
# Calculating -------------------------------------
|
25
|
+
# OStruct new with data then 3 deep and inspect 1 i/100ms
|
26
|
+
# AStruct new with data then 3 deep and inspect 1 i/100ms
|
27
|
+
# -------------------------------------------------
|
28
|
+
# OStruct new with data then 3 deep and inspect 2.0 (±0.0%) i/s - 10 in 5.184739s
|
29
|
+
# AStruct new with data then 3 deep and inspect 3.1 (±31.9%) i/s - 15 in 5.029310s
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
+
|
7
|
+
Benchmark.ips do |x|
|
8
|
+
x.report "OStruct new with data" do
|
9
|
+
class OProfile < OpenStruct; end
|
10
|
+
OProfile.new DATA.dup
|
11
|
+
end
|
12
|
+
|
13
|
+
x.report "AStruct new with data" do
|
14
|
+
class AProfile < AltStruct; end
|
15
|
+
AProfile.new DATA.dup
|
16
|
+
end
|
17
|
+
end
|
18
|
+
# Calculating -------------------------------------
|
19
|
+
# OStruct new with data 1 i/100ms
|
20
|
+
# AStruct new with data 1 i/100ms
|
21
|
+
# -------------------------------------------------
|
22
|
+
# OStruct new with data 8.6 (±23.2%) i/s - 42 in 5.041086s
|
23
|
+
# AStruct new with data 9.7 (±30.8%) i/s - 47 in 5.101214s
|
data/lib/astruct/module.rb
CHANGED
@@ -2,6 +2,8 @@ class AltStruct
|
|
2
2
|
module M
|
3
3
|
ThreadKey = :__inspect_astruct_ids__ # :nodoc:
|
4
4
|
attr_reader :table
|
5
|
+
alias_method :__object_id__, :object_id
|
6
|
+
alias_method :__singleton_class__, :singleton_class
|
5
7
|
|
6
8
|
# Create a new field for each of the key/value pairs passed.
|
7
9
|
# By default the resulting OpenStruct object will have no
|
@@ -58,8 +60,8 @@ class AltStruct
|
|
58
60
|
# The delete_field() method removes a key/value pair on the @table
|
59
61
|
# and on the singleton class. It also mimics the Hash#delete method.
|
60
62
|
def __delete_field__(key)
|
61
|
-
|
62
|
-
|
63
|
+
__singleton_class__.send :remove_method, key
|
64
|
+
__singleton_class__.send :remove_method, :"#{key}="
|
63
65
|
@table.delete key
|
64
66
|
end
|
65
67
|
alias_method :delete_field, :__delete_field__
|
@@ -96,6 +98,8 @@ class AltStruct
|
|
96
98
|
super
|
97
99
|
@table.freeze
|
98
100
|
end
|
101
|
+
alias_method :__freeze__, :freeze
|
102
|
+
alias_method :__frozen?, :frozen?
|
99
103
|
|
100
104
|
private
|
101
105
|
|
@@ -141,7 +145,7 @@ class AltStruct
|
|
141
145
|
end
|
142
146
|
|
143
147
|
def __id_exists_in_id_list?
|
144
|
-
Thread.current[ThreadKey].include?(
|
148
|
+
Thread.current[ThreadKey].include?(__object_id__)
|
145
149
|
end
|
146
150
|
|
147
151
|
def __remove_last_id_from_id_list__
|
data/lib/astruct/version.rb
CHANGED
data/test/lib/astruct_test.rb
CHANGED
@@ -150,10 +150,6 @@ class TestAltStruct < MiniTest::Unit::TestCase
|
|
150
150
|
assert_equal expected, actual
|
151
151
|
end
|
152
152
|
|
153
|
-
def test_example_has_table_method
|
154
|
-
assert_respond_to @example, :table
|
155
|
-
end
|
156
|
-
|
157
153
|
def test_empty_example_has_empty_table
|
158
154
|
expected = {}
|
159
155
|
actual = @empty.table
|
@@ -207,10 +203,6 @@ class TestAltStruct < MiniTest::Unit::TestCase
|
|
207
203
|
assert_equal expected, actual
|
208
204
|
end
|
209
205
|
|
210
|
-
def test_example_has_dump_method
|
211
|
-
assert_respond_to @example, :dump
|
212
|
-
end
|
213
|
-
|
214
206
|
def test_dump_contains_values
|
215
207
|
expected = { name: "Kurtis", age: 24 }
|
216
208
|
actual = @example.dump
|
@@ -233,4 +225,3 @@ class TestAltStruct < MiniTest::Unit::TestCase
|
|
233
225
|
refute_respond_to @empty, :name
|
234
226
|
end
|
235
227
|
end
|
236
|
-
|
@@ -0,0 +1,227 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../helper'
|
3
|
+
|
4
|
+
class TestOpenStruct < MiniTest::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@empty = OpenStruct.new
|
7
|
+
@example = OpenStruct.new name: "Kurtis", age: 24
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_equality_with_two_empty_ostructs
|
11
|
+
empty2 = OpenStruct.new
|
12
|
+
assert_equal @empty, empty2
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_equality_vs_ostruct_with_fields
|
16
|
+
refute_equal @example, @empty
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_equality_vs_object_with_fake_table
|
20
|
+
empty_object = Object.new
|
21
|
+
empty_object.instance_eval { @table = { name: "Kurtis", age: 24 } }
|
22
|
+
expected = @example
|
23
|
+
actual = empty_object
|
24
|
+
refute_equal expected, actual
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_inspect_with_no_fields
|
28
|
+
expected = "#<OpenStruct>"
|
29
|
+
actual = @empty.inspect
|
30
|
+
assert_equal expected, actual
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_inspect_with_fields
|
34
|
+
@empty.example1 = 1
|
35
|
+
@empty.example2 = 2
|
36
|
+
expected = "#<OpenStruct example1=1, example2=2>"
|
37
|
+
actual = @empty.inspect
|
38
|
+
assert_equal expected, actual
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_inspect_with_sub_struct_duplicate
|
42
|
+
@empty.struct2 = OpenStruct.new
|
43
|
+
@empty.struct2.struct3 = @empty
|
44
|
+
expected = '#<OpenStruct struct2=#<OpenStruct struct3=#<OpenStruct ...>>>'
|
45
|
+
actual = @empty.inspect
|
46
|
+
assert_equal expected, actual
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_inspect_with_sub_struct
|
50
|
+
@example.friends = OpenStruct.new name: "Jason", age: 24
|
51
|
+
@example.friends.friends = OpenStruct.new name: "John", age: 15
|
52
|
+
@example.friends.friends.friends = OpenStruct.new name: "Ally", age: 32
|
53
|
+
expected = '#<OpenStruct name="Kurtis", age=24, friends=#<OpenStruct name="Jason", age=24, friends=#<OpenStruct name="John", age=15, friends=#<OpenStruct name="Ally", age=32>>>>'
|
54
|
+
actual = @example.inspect
|
55
|
+
assert_equal expected, actual
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_inspect_with_twice_inspected_struct
|
59
|
+
@example.inspect
|
60
|
+
@example.inspect
|
61
|
+
expected = '#<OpenStruct name="Kurtis", age=24>'
|
62
|
+
actual = @example.inspect
|
63
|
+
assert_equal expected, actual
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_inspect_with_empty_sub_struct
|
67
|
+
@empty.struct2 = OpenStruct.new
|
68
|
+
expected = '#<OpenStruct struct2=#<OpenStruct>>'
|
69
|
+
actual = @empty.inspect
|
70
|
+
assert_equal expected, actual
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_freeze_stops_new_assignments
|
74
|
+
@example.freeze
|
75
|
+
assert_raises(RuntimeError) { @example.age = 24 }
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_freeze_still_returns_values
|
79
|
+
@example.freeze
|
80
|
+
expecteds = "Kurtis"
|
81
|
+
actual = @example.name
|
82
|
+
assert_equal expecteds, actual
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_freeze_stops_reassignments
|
86
|
+
@example.freeze
|
87
|
+
assert_raises(RuntimeError) { @example.name = "Jazzy" }
|
88
|
+
end
|
89
|
+
|
90
|
+
# def test_freeze_stops_reassign_even_if_frozen_redefined
|
91
|
+
# @example.freeze
|
92
|
+
# def @example.frozen?; nil end
|
93
|
+
# @example.freeze
|
94
|
+
# message = '[ruby-core:22559]'
|
95
|
+
# assert_raises(RuntimeError, message) { @example.name = "Jazzy" }
|
96
|
+
# # assert_raises(TypeError, message) { @example.name = "Jazzy" }
|
97
|
+
# end
|
98
|
+
|
99
|
+
def test_ostruct_doesn_respond_to_non_existant_keys_getter
|
100
|
+
refute_respond_to @empty, :akey
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_ostruct_doesn_respond_to_non_existant_keys_setter
|
104
|
+
refute_respond_to @empty, :akey=
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_delete_field_removes_getter_method
|
108
|
+
bug = '[ruby-core:33010]'
|
109
|
+
@example.delete_field :name
|
110
|
+
refute_respond_to @example, :name, bug
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_delete_field_removes_setter_method
|
114
|
+
bug = '[ruby-core:33010]'
|
115
|
+
@example.delete_field :name
|
116
|
+
refute_respond_to @example, :name=, bug
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_delete_field_removes_table_key_value
|
120
|
+
@example.delete_field :name
|
121
|
+
expected = nil
|
122
|
+
actual = @example.table[:name]
|
123
|
+
assert_equal expected, actual
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_delete_field_returns_value_of_deleted_key
|
127
|
+
expected = "Kurtis"
|
128
|
+
actual = @example.delete_field :name
|
129
|
+
assert_equal expected, actual
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_method_missing_handles_square_bracket_equals
|
133
|
+
assert_raises(ArgumentError) { @empty[:foo] = :bar }
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_method_missing_handles_square_brackets
|
137
|
+
assert_raises(NoMethodError) { @empty[:foo] }
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_to_hash_returns_hash
|
141
|
+
expected = { name: "John Smith", age: 70, pension: 300 }
|
142
|
+
actual = OpenStruct.new(expected).to_hash
|
143
|
+
assert_equal expected, actual
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_to_hash_modified_modifies_ostruct
|
147
|
+
@example.to_hash[:age] = 70
|
148
|
+
expected = 70
|
149
|
+
actual = @example.age
|
150
|
+
assert_equal expected, actual
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_empty_example_has_empty_table
|
154
|
+
expected = {}
|
155
|
+
actual = @empty.table
|
156
|
+
assert_equal expected, actual
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_example_has_name_method
|
160
|
+
assert_respond_to @example, :name
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_example_has_given_name
|
164
|
+
expected = "Kurtis"
|
165
|
+
actual = @example.name
|
166
|
+
assert_equal expected, actual
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_example_takes_name
|
170
|
+
assert_send [@example, :name=, "Dave"]
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_example_has_taken_name
|
174
|
+
@example.name = "Dave"
|
175
|
+
expected = "Dave"
|
176
|
+
actual = @example.name
|
177
|
+
assert_equal expected, actual
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_load_takes_a_hash
|
181
|
+
assert_send [@example, :load, { nickname: "Kurt" }]
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_load_sets_methods
|
185
|
+
@example.load nickname: "Kurt"
|
186
|
+
assert_respond_to @example, :nickname
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_ostruct_has_getter_methods_with_non_alpha_numeric_characters
|
190
|
+
@example.load "Length (In Inchs)" => 72
|
191
|
+
assert_send [@example, :"Length (In Inchs)"]
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_ostruct_has_getter_methods_with_non_alpha_numeric_characters
|
195
|
+
@example.load "Length (In Inchs)" => 72
|
196
|
+
assert_send [@example, :"Length (In Inchs)=", 73]
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_load_sets_correct_value
|
200
|
+
@example.load nickname: "Kurt"
|
201
|
+
expected = "Kurt"
|
202
|
+
actual = @example.nickname
|
203
|
+
assert_equal expected, actual
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_dump_contains_values
|
207
|
+
expected = { name: "Kurtis", age: 24 }
|
208
|
+
actual = @example.marshal_dump
|
209
|
+
assert_equal expected, actual
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_selective_dump_contains_selective_values
|
213
|
+
expected = { age: 24 }
|
214
|
+
actual = @example.dump :age
|
215
|
+
assert_equal expected, actual
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_inspect_has_values_delimited_by_comma
|
219
|
+
expected = /name="Kurtis", age=24/
|
220
|
+
actual = @example.inspect
|
221
|
+
assert_match expected, actual
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_other_object_isnt_affected
|
225
|
+
refute_respond_to @empty, :name
|
226
|
+
end
|
227
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: astruct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.9.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -84,24 +84,27 @@ extra_rdoc_files: []
|
|
84
84
|
files:
|
85
85
|
- .gitignore
|
86
86
|
- .rvmrc
|
87
|
+
- .travis.yml
|
87
88
|
- Gemfile
|
88
89
|
- Guardfile
|
89
90
|
- LICENSE
|
90
91
|
- README.md
|
91
92
|
- Rakefile
|
92
93
|
- astruct.gemspec
|
93
|
-
-
|
94
|
-
-
|
95
|
-
-
|
96
|
-
-
|
97
|
-
-
|
98
|
-
-
|
99
|
-
-
|
94
|
+
- bench/add_more_vs_ostruct.rb
|
95
|
+
- bench/delete_vs_ostruct.rb
|
96
|
+
- bench/dump_vs_ostruct.rb
|
97
|
+
- bench/dynamic_vs_ostruct.rb
|
98
|
+
- bench/inspect_vs_ostruct.rb
|
99
|
+
- bench/load_vs_ostruct.rb
|
100
|
+
- bench/nested_vs_ostruct.rb
|
101
|
+
- bench/new_vs_ostruct.rb
|
100
102
|
- lib/astruct.rb
|
101
103
|
- lib/astruct/module.rb
|
102
104
|
- lib/astruct/version.rb
|
103
105
|
- test/helper.rb
|
104
106
|
- test/lib/astruct_test.rb
|
107
|
+
- test/lib/ostruct_test.rb
|
105
108
|
homepage: http://krainboltgreene.github.com/astruct
|
106
109
|
licenses: []
|
107
110
|
post_install_message:
|
@@ -116,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
119
|
version: '0'
|
117
120
|
segments:
|
118
121
|
- 0
|
119
|
-
hash: -
|
122
|
+
hash: -2502922354495279839
|
120
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
124
|
none: false
|
122
125
|
requirements:
|
@@ -125,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
128
|
version: '0'
|
126
129
|
segments:
|
127
130
|
- 0
|
128
|
-
hash: -
|
131
|
+
hash: -2502922354495279839
|
129
132
|
requirements: []
|
130
133
|
rubyforge_project:
|
131
134
|
rubygems_version: 1.8.24
|
@@ -135,4 +138,5 @@ summary: An alternative to OpenStruct
|
|
135
138
|
test_files:
|
136
139
|
- test/helper.rb
|
137
140
|
- test/lib/astruct_test.rb
|
141
|
+
- test/lib/ostruct_test.rb
|
138
142
|
has_rdoc:
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct creation" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
OProfile.new DATA.dup
|
11
|
-
end
|
12
|
-
|
13
|
-
x.report "AStruct creation" do
|
14
|
-
class AProfile < AltStruct; end
|
15
|
-
AProfile.new DATA.dup
|
16
|
-
end
|
17
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct load" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
op = OProfile.new DATA.dup
|
11
|
-
op.op2 = OProfile.new DATA.dup
|
12
|
-
op.op2.op3 = OProfile.new DATA.dup
|
13
|
-
op.inspect
|
14
|
-
end
|
15
|
-
|
16
|
-
x.report "AStruct load" do
|
17
|
-
class AProfile < AltStruct; end
|
18
|
-
ap = AProfile.new DATA.dup
|
19
|
-
ap.ap2 = AProfile.new DATA.dup
|
20
|
-
ap.ap2.ap3 = AProfile.new DATA.dup
|
21
|
-
ap.inspect
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
op = OProfile.new DATA.dup
|
26
|
-
op.op2 = OProfile.new DATA.dup
|
27
|
-
op.op2.op3 = OProfile.new DATA.dup
|
28
|
-
ap = AProfile.new DATA.dup
|
29
|
-
ap.ap2 = AProfile.new DATA.dup
|
30
|
-
ap.ap2.ap3 = AProfile.new DATA.dup
|
31
|
-
p ap.inspect
|
32
|
-
p op.inspect
|
33
|
-
puts "The output of each is the same: #{ap.inspect == op.inspect}"
|
34
|
-
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct load" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
op = OProfile.new DATA.dup
|
11
|
-
op.delete_field :item1
|
12
|
-
end
|
13
|
-
|
14
|
-
x.report "AStruct load" do
|
15
|
-
class AProfile < AltStruct; end
|
16
|
-
ap = AProfile.new DATA.dup
|
17
|
-
ap.delete :item1
|
18
|
-
end
|
19
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct load" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
op = OProfile.new DATA.dup
|
11
|
-
op.marshal_dump
|
12
|
-
end
|
13
|
-
|
14
|
-
x.report "AStruct load" do
|
15
|
-
class AProfile < AltStruct; end
|
16
|
-
ap = AProfile.new DATA.dup
|
17
|
-
ap.dump
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class OProfile < OpenStruct; end
|
22
|
-
op = OProfile.new DATA.dup
|
23
|
-
class AProfile < AltStruct; end
|
24
|
-
ap = AProfile.new DATA.dup
|
25
|
-
puts "The output of each is the same: #{ap.dump == op.marshal_dump}"
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct creation" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
op = OProfile.new DATA.dup
|
11
|
-
op.example1 = "red"
|
12
|
-
op.example2 = "blue"
|
13
|
-
op.example3 = "green"
|
14
|
-
end
|
15
|
-
|
16
|
-
x.report "AStruct creation" do
|
17
|
-
class AProfile < AltStruct; end
|
18
|
-
ap = AProfile.new DATA.dup
|
19
|
-
ap.example1 = "red"
|
20
|
-
ap.example2 = "blue"
|
21
|
-
ap.example3 = "green"
|
22
|
-
end
|
23
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct load" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
op = OProfile.new DATA.dup
|
11
|
-
op.inspect
|
12
|
-
end
|
13
|
-
|
14
|
-
x.report "AStruct load" do
|
15
|
-
class AProfile < AltStruct; end
|
16
|
-
ap = AProfile.new DATA.dup
|
17
|
-
ap.inspect
|
18
|
-
end
|
19
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'benchmark/ips'
|
2
|
-
require_relative '../lib/astruct'
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
DATA = (1..1_000).map { |i| { :"item#{i}" => i } }.inject :merge!
|
6
|
-
|
7
|
-
Benchmark.ips do |x|
|
8
|
-
x.report "OStruct load" do
|
9
|
-
class OProfile < OpenStruct; end
|
10
|
-
op = OProfile.new
|
11
|
-
op.marshal_load DATA.dup
|
12
|
-
end
|
13
|
-
|
14
|
-
x.report "AStruct load" do
|
15
|
-
class AProfile < AltStruct; end
|
16
|
-
ap = AProfile.new
|
17
|
-
ap.load DATA.dup
|
18
|
-
end
|
19
|
-
end
|