rd3 0.0.1
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/.rspec +4 -0
- data/.rvmrc +71 -0
- data/.simplecov +5 -0
- data/Gemfile +22 -0
- data/LICENSE.txt +20 -0
- data/README.md +4 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/rd3.rb +32 -0
- data/lib/rd3/configuration.rb +5 -0
- data/lib/rd3/data_providers/azure_table_storage.rb +67 -0
- data/lib/rd3/data_providers/rdbms.rb +62 -0
- data/lib/rd3/model.rb +108 -0
- data/lib/rd3/railtie.rb +7 -0
- data/lib/rd3/repository.rb +61 -0
- data/rd3.gemspec +102 -0
- data/spec/config/azure_table_storage.yml +3 -0
- data/spec/config/mysql.yml +7 -0
- data/spec/config/postgresql.yml +7 -0
- data/spec/lib/rd3/data_providers/azure_table_storage_spec.rb +30 -0
- data/spec/lib/rd3/data_providers/rdbms_spec.rb +41 -0
- data/spec/lib/rd3/model_spec.rb +158 -0
- data/spec/lib/rd3/repository_spec.rb +65 -0
- data/spec/lib/rd3_spec.rb +18 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/data_provider_shared_examples.rb +131 -0
- data/spec/support/rdbms_shared_context.rb +29 -0
- metadata +286 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RD3 do
|
4
|
+
|
5
|
+
it 'should be configured' do
|
6
|
+
# NOTE: the spec_helper.rb file pre-configures the rspec tests
|
7
|
+
environment = :dev
|
8
|
+
config_file_directory = "myapp/configs"
|
9
|
+
|
10
|
+
RD3.configure(nil)
|
11
|
+
RD3.config.should be_nil
|
12
|
+
RD3.configure(:environment => environment, :config_file_directory => config_file_directory)
|
13
|
+
RD3.config.should_not be_nil
|
14
|
+
RD3.config.environment.should eq(environment)
|
15
|
+
RD3.config.config_file_directory.should eq(config_file_directory)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
shared_examples "data provider" do |config_file_name|
|
4
|
+
let(:is_document_based) {(/Rdbms/ =~ repo.to_s).nil?}
|
5
|
+
|
6
|
+
it 'should have config file name' do
|
7
|
+
repo.config_file_name.should eq(config_file_name)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should have properly configured client' do
|
11
|
+
repo.client.should_not be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'persisting and querying' do
|
15
|
+
|
16
|
+
it 'should persist new instance and then find by key' do
|
17
|
+
_create_new_instance_and_verify
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should not find by invalid key' do
|
21
|
+
repo.find_by_key(-1).should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should not find by key if active flag is false and exclude logical deletes is true' do
|
25
|
+
instance = _create_new_instance_and_verify(false)
|
26
|
+
id = _get_db_instance_id(instance)
|
27
|
+
repo.find_by_key(id, _build_find_by_opts(instance, true)).should be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should find by key if active flag is false and exclude logical deletes is false' do
|
31
|
+
instance = _create_new_instance_and_verify(false)
|
32
|
+
id = _get_db_instance_id(instance)
|
33
|
+
repo.find_by_key(id, _build_find_by_opts(instance, false)).should_not be_nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should update existing instance' do
|
37
|
+
instance = _create_new_instance_and_verify
|
38
|
+
id = _get_db_instance_id(instance)
|
39
|
+
instance[:email] = "updated_#{instance[:email]}"
|
40
|
+
instance[:age] = 82
|
41
|
+
instance[:amt] = 8.88
|
42
|
+
instance[:active] = false
|
43
|
+
|
44
|
+
repo.save(instance)
|
45
|
+
|
46
|
+
updated_instance = repo.find_by_key(id, _build_find_by_opts(instance, false))
|
47
|
+
updated_instance.should_not be_nil
|
48
|
+
updated_instance[:email].should eq(instance[:email])
|
49
|
+
updated_instance[:age].should eq(instance[:age])
|
50
|
+
updated_instance[:amt].to_f.should eq(instance[:amt])
|
51
|
+
updated_instance[:active].should eq(instance[:active])
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should perform config based logical delete' do
|
55
|
+
RD3.config.enable_logical_deletes = true
|
56
|
+
_create_new_instance_and_delete(nil)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should perform config based physical delete' do
|
60
|
+
RD3.config.enable_logical_deletes = false
|
61
|
+
_create_new_instance_and_delete(nil)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should perform explicit logical delete' do
|
65
|
+
_create_new_instance_and_delete(true)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should perform explicit physical delete' do
|
69
|
+
_create_new_instance_and_delete(false)
|
70
|
+
end
|
71
|
+
|
72
|
+
def _create_new_instance_and_verify(active=true)
|
73
|
+
# attributes that will be perisisted regardless of
|
74
|
+
# data provider
|
75
|
+
email = "spec#{Random.rand(100)}@spec_testing.com"
|
76
|
+
age = Random.rand(60)
|
77
|
+
amt = Random.rand(1..9) + 0.99
|
78
|
+
attributes = {:email => email, :age => age, :amt => amt, :active => active}
|
79
|
+
|
80
|
+
# if we're dealing w/ a document based data provider,
|
81
|
+
# then generate a document key
|
82
|
+
if is_document_based
|
83
|
+
attributes.merge!(:key => SecureRandom.uuid)
|
84
|
+
# row key is required by azure table storage
|
85
|
+
# doesn't hurt if it's persisted in a different document store
|
86
|
+
# such as mongo or couchbase
|
87
|
+
attributes.merge!(:row_key => Time.now.to_i.to_s) # required by azure table storage
|
88
|
+
end
|
89
|
+
|
90
|
+
id = repo.save(attributes)
|
91
|
+
id.should_not be_nil
|
92
|
+
|
93
|
+
db_instance = repo.find_by_key(id, _build_find_by_opts(attributes, false))
|
94
|
+
db_instance.should_not be_nil
|
95
|
+
db_instance[:email].should eq(email)
|
96
|
+
db_instance[:age].should eq(age)
|
97
|
+
db_instance[:amt].to_f.should eq(amt)
|
98
|
+
db_instance[:active].should eq(active)
|
99
|
+
|
100
|
+
db_instance
|
101
|
+
end
|
102
|
+
|
103
|
+
def _create_new_instance_and_delete(logical_delete=nil)
|
104
|
+
instance = _create_new_instance_and_verify
|
105
|
+
id = _get_db_instance_id(instance)
|
106
|
+
|
107
|
+
opts = {}
|
108
|
+
opts.merge!(:row_key => instance[:row_key]) if instance[:row_key]
|
109
|
+
opts.merge!(:logical_only => logical_delete) unless logical_delete.nil?
|
110
|
+
|
111
|
+
repo.delete(id, opts)
|
112
|
+
|
113
|
+
if logical_delete || (logical_delete.nil? && RD3.config.enable_logical_deletes)
|
114
|
+
repo.find_by_key(id, _build_find_by_opts(instance, true)).should be_nil
|
115
|
+
repo.find_by_key(id, _build_find_by_opts(instance, false)).should_not be_nil
|
116
|
+
else
|
117
|
+
repo.find_by_key(id, _build_find_by_opts(instance, false)).should be_nil
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def _get_db_instance_id(instance)
|
122
|
+
instance[:id] || instance[:partition_key]
|
123
|
+
end
|
124
|
+
|
125
|
+
def _build_find_by_opts(instance, logical_only)
|
126
|
+
{:row_key => instance[:row_key], :logical_only => logical_only}
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
|
3
|
+
shared_context "shared rdbms context" do |rdbms_class|
|
4
|
+
|
5
|
+
let(:repo) {rdbms_class}
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
repo.client.create_table? RDBMS_SPEC_TABLE_NAME do
|
9
|
+
#primary_key :id, :type => Integer, :auto_increment => true
|
10
|
+
primary_key :id
|
11
|
+
String :email
|
12
|
+
Integer :age
|
13
|
+
BigDecimal :amt, :size => [3,2]
|
14
|
+
Boolean :active
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
around(:each) do |test|
|
19
|
+
repo.client.transaction do
|
20
|
+
test.run
|
21
|
+
raise Sequel::Rollback
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
after(:all) do
|
26
|
+
repo.client.drop_table? RDBMS_SPEC_TABLE_NAME
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,286 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rd3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- obie quelland
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: activemodel
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: require_all
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rdoc
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.12'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '3.12'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: bundler
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.0.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.0.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: jeweler
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.8.4
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.8.4
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.12.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 2.12.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: simplecov
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.7.1
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.7.1
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: mysql2
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.3.11
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.3.11
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: pg
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.14.1
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.14.1
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: sequel
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ! '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: 3.41.0
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 3.41.0
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: waz-storage
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
194
|
+
requirements:
|
195
|
+
- - ! '>='
|
196
|
+
- !ruby/object:Gem::Version
|
197
|
+
version: 1.1.4
|
198
|
+
type: :development
|
199
|
+
prerelease: false
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ! '>='
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 1.1.4
|
206
|
+
- !ruby/object:Gem::Dependency
|
207
|
+
name: database_cleaner
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
210
|
+
requirements:
|
211
|
+
- - ! '>='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: 0.9.1
|
214
|
+
type: :development
|
215
|
+
prerelease: false
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: 0.9.1
|
222
|
+
description: ! ' enable domain driven design approach via POROs and Repositories vs
|
223
|
+
Rails'' ActiveRecord '
|
224
|
+
email: quelland@gmail.com
|
225
|
+
executables: []
|
226
|
+
extensions: []
|
227
|
+
extra_rdoc_files:
|
228
|
+
- LICENSE.txt
|
229
|
+
- README.md
|
230
|
+
files:
|
231
|
+
- .rspec
|
232
|
+
- .rvmrc
|
233
|
+
- .simplecov
|
234
|
+
- Gemfile
|
235
|
+
- LICENSE.txt
|
236
|
+
- README.md
|
237
|
+
- Rakefile
|
238
|
+
- VERSION
|
239
|
+
- lib/rd3.rb
|
240
|
+
- lib/rd3/configuration.rb
|
241
|
+
- lib/rd3/data_providers/azure_table_storage.rb
|
242
|
+
- lib/rd3/data_providers/rdbms.rb
|
243
|
+
- lib/rd3/model.rb
|
244
|
+
- lib/rd3/railtie.rb
|
245
|
+
- lib/rd3/repository.rb
|
246
|
+
- rd3.gemspec
|
247
|
+
- spec/config/azure_table_storage.yml
|
248
|
+
- spec/config/mysql.yml
|
249
|
+
- spec/config/postgresql.yml
|
250
|
+
- spec/lib/rd3/data_providers/azure_table_storage_spec.rb
|
251
|
+
- spec/lib/rd3/data_providers/rdbms_spec.rb
|
252
|
+
- spec/lib/rd3/model_spec.rb
|
253
|
+
- spec/lib/rd3/repository_spec.rb
|
254
|
+
- spec/lib/rd3_spec.rb
|
255
|
+
- spec/spec_helper.rb
|
256
|
+
- spec/support/data_provider_shared_examples.rb
|
257
|
+
- spec/support/rdbms_shared_context.rb
|
258
|
+
homepage: http://github.com/obieq/rd3
|
259
|
+
licenses:
|
260
|
+
- MIT
|
261
|
+
post_install_message:
|
262
|
+
rdoc_options: []
|
263
|
+
require_paths:
|
264
|
+
- lib
|
265
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
266
|
+
none: false
|
267
|
+
requirements:
|
268
|
+
- - ! '>='
|
269
|
+
- !ruby/object:Gem::Version
|
270
|
+
version: '0'
|
271
|
+
segments:
|
272
|
+
- 0
|
273
|
+
hash: -4298259904771028908
|
274
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
275
|
+
none: false
|
276
|
+
requirements:
|
277
|
+
- - ! '>='
|
278
|
+
- !ruby/object:Gem::Version
|
279
|
+
version: '0'
|
280
|
+
requirements: []
|
281
|
+
rubyforge_project:
|
282
|
+
rubygems_version: 1.8.24
|
283
|
+
signing_key:
|
284
|
+
specification_version: 3
|
285
|
+
summary: RD3 is a ruby gem that adheres to and facilitates domain driven design principles
|
286
|
+
test_files: []
|