astruct 2.9.0 → 2.11.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.
- data/.gitignore +2 -2
- data/.rvmrc +3 -2
- data/Rakefile +12 -0
- data/astruct.gemspec +3 -2
- data/bench/add_more_vs_ostruct.rb +15 -7
- data/bench/delete_vs_ostruct.rb +15 -7
- data/bench/dump_vs_ostruct.rb +13 -5
- data/bench/dynamic_vs_ostruct.rb +13 -5
- data/bench/inspect_vs_ostruct.rb +13 -5
- data/bench/load_vs_ostruct.rb +13 -5
- data/bench/nested_vs_ostruct.rb +13 -5
- data/bench/new_vs_ostruct.rb +13 -5
- data/bench/some_updates_vs_ostruct.rb +34 -0
- data/lib/astruct/module.rb +10 -3
- data/lib/astruct/version.rb +1 -1
- data/test/helper.rb +2 -0
- data/test/lib/astruct_test.rb +1 -1
- data/test/lib/ostruct_test.rb +227 -227
- metadata +25 -8
data/.gitignore
CHANGED
data/.rvmrc
CHANGED
@@ -6,10 +6,11 @@
|
|
6
6
|
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
|
7
7
|
# Only full ruby name is supported here, for short names use:
|
8
8
|
# echo "rvm use 1.9.3" > .rvmrc
|
9
|
-
environment_id="ruby-1.9.3-
|
9
|
+
environment_id="ruby-1.9.3-p286@astruct"
|
10
10
|
|
11
11
|
# Uncomment the following lines if you want to verify rvm version per project
|
12
|
-
# rvmrc_rvm_version="1.
|
12
|
+
# rvmrc_rvm_version="1.16.17 (stable)" # 1.10.1 seams as a safe start
|
13
|
+
|
13
14
|
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
|
14
15
|
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
|
15
16
|
# return 1
|
data/Rakefile
CHANGED
@@ -27,5 +27,17 @@ YARD::Rake::YardocTask.new do |config|
|
|
27
27
|
config.files = Dir['lib/**/*.rb']
|
28
28
|
end
|
29
29
|
|
30
|
+
desc "Running all the benchmarks and writing results to file"
|
31
|
+
task :bench do
|
32
|
+
Dir[File.join(File.dirname(__FILE__), "bench", "*")].each do |benchmark|
|
33
|
+
header = "\nPLATFORM: #{RUBY_DESCRIPTION}\nTIMESTAMP: #{Time.now}\n---\n"
|
34
|
+
results = `bundle exec ruby #{benchmark}`
|
35
|
+
document = header + results
|
36
|
+
File.open benchmark, "a" do |file|
|
37
|
+
file.write document.gsub /^/, "# "
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
30
42
|
desc 'Default: run tests, and generate docs'
|
31
43
|
task :default => [ :test, :yard ]
|
data/astruct.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# encoding: utf-8
|
2
2
|
require File.expand_path('../lib/astruct/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
@@ -15,8 +15,9 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = AltStruct::VERSION
|
17
17
|
|
18
|
-
gem.add_development_dependency 'rake'
|
18
|
+
gem.add_development_dependency 'rake'
|
19
19
|
gem.add_development_dependency 'yard'
|
20
20
|
gem.add_development_dependency 'kramdown'
|
21
21
|
gem.add_development_dependency 'benchmark-ips'
|
22
|
+
gem.add_development_dependency 'simplecov'
|
22
23
|
end
|
@@ -2,14 +2,14 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
6
|
-
DATA2 = (10_000..20_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
|
+
DATA2 = (10_000..20_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
7
7
|
|
8
8
|
Benchmark.ips do |x|
|
9
9
|
x.report "OStruct new with data then load with more data" do
|
10
10
|
class OProfile < OpenStruct; end
|
11
11
|
op = OProfile.new DATA.dup
|
12
|
-
op.marshal_load DATA2.dup
|
12
|
+
op.marshal_load op.marshal_dump.merge DATA2.dup
|
13
13
|
end
|
14
14
|
|
15
15
|
x.report "AStruct new with data then load with more data" do
|
@@ -18,9 +18,17 @@ Benchmark.ips do |x|
|
|
18
18
|
ap.load DATA2.dup
|
19
19
|
end
|
20
20
|
end
|
21
|
+
#
|
22
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
23
|
+
# TIMESTAMP: 2012-11-06 11:17:33 -0800
|
24
|
+
# ---
|
21
25
|
# Calculating -------------------------------------
|
22
|
-
# OStruct new with data then load with more data
|
23
|
-
#
|
26
|
+
# OStruct new with data then load with more data
|
27
|
+
# 1 i/100ms
|
28
|
+
# AStruct new with data then load with more data
|
29
|
+
# 1 i/100ms
|
24
30
|
# -------------------------------------------------
|
25
|
-
# OStruct new with data then load with more data
|
26
|
-
#
|
31
|
+
# OStruct new with data then load with more data
|
32
|
+
# 1.8 (±0.0%) i/s - 9 in 5.186949s
|
33
|
+
# AStruct new with data then load with more data
|
34
|
+
# 1.9 (±0.0%) i/s - 10 in 5.353544s
|
data/bench/delete_vs_ostruct.rb
CHANGED
@@ -2,24 +2,32 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct new with data then delete" do
|
9
9
|
class OProfile < OpenStruct; end
|
10
10
|
op = OProfile.new DATA.dup
|
11
|
-
op.delete_field :
|
11
|
+
op.delete_field :key1
|
12
12
|
end
|
13
13
|
|
14
14
|
x.report "AStruct new with data then delete" do
|
15
15
|
class AProfile < AltStruct; end
|
16
16
|
ap = AProfile.new DATA.dup
|
17
|
-
ap.delete :
|
17
|
+
ap.delete :key1
|
18
18
|
end
|
19
19
|
end
|
20
|
+
#
|
21
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
22
|
+
# TIMESTAMP: 2012-11-06 11:17:50 -0800
|
23
|
+
# ---
|
20
24
|
# Calculating -------------------------------------
|
21
|
-
# OStruct new with data then delete
|
22
|
-
#
|
25
|
+
# OStruct new with data then delete
|
26
|
+
# 1 i/100ms
|
27
|
+
# AStruct new with data then delete
|
28
|
+
# 1 i/100ms
|
23
29
|
# -------------------------------------------------
|
24
|
-
# OStruct new with data then delete
|
25
|
-
#
|
30
|
+
# OStruct new with data then delete
|
31
|
+
# 4.4 (±22.5%) i/s - 22 in 5.028472s
|
32
|
+
# AStruct new with data then delete
|
33
|
+
# 5.4 (±18.6%) i/s - 26 in 5.028498s
|
data/bench/dump_vs_ostruct.rb
CHANGED
@@ -2,7 +2,7 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct dump with data" do
|
@@ -17,9 +17,17 @@ Benchmark.ips do |x|
|
|
17
17
|
ap.dump
|
18
18
|
end
|
19
19
|
end
|
20
|
+
#
|
21
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
22
|
+
# TIMESTAMP: 2012-11-06 11:18:06 -0800
|
23
|
+
# ---
|
20
24
|
# Calculating -------------------------------------
|
21
|
-
# OStruct dump with data
|
22
|
-
#
|
25
|
+
# OStruct dump with data
|
26
|
+
# 1 i/100ms
|
27
|
+
# AStruct dump with data
|
28
|
+
# 1 i/100ms
|
23
29
|
# -------------------------------------------------
|
24
|
-
# OStruct dump with data
|
25
|
-
#
|
30
|
+
# OStruct dump with data
|
31
|
+
# 4.6 (±21.6%) i/s - 23 in 5.176739s
|
32
|
+
# AStruct dump with data
|
33
|
+
# 5.4 (±37.3%) i/s - 26 in 5.200824s
|
data/bench/dynamic_vs_ostruct.rb
CHANGED
@@ -2,7 +2,7 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct new with data then assign new data" do
|
@@ -21,9 +21,17 @@ Benchmark.ips do |x|
|
|
21
21
|
ap.example3 = "green"
|
22
22
|
end
|
23
23
|
end
|
24
|
+
#
|
25
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
26
|
+
# TIMESTAMP: 2012-11-06 11:18:22 -0800
|
27
|
+
# ---
|
24
28
|
# Calculating -------------------------------------
|
25
|
-
# OStruct new with data then assign new data
|
26
|
-
#
|
29
|
+
# OStruct new with data then assign new data
|
30
|
+
# 1 i/100ms
|
31
|
+
# AStructt new with data then assign new data
|
32
|
+
# 1 i/100ms
|
27
33
|
# -------------------------------------------------
|
28
|
-
# OStruct new with data then assign new data
|
29
|
-
#
|
34
|
+
# OStruct new with data then assign new data
|
35
|
+
# 4.2 (±23.8%) i/s - 21 in 5.200944s
|
36
|
+
# AStructt new with data then assign new data
|
37
|
+
# 5.1 (±38.9%) i/s - 24 in 5.001440s
|
data/bench/inspect_vs_ostruct.rb
CHANGED
@@ -2,7 +2,7 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct inspect with data" do
|
@@ -17,9 +17,17 @@ Benchmark.ips do |x|
|
|
17
17
|
ap.inspect
|
18
18
|
end
|
19
19
|
end
|
20
|
+
#
|
21
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
22
|
+
# TIMESTAMP: 2012-11-06 11:18:38 -0800
|
23
|
+
# ---
|
20
24
|
# Calculating -------------------------------------
|
21
|
-
# OStruct inspect with data
|
22
|
-
#
|
25
|
+
# OStruct inspect with data
|
26
|
+
# 1 i/100ms
|
27
|
+
# AStruct inspect with data
|
28
|
+
# 1 i/100ms
|
23
29
|
# -------------------------------------------------
|
24
|
-
# OStruct inspect with data
|
25
|
-
#
|
30
|
+
# OStruct inspect with data
|
31
|
+
# 4.4 (±22.5%) i/s - 22 in 5.063692s
|
32
|
+
# AStruct inspect with data
|
33
|
+
# 4.9 (±20.2%) i/s - 25 in 5.229125s
|
data/bench/load_vs_ostruct.rb
CHANGED
@@ -2,7 +2,7 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct load with data" do
|
@@ -17,9 +17,17 @@ Benchmark.ips do |x|
|
|
17
17
|
ap.load DATA.dup
|
18
18
|
end
|
19
19
|
end
|
20
|
+
#
|
21
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
22
|
+
# TIMESTAMP: 2012-11-06 11:18:54 -0800
|
23
|
+
# ---
|
20
24
|
# Calculating -------------------------------------
|
21
|
-
# OStruct load with data
|
22
|
-
#
|
25
|
+
# OStruct load with data
|
26
|
+
# 1 i/100ms
|
27
|
+
# AStruct load with data
|
28
|
+
# 1 i/100ms
|
23
29
|
# -------------------------------------------------
|
24
|
-
# OStruct load with data
|
25
|
-
#
|
30
|
+
# OStruct load with data
|
31
|
+
# 5.3 (±37.6%) i/s - 26 in 5.143205s
|
32
|
+
# AStruct load with data
|
33
|
+
# 5.3 (±18.8%) i/s - 26 in 5.086193s
|
data/bench/nested_vs_ostruct.rb
CHANGED
@@ -2,7 +2,7 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct new with data then 3 deep and inspect" do
|
@@ -21,9 +21,17 @@ Benchmark.ips do |x|
|
|
21
21
|
ap.inspect
|
22
22
|
end
|
23
23
|
end
|
24
|
+
#
|
25
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
26
|
+
# TIMESTAMP: 2012-11-06 11:19:10 -0800
|
27
|
+
# ---
|
24
28
|
# Calculating -------------------------------------
|
25
|
-
# OStruct new with data then 3 deep and inspect
|
26
|
-
#
|
29
|
+
# OStruct new with data then 3 deep and inspect
|
30
|
+
# 1 i/100ms
|
31
|
+
# AStruct new with data then 3 deep and inspect
|
32
|
+
# 1 i/100ms
|
27
33
|
# -------------------------------------------------
|
28
|
-
# OStruct new with data then 3 deep and inspect
|
29
|
-
#
|
34
|
+
# OStruct new with data then 3 deep and inspect
|
35
|
+
# 1.3 (±0.0%) i/s - 7 in 5.560086s
|
36
|
+
# AStruct new with data then 3 deep and inspect
|
37
|
+
# 1.6 (±0.0%) i/s - 9 in 5.569932s
|
data/bench/new_vs_ostruct.rb
CHANGED
@@ -2,7 +2,7 @@ require 'benchmark/ips'
|
|
2
2
|
require 'astruct'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
-
DATA = (1..10_000).map { |i| {
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
6
|
|
7
7
|
Benchmark.ips do |x|
|
8
8
|
x.report "OStruct new with data" do
|
@@ -15,9 +15,17 @@ Benchmark.ips do |x|
|
|
15
15
|
AProfile.new DATA.dup
|
16
16
|
end
|
17
17
|
end
|
18
|
+
#
|
19
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
20
|
+
# TIMESTAMP: 2012-11-06 11:19:28 -0800
|
21
|
+
# ---
|
18
22
|
# Calculating -------------------------------------
|
19
|
-
# OStruct new with data
|
20
|
-
#
|
23
|
+
# OStruct new with data
|
24
|
+
# 1 i/100ms
|
25
|
+
# AStruct new with data
|
26
|
+
# 1 i/100ms
|
21
27
|
# -------------------------------------------------
|
22
|
-
# OStruct new with data
|
23
|
-
#
|
28
|
+
# OStruct new with data
|
29
|
+
# 4.3 (±23.4%) i/s - 21 in 5.130880s
|
30
|
+
# AStruct new with data
|
31
|
+
# 5.2 (±38.7%) i/s - 25 in 5.211888s
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
require 'astruct'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
DATA = (1..10_000).map { |i| { "key#{i}" => "value#{i}" } }.inject :merge!
|
6
|
+
UPDATE = DATA.merge (1..5_000).map { |i| { "key#{i}" => "value#{i + rand(1..3)}" } }.inject :merge!
|
7
|
+
|
8
|
+
Benchmark.ips do |x|
|
9
|
+
x.report "OStruct partial updates with data" do
|
10
|
+
class OProfile < OpenStruct; end
|
11
|
+
op = OProfile.new DATA.dup
|
12
|
+
op.marshal_load op.marshal_dump.merge UPDATE.dup
|
13
|
+
end
|
14
|
+
|
15
|
+
x.report "AStruct partial updates with data" do
|
16
|
+
class AProfile < AltStruct; end
|
17
|
+
ap = AProfile.new DATA.dup
|
18
|
+
ap.load UPDATE.dup
|
19
|
+
end
|
20
|
+
end
|
21
|
+
#
|
22
|
+
# PLATFORM: ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-darwin12.2.0]
|
23
|
+
# TIMESTAMP: 2012-11-06 11:19:44 -0800
|
24
|
+
# ---
|
25
|
+
# Calculating -------------------------------------
|
26
|
+
# OStruct partial updates with data
|
27
|
+
# 1 i/100ms
|
28
|
+
# AStruct partial updates with data
|
29
|
+
# 1 i/100ms
|
30
|
+
# -------------------------------------------------
|
31
|
+
# OStruct partial updates with data
|
32
|
+
# 3.4 (±29.5%) i/s - 17 in 5.211254s
|
33
|
+
# AStruct partial updates with data
|
34
|
+
# 3.0 (±0.0%) i/s - 15 in 5.116449s
|
data/lib/astruct/module.rb
CHANGED
@@ -22,6 +22,7 @@ class AltStruct
|
|
22
22
|
def initialize(pairs = {})
|
23
23
|
@table ||= {}
|
24
24
|
for key, value in pairs
|
25
|
+
key = key.to_sym
|
25
26
|
__new_field__ key, value
|
26
27
|
end unless pairs.empty?
|
27
28
|
end
|
@@ -33,6 +34,8 @@ class AltStruct
|
|
33
34
|
# Hash#merge!
|
34
35
|
def __load__(pairs)
|
35
36
|
for key, value in pairs
|
37
|
+
key = key.to_sym
|
38
|
+
next if table[key] == value
|
36
39
|
__new_field__ key, value
|
37
40
|
end unless pairs.empty?
|
38
41
|
end
|
@@ -105,7 +108,7 @@ class AltStruct
|
|
105
108
|
|
106
109
|
def __dump_inspect__
|
107
110
|
__create_id_list__
|
108
|
-
unless
|
111
|
+
unless __id_exists_in_id_list__?
|
109
112
|
__add_id_to_id_list__
|
110
113
|
string = __dump__.any? ? " #{__dump_string__.join ', '}" : ""
|
111
114
|
else
|
@@ -123,7 +126,7 @@ class AltStruct
|
|
123
126
|
end
|
124
127
|
|
125
128
|
def __new_field__(key, value)
|
126
|
-
table.merge! __define_accessor__ key
|
129
|
+
table.merge! __define_accessor__ key, value
|
127
130
|
end
|
128
131
|
|
129
132
|
def __dump_specific__(keys)
|
@@ -144,12 +147,16 @@ class AltStruct
|
|
144
147
|
Thread.current[ThreadKey] ||= []
|
145
148
|
end
|
146
149
|
|
147
|
-
def
|
150
|
+
def __id_exists_in_id_list__?
|
148
151
|
Thread.current[ThreadKey].include?(__object_id__)
|
149
152
|
end
|
150
153
|
|
151
154
|
def __remove_last_id_from_id_list__
|
152
155
|
Thread.current[ThreadKey].pop
|
153
156
|
end
|
157
|
+
|
158
|
+
def __field_exists_and_has_same_value__?(key, value)
|
159
|
+
table[key] == value
|
160
|
+
end
|
154
161
|
end
|
155
162
|
end
|
data/lib/astruct/version.rb
CHANGED
data/test/helper.rb
CHANGED
data/test/lib/astruct_test.rb
CHANGED
data/test/lib/ostruct_test.rb
CHANGED
@@ -1,227 +1,227 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
class TestOpenStruct < MiniTest::Unit::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
end
|
1
|
+
# require 'helper'
|
2
|
+
# require 'minitest/autorun'
|
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.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '0
|
21
|
+
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '0
|
29
|
+
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: yard
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: simplecov
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: An alternative to OpenStruct
|
79
95
|
email:
|
80
96
|
- kurtisrainboltgreene@gmail.com
|
@@ -99,6 +115,7 @@ files:
|
|
99
115
|
- bench/load_vs_ostruct.rb
|
100
116
|
- bench/nested_vs_ostruct.rb
|
101
117
|
- bench/new_vs_ostruct.rb
|
118
|
+
- bench/some_updates_vs_ostruct.rb
|
102
119
|
- lib/astruct.rb
|
103
120
|
- lib/astruct/module.rb
|
104
121
|
- lib/astruct/version.rb
|
@@ -119,7 +136,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
136
|
version: '0'
|
120
137
|
segments:
|
121
138
|
- 0
|
122
|
-
hash: -
|
139
|
+
hash: -3183751075223347111
|
123
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
141
|
none: false
|
125
142
|
requirements:
|
@@ -128,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
145
|
version: '0'
|
129
146
|
segments:
|
130
147
|
- 0
|
131
|
-
hash: -
|
148
|
+
hash: -3183751075223347111
|
132
149
|
requirements: []
|
133
150
|
rubyforge_project:
|
134
151
|
rubygems_version: 1.8.24
|