rrrmatey 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +16 -0
  3. data/README.md +249 -0
  4. data/RELEASE_NOTES.md +26 -0
  5. data/Rakefile +39 -0
  6. data/lib/rrrmatey.rb +8 -0
  7. data/lib/rrrmatey/crud_controller.rb +97 -0
  8. data/lib/rrrmatey/discrete_result.rb +31 -0
  9. data/lib/rrrmatey/errors.rb +11 -0
  10. data/lib/rrrmatey/retryable.rb +28 -0
  11. data/lib/rrrmatey/string_model/connection_methods.rb +47 -0
  12. data/lib/rrrmatey/string_model/consumer_adapter_methods.rb +9 -0
  13. data/lib/rrrmatey/string_model/delete_methods.rb +12 -0
  14. data/lib/rrrmatey/string_model/field_definition_methods.rb +101 -0
  15. data/lib/rrrmatey/string_model/find_methods.rb +85 -0
  16. data/lib/rrrmatey/string_model/index_methods.rb +90 -0
  17. data/lib/rrrmatey/string_model/namespaced_key_methods.rb +21 -0
  18. data/lib/rrrmatey/string_model/string_model.rb +92 -0
  19. data/lib/rrrmatey/type_coercion.rb +61 -0
  20. data/lib/rrrmatey/version.rb +3 -0
  21. data/spec/rrrmatey/crud_controller/crud_controller_spec.rb +258 -0
  22. data/spec/rrrmatey/crud_controller/model_methods_spec.rb +26 -0
  23. data/spec/rrrmatey/discrete_result_spec.rb +104 -0
  24. data/spec/rrrmatey/retryable_spec.rb +95 -0
  25. data/spec/rrrmatey/string_model/connection_methods_spec.rb +64 -0
  26. data/spec/rrrmatey/string_model/consumer_adapter_methods_spec.rb +43 -0
  27. data/spec/rrrmatey/string_model/delete_methods_spec.rb +36 -0
  28. data/spec/rrrmatey/string_model/field_definition_methods_spec.rb +51 -0
  29. data/spec/rrrmatey/string_model/find_methods_spec.rb +147 -0
  30. data/spec/rrrmatey/string_model/index_methods_spec.rb +231 -0
  31. data/spec/rrrmatey/string_model/namespaced_key_methods_spec.rb +34 -0
  32. data/spec/rrrmatey/string_model/string_model_spec.rb +208 -0
  33. data/spec/spec_helper.rb +16 -0
  34. 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
@@ -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