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.
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