mongo_doc 0.6.3 → 0.6.4

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.textile CHANGED
@@ -1,6 +1,6 @@
1
1
  h1. MongoDoc
2
2
 
3
- Version: Hurricane (0.6.2) 2010/06/25
3
+ Version: Hurricane (0.6.4) 2010/07/07
4
4
 
5
5
  h2. Notes
6
6
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.3
1
+ 0.6.4
@@ -123,6 +123,12 @@ Then /^the document '(.+)' does not roundtrip$/ do |name|
123
123
  from_db.should_not == object
124
124
  end
125
125
 
126
+ Then /^the document '(\w+)' is reloaded$/ do |name|
127
+ object = instance_variable_get("@#{name}")
128
+ from_db = object.class.find_one(object._id)
129
+ instance_variable_set("@#{name}", from_db)
130
+ end
131
+
126
132
  Then /^the last return value is (.+)$/ do |bool_val|
127
133
  @last_return.should send("be_#{bool_val}")
128
134
  end
@@ -38,3 +38,11 @@ class Event
38
38
 
39
39
  embed_hash :addresses
40
40
  end
41
+
42
+ class Person
43
+ include MongoDoc::Document
44
+
45
+ attr_accessor :name
46
+
47
+ timestamps!
48
+ end
@@ -0,0 +1,4 @@
1
+ Then /^the field (\w+) of the document '(\w+)' is not nil$/ do |field, name|
2
+ doc = instance_variable_get("@#{name}")
3
+ doc.send(field).should_not be_nil
4
+ end
@@ -0,0 +1,14 @@
1
+ Feature: Timestamps
2
+
3
+ Background:
4
+ Given an empty Person document collection
5
+ And a Person document named 'Fry' :
6
+ | Name |
7
+ | Philip J. Fry |
8
+
9
+ Scenario: Creation time
10
+ When I save the document 'Fry'
11
+ And the document 'Fry' is reloaded
12
+ Then the field created_at of the document 'Fry' is not nil
13
+ And the field updated_at of the document 'Fry' is not nil
14
+
@@ -6,6 +6,7 @@ require 'mongo_doc/criteria'
6
6
  require 'mongo_doc/finders'
7
7
  require 'mongo_doc/index'
8
8
  require 'mongo_doc/scope'
9
+ require 'mongo_doc/timestamps'
9
10
  require 'active_model/naming'
10
11
  require 'active_model/translation'
11
12
  require 'active_model/deprecated_error_methods'
@@ -31,6 +32,7 @@ module MongoDoc
31
32
  extend Finders
32
33
  extend Index
33
34
  extend Scope
35
+ extend Timestamps
34
36
  include ::ActiveModel::Validations
35
37
  extend ::ActiveModel::Naming
36
38
  extend Validations
@@ -103,7 +105,6 @@ module MongoDoc
103
105
  end
104
106
 
105
107
  def update_attributes!(attrs)
106
- strict = attrs.delete(:__strict__)
107
108
  self.attributes = attrs
108
109
  return save! if new_record?
109
110
  raise DocumentInvalidError unless valid?
@@ -4,9 +4,9 @@ class Numeric
4
4
  end
5
5
  end
6
6
 
7
- class BigDecimal
7
+ class Float
8
8
  def self.cast_from_string(string)
9
- BigDecimal.new(string) unless string.blank?
9
+ string.to_f unless string.blank?
10
10
  end
11
11
  end
12
12
 
@@ -0,0 +1,54 @@
1
+ module MongoDoc
2
+ module Timestamps
3
+
4
+ # Create automatic timestamps on a +root+ Document. Timestamps are not
5
+ # implemented for embedded documents.
6
+ #
7
+ # Two timestamps fields are created: +created_at+, +updated_at+
8
+ #
9
+ # +created_at+:: set on initial save only
10
+ # +updated_at+:: set on every save
11
+ def timestamps!
12
+ [:created_at, :updated_at].each do |name|
13
+ _keys << name unless _keys.include?(name)
14
+ attr_reader name
15
+ module_eval(<<-RUBY, __FILE__, __LINE__)
16
+ def #{name}=(value) # def created_at=(value)
17
+ if value.kind_of?(String) # if value.kind_of?(String)
18
+ value = Time.cast_from_string(value) # value = Time.cast_from_string(value)
19
+ end # end
20
+ @#{name} = value.nil? ? nil : value.utc # @created_at = value.nil? ? nil : value.utc
21
+ end # end
22
+ RUBY
23
+ end
24
+
25
+ module_eval do
26
+ def _save(safe)
27
+ if new_record?
28
+ self.created_at = self.updated_at = Time.now
29
+ else
30
+ original_updated_at = updated_at
31
+ self.updated_at = Time.now
32
+ end
33
+ super
34
+ rescue Mongo::MongoDBError => e
35
+ if new_record?
36
+ self.created_at = self.updated_at = nil
37
+ else
38
+ self.updated_at = original_updated_at
39
+ end
40
+ raise e
41
+ end
42
+
43
+ def _update(selector, data, safe)
44
+ original_updated_at = updated_at
45
+ self.updated_at = Time.now
46
+ super
47
+ rescue Mongo::MongoDBError => e
48
+ self.updated_at = original_updated_at
49
+ raise e
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
data/lib/mongo_doc.rb CHANGED
@@ -3,7 +3,7 @@ require 'active_support'
3
3
  require 'active_support/core_ext'
4
4
 
5
5
  module MongoDoc
6
- VERSION = '0.6.2'
6
+ VERSION = '0.6.4'
7
7
  end
8
8
 
9
9
  require 'mongo_doc/connection'
data/mongo_doc.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongo_doc}
8
- s.version = "0.6.3"
8
+ s.version = "0.6.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Les Hill"]
12
- s.date = %q{2010-06-27}
12
+ s.date = %q{2010-07-07}
13
13
  s.description = %q{ODM for MongoDB}
14
14
  s.email = %q{leshill@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -47,6 +47,7 @@ Gem::Specification.new do |s|
47
47
  "features/step_definitions/document_steps.rb",
48
48
  "features/step_definitions/documents.rb",
49
49
  "features/step_definitions/embed_hash_steps.rb",
50
+ "features/step_definitions/field_steps.rb",
50
51
  "features/step_definitions/finder_steps.rb",
51
52
  "features/step_definitions/index_steps.rb",
52
53
  "features/step_definitions/json_steps.rb",
@@ -60,6 +61,7 @@ Gem::Specification.new do |s|
60
61
  "features/step_definitions/util_steps.rb",
61
62
  "features/string_casting.feature",
62
63
  "features/support/support.rb",
64
+ "features/timestamps.feature",
63
65
  "features/using_criteria.feature",
64
66
  "lib/mongo_doc.rb",
65
67
  "lib/mongo_doc/associations.rb",
@@ -102,6 +104,7 @@ Gem::Specification.new do |s|
102
104
  "lib/mongo_doc/railties/config.rb",
103
105
  "lib/mongo_doc/root.rb",
104
106
  "lib/mongo_doc/scope.rb",
107
+ "lib/mongo_doc/timestamps.rb",
105
108
  "lib/mongo_doc/validations.rb",
106
109
  "lib/mongo_doc/validations/validates_embedded.rb",
107
110
  "lib/mongoid/contexts/enumerable.rb",
@@ -162,6 +165,7 @@ Gem::Specification.new do |s|
162
165
  "spec/root_spec.rb",
163
166
  "spec/scope_spec.rb",
164
167
  "spec/spec_helper.rb",
168
+ "spec/timestamps_spec.rb",
165
169
  "spec/validations_spec.rb"
166
170
  ]
167
171
  s.homepage = %q{http://github.com/leshill/mongodoc}
@@ -200,6 +204,7 @@ Gem::Specification.new do |s|
200
204
  "spec/root_spec.rb",
201
205
  "spec/scope_spec.rb",
202
206
  "spec/spec_helper.rb",
207
+ "spec/timestamps_spec.rb",
203
208
  "spec/validations_spec.rb",
204
209
  "examples/simple_document.rb",
205
210
  "examples/simple_object.rb"
data/spec/ext_spec.rb CHANGED
@@ -46,15 +46,15 @@ describe "Ruby Object Extensions" do
46
46
  end
47
47
  end
48
48
 
49
- context "Numeric" do
50
- context "BigDecimal" do
49
+ context "Numbers" do
50
+ context "Float" do
51
51
  it "returns nil for a blank string" do
52
- BigDecimal.cast_from_string('').should be_nil
52
+ Float.cast_from_string('').should be_nil
53
53
  end
54
54
 
55
55
  it "converts from a string to a BigDecimal" do
56
- big_decimal = BigDecimal.new("123")
57
- BigDecimal.cast_from_string(big_decimal.to_s).should == big_decimal
56
+ float = "12345.6789".to_f
57
+ Float.cast_from_string(float.to_s).should == float
58
58
  end
59
59
  end
60
60
 
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe MongoDoc::Timestamps do
4
+ class TimestampsTest
5
+ include MongoDoc::Document
6
+
7
+ attr_accessor :name
8
+
9
+ timestamps!
10
+ end
11
+
12
+ let(:collection) { stub(:save => ::BSON::ObjectID.new, :update => true) }
13
+ let(:document) { TimestampsTest.new }
14
+
15
+ before do
16
+ TimestampsTest.stub(:collection).and_return(collection)
17
+ end
18
+
19
+ it "has a created_at attribute" do
20
+ document.should respond_to(:created_at)
21
+ document.should respond_to(:created_at=)
22
+ end
23
+
24
+ it "has an updated_at attribute" do
25
+ document.should respond_to(:updated_at)
26
+ document.should respond_to(:updated_at=)
27
+ end
28
+
29
+ context "on initial save" do
30
+ context "that suceeeds" do
31
+ it "sets the created_at timestamp" do
32
+ document.save
33
+ document.created_at.should_not be_nil
34
+ end
35
+
36
+ it "sets the updated_at timestamp" do
37
+ document.save
38
+ document.updated_at.should_not be_nil
39
+ end
40
+
41
+ it "the created_at and updated_at timestamps are the same" do
42
+ document.save
43
+ document.created_at.should == document.updated_at
44
+ end
45
+
46
+ it "sets the timezone to UTC" do
47
+ document.save
48
+ document.created_at.zone.should == "UTC"
49
+ end
50
+ end
51
+
52
+ context "that fails" do
53
+ before do
54
+ collection.stub(:save).and_raise(Mongo::MongoDBError.new)
55
+ end
56
+
57
+ it "does not set the created_at timestamp" do
58
+ document.save rescue nil
59
+ document.created_at.should be_nil
60
+ end
61
+
62
+ it "does not set the updated_at timestamp" do
63
+ document.save rescue nil
64
+ document.updated_at.should be_nil
65
+ end
66
+ end
67
+ end
68
+
69
+ context "on subsequent save" do
70
+ before do
71
+ document.save
72
+ end
73
+
74
+ context "that suceeeds" do
75
+ let!(:original_created_at) { document.created_at }
76
+
77
+ it "leaves the created_at timestamp unchanged" do
78
+ document.save
79
+ document.created_at.should == original_created_at
80
+ end
81
+
82
+ it "sets the updated_at timestamp" do
83
+ document.save
84
+ document.updated_at.should_not == original_created_at
85
+ end
86
+
87
+ it "the created_at and updated_at timestamps are not the same" do
88
+ document.save
89
+ document.created_at.should_not == document.updated_at
90
+ end
91
+ end
92
+
93
+ context "that fails" do
94
+ let!(:original_created_at) { document.created_at }
95
+
96
+ before do
97
+ collection.stub(:save).and_raise(Mongo::MongoDBError.new)
98
+ end
99
+
100
+ it "leaves the created_at timestamp unchanged" do
101
+ document.save rescue nil
102
+ document.created_at.should == original_created_at
103
+ end
104
+
105
+ it "leaves the updated_at timestamp unchanged" do
106
+ document.save rescue nil
107
+ document.updated_at.should == original_created_at
108
+ end
109
+ end
110
+ end
111
+
112
+ context "on update attributes" do
113
+ before do
114
+ document.save
115
+ end
116
+
117
+ context "that suceeeds" do
118
+ let!(:original_created_at) { document.created_at }
119
+
120
+ it "leaves the created_at timestamp unchanged" do
121
+ document.update_attributes(:name => 'name')
122
+ document.created_at.should == original_created_at
123
+ end
124
+
125
+ it "sets the updated_at timestamp" do
126
+ document.update_attributes(:name => 'name')
127
+ document.updated_at.should_not == original_created_at
128
+ end
129
+
130
+ it "the created_at and updated_at timestamps are not the same" do
131
+ document.update_attributes(:name => 'name')
132
+ document.created_at.should_not == document.updated_at
133
+ end
134
+ end
135
+
136
+ context "that fails" do
137
+ let!(:original_created_at) { document.created_at }
138
+
139
+ before do
140
+ collection.stub(:update).and_raise(Mongo::MongoDBError.new)
141
+ end
142
+
143
+ it "leaves the created_at timestamp unchanged" do
144
+ document.update_attributes(:name => 'name') rescue nil
145
+ document.created_at.should == original_created_at
146
+ end
147
+
148
+ it "leaves the updated_at timestamp unchanged" do
149
+ document.update_attributes(:name => 'name') rescue nil
150
+ document.updated_at.should == original_created_at
151
+ end
152
+ end
153
+ end
154
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_doc
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 3
10
- version: 0.6.3
9
+ - 4
10
+ version: 0.6.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Les Hill
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-27 00:00:00 -04:00
18
+ date: 2010-07-07 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -176,6 +176,7 @@ files:
176
176
  - features/step_definitions/document_steps.rb
177
177
  - features/step_definitions/documents.rb
178
178
  - features/step_definitions/embed_hash_steps.rb
179
+ - features/step_definitions/field_steps.rb
179
180
  - features/step_definitions/finder_steps.rb
180
181
  - features/step_definitions/index_steps.rb
181
182
  - features/step_definitions/json_steps.rb
@@ -189,6 +190,7 @@ files:
189
190
  - features/step_definitions/util_steps.rb
190
191
  - features/string_casting.feature
191
192
  - features/support/support.rb
193
+ - features/timestamps.feature
192
194
  - features/using_criteria.feature
193
195
  - lib/mongo_doc.rb
194
196
  - lib/mongo_doc/associations.rb
@@ -231,6 +233,7 @@ files:
231
233
  - lib/mongo_doc/railties/config.rb
232
234
  - lib/mongo_doc/root.rb
233
235
  - lib/mongo_doc/scope.rb
236
+ - lib/mongo_doc/timestamps.rb
234
237
  - lib/mongo_doc/validations.rb
235
238
  - lib/mongo_doc/validations/validates_embedded.rb
236
239
  - lib/mongoid/contexts/enumerable.rb
@@ -291,6 +294,7 @@ files:
291
294
  - spec/root_spec.rb
292
295
  - spec/scope_spec.rb
293
296
  - spec/spec_helper.rb
297
+ - spec/timestamps_spec.rb
294
298
  - spec/validations_spec.rb
295
299
  has_rdoc: true
296
300
  homepage: http://github.com/leshill/mongodoc
@@ -357,6 +361,7 @@ test_files:
357
361
  - spec/root_spec.rb
358
362
  - spec/scope_spec.rb
359
363
  - spec/spec_helper.rb
364
+ - spec/timestamps_spec.rb
360
365
  - spec/validations_spec.rb
361
366
  - examples/simple_document.rb
362
367
  - examples/simple_object.rb