remodel 0.1.1 → 0.1.2

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
data/lib/remodel.rb CHANGED
@@ -109,6 +109,11 @@ module Remodel
109
109
  _add_to_reverse_association_of(entity) if @reverse
110
110
  _add(entity)
111
111
  end
112
+
113
+ def remove(entity)
114
+ _remove_from_reverse_association_of(entity) if @reverse
115
+ _remove(entity)
116
+ end
112
117
 
113
118
  private
114
119
 
@@ -119,8 +124,9 @@ module Remodel
119
124
  end
120
125
 
121
126
  def _remove(entity)
122
- delete_if { |x| x.key = entity.key }
127
+ delete_if { |x| x.key == entity.key }
123
128
  Remodel.redis.lrem(@key, 0, entity.key)
129
+ entity
124
130
  end
125
131
 
126
132
  def _add_to_reverse_association_of(entity)
@@ -130,6 +136,14 @@ module Remodel
130
136
  entity.send("_#{@reverse}=", @this)
131
137
  end
132
138
  end
139
+
140
+ def _remove_from_reverse_association_of(entity)
141
+ if entity.send(@reverse).is_a? HasMany
142
+ entity.send(@reverse).send(:_remove, @this)
143
+ else
144
+ entity.send("_#{@reverse}=", nil)
145
+ end
146
+ end
133
147
 
134
148
  def _fetch(clazz, key)
135
149
  keys = Remodel.redis.lrange(key, 0, -1)
@@ -149,6 +163,7 @@ module Remodel
149
163
  def initialize(attributes = {}, key = nil)
150
164
  @attributes = {}
151
165
  @key = key
166
+ attributes = self.class.default_values.merge(attributes) if key.nil?
152
167
  attributes.each do |name, value|
153
168
  send("#{name}=", value) if respond_to? "#{name}="
154
169
  end
@@ -183,6 +198,10 @@ module Remodel
183
198
  Remodel.redis.del(@key)
184
199
  end
185
200
 
201
+ def as_json
202
+ { :id => id }.merge(@attributes)
203
+ end
204
+
186
205
  def to_json
187
206
  JSON.generate(self.class.pack(@attributes))
188
207
  end
@@ -225,6 +244,7 @@ module Remodel
225
244
  def self.property(name, options = {})
226
245
  name = name.to_sym
227
246
  mapper[name] = Remodel.mapper_for(options[:class])
247
+ default_values[name] = options[:default] if options.has_key?(:default)
228
248
  define_method(name) { @attributes[name] }
229
249
  define_method("#{name}=") { |value| @attributes[name] = value }
230
250
  end
@@ -337,6 +357,11 @@ module Remodel
337
357
  def self.mapper
338
358
  @mapper ||= {}
339
359
  end
360
+
361
+ def self.default_values
362
+ @default_values ||= {}
363
+ end
364
+
340
365
  end
341
366
 
342
367
  end
data/remodel.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{remodel}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tim Lossen"]
12
- s.date = %q{2010-04-28}
12
+ s.date = %q{2010-04-30}
13
13
  s.default_executable = %q{redis-monitor.rb}
14
14
  s.description = %q{build your domain model in ruby, persist your objects to redis.}
15
15
  s.email = %q{tim@lossen.de}
data/test/test_entity.rb CHANGED
@@ -5,7 +5,9 @@ class Foo < Remodel::Entity
5
5
  property :y
6
6
  end
7
7
 
8
- class Bar < Remodel::Entity; end
8
+ class Bar < Remodel::Entity
9
+ property :d, :default => 123
10
+ end
9
11
 
10
12
  class TestEntity < Test::Unit::TestCase
11
13
 
@@ -28,7 +30,17 @@ class TestEntity < Test::Unit::TestCase
28
30
 
29
31
  should "not set the id" do
30
32
  foo = Foo.new :x => 23
31
- assert_equal nil, foo.id
33
+ assert_equal nil, foo.id
34
+ end
35
+
36
+ should "use default values for missing properties" do
37
+ bar = Bar.new
38
+ assert_equal 123, bar.d
39
+ end
40
+
41
+ should "not use default values for given properties" do
42
+ bar = Bar.new :d => 'cool'
43
+ assert_equal 'cool', bar.d
32
44
  end
33
45
  end
34
46
 
@@ -69,7 +81,17 @@ class TestEntity < Test::Unit::TestCase
69
81
  should "not store the key as a property" do
70
82
  foo = Foo.create :x => 'hello', :y => false
71
83
  assert !(/f:1/ =~ redis.get(foo.key))
72
- end
84
+ end
85
+
86
+ should "use default values for missing properties" do
87
+ bar = Bar.create
88
+ assert_equal 123, bar.d
89
+ end
90
+
91
+ should "not use default values for given properties" do
92
+ bar = Bar.create :d => 'cool'
93
+ assert_equal 'cool', bar.d
94
+ end
73
95
  end
74
96
 
75
97
  context "save" do
@@ -167,6 +189,22 @@ class TestEntity < Test::Unit::TestCase
167
189
  end
168
190
  end
169
191
 
192
+ context "to_json" do
193
+ should "serialize to json" do
194
+ foo = Foo.new :x => 42, :y => true
195
+ assert_match /"x":42/, foo.to_json
196
+ assert_match /"y":true/, foo.to_json
197
+ end
198
+ end
199
+
200
+ context "as_json" do
201
+ should "serialize into a hash" do
202
+ foo = Foo.create :x => 42, :y => true
203
+ expected = { :id => foo.id, :x => 42, :y => true }
204
+ assert_equal expected, foo.as_json
205
+ end
206
+ end
207
+
170
208
  context "#set_key_prefix" do
171
209
  should "use the given key prefix" do
172
210
  class Custom < Remodel::Entity; set_key_prefix 'my'; end
@@ -180,11 +218,11 @@ class TestEntity < Test::Unit::TestCase
180
218
  end
181
219
  end
182
220
 
183
- context "find" do
221
+ context "#find" do
184
222
  setup do
185
223
  redis.flushdb
186
224
  @foo = Foo.create :x => 'hello', :y => 123
187
- @bar = Foo.create :x => 'hallo', :y => 124
225
+ Foo.create :x => 'hallo', :y => 124
188
226
  end
189
227
 
190
228
  should "find and load an entity by key" do
@@ -208,7 +246,7 @@ class TestEntity < Test::Unit::TestCase
208
246
  end
209
247
  end
210
248
 
211
- context "all" do
249
+ context "#all" do
212
250
  setup do
213
251
  redis.flushdb
214
252
  17.times { |i| Foo.create :x => 'hello', :y => i }
@@ -275,15 +313,7 @@ class TestEntity < Test::Unit::TestCase
275
313
  end
276
314
  end
277
315
 
278
- context "json" do
279
- should "serialize to json" do
280
- foo = Foo.new :x => 42, :y => true
281
- assert_match /"x":42/, foo.to_json
282
- assert_match /"y":true/, foo.to_json
283
- end
284
- end
285
-
286
- context "restore" do
316
+ context "#restore" do
287
317
  should "restore an entity from json" do
288
318
  before = Foo.create :x => 42, :y => true
289
319
  after = Foo.restore(before.key, before.to_json)
@@ -41,13 +41,37 @@ class TestManyToMany < Test::Unit::TestCase
41
41
  should "add a new group to both associations" do
42
42
  @tim.groups.add(@rugb)
43
43
  assert_equal [@tim], @rugb.members
44
+ assert_equal [@rugb], @tim.groups
44
45
  end
45
46
 
46
47
  should "add a new person to both associations" do
47
48
  @rugb.members.add(@tim)
49
+ assert_equal [@tim], @rugb.members
48
50
  assert_equal [@rugb], @tim.groups
49
51
  end
50
52
  end
53
+
54
+ context "remove" do
55
+ setup do
56
+ @tim = Person.create :name => 'tim'
57
+ @rugb = @tim.groups.create(:name => 'rug-b')
58
+ @erlang = @tim.groups.create(:name => 'erlang')
59
+ @aws = @tim.groups.create(:name => 'aws')
60
+ end
61
+
62
+ should "remove a group from both associations" do
63
+ @tim.groups.remove(@erlang)
64
+ assert_equal [@rugb, @aws], @tim.groups
65
+ assert_equal [], @erlang.members
66
+ end
67
+
68
+ should "remove a person from both associations" do
69
+ @erlang.members.remove(@tim)
70
+ assert_equal [@rugb, @aws], @tim.groups
71
+ assert_equal [], @erlang.members
72
+ end
73
+
74
+ end
51
75
  end
52
76
 
53
77
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Lossen
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-28 00:00:00 +02:00
12
+ date: 2010-04-30 00:00:00 +02:00
13
13
  default_executable: redis-monitor.rb
14
14
  dependencies: []
15
15