ashikawa-core 0.8.0 → 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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +3 -3
- data/CHANGELOG.md +49 -0
- data/Gemfile +3 -2
- data/Gemfile.devtools +14 -22
- data/Guardfile +3 -2
- data/README.md +37 -6
- data/Rakefile +2 -1
- data/ashikawa-core.gemspec +2 -2
- data/cache/Mac_applications +1 -0
- data/config/devtools.yml +5 -0
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -2
- data/config/reek.yml +1 -1
- data/config/rubocop.yml +23 -25
- data/lib/ashikawa-core.rb +6 -5
- data/lib/ashikawa-core/collection.rb +142 -165
- data/lib/ashikawa-core/configuration.rb +41 -2
- data/lib/ashikawa-core/connection.rb +17 -16
- data/lib/ashikawa-core/cursor.rb +18 -12
- data/lib/ashikawa-core/database.rb +69 -59
- data/lib/ashikawa-core/document.rb +22 -20
- data/lib/ashikawa-core/edge.rb +8 -6
- data/lib/ashikawa-core/exceptions/client_error.rb +1 -0
- data/lib/ashikawa-core/exceptions/client_error/authentication_failed.rb +25 -0
- data/lib/ashikawa-core/exceptions/client_error/bad_syntax.rb +3 -2
- data/lib/ashikawa-core/exceptions/client_error/resource_not_found.rb +3 -2
- data/lib/ashikawa-core/exceptions/client_error/resource_not_found/collection_not_found.rb +3 -2
- data/lib/ashikawa-core/exceptions/client_error/resource_not_found/document_not_found.rb +3 -2
- data/lib/ashikawa-core/exceptions/client_error/resource_not_found/index_not_found.rb +3 -2
- data/lib/ashikawa-core/exceptions/no_collection_provided.rb +1 -0
- data/lib/ashikawa-core/exceptions/server_error.rb +1 -0
- data/lib/ashikawa-core/exceptions/server_error/json_error.rb +3 -2
- data/lib/ashikawa-core/figure.rb +18 -17
- data/lib/ashikawa-core/index.rb +15 -5
- data/lib/ashikawa-core/key_options.rb +5 -4
- data/lib/ashikawa-core/query.rb +38 -27
- data/lib/ashikawa-core/request_preprocessor.rb +4 -3
- data/lib/ashikawa-core/response_preprocessor.rb +64 -24
- data/lib/ashikawa-core/status.rb +1 -0
- data/lib/ashikawa-core/transaction.rb +12 -11
- data/lib/ashikawa-core/version.rb +2 -1
- data/spec/acceptance/basic_spec.rb +117 -116
- data/spec/acceptance/index_spec.rb +18 -15
- data/spec/acceptance/query_spec.rb +61 -64
- data/spec/acceptance/spec_helper.rb +26 -3
- data/spec/acceptance/transactions_spec.rb +12 -16
- data/spec/setup/arangodb.sh +2 -2
- data/spec/unit/collection_spec.rb +224 -242
- data/spec/unit/configuration_spec.rb +64 -0
- data/spec/unit/connection_spec.rb +121 -111
- data/spec/unit/cursor_spec.rb +78 -65
- data/spec/unit/database_spec.rb +112 -163
- data/spec/unit/document_spec.rb +74 -70
- data/spec/unit/edge_spec.rb +45 -33
- data/spec/unit/exception_spec.rb +28 -38
- data/spec/unit/figure_spec.rb +44 -47
- data/spec/unit/index_spec.rb +27 -24
- data/spec/unit/key_options_spec.rb +19 -17
- data/spec/unit/query_spec.rb +186 -135
- data/spec/unit/spec_helper.rb +14 -3
- data/spec/unit/status_spec.rb +37 -37
- data/spec/unit/transaction_spec.rb +71 -74
- data/tasks/adjustments.rake +10 -34
- metadata +11 -13
- data/spec/acceptance/arango_helper.rb +0 -27
- data/spec/acceptance_auth/arango_helper.rb +0 -30
- data/spec/acceptance_auth/auth_spec.rb +0 -40
- data/spec/acceptance_auth/spec_helper.rb +0 -6
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
require 'ashikawa-core/exceptions/client_error/resource_not_found/document_not_found'
|
2
3
|
require 'equalizer'
|
3
4
|
|
@@ -13,7 +14,7 @@ module Ashikawa
|
|
13
14
|
# @api public
|
14
15
|
# @example Get the ID for a Document
|
15
16
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
16
|
-
# document.id # =>
|
17
|
+
# document.id # => 'my_fancy_collection/2345678'
|
17
18
|
attr_reader :id
|
18
19
|
|
19
20
|
# The key of the document (No collection prefix)
|
@@ -22,7 +23,7 @@ module Ashikawa
|
|
22
23
|
# @api public
|
23
24
|
# @example Get the key for a Document
|
24
25
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
25
|
-
# document.key # =>
|
26
|
+
# document.key # => '2345678'
|
26
27
|
attr_reader :key
|
27
28
|
|
28
29
|
# The current revision of the document
|
@@ -38,11 +39,13 @@ module Ashikawa
|
|
38
39
|
#
|
39
40
|
# @param [Database] database
|
40
41
|
# @param [Hash] raw_document
|
42
|
+
# @param [Hash] additional_data
|
41
43
|
# @api public
|
42
44
|
# @example Create a document
|
43
45
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
44
|
-
def initialize(database, raw_document)
|
46
|
+
def initialize(database, raw_document, additional_data = {})
|
45
47
|
@database = database
|
48
|
+
raw_document.merge!(clean_up_additional_data(additional_data))
|
46
49
|
parse_raw_document(raw_document)
|
47
50
|
end
|
48
51
|
|
@@ -79,7 +82,7 @@ module Ashikawa
|
|
79
82
|
# document.delete
|
80
83
|
def delete
|
81
84
|
check_if_persisted!
|
82
|
-
send_request_for_document(:
|
85
|
+
send_request_for_document(delete: {})
|
83
86
|
end
|
84
87
|
|
85
88
|
# Update the value of an attribute (Does not write to database)
|
@@ -102,24 +105,11 @@ module Ashikawa
|
|
102
105
|
# @api public
|
103
106
|
# @example Get the hash representation of a document
|
104
107
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
105
|
-
# document.hash #=> { :name =>
|
108
|
+
# document.hash #=> { :name => 'Lebowski", :occupation => "Not occupied' }
|
106
109
|
def hash
|
107
110
|
@content
|
108
111
|
end
|
109
112
|
|
110
|
-
# Convert the document into a hash
|
111
|
-
#
|
112
|
-
# @return [Hash]
|
113
|
-
# @api public
|
114
|
-
# @deprecated Use {#hash} instead.
|
115
|
-
# @example Get the hash representation of a document
|
116
|
-
# document = Ashikawa::Core::Document.new(database, raw_document)
|
117
|
-
# document.to_hash #=> { :name => "Lebowski", :occupation => "Not occupied" }
|
118
|
-
def to_hash
|
119
|
-
warn "`to_hash` is deprecated, please use `hash`"
|
120
|
-
hash
|
121
|
-
end
|
122
|
-
|
123
113
|
# Save the changes to the database
|
124
114
|
#
|
125
115
|
# @return [Hash] parsed JSON response from the server
|
@@ -130,7 +120,7 @@ module Ashikawa
|
|
130
120
|
# document.save
|
131
121
|
def save
|
132
122
|
check_if_persisted!
|
133
|
-
send_request_for_document(:
|
123
|
+
send_request_for_document(put: @content)
|
134
124
|
end
|
135
125
|
|
136
126
|
# Get a fresh version of this document from the database
|
@@ -155,7 +145,7 @@ module Ashikawa
|
|
155
145
|
@id = raw_document['_id'] || :not_persisted
|
156
146
|
@key = raw_document['_key']
|
157
147
|
@revision = raw_document['_rev'] || :not_persisted
|
158
|
-
@content = raw_document.delete_if { |key, value| key.start_with?(
|
148
|
+
@content = raw_document.delete_if { |key, value| key.start_with?('_') }
|
159
149
|
self
|
160
150
|
end
|
161
151
|
|
@@ -167,6 +157,18 @@ module Ashikawa
|
|
167
157
|
def send_request_for_document(opts = {})
|
168
158
|
@database.send_request("document/#{@id}", opts)
|
169
159
|
end
|
160
|
+
|
161
|
+
# Clean up the raw data hash to have string keys
|
162
|
+
#
|
163
|
+
# @param [Hash] raw_data
|
164
|
+
# @return [Hash] Cleaned up hash
|
165
|
+
# @api private
|
166
|
+
def clean_up_additional_data(raw_data)
|
167
|
+
raw_data.reduce({}) do |result, (key, value)|
|
168
|
+
result[key.to_s] = value
|
169
|
+
result
|
170
|
+
end
|
171
|
+
end
|
170
172
|
end
|
171
173
|
end
|
172
174
|
end
|
data/lib/ashikawa-core/edge.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
require 'ashikawa-core/document'
|
2
3
|
require 'equalizer'
|
3
4
|
|
@@ -13,7 +14,7 @@ module Ashikawa
|
|
13
14
|
# @api public
|
14
15
|
# @example Get the ID for the 'from' Document
|
15
16
|
# document = Ashikawa::Core::Edge.new(database, raw_document)
|
16
|
-
# document.from_id # =>
|
17
|
+
# document.from_id # => 'my_fancy_collection/2345678'
|
17
18
|
attr_reader :from_id
|
18
19
|
|
19
20
|
# The ID of the 'to' document
|
@@ -22,20 +23,21 @@ module Ashikawa
|
|
22
23
|
# @api public
|
23
24
|
# @example Get the ID for the 'to' Document
|
24
25
|
# document = Ashikawa::Core::Edge.new(database, raw_document)
|
25
|
-
# document.to_id # =>
|
26
|
+
# document.to_id # => 'my_fancy_collection/2345678'
|
26
27
|
attr_reader :to_id
|
27
28
|
|
28
29
|
# Initialize an Edge with the database and raw data
|
29
30
|
#
|
30
31
|
# @param [Database] database
|
31
32
|
# @param [Hash] raw_edge
|
33
|
+
# @param [Hash] additional_data
|
32
34
|
# @api public
|
33
35
|
# @example Create an Edge
|
34
36
|
# document = Ashikawa::Core::Edge.new(database, raw_edge)
|
35
|
-
def initialize(database, raw_edge)
|
36
|
-
@from_id = raw_edge[
|
37
|
-
@to_id = raw_edge[
|
38
|
-
super(database, raw_edge)
|
37
|
+
def initialize(database, raw_edge, additional_data = {})
|
38
|
+
@from_id = raw_edge['_from']
|
39
|
+
@to_id = raw_edge['_to']
|
40
|
+
super(database, raw_edge, additional_data)
|
39
41
|
end
|
40
42
|
|
41
43
|
protected
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/client_error.rb'
|
3
|
+
|
4
|
+
module Ashikawa
|
5
|
+
module Core
|
6
|
+
# This exception is thrown when the client is not authorized
|
7
|
+
class AuthenticationFailed < ClientError
|
8
|
+
# Create a new authentication failure
|
9
|
+
#
|
10
|
+
# @return RuntimeError
|
11
|
+
# @api private
|
12
|
+
def initialize
|
13
|
+
super(401)
|
14
|
+
end
|
15
|
+
|
16
|
+
# String representation of the exception
|
17
|
+
#
|
18
|
+
# @return String
|
19
|
+
# @api private
|
20
|
+
def to_s
|
21
|
+
'Status 401: Authentication failed'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/client_error.rb'
|
2
3
|
|
3
4
|
module Ashikawa
|
4
5
|
module Core
|
@@ -17,7 +18,7 @@ module Ashikawa
|
|
17
18
|
# @return String
|
18
19
|
# @api private
|
19
20
|
def to_s
|
20
|
-
|
21
|
+
'Status 400: The syntax of the request was bad'
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/client_error.rb'
|
2
3
|
|
3
4
|
module Ashikawa
|
4
5
|
module Core
|
@@ -18,7 +19,7 @@ module Ashikawa
|
|
18
19
|
# @return String
|
19
20
|
# @api private
|
20
21
|
def to_s
|
21
|
-
|
22
|
+
'Status 404: The Resource you requested was not found on the server'
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/client_error/resource_not_found'
|
2
3
|
|
3
4
|
module Ashikawa
|
4
5
|
module Core
|
@@ -10,7 +11,7 @@ module Ashikawa
|
|
10
11
|
# @return String
|
11
12
|
# @api private
|
12
13
|
def to_s
|
13
|
-
|
14
|
+
'You requested a collection from the server that does not exist'
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/client_error/resource_not_found'
|
2
3
|
|
3
4
|
module Ashikawa
|
4
5
|
module Core
|
@@ -10,7 +11,7 @@ module Ashikawa
|
|
10
11
|
# @return String
|
11
12
|
# @api private
|
12
13
|
def to_s
|
13
|
-
|
14
|
+
'You requested a document from the server that does not exist'
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/client_error/resource_not_found'
|
2
3
|
|
3
4
|
module Ashikawa
|
4
5
|
module Core
|
@@ -10,7 +11,7 @@ module Ashikawa
|
|
10
11
|
# @return String
|
11
12
|
# @api private
|
12
13
|
def to_s
|
13
|
-
|
14
|
+
'You requested an index from the server that does not exist'
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'ashikawa-core/exceptions/server_error'
|
2
3
|
|
3
4
|
module Ashikawa
|
4
5
|
module Core
|
@@ -18,7 +19,7 @@ module Ashikawa
|
|
18
19
|
# @return String
|
19
20
|
# @api private
|
20
21
|
def to_s
|
21
|
-
|
22
|
+
'Either the JSON from the server was malformed or the content type incorrect'
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
data/lib/ashikawa-core/figure.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module Ashikawa
|
2
3
|
module Core
|
3
4
|
# Wrapper around figures of a collection
|
@@ -9,12 +10,12 @@ module Ashikawa
|
|
9
10
|
# @example Create a new figure from a raw figure
|
10
11
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
11
12
|
def initialize(raw_figure)
|
12
|
-
@datafiles = raw_figure[
|
13
|
-
@alive = raw_figure[
|
14
|
-
@dead = raw_figure[
|
15
|
-
@shapes = raw_figure[
|
16
|
-
@journals = raw_figure[
|
17
|
-
@attributes = raw_figure[
|
13
|
+
@datafiles = raw_figure['datafiles']
|
14
|
+
@alive = raw_figure['alive']
|
15
|
+
@dead = raw_figure['dead']
|
16
|
+
@shapes = raw_figure['shapes']
|
17
|
+
@journals = raw_figure['journals']
|
18
|
+
@attributes = raw_figure['attributes']
|
18
19
|
end
|
19
20
|
|
20
21
|
# The number of active datafiles
|
@@ -25,7 +26,7 @@ module Ashikawa
|
|
25
26
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
26
27
|
# figure.datafiles_count #=> 1337
|
27
28
|
def datafiles_count
|
28
|
-
@datafiles[
|
29
|
+
@datafiles['count']
|
29
30
|
end
|
30
31
|
|
31
32
|
# The file size of datafiles
|
@@ -36,7 +37,7 @@ module Ashikawa
|
|
36
37
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
37
38
|
# figure.datafile_size #=> 1337
|
38
39
|
def datafiles_file_size
|
39
|
-
@datafiles[
|
40
|
+
@datafiles['fileSize']
|
40
41
|
end
|
41
42
|
|
42
43
|
# The total size in bytes used by all living documents
|
@@ -47,7 +48,7 @@ module Ashikawa
|
|
47
48
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
48
49
|
# figure.alive_size #=> 1337
|
49
50
|
def alive_size
|
50
|
-
@alive[
|
51
|
+
@alive['size']
|
51
52
|
end
|
52
53
|
|
53
54
|
# The number of living documents
|
@@ -58,7 +59,7 @@ module Ashikawa
|
|
58
59
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
59
60
|
# figure.alive_count #=> 1337
|
60
61
|
def alive_count
|
61
|
-
@alive[
|
62
|
+
@alive['count']
|
62
63
|
end
|
63
64
|
|
64
65
|
# The total size in bytes used by all dead documents
|
@@ -69,7 +70,7 @@ module Ashikawa
|
|
69
70
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
70
71
|
# figure.dead_size #=> 1337
|
71
72
|
def dead_size
|
72
|
-
@dead[
|
73
|
+
@dead['size']
|
73
74
|
end
|
74
75
|
|
75
76
|
# The number of dead documents
|
@@ -80,7 +81,7 @@ module Ashikawa
|
|
80
81
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
81
82
|
# figure.dead_count #=> 1337
|
82
83
|
def dead_count
|
83
|
-
@dead[
|
84
|
+
@dead['count']
|
84
85
|
end
|
85
86
|
|
86
87
|
# The total number of shapes used in the collection
|
@@ -91,7 +92,7 @@ module Ashikawa
|
|
91
92
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
92
93
|
# figure.shapes_count #=> 1337
|
93
94
|
def shapes_count
|
94
|
-
@shapes[
|
95
|
+
@shapes['count']
|
95
96
|
end
|
96
97
|
|
97
98
|
# The number of deletion markers
|
@@ -102,7 +103,7 @@ module Ashikawa
|
|
102
103
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
103
104
|
# figure.dead_deletion #=> 1337
|
104
105
|
def dead_deletion
|
105
|
-
@dead[
|
106
|
+
@dead['deletion']
|
106
107
|
end
|
107
108
|
|
108
109
|
# The number of journals
|
@@ -113,7 +114,7 @@ module Ashikawa
|
|
113
114
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
114
115
|
# figure.journal_count #=> 1337
|
115
116
|
def journals_count
|
116
|
-
@journals[
|
117
|
+
@journals['count']
|
117
118
|
end
|
118
119
|
|
119
120
|
# The file size of journals
|
@@ -124,7 +125,7 @@ module Ashikawa
|
|
124
125
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
125
126
|
# figure.journal_size #=> 1337
|
126
127
|
def journals_file_size
|
127
|
-
@journals[
|
128
|
+
@journals['fileSize']
|
128
129
|
end
|
129
130
|
|
130
131
|
# Number of different attributes that are or have been used in the collection
|
@@ -135,7 +136,7 @@ module Ashikawa
|
|
135
136
|
# figure = Ashikawa::Core::Figure.new(raw_figure)
|
136
137
|
# figure.attributes_count #=> 12
|
137
138
|
def attributes_count
|
138
|
-
@attributes[
|
139
|
+
@attributes['count']
|
139
140
|
end
|
140
141
|
end
|
141
142
|
end
|
data/lib/ashikawa-core/index.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
require 'equalizer'
|
2
3
|
|
3
4
|
module Ashikawa
|
@@ -63,7 +64,7 @@ module Ashikawa
|
|
63
64
|
# index = Ashikawa::Core::Index.new(collection, raw_index)
|
64
65
|
# index.delete
|
65
66
|
def delete
|
66
|
-
@collection.send_request("index/#{@id}", :
|
67
|
+
@collection.send_request("index/#{@id}", delete: {})
|
67
68
|
end
|
68
69
|
|
69
70
|
private
|
@@ -74,12 +75,21 @@ module Ashikawa
|
|
74
75
|
# @return self
|
75
76
|
# @api private
|
76
77
|
def parse_raw_index(raw_index)
|
77
|
-
@id = raw_index[
|
78
|
-
@on = raw_index[
|
79
|
-
@type = raw_index[
|
80
|
-
@unique = raw_index[
|
78
|
+
@id = raw_index['id']
|
79
|
+
@on = convert_to_symbols(raw_index['fields']) if raw_index.key?('fields')
|
80
|
+
@type = raw_index['type'].to_sym if raw_index.key?('type')
|
81
|
+
@unique = raw_index['unique']
|
81
82
|
self
|
82
83
|
end
|
84
|
+
|
85
|
+
# Convert all elements of an array to symbols
|
86
|
+
#
|
87
|
+
# @param [Array] arr
|
88
|
+
# @return Array
|
89
|
+
# @api private
|
90
|
+
def convert_to_symbols(arr)
|
91
|
+
arr.map { |field| field.to_sym }
|
92
|
+
end
|
83
93
|
end
|
84
94
|
end
|
85
95
|
end
|