mingo 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mingo/cursor.rb CHANGED
@@ -34,6 +34,10 @@ class Mingo
34
34
  convert_document super
35
35
  end
36
36
 
37
+ def empty?
38
+ !has_next?
39
+ end
40
+
37
41
  private
38
42
 
39
43
  def convert_document(doc)
@@ -48,6 +48,10 @@ class Mingo
48
48
  def object_ids
49
49
  @embedded
50
50
  end
51
+
52
+ def include?(doc)
53
+ object_ids.include? convert(doc)
54
+ end
51
55
 
52
56
  def convert(doc)
53
57
  doc.id
@@ -67,6 +71,14 @@ class Mingo
67
71
  unload_collection
68
72
  @embedded.delete doc
69
73
  end
74
+
75
+ def loaded?
76
+ !!@collection
77
+ end
78
+
79
+ def respond_to?(method, priv = false)
80
+ super || method_missing(:respond_to?, method, priv)
81
+ end
70
82
 
71
83
  private
72
84
 
data/lib/mingo.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'active_support/core_ext/hash/conversions'
1
2
  require 'mongo'
2
3
  require 'active_model'
3
4
  require 'hashie/dash'
@@ -6,6 +7,10 @@ BSON::ObjectId.class_eval do
6
7
  def self.[](id)
7
8
  self === id ? id : from_string(id)
8
9
  end
10
+
11
+ def id
12
+ self
13
+ end
9
14
  end
10
15
 
11
16
  class Mingo < Hashie::Dash
@@ -72,7 +77,7 @@ class Mingo < Hashie::Dash
72
77
  attr_reader :changes
73
78
 
74
79
  def initialize(obj = nil)
75
- @changes = Hash.new { |c, key| c[key] = [self[key]] }
80
+ @changes = {}
76
81
  @destroyed = false
77
82
 
78
83
  if obj and obj['_id'].is_a? BSON::ObjectId
@@ -93,6 +98,10 @@ class Mingo < Hashie::Dash
93
98
  _regular_writer(property.to_s, value)
94
99
  end
95
100
 
101
+ # keys are already strings
102
+ def stringify_keys() self end
103
+ alias :stringify_keys! :stringify_keys
104
+
96
105
  def id
97
106
  self['_id']
98
107
  end
@@ -148,10 +157,17 @@ class Mingo < Hashie::Dash
148
157
  end
149
158
 
150
159
  def _regular_writer(key, value)
151
- old_value = _regular_reader(key)
152
- changes[key.to_sym][1] = value unless value == old_value
160
+ track_change(key, value)
153
161
  super
154
162
  end
163
+
164
+ def track_change(key, value)
165
+ old_value = _regular_reader(key)
166
+ unless value == old_value
167
+ memo = (changes[key.to_sym] ||= [old_value])
168
+ memo[0] == value ? changes.delete(key.to_sym) : (memo[1] = value)
169
+ end
170
+ end
155
171
  end
156
172
 
157
173
  if $0 == __FILE__
@@ -169,9 +185,18 @@ if $0 == __FILE__
169
185
  User.collection.remove
170
186
  end
171
187
 
188
+ it "obtains an ID by saving" do
189
+ user = build :name => 'Mislav'
190
+ user.should_not be_persisted
191
+ user.id.should be_nil
192
+ user.save
193
+ raw_doc(user.id)['name'].should == 'Mislav'
194
+ user.should be_persisted
195
+ user.id.should be_a(BSON::ObjectId)
196
+ end
197
+
172
198
  it "tracks changes attribute" do
173
199
  user = build
174
- user.should_not be_persisted
175
200
  user.should_not be_changed
176
201
  user.name = 'Mislav'
177
202
  user.should be_changed
@@ -179,9 +204,15 @@ if $0 == __FILE__
179
204
  user.name = 'Mislav2'
180
205
  user.changes[:name].should == [nil, 'Mislav2']
181
206
  user.save
182
- user.should be_persisted
183
207
  user.should_not be_changed
184
- user.id.should be_a(BSON::ObjectId)
208
+ end
209
+
210
+ it "forgets changed attribute when reset to original value" do
211
+ user = create :name => 'Mislav'
212
+ user.name = 'Mislav2'
213
+ user.should be_changed
214
+ user.name = 'Mislav'
215
+ user.should_not be_changed
185
216
  end
186
217
 
187
218
  it "has a human model name" do
@@ -218,11 +249,33 @@ if $0 == __FILE__
218
249
  end
219
250
  end
220
251
 
221
- it "finds a doc by string ID" do
222
- user = create :name => 'Mislav'
223
- user_dup = described_class.first(user.id.to_s)
224
- user_dup.id.should == user.id
225
- user_dup.name.should == 'Mislav'
252
+ context "existing doc" do
253
+ before do
254
+ @id = described_class.collection.insert :name => 'Mislav', :age => 26
255
+ end
256
+
257
+ it "finds a doc by string ID" do
258
+ user = described_class.first(@id.to_s)
259
+ user.id.should == @id
260
+ user.name.should == 'Mislav'
261
+ user.age.should == 26
262
+ end
263
+
264
+ it "is unchanged after loading" do
265
+ user = described_class.first(@id)
266
+ user.should_not be_changed
267
+ user.age = 27
268
+ user.should be_changed
269
+ user.changes.keys.should == [:age]
270
+ end
271
+
272
+ it "doesn't get changed by an inspect" do
273
+ user = described_class.first(@id)
274
+ # triggers AS stringify_keys, which dups the Dash and writes to it,
275
+ # which mutates the @changes hash from the original Dash
276
+ user.inspect
277
+ user.should_not be_changed
278
+ end
226
279
  end
227
280
 
228
281
  it "returns nil for non-existing doc" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mingo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Mislav Marohni\xC4\x87"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-06 00:00:00 +02:00
18
+ date: 2010-09-12 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency