rrrmatey 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 +7 -0
- data/LICENSE.md +16 -0
- data/README.md +249 -0
- data/RELEASE_NOTES.md +26 -0
- data/Rakefile +39 -0
- data/lib/rrrmatey.rb +8 -0
- data/lib/rrrmatey/crud_controller.rb +97 -0
- data/lib/rrrmatey/discrete_result.rb +31 -0
- data/lib/rrrmatey/errors.rb +11 -0
- data/lib/rrrmatey/retryable.rb +28 -0
- data/lib/rrrmatey/string_model/connection_methods.rb +47 -0
- data/lib/rrrmatey/string_model/consumer_adapter_methods.rb +9 -0
- data/lib/rrrmatey/string_model/delete_methods.rb +12 -0
- data/lib/rrrmatey/string_model/field_definition_methods.rb +101 -0
- data/lib/rrrmatey/string_model/find_methods.rb +85 -0
- data/lib/rrrmatey/string_model/index_methods.rb +90 -0
- data/lib/rrrmatey/string_model/namespaced_key_methods.rb +21 -0
- data/lib/rrrmatey/string_model/string_model.rb +92 -0
- data/lib/rrrmatey/type_coercion.rb +61 -0
- data/lib/rrrmatey/version.rb +3 -0
- data/spec/rrrmatey/crud_controller/crud_controller_spec.rb +258 -0
- data/spec/rrrmatey/crud_controller/model_methods_spec.rb +26 -0
- data/spec/rrrmatey/discrete_result_spec.rb +104 -0
- data/spec/rrrmatey/retryable_spec.rb +95 -0
- data/spec/rrrmatey/string_model/connection_methods_spec.rb +64 -0
- data/spec/rrrmatey/string_model/consumer_adapter_methods_spec.rb +43 -0
- data/spec/rrrmatey/string_model/delete_methods_spec.rb +36 -0
- data/spec/rrrmatey/string_model/field_definition_methods_spec.rb +51 -0
- data/spec/rrrmatey/string_model/find_methods_spec.rb +147 -0
- data/spec/rrrmatey/string_model/index_methods_spec.rb +231 -0
- data/spec/rrrmatey/string_model/namespaced_key_methods_spec.rb +34 -0
- data/spec/rrrmatey/string_model/string_model_spec.rb +208 -0
- data/spec/spec_helper.rb +16 -0
- metadata +148 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class SomeModel
|
4
|
+
extend RRRMatey::StringModel::NamespacedKeyMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
describe RRRMatey::StringModel::NamespacedKeyMethods do
|
8
|
+
let(:model_klass) { SomeModel }
|
9
|
+
describe '#item_name' do
|
10
|
+
it 'defaults to name underscored' do
|
11
|
+
model_klass.item_name = nil
|
12
|
+
expect(model_klass.item_name).to eq('some_model')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'allows specification' do
|
16
|
+
model_klass.item_name = 'something_else'
|
17
|
+
expect(model_klass.item_name).to eq('something_else')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#namespace' do
|
22
|
+
it 'defaults to item_name pluralized' do
|
23
|
+
model_klass.item_name = nil
|
24
|
+
expect(model_klass.namespace).to eq('some_models')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#namespaced_key' do
|
29
|
+
it 'yields namespace:id' do
|
30
|
+
model_klass.item_name = nil
|
31
|
+
expect(model_klass.namespaced_key('di')).to eq("some_models:di")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class StringModelKlass
|
4
|
+
include RRRMatey::StringModel
|
5
|
+
|
6
|
+
field :name, :type => :string
|
7
|
+
|
8
|
+
attr_accessor :valid
|
9
|
+
|
10
|
+
def initialize(opts = {})
|
11
|
+
@valid = opts[:valid] || true
|
12
|
+
end
|
13
|
+
|
14
|
+
def valid?
|
15
|
+
@valid
|
16
|
+
end
|
17
|
+
|
18
|
+
class ConnPool
|
19
|
+
def initialize(conn)
|
20
|
+
@conn = conn
|
21
|
+
end
|
22
|
+
|
23
|
+
def with(&block)
|
24
|
+
block.call(@conn)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Conn
|
29
|
+
attr_reader :search_index, :schema, :bucket_name, :kvs
|
30
|
+
|
31
|
+
def initialize(opts = {})
|
32
|
+
@kvs = opts[:kvs] || {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_search_index(name, schema)
|
36
|
+
@search_index = name
|
37
|
+
@schema = schema
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def bucket(name)
|
42
|
+
RiakBucket.new(:name => name)
|
43
|
+
end
|
44
|
+
|
45
|
+
def set(k, v)
|
46
|
+
@kvs[k] = v
|
47
|
+
end
|
48
|
+
|
49
|
+
def get(k)
|
50
|
+
@kvs[k]
|
51
|
+
end
|
52
|
+
|
53
|
+
def del(k)
|
54
|
+
(@kvs.delete(k).nil?) ? 0 : 1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class RiakBucket
|
59
|
+
attr_accessor :name, :properties
|
60
|
+
|
61
|
+
def initialize(opts = {})
|
62
|
+
@name = opts[:name]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe RRRMatey::StringModel do
|
68
|
+
context 'with or without riak setup' do
|
69
|
+
let(:model_modyule) { RRRMatey::StringModel }
|
70
|
+
let(:model_klass) { StringModelKlass }
|
71
|
+
let(:model) { model_klass.new }
|
72
|
+
|
73
|
+
describe '#extend' do
|
74
|
+
it 'extends ConnectionMethods' do
|
75
|
+
expect(extends_all_instance_methods(model_modyule, RRRMatey::StringModel::ConnectionMethods)).to eq(true)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#included' do
|
80
|
+
it 'included extends ConnectionMethods' do
|
81
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::ConnectionMethods)).to eq(true)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'included extends NamespacedKeyMethods' do
|
85
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::NamespacedKeyMethods)).to eq(true)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'included extends FieldDefinitionMethods' do
|
89
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::FieldDefinitionMethods)).to eq(true)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'included extends IndexMethods' do
|
93
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::IndexMethods)).to eq(true)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'included extends FindMethods' do
|
97
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::FindMethods)).to eq(true)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'included extends DeleteMethods' do
|
101
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::DeleteMethods)).to eq(true)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'included extends ConsumerAdapterMethods' do
|
105
|
+
expect(extends_all_instance_methods(model_klass, RRRMatey::StringModel::ConsumerAdapterMethods)).to eq(true)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#content_type' do
|
110
|
+
it 'defaults to json' do
|
111
|
+
expect(model.content_type).to eq('application/json')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe '#save' do
|
116
|
+
it 'raises for unknown content' do
|
117
|
+
model.content_type = 'application/unknown'
|
118
|
+
expect{model.save()}.to raise_exception(RRRMatey::UnsupportedTypeError)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'raises for id.blank?' do
|
122
|
+
model.content_type = 'application/json'
|
123
|
+
model.id = nil
|
124
|
+
expect{model.save()}.to raise_exception(RRRMatey::InvalidModelError)
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'raises for invalid' do
|
128
|
+
model.content_type = 'application/json'
|
129
|
+
model.id = 'id'
|
130
|
+
model.valid = false
|
131
|
+
expect{model.save()}.to raise_exception(RRRMatey::InvalidModelError)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe '#delete' do
|
136
|
+
it 'deletes' do
|
137
|
+
expect(model.delete()).to eq(0)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe '#to_json' do
|
142
|
+
it 'yields valid json when unset' do
|
143
|
+
expect(model.to_json()).to eq('{"id":null,"name":""}')
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'yields valid json when uet' do
|
147
|
+
model.id = 'di'
|
148
|
+
model.name = 'eman'
|
149
|
+
expect(model.to_json()).to eq('{"id":"di","name":"eman"}')
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe '#to_xml' do
|
154
|
+
it 'yields valid xml when unset' do
|
155
|
+
expect(model.to_xml()).to eq('<string_model_klass id="null" name="" />' + "\n")
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'yields valid xml when uet' do
|
159
|
+
model.id = 'di'
|
160
|
+
model.name = 'eman'
|
161
|
+
expect(model.to_xml()).to eq('<string_model_klass id="di" name="eman" />' + "\n")
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'with connections setup' do
|
167
|
+
let(:model) {
|
168
|
+
m = StringModelKlass.new()
|
169
|
+
m.class.riak = StringModelKlass::ConnPool.new(StringModelKlass::Conn.new)
|
170
|
+
m.class.cache_proxy = StringModelKlass::ConnPool.new(StringModelKlass::Conn.new)
|
171
|
+
m.content_type = 'application/json'
|
172
|
+
m.id = 'id'
|
173
|
+
m.valid = true
|
174
|
+
m
|
175
|
+
}
|
176
|
+
|
177
|
+
describe '#save' do
|
178
|
+
it 'saves for valid' do
|
179
|
+
expect(model.save()).to eq(model)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'saves for valid xml' do
|
183
|
+
model.content_type = 'application/xml'
|
184
|
+
expect(model.save()).to eq(model)
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'raises for unsupported content type' do
|
188
|
+
model.content_type = 'application/protobuf'
|
189
|
+
expect{model.save()}.to raise_exception(RRRMatey::UnknownContentTypeError)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
describe '#delete' do
|
194
|
+
it 'deletes' do
|
195
|
+
expect(model.delete()).to eq(0)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def extends_all_instance_methods(instance, modyule)
|
202
|
+
extends_methods(instance, modyule.instance_methods)
|
203
|
+
end
|
204
|
+
|
205
|
+
def extends_methods(it, methods)
|
206
|
+
return false if it.nil?
|
207
|
+
(methods - it.methods).length == 0
|
208
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
+
|
4
|
+
MODELS = File.join(File.dirname(__FILE__), "app/models")
|
5
|
+
$LOAD_PATH.unshift(MODELS)
|
6
|
+
|
7
|
+
if ENV['CI']
|
8
|
+
require 'simplecov'
|
9
|
+
SimpleCov.start do
|
10
|
+
add_filter '/vendor/'
|
11
|
+
add_filter '/spec/'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'rrrmatey'
|
16
|
+
require 'rspec'
|
metadata
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rrrmatey
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Gorlick
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: riak-client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: redis
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.7'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.7'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: xml-simple
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.1'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.1'
|
69
|
+
description: |
|
70
|
+
RRRMatey is an ODM (Object Document Mapper) Framework for Riak, using
|
71
|
+
the Basho Cache Proxy to provide reliable persistence using Riak KV with the
|
72
|
+
speed and accessibility of Redis. Riak's Solr integration provides for fast
|
73
|
+
listings as well as relations.
|
74
|
+
email: jgorlick@basho.com
|
75
|
+
executables: []
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- LICENSE.md
|
80
|
+
- README.md
|
81
|
+
- RELEASE_NOTES.md
|
82
|
+
- Rakefile
|
83
|
+
- lib/rrrmatey.rb
|
84
|
+
- lib/rrrmatey/crud_controller.rb
|
85
|
+
- lib/rrrmatey/discrete_result.rb
|
86
|
+
- lib/rrrmatey/errors.rb
|
87
|
+
- lib/rrrmatey/retryable.rb
|
88
|
+
- lib/rrrmatey/string_model/connection_methods.rb
|
89
|
+
- lib/rrrmatey/string_model/consumer_adapter_methods.rb
|
90
|
+
- lib/rrrmatey/string_model/delete_methods.rb
|
91
|
+
- lib/rrrmatey/string_model/field_definition_methods.rb
|
92
|
+
- lib/rrrmatey/string_model/find_methods.rb
|
93
|
+
- lib/rrrmatey/string_model/index_methods.rb
|
94
|
+
- lib/rrrmatey/string_model/namespaced_key_methods.rb
|
95
|
+
- lib/rrrmatey/string_model/string_model.rb
|
96
|
+
- lib/rrrmatey/type_coercion.rb
|
97
|
+
- lib/rrrmatey/version.rb
|
98
|
+
- spec/rrrmatey/crud_controller/crud_controller_spec.rb
|
99
|
+
- spec/rrrmatey/crud_controller/model_methods_spec.rb
|
100
|
+
- spec/rrrmatey/discrete_result_spec.rb
|
101
|
+
- spec/rrrmatey/retryable_spec.rb
|
102
|
+
- spec/rrrmatey/string_model/connection_methods_spec.rb
|
103
|
+
- spec/rrrmatey/string_model/consumer_adapter_methods_spec.rb
|
104
|
+
- spec/rrrmatey/string_model/delete_methods_spec.rb
|
105
|
+
- spec/rrrmatey/string_model/field_definition_methods_spec.rb
|
106
|
+
- spec/rrrmatey/string_model/find_methods_spec.rb
|
107
|
+
- spec/rrrmatey/string_model/index_methods_spec.rb
|
108
|
+
- spec/rrrmatey/string_model/namespaced_key_methods_spec.rb
|
109
|
+
- spec/rrrmatey/string_model/string_model_spec.rb
|
110
|
+
- spec/spec_helper.rb
|
111
|
+
homepage: http://rubygems.org/gems/rrrmatey
|
112
|
+
licenses:
|
113
|
+
- Apache-2.0
|
114
|
+
metadata: {}
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
require_paths:
|
118
|
+
- lib
|
119
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1.9'
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: 1.3.6
|
129
|
+
requirements: []
|
130
|
+
rubyforge_project:
|
131
|
+
rubygems_version: 2.4.5
|
132
|
+
signing_key:
|
133
|
+
specification_version: 4
|
134
|
+
summary: Object Mapping using Ruby + Redis + Riak (including Solr)
|
135
|
+
test_files:
|
136
|
+
- spec/rrrmatey/crud_controller/crud_controller_spec.rb
|
137
|
+
- spec/rrrmatey/crud_controller/model_methods_spec.rb
|
138
|
+
- spec/rrrmatey/discrete_result_spec.rb
|
139
|
+
- spec/rrrmatey/retryable_spec.rb
|
140
|
+
- spec/rrrmatey/string_model/connection_methods_spec.rb
|
141
|
+
- spec/rrrmatey/string_model/consumer_adapter_methods_spec.rb
|
142
|
+
- spec/rrrmatey/string_model/delete_methods_spec.rb
|
143
|
+
- spec/rrrmatey/string_model/field_definition_methods_spec.rb
|
144
|
+
- spec/rrrmatey/string_model/find_methods_spec.rb
|
145
|
+
- spec/rrrmatey/string_model/index_methods_spec.rb
|
146
|
+
- spec/rrrmatey/string_model/namespaced_key_methods_spec.rb
|
147
|
+
- spec/rrrmatey/string_model/string_model_spec.rb
|
148
|
+
- spec/spec_helper.rb
|