structx 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -16,7 +16,7 @@ StructX is an extension of Ruby standard Struct. The diffences are that 1) the c
16
16
  StructX.new(:x, :y, :z).new(x: 1, y: 2, z: 3) #=> #<struct x=1, y=10, z=100>
17
17
  ```
18
18
 
19
- ### Member sentences
19
+ ### Member declarations
20
20
 
21
21
  ```ruby
22
22
  class A < StructX
@@ -38,6 +38,21 @@ end
38
38
  B.new(1) # => #<struct B x=1, y=10, z=100>
39
39
  ```
40
40
 
41
+ ### Immutable mode
42
+
43
+ ```ruby
44
+ class C < StructX
45
+ immutable true
46
+ member :x
47
+ member :y
48
+ member :z
49
+ end
50
+ orig = C.new(1, 2, 3) #=> #<struct C x=1, y=2, z=3>
51
+ updated = orig.set(x: 4, y: 5, z: 6) #=> #<struct C x=4, y=5, z=6>
52
+ orig.values #=> [1, 2, 3]
53
+ updated.values #=> [4, 5, 6]
54
+ ```
55
+
41
56
  ## Documentation
42
57
 
43
58
  - [API Documentation](http://rubydoc.info/gems/structx)
data/lib/structx.rb CHANGED
@@ -93,15 +93,24 @@ class StructX
93
93
  end
94
94
  end
95
95
 
96
+ def immutable(b=true)
97
+ @immutable = b
98
+ end
99
+
100
+ def immutable?
101
+ @immutable
102
+ end
103
+
96
104
  private
97
105
 
98
106
  def inherited(subclass)
99
107
  @member.each {|key, data| subclass.member(key, data)} if @member
108
+ subclass.instance_variable_set(:@immutable, true) if @immutable
100
109
  end
101
110
  end
102
111
 
103
112
  # almost methods are forwarded to value table
104
- forward :class, :members
113
+ forward! :class, :members, :immutable?
105
114
  forward :@value, :each, :each_pair
106
115
  forward! :@value, :values, :length, :size, :hash
107
116
  forward! lambda{|x| @value.values}, :each, :values_at
@@ -128,13 +137,41 @@ class StructX
128
137
  end
129
138
  end
130
139
 
140
+ # Same as Struct#[].
141
+ alias :get :"[]"
142
+
131
143
  # Same as Struct#[]=.
132
144
  def []=(idx, val)
133
145
  case idx
134
146
  when Integer
135
- size > idx && -size <= idx ? @value[members[idx]] = val : (raise IndexError.new(idx))
147
+ if size > idx && -size <= idx
148
+ if not(immutable?)
149
+ @value[members[idx]] = val
150
+ else
151
+ self.class.new(@value.merge(members[idx] => val))
152
+ end
153
+ else
154
+ raise IndexError.new(idx)
155
+ end
136
156
  when Symbol, String
137
- members.include?(idx.to_sym) ? @value[idx.to_sym] = val : (raise NameError.new(idx.to_s))
157
+ if members.include?(idx.to_sym)
158
+ if not(immutable?)
159
+ @value[idx.to_sym] = val
160
+ else
161
+ self.class.new(@value.merge(idx.to_sym => val))
162
+ end
163
+ else
164
+ raise NameError.new(idx.to_s)
165
+ end
166
+ end
167
+ end
168
+
169
+ # Same as #[]=, but you can set values by hash.
170
+ def set(pairs={})
171
+ if not(immutable?)
172
+ pairs.each {|idx, val| obj[idx] = val}
173
+ else
174
+ pairs.inject(self) {|obj, (idx, val)| obj.send("[]=", idx, val)}
138
175
  end
139
176
  end
140
177
 
@@ -1,4 +1,4 @@
1
1
  class StructX
2
2
  # version of StructX
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
data/test/spec_structx.rb CHANGED
@@ -10,6 +10,7 @@ describe "StructX" do
10
10
  describe "StructX.new(:x, :y, :z)" do
11
11
  before do
12
12
  @class = StructX.new(:x, :y, :z)
13
+ @immutable = Class.new(@class).tap {|subclass| subclass.immutable}
13
14
  end
14
15
 
15
16
  it "should have 3 members" do
@@ -90,6 +91,10 @@ describe "StructX" do
90
91
  x[:y].should == 2
91
92
  x[:z].should == 3
92
93
  should.raise(NameError) { x[:a] }
94
+ # by #get
95
+ x.get(:x).should == 1
96
+ x.get(:y).should == 2
97
+ x.get(:z).should == 3
93
98
  end
94
99
  end
95
100
 
@@ -111,6 +116,12 @@ describe "StructX" do
111
116
  x[:z].should == 5
112
117
  should.raise(NameError) { x[:a] = 1}
113
118
  end
119
+ # immutable tests
120
+ orig = @immutable.new(1, 2, 3)
121
+ orig.values.should == [1, 2, 3]
122
+ updated = orig.set(x: 4, y: 5, z: 6)
123
+ updated.values.should == [4, 5, 6]
124
+ orig.values.should == [1, 2, 3]
114
125
  end
115
126
 
116
127
  it "should iterate values" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: structx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
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: 2013-05-25 00:00:00.000000000 Z
12
+ date: 2013-07-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: forwardablex
@@ -144,12 +144,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
144
  - - ! '>='
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
+ segments:
148
+ - 0
149
+ hash: 1674864282059584366
147
150
  required_rubygems_version: !ruby/object:Gem::Requirement
148
151
  none: false
149
152
  requirements:
150
153
  - - ! '>='
151
154
  - !ruby/object:Gem::Version
152
155
  version: '0'
156
+ segments:
157
+ - 0
158
+ hash: 1674864282059584366
153
159
  requirements: []
154
160
  rubyforge_project:
155
161
  rubygems_version: 1.8.25
@@ -164,3 +170,4 @@ test_files:
164
170
  - test/ruby/2.0/test_struct.rb
165
171
  - test/run.sh
166
172
  - test/spec_structx.rb
173
+ has_rdoc: