hamsterdam 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/TODO.txt +4 -0
- data/lib/hamsterdam.rb +27 -3
- data/spec/hamsterdam_spec.rb +47 -2
- metadata +2 -1
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
Hamsterdam v1.0.2
|
2
|
+
* Field name defs, constructor keys and merge keys are now stringified internally to prevent string/symbol mismatching
|
3
|
+
* Added syntax helper for this kind of thing: class Castle < Hamsterdam::Struct(:gate, :walls)
|
4
|
+
|
1
5
|
Hamsterdam v1.0.1
|
2
6
|
* Added nice to_s and inspect
|
3
7
|
* Also storing .field_names_list as another way of getting field names of a struct, but retaining order of declaration (.field_names is a Hamster.set, .field_names_list is a Hamster.list)
|
data/TODO.txt
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
- Add commas in to_s
|
2
|
+
- .set_defaults({}) to provide default values for constructors
|
3
|
+
- Want to use fun "Status < Hamsterdam::Struct(:one, :two)" but something is wrong with inheritance of field_names that blows up the flesh_out func.
|
4
|
+
- FIXED: Symbol/string insensitivity (use symbols internally and when listing field names, but accept :foo and 'foo' when constructing and merging
|
data/lib/hamsterdam.rb
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
require 'hamster'
|
2
2
|
|
3
3
|
module Hamsterdam
|
4
|
-
VERSION = "1.0.
|
4
|
+
VERSION = "1.0.2"
|
5
|
+
|
6
|
+
def self.Struct(*field_names)
|
7
|
+
Hamsterdam::Struct.define(*field_names)
|
8
|
+
end
|
5
9
|
|
6
10
|
class Struct
|
7
11
|
def self.define(*field_names)
|
8
12
|
struct_class = Class.new(Hamsterdam::Struct) do
|
13
|
+
field_names = field_names.map &:to_sym
|
9
14
|
field_names.each do |fname|
|
10
15
|
define_method fname do
|
11
16
|
return @data[fname]
|
@@ -22,10 +27,18 @@ module Hamsterdam
|
|
22
27
|
struct_class.instance_variable_set(:@field_names_list, Hamster.list(*field_names))
|
23
28
|
class << struct_class
|
24
29
|
def field_names
|
25
|
-
|
30
|
+
if !@field_names.nil?
|
31
|
+
@field_names
|
32
|
+
else
|
33
|
+
superclass.field_names
|
34
|
+
end
|
26
35
|
end
|
27
36
|
def field_names_list
|
28
|
-
|
37
|
+
if !@field_names_list.nil?
|
38
|
+
@field_names_list
|
39
|
+
else
|
40
|
+
superclass.field_names_list
|
41
|
+
end
|
29
42
|
end
|
30
43
|
end
|
31
44
|
struct_class
|
@@ -88,7 +101,9 @@ module Hamsterdam
|
|
88
101
|
end
|
89
102
|
|
90
103
|
def flesh_out(data)
|
104
|
+
# binding.pry
|
91
105
|
fnames = self.class.field_names
|
106
|
+
data = symbolize_keys(data)
|
92
107
|
miss = fnames - data.keys
|
93
108
|
if miss.any?
|
94
109
|
return miss.inject(data) { |h,name| h.put(name,nil) }
|
@@ -97,5 +112,14 @@ module Hamsterdam
|
|
97
112
|
end
|
98
113
|
end
|
99
114
|
|
115
|
+
def symbolize_keys(data)
|
116
|
+
data.reduce(data) do |memo,k,v|
|
117
|
+
if Symbol === k
|
118
|
+
memo
|
119
|
+
else
|
120
|
+
memo.delete(k).put(k.to_sym, v)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
100
124
|
end
|
101
125
|
end
|
data/spec/hamsterdam_spec.rb
CHANGED
@@ -47,6 +47,22 @@ describe "Hamsterdam structures" do
|
|
47
47
|
it "raises helpful error when constructed with invalid objects" do
|
48
48
|
lambda do struct_class.new("LAWDY") end.should raise_error /Do not want.*LAWDY/
|
49
49
|
end
|
50
|
+
|
51
|
+
describe "inheritance-based definition" do
|
52
|
+
class Castle < Hamsterdam::Struct(:gate, :mote, :walls)
|
53
|
+
def tally
|
54
|
+
gate + mote + walls
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "provides convenient syntax for deriving classes from immutable struct def" do
|
59
|
+
c = Castle.new gate: 2, mote: 1, walls: 4
|
60
|
+
c.gate.should == 2
|
61
|
+
c.mote.should == 1
|
62
|
+
c.walls.should == 4
|
63
|
+
c.tally.should == 7
|
64
|
+
end
|
65
|
+
end
|
50
66
|
end
|
51
67
|
|
52
68
|
describe "equality" do
|
@@ -157,10 +173,39 @@ describe "Hamsterdam structures" do
|
|
157
173
|
end
|
158
174
|
|
159
175
|
it "does a nice job with Hamster Lists, Sets, and Hashes" do
|
160
|
-
thinger = Hamstest::Thinger.new a_hash: Hamster.hash(red: "fish"), a_set: Hamster.set(42
|
161
|
-
expected = "<Thinger a_hash: {:red => \"fish\"} a_set: {42
|
176
|
+
thinger = Hamstest::Thinger.new a_hash: Hamster.hash(red: "fish"), a_set: Hamster.set(42), a_list: Hamster.list(:oh, :the, :things)
|
177
|
+
expected = "<Thinger a_hash: {:red => \"fish\"} a_set: {42} a_list: [:oh, :the, :things]>"
|
162
178
|
thinger.inspect.should == expected
|
163
179
|
thinger.to_s.should == expected
|
164
180
|
end
|
165
181
|
end
|
182
|
+
|
183
|
+
describe "symbol/string insensitivity" do
|
184
|
+
let(:mixed_up) { Hamsterdam::Struct.define(:foo, 'bar') }
|
185
|
+
|
186
|
+
it "lets you define the field names using a mix of string and symbols" do
|
187
|
+
val = mixed_up.new(foo: 1, bar: 2)
|
188
|
+
val.foo.should == 1
|
189
|
+
val.bar.should == 2
|
190
|
+
val = val.set_foo(3)
|
191
|
+
val.foo.should == 3
|
192
|
+
end
|
193
|
+
|
194
|
+
it "lets you construct new values using a mix of strings and symbols" do
|
195
|
+
val = mixed_up.new("foo" => 1, :bar => 2)
|
196
|
+
val.foo.should == 1
|
197
|
+
val.bar.should == 2
|
198
|
+
end
|
199
|
+
|
200
|
+
it "lets you merge values using a mix of strings and symbols" do
|
201
|
+
val = mixed_up.new("foo" => 1, :bar => 2)
|
202
|
+
val.foo.should == 1
|
203
|
+
val.bar.should == 2
|
204
|
+
val = val.merge(:foo => 3, "bar" => 4)
|
205
|
+
val.foo.should == 3
|
206
|
+
val.bar.should == 4
|
207
|
+
|
208
|
+
val.to_hamster_hash.should == Hamster.hash(foo: 3, bar: 4)
|
209
|
+
end
|
210
|
+
end
|
166
211
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hamsterdam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- Gemfile
|
103
103
|
- README.md
|
104
104
|
- Rakefile
|
105
|
+
- TODO.txt
|
105
106
|
- hamsterdam.gemspec
|
106
107
|
- lib/hamsterdam.rb
|
107
108
|
- rake_tasks/rspec.rake
|