arangorb 1.4.1 → 2.0.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/ArangoRB.gemspec +20 -18
  3. data/Gemfile +3 -0
  4. data/README.md +1079 -908
  5. data/lib/AQL.rb +155 -0
  6. data/lib/Batch.rb +97 -0
  7. data/lib/Cache.rb +71 -0
  8. data/lib/Collection.rb +852 -0
  9. data/lib/Database.rb +417 -0
  10. data/lib/Document.rb +346 -0
  11. data/lib/Edge.rb +104 -0
  12. data/lib/Error.rb +125 -0
  13. data/lib/Foxx.rb +277 -0
  14. data/lib/Graph.rb +325 -0
  15. data/lib/Index.rb +126 -0
  16. data/lib/Replication.rb +235 -0
  17. data/lib/Request.rb +143 -0
  18. data/lib/Server.rb +466 -0
  19. data/lib/Task.rb +120 -0
  20. data/lib/Transaction.rb +115 -0
  21. data/lib/Traversal.rb +224 -0
  22. data/lib/User.rb +197 -0
  23. data/lib/Vertex.rb +127 -0
  24. data/lib/View.rb +151 -0
  25. data/lib/arangorb.rb +23 -15
  26. data/lib/helpers/Error.rb +28 -0
  27. data/lib/helpers/Return.rb +53 -0
  28. metadata +64 -45
  29. data/lib/ArangoRB_AQL.rb +0 -181
  30. data/lib/ArangoRB_Cache.rb +0 -174
  31. data/lib/ArangoRB_Col.rb +0 -526
  32. data/lib/ArangoRB_DB.rb +0 -363
  33. data/lib/ArangoRB_Doc.rb +0 -319
  34. data/lib/ArangoRB_Edg.rb +0 -184
  35. data/lib/ArangoRB_Gra.rb +0 -201
  36. data/lib/ArangoRB_Index.rb +0 -135
  37. data/lib/ArangoRB_Replication.rb +0 -261
  38. data/lib/ArangoRB_Ser.rb +0 -446
  39. data/lib/ArangoRB_Task.rb +0 -129
  40. data/lib/ArangoRB_Tra.rb +0 -169
  41. data/lib/ArangoRB_Tran.rb +0 -68
  42. data/lib/ArangoRB_User.rb +0 -157
  43. data/lib/ArangoRB_Ver.rb +0 -162
  44. data/spec/arangoRB_helper.rb +0 -4
  45. data/spec/arangoRestart_helper.rb +0 -14
  46. data/spec/arangorb-1.3.0.gem +0 -0
  47. data/spec/lib/0.1.0/arangoAQL_helper.rb +0 -64
  48. data/spec/lib/0.1.0/arangoC_helper.rb +0 -170
  49. data/spec/lib/0.1.0/arangoDB_helper.rb +0 -119
  50. data/spec/lib/0.1.0/arangoDoc_helper.rb +0 -79
  51. data/spec/lib/0.1.0/arangoE_helper.rb +0 -50
  52. data/spec/lib/0.1.0/arangoG_helper.rb +0 -78
  53. data/spec/lib/0.1.0/arangoS_helper.rb +0 -37
  54. data/spec/lib/0.1.0/arangoT_helper.rb +0 -48
  55. data/spec/lib/0.1.0/arangoV_helper.rb +0 -65
  56. data/spec/lib/1.0.0/arangoC_helper.rb +0 -73
  57. data/spec/lib/1.0.0/arangoDB_helper.rb +0 -48
  58. data/spec/lib/1.0.0/arangoI_helper.rb +0 -43
  59. data/spec/lib/1.0.0/arangoS_helper.rb +0 -192
  60. data/spec/lib/1.0.0/arangoTa_helper.rb +0 -49
  61. data/spec/lib/1.0.0/arangoTr_helper.rb +0 -15
  62. data/spec/lib/1.0.0/arangoU_helper.rb +0 -72
  63. data/spec/lib/1.1.0/arangoRB_helper.rb +0 -144
  64. data/spec/lib/1.1.0/arangoRB_walks_helper.rb +0 -19
  65. data/spec/lib/1.2.0/arangoCache_helper.rb +0 -66
  66. data/spec/lib/1.3.0/arangoHash_helper.rb +0 -30
  67. data/spec/lib/arangoRB_0.1.0_helper.rb +0 -9
  68. data/spec/lib/arangoRB_1.0.0_helper.rb +0 -6
  69. data/spec/lib/arangoRB_1.1.0_helper.rb +0 -2
  70. data/spec/lib/arangoRB_1.2.0_helper.rb +0 -2
  71. data/spec/spec_helper.rb +0 -42
data/lib/User.rb ADDED
@@ -0,0 +1,197 @@
1
+ # === USER ===
2
+
3
+ module Arango
4
+ class User
5
+ include Arango::Helper_Error
6
+ include Arango::Helper_Return
7
+ include Arango::Server_Return
8
+
9
+ def self.new(*args)
10
+ hash = args[0]
11
+ super unless hash.is_a?(Hash)
12
+ database = hash[:database]
13
+ if database.is_a?(Arango::Database) && database.server.active_cache
14
+ cache_name = hash[:name]
15
+ cached = database.server.cache.cache.dig(:user, cache_name)
16
+ if cached.nil?
17
+ hash[:cache_name] = cache_name
18
+ return super
19
+ else
20
+ body = {}
21
+ [:password, :extra, :active].each{|k| body[k] ||= hash[k]}
22
+ cached.assign_attributes(body)
23
+ return cached
24
+ end
25
+ end
26
+ super
27
+ end
28
+
29
+ def initialize(server:, password: "", name:, extra: {}, active: nil, cache_name: nil)
30
+ assign_server(server)
31
+ unless cache_name.nil?
32
+ @cache_name = cache_name
33
+ @server.cache.save(:user, cache_name, self)
34
+ end
35
+ @password = password
36
+ @name = name
37
+ @extra = extra
38
+ @active = active
39
+ end
40
+
41
+ # === DEFINE ===
42
+
43
+ attr_accessor :name, :extra, :active
44
+ attr_reader :server, :body, :cache_name
45
+ attr_writer :password
46
+ alias user name
47
+ alias user= name=
48
+
49
+ def body=(result)
50
+ @body = result
51
+ @password = result[:password] || @password
52
+ @name = result[:user] || @name
53
+ @extra = result[:extra] || @extra
54
+ @active = result[:active].nil? ? @active : result[:active]
55
+ if @server.active_cache && @cache_name.nil?
56
+ @cache_name = @name
57
+ @server.cache.save(:user, @cache_name, self)
58
+ end
59
+ end
60
+ alias assign_attributes body=
61
+
62
+ # === TO HASH ===
63
+
64
+ def to_h
65
+ {
66
+ "user": @name,
67
+ "extra": @extra,
68
+ "active": @active,
69
+ "cache_name": @cache_name,
70
+ "server": @server.base_uri
71
+ }.delete_if{|k,v| v.nil?}
72
+ end
73
+
74
+ def [](database)
75
+ if self.databases[database.to_sym] == "rw"
76
+ Arango::Database.new name: database, server: @server
77
+ else
78
+ "This User does not have access to Database #{database}."
79
+ end
80
+ end
81
+ alias database []
82
+
83
+ # == USER ACTION ==
84
+
85
+ def create(password: @password, active: @active, extra: @extra)
86
+ body = {
87
+ "user": @name,
88
+ "passwd": password,
89
+ "extra": extra,
90
+ "active": active
91
+ }
92
+ result = @server.request("POST", "_api/user", body: body)
93
+ return_element(result)
94
+ end
95
+
96
+ def retrieve
97
+ result = @server.request("GET", "_api/user/#{@name}", body: body)
98
+ return_element(result)
99
+ end
100
+
101
+ def replace(password: @password, active: @active, extra: @extra)
102
+ body = {
103
+ "passwd": password,
104
+ "active": active,
105
+ "extra": extra
106
+ }
107
+ result = @server.request("PUT", "_api/user/#{@name}", body: body)
108
+ @password = password
109
+ return_element(result)
110
+ end
111
+
112
+ def update(password: @password, active: @active, extra: @extra)
113
+ body = {
114
+ "passwd": password,
115
+ "active": active,
116
+ "extra": extra
117
+ }
118
+ result = @server.request("PATCH", "_api/user/#{@name}", body: body)
119
+ @password = password
120
+ return_element(result)
121
+ end
122
+
123
+ def destroy
124
+ result = @server.request("DELETE", "_api/user/#{@name}")
125
+ return return_directly?(result) ? result : true
126
+ end
127
+
128
+ # == ACCESS ==
129
+
130
+ def addDatabaseAccess(grant:, database:)
131
+ satisfy_category?(grant, ["rw", "ro", "none"])
132
+ satisfy_class?(database, [Arango::Database, String])
133
+ database = database.name if database.is_a?(Arango::Database)
134
+ body = {"grant": grant}
135
+ result = @server.request("PUT", "_api/user/#{@name}/database/#{database}",
136
+ body: body)
137
+ return return_directly?(result) ? result : result[database.to_sym]
138
+ end
139
+
140
+ def grant(database:)
141
+ addDatabaseAccess(grant: "rw", database: database)
142
+ end
143
+
144
+ def addCollectionAccess(grant:, database:, collection:)
145
+ satisfy_category?(grant, ["rw", "ro", "none"])
146
+ satisfy_class?(database, [Arango::Database, String])
147
+ satisfy_class?(collection, [Arango::Collection, String])
148
+ database = database.name if database.is_a?(Arango::Database)
149
+ collection = collection.name if collection.is_a?(Arango::Collection)
150
+ body = {"grant": grant}
151
+ result = @server.request("PUT", "_api/user/#{@name}/database/#{database}/#{collection}",
152
+ body: body)
153
+ return return_directly?(result) ? result : result[:"#{database}/#{collection}"]
154
+ end
155
+
156
+ def revokeDatabaseAccess(database:)
157
+ satisfy_class?(database, [Arango::Database, String])
158
+ database = database.name if database.is_a?(Arango::Database)
159
+ result = @server.request("DELETE", "_api/user/#{@name}/database/#{database}")
160
+ return return_directly?(result) ? result : true
161
+ end
162
+ alias revoke revokeDatabaseAccess
163
+
164
+ def revokeCollectionAccess(database:, collection:)
165
+ satisfy_class?(database, [Arango::Database, String])
166
+ satisfy_class?(collection, [Arango::Collection, String])
167
+ database = database.name if database.is_a?(Arango::Database)
168
+ collection = collection.name if collection.is_a?(Arango::Collection)
169
+ result = @server.request("DELETE", "_api/user/#{@name}/database/#{database}/#{collection}")
170
+ return return_directly?(result) ? result : true
171
+ end
172
+
173
+ def listAccess(full: nil)
174
+ query = {"full": full}
175
+ result = @server.request("GET", "_api/user/#{@name}/database", query: query)
176
+ return return_directly?(result) ? result : result[:result]
177
+ end
178
+ alias databases listAccess
179
+
180
+ def databaseAccess(database:)
181
+ satisfy_class?(database, [Arango::Database, String])
182
+ database = database.name if database.is_a?(Arango::Database)
183
+ result = @server.request("GET", "_api/user/#{@name}/database/#{database}")
184
+ return return_directly?(result) ? result : result[:result]
185
+ end
186
+
187
+ def collectionAccess(database:, collection:)
188
+ satisfy_class?(database, [Arango::Database, String])
189
+ satisfy_class?(collection, [Arango::Collection, String])
190
+ database = database.name if database.is_a?(Arango::Database)
191
+ collection = collection.name if collection.is_a?(Arango::Collection)
192
+ result = @server.request("GET", "_api/user/#{@name}/database/#{database}/#{collection}",
193
+ body: body)
194
+ return return_directly?(result) ? result : result[:result]
195
+ end
196
+ end
197
+ end
data/lib/Vertex.rb ADDED
@@ -0,0 +1,127 @@
1
+ # === GRAPH VERTEX ===
2
+
3
+ module Arango
4
+ class Vertex < Arango::Document
5
+ def initialize(name: nil, collection:, body: {}, rev: nil, cache_name: nil)
6
+ assign_collection(collection)
7
+ unless cache_name.nil?
8
+ @cache_name = cache_name
9
+ @server.cache.save(:document, cache_name, self)
10
+ end
11
+ body[:_key] ||= name
12
+ body[:_rev] ||= rev
13
+ body[:_id] ||= "#{@collection.name}/#{name}" unless name.nil?
14
+ assign_attributes(body)
15
+ end
16
+
17
+ # === DEFINE ===
18
+
19
+ attr_reader :collection, :database, :server, :graph
20
+
21
+ def collection=(collection)
22
+ satisfy_class?(collection, [Arango::Collection])
23
+ if collection.graph.nil?
24
+ raise Arango::Error.new err: :collection_does_not_have_a_graph, data:
25
+ {"name_collection": collection.name, "graph": nil}
26
+ end
27
+ @collection = collection
28
+ @graph = @collection.graph
29
+ @database = @collection.database
30
+ @server = @database.server
31
+ end
32
+ alias assign_collection collection=
33
+
34
+ # == GET ==
35
+
36
+ def retrieve(if_match: false)
37
+ headers = {}
38
+ headers[:"If-Match"] = @body[:_rev] if if_match
39
+ result = @graph.request("GET", "vertex/#{@collection.name}/#{@body[:_key]}",
40
+ headers: headers, key: :vertex)
41
+ return_element(result)
42
+ end
43
+
44
+ # == POST ==
45
+
46
+ def create(body: {}, waitForSync: nil)
47
+ body = @body.merge(body)
48
+ query = {"waitForSync": waitForSync}
49
+ result = @graph.request("POST", "vertex/#{@collection.name}", body: body,
50
+ query: query, key: :vertex)
51
+ return result if @server.async != false
52
+ body2 = result.clone
53
+ body = body.merge(body2)
54
+ assign_attributes(body)
55
+ return return_directly?(result) ? result : self
56
+ end
57
+
58
+ # == PUT ==
59
+
60
+ def replace(body: {}, waitForSync: nil, keepNull: nil, if_match: false)
61
+ query = {
62
+ "waitForSync": waitForSync,
63
+ "keepNull": keepNull
64
+ }
65
+ headers = {}
66
+ headers[:"If-Match"] = @body[:_rev] if if_match
67
+ result = @graph.request("PUT", "vertex/#{@collection.name}/#{@body[:_key]}",
68
+ body: body, query: query, headers: headers, key: :vertex)
69
+ return result if @server.async != false
70
+ body2 = result.clone
71
+ body = body.merge(body2)
72
+ assign_attributes(body)
73
+ return return_directly?(result) ? result : self
74
+ end
75
+
76
+ def update(body: {}, waitForSync: nil, if_match: false, keepNull: nil)
77
+ query = {"waitForSync": waitForSync, "keepNull": keepNull}
78
+ headers = {}
79
+ headers[:"If-Match"] = @body[:_rev] if if_match
80
+ result = @graph.request("PATCH", "vertex/#{@collection.name}/#{@body[:_key]}", body: body,
81
+ query: query, headers: headers, key: :vertex)
82
+ return result if @server.async != false
83
+ body2 = result.clone
84
+ body = body.merge(body2)
85
+ body = @body.merge(body)
86
+ assign_attributes(body)
87
+ return return_directly?(result) ? result : self
88
+ end
89
+
90
+ # === DELETE ===
91
+
92
+ def destroy(waitForSync: nil, if_match: false)
93
+ query = {"waitForSync": waitForSync}
94
+ headers = {}
95
+ headers[:"If-Match"] = @body[:_rev] if if_match
96
+ result = @graph.request("DELETE", "vertex/#{@collection.name}/#{@body[:_key]}",
97
+ query: query, headers: headers)
98
+ return_delete(result)
99
+ end
100
+
101
+ # === TRAVERSAL ===
102
+
103
+ def traversal(body: {}, sort: nil, direction: nil, minDepth: nil,
104
+ visitor: nil, itemOrder: nil, strategy: nil,
105
+ filter: nil, init: nil, maxIterations: nil, maxDepth: nil,
106
+ uniqueness: nil, order: nil, expander: nil,
107
+ edgeCollection: nil)
108
+ Arango::Traversal.new(body: body,
109
+ sort: sort, direction: direction, minDepth: minDepth,
110
+ vertex: self, visitor: visitor,itemOrder: itemOrder,
111
+ strategy: strategy, filter: filter, init: init,
112
+ maxIterations: maxIterations, maxDepth: maxDepth,
113
+ uniqueness: uniqueness, order: order,
114
+ expander: expander, edgeCollection: edgeCollection)
115
+ end
116
+
117
+ # === WRONG ===
118
+
119
+ def from=(arg)
120
+ raise Arango::Error.new err: you_cannot_assign_from_or_to_to_a_vertex
121
+ end
122
+ alias to= from=
123
+ alias to from=
124
+ alias toR from=
125
+ alias fromR from=
126
+ end
127
+ end
data/lib/View.rb ADDED
@@ -0,0 +1,151 @@
1
+ # ==== DOCUMENT ====
2
+
3
+ module Arango
4
+ class View
5
+ include Arango::Helper_Error
6
+ include Arango::Helper_Return
7
+ include Arango::Database_Return
8
+
9
+ def self.new(*args)
10
+ hash = args[0]
11
+ super unless hash.is_a?(Hash)
12
+ database = hash[:database]
13
+ if database.is_a?(Arango::Database) && database.server.active_cache && !hash[:id].nil?
14
+ cache_name = "#{database.name}/#{hash[:id]}"
15
+ cached = database.server.cache.cache.dig(:view, cache_name)
16
+ if cached.nil?
17
+ hash[:cache_name] = cache_name
18
+ return super
19
+ else
20
+ body = {}
21
+ [:type, :name].each{|k| body[k] ||= hash[k]}
22
+ cached.assign_attributes(body)
23
+ return cached
24
+ end
25
+ end
26
+ super
27
+ end
28
+
29
+ def initialize(database:, type: "arangosearch", name:, id: nil, cache_name: nil)
30
+ assign_database(database)
31
+ unless cache_name.nil?
32
+ @cache_name = cache_name
33
+ @server.cache.save(:view, cache_name, self)
34
+ end
35
+ satisfy_category?(type, ["arangosearch"])
36
+ @type = type
37
+ @name = name
38
+ @links = {}
39
+ @id = id
40
+ end
41
+
42
+ # === DEFINE ===
43
+
44
+ attr_reader :type, :links, :database, :cache_name
45
+ attr_accessor :id, :name
46
+
47
+ def type=(type)
48
+ satisfy_category?(type, ["arangosearch"])
49
+ @type = type
50
+ end
51
+ alias assign_type type=
52
+
53
+ def addLink(collection:, analyzers: nil, fields: {}, includeAllFields: nil, trackListPositions: nil, storeValues: nil)
54
+ satisfy_class?(collection, [Arango::Collection, String])
55
+ collection_name = collection.is_a?(String) ? collection : collection.name
56
+ satisfy_category?(storeValues, ["none", "id", nil])
57
+ @links[collection_name] = {
58
+ analyzers: analyzers,
59
+ fields: fields,
60
+ includeAllFields: includeAllFields,
61
+ trackListPositions: trackListPositions,
62
+ storeValues: storeValues
63
+ }
64
+ @links[collection_name].delete_if{|k,v| v.nil?}
65
+ end
66
+
67
+ def to_h
68
+ {
69
+ "name": @name,
70
+ "id": @id,
71
+ "type": @type,
72
+ "links": @links,
73
+ "cache_name": @cache_name,
74
+ "database": @database.name
75
+ }.delete_if{|k,v| v.nil?}
76
+ end
77
+
78
+ def body=(result)
79
+ @body = result
80
+ @id = result[:id] || @id
81
+ @type = assign_type(result[:type] || @type)
82
+ @links = result[:links] || @links
83
+ @name = result[:name] || name
84
+ if @server.active_cache && @cache_name.nil?
85
+ @cache_name = "#{@database.name}/#{@id}"
86
+ @server.cache.save(:task, @cache_name, self)
87
+ end
88
+ end
89
+ alias assign_attributes body=
90
+
91
+ # === COMMANDS ===
92
+
93
+ def retrieve
94
+ result = @database.request("GET", "_api/view/#{@name}")
95
+ return result.headers[:"x-arango-async-id"] if @server.async == :store
96
+ return_element(result)
97
+ end
98
+
99
+ def manage_properties(method, url, consolidationIntervalMsec: nil, threshold: nil, segmentThreshold: nil, cleanupIntervalStep: nil)
100
+ body = {
101
+ properties: {
102
+ links: @links.empty? ? nil : @links,
103
+ consolidationIntervalMsec: consolidationIntervalMsec,
104
+ consolidationPolicy: {
105
+ threshold: threshold,
106
+ segmentThreshold: segmentThreshold
107
+ },
108
+ cleanupIntervalStep: cleanupIntervalStep
109
+ }
110
+ }
111
+ if method == "POST"
112
+ body[:type] = @type
113
+ body[:name] = @name
114
+ end
115
+ body[:properties][:consolidationPolicy].delete_if{|k,v| v.nil?}
116
+ body[:properties].delete(:consolidationPolicy) if body[:properties][:consolidationPolicy].empty?
117
+ body[:properties].delete_if{|k,v| v.nil?}
118
+ body.delete(:properties) if body[:properties].empty?
119
+ body.delete_if{|k,v| v.nil?}
120
+ result = @database.request(method, url, body: body)
121
+ return_element(result)
122
+ end
123
+ private :manage_properties
124
+
125
+ def create(consolidationIntervalMsec: nil, threshold: nil, segmentThreshold: nil, cleanupIntervalStep: nil)
126
+ manage_properties("POST", "_api/view", consolidationIntervalMsec: consolidationIntervalMsec, threshold: threshold, segmentThreshold: segmentThreshold, cleanupIntervalStep: cleanupIntervalStep)
127
+ end
128
+
129
+ def replaceProperties(consolidationIntervalMsec: nil, threshold: nil, segmentThreshold: nil, cleanupIntervalStep: nil)
130
+ manage_properties("PUT", "_api/view/#{@name}/properties", consolidationIntervalMsec: consolidationIntervalMsec, threshold: threshold, segmentThreshold: segmentThreshold, cleanupIntervalStep: cleanupIntervalStep)
131
+ end
132
+
133
+ def updateProperties(consolidationIntervalMsec: nil, threshold: nil, segmentThreshold: nil, cleanupIntervalStep: nil)
134
+ manage_properties("PATCH", "_api/view/#{@name}/properties", consolidationIntervalMsec: consolidationIntervalMsec, threshold: threshold, segmentThreshold: segmentThreshold, cleanupIntervalStep: cleanupIntervalStep)
135
+ end
136
+
137
+ def rename name:
138
+ body = {name: name}
139
+ result = @database.request("PUT", "_api/view/#{@name}/rename", body: body)
140
+ return_element(result)
141
+ end
142
+
143
+ def properties
144
+ @database.request("GET", "_api/view/#{@name}/properties")
145
+ end
146
+
147
+ def destroy
148
+ @database.request("DELETE", "_api/view/#{@name}", key: :result)
149
+ end
150
+ end
151
+ end