ruby-box 1.11.1 → 1.12.1
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.
- 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: [](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=
|