agnostic_backend 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +7 -0
  7. data/CODE_OF_CONDUCT.md +13 -0
  8. data/Gemfile +4 -0
  9. data/Gemfile.lock +52 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +345 -0
  12. data/Rakefile +6 -0
  13. data/agnostic_backend.gemspec +34 -0
  14. data/bin/console +14 -0
  15. data/bin/setup +7 -0
  16. data/doc/indexable.md +292 -0
  17. data/doc/queryable.md +0 -0
  18. data/lib/agnostic_backend/cloudsearch/index.rb +99 -0
  19. data/lib/agnostic_backend/cloudsearch/index_field.rb +103 -0
  20. data/lib/agnostic_backend/cloudsearch/indexer.rb +84 -0
  21. data/lib/agnostic_backend/cloudsearch/remote_index_field.rb +32 -0
  22. data/lib/agnostic_backend/index.rb +24 -0
  23. data/lib/agnostic_backend/indexable/config.rb +24 -0
  24. data/lib/agnostic_backend/indexable/content_manager.rb +51 -0
  25. data/lib/agnostic_backend/indexable/field.rb +26 -0
  26. data/lib/agnostic_backend/indexable/field_type.rb +48 -0
  27. data/lib/agnostic_backend/indexable/indexable.rb +125 -0
  28. data/lib/agnostic_backend/indexer.rb +48 -0
  29. data/lib/agnostic_backend/queryable/attribute.rb +22 -0
  30. data/lib/agnostic_backend/queryable/cloudsearch/executor.rb +100 -0
  31. data/lib/agnostic_backend/queryable/cloudsearch/query.rb +29 -0
  32. data/lib/agnostic_backend/queryable/cloudsearch/query_builder.rb +13 -0
  33. data/lib/agnostic_backend/queryable/cloudsearch/result_set.rb +27 -0
  34. data/lib/agnostic_backend/queryable/cloudsearch/visitor.rb +127 -0
  35. data/lib/agnostic_backend/queryable/criteria/binary.rb +47 -0
  36. data/lib/agnostic_backend/queryable/criteria/criterion.rb +13 -0
  37. data/lib/agnostic_backend/queryable/criteria/ternary.rb +36 -0
  38. data/lib/agnostic_backend/queryable/criteria_builder.rb +83 -0
  39. data/lib/agnostic_backend/queryable/executor.rb +43 -0
  40. data/lib/agnostic_backend/queryable/expressions/expression.rb +65 -0
  41. data/lib/agnostic_backend/queryable/operations/n_ary.rb +18 -0
  42. data/lib/agnostic_backend/queryable/operations/operation.rb +13 -0
  43. data/lib/agnostic_backend/queryable/operations/unary.rb +35 -0
  44. data/lib/agnostic_backend/queryable/query.rb +27 -0
  45. data/lib/agnostic_backend/queryable/query_builder.rb +98 -0
  46. data/lib/agnostic_backend/queryable/result_set.rb +42 -0
  47. data/lib/agnostic_backend/queryable/tree_node.rb +48 -0
  48. data/lib/agnostic_backend/queryable/validator.rb +174 -0
  49. data/lib/agnostic_backend/queryable/value.rb +26 -0
  50. data/lib/agnostic_backend/queryable/visitor.rb +124 -0
  51. data/lib/agnostic_backend/rspec/matchers.rb +69 -0
  52. data/lib/agnostic_backend/utilities.rb +207 -0
  53. data/lib/agnostic_backend/version.rb +3 -0
  54. data/lib/agnostic_backend.rb +49 -0
  55. metadata +199 -0
@@ -0,0 +1,26 @@
1
+ module AgnosticBackend
2
+ module Queryable
3
+ class Value < TreeNode
4
+
5
+ attr_accessor :value
6
+ attr_reader :parent
7
+
8
+ def initialize(value, parent:, context:)
9
+ super([], context)
10
+ @value, @parent = value, parent
11
+ end
12
+
13
+ def ==(o)
14
+ super && o.value == value
15
+ end
16
+
17
+ def associated_attribute
18
+ parent.attribute if parent.respond_to? :attribute
19
+ end
20
+
21
+ def type
22
+ associated_attribute.type if associated_attribute.present?
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,124 @@
1
+ module AgnosticBackend
2
+ module Queryable
3
+ class Visitor
4
+ def visit(subject)
5
+ method_name = class_to_method_name(subject.class)
6
+ send(method_name, subject)
7
+ end
8
+
9
+ private
10
+
11
+ def class_to_method_name(klass)
12
+ if klass.name.split('::').last == 'Query'
13
+ 'visit_query'
14
+ else
15
+ "visit_#{klass.name.split('Queryable::').last.gsub('::', '_').underscore}"
16
+ end
17
+ end
18
+
19
+ def visit_operations_equal(subject)
20
+ raise NotImplementedError
21
+ end
22
+
23
+ def visit_operations_not_equal(subject)
24
+ raise NotImplementedError
25
+ end
26
+
27
+ def visit_operations_greater(subject)
28
+ raise NotImplementedError
29
+ end
30
+
31
+ def visit_operations_less(subject)
32
+ raise NotImplementedError
33
+ end
34
+
35
+ def visit_operations_greater_equal(subject)
36
+ raise NotImplementedError
37
+ end
38
+
39
+ def visit_operations_less_equal(subject)
40
+ raise NotImplementedError
41
+ end
42
+
43
+ def visit_operations_greater_and_less(subject)
44
+ raise NotImplementedError
45
+ end
46
+
47
+ def visit_operations_greater_equal_and_less(subject)
48
+ raise NotImplementedError
49
+ end
50
+
51
+ def visit_operations_greater_and_less_equal(subject)
52
+ raise NotImplementedError
53
+ end
54
+
55
+ def visit_operations_greater_equal_and_less_equal(subject)
56
+ raise NotImplementedError
57
+ end
58
+
59
+ def visit_operations_not(subject)
60
+ raise NotImplementedError
61
+ end
62
+
63
+ def visit_operations_and(subject)
64
+ raise NotImplementedError
65
+ end
66
+
67
+ def visit_operations_or(subject)
68
+ raise NotImplementedError
69
+ end
70
+
71
+ def visit_operations_ascending(subject)
72
+ raise NotImplementedError
73
+ end
74
+
75
+ def visit_operations_descending(subject)
76
+ raise NotImplementedError
77
+ end
78
+
79
+ def visit_operations_contains(subject)
80
+ raise NotImplementedError
81
+ end
82
+
83
+ def visit_operations_starts(subject)
84
+ raise NotImplementedError
85
+ end
86
+
87
+ def visit_query(subject)
88
+ raise NotImplementedError
89
+ end
90
+
91
+ def visit_expressions_where(subject)
92
+ raise NotImplementedError
93
+ end
94
+
95
+ def visit_expressions_select(subject)
96
+ raise NotImplementedError
97
+ end
98
+
99
+ def visit_expressions_order(subject)
100
+ raise NotImplementedError
101
+ end
102
+
103
+ def visit_expressions_limit(subject)
104
+ raise NotImplementedError
105
+ end
106
+
107
+ def visit_expressions_offset(subject)
108
+ raise NotImplementedError
109
+ end
110
+
111
+ def visit_expressions_scroll_cursor(subject)
112
+ raise NotImplementedError
113
+ end
114
+
115
+ def visit_attribute(subject)
116
+ raise NotImplementedError
117
+ end
118
+
119
+ def visit_value(subject)
120
+ raise NotImplementedError
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,69 @@
1
+ module AgnosticBackend
2
+ module RSpec
3
+ module Matchers
4
+ class BeIndexable
5
+ def matches?(actual)
6
+ actual < AgnosticBackend::Indexable
7
+ end
8
+
9
+ def description
10
+ "include AgnosticBackend::Indexable"
11
+ end
12
+ end
13
+
14
+ def be_indexable
15
+ BeIndexable.new
16
+ end
17
+
18
+ class DefineIndexField
19
+ def initialize(name, for_index: nil, type: nil, **expected_custom_attributes)
20
+ @name = name
21
+ @for_index = for_index
22
+ @type = type
23
+ @expected_custom_attributes = expected_custom_attributes
24
+ end
25
+
26
+ def matches?(klass)
27
+ @for_index ||= klass.index_name
28
+ manager = klass.index_content_manager(@for_index)
29
+ manager.nil? and return false
30
+ field = manager.contents[@name.to_s]
31
+ field.nil? and return false
32
+ type_matches?(field, @type) &&
33
+ custom_attributes_match?(field, @expected_custom_attributes) rescue false
34
+ end
35
+
36
+ def description
37
+ expectation_message
38
+ end
39
+
40
+ def failure_message
41
+ "expected to #{expectation_message}"
42
+ end
43
+
44
+ private
45
+
46
+ def expectation_message
47
+ "define the index field :#{@name}" +
48
+ (@type.nil? ? "" : " with type :#{@type}") +
49
+ (@for_index.nil? ? "" : " for index '#{@for_index}'" )
50
+ end
51
+
52
+ def type_matches?(field, expected_type)
53
+ return true if expected_type.nil?
54
+ field.type.matches?(expected_type)
55
+ end
56
+
57
+ def custom_attributes_match?(field, expected_attributes)
58
+ return true if expected_attributes.empty?
59
+ field.type.options == expected_attributes
60
+ end
61
+ end
62
+
63
+ def define_index_field(*args)
64
+ DefineIndexField.new(*args)
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,207 @@
1
+ module AgnosticBackend
2
+ module Utilities
3
+
4
+ def self.included(base)
5
+ base.send :include, InstanceMethods
6
+ base.send :extend, ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ end
11
+
12
+ module InstanceMethods
13
+
14
+ def with_exponential_backoff(error, &block)
15
+ attempts = 0
16
+
17
+ begin
18
+ block.call
19
+ rescue error => e
20
+ if attempts < exponential_backoff_max_attempts
21
+ sleep(exponential_backoff_sleep_time(exponential_backoff_max_time, exponential_backoff_base, attempts))
22
+ attempts += 1
23
+ retry
24
+ else
25
+ raise e
26
+ end
27
+ end
28
+ end
29
+
30
+ def exponential_backoff_max_time
31
+ @exponential_backoff_max_time ||= 4
32
+ end
33
+
34
+ def exponential_backoff_max_attempts
35
+ @exponential_backoff_max_time ||= 10
36
+ end
37
+
38
+ def exponential_backoff_base
39
+ @exponential_backoff_max_time ||= 0.2
40
+ end
41
+
42
+ def exponential_backoff_sleep_time(max, base, attempts)
43
+ temp = [max, base * 2 ** attempts].min.to_f
44
+ temp/2 + rand(0.0...temp/2)
45
+ end
46
+
47
+ def flatten(document, delimiter = '__')
48
+ def flat_hash(document, delimiter)
49
+ flatten_doc = {}
50
+ document.each do |k, v|
51
+ if v.is_a? Hash
52
+ # if we have a nested hash, traverse the hash until we find a value
53
+ # When a value is found, we return it and merge the keys with the key of the previous recursion iteration
54
+ flat_hash(v, delimiter).map do |doc_k, doc_v|
55
+ flatten_doc["#{k}"+ delimiter + "#{doc_k}"] = doc_v
56
+ end
57
+ else
58
+ flatten_doc[k.to_s] = v
59
+ end
60
+ end
61
+
62
+ return flatten_doc
63
+ end
64
+
65
+ flat_hash(document, delimiter)
66
+ end
67
+
68
+ def unflatten(document, delimiter='__')
69
+ unflatten = {}
70
+
71
+ def unflatten_hash(hash, delimiter)
72
+ key, value = hash.keys.first, hash.values.first
73
+ components = key.split(delimiter)
74
+ new_key = components.shift
75
+ if components.empty?
76
+ return {new_key => value}
77
+ else
78
+ unflat_hash = {}
79
+ unflat_hash[new_key] = unflatten_hash({components.join(delimiter) => value}, delimiter)
80
+ end
81
+
82
+ unflat_hash
83
+ end
84
+
85
+ document.each do |k, v|
86
+ unflatten.deep_merge!(unflatten_hash({k => v}, delimiter))
87
+ end
88
+
89
+ unflatten
90
+ end
91
+
92
+ def transform_nested_values(hash, proc)
93
+ hash.keys.each do |key|
94
+ if hash[key].kind_of? Hash
95
+ transform_nested_values(hash[key], proc)
96
+ else
97
+ hash[key] = proc.call(hash[key])
98
+ end
99
+ end
100
+ hash
101
+ end
102
+
103
+ def value_for_key(document, key)
104
+ keys = key.split('.')
105
+ key = keys.shift
106
+ if document.is_a?(Hash)
107
+ if document.has_key? key
108
+ value_for_key(document[key], keys.join('.'))
109
+ else
110
+ return nil
111
+ end
112
+ else
113
+ if document.present? && key.nil?
114
+ return document
115
+ else
116
+ return nil
117
+ end
118
+ end
119
+ end
120
+
121
+ def reject_blank_values_from(flat_document)
122
+ flat_document.reject { |_, v| (v.is_a?(FalseClass) ? false : v.blank?) }
123
+ end
124
+
125
+ def convert_bool_values_to_string_in(document)
126
+ document.each do |k, v|
127
+ if v.is_a?(TrueClass)
128
+ document[k] = 'true'
129
+ elsif v.is_a?(FalseClass)
130
+ document[k] = 'false'
131
+ end
132
+ end
133
+ end
134
+
135
+ def convert_to(type, value)
136
+ case type
137
+ when :integer
138
+ if value.is_a?(Fixnum)
139
+ value
140
+ elsif is_integer?(value)
141
+ value.to_i
142
+ else
143
+ value
144
+ end
145
+ when :date
146
+ if value.is_a?(Time)
147
+ value
148
+ elsif is_date?(value)
149
+ value.to_time.utc
150
+ else
151
+ value
152
+ end
153
+ when :double
154
+ if value.is_a?(Float)
155
+ value
156
+ elsif is_float?(value)
157
+ value.to_f
158
+ else
159
+ value
160
+ end
161
+ when :boolean
162
+ if value.is_a?(TrueClass) || value.is_a?(FalseClass)
163
+ value
164
+ elsif is_boolean?(value)
165
+ convert_to_boolean(value)
166
+ else
167
+ value
168
+ end
169
+ when :string,:string_array,:text,:text_array
170
+ if value.is_a?(String)
171
+ value
172
+ else
173
+ value.to_s
174
+ end
175
+ else
176
+ value
177
+ end
178
+ end
179
+
180
+ def is_integer?(value)
181
+ (/^[-+]?\d+$/ =~ value.to_s).present?
182
+ end
183
+
184
+ def is_float?(value)
185
+ (/^[-+]?(\d*[.])?\d+$/ =~ value.to_s).present?
186
+ end
187
+
188
+ def is_boolean?(value)
189
+ value == 'true' || value == 'false'
190
+ end
191
+
192
+ def is_date?(value)
193
+ value.to_time.present? rescue false
194
+ end
195
+
196
+ def convert_to_boolean(value)
197
+ case value
198
+ when 'true'
199
+ true
200
+ when 'false'
201
+ false
202
+ end
203
+ end
204
+
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,3 @@
1
+ module AgnosticBackend
2
+ VERSION = "0.9.0"
3
+ end
@@ -0,0 +1,49 @@
1
+ require 'agnostic_backend/version'
2
+ require 'active_support/core_ext'
3
+
4
+ require 'agnostic_backend/utilities'
5
+
6
+ require 'agnostic_backend/indexable/indexable'
7
+ require 'agnostic_backend/indexable/config'
8
+ require 'agnostic_backend/indexable/field_type'
9
+ require 'agnostic_backend/indexable/field'
10
+ require 'agnostic_backend/indexable/content_manager'
11
+
12
+ require 'agnostic_backend/index'
13
+ require 'agnostic_backend/indexer'
14
+
15
+ require 'agnostic_backend/queryable/tree_node'
16
+ require 'agnostic_backend/queryable/attribute'
17
+ require 'agnostic_backend/queryable/value'
18
+ require 'agnostic_backend/queryable/criteria_builder'
19
+ require 'agnostic_backend/queryable/query_builder'
20
+ require 'agnostic_backend/queryable/executor'
21
+ require 'agnostic_backend/queryable/query'
22
+ require 'agnostic_backend/queryable/result_set'
23
+ require 'agnostic_backend/queryable/visitor'
24
+ require 'agnostic_backend/queryable/validator'
25
+
26
+ require 'agnostic_backend/queryable/criteria/criterion'
27
+ require 'agnostic_backend/queryable/criteria/binary'
28
+ require 'agnostic_backend/queryable/criteria/ternary'
29
+
30
+ require 'agnostic_backend/queryable/operations/operation'
31
+ require 'agnostic_backend/queryable/operations/unary'
32
+ require 'agnostic_backend/queryable/operations/n_ary'
33
+
34
+ require 'agnostic_backend/queryable/expressions/expression'
35
+
36
+ require 'agnostic_backend/queryable/cloudsearch/executor'
37
+ require 'agnostic_backend/queryable/cloudsearch/query'
38
+ require 'agnostic_backend/queryable/cloudsearch/query_builder'
39
+ require 'agnostic_backend/queryable/cloudsearch/result_set'
40
+ require 'agnostic_backend/queryable/cloudsearch/visitor'
41
+
42
+ require 'agnostic_backend/cloudsearch/index'
43
+ require 'agnostic_backend/cloudsearch/index_field'
44
+ require 'agnostic_backend/cloudsearch/indexer'
45
+ require 'agnostic_backend/cloudsearch/remote_index_field'
46
+
47
+ module AgnosticBackend
48
+
49
+ end
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: agnostic_backend
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Iasonas Gavriilidis
8
+ - Laertis Pappas
9
+ - Kyriakos Kentzoglanakis
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2016-02-29 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 3.2.22
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: 3.2.22
29
+ - !ruby/object:Gem::Dependency
30
+ name: aws-sdk
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '2'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '2'
43
+ - !ruby/object:Gem::Dependency
44
+ name: bundler
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rake
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: simplecov
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: simplecov-html
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ description:
114
+ email:
115
+ - i.gavriilidis@pamediakopes.gr
116
+ - l.pappas@pamediakopes.gr
117
+ - k.kentzoglanakis@pamediakopes.gr
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - ".gitignore"
123
+ - ".rspec"
124
+ - ".ruby-gemset"
125
+ - ".ruby-version"
126
+ - ".travis.yml"
127
+ - CODE_OF_CONDUCT.md
128
+ - Gemfile
129
+ - Gemfile.lock
130
+ - LICENSE.txt
131
+ - README.md
132
+ - Rakefile
133
+ - agnostic_backend.gemspec
134
+ - bin/console
135
+ - bin/setup
136
+ - doc/indexable.md
137
+ - doc/queryable.md
138
+ - lib/agnostic_backend.rb
139
+ - lib/agnostic_backend/cloudsearch/index.rb
140
+ - lib/agnostic_backend/cloudsearch/index_field.rb
141
+ - lib/agnostic_backend/cloudsearch/indexer.rb
142
+ - lib/agnostic_backend/cloudsearch/remote_index_field.rb
143
+ - lib/agnostic_backend/index.rb
144
+ - lib/agnostic_backend/indexable/config.rb
145
+ - lib/agnostic_backend/indexable/content_manager.rb
146
+ - lib/agnostic_backend/indexable/field.rb
147
+ - lib/agnostic_backend/indexable/field_type.rb
148
+ - lib/agnostic_backend/indexable/indexable.rb
149
+ - lib/agnostic_backend/indexer.rb
150
+ - lib/agnostic_backend/queryable/attribute.rb
151
+ - lib/agnostic_backend/queryable/cloudsearch/executor.rb
152
+ - lib/agnostic_backend/queryable/cloudsearch/query.rb
153
+ - lib/agnostic_backend/queryable/cloudsearch/query_builder.rb
154
+ - lib/agnostic_backend/queryable/cloudsearch/result_set.rb
155
+ - lib/agnostic_backend/queryable/cloudsearch/visitor.rb
156
+ - lib/agnostic_backend/queryable/criteria/binary.rb
157
+ - lib/agnostic_backend/queryable/criteria/criterion.rb
158
+ - lib/agnostic_backend/queryable/criteria/ternary.rb
159
+ - lib/agnostic_backend/queryable/criteria_builder.rb
160
+ - lib/agnostic_backend/queryable/executor.rb
161
+ - lib/agnostic_backend/queryable/expressions/expression.rb
162
+ - lib/agnostic_backend/queryable/operations/n_ary.rb
163
+ - lib/agnostic_backend/queryable/operations/operation.rb
164
+ - lib/agnostic_backend/queryable/operations/unary.rb
165
+ - lib/agnostic_backend/queryable/query.rb
166
+ - lib/agnostic_backend/queryable/query_builder.rb
167
+ - lib/agnostic_backend/queryable/result_set.rb
168
+ - lib/agnostic_backend/queryable/tree_node.rb
169
+ - lib/agnostic_backend/queryable/validator.rb
170
+ - lib/agnostic_backend/queryable/value.rb
171
+ - lib/agnostic_backend/queryable/visitor.rb
172
+ - lib/agnostic_backend/rspec/matchers.rb
173
+ - lib/agnostic_backend/utilities.rb
174
+ - lib/agnostic_backend/version.rb
175
+ homepage: https://github.com/e-travel/agnostic_backend
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: 2.1.0
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.4.8
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: A gem to index/query ruby objects to/from remote backends
199
+ test_files: []