mordor 0.2.1 → 0.2.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/README.md +6 -0
- data/lib/mordor/resource.rb +28 -1
- data/mordor.gemspec +2 -2
- data/spec/mordor/resource_spec.rb +28 -2
- metadata +4 -4
data/README.md
CHANGED
@@ -8,6 +8,7 @@ class ExampleResource
|
|
8
8
|
attribute :first, :index => true
|
9
9
|
attribute :second
|
10
10
|
attribute :third, :finder_method => :find_by_third_attribute
|
11
|
+
attribute :at, :timestamp => true
|
11
12
|
end
|
12
13
|
```
|
13
14
|
|
@@ -17,3 +18,8 @@ as can be seen with the third attribute.
|
|
17
18
|
|
18
19
|
When the `:index => true` option is set, indices are ensured before each query on
|
19
20
|
the collection. Indices are descending by default, but this can be changed by also supplying a `:index_type => Mongo::ASCENDING` option.
|
21
|
+
|
22
|
+
At most one attribute per Resource can have the option `:timestamp => true` set. This means that the attribute will be saved as one of the two first
|
23
|
+
attributes (the other one being the `_id` attribute. When no value is given for the timestamped attribute, a timestamp with value 0 will be inserted,
|
24
|
+
which results in a timestamp being assigned to it by the MongoDB.
|
25
|
+
An exception is raised when more than one attribute is given the timestamp option
|
data/lib/mordor/resource.rb
CHANGED
@@ -52,10 +52,29 @@ module Mordor
|
|
52
52
|
return !new?
|
53
53
|
end
|
54
54
|
|
55
|
+
def reload
|
56
|
+
return unless _id
|
57
|
+
res = self.class.get(_id).to_hash.each do |k, v|
|
58
|
+
self.send("#{k}=".to_sym, v)
|
59
|
+
end
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
55
63
|
def save
|
56
64
|
unless self._id
|
57
|
-
|
65
|
+
self_hash = self.to_hash
|
66
|
+
if timestamp_attribute = self.class.timestamped_attribute
|
67
|
+
timestamp_value = self_hash.delete(timestamp_attribute)
|
68
|
+
ordered_self_hash = BSON::OrderedHash.new
|
69
|
+
ordered_self_hash[timestamp_attribute] = (timestamp_value.nil? || timestamp_value.empty?) ? BSON::Timestamp.new(0, 0) : timestamp_value
|
70
|
+
self_hash.each do |key, value|
|
71
|
+
ordered_self_hash[key] = value
|
72
|
+
end
|
73
|
+
self_hash = ordered_self_hash
|
74
|
+
end
|
75
|
+
insert_id = self.class.collection.insert(self_hash)
|
58
76
|
self._id = insert_id
|
77
|
+
self.reload
|
59
78
|
else
|
60
79
|
insert_id = self.update
|
61
80
|
end
|
@@ -148,6 +167,9 @@ module Mordor
|
|
148
167
|
Collection.new(self, cursor)
|
149
168
|
end
|
150
169
|
|
170
|
+
def timestamped_attribute
|
171
|
+
@timestamped_attribute
|
172
|
+
end
|
151
173
|
|
152
174
|
def attribute(name, options = {})
|
153
175
|
@attributes ||= []
|
@@ -160,6 +182,11 @@ module Mordor
|
|
160
182
|
@index_types[name] = options[:index_type] ? options[:index_type] : Mongo::DESCENDING
|
161
183
|
end
|
162
184
|
|
185
|
+
if options[:timestamp]
|
186
|
+
raise ArgumentError.new("Only one timestamped attribute is allowed, '#{@timestamped_attribute}' is already timestamped") unless @timestamped_attribute.nil?
|
187
|
+
@timestamped_attribute = name
|
188
|
+
end
|
189
|
+
|
163
190
|
method_name = options.key?(:finder_method) ? options[:finder_method] : "find_by_#{name}"
|
164
191
|
|
165
192
|
class_eval <<-EOS, __FILE__, __LINE__
|
data/mordor.gemspec
CHANGED
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
|
|
2
2
|
s.name = "mordor"
|
3
3
|
|
4
4
|
# Do not set the version and date field manually, this is done by the release script
|
5
|
-
s.version = "0.2.
|
6
|
-
s.date = "2011-12-
|
5
|
+
s.version = "0.2.2"
|
6
|
+
s.date = "2011-12-28"
|
7
7
|
|
8
8
|
s.summary = "mordor"
|
9
9
|
s.description = <<-eos
|
@@ -2,19 +2,20 @@ require File.join(File.dirname(__FILE__), '..', '/spec_helper.rb')
|
|
2
2
|
|
3
3
|
describe "with respect to resources" do
|
4
4
|
before :each do
|
5
|
+
Object.send(:remove_const, :TestResource) if Object.const_defined?(:TestResource)
|
5
6
|
class TestResource
|
6
7
|
include Mordor::Resource
|
7
8
|
|
8
9
|
attribute :first, :index => true
|
9
10
|
attribute :second, :index => true, :index_type => Mongo::ASCENDING
|
10
11
|
attribute :third, :finder_method => :find_by_third_attribute
|
12
|
+
attribute :at, :timestamp => true
|
11
13
|
|
12
14
|
# Put this in here again to ensure the original method is still here
|
13
15
|
class_eval do
|
14
16
|
def self.ensure_indices
|
15
17
|
collection.ensure_index( indices.map{|index| [index.to_s, Mongo::DESCENDING]} ) if indices.any?
|
16
18
|
end
|
17
|
-
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -49,6 +50,10 @@ describe "with respect to resources" do
|
|
49
50
|
|
50
51
|
it "should call ensure_index on the collection for each index when a query is performed" do
|
51
52
|
TestResource.class_eval do
|
53
|
+
def self.reset_ensure_count
|
54
|
+
@count = 0
|
55
|
+
end
|
56
|
+
|
52
57
|
def self.ensure_count
|
53
58
|
@count ||= 0
|
54
59
|
end
|
@@ -70,10 +75,31 @@ describe "with respect to resources" do
|
|
70
75
|
end
|
71
76
|
end
|
72
77
|
TestResource.create({:first => 'first', :second => 'second', :third => 'third'})
|
78
|
+
TestResource.reset_ensure_count
|
73
79
|
TestResource.all()
|
74
80
|
TestResource.ensure_count.should == 1
|
75
81
|
end
|
76
82
|
|
83
|
+
it "should be possible to designate an attribute as a timestamp" do
|
84
|
+
TestResource.timestamped_attribute.should_not be_nil
|
85
|
+
TestResource.timestamped_attribute.should == :at
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should only be possible to have one attribute as a timestamp" do
|
89
|
+
lambda {
|
90
|
+
TestResource2.class_eval do
|
91
|
+
attribute :some_timestamp, :timestamp => true
|
92
|
+
attribute :another_timestamp, :timestamp => true
|
93
|
+
end
|
94
|
+
}.should raise_error
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should provide timestamped attribute as first attribute when creating a Resource" do
|
98
|
+
tr = TestResource.create({:first => 'first'})
|
99
|
+
tr.at.should_not be_nil
|
100
|
+
TestResource.get(tr._id).at.should_not == BSON::Timestamp.new(0,0)
|
101
|
+
end
|
102
|
+
|
77
103
|
context "with respect to replacing params" do
|
78
104
|
before :each do
|
79
105
|
clean_sheet
|
@@ -111,7 +137,7 @@ describe "with respect to resources" do
|
|
111
137
|
it "should correctly respond to to_hash" do
|
112
138
|
resource = TestResource.new({:first => "first", :second => "second", :third => "third"})
|
113
139
|
hash = resource.to_hash
|
114
|
-
hash.size.should ==
|
140
|
+
hash.size.should == 4
|
115
141
|
hash[:first].should == "first"
|
116
142
|
hash[:second].should == "second"
|
117
143
|
hash[:third].should == "third"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mordor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jan-Willem Koelewijn
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-12-
|
19
|
+
date: 2011-12-28 00:00:00 +01:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|