ashikawa-core 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +0 -1
- data/.travis.yml +2 -0
- data/CONTRIBUTING.md +14 -29
- data/Gemfile.devtools +9 -10
- data/README.md +30 -9
- data/Rakefile +1 -1
- data/ashikawa-core.gemspec +9 -8
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/roodi.yml +4 -5
- data/config/site.reek +40 -16
- data/config/yardstick.yml +1 -1
- data/lib/ashikawa-core/collection.rb +109 -22
- data/lib/ashikawa-core/connection.rb +42 -110
- data/lib/ashikawa-core/cursor.rb +13 -6
- data/lib/ashikawa-core/database.rb +67 -17
- data/lib/ashikawa-core/document.rb +41 -10
- data/lib/ashikawa-core/edge.rb +50 -0
- data/lib/ashikawa-core/exceptions/client_error/bad_syntax.rb +24 -0
- data/lib/ashikawa-core/exceptions/{collection_not_found.rb → client_error/resource_not_found/collection_not_found.rb} +3 -1
- data/lib/ashikawa-core/exceptions/{document_not_found.rb → client_error/resource_not_found/document_not_found.rb} +3 -1
- data/lib/ashikawa-core/exceptions/{index_not_found.rb → client_error/resource_not_found/index_not_found.rb} +3 -1
- data/lib/ashikawa-core/exceptions/client_error/resource_not_found.rb +25 -0
- data/lib/ashikawa-core/exceptions/client_error.rb +23 -0
- data/lib/ashikawa-core/exceptions/server_error/json_error.rb +25 -0
- data/lib/ashikawa-core/exceptions/server_error.rb +23 -0
- data/lib/ashikawa-core/figure.rb +59 -2
- data/lib/ashikawa-core/index.rb +23 -7
- data/lib/ashikawa-core/query.rb +10 -10
- data/lib/ashikawa-core/request_preprocessor.rb +49 -0
- data/lib/ashikawa-core/response_preprocessor.rb +111 -0
- data/lib/ashikawa-core/version.rb +1 -1
- data/lib/ashikawa-core.rb +0 -1
- data/spec/acceptance/basic_spec.rb +61 -22
- data/spec/acceptance/index_spec.rb +11 -4
- data/spec/acceptance/query_spec.rb +4 -1
- data/spec/acceptance/spec_helper.rb +0 -2
- data/spec/acceptance_auth/spec_helper.rb +0 -2
- data/spec/fixtures/collections/60768679-count.json +13 -0
- data/spec/fixtures/collections/60768679-figures.json +35 -0
- data/spec/fixtures/collections/60768679-properties-volatile.json +12 -0
- data/spec/fixtures/collections/60768679-properties.json +12 -0
- data/spec/fixtures/collections/{4588.json → 60768679.json} +2 -2
- data/spec/fixtures/collections/all.json +5 -5
- data/spec/fixtures/cursor/26011191-2.json +1 -1
- data/spec/fixtures/cursor/26011191.json +1 -1
- data/spec/fixtures/documents/example_1-137249191.json +6 -0
- data/spec/fixtures/documents/new-example_1-137249191.json +6 -0
- data/spec/setup/arangodb.sh +1 -1
- data/spec/unit/collection_spec.rb +117 -42
- data/spec/unit/connection_spec.rb +161 -61
- data/spec/unit/cursor_spec.rb +39 -12
- data/spec/unit/database_spec.rb +119 -19
- data/spec/unit/document_spec.rb +4 -2
- data/spec/unit/edge_spec.rb +54 -0
- data/spec/unit/exception_spec.rb +36 -8
- data/spec/unit/figure_spec.rb +37 -11
- data/spec/unit/index_spec.rb +1 -1
- data/spec/unit/query_spec.rb +18 -18
- data/spec/unit/spec_helper.rb +4 -13
- data/tasks/adjustments.rake +3 -2
- metadata +59 -32
- data/lib/ashikawa-core/exceptions/unknown_path.rb +0 -15
- data/spec/fixtures/collections/4590-properties.json +0 -9
- data/spec/fixtures/collections/4590.json +0 -8
- data/spec/fixtures/collections/73482-figures.json +0 -23
- data/spec/fixtures/documents/4590-333.json +0 -5
- data/spec/fixtures/documents/new-4590-333.json +0 -5
@@ -1,136 +1,79 @@
|
|
1
|
-
require "
|
2
|
-
require "
|
1
|
+
require "forwardable"
|
2
|
+
require "faraday"
|
3
|
+
require "null_logger"
|
3
4
|
require "uri"
|
4
|
-
require "ashikawa-core/
|
5
|
-
require "ashikawa-core/
|
6
|
-
require "ashikawa-core/exceptions/collection_not_found"
|
7
|
-
require "ashikawa-core/exceptions/unknown_path"
|
5
|
+
require "ashikawa-core/request_preprocessor"
|
6
|
+
require "ashikawa-core/response_preprocessor"
|
8
7
|
|
9
8
|
module Ashikawa
|
10
9
|
module Core
|
11
10
|
# A Connection via HTTP to a certain host
|
12
11
|
class Connection
|
12
|
+
extend Forwardable
|
13
|
+
|
13
14
|
# The host part of the connection
|
14
15
|
#
|
16
|
+
# @!method host
|
15
17
|
# @return [String]
|
16
18
|
# @api public
|
17
19
|
# @example Get the host part of the connection
|
18
20
|
# connection = Connection.new("http://localhost:8529")
|
19
21
|
# connection.host # => "localhost"
|
20
|
-
|
22
|
+
def_delegator :@connection, :host
|
21
23
|
|
22
24
|
# The scheme of the connection
|
23
25
|
#
|
26
|
+
# @!method scheme
|
24
27
|
# @return [String]
|
25
28
|
# @api public
|
26
29
|
# @example Get the scheme of the connection
|
27
30
|
# connection = Connection.new("http://localhost:8529")
|
28
31
|
# connection.scheme # => "http"
|
29
|
-
|
32
|
+
def_delegator :@connection, :scheme
|
30
33
|
|
31
34
|
# The port of the connection
|
32
35
|
#
|
36
|
+
# @!method port
|
33
37
|
# @return [Fixnum]
|
34
38
|
# @api public
|
35
39
|
# @example Get the port of the connection
|
36
40
|
# connection = Connection.new("http://localhost:8529")
|
37
41
|
# connection.port # => 8529
|
38
|
-
|
39
|
-
|
40
|
-
# Username of the connection if using authentication
|
41
|
-
# @note you can set these properties with the `authenticate_with` method
|
42
|
-
#
|
43
|
-
# @return String
|
44
|
-
# @api public
|
45
|
-
# @example Get the username of the connection
|
46
|
-
# connection = Connection.new("http://localhost:8529")
|
47
|
-
# connection.authenticate_with(:username => 'james', :password => 'bond')
|
48
|
-
# connection.username # => 'james'
|
49
|
-
attr_reader :username
|
50
|
-
|
51
|
-
# Password of the connection if using authentication
|
52
|
-
# @note you can set these properties with the `authenticate_with` method
|
53
|
-
#
|
54
|
-
# @return String
|
55
|
-
# @api public
|
56
|
-
# @example Get the password of the connection
|
57
|
-
# connection = Connection.new("http://localhost:8529")
|
58
|
-
# connection.authenticate_with(:username => 'james', :password => 'bond')
|
59
|
-
# connection.password # => 'bond'
|
60
|
-
attr_reader :password
|
42
|
+
def_delegator :@connection, :port
|
61
43
|
|
62
44
|
# Initialize a Connection with a given API String
|
63
45
|
#
|
64
46
|
# @param [String] api_string scheme, hostname and port as a String
|
47
|
+
# @option opts [Object] adapter The Faraday adapter you want to use. Defaults to Default Adapter
|
48
|
+
# @option opts [Object] logger The logger you want to use. Defaults to Null Logger.
|
65
49
|
# @api public
|
66
50
|
# @example Create a new Connection
|
67
51
|
# connection = Connection.new("http://localhost:8529")
|
68
|
-
def initialize(api_string =
|
69
|
-
|
70
|
-
|
71
|
-
@
|
72
|
-
|
52
|
+
def initialize(api_string, opts = {})
|
53
|
+
logger = opts[:logger] || NullLogger.instance
|
54
|
+
adapter = opts[:adapter] || Faraday.default_adapter
|
55
|
+
@connection = Faraday.new("#{api_string}/_api") do |connection|
|
56
|
+
connection.request :ashikawa_request, logger
|
57
|
+
connection.response :ashikawa_response, logger
|
58
|
+
connection.adapter *adapter
|
59
|
+
end
|
73
60
|
end
|
74
61
|
|
75
62
|
# Sends a request to a given path returning the parsed result
|
76
63
|
# @note prepends the api_string automatically
|
77
64
|
#
|
78
|
-
# @param [
|
79
|
-
# @option params [
|
80
|
-
# @return [
|
65
|
+
# @param [string] path the path you wish to send a request to.
|
66
|
+
# @option params [hash] :post post data in case you want to send a post request.
|
67
|
+
# @return [hash] parsed json response from the server
|
81
68
|
# @api public
|
82
69
|
# @example get request
|
83
70
|
# connection.send_request('/collection/new_collection')
|
84
71
|
# @example post request
|
85
72
|
# connection.send_request('/collection/new_collection', :post => { :name => 'new_collection' })
|
86
73
|
def send_request(path, params = {})
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
resource_not_found_for(path)
|
91
|
-
end
|
92
|
-
JSON.parse(raw)
|
93
|
-
end
|
94
|
-
|
95
|
-
# Raise the fitting ResourceNotFoundException
|
96
|
-
#
|
97
|
-
# @raise [DocumentNotFoundException, CollectionNotFoundException, IndexNotFoundException]
|
98
|
-
# @return nil
|
99
|
-
# @api private
|
100
|
-
def resource_not_found_for(path)
|
101
|
-
path = path.split("/").delete_if { |part| part == "" }
|
102
|
-
resource = path.first
|
103
|
-
|
104
|
-
raise case resource
|
105
|
-
when "document" then DocumentNotFoundException
|
106
|
-
when "collection" then CollectionNotFoundException
|
107
|
-
when "index" then IndexNotFoundException
|
108
|
-
else UnknownPath
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
# Sends a request to a given path returning the raw result
|
113
|
-
# @note prepends the api_string automatically
|
114
|
-
#
|
115
|
-
# @example get request
|
116
|
-
# connection.raw_result_for('/collection/new_collection')
|
117
|
-
# @example post request
|
118
|
-
# connection.raw_result_for('/collection/new_collection', :post => { :name => 'new_collection' })
|
119
|
-
# @param [String] path the path you wish to send a request to.
|
120
|
-
# @option params [Hash] :post POST data in case you want to send a POST request.
|
121
|
-
# @return [String] raw response from the server
|
122
|
-
# @api public
|
123
|
-
def raw_result_for(path, params = {})
|
124
|
-
path = full_path(path)
|
125
|
-
method = [:post, :put, :delete].find { |method_name|
|
126
|
-
params.has_key?(method_name)
|
127
|
-
} || :get
|
128
|
-
|
129
|
-
if [:post, :put].include?(method)
|
130
|
-
RestClient.send(method, path, params[method].to_json)
|
131
|
-
else
|
132
|
-
RestClient.send(method, path)
|
133
|
-
end
|
74
|
+
method = http_verb(params)
|
75
|
+
result = @connection.public_send(method, path, params[method])
|
76
|
+
result.body
|
134
77
|
end
|
135
78
|
|
136
79
|
# Checks if authentication for this Connection is active or not
|
@@ -143,7 +86,7 @@ module Ashikawa
|
|
143
86
|
# connection.authenticate_with(:username => 'james', :password => 'bond')
|
144
87
|
# connection.authentication? #=> true
|
145
88
|
def authentication?
|
146
|
-
!!@
|
89
|
+
!!@authentication
|
147
90
|
end
|
148
91
|
|
149
92
|
# Authenticate with given username and password
|
@@ -157,33 +100,22 @@ module Ashikawa
|
|
157
100
|
# connection = Connection.new("http://localhost:8529")
|
158
101
|
# connection.authenticate_with(:username => 'james', :password => 'bond')
|
159
102
|
def authenticate_with(options = {})
|
160
|
-
|
161
|
-
|
162
|
-
@password = options[:password]
|
163
|
-
else
|
164
|
-
raise ArgumentError, 'missing username or password'
|
165
|
-
end
|
166
|
-
|
103
|
+
raise ArgumentError, 'missing username or password' unless options.key? :username and options.key? :password
|
104
|
+
@authentication = @connection.basic_auth(options[:username], options[:password])
|
167
105
|
self
|
168
106
|
end
|
169
107
|
|
170
|
-
|
171
|
-
#
|
172
|
-
# @param [String] path The API path
|
173
|
-
# @return [String] Full path
|
174
|
-
# @api public
|
175
|
-
# @example Get the full path
|
176
|
-
# connection = Connection.new("http://localhost:8529")
|
177
|
-
# connection.full_path('documents') #=> "http://localhost:8529/_api/documents"
|
178
|
-
# connection.full_path('/documents') #=> "http://localhost:8529/_api/documents"
|
179
|
-
def full_path(path)
|
180
|
-
prefix = if authentication?
|
181
|
-
"#{@scheme}://#{@username}:#{@password}@#{@host}:#{@port}"
|
182
|
-
else
|
183
|
-
"#{@scheme}://#{@host}:#{@port}"
|
184
|
-
end
|
108
|
+
private
|
185
109
|
|
186
|
-
|
110
|
+
# Return the HTTP Verb for the given parameters
|
111
|
+
#
|
112
|
+
# @param [Hash] params The params given to the method
|
113
|
+
# @return [Symbol] The HTTP verb used
|
114
|
+
# @api private
|
115
|
+
def http_verb(params)
|
116
|
+
[:post, :put, :delete].find { |method_name|
|
117
|
+
params.has_key?(method_name)
|
118
|
+
} || :get
|
187
119
|
end
|
188
120
|
end
|
189
121
|
end
|
data/lib/ashikawa-core/cursor.rb
CHANGED
@@ -8,11 +8,11 @@ module Ashikawa
|
|
8
8
|
include Enumerable
|
9
9
|
|
10
10
|
# The ID of the cursor
|
11
|
-
# @return [
|
11
|
+
# @return [String]
|
12
12
|
# @api public
|
13
13
|
# @example Get the id of the cursor
|
14
14
|
# cursor = Ashikawa::Core::Cursor.new(database, raw_cursor)
|
15
|
-
# cursor.id #=> 1337
|
15
|
+
# cursor.id #=> "1337"
|
16
16
|
attr_reader :id
|
17
17
|
|
18
18
|
# The number of documents
|
@@ -38,14 +38,20 @@ module Ashikawa
|
|
38
38
|
# Iterate over the documents found by the cursor
|
39
39
|
#
|
40
40
|
# @yield [document]
|
41
|
-
# @return nil
|
41
|
+
# @return [nil, Enumerator] If no block is given, an Enumerator is returned
|
42
42
|
# @api public
|
43
43
|
# @example Print all documents
|
44
44
|
# cursor = Ashikawa::Core::Cursor.new(database, raw_cursor)
|
45
45
|
# cursor.each do |document|
|
46
46
|
# p document
|
47
47
|
# end
|
48
|
+
# @example Get an enumerator to iterate over all documents
|
49
|
+
# cursor = Ashikawa::Core::Cursor.new(database, raw_cursor)
|
50
|
+
# enumerator = cursor.each
|
51
|
+
# enumerator.next #=> #<Document ...>
|
48
52
|
def each
|
53
|
+
return to_enum(__callee__) unless block_given?
|
54
|
+
|
49
55
|
begin
|
50
56
|
@current.each do |raw_document|
|
51
57
|
yield Document.new(@database, raw_document)
|
@@ -61,17 +67,18 @@ module Ashikawa
|
|
61
67
|
# cursor = Ashikawa::Core::Cursor.new(database, raw_cursor)
|
62
68
|
# cursor.delete
|
63
69
|
def delete
|
64
|
-
@database.send_request("
|
70
|
+
@database.send_request("cursor/#{@id}", :delete => {})
|
65
71
|
end
|
66
72
|
|
67
73
|
private
|
68
74
|
|
69
75
|
# Pull the raw data from the cursor into this object
|
70
76
|
#
|
77
|
+
# @param [Hash] raw_cursor
|
71
78
|
# @return self
|
72
79
|
# @api private
|
73
80
|
def parse_raw_cursor(raw_cursor)
|
74
|
-
@id = raw_cursor['id']
|
81
|
+
@id = raw_cursor['id']
|
75
82
|
@has_more = raw_cursor['hasMore']
|
76
83
|
@length = raw_cursor['count'].to_i if raw_cursor.has_key?('count')
|
77
84
|
@current = raw_cursor['result']
|
@@ -84,7 +91,7 @@ module Ashikawa
|
|
84
91
|
# @api private
|
85
92
|
def next_batch
|
86
93
|
return false unless @has_more
|
87
|
-
raw_cursor = @database.send_request("
|
94
|
+
raw_cursor = @database.send_request("cursor/#{@id}", :put => {})
|
88
95
|
parse_raw_cursor(raw_cursor)
|
89
96
|
end
|
90
97
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "ashikawa-core/exceptions/collection_not_found"
|
1
|
+
require "ashikawa-core/exceptions/client_error/resource_not_found/collection_not_found"
|
2
2
|
require "ashikawa-core/collection"
|
3
3
|
require "ashikawa-core/connection"
|
4
4
|
require "ashikawa-core/cursor"
|
@@ -6,8 +6,16 @@ require "forwardable"
|
|
6
6
|
|
7
7
|
module Ashikawa
|
8
8
|
module Core
|
9
|
+
# Configuration of Ashikawa::Core
|
10
|
+
Configuration = Struct.new(:url, :connection, :logger, :adapter)
|
11
|
+
|
9
12
|
# An ArangoDB database
|
10
13
|
class Database
|
14
|
+
COLLECTION_TYPES = {
|
15
|
+
:document => 2,
|
16
|
+
:edge => 3
|
17
|
+
}
|
18
|
+
|
11
19
|
extend Forwardable
|
12
20
|
|
13
21
|
# Delegate sending requests to the connection
|
@@ -19,19 +27,26 @@ module Ashikawa
|
|
19
27
|
|
20
28
|
# Initializes the connection to the database
|
21
29
|
#
|
22
|
-
# @param [Connection, String] connection A Connection object or a String to create a Connection object.
|
23
30
|
# @api public
|
24
31
|
# @example Access a Database by providing the URL
|
25
|
-
#
|
32
|
+
# database = Ashikawa::Core::Database.new do |config|
|
33
|
+
# config.url = "http://localhost:8529"
|
34
|
+
# end
|
26
35
|
# @example Access a Database by providing a Connection
|
27
|
-
#
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
36
|
+
# connection = Connection.new("http://localhost:8529")
|
37
|
+
# database = Ashikawa::Core::Database.new do |config|
|
38
|
+
# config.connection = connection
|
39
|
+
# end
|
40
|
+
# @example Access a Database with a logger and custom HTTP adapter
|
41
|
+
# database = Ashikawa::Core::Database.new do |config|
|
42
|
+
# config.url = "http://localhost:8529"
|
43
|
+
# config.adapter = my_adapter
|
44
|
+
# config.logger = my_logger
|
45
|
+
# end
|
46
|
+
def initialize()
|
47
|
+
configuration = Ashikawa::Core::Configuration.new
|
48
|
+
yield(configuration)
|
49
|
+
@connection = configuration.connection || setup_new_connection(configuration.url, configuration.logger, configuration.adapter)
|
35
50
|
end
|
36
51
|
|
37
52
|
# Returns a list of all collections defined in the database
|
@@ -44,8 +59,26 @@ module Ashikawa
|
|
44
59
|
# database["b"]
|
45
60
|
# database.collections # => [ #<Collection name="a">, #<Collection name="b">]
|
46
61
|
def collections
|
47
|
-
|
48
|
-
|
62
|
+
response = send_request("collection")
|
63
|
+
response["collections"].map { |collection| Ashikawa::Core::Collection.new(self, collection) }
|
64
|
+
end
|
65
|
+
|
66
|
+
# Create a Collection based on name
|
67
|
+
#
|
68
|
+
# @param [String] collection_identifier The desired name of the collection
|
69
|
+
# @option opts [Boolean] :is_volatile Should the collection be volatile? Default is false
|
70
|
+
# @option opts [Boolean] :content_type What kind of content should the collection have? Default is :document
|
71
|
+
# @return [Collection]
|
72
|
+
# @api public
|
73
|
+
# @example Create a new, volatile collection
|
74
|
+
# database = Ashikawa::Core::Database.new("http://localhost:8529")
|
75
|
+
# database.create_collection("a", :isVolatile => true) # => #<Collection name="a">
|
76
|
+
def create_collection(collection_identifier, opts={})
|
77
|
+
params = { :name => collection_identifier }
|
78
|
+
params[:isVolatile] = true if opts[:is_volatile] == true
|
79
|
+
params[:type] = COLLECTION_TYPES[opts[:content_type]] if opts.has_key?(:content_type)
|
80
|
+
response = send_request("collection", :post => params)
|
81
|
+
Ashikawa::Core::Collection.new(self, response)
|
49
82
|
end
|
50
83
|
|
51
84
|
# Get or create a Collection based on name or ID
|
@@ -59,16 +92,18 @@ module Ashikawa
|
|
59
92
|
# @example Get a Collection from the database by ID
|
60
93
|
# database = Ashikawa::Core::Database.new("http://localhost:8529")
|
61
94
|
# database["7254820"] # => #<Collection id=7254820>
|
62
|
-
def
|
95
|
+
def collection(collection_identifier)
|
63
96
|
begin
|
64
|
-
|
97
|
+
response = send_request("collection/#{collection_identifier}")
|
65
98
|
rescue CollectionNotFoundException
|
66
|
-
|
99
|
+
response = send_request("collection", :post => { :name => collection_identifier })
|
67
100
|
end
|
68
101
|
|
69
|
-
Ashikawa::Core::Collection.new(self,
|
102
|
+
Ashikawa::Core::Collection.new(self, response)
|
70
103
|
end
|
71
104
|
|
105
|
+
alias :[] :collection
|
106
|
+
|
72
107
|
# Return a Query initialized with this database
|
73
108
|
#
|
74
109
|
# @return [Query]
|
@@ -79,6 +114,21 @@ module Ashikawa
|
|
79
114
|
def query
|
80
115
|
Query.new(self)
|
81
116
|
end
|
117
|
+
|
118
|
+
# Setup the connection object
|
119
|
+
#
|
120
|
+
# @param [String] url
|
121
|
+
# @param [Logger] logger
|
122
|
+
# @param [Adapter] adapter
|
123
|
+
# @return [Connection]
|
124
|
+
# @api private
|
125
|
+
def setup_new_connection(url, logger, adapter)
|
126
|
+
raise(ArgumentError, "Please provide either an url or a connection to setup the database") if url.nil?
|
127
|
+
Ashikawa::Core::Connection.new(url, {
|
128
|
+
:logger => logger,
|
129
|
+
:adapter => adapter
|
130
|
+
})
|
131
|
+
end
|
82
132
|
end
|
83
133
|
end
|
84
134
|
end
|
@@ -1,21 +1,30 @@
|
|
1
|
-
require 'ashikawa-core/exceptions/document_not_found'
|
1
|
+
require 'ashikawa-core/exceptions/client_error/resource_not_found/document_not_found'
|
2
2
|
|
3
3
|
module Ashikawa
|
4
4
|
module Core
|
5
5
|
# A certain Document within a certain Collection
|
6
6
|
class Document
|
7
|
-
# The ID of the document
|
7
|
+
# The ID of the document (this includes the Collection prefix)
|
8
8
|
#
|
9
|
-
# @return [
|
9
|
+
# @return [String]
|
10
10
|
# @api public
|
11
11
|
# @example Get the ID for a Document
|
12
12
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
13
|
-
# document.id # => 2345678
|
13
|
+
# document.id # => "my_fancy_collection/2345678"
|
14
14
|
attr_reader :id
|
15
15
|
|
16
|
+
# The key of the document (No collection prefix)
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
# @api public
|
20
|
+
# @example Get the key for a Document
|
21
|
+
# document = Ashikawa::Core::Document.new(database, raw_document)
|
22
|
+
# document.key # => "2345678"
|
23
|
+
attr_reader :key
|
24
|
+
|
16
25
|
# The current revision of the document
|
17
26
|
#
|
18
|
-
# @return [
|
27
|
+
# @return [String]
|
19
28
|
# @api public
|
20
29
|
# @example Get the Revision for a Document
|
21
30
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
@@ -31,9 +40,7 @@ module Ashikawa
|
|
31
40
|
# document = Ashikawa::Core::Document.new(database, raw_document)
|
32
41
|
def initialize(database, raw_document)
|
33
42
|
@database = database
|
34
|
-
|
35
|
-
@revision = raw_document['_rev'].to_i unless raw_document['_rev'].nil?
|
36
|
-
@content = raw_document.delete_if { |key, value| key.start_with?("_") }
|
43
|
+
parse_raw_document(raw_document)
|
37
44
|
end
|
38
45
|
|
39
46
|
# Raises an exception if the document is not persisted
|
@@ -69,7 +76,7 @@ module Ashikawa
|
|
69
76
|
# document.delete
|
70
77
|
def delete
|
71
78
|
check_if_persisted!
|
72
|
-
|
79
|
+
send_request_for_document(:delete => {})
|
73
80
|
end
|
74
81
|
|
75
82
|
# Update the value of an attribute (Does not write to database)
|
@@ -107,7 +114,31 @@ module Ashikawa
|
|
107
114
|
# document.save
|
108
115
|
def save()
|
109
116
|
check_if_persisted!
|
110
|
-
|
117
|
+
send_request_for_document(:put => @content)
|
118
|
+
end
|
119
|
+
|
120
|
+
protected
|
121
|
+
|
122
|
+
# Parse information returned from the server
|
123
|
+
#
|
124
|
+
# @param [Hash] raw_document
|
125
|
+
# @return self
|
126
|
+
# @api private
|
127
|
+
def parse_raw_document(raw_document)
|
128
|
+
@id = raw_document['_id']
|
129
|
+
@key = raw_document['_key']
|
130
|
+
@revision = raw_document['_rev']
|
131
|
+
@content = raw_document.delete_if { |key, value| key.start_with?("_") }
|
132
|
+
self
|
133
|
+
end
|
134
|
+
|
135
|
+
# Send a request for this document with the given opts
|
136
|
+
#
|
137
|
+
# @param [Hash] opts Options for this request
|
138
|
+
# @return [Hash] The parsed response from the server
|
139
|
+
# @api private
|
140
|
+
def send_request_for_document(opts = {})
|
141
|
+
@database.send_request("document/#{@id}", opts)
|
111
142
|
end
|
112
143
|
end
|
113
144
|
end
|