agnostic_backend 0.9.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 (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: []