boxr 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c4c27adff340e29abba4bcf0faad07015ac528c
4
- data.tar.gz: 683c1ef609710dc2bb9c661562c94e461c4f2766
3
+ metadata.gz: b149bf857a1d64b35578d649c769792c9569e1c2
4
+ data.tar.gz: 1cba489db37903b1ceea8f90508687baf76521da
5
5
  SHA512:
6
- metadata.gz: e315eb590f313753ba1c01f171ab9fda6f463f98372e16d9c4bf27a3c3a34bdaf0e04797e215cdbaafef4b6992417cd7b62281a547eeab156929cc87e0387bdb
7
- data.tar.gz: 4da05a5a7890a733219eddf0e8e1e5ae3d36391825f5bfcc616e1ebbc09dbe22254bf8836ab6773d291a13748281661d88e33863962c2fd8e2ac1bf05e2e3a51
6
+ metadata.gz: 6a9ff438d8b6a582d3e52bdea63457b874377b5c7290b945a3430241d308aa051cf6c9e0b4c8d929c273f411582d343f1c3ff7f79b3e217fccd27d61fe882e3b
7
+ data.tar.gz: b6ffbfe77e2060e9d7a01d60eec9aca993181f22353282da8df4e86185d357f96eb4b0edff5af74adfb924bc5768a81dc20f61c2cf2e21882ebd8ba547d336f1
data/README.md CHANGED
@@ -3,7 +3,10 @@ Boxr is a Ruby client library for the Box V2 Content API that covers 100% of the
3
3
 
4
4
  The purpose of this gem is to provide a clear, efficient, and intentional method of interacting with the Box Content API. As with any SDK that wraps a REST API, it is important to fully understand the Box Content API at the REST endpoint level. You are strongly encouraged to read through the Box documentation located [here](https://developers.box.com/docs/).
5
5
 
6
- The full RubyDocs for Boxr can be found [here](http://www.rubydoc.info/gems/boxr/Boxr/Client). You are also encouraged to rely heavily on the source code found in the [lib/boxr](https://github.com/cburnette/boxr/tree/master/lib/boxr) directory of this gem, as well as on the integration test found [here](https://github.com/cburnette/boxr/blob/master/spec/boxr_spec.rb).
6
+ The full RubyDocs for Boxr can be found [here](http://www.rubydoc.info/gems/boxr/Boxr/Client). You are also encouraged to rely heavily on the source code found in the [lib/boxr](https://github.com/cburnette/boxr/tree/master/lib/boxr) directory of this gem, as well as on the integration tests found [here](https://github.com/cburnette/boxr/blob/master/spec/boxr_spec.rb).
7
+
8
+ ## Requirements
9
+ This gem requires Ruby 2.0.0 or higher. The integration tests are currently being run using MRI Ruby 2.0.0-p643 and MRI Ruby 2.2.0.
7
10
 
8
11
  ## Installation
9
12
  Add this line to your application's Gemfile:
@@ -103,7 +106,7 @@ puts "Shared Link: #{file.shared_link.url}"
103
106
  ```ruby
104
107
  #NOTE: these are all module methods
105
108
 
106
- Boxr::oauth_url(state, response_type: "code", scope: nil, folder_id: nil, box_client_id: ENV['BOX_CLIENT_ID'])
109
+ Boxr::oauth_url(state, host: "app.box.com", response_type: "code", scope: nil, folder_id: nil, box_client_id: ENV['BOX_CLIENT_ID'])
107
110
 
108
111
  Boxr::get_tokens(code, grant_type: "authorization_code", username: nil, box_client_id: ENV['BOX_CLIENT_ID'], box_client_secret: ENV['BOX_CLIENT_SECRET'])
109
112
 
@@ -221,11 +224,11 @@ pending_collaborations()
221
224
  ```
222
225
  #### [Events](https://developers.box.com/docs/#events)
223
226
  ```ruby
224
- user_events(stream_position, stream_type: :all, limit: 100)
227
+ user_events(stream_position, stream_type: :all, limit: 800)
225
228
 
226
- enterprise_events(created_after: nil, created_before: nil, stream_position: 0, event_type: nil, limit: 100)
229
+ enterprise_events(created_after: nil, created_before: nil, stream_position: 0, event_type: nil, limit: 500)
227
230
 
228
- enterprise_events_stream(initial_stream_position, event_type: nil, limit: 100, refresh_period: 5)
231
+ enterprise_events_stream(initial_stream_position, event_type: nil, limit: 500, refresh_period: 300)
229
232
  ```
230
233
  #### [Shared Items](https://developers.box.com/docs/#shared-items)
231
234
  ```ruby
@@ -31,4 +31,5 @@ Gem::Specification.new do |spec|
31
31
  spec.add_runtime_dependency "oj", "~> 2.11"
32
32
  spec.add_runtime_dependency "httpclient", "~> 2.5"
33
33
  spec.add_runtime_dependency "hashie", "~> 3.3"
34
+ spec.add_runtime_dependency "addressable", "~> 2.3"
34
35
  end
@@ -1,6 +1,7 @@
1
1
  require 'oj'
2
2
  require 'httpclient'
3
3
  require 'hashie'
4
+ require 'addressable/template'
4
5
 
5
6
  require 'boxr/version'
6
7
  require 'boxr/errors'
@@ -57,4 +58,4 @@ module Boxr
57
58
  BOX_CLIENT.transparent_gzip_decompression = true
58
59
  nil
59
60
  end
60
- end
61
+ end
@@ -1,9 +1,13 @@
1
1
  module Boxr
2
2
 
3
- def self.oauth_url(state, response_type: "code", scope: nil, folder_id: nil, box_client_id: ENV['BOX_CLIENT_ID'])
4
- uri = "https://app.box.com/api/oauth2/authorize?response_type=#{response_type}&state=#{state}&client_id=#{box_client_id}"
5
- uri = uri + "&scope=#{scope}" unless scope.nil?
6
- uri = uri + "&folder_id=#{folder_id}" unless folder_id.nil?
3
+ def self.oauth_url(state, host: "app.box.com", response_type: "code", scope: nil, folder_id: nil, box_client_id: ENV['BOX_CLIENT_ID'])
4
+ template = Addressable::Template.new("https://{host}/api/oauth2/authorize{?query*}")
5
+
6
+ query = {"response_type" => "#{response_type}", "state" => "#{state}", "client_id" => "#{box_client_id}"}
7
+ query["scope"] = "#{scope}" unless scope.nil?
8
+ query["folder_id"] = "#{folder_id}" unless folder_id.nil?
9
+
10
+ uri = template.expand({"host" => "#{host}", "query" => query})
7
11
  uri
8
12
  end
9
13
 
@@ -32,6 +36,8 @@ module Boxr
32
36
  private
33
37
 
34
38
  def self.auth_post(uri, body)
39
+ uri = Addressable::URI.encode(uri)
40
+
35
41
  res = BOX_CLIENT.post(uri, body: body)
36
42
 
37
43
  if(res.status==200)
@@ -49,6 +49,8 @@ module Boxr
49
49
 
50
50
  GROUP_FIELDS = [:type, :id, :name, :created_at, :modified_at]
51
51
  GROUP_FIELDS_QUERY = GROUP_FIELDS.join(',')
52
+
53
+ VALID_COLLABORATION_ROLES = ['editor','viewer','previewer','uploader','previewer uploader','viewer uploader','co-owner','owner']
52
54
 
53
55
 
54
56
  def initialize(access_token=ENV['BOX_DEVELOPER_TOKEN'], refresh_token: nil, box_client_id: ENV['BOX_CLIENT_ID'], box_client_secret: ENV['BOX_CLIENT_SECRET'],
@@ -67,13 +69,15 @@ module Boxr
67
69
 
68
70
  private
69
71
 
70
- def get(uri, query: nil, success_codes: [200], process_response: true, if_match: nil, box_api_header: nil)
72
+ def get(uri, query: nil, success_codes: [200], process_response: true, if_match: nil, box_api_header: nil, follow_redirect: true)
73
+ uri = Addressable::URI.encode(uri)
74
+
71
75
  res = with_auto_token_refresh do
72
76
  headers = standard_headers
73
77
  headers['If-Match'] = if_match unless if_match.nil?
74
78
  headers['BoxApi'] = box_api_header unless box_api_header.nil?
75
79
 
76
- BOX_CLIENT.get(uri, query: query, header: headers)
80
+ BOX_CLIENT.get(uri, query: query, header: headers, follow_redirect: follow_redirect)
77
81
  end
78
82
 
79
83
  check_response_status(res, success_codes)
@@ -85,7 +89,8 @@ module Boxr
85
89
  end
86
90
  end
87
91
 
88
- def get_all_with_pagination(uri, query: {}, offset: 0, limit: DEFAULT_LIMIT)
92
+ def get_all_with_pagination(uri, query: {}, offset: 0, limit: DEFAULT_LIMIT, follow_redirect: true)
93
+ uri = Addressable::URI.encode(uri)
89
94
  entries = []
90
95
 
91
96
  begin
@@ -93,7 +98,7 @@ module Boxr
93
98
  query[:offset] = offset
94
99
  res = with_auto_token_refresh do
95
100
  headers = standard_headers
96
- BOX_CLIENT.get(uri, query: query, header: headers)
101
+ BOX_CLIENT.get(uri, query: query, header: headers, follow_redirect: follow_redirect)
97
102
  end
98
103
 
99
104
  if (res.status==200)
@@ -111,6 +116,7 @@ module Boxr
111
116
  end
112
117
 
113
118
  def post(uri, body, query: nil, success_codes: [201], process_body: true, content_md5: nil, content_type: nil, if_match: nil)
119
+ uri = Addressable::URI.encode(uri)
114
120
  body = Oj.dump(body) if process_body
115
121
 
116
122
  res = with_auto_token_refresh do
@@ -128,6 +134,8 @@ module Boxr
128
134
  end
129
135
 
130
136
  def put(uri, body, query: nil, success_codes: [200], content_type: nil, if_match: nil)
137
+ uri = Addressable::URI.encode(uri)
138
+
131
139
  res = with_auto_token_refresh do
132
140
  headers = standard_headers
133
141
  headers['If-Match'] = if_match unless if_match.nil?
@@ -142,6 +150,8 @@ module Boxr
142
150
  end
143
151
 
144
152
  def delete(uri, query: nil, success_codes: [204], if_match: nil)
153
+ uri = Addressable::URI.encode(uri)
154
+
145
155
  res = with_auto_token_refresh do
146
156
  headers = standard_headers
147
157
  headers['If-Match'] = if_match unless if_match.nil?
@@ -155,6 +165,8 @@ module Boxr
155
165
  end
156
166
 
157
167
  def options(uri, body, success_codes: [200])
168
+ uri = Addressable::URI.encode(uri)
169
+
158
170
  res = with_auto_token_refresh do
159
171
  headers = standard_headers
160
172
  BOX_CLIENT.options(uri, body: Oj.dump(body), header: headers)
@@ -18,7 +18,7 @@ module Boxr
18
18
 
19
19
  attributes = {item: {id: folder_id, type: :folder}}
20
20
  attributes[:accessible_by] = accessible_by
21
- attributes[:role] = role
21
+ attributes[:role] = validate_role(role)
22
22
 
23
23
  collaboration, response = post(COLLABORATIONS_URI, attributes, query: query)
24
24
  collaboration
@@ -28,7 +28,7 @@ module Boxr
28
28
  collaboration_id = ensure_id(collaboration)
29
29
  uri = "#{COLLABORATIONS_URI}/#{collaboration_id}"
30
30
  attributes = {}
31
- attributes[:role] = role unless role.nil?
31
+ attributes[:role] = validate_role(role) unless role.nil?
32
32
  attributes[:status] = status unless status.nil?
33
33
 
34
34
  updated_collaboration, response = put(uri, attributes)
@@ -62,5 +62,22 @@ module Boxr
62
62
  end
63
63
 
64
64
 
65
+ private
66
+
67
+ def validate_role(role)
68
+ case role
69
+ when :previewer_uploader
70
+ role = 'previewer uploader'
71
+ when :viewer_uploader
72
+ role = 'viewer uploader'
73
+ when :co_owner
74
+ role = 'co-owner'
75
+ end
76
+
77
+ role = role.to_s
78
+ raise BoxrError.new(boxr_message: "Invalid collaboration role: '#{role}'") unless VALID_COLLABORATION_ROLES.include?(role)
79
+
80
+ role
81
+ end
65
82
  end
66
83
  end
@@ -52,7 +52,7 @@ module Boxr
52
52
  uri = "#{FILES_URI}/#{file_id}/content"
53
53
  query = {}
54
54
  query[:version] = version unless version.nil?
55
- body_json, response = get(uri, query: query, success_codes: [302,202])
55
+ body_json, response = get(uri, query: query, success_codes: [302,202], follow_redirect: false) #we don't want httpclient to automatically follow the redirect; we need to grab it
56
56
 
57
57
  if(response.status==302)
58
58
  location = response.header['Location'][0]
@@ -1,3 +1,3 @@
1
1
  module Boxr
2
- VERSION = "0.18.0"
2
+ VERSION = "0.19.0"
3
3
  end
@@ -61,6 +61,8 @@ describe Boxr::Client do
61
61
  end
62
62
  end
63
63
 
64
+ #use this command to just execute this scenario
65
+ #rake spec SPEC_OPTS="-e \"invokes folder operations"\"
64
66
  it 'invokes folder operations' do
65
67
  puts "get folder using path"
66
68
  folder = BOX_CLIENT.folder_from_path(TEST_FOLDER_NAME)
@@ -125,6 +127,7 @@ describe Boxr::Client do
125
127
  expect(result).to eq({})
126
128
  end
127
129
 
130
+ #rake spec SPEC_OPTS="-e \"invokes file operations"\"
128
131
  it "invokes file operations" do
129
132
  puts "upload a file"
130
133
  new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder)
@@ -216,6 +219,7 @@ describe Boxr::Client do
216
219
  expect(result).to eq({})
217
220
  end
218
221
 
222
+ #rake spec SPEC_OPTS="-e \"invokes user operations"\"
219
223
  it "invokes user operations" do
220
224
  puts "inspect current user"
221
225
  user = BOX_CLIENT.current_user
@@ -244,6 +248,7 @@ describe Boxr::Client do
244
248
  expect(result).to eq({})
245
249
  end
246
250
 
251
+ #rake spec SPEC_OPTS="-e \"invokes group operations"\"
247
252
  it "invokes group operations" do
248
253
  puts "create group"
249
254
  group = BOX_CLIENT.create_group(TEST_GROUP_NAME)
@@ -305,6 +310,7 @@ describe Boxr::Client do
305
310
  expect(response).to eq({})
306
311
  end
307
312
 
313
+ #rake spec SPEC_OPTS="-e \"invokes comment operations"\"
308
314
  it "invokes comment operations" do
309
315
  new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder)
310
316
  test_file = new_file
@@ -335,9 +341,10 @@ describe Boxr::Client do
335
341
  expect(result).to eq({})
336
342
  end
337
343
 
344
+ #rake spec SPEC_OPTS="-e \"invokes collaborations operations"\"
338
345
  it "invokes collaborations operations" do
339
346
  puts "add collaboration"
340
- collaboration = BOX_CLIENT.add_collaboration(@test_folder, {id: @test_user.id, type: :user}, :editor)
347
+ collaboration = BOX_CLIENT.add_collaboration(@test_folder, {id: @test_user.id, type: :user}, :viewer_uploader)
341
348
  expect(collaboration.accessible_by.id).to eq(@test_user.id)
342
349
  COLLABORATION = collaboration
343
350
 
@@ -363,8 +370,12 @@ describe Boxr::Client do
363
370
  puts "inspect pending collaborations"
364
371
  pending_collaborations = BOX_CLIENT.pending_collaborations
365
372
  expect(pending_collaborations).to eq([])
373
+
374
+ puts "add invalid collaboration"
375
+ expect { BOX_CLIENT.add_collaboration(@test_folder, {id: @test_user.id, type: :user}, :invalid_role)}.to raise_error
366
376
  end
367
377
 
378
+ #rake spec SPEC_OPTS="-e \"invokes task operations"\"
368
379
  it "invokes task operations" do
369
380
  test_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder)
370
381
  collaboration = BOX_CLIENT.add_collaboration(@test_folder, {id: @test_user.id, type: :user}, :editor)
@@ -419,9 +430,9 @@ describe Boxr::Client do
419
430
  expect(result).to eq({})
420
431
  end
421
432
 
433
+ #rake spec SPEC_OPTS="-e \"invokes metadata operations"\"
422
434
  it "invokes metadata operations" do
423
435
  test_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder)
424
- #test_file_id = new_file.id
425
436
 
426
437
  puts "create metadata"
427
438
  meta = {"a" => "hello", "b" => "world"}
@@ -441,6 +452,7 @@ describe Boxr::Client do
441
452
  expect(result).to eq({})
442
453
  end
443
454
 
455
+ #rake spec SPEC_OPTS="-e \"invokes search operations"\"
444
456
  it "invokes search operations" do
445
457
  #the issue with this test is that Box can take between 5-10 minutes to index any content uploaded; this is just a smoke test
446
458
  #so we are searching for something that should return zero results
@@ -449,8 +461,4 @@ describe Boxr::Client do
449
461
  expect(results).to eq([])
450
462
  end
451
463
 
452
- it "invokes a Boxr error" do
453
- expect { BOX_CLIENT.folder(1)}.to raise_error
454
- end
455
-
456
464
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boxr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Burnette
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-12 00:00:00.000000000 Z
11
+ date: 2015-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '3.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: addressable
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.3'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.3'
153
167
  description: ''
154
168
  email:
155
169
  - chadburnette@me.com