rmodel 0.1.0 → 0.2.0.pre.dev

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d6692638747de91e5cb796e6141d501bca570af
4
- data.tar.gz: 5a80109b93f41f8bd2c68ae110420c8b9d20ab8c
3
+ metadata.gz: 44999ed4c612599521faacd1a1f596d4a2df3d6a
4
+ data.tar.gz: 550ec35f4c18a10085fe3e9db5551d4e284fca6b
5
5
  SHA512:
6
- metadata.gz: 468a0b7cefbf30b51321ec32707dd86ef377bba8f0a0238e3f63b43603acec73ac87beefc1f67ddffc80effda796352bd961aec65151fd86d0c2bb0faa3d51a6
7
- data.tar.gz: 28cd0af645f741b54336d2da76ea76833f0bfa1e4f5ed069804a58f98f5381672a3bbbc58cae72a294cd944cac3332e0cb208386c808f7bdb4a73b72ee8ddcc4
6
+ metadata.gz: 7e29bbc798c026d05c25cfa267cbdc635843b6961d031f957a3746673768d6553c93dfbdd63ce93f3184bffb2c7b6a749c264910a517c9f6834d0e7e2f653a05
7
+ data.tar.gz: 78423c914c99491860007d0d59a9b4b7f2850c3dcccec63d4da249d5ca483416f5f420d2114c929a68bbf66f94d343c242cae00989c26fd74c6c9b9332dca89f
data/README.md CHANGED
@@ -2,8 +2,18 @@
2
2
 
3
3
  # Rmodel
4
4
 
5
+ * [Installation](#installation)
6
+ * [Usage](#usage)
7
+ * [CRUD](#crud)
8
+ * [Scopes](#scopes)
9
+ * [Timestamps](#timestamps)
10
+ * [Sugar methods](#sugar-methods)
11
+ * [Advanced creation of repository](#advanced-creation-of-repository)
12
+
5
13
  Rmodel is an ORM library, which tends to follow the SOLID principles.
6
14
 
15
+ **Currently works with MongoDB only.**
16
+
7
17
  The main thoughts behind it are:
8
18
 
9
19
  * let you models be simple and independent of the persistent layer,
@@ -116,7 +126,6 @@ userRepository.remove(bob)
116
126
 
117
127
  p userRepository.find(john.id) # #<User:0x000000037237d0 @name="John Smith" ... >
118
128
  p userRepository.find(bob.id) # nil
119
- p userRepository.find!(bob.id) # raises Rmodel::NotFound
120
129
  ```
121
130
 
122
131
  ### Scopes
@@ -184,6 +193,41 @@ p thing.updated_at
184
193
 
185
194
  To enable time tracking just add attributes `created_at` and `updated_at` or one of them to your entity.
186
195
 
196
+ ### Sugar methods
197
+
198
+ ```ruby
199
+ repo.save(thing)
200
+ repo.find!(1)
201
+ ```
202
+
203
+ The `save` method can be used instead of `insert` and `update`.
204
+ If the object has no not-nil id then it gets inserted. Otherwise it gets updated.
205
+
206
+ The `find!` method works like the simple `find`
207
+ , but instead of nil it raises the Rmodel::NotFound error.
208
+
209
+ ### Advanced creation of repository
210
+
211
+ ```ruby
212
+ require 'rmodel'
213
+
214
+ class Thing
215
+ attr_accessor :id, :name
216
+ end
217
+
218
+ class ThingRepository < Rmodel::Mongo::Repository
219
+ end
220
+
221
+ client = Mongo::Client.new([ 'localhost:27017' ], database: 'test')
222
+ collection = :things
223
+ factory = Rmodel::Mongo::SimpleFactory.new(Thing, :name)
224
+
225
+ repo = ThingRepository.new(client, collection, factory)
226
+ repo.find(1)
227
+ ```
228
+
229
+ The `factory` is an object, which has 2 methods: `#fromHash(hash)` and `#toHash(object)`.
230
+
187
231
  ## Contributing
188
232
 
189
233
  1. Fork it ( https://github.com/alexei-lexx/rmodel/fork )
@@ -0,0 +1,15 @@
1
+ require 'rmodel'
2
+
3
+ class Thing
4
+ attr_accessor :id, :name
5
+ end
6
+
7
+ class ThingRepository < Rmodel::Mongo::Repository
8
+ end
9
+
10
+ client = Mongo::Client.new([ 'localhost:27017' ], database: 'test')
11
+ collection = :things
12
+ factory = Rmodel::Mongo::SimpleFactory.new(Thing, :name)
13
+
14
+ repo = ThingRepository.new(client, collection, factory)
15
+ p repo.find(1)
@@ -0,0 +1,12 @@
1
+ require 'rmodel/base/repository_ext/sugarable'
2
+ require 'rmodel/base/repository_ext/timestampable'
3
+
4
+ module Rmodel::Base
5
+ class Repository
6
+ include RepositoryExt::Sugarable
7
+
8
+ def self.inherited(subclass)
9
+ subclass.prepend RepositoryExt::Timestampable
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module Rmodel::Base
2
+ module RepositoryExt
3
+ module Sugarable
4
+ def find!(id)
5
+ find(id) or raise Rmodel::NotFound.new(self, { id: id })
6
+ end
7
+
8
+ def save(object)
9
+ if object.id.nil?
10
+ insert(object)
11
+ else
12
+ update(object)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,7 +1,6 @@
1
- module Rmodel::Mongo
1
+ module Rmodel::Base
2
2
  module RepositoryExt
3
3
  module Timestampable
4
-
5
4
  def insert(object)
6
5
  if object.respond_to?(:created_at) && object.respond_to?(:created_at=)
7
6
  object.created_at ||= Time.now
@@ -1,22 +1,21 @@
1
1
  require 'mongo'
2
+ require 'rmodel/base/repository'
2
3
  require 'active_support/inflector'
3
4
  require 'rmodel/mongo/repository_ext/queryable'
4
- require 'rmodel/mongo/repository_ext/timestampable'
5
5
 
6
6
  module Rmodel::Mongo
7
- class Repository
7
+ class Repository < Rmodel::Base::Repository
8
8
  include RepositoryExt::Queryable
9
- prepend RepositoryExt::Timestampable
10
9
 
11
- def initialize
12
- @client = Rmodel.setup.establish_mongo_client(self.class.client_name || :default) or
10
+ def initialize(client = nil, collection = nil, factory = nil)
11
+ @client = client || Rmodel.setup.establish_mongo_client(self.class.client_name || :default) or
13
12
  raise ArgumentError.new('Client driver is not setup')
14
13
 
15
- @collection = self.class.setting_collection ||
14
+ @collection = collection || self.class.setting_collection ||
16
15
  self.class.collection_by_convention or
17
16
  raise ArgumentError.new('Collection can not be guessed')
18
17
 
19
- @factory = self.class.setting_factory or
18
+ @factory = factory || self.class.setting_factory or
20
19
  raise ArgumentError.new('Factory can not be guessed')
21
20
  end
22
21
 
@@ -25,10 +24,6 @@ module Rmodel::Mongo
25
24
  result && @factory.fromHash(result)
26
25
  end
27
26
 
28
- def find!(id)
29
- find(id) or raise Rmodel::NotFound.new(self, { id: id })
30
- end
31
-
32
27
  def insert(object)
33
28
  object.id ||= BSON::ObjectId.new
34
29
  @client[@collection].insert_one(@factory.toHash(object, true))
@@ -1,3 +1,3 @@
1
1
  module Rmodel
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0-dev"
3
3
  end
@@ -3,16 +3,11 @@ RSpec.describe Rmodel::Mongo::Repository do
3
3
 
4
4
  before do
5
5
  stub_const('User', Struct.new(:id, :name, :email))
6
- stub_const('UserRepository', Class.new(Rmodel::Mongo::Repository) {
7
- simple_factory User, :name, :email
8
- })
9
- Rmodel.setup do
10
- client :default, hosts: [ 'localhost' ], database: 'rmodel_test'
11
- end
6
+ stub_const('UserRepository', Class.new(Rmodel::Mongo::Repository))
12
7
  end
13
8
 
14
9
  let(:factory) { Rmodel::Mongo::SimpleFactory.new(User, :name, :email) }
15
- subject(:repo) { UserRepository.new }
10
+ subject(:repo) { UserRepository.new(mongo_session, :users, factory) }
16
11
 
17
12
  describe '#find' do
18
13
  context 'when an existent id is given' do
@@ -32,26 +27,6 @@ RSpec.describe Rmodel::Mongo::Repository do
32
27
  end
33
28
  end
34
29
 
35
- describe '#find!' do
36
- context 'when an existent id is given' do
37
- before do
38
- mongo_session[:users].insert_one(_id: 1, name: 'John', email: 'john@example.com')
39
- end
40
-
41
- it 'returns the right instance' do
42
- expect(repo.find!(1)).not_to be_nil
43
- end
44
- end
45
-
46
- context 'when a non-existent id is given' do
47
- it 'raises the NotFound error' do
48
- expect {
49
- repo.find!(1)
50
- }.to raise_error Rmodel::NotFound
51
- end
52
- end
53
- end
54
-
55
30
  describe '#insert' do
56
31
  context 'when the id is not provided' do
57
32
  let(:user) { User.new(nil, 'John', 'john@example.com') }
@@ -2,16 +2,12 @@ RSpec.describe Rmodel::Mongo::Repository do
2
2
  include_context 'clean Mongo database'
3
3
 
4
4
  before do
5
- Rmodel.setup do
6
- client :default, hosts: [ 'localhost' ], database: 'rmodel_test'
7
- end
8
5
  stub_const('Thing', Struct.new(:id, :a, :b))
9
- stub_const('ThingRepository', Class.new(Rmodel::Mongo::Repository) {
10
- simple_factory Thing, :a, :b
11
- })
6
+ stub_const('ThingRepository', Class.new(Rmodel::Mongo::Repository))
12
7
  end
13
8
 
14
- let(:repo) { ThingRepository.new }
9
+ let(:factory) { Rmodel::Mongo::SimpleFactory.new(Thing, :a, :b) }
10
+ let(:repo) { ThingRepository.new(mongo_session, :things, factory) }
15
11
 
16
12
  before do
17
13
  repo.insert(Thing.new(nil, 2, 3))
@@ -0,0 +1,14 @@
1
+ RSpec.describe Rmodel::Mongo::Repository do
2
+ include_examples 'sugarable repository' do
3
+ include_context 'clean Mongo database'
4
+
5
+ before do
6
+ stub_const('ThingRepository', Class.new(Rmodel::Mongo::Repository))
7
+ end
8
+
9
+ subject do
10
+ factory = Rmodel::Mongo::SimpleFactory.new(Thing, :name)
11
+ ThingRepository.new(mongo_session, :things, factory)
12
+ end
13
+ end
14
+ end
@@ -1,73 +1,19 @@
1
1
  RSpec.describe Rmodel::Mongo::Repository do
2
- describe Rmodel::Mongo::RepositoryExt::Timestampable do
3
- subject(:repo) { ThingRepository.new }
2
+ include_examples 'timestampable repository' do
3
+ include_context 'clean Mongo database'
4
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
5
+ before do
6
+ stub_const('ThingRepository', Class.new(Rmodel::Mongo::Repository))
44
7
  end
45
8
 
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) }
9
+ let(:repo_w_timestamps) do
10
+ factory = Rmodel::Mongo::SimpleFactory.new(Thing, :name, :created_at, :updated_at)
11
+ ThingRepository.new(mongo_session, :things, factory)
12
+ end
64
13
 
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
14
+ let(:repo_wo_timestamps) do
15
+ factory = Rmodel::Mongo::SimpleFactory.new(Thing, :name)
16
+ ThingRepository.new(mongo_session, :things, factory)
71
17
  end
72
18
  end
73
19
  end
@@ -1,15 +1,13 @@
1
1
  RSpec.describe Rmodel::Mongo::Repository do
2
2
  before do
3
- Rmodel.setup.clear
4
3
  stub_const('User', Struct.new(:id, :name, :email))
5
4
  end
6
5
 
7
- subject { UserRepository.new }
8
-
9
6
  describe '.client(name)' do
10
- before do
11
- Rmodel::Setup.send :public, :client
12
- end
7
+ subject { UserRepository.new }
8
+
9
+ before { Rmodel::Setup.send :public, :client }
10
+
13
11
  context 'when it is called with an existent name' do
14
12
  before do
15
13
  Rmodel.setup do
@@ -22,6 +20,7 @@ RSpec.describe Rmodel::Mongo::Repository do
22
20
  attr_reader :client
23
21
  })
24
22
  end
23
+ after { Rmodel::setup.clear }
25
24
 
26
25
  it 'sets the appropriate #client' do
27
26
  expect(subject.client).to be_an_instance_of Mongo::Client
@@ -56,6 +55,7 @@ RSpec.describe Rmodel::Mongo::Repository do
56
55
  client :default, { hosts: [ 'localhost' ] }
57
56
  end
58
57
  end
58
+ after { Rmodel::setup.clear }
59
59
 
60
60
  it 'sets #client to be default' do
61
61
  expect(subject.client).to be_an_instance_of Mongo::Client
@@ -71,11 +71,14 @@ RSpec.describe Rmodel::Mongo::Repository do
71
71
  end
72
72
 
73
73
  describe '.collection(name)' do
74
+ subject { UserRepository.new }
75
+
74
76
  before do
75
77
  Rmodel.setup do
76
78
  client :default, { hosts: [ 'localhost' ] }
77
79
  end
78
80
  end
81
+ after { Rmodel::setup.clear }
79
82
 
80
83
  context 'when the :people collection is given' do
81
84
  before do
@@ -106,11 +109,14 @@ RSpec.describe Rmodel::Mongo::Repository do
106
109
  end
107
110
 
108
111
  describe '.simple_factory(klass, attribute1, attribute2, ...)' do
112
+ subject { UserRepository.new }
113
+
109
114
  before do
110
115
  Rmodel.setup do
111
116
  client :default, { hosts: [ 'localhost' ] }
112
117
  end
113
118
  end
119
+ after { Rmodel::setup.clear }
114
120
 
115
121
  context 'when it is called' do
116
122
  before do
@@ -137,4 +143,19 @@ RSpec.describe Rmodel::Mongo::Repository do
137
143
  end
138
144
  end
139
145
  end
146
+
147
+ describe '#initialize(client, collection, factory)' do
148
+ context 'when all constructor arguments are passed' do
149
+ before do
150
+ stub_const('UserRepository', Class.new(Rmodel::Mongo::Repository))
151
+ end
152
+ let(:factory) { Rmodel::Mongo::SimpleFactory.new(User, :name, :email) }
153
+
154
+ it 'works!' do
155
+ expect {
156
+ UserRepository.new(Object.new, :users, factory)
157
+ }.not_to raise_error
158
+ end
159
+ end
160
+ end
140
161
  end
@@ -2,7 +2,7 @@ RSpec.describe Rmodel::Mongo::SimpleFactory do
2
2
  context 'when the User(id, name, email) class is defined' do
3
3
  before { stub_const('User', Struct.new(:id, :name, :email)) }
4
4
 
5
- subject(:factory) { Rmodel::Mongo::SimpleFactory.new(User, :name, :email) }
5
+ subject(:factory) { described_class.new(User, :name, :email) }
6
6
 
7
7
  describe '#fromHash' do
8
8
  context 'when the hash with _id, name and email is given' do
@@ -0,0 +1,46 @@
1
+ RSpec.shared_examples 'sugarable repository' do
2
+ describe Rmodel::Base::RepositoryExt::Sugarable do
3
+ before do
4
+ stub_const('Thing', Struct.new(:id, :name))
5
+ end
6
+
7
+ describe '#find!' do
8
+ context 'when an existent id is given' do
9
+ before { subject.insert(Thing.new(1)) }
10
+
11
+ it 'returns the right instance' do
12
+ expect(subject.find!(1)).not_to be_nil
13
+ end
14
+ end
15
+
16
+ context 'when a non-existent id is given' do
17
+ it 'raises NotFound' do
18
+ expect {
19
+ subject.find!(1)
20
+ }.to raise_error Rmodel::NotFound
21
+ end
22
+ end
23
+ end
24
+
25
+ describe 'save' do
26
+ let(:thing) { Thing.new }
27
+
28
+ context 'when a new object is given' do
29
+ it 'gets inserted' do
30
+ subject.save(thing)
31
+ expect(subject.find(thing.id)).not_to be_nil
32
+ end
33
+ end
34
+
35
+ context 'when an existent object is given' do
36
+ before { subject.insert(thing) }
37
+
38
+ it 'gets updated' do
39
+ thing.name = 'chair'
40
+ subject.save(thing)
41
+ expect(subject.find(thing.id).name).to eq 'chair'
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,69 @@
1
+ RSpec.shared_examples 'timestampable repository' do
2
+ describe Rmodel::Base::RepositoryExt::Timestampable do
3
+ context 'when the entity object has attributes created_at and updated_at' do
4
+ before do
5
+ stub_const('Thing', Struct.new(:id, :name, :created_at, :updated_at))
6
+ end
7
+
8
+ subject { repo_w_timestamps }
9
+
10
+ context 'when we insert(object)' do
11
+ context 'and the object.created_at is already set' do
12
+ let(:thing) { Thing.new(nil, 'chair', Time.now) }
13
+
14
+ it 'doesnt change the value of created_at' do
15
+ set_created_at = thing.created_at
16
+ subject.insert(thing)
17
+ expect(thing.created_at).to eq set_created_at
18
+ end
19
+ end
20
+
21
+ context 'and the object.created_at is not set yet' do
22
+ let(:thing) { Thing.new(nil, 'chair') }
23
+
24
+ it 'sets the value of created_at' do
25
+ subject.insert(thing)
26
+ expect(thing.created_at).not_to be_nil
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'when we update(object)' do
32
+ let(:thing) { Thing.new(nil, 'chair') }
33
+ before { subject.insert(thing) }
34
+
35
+ it 'sets the value of created_at' do
36
+ thing.name = 'table'
37
+ subject.update(thing)
38
+ expect(thing.updated_at).not_to be_nil
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'when the entity has no attributes :created_at and updated_at' do
44
+ before do
45
+ stub_const('Thing', Struct.new(:id, :name))
46
+ end
47
+
48
+ let(:thing) { Thing.new(nil, 'chair') }
49
+ subject { repo_wo_timestamps }
50
+
51
+ context 'when we insert(object)' do
52
+ it 'does nothing special' do
53
+ subject.insert(thing)
54
+ expect(thing.respond_to?(:created_at)).to be false
55
+ end
56
+ end
57
+
58
+ context 'when we update(object)' do
59
+ before { subject.insert(thing) }
60
+
61
+ it 'does nothing special' do
62
+ thing.name = 'table'
63
+ subject.update(thing)
64
+ expect(thing.respond_to?(:updated_at)).to be false
65
+ end
66
+ end
67
+ end
68
+ end
69
+ 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.1.0
4
+ version: 0.2.0.pre.dev
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-25 00:00:00.000000000 Z
11
+ date: 2015-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongo
@@ -108,14 +108,17 @@ files:
108
108
  - LICENSE.txt
109
109
  - README.md
110
110
  - Rakefile
111
+ - examples/advanced_creation_of_repository.rb
111
112
  - examples/timestamps.rb
112
113
  - examples/user.rb
113
114
  - lib/rmodel.rb
115
+ - lib/rmodel/base/repository.rb
116
+ - lib/rmodel/base/repository_ext/sugarable.rb
117
+ - lib/rmodel/base/repository_ext/timestampable.rb
114
118
  - lib/rmodel/errors.rb
115
119
  - lib/rmodel/mongo/repository.rb
116
120
  - lib/rmodel/mongo/repository_ext/query.rb
117
121
  - lib/rmodel/mongo/repository_ext/queryable.rb
118
- - lib/rmodel/mongo/repository_ext/timestampable.rb
119
122
  - lib/rmodel/mongo/setup.rb
120
123
  - lib/rmodel/mongo/simple_factory.rb
121
124
  - lib/rmodel/setup.rb
@@ -123,11 +126,14 @@ files:
123
126
  - rmodel.gemspec
124
127
  - spec/rmodel/mongo/repository_crud_spec.rb
125
128
  - spec/rmodel/mongo/repository_ext/queryable_spec.rb
129
+ - spec/rmodel/mongo/repository_ext/sugarable_spec.rb
126
130
  - spec/rmodel/mongo/repository_ext/timestampable_spec.rb
127
131
  - spec/rmodel/mongo/repository_initialize_spec.rb
128
132
  - spec/rmodel/mongo/simple_factory_spec.rb
129
133
  - spec/rmodel/setup_spec.rb
130
134
  - spec/shared/clean_moped.rb
135
+ - spec/shared/repository_ext/sugarable.rb
136
+ - spec/shared/repository_ext/timestampable.rb
131
137
  - spec/spec_helper.rb
132
138
  homepage: https://github.com/alexei-lexx/rmodel
133
139
  licenses:
@@ -144,9 +150,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
150
  version: '0'
145
151
  required_rubygems_version: !ruby/object:Gem::Requirement
146
152
  requirements:
147
- - - ">="
153
+ - - ">"
148
154
  - !ruby/object:Gem::Version
149
- version: '0'
155
+ version: 1.3.1
150
156
  requirements: []
151
157
  rubyforge_project:
152
158
  rubygems_version: 2.4.5
@@ -156,9 +162,12 @@ summary: Rmodel is an ORM library, which tends to follow the SOLID principles.
156
162
  test_files:
157
163
  - spec/rmodel/mongo/repository_crud_spec.rb
158
164
  - spec/rmodel/mongo/repository_ext/queryable_spec.rb
165
+ - spec/rmodel/mongo/repository_ext/sugarable_spec.rb
159
166
  - spec/rmodel/mongo/repository_ext/timestampable_spec.rb
160
167
  - spec/rmodel/mongo/repository_initialize_spec.rb
161
168
  - spec/rmodel/mongo/simple_factory_spec.rb
162
169
  - spec/rmodel/setup_spec.rb
163
170
  - spec/shared/clean_moped.rb
171
+ - spec/shared/repository_ext/sugarable.rb
172
+ - spec/shared/repository_ext/timestampable.rb
164
173
  - spec/spec_helper.rb