rmodel 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/README.md +29 -1
- data/examples/timestamps.rb +25 -0
- data/lib/rmodel/mongo/repository.rb +2 -0
- data/lib/rmodel/mongo/repository_ext/timestampable.rb +20 -0
- data/lib/rmodel/version.rb +1 -1
- data/spec/rmodel/mongo/{repository_queryable_spec.rb → repository_ext/queryable_spec.rb} +0 -0
- data/spec/rmodel/mongo/repository_ext/timestampable_spec.rb +73 -0
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d6692638747de91e5cb796e6141d501bca570af
|
4
|
+
data.tar.gz: 5a80109b93f41f8bd2c68ae110420c8b9d20ab8c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 468a0b7cefbf30b51321ec32707dd86ef377bba8f0a0238e3f63b43603acec73ac87beefc1f67ddffc80effda796352bd961aec65151fd86d0c2bb0faa3d51a6
|
7
|
+
data.tar.gz: 28cd0af645f741b54336d2da76ea76833f0bfa1e4f5ed069804a58f98f5381672a3bbbc58cae72a294cd944cac3332e0cb208386c808f7bdb4a73b72ee8ddcc4
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -116,7 +116,7 @@ userRepository.remove(bob)
|
|
116
116
|
|
117
117
|
p userRepository.find(john.id) # #<User:0x000000037237d0 @name="John Smith" ... >
|
118
118
|
p userRepository.find(bob.id) # nil
|
119
|
-
p userRepository.find!(bob.id) #
|
119
|
+
p userRepository.find!(bob.id) # raises Rmodel::NotFound
|
120
120
|
```
|
121
121
|
|
122
122
|
### Scopes
|
@@ -156,6 +156,34 @@ userRepository.query.have_email.remove
|
|
156
156
|
p userRepository.query.count # 0
|
157
157
|
```
|
158
158
|
|
159
|
+
### Timestamps
|
160
|
+
|
161
|
+
Here is an example how to track the time, when the entity was created and updated.
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
class Thing
|
165
|
+
attr_accessor :id, :name, :created_at, :updated_at
|
166
|
+
end
|
167
|
+
|
168
|
+
class ThingRepository < Rmodel::Mongo::Repository
|
169
|
+
simple_factory Thing, :name, :created_at, :updated_at
|
170
|
+
end
|
171
|
+
repo = ThingRepository.new
|
172
|
+
|
173
|
+
thing = Thing.new
|
174
|
+
thing.name = 'chair'
|
175
|
+
repo.insert(thing)
|
176
|
+
p thing.created_at
|
177
|
+
|
178
|
+
sleep 2
|
179
|
+
|
180
|
+
thing.name = 'table'
|
181
|
+
repo.update(thing)
|
182
|
+
p thing.updated_at
|
183
|
+
```
|
184
|
+
|
185
|
+
To enable time tracking just add attributes `created_at` and `updated_at` or one of them to your entity.
|
186
|
+
|
159
187
|
## Contributing
|
160
188
|
|
161
189
|
1. Fork it ( https://github.com/alexei-lexx/rmodel/fork )
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rmodel'
|
2
|
+
|
3
|
+
Rmodel.setup do
|
4
|
+
client :default, { hosts: [ 'localhost' ], database: 'test' }
|
5
|
+
end
|
6
|
+
|
7
|
+
class Thing
|
8
|
+
attr_accessor :id, :name, :created_at, :updated_at
|
9
|
+
end
|
10
|
+
|
11
|
+
class ThingRepository < Rmodel::Mongo::Repository
|
12
|
+
simple_factory Thing, :name, :created_at, :updated_at
|
13
|
+
end
|
14
|
+
repo = ThingRepository.new
|
15
|
+
|
16
|
+
thing = Thing.new
|
17
|
+
thing.name = 'chair'
|
18
|
+
repo.insert(thing)
|
19
|
+
p "#{thing.created_at} / #{thing.updated_at}"
|
20
|
+
|
21
|
+
sleep 2
|
22
|
+
|
23
|
+
thing.name = 'table'
|
24
|
+
repo.update(thing)
|
25
|
+
p "#{thing.created_at} / #{thing.updated_at}"
|
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'mongo'
|
2
2
|
require 'active_support/inflector'
|
3
3
|
require 'rmodel/mongo/repository_ext/queryable'
|
4
|
+
require 'rmodel/mongo/repository_ext/timestampable'
|
4
5
|
|
5
6
|
module Rmodel::Mongo
|
6
7
|
class Repository
|
7
8
|
include RepositoryExt::Queryable
|
9
|
+
prepend RepositoryExt::Timestampable
|
8
10
|
|
9
11
|
def initialize
|
10
12
|
@client = Rmodel.setup.establish_mongo_client(self.class.client_name || :default) or
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rmodel::Mongo
|
2
|
+
module RepositoryExt
|
3
|
+
module Timestampable
|
4
|
+
|
5
|
+
def insert(object)
|
6
|
+
if object.respond_to?(:created_at) && object.respond_to?(:created_at=)
|
7
|
+
object.created_at ||= Time.now
|
8
|
+
end
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def update(object)
|
13
|
+
if object.respond_to?(:updated_at) && object.respond_to?(:updated_at=)
|
14
|
+
object.updated_at = Time.now
|
15
|
+
end
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rmodel/version.rb
CHANGED
File without changes
|
@@ -0,0 +1,73 @@
|
|
1
|
+
RSpec.describe Rmodel::Mongo::Repository do
|
2
|
+
describe Rmodel::Mongo::RepositoryExt::Timestampable do
|
3
|
+
subject(:repo) { ThingRepository.new }
|
4
|
+
|
5
|
+
context 'when the entity object has attributes created_at and updated_at' do
|
6
|
+
before do
|
7
|
+
stub_const('Thing', Struct.new(:id, :name, :created_at, :updated_at))
|
8
|
+
stub_const('ThingRepository', Class.new(Rmodel::Mongo::Repository) {
|
9
|
+
simple_factory Thing, :name, :created_at, :updated_at
|
10
|
+
})
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when we insert(object)' do
|
14
|
+
context 'and the object.created_at is already set' do
|
15
|
+
let(:thing) { Thing.new(nil, 'chair', Time.now) }
|
16
|
+
|
17
|
+
it 'doesnt change the value of created_at' do
|
18
|
+
set_created_at = thing.created_at
|
19
|
+
repo.insert(thing)
|
20
|
+
expect(thing.created_at).to eq set_created_at
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'and the object.created_at is not set yet' do
|
25
|
+
let(:thing) { Thing.new(nil, 'chair') }
|
26
|
+
|
27
|
+
it 'sets the value of created_at' do
|
28
|
+
repo.insert(thing)
|
29
|
+
expect(thing.created_at).not_to be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'when we update(object)' do
|
35
|
+
let(:thing) { Thing.new(nil, 'chair') }
|
36
|
+
before { repo.insert(thing) }
|
37
|
+
|
38
|
+
it 'sets the value of created_at' do
|
39
|
+
thing.name = 'table'
|
40
|
+
repo.update(thing)
|
41
|
+
expect(thing.updated_at).not_to be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'when the entity has no attributes :created_at and updated_at' do
|
47
|
+
before do
|
48
|
+
stub_const('Thing', Struct.new(:id, :name))
|
49
|
+
stub_const('ThingRepository', Class.new(Rmodel::Mongo::Repository) {
|
50
|
+
simple_factory Thing, :name
|
51
|
+
})
|
52
|
+
end
|
53
|
+
let(:thing) { Thing.new(nil, 'chair') }
|
54
|
+
|
55
|
+
context 'when we insert(object)' do
|
56
|
+
it 'does nothing special' do
|
57
|
+
repo.insert(thing)
|
58
|
+
expect(thing.respond_to?(:created_at)).to be false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when we update(object)' do
|
63
|
+
before { repo.insert(thing) }
|
64
|
+
|
65
|
+
it 'does nothing special' do
|
66
|
+
thing.name = 'table'
|
67
|
+
repo.update(thing)
|
68
|
+
expect(thing.respond_to?(:updated_at)).to be false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexei
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongo
|
@@ -108,20 +108,23 @@ files:
|
|
108
108
|
- LICENSE.txt
|
109
109
|
- README.md
|
110
110
|
- Rakefile
|
111
|
+
- examples/timestamps.rb
|
111
112
|
- examples/user.rb
|
112
113
|
- lib/rmodel.rb
|
113
114
|
- lib/rmodel/errors.rb
|
114
115
|
- lib/rmodel/mongo/repository.rb
|
115
116
|
- lib/rmodel/mongo/repository_ext/query.rb
|
116
117
|
- lib/rmodel/mongo/repository_ext/queryable.rb
|
118
|
+
- lib/rmodel/mongo/repository_ext/timestampable.rb
|
117
119
|
- lib/rmodel/mongo/setup.rb
|
118
120
|
- lib/rmodel/mongo/simple_factory.rb
|
119
121
|
- lib/rmodel/setup.rb
|
120
122
|
- lib/rmodel/version.rb
|
121
123
|
- rmodel.gemspec
|
122
124
|
- spec/rmodel/mongo/repository_crud_spec.rb
|
125
|
+
- spec/rmodel/mongo/repository_ext/queryable_spec.rb
|
126
|
+
- spec/rmodel/mongo/repository_ext/timestampable_spec.rb
|
123
127
|
- spec/rmodel/mongo/repository_initialize_spec.rb
|
124
|
-
- spec/rmodel/mongo/repository_queryable_spec.rb
|
125
128
|
- spec/rmodel/mongo/simple_factory_spec.rb
|
126
129
|
- spec/rmodel/setup_spec.rb
|
127
130
|
- spec/shared/clean_moped.rb
|
@@ -152,8 +155,9 @@ specification_version: 4
|
|
152
155
|
summary: Rmodel is an ORM library, which tends to follow the SOLID principles.
|
153
156
|
test_files:
|
154
157
|
- spec/rmodel/mongo/repository_crud_spec.rb
|
158
|
+
- spec/rmodel/mongo/repository_ext/queryable_spec.rb
|
159
|
+
- spec/rmodel/mongo/repository_ext/timestampable_spec.rb
|
155
160
|
- spec/rmodel/mongo/repository_initialize_spec.rb
|
156
|
-
- spec/rmodel/mongo/repository_queryable_spec.rb
|
157
161
|
- spec/rmodel/mongo/simple_factory_spec.rb
|
158
162
|
- spec/rmodel/setup_spec.rb
|
159
163
|
- spec/shared/clean_moped.rb
|