kinto_box 0.1.12 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +33 -0
- data/kinto_box.gemspec +16 -14
- data/lib/kinto_box.rb +124 -71
- data/lib/kinto_box/{response_handler.rb → errors.rb} +0 -30
- data/lib/kinto_box/kinto_batch_request.rb +16 -20
- data/lib/kinto_box/kinto_bucket.rb +18 -40
- data/lib/kinto_box/kinto_collection.rb +8 -41
- data/lib/kinto_box/kinto_group.rb +4 -17
- data/lib/kinto_box/kinto_object.rb +176 -35
- data/lib/kinto_box/kinto_record.rb +1 -13
- data/lib/kinto_box/kinto_request.rb +10 -7
- data/lib/kinto_box/kinto_server.rb +31 -0
- data/lib/kinto_box/version.rb +1 -1
- metadata +34 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96296262d3eed5289517616cd4358a228ae1faba
|
4
|
+
data.tar.gz: 14eaa8ec93d64b6c01504d631d8a9c584aab4f86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3889be916740f913b0209a42054755eef40847249a9f6cc5b0416d4d94d5779ff13632ab9dbaf05b3e1785d4d9c6ca9d03a134265897f433bb6a0683c949d60
|
7
|
+
data.tar.gz: 71d1f0f150bab1cd756680153543afb3862635fce40a36d7546377737e12458788928f7ab382b1431c21d8d531953b694b73f5a09f522a3d8c66648e14a0ea0f
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
AllCops:
|
2
|
+
Include:
|
3
|
+
- '**/Rakefile'
|
4
|
+
|
5
|
+
#Style/HashSyntax:
|
6
|
+
#EnforcedStyle: hash_rockets
|
7
|
+
|
8
|
+
Style/GuardClause:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
Style/LineLength:
|
12
|
+
Max: 100
|
13
|
+
|
14
|
+
Style/NumericLiterals:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Style/ClassAndModuleChildren:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Style/SignalException:
|
21
|
+
EnforcedStyle: only_raise
|
22
|
+
|
23
|
+
Style/ClassLength:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Style/MethodLength:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
Metrics/CyclomaticComplexity:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Style/Alias:
|
33
|
+
Enabled: false
|
data/kinto_box.gemspec
CHANGED
@@ -4,33 +4,35 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'kinto_box/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'kinto_box'
|
8
8
|
spec.version = KintoBox::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Kavya Sukumar']
|
10
|
+
spec.email = ['Kavya.Sukumar@voxmedia.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'Kinto http client in ruby'
|
13
|
+
spec.description = 'Kinto http client in ruby'
|
14
|
+
spec.homepage = 'http://github.com/voxmedia/kinto_box'
|
15
|
+
spec.license = 'BSD'
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
18
18
|
# delete this section to allow pushing this gem to any host.
|
19
19
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata['allowed_push_host'] =
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
21
21
|
else
|
22
|
-
raise
|
22
|
+
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
|
23
23
|
end
|
24
24
|
|
25
25
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
-
spec.bindir =
|
26
|
+
spec.bindir = 'exe'
|
27
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
-
spec.require_paths = [
|
28
|
+
spec.require_paths = ['lib']
|
29
29
|
|
30
30
|
spec.add_runtime_dependency 'httparty', '~> 0.13.7'
|
31
31
|
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
32
|
+
spec.add_development_dependency 'bundler', '~> 1.11'
|
33
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
34
34
|
spec.add_development_dependency 'json', '~> 1.8', '>= 1.8.3'
|
35
|
-
spec.add_development_dependency
|
35
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
36
|
+
spec.add_development_dependency 'rdoc'
|
37
|
+
spec.add_development_dependency 'rubocop'
|
36
38
|
end
|
data/lib/kinto_box.rb
CHANGED
@@ -1,19 +1,23 @@
|
|
1
|
-
require "kinto_box/version"
|
2
1
|
require 'httparty'
|
3
|
-
require 'kinto_box/response_handler'
|
4
|
-
require 'kinto_box/kinto_bucket'
|
5
2
|
require 'base64'
|
6
3
|
|
7
|
-
|
4
|
+
require 'kinto_box/version'
|
5
|
+
require 'kinto_box/errors'
|
6
|
+
require 'kinto_box/kinto_server'
|
7
|
+
require 'kinto_box/kinto_batch_request'
|
8
8
|
|
9
|
+
module KintoBox
|
9
10
|
# Initializes a new Kinto client.
|
10
11
|
#
|
11
12
|
# @param [String] server Url of the server without the version
|
12
|
-
# @param [Hash] options Optional parameter. If the hash contains :username
|
13
|
-
#
|
13
|
+
# @param [Hash] options Optional parameter. If the hash contains :username
|
14
|
+
# and :password, it will be used to authenticate.
|
15
|
+
# `options` parameter Can be used to pass in
|
16
|
+
# credentials. If no credentials are passed, it looks
|
17
|
+
# for KINTO_API_TOKEN environment variable.
|
14
18
|
# @return [KintoBox::KintoClient] A kinto client object
|
15
|
-
def
|
16
|
-
|
19
|
+
def self.new(*args, **kwargs, &blk)
|
20
|
+
KintoClient.new(*args, **kwargs, &blk)
|
17
21
|
end
|
18
22
|
|
19
23
|
class KintoClient
|
@@ -24,49 +28,53 @@ module KintoBox
|
|
24
28
|
# Initializes a new Kinto client.
|
25
29
|
#
|
26
30
|
# @param [String] server Url of the server without the version
|
27
|
-
# @param [Hash] options Optional parameter. If the hash contains :username
|
28
|
-
#
|
31
|
+
# @param [Hash] options Optional parameter. If the hash contains :username
|
32
|
+
# and :password, it will be used to authenticate.
|
33
|
+
# `options` parameter Can be used to pass in
|
34
|
+
# credentials. If no credentials are passed, it looks
|
35
|
+
# for KINTO_API_TOKEN environment variable.
|
29
36
|
# @return [KintoBox::KintoClient] A kinto client object
|
30
|
-
def initialize(server,
|
31
|
-
|
32
|
-
self.class.base_uri URI.join(@server, '/v1/').to_s
|
37
|
+
def initialize(server, username: nil, password: nil)
|
38
|
+
self.class.base_uri(URI.join(server, '/v1/').to_s)
|
33
39
|
|
34
|
-
|
35
|
-
|
36
|
-
|
40
|
+
auth = if username && password
|
41
|
+
Base64.encode64("#{username}:#{password}")
|
42
|
+
else
|
43
|
+
ENV['KINTO_API_TOKEN']
|
44
|
+
end
|
37
45
|
|
38
|
-
|
39
|
-
|
46
|
+
self.class.headers('Authorization' => "Basic #{auth}")
|
47
|
+
|
48
|
+
@server = KintoServer.new(client: self)
|
40
49
|
end
|
41
50
|
|
42
51
|
# Get reference to a bucket
|
43
52
|
#
|
44
53
|
# @param [String] bucket_id The id of the bucket
|
45
54
|
# @return [KintoBox::KintoBucket] A kinto bucket object
|
46
|
-
def bucket
|
47
|
-
@bucket
|
48
|
-
@bucket
|
55
|
+
def bucket(bucket_id)
|
56
|
+
@server.bucket(bucket_id)
|
49
57
|
end
|
50
58
|
|
51
59
|
# Get server information
|
52
60
|
#
|
53
61
|
# @return [Hash] Server info as a hash
|
54
62
|
def server_info
|
55
|
-
|
63
|
+
@server.info
|
56
64
|
end
|
57
65
|
|
58
66
|
# Get current user id
|
59
67
|
#
|
60
68
|
# @return [String] current user id
|
61
69
|
def current_user_id
|
62
|
-
|
70
|
+
@server.current_user_id
|
63
71
|
end
|
64
72
|
|
65
73
|
# List of buckets
|
66
74
|
#
|
67
75
|
# @return [Hash] with list of buckets
|
68
76
|
def list_buckets
|
69
|
-
|
77
|
+
@server.list_buckets
|
70
78
|
end
|
71
79
|
|
72
80
|
# Create a bucket
|
@@ -74,56 +82,22 @@ module KintoBox
|
|
74
82
|
# @param [String] bucket_id The id of the bucket
|
75
83
|
# @return [KintoBox::KintoBucket] A kinto bucket object
|
76
84
|
def create_bucket(bucket_id)
|
77
|
-
|
78
|
-
bucket(bucket_id)
|
85
|
+
@server.create_bucket(bucket_id)
|
79
86
|
end
|
80
87
|
|
81
88
|
# Delete all buckets
|
82
|
-
#
|
89
|
+
# @return [Hash] API response
|
83
90
|
def delete_buckets
|
84
|
-
|
91
|
+
@server.delete_buckets
|
85
92
|
end
|
86
93
|
|
87
|
-
# Raw request
|
88
|
-
#
|
89
|
-
def request(path, method, data = {})
|
90
|
-
case method.upcase
|
91
|
-
when 'PUT'
|
92
|
-
self.class.put(path, :body => data.to_json)
|
93
|
-
when 'GET'
|
94
|
-
self.class.get(path)
|
95
|
-
when 'POST'
|
96
|
-
self.class.post(path, :body => data.to_json)
|
97
|
-
when 'DELETE'
|
98
|
-
self.class.delete(path)
|
99
|
-
when 'OPTIONS'
|
100
|
-
self.class.options(path)
|
101
|
-
when 'HEAD'
|
102
|
-
self.class.head(path)
|
103
|
-
when 'MOVE'
|
104
|
-
self.class.move(path, :body => data.to_json)
|
105
|
-
when 'COPY'
|
106
|
-
self.class.copy(path, :body => data.to_json)
|
107
|
-
when 'PATCH'
|
108
|
-
self.class.copy(path, :body => data.to_json)
|
109
|
-
else
|
110
|
-
raise HTTPBadRequest
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Make batch requests
|
115
|
-
def create_batch_request
|
116
|
-
KintoBatchRequest.new(self)
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
94
|
# Calls http PUT on path
|
121
95
|
#
|
122
96
|
# @params [String]path Url path
|
123
97
|
# @params [Hash] data to be sent in the body
|
124
98
|
# @return [Hash] response body
|
125
99
|
def put(path, data = {})
|
126
|
-
|
100
|
+
request 'PUT', path, body: data.to_json
|
127
101
|
end
|
128
102
|
|
129
103
|
# Calls http POST on path
|
@@ -132,7 +106,7 @@ module KintoBox
|
|
132
106
|
# @params [Hash] data to be sent in the body
|
133
107
|
# @return [Hash] response body
|
134
108
|
def post(path, data = {})
|
135
|
-
|
109
|
+
request 'POST', path, body: data.to_json
|
136
110
|
end
|
137
111
|
|
138
112
|
# Calls http PATCH on path
|
@@ -141,34 +115,113 @@ module KintoBox
|
|
141
115
|
# @params [Hash] data to be sent in the body
|
142
116
|
# @return [Hash] response body
|
143
117
|
def patch(path, data)
|
144
|
-
|
118
|
+
request 'PATCH', path, body: data.to_json
|
145
119
|
end
|
146
120
|
|
147
121
|
# Calls http DELETE on path
|
148
122
|
#
|
149
123
|
# @params [String]path Url path
|
150
|
-
# @params [Hash] data to be sent in the body
|
151
124
|
# @return [Hash] response body
|
152
125
|
def delete(path)
|
153
|
-
|
126
|
+
request 'DELETE', path
|
154
127
|
end
|
155
128
|
|
156
129
|
# Calls http GET on path
|
157
130
|
#
|
158
131
|
# @params [String]path Url path
|
159
|
-
# @params [Hash] data to be sent in the body
|
160
132
|
# @return [Hash] response body
|
161
133
|
def get(path)
|
162
|
-
|
134
|
+
request 'GET', path
|
163
135
|
end
|
164
136
|
|
165
137
|
# Calls http HEAD on path
|
166
138
|
#
|
167
139
|
# @params [String]path Url path
|
168
|
-
# @params [Hash] data to be sent in the body
|
169
140
|
# @return [Hash] response body
|
170
|
-
def head(path
|
171
|
-
|
141
|
+
def head(path)
|
142
|
+
request 'HEAD', path
|
143
|
+
end
|
144
|
+
|
145
|
+
# Get a request object
|
146
|
+
# @param [String] method
|
147
|
+
# @param [String] path
|
148
|
+
# @param [Hash] body
|
149
|
+
# @return [KintoRequest] Request object
|
150
|
+
def create_request(method, path, body = {})
|
151
|
+
KintoRequest.new self, method, path, body
|
152
|
+
end
|
153
|
+
|
154
|
+
# Make batch requests
|
155
|
+
# @return [KintoBatchRequest] New back request object
|
156
|
+
def create_batch_request
|
157
|
+
KintoBatchRequest.new self
|
158
|
+
end
|
159
|
+
|
160
|
+
# Make batch requests
|
161
|
+
# results = client.batch do req
|
162
|
+
# req.add_request(...)
|
163
|
+
# end
|
164
|
+
def batch
|
165
|
+
req = create_batch_request
|
166
|
+
if block_given?
|
167
|
+
yield req
|
168
|
+
req.execute
|
169
|
+
else
|
170
|
+
req
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# Send a prepared request
|
175
|
+
# @param [KintoRequest] request
|
176
|
+
# @return [Hash] response
|
177
|
+
def send_request(request_obj)
|
178
|
+
request(request_obj.method, request_obj.path, body: request_obj.body.to_json)
|
179
|
+
end
|
180
|
+
|
181
|
+
private
|
182
|
+
|
183
|
+
# Handle all the kinds of requests
|
184
|
+
#
|
185
|
+
# @param [String] HTTP method
|
186
|
+
# @param [String] Path to query
|
187
|
+
# @return [Hash] Return data
|
188
|
+
def request(method, path, **kwargs)
|
189
|
+
verbs = %w(put get post delete options head move copy patch)
|
190
|
+
method = method.to_s.downcase
|
191
|
+
raise HTTPBadRequest("Unsupported HTTP method #{method}") unless verbs.include?(method)
|
192
|
+
resp = self.class.send(method.to_sym, path, **kwargs)
|
193
|
+
if method == 'head'
|
194
|
+
handle_response resp, head_instead: true
|
195
|
+
else
|
196
|
+
handle_response resp
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Parse and process HTTP response. Check for codes, and parse return body.
|
201
|
+
# @param [Object] Response object
|
202
|
+
# @param [Boolean] <head_instead> Return headers instead of body
|
203
|
+
# @return [Hash] Response payload
|
204
|
+
def handle_response(resp, head_instead: false)
|
205
|
+
case resp.code
|
206
|
+
when 200, 201
|
207
|
+
head_instead ? resp.headers : JSON.parse(resp.body)
|
208
|
+
when 202, 204
|
209
|
+
true
|
210
|
+
when 400
|
211
|
+
raise BadRequest, resp
|
212
|
+
when 401
|
213
|
+
raise NotAllowed, resp
|
214
|
+
when 403
|
215
|
+
raise NotAuthorized, resp
|
216
|
+
when 404
|
217
|
+
raise NotFound, resp
|
218
|
+
else
|
219
|
+
if resp.code >= 500
|
220
|
+
raise ServerError, resp
|
221
|
+
else
|
222
|
+
raise Error, resp
|
223
|
+
end
|
224
|
+
end
|
172
225
|
end
|
173
226
|
end
|
174
227
|
end
|
@@ -28,34 +28,4 @@ module KintoBox
|
|
28
28
|
|
29
29
|
# Raised when there is some sort of error on the server
|
30
30
|
class ServerError < Error; end
|
31
|
-
|
32
|
-
class ResponseHandler
|
33
|
-
def self.handle(resp)
|
34
|
-
if [200, 201].include? resp.code
|
35
|
-
JSON.parse resp.body
|
36
|
-
elsif [202, 204].include? resp.code
|
37
|
-
true
|
38
|
-
elsif resp.code == 400
|
39
|
-
raise BadRequest, resp
|
40
|
-
elsif resp.code == 404
|
41
|
-
raise NotFound, resp
|
42
|
-
elsif resp.code == 401
|
43
|
-
raise NotAllowed, resp
|
44
|
-
elsif resp.code == 403
|
45
|
-
raise NotAuthorized, resp
|
46
|
-
elsif resp.code >= 500
|
47
|
-
raise ServerError, resp
|
48
|
-
else
|
49
|
-
raise Error, resp
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.get_response_head(resp)
|
54
|
-
if [200, 201].include? resp.code
|
55
|
-
resp.headers
|
56
|
-
else
|
57
|
-
raise BadRequest, resp
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
31
|
end
|
@@ -1,30 +1,26 @@
|
|
1
|
-
require 'kinto_box/kinto_collection'
|
2
|
-
require 'kinto_box/kinto_object'
|
3
1
|
require 'kinto_box/kinto_request'
|
4
|
-
|
5
2
|
module KintoBox
|
6
|
-
class KintoBatchRequest
|
3
|
+
class KintoBatchRequest < KintoRequest
|
4
|
+
attr_reader :requests
|
7
5
|
|
8
|
-
def initialize(
|
9
|
-
@
|
10
|
-
|
11
|
-
'method'=> 'POST',
|
12
|
-
'path'=> '/'
|
13
|
-
},
|
14
|
-
'requests' =>[]
|
15
|
-
}
|
16
|
-
@requests = @request_data['requests']
|
6
|
+
def initialize(client)
|
7
|
+
@requests = []
|
8
|
+
super(client, 'POST', '/batch')
|
17
9
|
end
|
18
10
|
|
19
11
|
def add_request(request)
|
20
|
-
|
21
|
-
|
12
|
+
requests.push(request.to_hash)
|
13
|
+
self
|
22
14
|
end
|
23
15
|
|
24
|
-
def
|
25
|
-
|
26
|
-
|
16
|
+
def body
|
17
|
+
{
|
18
|
+
'defaults' => {
|
19
|
+
'method' => 'POST',
|
20
|
+
'path' => '/'
|
21
|
+
},
|
22
|
+
'requests' => requests
|
23
|
+
}
|
27
24
|
end
|
28
|
-
|
29
25
|
end
|
30
|
-
end
|
26
|
+
end
|
@@ -1,62 +1,40 @@
|
|
1
1
|
require 'kinto_box/kinto_collection'
|
2
|
-
require 'kinto_box/kinto_object'
|
3
2
|
require 'kinto_box/kinto_group'
|
4
3
|
module KintoBox
|
5
4
|
class KintoBucket < KintoObject
|
5
|
+
child_class KintoCollection
|
6
6
|
|
7
|
-
|
7
|
+
alias_method :collection, :child
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
alias_method :list_collections, :list_children
|
10
|
+
alias_method :delete_collections, :delete_children
|
11
|
+
alias_method :count_collections, :count_children
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
def list_collections(filters = nil, sort = nil)
|
19
|
-
@kinto_client.get(url_w_qsp(filters, sort))
|
20
|
-
end
|
21
|
-
|
22
|
-
def list_groups
|
23
|
-
@kinto_client.get("#{@url_path}/groups")
|
24
|
-
end
|
25
|
-
|
26
|
-
def collection (collection_id)
|
27
|
-
@collection = KintoCollection.new(self, collection_id)
|
28
|
-
end
|
13
|
+
alias_method :create_collection_request, :create_child_request
|
14
|
+
alias_method :list_collections_request, :list_children_request
|
15
|
+
alias_method :delete_collections_request, :delete_children_request
|
16
|
+
alias_method :count_collections_request, :count_children_request
|
29
17
|
|
30
18
|
def group(group_id)
|
31
|
-
|
19
|
+
KintoGroup.new(id: group_id, parent: self)
|
32
20
|
end
|
33
21
|
|
34
|
-
def
|
35
|
-
@
|
36
|
-
collection(collection_id)
|
22
|
+
def list_groups
|
23
|
+
@client.get("#{url_path}/groups")
|
37
24
|
end
|
38
25
|
|
39
26
|
def create_group(group_id, members)
|
40
27
|
members = [members] unless members.is_a?(Array)
|
41
|
-
@
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def delete_collections
|
46
|
-
@kinto_client.delete(url_w_qsp)
|
28
|
+
resp = @client.put("#{url_path}/groups/#{group_id}", 'data' => { 'members' => members })
|
29
|
+
KintoGroup.new(parent: self, info: resp)
|
47
30
|
end
|
48
31
|
|
49
32
|
def delete_groups
|
50
|
-
@
|
33
|
+
@client.delete("#{url_path}/groups")
|
51
34
|
end
|
52
35
|
|
53
|
-
def
|
54
|
-
|
36
|
+
def create_collection(id)
|
37
|
+
create_child(id: id)
|
55
38
|
end
|
56
|
-
|
57
|
-
alias_method :create_collection_request, :create_child_request
|
58
|
-
alias_method :list_collection_request, :list_children_request
|
59
|
-
alias_method :delete_collections_request, :delete_children_request
|
60
|
-
alias_method :count_collections_request, :count_children_request
|
61
39
|
end
|
62
|
-
end
|
40
|
+
end
|
@@ -1,52 +1,19 @@
|
|
1
1
|
require 'kinto_box/kinto_record'
|
2
|
-
require 'kinto_box/kinto_object'
|
3
|
-
require 'kinto_box/kinto_batch_request'
|
4
|
-
|
5
2
|
module KintoBox
|
6
3
|
class KintoCollection < KintoObject
|
4
|
+
child_class KintoRecord
|
7
5
|
|
6
|
+
alias_method :bucket, :parent
|
7
|
+
alias_method :record, :child
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@kinto_client = bucket.kinto_client
|
14
|
-
@bucket = bucket
|
15
|
-
@id = collection_id
|
16
|
-
@url_path = "/buckets/#{bucket.id}/collections/#{@id}"
|
17
|
-
@child_path = '/records'
|
18
|
-
end
|
19
|
-
|
20
|
-
def record (record_id)
|
21
|
-
KintoRecord.new(self, record_id)
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def list_records(filters = nil, sort = nil)
|
26
|
-
@kinto_client.get(url_w_qsp(filters, sort))
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
def create_record(data)
|
31
|
-
resp = @kinto_client.post("#{@url_path}#{@child_path}", { 'data' => data})
|
32
|
-
record_id = resp['data']['id']
|
33
|
-
record(record_id)
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
def delete_records(filters = nil)
|
38
|
-
@kinto_client.delete(url_w_qsp(filters))
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
def count_records(filters = nil)
|
43
|
-
@kinto_client.head(url_w_qsp(filters))['Total-Records'].to_i
|
44
|
-
end
|
45
|
-
|
9
|
+
alias_method :create_record, :create_child
|
10
|
+
alias_method :list_records, :list_children
|
11
|
+
alias_method :delete_records, :delete_children
|
12
|
+
alias_method :count_records, :count_children
|
46
13
|
|
47
14
|
alias_method :create_record_request, :create_child_request
|
48
15
|
alias_method :list_records_request, :list_children_request
|
49
16
|
alias_method :delete_records_request, :delete_children_request
|
50
17
|
alias_method :count_records_request, :count_children_request
|
51
18
|
end
|
52
|
-
end
|
19
|
+
end
|
@@ -1,34 +1,21 @@
|
|
1
1
|
require 'kinto_box/kinto_object'
|
2
|
-
|
3
2
|
module KintoBox
|
4
3
|
class KintoGroup < KintoObject
|
5
|
-
|
6
|
-
attr_accessor :id
|
7
|
-
attr_reader :bucket
|
8
|
-
|
9
|
-
def initialize (bucket, group_id)
|
10
|
-
raise ArgumentError if bucket.nil? || group_id.nil?
|
11
|
-
@kinto_client = bucket.kinto_client
|
12
|
-
@bucket = bucket
|
13
|
-
@id = group_id
|
14
|
-
@url_path = "/buckets/#{bucket.id}/groups/#{@id}"
|
15
|
-
end
|
16
|
-
|
17
4
|
def update_members(members)
|
18
5
|
members = [members] unless members.is_a?(Array)
|
19
|
-
update
|
6
|
+
update 'members' => members
|
20
7
|
end
|
21
8
|
|
22
9
|
def add_member(member)
|
23
10
|
members = info['data']['members']
|
24
11
|
members << member
|
25
|
-
update
|
12
|
+
update 'members' => members
|
26
13
|
end
|
27
14
|
|
28
15
|
def remove_member(member)
|
29
16
|
members = info['data']['members']
|
30
17
|
members.delete(member)
|
31
|
-
update
|
18
|
+
update 'members' => members
|
32
19
|
end
|
33
20
|
end
|
34
|
-
end
|
21
|
+
end
|
@@ -1,90 +1,231 @@
|
|
1
1
|
module KintoBox
|
2
2
|
class KintoObject
|
3
|
+
class << self
|
4
|
+
# Get the name of this class suitable for use in url path
|
5
|
+
def path_name
|
6
|
+
name.sub('KintoBox::Kinto', '').downcase + 's'
|
7
|
+
end
|
3
8
|
|
4
|
-
|
5
|
-
|
9
|
+
# Assign or retrieve the child class
|
10
|
+
def child_class(value = nil)
|
11
|
+
return @child_class if value.nil?
|
12
|
+
@child_class = value
|
13
|
+
end
|
14
|
+
end
|
6
15
|
|
7
|
-
|
8
|
-
|
16
|
+
attr_reader :id, :parent, :client
|
17
|
+
|
18
|
+
def initialize(client: nil, id: nil, parent: nil, info: nil)
|
19
|
+
@client = client || parent.client
|
20
|
+
@parent = parent
|
21
|
+
@id = id || (info ? info['data']['id'] : nil)
|
22
|
+
@info = info
|
23
|
+
self
|
9
24
|
end
|
10
25
|
|
11
|
-
|
12
|
-
|
26
|
+
# Get the path to this object in the Kinto API.
|
27
|
+
# This method uses the name of this class and whatever @parent.url_path is
|
28
|
+
# to create a partial url path.
|
29
|
+
# @return [String] URL fragment
|
30
|
+
def url_path
|
31
|
+
path = "/#{self.class.path_name}/#{id}"
|
32
|
+
path = parent.url_path + path unless parent.nil?
|
33
|
+
path.gsub(%r{/+}, '/')
|
13
34
|
end
|
14
35
|
|
15
|
-
|
16
|
-
|
36
|
+
# Get the path to this object in the Kinto API
|
37
|
+
# Use the name of url_path and whatever the child class has set for @parent.url_path is
|
38
|
+
# to create a partial url path.
|
39
|
+
# @return [String] URL fragment
|
40
|
+
def child_path
|
41
|
+
return unless child_class?
|
42
|
+
"#{url_path}/#{child_class.path_name}".gsub(%r{/+}, '/')
|
17
43
|
end
|
18
44
|
|
45
|
+
# Check to see if this Kinto object exists
|
46
|
+
# @return [Boolean]
|
19
47
|
def exists?
|
20
48
|
begin
|
21
|
-
info
|
49
|
+
return false if info && info['data'] && info['data']['deleted'] == true
|
22
50
|
rescue
|
23
51
|
return false
|
24
52
|
end
|
25
53
|
true
|
26
54
|
end
|
27
55
|
|
28
|
-
|
29
|
-
|
56
|
+
# Get the data related to this object
|
57
|
+
# @return [Hash] Object data
|
58
|
+
def info
|
59
|
+
@info ||= info_request.execute
|
30
60
|
end
|
31
61
|
|
32
|
-
|
33
|
-
|
62
|
+
# Delete the cached info for this object
|
63
|
+
def reload
|
64
|
+
@info = nil
|
34
65
|
end
|
35
66
|
|
36
|
-
|
37
|
-
|
67
|
+
# Delete this object
|
68
|
+
# @return [Hash] Response
|
69
|
+
def delete
|
70
|
+
@info = delete_request.execute
|
38
71
|
end
|
39
72
|
|
40
|
-
|
41
|
-
|
73
|
+
# Update this object
|
74
|
+
# @return [Hash] Response
|
75
|
+
def update(data)
|
76
|
+
@info = update_request(data).execute
|
42
77
|
end
|
43
78
|
|
44
|
-
|
45
|
-
|
79
|
+
# Replace all data in the object
|
80
|
+
# @return [Hash] Response
|
81
|
+
def replace(data)
|
82
|
+
@info = replace_request(data).execute
|
46
83
|
end
|
47
84
|
|
48
|
-
|
49
|
-
|
85
|
+
# Return an object for this child
|
86
|
+
# @param [String] Child object ID
|
87
|
+
# @return [KintoObject] Child for ID
|
88
|
+
def child(child_id)
|
89
|
+
child_class.new(id: child_id, parent: self)
|
50
90
|
end
|
51
91
|
|
52
|
-
|
53
|
-
|
92
|
+
# Create a child object
|
93
|
+
# @param [String] Child object ID
|
94
|
+
# @return [KintoObject] New child
|
95
|
+
def create_child(data)
|
96
|
+
resp = create_child_request(data).execute
|
97
|
+
child_class.new(info: resp, parent: self)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Get all children
|
101
|
+
# @param [String,Array] Filters
|
102
|
+
# @param [String] Sort by
|
103
|
+
# @return [Hash] All children
|
104
|
+
def list_children(filters = nil, sort = nil)
|
105
|
+
list_children_request(filters, sort).execute
|
106
|
+
end
|
107
|
+
|
108
|
+
# Get all children
|
109
|
+
# @param [String,Array] Filters
|
110
|
+
# @param [String] Sort by
|
111
|
+
# @return [Hash] All children
|
112
|
+
def delete_children(filters = nil)
|
113
|
+
delete_children_request(filters).execute
|
54
114
|
end
|
55
115
|
|
116
|
+
# Count all children
|
117
|
+
# @param [String,Array] Filters
|
118
|
+
# @return [Integer] Count
|
119
|
+
def count_children(filters = nil)
|
120
|
+
count_children_request(filters).execute['Total-Records'].to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
# Add a permission to this object
|
124
|
+
# @param [String] Principal aka user or group name
|
125
|
+
# @param [String] Permission name i.e. read, write, etc
|
126
|
+
# @return [KintoObject] The current instance; for chaining
|
56
127
|
def add_permission(principal, permission)
|
57
|
-
@
|
128
|
+
@info = client.patch(url_path, 'permissions' => { permission => [principal_name(principal)] })
|
58
129
|
self
|
59
130
|
end
|
60
131
|
|
132
|
+
# Replace all permissions for this object
|
133
|
+
# @param [String] Principal aka user or group name
|
134
|
+
# @param [String] Permission name i.e. read, write, etc
|
135
|
+
# @return [KintoObject] The current instance; for chaining
|
61
136
|
def replace_permission(principal, permission)
|
62
|
-
@
|
137
|
+
@info = client.put(url_path, 'permissions' => { permission => [principal_name(principal)] })
|
63
138
|
self
|
64
139
|
end
|
65
140
|
|
141
|
+
# Get the permissions for the current object
|
142
|
+
# @return [Hash] Hash of permissions and assigned principals.
|
66
143
|
def permissions
|
67
144
|
info['permissions']
|
68
145
|
end
|
69
146
|
|
147
|
+
# Get a kinto request object for making an info request
|
148
|
+
# @return [KintoRequest] Object representing this request
|
149
|
+
def info_request
|
150
|
+
client.create_request('GET', url_path)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Get a kinto request object for making an update request
|
154
|
+
# @param [Hash] Data
|
155
|
+
# @return [KintoRequest] Object representing this request
|
156
|
+
def update_request(data)
|
157
|
+
client.create_request('PATCH', url_path, 'data' => data)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Get a kinto request object for making a delete request
|
161
|
+
# @param [Hash] Data
|
162
|
+
# @return [KintoRequest] Object representing this request
|
163
|
+
def replace_request(data)
|
164
|
+
client.create_request('PUT', url_path, 'data' => data)
|
165
|
+
end
|
166
|
+
|
167
|
+
# Get a kinto request object for making a delete request
|
168
|
+
# @return [KintoRequest] Object representing this request
|
169
|
+
def delete_request
|
170
|
+
client.create_request('DELETE', url_path)
|
171
|
+
end
|
172
|
+
|
173
|
+
# Get a kinto request object for making a create child request
|
174
|
+
# @return [KintoRequest] Object representing this request
|
175
|
+
def create_child_request(data)
|
176
|
+
client.create_request('POST', url_w_qsp, 'data' => data)
|
177
|
+
end
|
178
|
+
|
179
|
+
# Get a kinto request object for making a list children request
|
180
|
+
# @return [KintoRequest] Object representing this request
|
181
|
+
def list_children_request(filters = nil, sort = nil)
|
182
|
+
client.create_request('GET', url_w_qsp(filters, sort))
|
183
|
+
end
|
184
|
+
|
185
|
+
# Get a kinto request object for making a delete children request
|
186
|
+
# @return [KintoRequest] Object representing this request
|
187
|
+
def delete_children_request(filters = nil)
|
188
|
+
client.create_request('DELETE', url_w_qsp(filters))
|
189
|
+
end
|
190
|
+
|
191
|
+
# Get a kinto request object for making a count children request
|
192
|
+
# @return [KintoRequest] Object representing this request
|
193
|
+
def count_children_request(filters = nil)
|
194
|
+
client.create_request('HEAD', url_w_qsp(filters))
|
195
|
+
end
|
70
196
|
|
71
197
|
private
|
72
198
|
|
199
|
+
# Get the class for this object's child
|
200
|
+
# @return [KintoObject] Child class
|
201
|
+
def child_class
|
202
|
+
self.class.child_class
|
203
|
+
end
|
204
|
+
|
205
|
+
# Does this class have a child class?
|
206
|
+
# @return [Boolean]
|
207
|
+
def child_class?
|
208
|
+
!(child_class.nil? || child_class.is_a?(KintoObject))
|
209
|
+
end
|
210
|
+
|
211
|
+
# Convert the principal name to something Kinto will like
|
212
|
+
# @return [String] Valid Kinto principal name
|
73
213
|
def principal_name(principal)
|
74
214
|
case principal.downcase
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
215
|
+
when 'authenticated'
|
216
|
+
'system.Authenticated'
|
217
|
+
when 'anonymous'
|
218
|
+
'system.Everyone'
|
219
|
+
when 'everyone'
|
220
|
+
'system.Everyone'
|
221
|
+
else
|
222
|
+
principal
|
83
223
|
end
|
84
224
|
end
|
85
225
|
|
226
|
+
# Build the path including querystring
|
86
227
|
def url_w_qsp(filters = nil, sort = nil, add_child = true)
|
87
|
-
url =
|
228
|
+
url = child_path.nil? || !add_child ? url_path : child_path
|
88
229
|
query_string = ''
|
89
230
|
query_string = filters unless filters.nil?
|
90
231
|
query_string = "#{query_string}&" unless filters.nil? || sort.nil?
|
@@ -92,4 +233,4 @@ module KintoBox
|
|
92
233
|
query_string == '' ? url : "#{url}?#{query_string}"
|
93
234
|
end
|
94
235
|
end
|
95
|
-
end
|
236
|
+
end
|
@@ -1,17 +1,5 @@
|
|
1
1
|
require 'kinto_box/kinto_object'
|
2
2
|
module KintoBox
|
3
3
|
class KintoRecord < KintoObject
|
4
|
-
attr_reader :id
|
5
|
-
def initialize (collection, record_id)
|
6
|
-
raise ArgumentError if collection.nil? || record_id.nil?
|
7
|
-
@kinto_client = collection.bucket.kinto_client
|
8
|
-
@id = record_id
|
9
|
-
@url_path = "/buckets/#{collection.bucket.id}/collections/#{collection.id}/records/#{@id}"
|
10
|
-
@child_path = nil
|
11
|
-
end
|
12
|
-
|
13
|
-
def replace(data)
|
14
|
-
@kinto_client.put(@url_path, {'data' => data})
|
15
|
-
end
|
16
4
|
end
|
17
|
-
end
|
5
|
+
end
|
@@ -1,18 +1,21 @@
|
|
1
1
|
module KintoBox
|
2
2
|
class KintoRequest
|
3
|
+
attr_reader :method, :path, :body, :headers
|
3
4
|
|
4
|
-
def initialize(method
|
5
|
+
def initialize(client, method, path, body = {}, headers: nil)
|
6
|
+
@client = client
|
5
7
|
@method = method
|
6
8
|
@path = path
|
7
9
|
@body = body
|
8
10
|
@headers = headers
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
{ 'method' =>
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def to_hash
|
14
|
+
{ 'method' => method, 'path' => path, 'body' => body }
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
@client.send_request(self)
|
16
19
|
end
|
17
20
|
end
|
18
|
-
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'kinto_box/kinto_bucket'
|
2
|
+
module KintoBox
|
3
|
+
class KintoServer < KintoObject
|
4
|
+
child_class KintoBox::KintoBucket
|
5
|
+
|
6
|
+
alias_method :bucket, :child
|
7
|
+
|
8
|
+
alias_method :list_buckets, :list_children
|
9
|
+
alias_method :delete_buckets, :delete_children
|
10
|
+
alias_method :count_buckets, :count_children
|
11
|
+
|
12
|
+
alias_method :create_bucket_request, :create_child_request
|
13
|
+
alias_method :list_bucket_request, :list_children_request
|
14
|
+
alias_method :delete_buckets_request, :delete_children_request
|
15
|
+
alias_method :count_buckets_request, :count_children_request
|
16
|
+
|
17
|
+
def url_path
|
18
|
+
'/'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Get current user id
|
22
|
+
# @return [String] current user id
|
23
|
+
def current_user_id
|
24
|
+
info['user']['id']
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_bucket(id)
|
28
|
+
create_child(id: id)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/kinto_box/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kinto_box
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kavya Sukumar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -86,6 +86,34 @@ dependencies:
|
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '5.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rdoc
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: rubocop
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
89
117
|
description: Kinto http client in ruby
|
90
118
|
email:
|
91
119
|
- Kavya.Sukumar@voxmedia.com
|
@@ -94,6 +122,7 @@ extensions: []
|
|
94
122
|
extra_rdoc_files: []
|
95
123
|
files:
|
96
124
|
- ".gitignore"
|
125
|
+
- ".rubocop.yml"
|
97
126
|
- ".travis.yml"
|
98
127
|
- Gemfile
|
99
128
|
- LICENSE.txt
|
@@ -103,6 +132,7 @@ files:
|
|
103
132
|
- bin/setup
|
104
133
|
- kinto_box.gemspec
|
105
134
|
- lib/kinto_box.rb
|
135
|
+
- lib/kinto_box/errors.rb
|
106
136
|
- lib/kinto_box/kinto_batch_request.rb
|
107
137
|
- lib/kinto_box/kinto_bucket.rb
|
108
138
|
- lib/kinto_box/kinto_collection.rb
|
@@ -110,7 +140,7 @@ files:
|
|
110
140
|
- lib/kinto_box/kinto_object.rb
|
111
141
|
- lib/kinto_box/kinto_record.rb
|
112
142
|
- lib/kinto_box/kinto_request.rb
|
113
|
-
- lib/kinto_box/
|
143
|
+
- lib/kinto_box/kinto_server.rb
|
114
144
|
- lib/kinto_box/version.rb
|
115
145
|
homepage: http://github.com/voxmedia/kinto_box
|
116
146
|
licenses:
|
@@ -133,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
163
|
version: '0'
|
134
164
|
requirements: []
|
135
165
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.4.5
|
166
|
+
rubygems_version: 2.4.5.1
|
137
167
|
signing_key:
|
138
168
|
specification_version: 4
|
139
169
|
summary: Kinto http client in ruby
|