ruby-box 1.11.1 → 1.12.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +6 -0
- data/README.markdown +144 -18
- data/VERSION +1 -1
- data/lib/ruby-box/client.rb +33 -7
- data/lib/ruby-box/file.rb +7 -15
- data/lib/ruby-box/folder.rb +1 -5
- data/lib/ruby-box/item.rb +16 -0
- data/lib/ruby-box/session.rb +13 -2
- data/ruby-box.gemspec +8 -5
- data/spec/fixtures/users.json +39 -0
- data/spec/integration_spec.rb +24 -2
- data/spec/users_spec.rb +24 -0
- metadata +26 -5
- checksums.yaml +0 -15
data/.travis.yml
ADDED
data/README.markdown
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
ruby-box
|
2
2
|
========
|
3
3
|
|
4
|
-
|
4
|
+
Build Status: [![Build Status](https://travis-ci.org/attachmentsme/ruby-box.png)](https://travis-ci.org/attachmentsme/ruby-box)
|
5
|
+
|
6
|
+
Mainted by: [Attachments.me](http://attachments.me)
|
5
7
|
|
6
8
|
RubyBox provides a simple, chainable, feature-rich client for [Box's 2.0 API](http://developers.box.com/docs/).
|
7
9
|
|
@@ -38,7 +40,9 @@ session = RubyBox::Session.new({
|
|
38
40
|
access_token: 'original-access-token'
|
39
41
|
})
|
40
42
|
|
43
|
+
# you need to persist this somehow. the refresh token will change every time you use it
|
41
44
|
@token = session.refresh_token('your-refresh-token')
|
45
|
+
save_me_somehow(@token.refresh_token)
|
42
46
|
```
|
43
47
|
|
44
48
|
__3)__ Create a client using a session initialized with the _access\_token_.
|
@@ -58,7 +62,57 @@ client = RubyBox::Client.new(session)
|
|
58
62
|
Usage
|
59
63
|
=====
|
60
64
|
|
61
|
-
Once you've created a client, you can start interacting with the Box API. What follows are some basic examples of RubyBox's usage
|
65
|
+
Once you've created a client, you can start interacting with the Box API. What follows are some basic examples of RubyBox's usage.
|
66
|
+
|
67
|
+
Warning
|
68
|
+
=======
|
69
|
+
|
70
|
+
Please note that using a file/folder path is extremely inefficient, as it causes the gem to traverse the directory structure recursively querying each folder in turn. Prefer the `_by_id` methods where possible for single-request access.
|
71
|
+
|
72
|
+
Items
|
73
|
+
-----
|
74
|
+
|
75
|
+
`File`s and `Folder`s are subclasses of `Item`. `Folder` contents (i.e. files and folders inside that folder) are retrieved in a `mini-format` when the `Folder` instance is loaded.
|
76
|
+
|
77
|
+
There are two caveats to this:
|
78
|
+
|
79
|
+
### Only some fields are available
|
80
|
+
|
81
|
+
a `File` mini looks like this:
|
82
|
+
|
83
|
+
```
|
84
|
+
{
|
85
|
+
"type": "file",
|
86
|
+
"id": "5000948880",
|
87
|
+
"sequence_id": "3",
|
88
|
+
"etag": "3",
|
89
|
+
"sha1": "134b65991ed521fcfe4724b7d814ab8ded5185dc",
|
90
|
+
"name": "tigers.jpeg"
|
91
|
+
}
|
92
|
+
```
|
93
|
+
a `Folder` mini looks like this:
|
94
|
+
|
95
|
+
```
|
96
|
+
{
|
97
|
+
"type":"folder",
|
98
|
+
"id":"301415432",
|
99
|
+
"sequence_id":"0",
|
100
|
+
"name":"my first sub-folder"
|
101
|
+
}
|
102
|
+
```
|
103
|
+
|
104
|
+
Requests to fields other than the above (e.g. `file.size`) will cause a one-off hit to the api, so take care when iterating over folder contents lest a single application method result in hundreds of api hits and take forever to complete.
|
105
|
+
|
106
|
+
This can be mitigated by passing a list of extra fields you want to fetch into the `.items` method:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
folder = client.folder_by_id(@folder_id)
|
110
|
+
# retrieve size, created_at, and description for all items in this directory
|
111
|
+
detailed_items = folder.items(@item_limit, @offset, ['size', 'created_at', 'description'])
|
112
|
+
```
|
113
|
+
|
114
|
+
Note: only the `type` and `id` fields are included in addition to whatever you specify using the above method, so you must be explicit.
|
115
|
+
|
62
116
|
|
63
117
|
Folders
|
64
118
|
-------
|
@@ -66,7 +120,8 @@ Folders
|
|
66
120
|
* Listing items in a folder:
|
67
121
|
|
68
122
|
```ruby
|
69
|
-
files = client.folder('/image_folder').files # all files in a folder.
|
123
|
+
files = client.folder('/image_folder').files # all files in a folder using a path.
|
124
|
+
files = client.folder(@folder_id).files # all files in a folder using an id.
|
70
125
|
folders = client.root_folder.folders # all folders in the root directory.
|
71
126
|
files_and_folders = client.folder('files').items # all files and folders in /files
|
72
127
|
```
|
@@ -74,13 +129,14 @@ files_and_folders = client.folder('files').items # all files and folders in /fil
|
|
74
129
|
* Creating a folder:
|
75
130
|
|
76
131
|
```ruby
|
77
|
-
client.
|
132
|
+
client.folder_by_id(@folder_id).create_subfolder('subfolder') # using an id.
|
133
|
+
client.folder('image_folder').create_subfolder('subfolder') # using a path.
|
78
134
|
```
|
79
135
|
|
80
136
|
* Setting the description on a folder:
|
81
137
|
|
82
138
|
```ruby
|
83
|
-
folder = client.folder('image_folder')
|
139
|
+
folder = client.folder('image_folder') # using a path.
|
84
140
|
folder.description = 'Description on Folder'
|
85
141
|
folder.update
|
86
142
|
```
|
@@ -88,7 +144,7 @@ folder.update
|
|
88
144
|
* Listing the comments in a discussion surrounding a folder.
|
89
145
|
|
90
146
|
```ruby
|
91
|
-
folder = client.folder('image_folder')
|
147
|
+
folder = client.folder('image_folder') # lookups by id are more efficient
|
92
148
|
discussion = folder.discussions.first
|
93
149
|
discussion.comments.each {|comment| p comment.message}
|
94
150
|
```
|
@@ -96,7 +152,7 @@ discussion.comments.each {|comment| p comment.message}
|
|
96
152
|
* Creating a shared link for a folder.
|
97
153
|
|
98
154
|
```ruby
|
99
|
-
folder = client.folder('image_folder').create_shared_link
|
155
|
+
folder = client.folder('image_folder').create_shared_link # lookups by id are more efficient
|
100
156
|
p folder.shared_link['url'] # https://www.box.com/s/d6de3224958c1755412
|
101
157
|
```
|
102
158
|
|
@@ -106,7 +162,8 @@ Files
|
|
106
162
|
* Fetching a file's meta information.
|
107
163
|
|
108
164
|
```ruby
|
109
|
-
file = client.file('/image_folder/an-image.jpg')
|
165
|
+
file = client.file('/image_folder/an-image.jpg')# lookups by id are more efficient
|
166
|
+
file = client.file(@file_id)
|
110
167
|
p file.name
|
111
168
|
p file.created_at
|
112
169
|
```
|
@@ -114,7 +171,8 @@ p file.created_at
|
|
114
171
|
* Uploading a file to a folder.
|
115
172
|
|
116
173
|
```ruby
|
117
|
-
file = client.upload_file('./LICENSE.txt', '/license_folder')
|
174
|
+
file = client.upload_file('./LICENSE.txt', '/license_folder') # lookups by id are more efficient
|
175
|
+
file = client.upload_file_by_folder_id('./LICENSE.txt', @folder_id)
|
118
176
|
```
|
119
177
|
|
120
178
|
* Downloading a file.
|
@@ -123,18 +181,32 @@ file = client.upload_file('./LICENSE.txt', '/license_folder')
|
|
123
181
|
f = open('./LOCAL.txt', 'w+')
|
124
182
|
f.write( client.file('/license_folder/LICENSE.txt').download )
|
125
183
|
f.close()
|
184
|
+
|
185
|
+
# Or you can fetch by file.id, which is more efficient:
|
186
|
+
f = open('./LOCAL.txt', 'w+')
|
187
|
+
f.write( client.file_by_id(@file_id).download ) # lookups by id are more efficient
|
188
|
+
f.close()
|
189
|
+
|
190
|
+
# You can also grab the raw url with
|
191
|
+
client.file_by_id(@file_id).download_url
|
192
|
+
|
193
|
+
# Note that this URL is not persistent. Clients will need to follow the url immediately in order to
|
194
|
+
# actually download the file
|
126
195
|
```
|
127
196
|
|
128
197
|
* Deleting a file.
|
129
198
|
|
130
199
|
```ruby
|
200
|
+
client.file_by_id(@file_id).delete # this
|
131
201
|
client.file('/license_folder/LICENSE.txt').delete
|
132
202
|
```
|
133
203
|
|
134
204
|
* Displaying comments on a file.
|
135
205
|
|
136
206
|
```ruby
|
137
|
-
comments = client.file('/image_folder/an-image.jpg').comments
|
207
|
+
comments = client.file('/image_folder/an-image.jpg').comments # lookups by id are more efficient
|
208
|
+
comments = client.file_by_id(@file_id).comments
|
209
|
+
|
138
210
|
comments.each do |comment|
|
139
211
|
p comment.message
|
140
212
|
end
|
@@ -144,29 +216,46 @@ end
|
|
144
216
|
|
145
217
|
```ruby
|
146
218
|
file = client.file('/image_folder/an-image.jpg').create_shared_link
|
219
|
+
file = client.file_by_id(@file_id).create_shared_link # using an id
|
147
220
|
p file.shared_link.url # https://www.box.com/s/d6de3224958c1755412
|
148
221
|
```
|
149
222
|
|
150
223
|
* Copying a file to another folder.
|
151
224
|
|
152
225
|
```ruby
|
153
|
-
|
226
|
+
|
227
|
+
file = client.file('/one_folder/cow_folder/an-image.jpg')
|
154
228
|
folder = client.folder('image_folder')
|
229
|
+
|
230
|
+
# lookups by id are more efficient
|
231
|
+
|
232
|
+
file = client.file_by_id(@file_id)
|
233
|
+
folder = client.folder_by_id(@folder_id)
|
234
|
+
|
155
235
|
file.copy_to(folder)
|
156
236
|
```
|
157
237
|
|
158
238
|
* Moving a file to another folder.
|
159
239
|
|
160
240
|
```ruby
|
161
|
-
|
241
|
+
|
242
|
+
file = client.file('/one_folder/cow_folder/an-image.jpg')
|
162
243
|
folder = client.folder('image_folder')
|
244
|
+
|
245
|
+
# lookups by id are more efficient
|
246
|
+
|
247
|
+
file = client.file_by_id(@file_id)
|
248
|
+
folder = client.folder_by_id(@folder_id)
|
249
|
+
|
250
|
+
|
163
251
|
file.move_to(folder)
|
164
252
|
```
|
165
253
|
|
166
254
|
* Adding a comment to a file.
|
167
255
|
|
168
256
|
```ruby
|
169
|
-
file = client.file('/image_folder/an-image.jpg')
|
257
|
+
file = client.file('/image_folder/an-image.jpg') # path
|
258
|
+
file = client.file_by_id(@file_id) # id
|
170
259
|
comment = file.create_comment('Hello World!')
|
171
260
|
```
|
172
261
|
|
@@ -196,13 +285,50 @@ eresp.events.each do |ev|
|
|
196
285
|
end
|
197
286
|
```
|
198
287
|
|
288
|
+
As-User
|
289
|
+
-------
|
290
|
+
|
291
|
+
* This must be manually enabled for your account by Box Staff. Contact api@box.com for access. [ More Info ] (http://developers.box.com/docs/#users-as-user)
|
292
|
+
|
293
|
+
```ruby
|
294
|
+
session = RubyBox::Session.new({
|
295
|
+
client_id: 'your-client-id',
|
296
|
+
client_secret: 'your-client-secret',
|
297
|
+
access_token: 'original-access-token' ,
|
298
|
+
as_user: 'your-users-box-id'
|
299
|
+
})
|
300
|
+
```
|
301
|
+
Users
|
302
|
+
------
|
303
|
+
|
304
|
+
Current User Info
|
305
|
+
|
306
|
+
```ruby
|
307
|
+
me = client.me
|
308
|
+
```
|
309
|
+
|
310
|
+
Current User's enterprise
|
311
|
+
|
312
|
+
```ruby
|
313
|
+
me = client.me.enterprise
|
314
|
+
```
|
315
|
+
|
316
|
+
An array of Ruby:Box users in an enterprise (Supports Filtering, Limit and Offset)
|
317
|
+
|
318
|
+
```ruby
|
319
|
+
users = client.users
|
320
|
+
```
|
321
|
+
|
322
|
+
* Remeber the API filters "name" and "login" by the start of the string. ie: to get "sean+awesome@gmail.com" an approriate filter term would be "sean"
|
323
|
+
|
324
|
+
```ruby
|
325
|
+
users = client.users("sean" , 10 , 1)
|
326
|
+
```
|
327
|
+
|
199
328
|
Contributors
|
200
329
|
============
|
201
330
|
|
202
|
-
*
|
203
|
-
* Larry Kang
|
204
|
-
* Dan Reed
|
205
|
-
* Jesse Miller
|
331
|
+
* [full list of contributors](https://github.com/attachmentsme/ruby-box/graphs/contributors)
|
206
332
|
|
207
333
|
Contributing to ruby-box
|
208
334
|
========================
|
@@ -220,4 +346,4 @@ Copyright
|
|
220
346
|
=========
|
221
347
|
|
222
348
|
Copyright (c) 2012 Attachments.me. See LICENSE.txt for
|
223
|
-
further details.
|
349
|
+
further details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.12.1
|
data/lib/ruby-box/client.rb
CHANGED
@@ -12,7 +12,11 @@ module RubyBox
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def root_folder
|
15
|
-
|
15
|
+
folder_by_id('0')
|
16
|
+
end
|
17
|
+
|
18
|
+
def folder_by_id(id)
|
19
|
+
folder = Folder.new(@session, {'id' => id})
|
16
20
|
folder.reload_meta
|
17
21
|
end
|
18
22
|
|
@@ -22,6 +26,11 @@ module RubyBox
|
|
22
26
|
folder_from_split_path( split_path(path) )
|
23
27
|
end
|
24
28
|
|
29
|
+
def file_by_id(id)
|
30
|
+
file = File.new(@session, {'id' => id})
|
31
|
+
file.reload_meta
|
32
|
+
end
|
33
|
+
|
25
34
|
def file(path)
|
26
35
|
path = split_path( path.sub(/^\.\//, '') )
|
27
36
|
file_name = path.pop
|
@@ -88,12 +97,13 @@ module RubyBox
|
|
88
97
|
end
|
89
98
|
|
90
99
|
def upload_file(local_path, remote_path, overwrite=true)
|
91
|
-
file_name = local_path.split('/').pop
|
92
100
|
folder = create_folder( remote_path )
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
101
|
+
upload_file_to_folder(local_path, folder, overwrite)
|
102
|
+
end
|
103
|
+
|
104
|
+
def upload_file_by_folder_id(local_path, folder_id, overwrite=true)
|
105
|
+
folder = folder_by_id(folder_id)
|
106
|
+
upload_file_to_folder(local_path, folder, overwrite)
|
97
107
|
end
|
98
108
|
|
99
109
|
def split_path(path)
|
@@ -113,8 +123,24 @@ module RubyBox
|
|
113
123
|
User.new(@session, resp)
|
114
124
|
end
|
115
125
|
|
126
|
+
def users(filter_term = "", limit = 100, offset = 0)
|
127
|
+
url = "#{RubyBox::API_URL}/users?filter_term=#{URI::encode(filter_term)}&limit=#{limit}&offset=#{offset}"
|
128
|
+
resp = @session.get( url )
|
129
|
+
resp['entries'].map do |entry|
|
130
|
+
RubyBox::Item.factory(@session, entry)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
116
134
|
private
|
117
135
|
|
136
|
+
def upload_file_to_folder(local_path, folder, overwrite)
|
137
|
+
file_name = local_path.split('/').pop
|
138
|
+
return unless folder
|
139
|
+
::File.open(local_path, 'rb') do |data|
|
140
|
+
folder.upload_file(file_name, data, overwrite)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
118
144
|
def folder_from_split_path(path)
|
119
145
|
folder = root_folder
|
120
146
|
path.each do |folder_name|
|
@@ -128,7 +154,7 @@ module RubyBox
|
|
128
154
|
unless stream_position.to_s == 'now'
|
129
155
|
stream_position = stream_position.kind_of?(Numeric) ? stream_position : 0
|
130
156
|
end
|
131
|
-
stream_type = [:all, :changes, :sync].include?(stream_type) ? stream_type : :all
|
157
|
+
stream_type = [:all, :changes, :sync, :admin_logs].include?(stream_type) ? stream_type : :all
|
132
158
|
limit = limit.kind_of?(Fixnum) ? limit : 100
|
133
159
|
"stream_position=#{stream_position}&stream_type=#{stream_type}&limit=#{limit}"
|
134
160
|
end
|
data/lib/ruby-box/file.rb
CHANGED
@@ -7,15 +7,8 @@ module RubyBox
|
|
7
7
|
resp = stream.read
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
12
|
-
# to be passed in.
|
13
|
-
folder_id = folder_id.id if folder_id.instance_of?(RubyBox::Folder)
|
14
|
-
|
15
|
-
self.name = name if name
|
16
|
-
self.parent = {"id" => folder_id}
|
17
|
-
|
18
|
-
update
|
10
|
+
def download_url
|
11
|
+
@session.get( file_content_url )["location"]
|
19
12
|
end
|
20
13
|
|
21
14
|
def copy_to( folder_id, name=nil )
|
@@ -35,8 +28,7 @@ module RubyBox
|
|
35
28
|
end
|
36
29
|
|
37
30
|
def stream( opts={} )
|
38
|
-
|
39
|
-
@session.do_stream( url, opts )
|
31
|
+
open(download_url, opts)
|
40
32
|
end
|
41
33
|
|
42
34
|
def upload_content( data )
|
@@ -83,6 +75,10 @@ module RubyBox
|
|
83
75
|
end
|
84
76
|
|
85
77
|
private
|
78
|
+
def file_content_url
|
79
|
+
"#{RubyBox::API_URL}/#{resource_name}/#{id}/content"
|
80
|
+
end
|
81
|
+
|
86
82
|
|
87
83
|
def resource_name
|
88
84
|
'files'
|
@@ -92,10 +88,6 @@ module RubyBox
|
|
92
88
|
true
|
93
89
|
end
|
94
90
|
|
95
|
-
def update_fields
|
96
|
-
['name', 'description', 'parent']
|
97
|
-
end
|
98
|
-
|
99
91
|
def prepare_upload(data, fname)
|
100
92
|
UploadIO.new(data, "application/pdf", fname)
|
101
93
|
end
|
data/lib/ruby-box/folder.rb
CHANGED
@@ -77,10 +77,6 @@ module RubyBox
|
|
77
77
|
true
|
78
78
|
end
|
79
79
|
|
80
|
-
def update_fields
|
81
|
-
['name', 'description']
|
82
|
-
end
|
83
|
-
|
84
80
|
def items_by_type(type, name, item_limit, offset, fields)
|
85
81
|
|
86
82
|
# allow paramters to be set via
|
@@ -95,4 +91,4 @@ module RubyBox
|
|
95
91
|
|
96
92
|
end
|
97
93
|
end
|
98
|
-
end
|
94
|
+
end
|
data/lib/ruby-box/item.rb
CHANGED
@@ -20,6 +20,17 @@ module RubyBox
|
|
20
20
|
keys.each {|key| @@has_many_paginated << key.to_s}
|
21
21
|
end
|
22
22
|
|
23
|
+
def move_to( folder_id, name=nil )
|
24
|
+
# Allow either a folder_id or a folder object
|
25
|
+
# to be passed in.
|
26
|
+
folder_id = folder_id.id if folder_id.instance_of?(RubyBox::Folder)
|
27
|
+
|
28
|
+
self.name = name if name
|
29
|
+
self.parent = {"id" => folder_id}
|
30
|
+
|
31
|
+
update
|
32
|
+
end
|
33
|
+
|
23
34
|
def update
|
24
35
|
reload_meta unless etag
|
25
36
|
|
@@ -161,5 +172,10 @@ module RubyBox
|
|
161
172
|
update_fields.inject({}) {|hash, field| hash[field] = @raw_item[field]; hash}
|
162
173
|
end
|
163
174
|
|
175
|
+
def update_fields
|
176
|
+
['name', 'description', 'parent']
|
177
|
+
end
|
178
|
+
|
179
|
+
|
164
180
|
end
|
165
181
|
end
|
data/lib/ruby-box/session.rb
CHANGED
@@ -17,6 +17,7 @@ module RubyBox
|
|
17
17
|
@oauth2_client = OAuth2::Client.new(opts[:client_id], opts[:client_secret], OAUTH2_URLS.dup)
|
18
18
|
@access_token = OAuth2::AccessToken.new(@oauth2_client, opts[:access_token]) if opts[:access_token]
|
19
19
|
@refresh_token = opts[:refresh_token]
|
20
|
+
@as_user = opts[:as_user]
|
20
21
|
else # Support legacy API for historical reasons.
|
21
22
|
@api_key = opts[:api_key]
|
22
23
|
@auth_token = opts[:auth_token]
|
@@ -66,6 +67,9 @@ module RubyBox
|
|
66
67
|
request.add_field('Authorization', build_auth_header)
|
67
68
|
end
|
68
69
|
|
70
|
+
|
71
|
+
request.add_field('As-User', "#{@as_user}") if @as_user
|
72
|
+
|
69
73
|
response = http.request(request)
|
70
74
|
|
71
75
|
if response.is_a? Net::HTTPNotFound
|
@@ -80,7 +84,7 @@ module RubyBox
|
|
80
84
|
|
81
85
|
sleep(@backoff) # try not to excessively hammer API.
|
82
86
|
|
83
|
-
handle_errors( response
|
87
|
+
handle_errors( response, raw )
|
84
88
|
end
|
85
89
|
|
86
90
|
def do_stream(url, opts)
|
@@ -94,11 +98,15 @@ module RubyBox
|
|
94
98
|
else
|
95
99
|
params['Authorization'] = build_auth_header
|
96
100
|
end
|
101
|
+
|
102
|
+
params['As-User'] = @as_user if @as_user
|
97
103
|
|
98
104
|
open(url, params)
|
99
105
|
end
|
100
106
|
|
101
|
-
def handle_errors(
|
107
|
+
def handle_errors( response, raw )
|
108
|
+
status = response.code.to_i
|
109
|
+
body = response.body
|
102
110
|
begin
|
103
111
|
parsed_body = JSON.parse(body)
|
104
112
|
rescue
|
@@ -111,6 +119,9 @@ module RubyBox
|
|
111
119
|
parsed_body["status"] = status
|
112
120
|
|
113
121
|
case status / 100
|
122
|
+
when 3
|
123
|
+
# 302 Found. We should return the url
|
124
|
+
parsed_body["location"] = response["Location"] if status == 302
|
114
125
|
when 4
|
115
126
|
raise(RubyBox::ItemNameInUse.new(parsed_body, status, body), parsed_body["message"]) if parsed_body["code"] == "item_name_in_use"
|
116
127
|
raise(RubyBox::AuthError.new(parsed_body, status, body), parsed_body["message"]) if parsed_body["code"] == "unauthorized" || status == 401
|
data/ruby-box.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "ruby-box"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.12.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Attachments.me"]
|
12
|
-
s.date = "2013-
|
12
|
+
s.date = "2013-12-02"
|
13
13
|
s.description = "ruby gem for box.com 2.0 api"
|
14
14
|
s.email = "ben@attachments.me"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
+
".travis.yml",
|
21
22
|
"Gemfile",
|
22
23
|
"Gemfile.lock",
|
23
24
|
"LICENSE.txt",
|
@@ -46,22 +47,24 @@ Gem::Specification.new do |s|
|
|
46
47
|
"spec/fixtures/comment_create.json",
|
47
48
|
"spec/fixtures/events.json",
|
48
49
|
"spec/fixtures/me.json",
|
50
|
+
"spec/fixtures/users.json",
|
49
51
|
"spec/folder_spec.rb",
|
50
52
|
"spec/helper/account.example",
|
51
53
|
"spec/helper/account.rb",
|
52
54
|
"spec/integration_spec.rb",
|
53
55
|
"spec/item_spec.rb",
|
54
56
|
"spec/me_spec.rb",
|
55
|
-
"spec/spec_helper.rb"
|
57
|
+
"spec/spec_helper.rb",
|
58
|
+
"spec/users_spec.rb"
|
56
59
|
]
|
57
60
|
s.homepage = "http://github.com/attachmentsme/ruby-box"
|
58
61
|
s.licenses = ["MIT"]
|
59
62
|
s.require_paths = ["lib"]
|
60
|
-
s.rubygems_version = "
|
63
|
+
s.rubygems_version = "1.8.24"
|
61
64
|
s.summary = "ruby gem for box.com 2.0 api"
|
62
65
|
|
63
66
|
if s.respond_to? :specification_version then
|
64
|
-
s.specification_version =
|
67
|
+
s.specification_version = 3
|
65
68
|
|
66
69
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
67
70
|
s.add_runtime_dependency(%q<multipart-post>, [">= 0"])
|
@@ -0,0 +1,39 @@
|
|
1
|
+
{
|
2
|
+
"total_count": 2,
|
3
|
+
"entries": [
|
4
|
+
{
|
5
|
+
"type": "user",
|
6
|
+
"id": "181216415",
|
7
|
+
"name": "sean rose",
|
8
|
+
"login": "sean+awesome@box.com",
|
9
|
+
"created_at": "2012-05-03T21:39:11-07:00",
|
10
|
+
"modified_at": "2012-08-23T14:57:48-07:00",
|
11
|
+
"language": "en",
|
12
|
+
"space_amount": 5368709120,
|
13
|
+
"space_used": 52947,
|
14
|
+
"max_upload_size": 104857600,
|
15
|
+
"status": "active",
|
16
|
+
"job_title": "",
|
17
|
+
"phone": "5555551374",
|
18
|
+
"address": "10 Cloud Way Los Altos CA",
|
19
|
+
"avatar_url": "https://api.box.com/api/avatar/large/181216415"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"type": "user",
|
23
|
+
"id": "181216416",
|
24
|
+
"name": "sean rose",
|
25
|
+
"login": "sean+awesomer@box.com",
|
26
|
+
"created_at": "2012-05-03T21:39:11-07:00",
|
27
|
+
"modified_at": "2012-08-23T14:57:48-07:00",
|
28
|
+
"language": "en",
|
29
|
+
"space_amount": 5368709120,
|
30
|
+
"space_used": 52947,
|
31
|
+
"max_upload_size": 104857600,
|
32
|
+
"status": "active",
|
33
|
+
"job_title": "",
|
34
|
+
"phone": "5555551374",
|
35
|
+
"address": "10 Cloud Way Los Altos CA",
|
36
|
+
"avatar_url": "https://api.box.com/api/avatar/large/181216416"
|
37
|
+
}
|
38
|
+
]
|
39
|
+
}
|
data/spec/integration_spec.rb
CHANGED
@@ -146,7 +146,7 @@ describe RubyBox, :skip => true do
|
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
|
-
|
149
|
+
context 'uploading files' do
|
150
150
|
it "should update an existing file" do
|
151
151
|
utf8_file_name = '遠志教授.jpg'
|
152
152
|
fdata = File.open( 'spec/fixtures/' + utf8_file_name, 'rb' )
|
@@ -173,6 +173,14 @@ describe RubyBox, :skip => true do
|
|
173
173
|
file.name.should == '遠志教授.jpg'
|
174
174
|
file.delete
|
175
175
|
end
|
176
|
+
|
177
|
+
it "should allow a file to be uploaded by a folder id" do
|
178
|
+
utf8_file_name = '遠志教授.jpg'
|
179
|
+
folder = @client.folder('/ruby-box_gem_testing/cool stuff/')
|
180
|
+
file = @client.upload_file_by_folder_id('spec/fixtures/' + utf8_file_name, folder.id)
|
181
|
+
file.name.should == '遠志教授.jpg'
|
182
|
+
file.delete
|
183
|
+
end
|
176
184
|
end
|
177
185
|
|
178
186
|
describe '#create_folder' do
|
@@ -183,6 +191,14 @@ describe RubyBox, :skip => true do
|
|
183
191
|
end
|
184
192
|
end
|
185
193
|
|
194
|
+
describe '#folder_by_id' do
|
195
|
+
it "allows a folder to be retrieved by its id" do
|
196
|
+
folder = @client.folder('/ruby-box_gem_testing')
|
197
|
+
folder_by_id = @client.folder_by_id(folder.id)
|
198
|
+
folder_by_id.name.should == folder.name
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
186
202
|
describe '#delete folder' do
|
187
203
|
it "should be able to recursively delete the contents of a folder" do
|
188
204
|
folder = @client.create_folder('/ruby-box_gem_testing/delete_test')
|
@@ -191,11 +207,17 @@ describe RubyBox, :skip => true do
|
|
191
207
|
end
|
192
208
|
end
|
193
209
|
|
194
|
-
|
210
|
+
context 'retrieving a file' do
|
195
211
|
it "returns meta information for a file" do
|
196
212
|
file = @client.file( '/ruby-box_gem_testing/cool stuff/кузнецкий_105_а_№2.test' )
|
197
213
|
file.size.should == 14
|
198
214
|
end
|
215
|
+
|
216
|
+
it "a file can be retrieved by its id" do
|
217
|
+
file = @client.file( '/ruby-box_gem_testing/cool stuff/кузнецкий_105_а_№2.test' )
|
218
|
+
file_by_id = @client.file_by_id( file.id )
|
219
|
+
file_by_id.size.should == 14
|
220
|
+
end
|
199
221
|
end
|
200
222
|
|
201
223
|
describe '#stream' do
|
data/spec/users_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
|
3
|
+
require 'ruby-box'
|
4
|
+
require 'webmock/rspec'
|
5
|
+
|
6
|
+
describe '/users' do
|
7
|
+
before do
|
8
|
+
@session = RubyBox::Session.new
|
9
|
+
@client = RubyBox::Client.new(@session)
|
10
|
+
@users_json = File.read 'spec/fixtures/users.json'
|
11
|
+
@users = JSON.load(@users_json)
|
12
|
+
stub_request(:get, /#{RubyBox::API_URL}\/users/).to_return(body: @users_json, :status => 200)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return a list of all users in the enterprise' do
|
16
|
+
users = @client.users
|
17
|
+
users.instance_of?(Array).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should return a list of all users in the enterprise as a user object' do
|
21
|
+
users = @client.users
|
22
|
+
users.first.instance_of?(RubyBox::User).should be_true
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-box
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Attachments.me
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-12-02 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: multipart-post
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: oauth2
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: json
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: addressable
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,6 +78,7 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: rspec
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
83
|
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
@@ -76,6 +86,7 @@ dependencies:
|
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
91
|
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
@@ -83,6 +94,7 @@ dependencies:
|
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: bundler
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
99
|
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
@@ -90,6 +102,7 @@ dependencies:
|
|
90
102
|
type: :development
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
107
|
- - ! '>='
|
95
108
|
- !ruby/object:Gem::Version
|
@@ -97,6 +110,7 @@ dependencies:
|
|
97
110
|
- !ruby/object:Gem::Dependency
|
98
111
|
name: jeweler
|
99
112
|
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
100
114
|
requirements:
|
101
115
|
- - ~>
|
102
116
|
- !ruby/object:Gem::Version
|
@@ -104,6 +118,7 @@ dependencies:
|
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
107
122
|
requirements:
|
108
123
|
- - ~>
|
109
124
|
- !ruby/object:Gem::Version
|
@@ -111,6 +126,7 @@ dependencies:
|
|
111
126
|
- !ruby/object:Gem::Dependency
|
112
127
|
name: webmock
|
113
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
114
130
|
requirements:
|
115
131
|
- - ! '>='
|
116
132
|
- !ruby/object:Gem::Version
|
@@ -118,6 +134,7 @@ dependencies:
|
|
118
134
|
type: :development
|
119
135
|
prerelease: false
|
120
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
121
138
|
requirements:
|
122
139
|
- - ! '>='
|
123
140
|
- !ruby/object:Gem::Version
|
@@ -131,6 +148,7 @@ extra_rdoc_files:
|
|
131
148
|
- README.markdown
|
132
149
|
files:
|
133
150
|
- .document
|
151
|
+
- .travis.yml
|
134
152
|
- Gemfile
|
135
153
|
- Gemfile.lock
|
136
154
|
- LICENSE.txt
|
@@ -159,6 +177,7 @@ files:
|
|
159
177
|
- spec/fixtures/comment_create.json
|
160
178
|
- spec/fixtures/events.json
|
161
179
|
- spec/fixtures/me.json
|
180
|
+
- spec/fixtures/users.json
|
162
181
|
- spec/folder_spec.rb
|
163
182
|
- spec/helper/account.example
|
164
183
|
- spec/helper/account.rb
|
@@ -166,29 +185,31 @@ files:
|
|
166
185
|
- spec/item_spec.rb
|
167
186
|
- spec/me_spec.rb
|
168
187
|
- spec/spec_helper.rb
|
188
|
+
- spec/users_spec.rb
|
169
189
|
homepage: http://github.com/attachmentsme/ruby-box
|
170
190
|
licenses:
|
171
191
|
- MIT
|
172
|
-
metadata: {}
|
173
192
|
post_install_message:
|
174
193
|
rdoc_options: []
|
175
194
|
require_paths:
|
176
195
|
- lib
|
177
196
|
required_ruby_version: !ruby/object:Gem::Requirement
|
197
|
+
none: false
|
178
198
|
requirements:
|
179
199
|
- - ! '>='
|
180
200
|
- !ruby/object:Gem::Version
|
181
201
|
version: '0'
|
182
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
183
204
|
requirements:
|
184
205
|
- - ! '>='
|
185
206
|
- !ruby/object:Gem::Version
|
186
207
|
version: '0'
|
187
208
|
requirements: []
|
188
209
|
rubyforge_project:
|
189
|
-
rubygems_version:
|
210
|
+
rubygems_version: 1.8.24
|
190
211
|
signing_key:
|
191
|
-
specification_version:
|
212
|
+
specification_version: 3
|
192
213
|
summary: ruby gem for box.com 2.0 api
|
193
214
|
test_files: []
|
194
215
|
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
OWRiNTUwYmE4YTFkYzJlN2M4OGQxYTQ2ZDFmZjRhMzEyZTRlMmIwMw==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZDQxMDNjZWYyODc2Njc5MThjNjllYjMzZGE5MmU2OTY5MTc5OGJhNQ==
|
7
|
-
!binary "U0hBNTEy":
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YWM3MDRmN2E5M2RmZjYxOWJiOWIwY2ZhNzFlNTA4MzZlM2U3ZTc4ZTNjNGY2
|
10
|
-
MzkzMDAwZTcyYjY0OWFhNjM3MWQyNTUyZDgxNzNjODViYTM1MGMyNzY4Njcy
|
11
|
-
ODk1NDNjYzMwZWVjNTJjNTMyMDAwMTY4NTRmOWQ4ZjM3Yzk3ZDI=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZjA4M2UyZDY4OWIzYzU1YjgyMTFhYmI2MTM1Yjk3NzFmZTRmYzQwMGViOGFk
|
14
|
-
YWQ0Yzg5ODg3NzdhNDE4ODEyNTQzNmVlNTY5YTAyYThlMWY1ZmM0MmQ3ODhk
|
15
|
-
YmMzMjdhZTU5ZjRkZjNhODFlMTk4Nzg1YzFhMWQ1MTc2NWQ3MzQ=
|