boxr 1.8.0 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 06a2fa3c34dacf915b7bb788e854bc9235d2eb0cd92c7ca59e480737553146c4
4
- data.tar.gz: 7413454a658067aabe3ff90625e30a029335166ed50f7e05569cd2fe4e583e84
3
+ metadata.gz: 81bc808dde71fc65c270c2a145ee55c5dd6ac48ef964e9156512dbc04bb6ddf7
4
+ data.tar.gz: cc3d5e5140ef46fc95ff138d1fa79534e0bae12dc14e04bc54d212236cfc0ab9
5
5
  SHA512:
6
- metadata.gz: 74d6a804d79c88de453c3d348a69950b9a08f85da70ae258ad689daf50c3318dd7eb776763c371f600981a1a2ad2c10652811d2a031a6059b1426abb8fdb61ed
7
- data.tar.gz: 3b525fa9e91ee3417247128fb733e6feecaaf328916bcb1cca51ded9f0a2ef9d288f7d33a8f6cabf54580c6505d4e4e9a914f495c115bd17b43a1785ba36d57b
6
+ metadata.gz: 8f9bbc5f449301705e0919f122f9d55819ea7be821f2e081ee5d5f913db4d4cddf31d50f98cb831f4a9bbb2b59687a39ccbbecd71ac5d489d33d81760ea43b2e
7
+ data.tar.gz: 2181831ee3b4732c7ad4152aad85b51ef8f7dd951f25ab1cc6059b031f8653e6554961e3159585fe1ef1d72f125f0afe2d916f1acf4f0c26b7d69aaf2b5c0701
data/.env.example CHANGED
@@ -1,4 +1,4 @@
1
- #1. go to https://developers.box.com,
1
+ #1. go to https://developers.box.com,
2
2
  #2. find or create your Box Content API app for testing
3
3
  #3. click 'Edit Application'
4
4
  #4. check the boxes for 'Read and write all files and folders' and 'Manage an enterprise'
@@ -11,5 +11,5 @@ BOX_DEVELOPER_TOKEN={a valid developer token for your Box app}
11
11
  BOX_CLIENT_ID={client id of your Box app}
12
12
  BOX_CLIENT_SECRET={client secret of your Box app}
13
13
  BOX_ENTERPRISE_ID={box enterprise id}
14
- JWT_SECRET_KEY_PATH={path to your JWT private key}
15
- JWT_SECRET_KEY_PASSWORD={JWT private key password}
14
+ JWT_PRIVATE_KEY_PATH={path to your JWT private key}
15
+ JWT_PRIVATE_KEY_PASSWORD={JWT private key password}
data/.gitignore CHANGED
@@ -14,6 +14,7 @@
14
14
  /tmp/
15
15
  *.gem
16
16
  *.bundle
17
+ *.pem
17
18
  *.so
18
19
  *.o
19
20
  *.a
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # Boxr
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/boxr.svg)](https://badge.fury.io/rb/boxr)
4
+
2
5
  Boxr is a Ruby client library for the Box V2 Content API. Box employees affectionately refer to one another as Boxers, hence the name of this gem.
3
6
 
4
7
  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://box-content.readme.io/).
@@ -392,9 +395,11 @@ update_folder_metadata(folder, updates, scope, template)
392
395
  delete_metadata(file, scope: :global, template: :properties)
393
396
  delete_folder_metadata(folder, scope, template)
394
397
 
395
- enterprise_metadata
398
+ get_enterprise_templates
399
+ get_metadata_template_by_name(scope, template_key)
396
400
 
397
- metadata_schema(scope, template_key)
401
+ create_metadata_template(display_name, template_key: nil, fields: [], hidden: nil)
402
+ delete_metadata_template(scope, template_key)
398
403
  ```
399
404
 
400
405
  #### [Watermarking](https://box-content.readme.io/reference#watermarking)
data/lib/boxr/auth.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module Boxr
2
2
 
3
3
  JWT_GRANT_TYPE="urn:ietf:params:oauth:grant-type:jwt-bearer"
4
+ TOKEN_EXCHANGE_TOKEN_TYPE="urn:ietf:params:oauth:token-type:access_token"
5
+ TOKEN_EXCHANGE_GRANT_TYPE="urn:ietf:params:oauth:grant-type:token-exchange"
4
6
 
5
7
  def self.oauth_url(state, host: "app.box.com", response_type: "code", scope: nil, folder_id: nil, client_id: ENV['BOX_CLIENT_ID'])
6
8
  template = Addressable::Template.new("https://{host}/api/oauth2/authorize{?query*}")
@@ -8,13 +10,13 @@ module Boxr
8
10
  query = {"response_type" => "#{response_type}", "state" => "#{state}", "client_id" => "#{client_id}"}
9
11
  query["scope"] = "#{scope}" unless scope.nil?
10
12
  query["folder_id"] = "#{folder_id}" unless folder_id.nil?
11
-
13
+
12
14
  uri = template.expand({"host" => "#{host}", "query" => query})
13
15
  uri
14
16
  end
15
17
 
16
18
  def self.get_tokens(code=nil, grant_type: "authorization_code", assertion: nil, scope: nil, username: nil, client_id: ENV['BOX_CLIENT_ID'], client_secret: ENV['BOX_CLIENT_SECRET'])
17
- uri = "https://api.box.com/oauth2/token"
19
+ uri = Boxr::Client::AUTH_URI
18
20
  body = "grant_type=#{grant_type}&client_id=#{client_id}&client_secret=#{client_secret}"
19
21
  body = body + "&code=#{code}" unless code.nil?
20
22
  body = body + "&scope=#{scope}" unless scope.nil?
@@ -25,7 +27,7 @@ module Boxr
25
27
  end
26
28
 
27
29
  def self.get_enterprise_token(private_key: ENV['JWT_PRIVATE_KEY'], private_key_password: ENV['JWT_PRIVATE_KEY_PASSWORD'],
28
- public_key_id: ENV['JWT_PUBLIC_KEY_ID'], enterprise_id: ENV['BOX_ENTERPRISE_ID'],
30
+ public_key_id: ENV['JWT_PUBLIC_KEY_ID'], enterprise_id: ENV['BOX_ENTERPRISE_ID'],
29
31
  client_id: ENV['BOX_CLIENT_ID'], client_secret: ENV['BOX_CLIENT_SECRET'])
30
32
  unlocked_private_key = unlock_key(private_key, private_key_password)
31
33
  assertion = jwt_assertion(unlocked_private_key, client_id, enterprise_id, "enterprise", public_key_id)
@@ -40,19 +42,31 @@ module Boxr
40
42
  end
41
43
 
42
44
  def self.refresh_tokens(refresh_token, client_id: ENV['BOX_CLIENT_ID'], client_secret: ENV['BOX_CLIENT_SECRET'])
43
- uri = "https://api.box.com/oauth2/token"
45
+ uri = Boxr::Client::AUTH_URI
44
46
  body = "grant_type=refresh_token&refresh_token=#{refresh_token}&client_id=#{client_id}&client_secret=#{client_secret}"
45
47
 
46
48
  auth_post(uri, body)
47
49
  end
48
50
 
49
51
  def self.revoke_tokens(token, client_id: ENV['BOX_CLIENT_ID'], client_secret: ENV['BOX_CLIENT_SECRET'])
50
- uri = "https://api.box.com/oauth2/revoke"
52
+ uri = Boxr::Client::REVOKE_AUTH_URI
51
53
  body = "client_id=#{client_id}&client_secret=#{client_secret}&token=#{token}"
52
54
 
53
55
  auth_post(uri, body)
54
56
  end
55
57
 
58
+ # Exchange an existing token for a lesser-scoped token
59
+ def self.exchange_token(subject_token, scope, resource_id: nil, resource_type: :file)
60
+ uri = Boxr::Client::AUTH_URI
61
+ resouce_uri = resource_type == :file ? Boxr::Client::FILES_URI : Boxr::Client::FOLDERS_URI
62
+ resource_url = "#{resouce_uri}/#{resource_id}"
63
+
64
+ body = "subject_token=#{subject_token}&subject_token_type=#{TOKEN_EXCHANGE_TOKEN_TYPE}&scope=#{scope}&grant_type=#{TOKEN_EXCHANGE_GRANT_TYPE}"
65
+ body = body + "&resource=#{resource_url}" unless resource_id.nil?
66
+
67
+ auth_post(uri, body)
68
+ end
69
+
56
70
  class << self
57
71
  alias :get_token :get_tokens
58
72
  alias :refresh_token :refresh_tokens
@@ -67,14 +81,14 @@ module Boxr
67
81
  iss: iss,
68
82
  sub: sub,
69
83
  box_sub_type: box_sub_type,
70
- aud: "https://api.box.com/oauth2/token",
84
+ aud: Boxr::Client::AUTH_URI,
71
85
  jti: SecureRandom.hex(64),
72
86
  exp: (Time.now.utc + 10).to_i
73
87
  }
74
88
 
75
89
  additional_headers = {}
76
90
  additional_headers['kid'] = public_key_id unless public_key_id.nil?
77
-
91
+
78
92
  JWT.encode(payload, private_key, "RS256", additional_headers)
79
93
  end
80
94
 
@@ -98,5 +112,4 @@ module Boxr
98
112
  OpenSSL::PKey::RSA.new(private_key, private_key_password)
99
113
  end
100
114
  end
101
-
102
- end
115
+ end
data/lib/boxr/client.rb CHANGED
@@ -8,6 +8,8 @@ module Boxr
8
8
  #UPLOAD_URI = "https://upload.wcheng.inside-box.net/api/2.0"
9
9
 
10
10
  API_URI = "https://api.box.com/2.0"
11
+ AUTH_URI = "https://api.box.com/oauth2/token"
12
+ REVOKE_AUTH_URI = "https://api.box.com/oauth2/revoke"
11
13
  UPLOAD_URI = "https://upload.box.com/api/2.0"
12
14
  FILES_URI = "#{API_URI}/files"
13
15
  FILES_UPLOAD_URI = "#{UPLOAD_URI}/files/content"
data/lib/boxr/files.rb CHANGED
@@ -75,6 +75,7 @@ module Boxr
75
75
 
76
76
  def download_file(file, version: nil, follow_redirect: true)
77
77
  file_id = ensure_id(file)
78
+
78
79
  begin
79
80
  uri = "#{FILES_URI}/#{file_id}/content"
80
81
  query = {}
@@ -85,7 +86,8 @@ module Boxr
85
86
  location = response.header['Location'][0]
86
87
 
87
88
  if(follow_redirect)
88
- file, response = get(location, process_response: false)
89
+ file_content, response = get(location, process_response: false)
90
+ return file_content
89
91
  else
90
92
  return location #simply return the url
91
93
  end
@@ -93,9 +95,7 @@ module Boxr
93
95
  retry_after_seconds = response.header['Retry-After'][0]
94
96
  sleep retry_after_seconds.to_i
95
97
  end
96
- end until file
97
-
98
- file
98
+ end until file_content
99
99
  end
100
100
 
101
101
  def download_url(file, version: nil)
@@ -104,27 +104,31 @@ module Boxr
104
104
 
105
105
  def upload_file(path_to_file, parent, name: nil, content_created_at: nil, content_modified_at: nil,
106
106
  preflight_check: true, send_content_md5: true)
107
-
108
- parent_id = ensure_id(parent)
109
-
110
107
  filename = name ? name : File.basename(path_to_file)
111
- preflight_check(path_to_file, filename, parent_id) if preflight_check
112
-
113
- file_info = nil
114
- response = nil
115
108
 
116
109
  File.open(path_to_file) do |file|
117
- content_md5 = send_content_md5 ? Digest::SHA1.file(file).hexdigest : nil
110
+ upload_file_from_io(file, parent, name: filename, content_created_at: content_created_at, content_modified_at: content_modified_at, preflight_check: preflight_check, send_content_md5: send_content_md5)
111
+ end
112
+ end
118
113
 
119
- attributes = {name: filename, parent: {id: parent_id}}
120
- attributes[:content_created_at] = content_created_at.to_datetime.rfc3339 unless content_created_at.nil?
121
- attributes[:content_modified_at] = content_modified_at.to_datetime.rfc3339 unless content_modified_at.nil?
114
+ def upload_file_from_io(io, parent, name:, content_created_at: nil, content_modified_at: nil, preflight_check: true, send_content_md5: true)
115
+ parent_id = ensure_id(parent)
122
116
 
123
- body = {attributes: JSON.dump(attributes), file: file}
117
+ preflight_check(io, name, parent_id) if preflight_check
124
118
 
125
- file_info, response = post(FILES_UPLOAD_URI, body, process_body: false, content_md5: content_md5)
119
+ if send_content_md5
120
+ content_md5 = Digest::SHA1.hexdigest(io.read)
121
+ io.rewind
126
122
  end
127
123
 
124
+ attributes = {name: name, parent: {id: parent_id}}
125
+ attributes[:content_created_at] = content_created_at.to_datetime.rfc3339 unless content_created_at.nil?
126
+ attributes[:content_modified_at] = content_modified_at.to_datetime.rfc3339 unless content_modified_at.nil?
127
+
128
+ body = {attributes: JSON.dump(attributes), file: io}
129
+
130
+ file_info, response = post(FILES_UPLOAD_URI, body, process_body: false, content_md5: content_md5)
131
+
128
132
  file_info.entries[0]
129
133
  end
130
134
 
@@ -254,8 +258,8 @@ module Boxr
254
258
 
255
259
  private
256
260
 
257
- def preflight_check(path_to_file, filename, parent_id)
258
- size = File.size(path_to_file)
261
+ def preflight_check(io, filename, parent_id)
262
+ size = File.size(io)
259
263
 
260
264
  #TODO: need to make sure that figuring out the filename from the path_to_file works for people using Windows
261
265
  attributes = {name: filename, parent: {id: "#{parent_id}"}, size: size}
data/lib/boxr/groups.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  module Boxr
2
2
  class Client
3
3
 
4
- def groups(fields: [])
4
+ def groups(fields: [], offset: 0, limit: DEFAULT_LIMIT)
5
5
  query = build_fields_query(fields, GROUP_FIELDS_QUERY)
6
- groups = get_all_with_pagination(GROUPS_URI, query: query, offset: 0, limit: DEFAULT_LIMIT)
6
+ groups = get_all_with_pagination(GROUPS_URI, query: query, offset: offset, limit: limit)
7
7
  end
8
8
 
9
9
  def group_from_id(group_id, fields: [])
@@ -39,21 +39,21 @@ module Boxr
39
39
  result
40
40
  end
41
41
 
42
- def group_memberships(group)
42
+ def group_memberships(group, offset: 0, limit: DEFAULT_LIMIT)
43
43
  group_id = ensure_id(group)
44
44
  uri = "#{GROUPS_URI}/#{group_id}/memberships"
45
- memberships = get_all_with_pagination(uri, offset: 0, limit: DEFAULT_LIMIT)
45
+ memberships = get_all_with_pagination(uri, offset: offset, limit: limit)
46
46
  end
47
47
 
48
- def group_memberships_for_user(user)
48
+ def group_memberships_for_user(user, offset: 0, limit: DEFAULT_LIMIT)
49
49
  user_id = ensure_id(user)
50
50
  uri = "#{USERS_URI}/#{user_id}/memberships"
51
- memberships = get_all_with_pagination(uri, offset: 0, limit: DEFAULT_LIMIT)
51
+ memberships = get_all_with_pagination(uri, offset: offset, limit: limit)
52
52
  end
53
53
 
54
- def group_memberships_for_me
54
+ def group_memberships_for_me(offset: 0, limit: DEFAULT_LIMIT)
55
55
  uri = "#{USERS_URI}/me/memberships"
56
- memberships = get_all_with_pagination(uri, offset: 0, limit: DEFAULT_LIMIT)
56
+ memberships = get_all_with_pagination(uri, offset: offset, limit: limit)
57
57
  end
58
58
 
59
59
  def group_membership_from_id(membership_id)
@@ -89,11 +89,11 @@ module Boxr
89
89
  result
90
90
  end
91
91
 
92
- def group_collaborations(group)
92
+ def group_collaborations(group, offset: 0, limit: DEFAULT_LIMIT)
93
93
  group_id = ensure_id(group)
94
94
  uri = "#{GROUPS_URI}/#{group_id}/collaborations"
95
- collaborations = get_all_with_pagination(uri, offset: 0, limit: DEFAULT_LIMIT)
95
+ collaborations = get_all_with_pagination(uri, offset: offset, limit: limit)
96
96
  end
97
97
 
98
98
  end
99
- end
99
+ end
data/lib/boxr/metadata.rb CHANGED
@@ -77,12 +77,33 @@ module Boxr
77
77
  ent_metadata, response = get(uri)
78
78
  ent_metadata
79
79
  end
80
+ alias :get_enterprise_templates :enterprise_metadata
80
81
 
81
82
  def metadata_schema(scope, template_key)
82
83
  uri = "#{METADATA_TEMPLATES_URI}/#{scope}/#{template_key}/schema"
83
84
  schema, response = get(uri)
84
85
  schema
85
86
  end
87
+ alias :get_metadata_template_by_name :metadata_schema
88
+
89
+ def create_metadata_template(display_name, template_key: nil, fields: [], hidden: nil)
90
+ uri = "#{METADATA_TEMPLATES_URI}/schema"
91
+ schema = {
92
+ scope: "enterprise",
93
+ displayName: display_name,
94
+ }
95
+ schema[:templateKey] = template_key unless template_key.nil?
96
+ schema[:hidden] = hidden unless hidden.nil?
97
+ schema[:fields] = fields unless fields.empty?
98
+
99
+ metadata_template, response = post(uri, schema, content_type: "application/json")
100
+ metadata_template
101
+ end
86
102
 
103
+ def delete_metadata_template(scope, template_key)
104
+ uri = "#{METADATA_TEMPLATES_URI}/#{scope}/#{template_key}/schema"
105
+ result, response = delete(uri)
106
+ result
107
+ end
87
108
  end
88
- end
109
+ end
data/lib/boxr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Boxr
2
- VERSION = "1.8.0"
2
+ VERSION = "1.11.1"
3
3
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ #rake spec SPEC_OPTS="-e \"invokes auth operations"\"
4
+ describe 'auth operations' do
5
+ it "invokes auth operations" do
6
+ private_key = OpenSSL::PKey::RSA.new(File.read(ENV['JWT_PRIVATE_KEY_PATH']), ENV['JWT_PRIVATE_KEY_PASSWORD'])
7
+
8
+ puts "get enterprise token"
9
+ enterprise_token = Boxr::get_enterprise_token(private_key: private_key)
10
+ expect(enterprise_token).to include('access_token', 'expires_in')
11
+
12
+ puts "downgrade token"
13
+ child_token = Boxr::exchange_token(enterprise_token['access_token'], 'root_readonly')
14
+ expect(child_token).to include('access_token','expires_in')
15
+
16
+ # Currently cannot test due to user requiring
17
+ puts "get user token"
18
+ second_test_user = BOX_CLIENT.create_user("Second Test User", login: "second_test_user@#{('a'..'z').to_a.shuffle[0,10].join}.com", role: 'user', is_platform_access_only: true)
19
+ user_token = Boxr::get_user_token(second_test_user.id, private_key: private_key)
20
+ expect(user_token).to include('access_token','expires_in')
21
+
22
+ puts "revoke user token"
23
+ user_client = Boxr::Client.new(user_token['access_token'])
24
+ expect(user_client.root_folder_items).to eq []
25
+ Boxr::revoke_token(user_token['access_token'])
26
+ expect{user_client.root_folder_items}.to raise_error{Boxr::BoxrError}
27
+
28
+ puts "cleanup data"
29
+ BOX_CLIENT.delete_user(second_test_user, force: true)
30
+ end
31
+ end
@@ -32,6 +32,6 @@ describe 'collaborations operations' do
32
32
  expect(pending_collaborations).to eq([])
33
33
 
34
34
  puts "add invalid collaboration"
35
- expect { BOX_CLIENT.add_collaboration(@test_folder, {id: @test_user.id, type: :user}, :invalid_role)}.to raise_error
35
+ expect { BOX_CLIENT.add_collaboration(@test_folder, {id: @test_user.id, type: :user}, :invalid_role)}.to raise_error{Boxr::BoxrError}
36
36
  end
37
37
  end
@@ -12,6 +12,11 @@ describe "file operations" do
12
12
  new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder, name: TEST_FILE_NAME_CUSTOM)
13
13
  expect(new_file.name).to eq(TEST_FILE_NAME_CUSTOM)
14
14
 
15
+ puts "upload a file from IO"
16
+ io = File.open("./spec/test_files/#{TEST_FILE_NAME}")
17
+ new_file = BOX_CLIENT.upload_file_from_io(io, @test_folder, name: TEST_FILE_NAME_IO)
18
+ expect(new_file.name).to eq(TEST_FILE_NAME_IO)
19
+
15
20
  puts "get file using path"
16
21
  file = BOX_CLIENT.file_from_path("/#{TEST_FOLDER_NAME}/#{TEST_FILE_NAME}")
17
22
  expect(file.id).to eq(test_file.id)
@@ -50,13 +55,16 @@ describe "file operations" do
50
55
  expect(unlocked_file.lock).to be_nil
51
56
 
52
57
  puts "download file"
53
- file = BOX_CLIENT.download_file(test_file)
58
+ file_content = BOX_CLIENT.download_file(test_file)
54
59
  f = File.open("./spec/test_files/#{DOWNLOADED_TEST_FILE_NAME}", 'w+')
55
- f.write(file)
60
+ f.write(file_content)
56
61
  f.close
57
62
  expect(FileUtils.identical?("./spec/test_files/#{TEST_FILE_NAME}","./spec/test_files/#{DOWNLOADED_TEST_FILE_NAME}")).to eq(true)
58
63
  File.delete("./spec/test_files/#{DOWNLOADED_TEST_FILE_NAME}")
59
64
 
65
+ puts "download invalid file"
66
+ expect { BOX_CLIENT.download_file('INVALID_FILE_NAME.pdf') }.to raise_exception(Boxr::BoxrError)
67
+
60
68
  puts "upload new version of file"
61
69
  new_version = BOX_CLIENT.upload_new_version_of_file("./spec/test_files/#{TEST_FILE_NAME}", test_file)
62
70
  expect(new_version.id).to eq(test_file.id)
@@ -29,6 +29,8 @@ describe 'file metadata operations' do
29
29
  #NOTE: this test will fail unless you create a metadata template called 'test' with two attributes: 'a' of type text, and 'b' of type text
30
30
  it "invokes folder metadata operations" do
31
31
  new_folder = BOX_CLIENT.create_folder(SUB_FOLDER_NAME, @test_folder)
32
+ fields = [{displayName: "a", type: "string"},{displayName: "b", type: "string"}]
33
+ metadata_template = BOX_CLIENT.create_metadata_template("test", fields: fields)
32
34
 
33
35
  puts "create folder metadata"
34
36
  meta = {"a" => "hello", "b" => "world"}
@@ -48,5 +50,24 @@ describe 'file metadata operations' do
48
50
  puts "delete folder metadata"
49
51
  result = BOX_CLIENT.delete_folder_metadata(new_folder, "enterprise", "test")
50
52
  expect(result).to eq({})
53
+
54
+ puts "cleanup metadata template"
55
+ template_key = metadata_template["templateKey"]
56
+ scope = metadata_template["scope"]
57
+ BOX_CLIENT.delete_metadata_template(scope, template_key)
58
+ end
59
+
60
+ #rake spec SPEC_OPTS="-e \"invokes metadata template operations"\"
61
+ it "invokes metadata template operations" do
62
+ puts "create metadata template"
63
+ metadata_template = BOX_CLIENT.create_metadata_template("Test Template")
64
+ expect(metadata_template["displayName"]).to eq("Test Template")
65
+
66
+ template_key = metadata_template["templateKey"]
67
+ scope = metadata_template["scope"]
68
+
69
+ puts "delete metadata template"
70
+ result = BOX_CLIENT.delete_metadata_template(scope, template_key)
71
+ expect(result).to eq({})
51
72
  end
52
73
  end
data/spec/boxr_spec.rb CHANGED
@@ -10,7 +10,11 @@ describe Boxr::Client do
10
10
 
11
11
  #REQUIRED BOX SETTINGS
12
12
  # 1. The developer token used must have admin or co-admin priviledges
13
+ # 1.5 In the admin settings, advanced features must be enabled (perform as user and create user access tokens)
13
14
  # 2. Enterprise settings must allow Admin and Co-admins to permanently delete content in Trash
15
+ # 3. In Box Admin settings, you must authorize the app.
16
+ # - Admin Console > Enterprise Settings > Apps > Custom Applications > Authorize New App. Insert you client ID (API key)
17
+ # - You may need to re-authorize the app if you're running into issues with user tokens
14
18
 
15
19
  #follow the directions in .env.example to set up your BOX_DEVELOPER_TOKEN
16
20
  #keep in mind it is only valid for 60 minutes
@@ -25,6 +29,7 @@ describe Boxr::Client do
25
29
  SUB_FOLDER_DESCRIPTION = 'This was created by the Boxr test suite'
26
30
  TEST_FILE_NAME = 'test file.txt'
27
31
  TEST_FILE_NAME_CUSTOM = 'test file custom.txt'
32
+ TEST_FILE_NAME_IO = 'test file io.txt'
28
33
  DOWNLOADED_TEST_FILE_NAME = 'downloaded test file.txt'
29
34
  COMMENT_MESSAGE = 'this is a comment'
30
35
  REPLY_MESSAGE = 'this is a comment reply'
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: 1.8.0
4
+ version: 1.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Burnette
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-31 00:00:00.000000000 Z
11
+ date: 2019-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -209,6 +209,7 @@ files:
209
209
  - lib/boxr/version.rb
210
210
  - lib/boxr/watermarking.rb
211
211
  - lib/boxr/web_links.rb
212
+ - spec/boxr/auth_spec.rb
212
213
  - spec/boxr/collaborations_spec.rb
213
214
  - spec/boxr/comments_spec.rb
214
215
  - spec/boxr/files_spec.rb
@@ -247,6 +248,7 @@ signing_key:
247
248
  specification_version: 4
248
249
  summary: A Ruby client library for the Box V2 Content API.
249
250
  test_files:
251
+ - spec/boxr/auth_spec.rb
250
252
  - spec/boxr/collaborations_spec.rb
251
253
  - spec/boxr/comments_spec.rb
252
254
  - spec/boxr/files_spec.rb