structure 0.8.0 → 0.9.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/README.md CHANGED
@@ -57,6 +57,10 @@ Typecast:
57
57
  p1.age
58
58
  => 28
59
59
 
60
+ Check for presence:
61
+ p1.age?
62
+ => true
63
+
60
64
  Embed other structures:
61
65
 
62
66
  p2 = Person.new
@@ -73,7 +77,7 @@ Load the JSON seamlessly back into Ruby:
73
77
 
74
78
  person = JSON.parse(json)
75
79
  person.friends.first
76
- => #<Person:0x0000010107d030 @attributes={:name=>nil, :age=>nil, :friends=>[], :partner=>nil}, @modifiable=true>
80
+ => #<Person:0x0000010107d030 @attributes={:name=>nil, :age=>nil, :friends=>[], :partner=>nil}>
77
81
 
78
82
  Throw in some Active Model modules:
79
83
 
@@ -0,0 +1,24 @@
1
+ require 'benchmark'
2
+ require 'ostruct'
3
+ require_relative 'lib/structure'
4
+
5
+ class Person1 < Structure
6
+ key :name
7
+ end
8
+
9
+ class Person2 < Struct.new(:name)
10
+ end
11
+
12
+ class Person3
13
+ attr_accessor :name
14
+ end
15
+
16
+ n = 100000
17
+ Benchmark.bm do |x|
18
+ x.report('Structure') { n.times { Person1.new(:name => 'John') } }
19
+ x.report('Structure') { n.times { Person1.new.name = 'John' } }
20
+ x.report('OpenStruct') { n.times { OpenStruct.new(:name => 'John') } }
21
+ x.report('Struct') { n.times { Person2.new('John') } }
22
+ x.report('Class') { n.times { Person3.new.name = 'John' } }
23
+ x.report('Hash') { n.times { { name: 'John' } } }
24
+ end
@@ -90,6 +90,9 @@ class Structure
90
90
  define_method("#{name}=") do |value|
91
91
  @attributes[name] = value.nil? ? nil : typecast.call(value)
92
92
  end
93
+
94
+ # Define a "presence" (for lack of a better term) method
95
+ define_method("#{name}?") { !!@attributes[name] }
93
96
  end
94
97
  end
95
98
 
@@ -1,3 +1,3 @@
1
1
  class Structure
2
- VERSION = '0.8.0'
2
+ VERSION = '0.9.0'
3
3
  end
@@ -187,6 +187,28 @@ describe Structure do
187
187
  end
188
188
  end
189
189
 
190
+ describe "attribute presence" do
191
+ context "when the value of an attribute is nil" do
192
+ it "returns false" do
193
+ person.name?.should be_false
194
+ end
195
+ end
196
+
197
+ context "when the value of an attribute is false" do
198
+ it "returns false" do
199
+ person.instance_variable_get(:@attributes)[:name] = false
200
+ person.name?.should be_false
201
+ end
202
+ end
203
+
204
+ context "when the value of an attribute is set to a value other than false or nil" do
205
+ it "returns true" do
206
+ person.instance_variable_get(:@attributes)[:name] = "John"
207
+ person.name?.should be_true
208
+ end
209
+ end
210
+ end
211
+
190
212
  describe ".new" do
191
213
  context "when attributes are specified" do
192
214
  it "initializes the object with those attributes" do
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 8
7
+ - 9
8
8
  - 0
9
- version: 0.8.0
9
+ version: 0.9.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Paper Cavalier
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-24 00:00:00 +01:00
17
+ date: 2011-06-29 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -79,6 +79,7 @@ files:
79
79
  - LICENSE
80
80
  - README.md
81
81
  - Rakefile
82
+ - benchmark.rb
82
83
  - lib/structure.rb
83
84
  - lib/structure/json.rb
84
85
  - lib/structure/version.rb