boxr 0.0.2 → 0.0.3

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
  SHA1:
3
- metadata.gz: 23f49821fe447ccaa83629e1e7c530ebdf35fa1b
4
- data.tar.gz: 53d8bd6bb8908a2329806b3cb1a5e25dad233251
3
+ metadata.gz: 67e27a5d8aa317d4f5367ca297a6effba37f940c
4
+ data.tar.gz: b3541ffde249148cbdde2f1666479c1377993b7e
5
5
  SHA512:
6
- metadata.gz: b62553d9f612f370de59617b893285f4046a1c33eb922638041b73c84596fef4cc96d1ae3eda4620159feb6ea3c3a18d0814d14d6d976c163cc9868625870959
7
- data.tar.gz: bbb792f645ab02ea642be299770d395f6bb32f545c40b38d88e050bb6497fe1ab07c0d3b14f849884e47450983e213ee4d48b0078a1d826c9db5052e1b803063
6
+ metadata.gz: 9837ce765c7cf63b3df57ab8fbf513b2e9f6745d447291bcedfd7a9bdc672028b185b93b52797c1fc9e36600f931fe6f40f0824122f659eff96ca052d3a3ae0d
7
+ data.tar.gz: bd84a9467ad8df991be52c8832cd63e0e5bb112352e20d7d1418b3ad7ddc77d98d4dbbb6c71eee253eeeb5d70a926fe10b4d1188ec4ec7df45c31aad7d536e01
data/.gitignore CHANGED
@@ -5,6 +5,7 @@
5
5
  /.ruby-gemset
6
6
  /.env.test
7
7
  /.env
8
+ /examples/.env
8
9
  /_yardoc/
9
10
  /coverage/
10
11
  /doc/
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Boxr
2
2
 
3
- TODO: Write a gem description
3
+ PLEASE NOTE: I need to complete this README with much more detailed instructions. However, feel free to try it out. The integration test suite is achieving 95% code coverage. Thanks!
4
4
 
5
5
  ## Installation
6
6
 
@@ -20,11 +20,26 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- TODO: Write usage instructions here
23
+ Super-fast instructions for now (much more to come):
24
+
25
+ 1. go to https://developers.box.com
26
+ 2. find or create your Box Content API app for testing
27
+ 3. click 'Edit Application'
28
+ 4. check the boxes for 'Read and write all files and folders' and 'Manage an enterprise'
29
+ 5. click 'Create a developer token'
30
+ 6. copy the token and use it in the code below in place of {BOX_DEVELOPER_TOKEN}
31
+
32
+ ```ruby
33
+ require 'boxr'
34
+
35
+ client = Boxr::Client.new({BOX_DEVELOPER_TOKEN})
36
+ items = client.folder_items(Boxr::ROOT)
37
+ items.each {|i| puts i.name}
38
+ ```
24
39
 
25
40
  ## Contributing
26
41
 
27
- 1. Fork it ( https://github.com/[my-github-username]/boxr/fork )
42
+ 1. Fork it ( https://github.com/cburnette/boxr/fork )
28
43
  2. Create your feature branch (`git checkout -b my-new-feature`)
29
44
  3. Commit your changes (`git commit -am 'Add some feature'`)
30
45
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ import "./lib/tasks/oauth.rake"
2
+
1
3
  require 'rspec/core/rake_task'
2
4
  require "bundler/gem_tasks"
3
5
 
@@ -20,10 +20,13 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '~> 2.0'
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.7"
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "rspec", "~> 3.1"
26
+ spec.add_development_dependency "simplecov", "~> 0.9"
26
27
  spec.add_development_dependency "dotenv", "~> 0.11"
28
+ spec.add_development_dependency "awesome_print"
29
+ spec.add_development_dependency "lru_redux"
27
30
 
28
31
  spec.add_runtime_dependency "oj", "~> 2.11"
29
32
  spec.add_runtime_dependency "httpclient", "~> 2.5"
@@ -0,0 +1,21 @@
1
+ require 'dotenv'; Dotenv.load("../.env")
2
+ require 'boxr'
3
+ require 'awesome_print'
4
+
5
+ client = Boxr::Client.new(ENV['BOX_DEVELOPER_TOKEN'])
6
+
7
+ now = Time.now
8
+ start_date = now - (60*60*24*30) #three days ago
9
+ end_date = now - (60*60*24) #one day ago
10
+
11
+ stream_position = 0
12
+ puts "fetching enterprise events..."
13
+ loop do
14
+ event_response = client.enterprise_events(stream_position: stream_position, created_after: start_date.utc, created_before: end_date.utc)
15
+ event_response.events.each do |event|
16
+ ap event
17
+ end
18
+ stream_position = event_response.next_stream_position
19
+
20
+ break if event_response.events.empty?
21
+ end
@@ -0,0 +1,24 @@
1
+ require 'dotenv'; Dotenv.load("../.env")
2
+ require 'boxr'
3
+ require 'awesome_print'
4
+ require 'lru_redux'
5
+
6
+ client = Boxr::Client.new(ENV['BOX_DEVELOPER_TOKEN'])
7
+ cache = LruRedux::Cache.new(1000)
8
+
9
+ stream_position = :now
10
+ loop do
11
+ puts "fetching events..."
12
+ event_response = client.user_events(stream_position: stream_position)
13
+ event_response.events.each do |event|
14
+ key = "/box-event/id/#{event.event_id}"
15
+
16
+ #we need to de-dupe the events because we will receive multiple events with the same event_id; this is to ensure that we get the event
17
+ if (cache.fetch(event.event_id)==nil)
18
+ cache[event.event_id] = true
19
+ puts event.event_type
20
+ end
21
+ end
22
+ stream_position = event_response.next_stream_position
23
+ sleep 2
24
+ end
@@ -2,9 +2,10 @@ require 'oj'
2
2
  require 'httpclient'
3
3
  require 'hashie'
4
4
 
5
- require "boxr/version"
5
+ require 'boxr/version'
6
6
  require 'boxr/exceptions'
7
7
  require 'boxr/client'
8
+ require 'boxr/shared_items'
8
9
  require 'boxr/folders'
9
10
  require 'boxr/files'
10
11
  require 'boxr/comments'
@@ -13,8 +14,8 @@ require 'boxr/groups'
13
14
  require 'boxr/collaborations'
14
15
  require 'boxr/search'
15
16
  require 'boxr/tasks'
16
- require 'boxr/shared_items'
17
17
  require 'boxr/metadata'
18
+ require 'boxr/events'
18
19
 
19
20
  module Enumerable
20
21
  def files
@@ -17,6 +17,7 @@ module Boxr
17
17
  TASK_ASSIGNMENTS_URI = "#{API_URI}/task_assignments"
18
18
  SHARED_ITEMS_URI = "#{API_URI}/shared_items"
19
19
  METADATA_URI = "#{API_URI}/files"
20
+ EVENTS_URI = "#{API_URI}/events"
20
21
 
21
22
  DEFAULT_LIMIT = 100
22
23
  FOLDER_ITEMS_LIMIT = 1000
@@ -50,6 +51,7 @@ module Boxr
50
51
  #All instances of Boxr::Client will use this one class instance of HTTPClient; that way persistent HTTPS connections work.
51
52
  #Plus, httpclient is thread-safe so we can use the same class instance with multiple instances of Boxr::Client
52
53
  BOX_CLIENT = HTTPClient.new
54
+ BOX_CLIENT.send_timeout = 3600 #one hour; needed for lengthy uploads
53
55
  BOX_CLIENT.transparent_gzip_decompression = true
54
56
 
55
57
  def initialize(token, as_user_id: nil)
@@ -103,7 +105,7 @@ module Boxr
103
105
 
104
106
  entries << body_json["entries"]
105
107
  else
106
- raise BoxrException.new(res.status, res.body, res.header)
108
+ raise BoxrException.new(status: res.status, body: res.body, header: res.header)
107
109
  end
108
110
  end until offset - total_count >= 0
109
111
 
@@ -161,7 +163,7 @@ module Boxr
161
163
  end
162
164
 
163
165
  def check_response_status(res, success_codes)
164
- raise BoxrException.new(res.status, res.body, res.header) unless success_codes.include?(res.status)
166
+ raise BoxrException.new(status: res.status, body: res.body, header: res.header) unless success_codes.include?(res.status)
165
167
  end
166
168
 
167
169
  def processed_response(res)
@@ -179,6 +181,15 @@ module Boxr
179
181
  end
180
182
  end
181
183
 
184
+ def restore_trashed_item(uri, name, parent_id)
185
+ attributes = {}
186
+ attributes[:name] = name unless name.nil?
187
+ attributes[:parent] = {id: parent_id} unless parent_id.nil?
188
+
189
+ restored_item, response = post uri, attributes
190
+ restored_item
191
+ end
192
+
182
193
  def create_shared_link(uri, item_id, access, unshared_at, can_download, can_preview)
183
194
  if access.nil?
184
195
  attributes = {shared_link: {}}
@@ -201,15 +212,6 @@ module Boxr
201
212
  updated_item
202
213
  end
203
214
 
204
- def restore_trashed_item(uri, name, parent_id)
205
- attributes = {}
206
- attributes[:name] = name if name
207
- attributes[:parent] = {id: parent_id} if parent_id
208
-
209
- restored_item, response = post uri, attributes
210
- restored_item
211
- end
212
-
213
215
  end
214
216
 
215
217
  end
@@ -1,6 +1,12 @@
1
1
  module Boxr
2
2
  class Client
3
3
 
4
+ def folder_collaborations(folder_id)
5
+ uri = "#{FOLDERS_URI}/#{folder_id}/collaborations"
6
+ collaborations, response = get(uri)
7
+ collaborations['entries']
8
+ end
9
+
4
10
  #make sure 'role' value is a string as Box has role values with spaces and dashes; e.g. 'previewer uploader'
5
11
  def add_collaboration(folder_id, accessible_by, role, fields: [], notify: nil)
6
12
  query = build_fields_query(fields, COLLABORATION_FIELDS_QUERY)
@@ -40,7 +46,7 @@ module Boxr
40
46
  collaboration
41
47
  end
42
48
 
43
- #these are pending collaborations for the current users; use the As-User Header to request for different users
49
+ #these are pending collaborations for the current user; use the As-User Header to request for different users
44
50
  def pending_collaborations
45
51
  query = {status: :pending}
46
52
  pending_collaborations, response = get(COLLABORATIONS_URI, query: query)
@@ -1,6 +1,13 @@
1
1
  module Boxr
2
2
  class Client
3
3
 
4
+ def file_comments(file_id, fields: [])
5
+ uri = "#{FILES_URI}/#{file_id}/comments"
6
+ query = build_fields_query(fields, COMMENT_FIELDS_QUERY)
7
+
8
+ comments = get_with_pagination uri, query: query
9
+ end
10
+
4
11
  def add_comment_to_file(file_id, message: nil, tagged_message: nil)
5
12
  add_comment(:file, file_id, message, tagged_message)
6
13
  end
@@ -16,7 +23,7 @@ module Boxr
16
23
  updated_comment
17
24
  end
18
25
 
19
- def comment_info(comment_id, fields: [])
26
+ def comment(comment_id, fields: [])
20
27
  uri ="#{COMMENTS_URI}/#{comment_id}"
21
28
  comment, response = get uri
22
29
  comment
@@ -0,0 +1,22 @@
1
+ module Boxr
2
+ class Client
3
+
4
+ def user_events(stream_position: 0, stream_type: :all, limit: 100)
5
+ query = {stream_position: stream_position, stream_type: stream_type, limit: limit}
6
+
7
+ events, response = get(EVENTS_URI, query: query)
8
+ Hashie::Mash.new({events: events["entries"], chunk_size: events["chunk_size"], next_stream_position: events["next_stream_position"]})
9
+ end
10
+
11
+ def enterprise_events(stream_position: 0, limit: 100, event_type: nil, created_after: nil, created_before: nil)
12
+ query = {stream_position: stream_position, stream_type: :admin_logs, limit: limit}
13
+ query['event_type'] = event_type unless event_type.nil?
14
+ query['created_after'] = created_after.to_datetime.rfc3339 unless created_after.nil?
15
+ query['created_before'] = created_before.to_datetime.rfc3339 unless created_before.nil?
16
+
17
+ events, response = get(EVENTS_URI, query: query)
18
+ Hashie::Mash.new({events: events["entries"], chunk_size: events["chunk_size"], next_stream_position: events["next_stream_position"]})
19
+ end
20
+
21
+ end
22
+ end
@@ -2,30 +2,35 @@ module Boxr
2
2
 
3
3
  class BoxrException < Exception
4
4
 
5
- attr_reader :response_body, :type, :status, :code, :help_uri, :box_message, :request_id
5
+ attr_reader :response_body, :type, :status, :code, :help_uri, :box_message, :boxr_message, :request_id
6
6
 
7
- def initialize(status,body,header)
7
+ def initialize(status: nil, body: nil, header: nil, boxr_message: nil)
8
8
  @status = status
9
9
  @response_body = body
10
10
  @header = header
11
+ @boxr_message = boxr_message
11
12
 
12
- body_json = Oj.load(body)
13
- if body_json
14
- @type = body_json["type"]
15
- @box_status = body_json["status"]
16
- @code = body_json["code"]
17
- @help_uri = body_json["help_uri"]
18
- @box_message = body_json["message"]
19
- @request_id = body_json["request_id"]
13
+ if(body)
14
+ body_json = Oj.load(body)
15
+ if body_json
16
+ @type = body_json["type"]
17
+ @box_status = body_json["status"]
18
+ @code = body_json["code"]
19
+ @help_uri = body_json["help_uri"]
20
+ @box_message = body_json["message"]
21
+ @request_id = body_json["request_id"]
22
+ end
20
23
  end
21
24
  end
22
25
 
23
26
  def message
24
- auth_header = @header['WWW-Authenticate']
25
- if(auth_header)
27
+ auth_header = @header['WWW-Authenticate'] unless @header.nil?
28
+ if(auth_header && auth_header != [])
26
29
  "#{@status}: #{auth_header}"
27
- elsif(!@box_message.blank?)
30
+ elsif(@box_message)
28
31
  "#{@status}: #{@box_message}"
32
+ elsif(@boxr_message)
33
+ @boxr_message
29
34
  else
30
35
  "#{@status}: #{@response_body}"
31
36
  end
@@ -1,14 +1,33 @@
1
1
  module Boxr
2
2
  class Client
3
3
 
4
- def file_info(file_id, fields: [])
4
+ def file_id(path)
5
+ if(path.start_with?('/'))
6
+ path = path.slice(1..-1)
7
+ end
8
+
9
+ path_items = path.split('/')
10
+ file_name = path_items.slice!(-1)
11
+
12
+ folder_id = folder_id(path_items.join('/'))
13
+
14
+ files = folder_items(folder_id, fields: [:id, :name])
15
+
16
+ begin
17
+ files.select{|f| f.name == file_name}.first.id
18
+ rescue
19
+ raise BoxrException.new(boxr_message: "File not found: '#{file_name}'")
20
+ end
21
+ end
22
+
23
+ def file(file_id, fields: [])
5
24
  uri = "#{FILES_URI}/#{file_id}"
6
25
  query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
7
26
  file, response = get uri, query: query
8
27
  file
9
28
  end
10
29
 
11
- def update_file_info(file_id, name: nil, description: nil, parent_id: nil, shared_link: nil, tags: nil, if_match: nil)
30
+ def update_file(file_id, name: nil, description: nil, parent_id: nil, shared_link: nil, tags: nil, if_match: nil)
12
31
  uri = "#{FILES_URI}/#{file_id}"
13
32
 
14
33
  attributes = {}
@@ -22,7 +41,7 @@ module Boxr
22
41
  updated_file
23
42
  end
24
43
 
25
- def download_file(file_id, version: nil)
44
+ def download_file(file_id, version: nil, follow_redirect: true)
26
45
  begin
27
46
  uri = "#{FILES_URI}/#{file_id}/content"
28
47
  query = {}
@@ -31,7 +50,12 @@ module Boxr
31
50
 
32
51
  if(response.status==302)
33
52
  location = response.header['Location'][0]
34
- file, response = get location, process_response: false
53
+
54
+ if(follow_redirect)
55
+ file, response = get location, process_response: false
56
+ else
57
+ return location #simply return the url
58
+ end
35
59
  elsif(response.status==202)
36
60
  retry_after_seconds = response.header['Retry-After'][0]
37
61
  sleep retry_after_seconds.to_i
@@ -41,6 +65,10 @@ module Boxr
41
65
  file
42
66
  end
43
67
 
68
+ def download_url(file_id, version: nil)
69
+ download_file(file_id, version: version, follow_redirect: false)
70
+ end
71
+
44
72
  def upload_file(path_to_file, parent_id, content_created_at: nil, content_modified_at: nil,
45
73
  preflight_check: true, send_content_md5: true)
46
74
 
@@ -91,10 +119,6 @@ module Boxr
91
119
  versions["entries"]
92
120
  end
93
121
 
94
- def download_old_version_of_file
95
-
96
- end
97
-
98
122
  def promote_old_version_of_file(file_id, file_version_id)
99
123
  uri = "#{FILES_URI}/#{file_id}/versions/current"
100
124
  attributes = {:type => 'file_version', :id => file_version_id}
@@ -104,8 +128,8 @@ module Boxr
104
128
 
105
129
  def delete_old_version_of_file(file_id, file_version_id, if_match: nil)
106
130
  uri = "#{FILES_URI}/#{file_id}/versions/#{file_version_id}"
107
- body_json, res = delete uri, if_match: if_match
108
- body_json
131
+ result, response = delete uri, if_match: if_match
132
+ result
109
133
  end
110
134
 
111
135
  def copy_file(file_id, parent_id, name: nil)
@@ -145,9 +169,11 @@ module Boxr
145
169
  disable_shared_link(uri, file_id)
146
170
  end
147
171
 
148
- def trashed_file(file_id)
172
+ def trashed_file(file_id, fields: [])
149
173
  uri = "#{FILES_URI}/#{file_id}/trash"
150
- trashed_file, response = get uri
174
+ query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
175
+
176
+ trashed_file, response = get uri, query: query
151
177
  trashed_file
152
178
  end
153
179
 
@@ -163,21 +189,6 @@ module Boxr
163
189
  restore_trashed_item(uri, name, parent_id)
164
190
  end
165
191
 
166
- def file_comments(file_id, fields: [])
167
- uri = "#{FILES_URI}/#{file_id}/comments"
168
- query = build_fields_query(fields, COMMENT_FIELDS_QUERY)
169
-
170
- comments = get_with_pagination uri, query: query
171
- end
172
-
173
- def file_tasks(file_id, fields: [])
174
- uri = "#{FILES_URI}/#{file_id}/tasks"
175
- query = build_fields_query(fields, TASK_FIELDS_QUERY)
176
-
177
- tasks, response = get uri, query: query
178
- tasks["entries"]
179
- end
180
-
181
192
 
182
193
  private
183
194
 
@@ -1,6 +1,24 @@
1
1
  module Boxr
2
2
  class Client
3
3
 
4
+ def folder_id(path)
5
+ if(path.start_with?('/'))
6
+ path = path.slice(1..-1)
7
+ end
8
+
9
+ path_folders = path.split('/')
10
+
11
+ folder_id = path_folders.inject(Boxr::ROOT) do |parent_id, folder_name|
12
+ folders = folder_items(parent_id, fields: [:id, :name]).folders
13
+
14
+ begin
15
+ folders.select{|f| f.name == folder_name}.first.id
16
+ rescue
17
+ raise BoxrException.new(boxr_message: "Folder not found: '#{folder_name}'")
18
+ end
19
+ end
20
+ end
21
+
4
22
  def folder_items(folder_id, fields: [])
5
23
  query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
6
24
  uri = "#{FOLDERS_URI}/#{folder_id}/items"
@@ -16,7 +34,7 @@ module Boxr
16
34
  created_folder
17
35
  end
18
36
 
19
- def folder_info(folder_id, fields: [])
37
+ def folder(folder_id, fields: [])
20
38
  query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
21
39
  uri = "#{FOLDERS_URI}/#{folder_id}"
22
40
 
@@ -24,7 +42,7 @@ module Boxr
24
42
  folder
25
43
  end
26
44
 
27
- def update_folder_info(folder_id, name: nil, description: nil, parent_id: nil, shared_link: nil,
45
+ def update_folder(folder_id, name: nil, description: nil, parent_id: nil, shared_link: nil,
28
46
  folder_upload_email: nil, owned_by_id: nil, sync_state: nil, tags: nil,
29
47
  can_non_owners_invite: nil, if_match: nil)
30
48
  uri = "#{FOLDERS_URI}/#{folder_id}"
@@ -48,7 +66,7 @@ module Boxr
48
66
  uri = "#{FOLDERS_URI}/#{folder_id}"
49
67
  query = {:recursive => recursive}
50
68
 
51
- result, response = delete uri, query, if_match: if_match
69
+ result, response = delete uri, query: query, if_match: if_match
52
70
  result
53
71
  end
54
72
 
@@ -71,12 +89,6 @@ module Boxr
71
89
  disable_shared_link(uri, folder_id)
72
90
  end
73
91
 
74
- def folder_collaborations(folder_id)
75
- uri = "#{FOLDERS_URI}/#{folder_id}/collaborations"
76
- collaborations, response = get uri
77
- collaborations
78
- end
79
-
80
92
  def trash(fields: [])
81
93
  uri = "#{FOLDERS_URI}/trash/items"
82
94
  query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
@@ -84,10 +96,12 @@ module Boxr
84
96
  items = get_with_pagination uri, query: query, limit: FOLDER_ITEMS_LIMIT
85
97
  end
86
98
 
87
- def trashed_folder(folder_id)
99
+ def trashed_folder(folder_id, fields: [])
88
100
  uri = "#{FOLDERS_URI}/#{folder_id}/trash"
89
- item, response = get uri
90
- item
101
+ query = build_fields_query(fields, FOLDER_AND_FILE_FIELDS_QUERY)
102
+
103
+ folder, response = get uri, query: query
104
+ folder
91
105
  end
92
106
 
93
107
  def delete_trashed_folder(folder_id)
@@ -20,6 +20,8 @@ module Boxr
20
20
  updated_group
21
21
  end
22
22
 
23
+ alias :rename_group :update_group
24
+
23
25
  def delete_group(group_id)
24
26
  uri = "#{GROUPS_URI}/#{group_id}"
25
27
  result, response = delete(uri)
@@ -19,7 +19,7 @@ module Boxr
19
19
  query[:offset] = offset unless offset.nil?
20
20
 
21
21
  results, response = get SEARCH_URI, query: query
22
- [results["entries"],results.total_count]
22
+ results["entries"]
23
23
  end
24
24
 
25
25
  end
@@ -1,6 +1,14 @@
1
1
  module Boxr
2
2
  class Client
3
3
 
4
+ def file_tasks(file_id, fields: [])
5
+ uri = "#{FILES_URI}/#{file_id}/tasks"
6
+ query = build_fields_query(fields, TASK_FIELDS_QUERY)
7
+
8
+ tasks, response = get uri, query: query
9
+ tasks["entries"]
10
+ end
11
+
4
12
  def create_task(file_id, action: :review, message: nil, due_at: nil)
5
13
  attributes = {item: {type: :file, id: file_id}}
6
14
  attributes[:action] = action unless action.nil?
@@ -69,7 +77,7 @@ module Boxr
69
77
  attributes[:message] = message unless message.nil?
70
78
  attributes[:resolution_state] = resolution_state unless resolution_state.nil?
71
79
 
72
- updated_task, respons = put uri, attributes
80
+ updated_task, response = put uri, attributes
73
81
  updated_task
74
82
  end
75
83
 
@@ -8,6 +8,10 @@ module Boxr
8
8
  user
9
9
  end
10
10
 
11
+ def me(fields: [])
12
+ current_user(fields: fields)
13
+ end
14
+
11
15
  def user(user_id, fields: [])
12
16
  uri = "#{USERS_URI}/#{user_id}"
13
17
  query = build_fields_query(fields, USER_FIELDS_QUERY)
@@ -19,7 +23,7 @@ module Boxr
19
23
  uri = USERS_URI
20
24
  query = build_fields_query(fields, USER_FIELDS_QUERY)
21
25
  query[:filter_term] = filter_term unless filter_term.nil?
22
- users, response = get_with_pagination(uri, query: query)
26
+ users = get_with_pagination(uri, query: query)
23
27
  end
24
28
 
25
29
  def create_user(login, name, role: nil, language: nil, is_sync_enabled: nil, job_title: nil,
@@ -1,3 +1,3 @@
1
1
  module Boxr
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,22 @@
1
+ require 'dotenv/tasks'
2
+ require 'boxr'
3
+
4
+ #to call this from bash, etc. use: rake oauth:get_tokens[YOUR_CLIENT_ID, YOUR CLIENT_SECRET]
5
+
6
+ #however, if you use zsh you must call as such: rake 'oauth:get_tokens[YOUR_CLIENT_ID, YOUR CLIENT_SECRET]'
7
+ #the single quotes are important for zsh!
8
+
9
+
10
+ namespace :oauth do
11
+ desc "some stuff"
12
+ task :get_tokens, [:client_id, :client_secret] => :environment do |task, args|
13
+ puts args.client_id, args.client_secret
14
+
15
+ # print "Whoa! Pushing to production. Type 'pushitrealgood' to continue: "
16
+ # if STDIN.gets.chomp == 'pushitrealgood'
17
+ # system "heroku pgbackups:capture -e -a zenph-production" or abort "aborted backing up production database"
18
+ # else
19
+ # abort 'task aborted'
20
+ # end
21
+ end
22
+ end
@@ -1,15 +1,447 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Boxr do
3
+ describe Boxr::Client do
4
+
5
+ #PLEASE NOTE
6
+ #This test is intentionally NOT a series of unit tests. The goal is to smoke test the entire code base
7
+ #against an actual Box account, making real calls to the Box API. The Box API is subject to frequent
8
+ #changes and it is not sufficient to mock responses as those responses will change over time. Successfully
9
+ #running this test suite shows that the code base works with the current Box API. The main premise here
10
+ #is that an exception will be thrown if anything unexpected happens.
11
+
12
+ #REQUIRED BOX SETTINGS
13
+ # 1. The developer token used must have admin or co-admin priviledges
14
+ # 2. Enterprise settings must allow Admin and Co-admins to permanently delete content in Trash
4
15
 
5
16
  #follow the directions in .env.example to set up your BOX_DEVELOPER_TOKEN
17
+ #keep in mind it is only valid for 60 minutes
6
18
  BOX_CLIENT = Boxr::Client.new(ENV['BOX_DEVELOPER_TOKEN'])
7
19
 
8
- #uncomment this line to see the HTTP request and response debug info
20
+ #uncomment this line to see the HTTP request and response debug info in the rspec output
9
21
  #BOX_CLIENT.debug_device = STDOUT
10
22
 
11
- it 'lists folder items' do
12
- items = BOX_CLIENT.folder_items(Boxr::ROOT)
13
- expect(items).to be_a Array
23
+ BOX_SERVER_SLEEP = 5
24
+ TEST_FOLDER_NAME = 'Boxr Test'
25
+ SUB_FOLDER_NAME = 'sub_folder_1'
26
+ SUB_FOLDER_DESCRIPTION = 'This was created by the Boxr test suite'
27
+ TEST_FILE_NAME = 'test file.txt'
28
+ DOWNLOADED_TEST_FILE_NAME = 'downloaded test file.txt'
29
+ COMMENT_MESSAGE = 'this is a comment'
30
+ REPLY_MESSAGE = 'this is a comment reply'
31
+ CHANGED_COMMENT_MESSAGE = 'this comment has been changed'
32
+ TEST_USER_LOGIN = "test-boxr-user@example.com"
33
+ TEST_USER_NAME = "Test Boxr User"
34
+ TEST_GROUP_NAME= "Test Boxr Group"
35
+ TEST_TASK_MESSAGE = "Please review"
36
+
37
+ before(:each) do
38
+ puts "-----> Resetting Box Environment"
39
+ sleep BOX_SERVER_SLEEP
40
+ root_folders = BOX_CLIENT.folder_items(Boxr::ROOT).folders
41
+ test_folder = root_folders.find{|f| f.name == TEST_FOLDER_NAME}
42
+ if(test_folder)
43
+ BOX_CLIENT.delete_folder(test_folder.id, recursive: true)
44
+ end
45
+ new_folder = BOX_CLIENT.create_folder(TEST_FOLDER_NAME, Boxr::ROOT)
46
+ @test_folder_id = new_folder.id
47
+
48
+ all_users = BOX_CLIENT.all_users
49
+ test_user = all_users.find{|u| u.login == TEST_USER_LOGIN}
50
+ if(test_user)
51
+ BOX_CLIENT.delete_user(test_user.id, force: true)
52
+ end
53
+ sleep BOX_SERVER_SLEEP
54
+ test_user = BOX_CLIENT.create_user(TEST_USER_LOGIN, TEST_USER_NAME)
55
+ @test_user_id = test_user.id
56
+
57
+ all_groups = BOX_CLIENT.groups
58
+ test_group = all_groups.find{|g| g.name == TEST_GROUP_NAME}
59
+ if(test_group)
60
+ BOX_CLIENT.delete_group(test_group.id)
61
+ end
62
+ end
63
+
64
+ it 'invokes folder operations' do
65
+ puts "get folder id using path"
66
+ folder_id = BOX_CLIENT.folder_id(TEST_FOLDER_NAME)
67
+ expect(folder_id).to eq(@test_folder_id)
68
+
69
+ puts "get folder info"
70
+ folder = BOX_CLIENT.folder(@test_folder_id)
71
+ expect(folder.id).to eq(@test_folder_id)
72
+
73
+ puts "create new folder"
74
+ new_folder = BOX_CLIENT.create_folder(SUB_FOLDER_NAME, @test_folder_id)
75
+ expect(new_folder).to be_a Hashie::Mash
76
+ SUB_FOLDER_ID = new_folder.id
77
+
78
+ puts "update folder"
79
+ updated_folder = BOX_CLIENT.update_folder(SUB_FOLDER_ID, description: SUB_FOLDER_DESCRIPTION)
80
+ expect(updated_folder.description).to eq(SUB_FOLDER_DESCRIPTION)
81
+
82
+ puts "copy folder"
83
+ new_folder = BOX_CLIENT.copy_folder(SUB_FOLDER_ID,@test_folder_id, name: 'copy of sub_folder_1')
84
+ expect(new_folder).to be_a Hashie::Mash
85
+ SUB_FOLDER_COPY_ID = new_folder.id
86
+
87
+ puts "create shared link for folder"
88
+ updated_folder = BOX_CLIENT.create_shared_link_for_folder(@test_folder_id, access: :open)
89
+ expect(updated_folder.shared_link.access).to eq("open")
90
+ shared_link = updated_folder.shared_link.url
91
+
92
+ puts "inspect shared link"
93
+ shared_item = BOX_CLIENT.shared_item(shared_link)
94
+ expect(shared_item.id).to eq(@test_folder_id)
95
+
96
+ puts "disable shared link for folder"
97
+ updated_folder = BOX_CLIENT.disable_shared_link_for_folder(@test_folder_id)
98
+ expect(updated_folder.shared_link).to be_nil
99
+
100
+ puts "delete folder"
101
+ result = BOX_CLIENT.delete_folder(SUB_FOLDER_COPY_ID, recursive: true)
102
+ expect(result).to eq ({})
103
+
104
+ puts "inspect the trash"
105
+ trash = BOX_CLIENT.trash()
106
+ expect(trash).to be_a Array
107
+
108
+ puts "inspect trashed folder"
109
+ trashed_folder = BOX_CLIENT.trashed_folder(SUB_FOLDER_COPY_ID)
110
+ expect(trashed_folder.item_status).to eq("trashed")
111
+
112
+ puts "restore trashed folder"
113
+ restored_folder = BOX_CLIENT.restore_trashed_folder(SUB_FOLDER_COPY_ID)
114
+ expect(restored_folder.item_status).to eq("active")
115
+
116
+ puts "trash and permanently delete folder"
117
+ BOX_CLIENT.delete_folder(SUB_FOLDER_COPY_ID, recursive: true)
118
+ result = BOX_CLIENT.delete_trashed_folder(SUB_FOLDER_COPY_ID)
119
+ expect(result).to eq({})
120
+ end
121
+
122
+ it "invokes file operations" do
123
+ puts "upload a file"
124
+ new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder_id)
125
+ expect(new_file.name).to eq(TEST_FILE_NAME)
126
+ test_file_id = new_file.id
127
+
128
+ puts "get file id using path"
129
+ file_id = BOX_CLIENT.file_id("/#{TEST_FOLDER_NAME}/#{TEST_FILE_NAME}")
130
+ expect(file_id).to eq(test_file_id)
131
+
132
+ puts "get file download url"
133
+ download_url = BOX_CLIENT.download_url(test_file_id)
134
+ expect(download_url).to start_with("https://")
135
+
136
+ puts "get file info"
137
+ file_info = BOX_CLIENT.file(test_file_id)
138
+ expect(file_info.id).to eq(test_file_id)
139
+
140
+ puts "update file"
141
+ new_description = 'this file is used to test Boxr'
142
+ updated_file_info = BOX_CLIENT.update_file(test_file_id, description: new_description)
143
+ expect(updated_file_info.description).to eq(new_description)
144
+
145
+ puts "download file"
146
+ file = BOX_CLIENT.download_file(test_file_id)
147
+ f = open("./spec/test_files/#{DOWNLOADED_TEST_FILE_NAME}", 'w+')
148
+ f.write(file)
149
+ f.close
150
+ expect(FileUtils.identical?("./spec/test_files/#{TEST_FILE_NAME}","./spec/test_files/#{DOWNLOADED_TEST_FILE_NAME}")).to eq(true)
151
+ File.delete("./spec/test_files/#{DOWNLOADED_TEST_FILE_NAME}")
152
+
153
+ puts "upload new version of file"
154
+ new_version = BOX_CLIENT.upload_new_version_of_file("./spec/test_files/#{TEST_FILE_NAME}", test_file_id)
155
+ expect(new_version.id).to eq(test_file_id)
156
+
157
+ puts "inspect versions of file"
158
+ versions = BOX_CLIENT.versions_of_file(test_file_id)
159
+ expect(versions.count).to eq(1) #the reason this is 1 instead of 2 is that Box considers 'versions' to be a versions other than 'current'
160
+ v1_id = versions.first.id
161
+
162
+ puts "promote old version of file"
163
+ newer_version = BOX_CLIENT.promote_old_version_of_file(test_file_id, v1_id)
164
+ versions = BOX_CLIENT.versions_of_file(test_file_id)
165
+ expect(versions.count).to eq(2)
166
+
167
+ puts "delete old version of file"
168
+ result = BOX_CLIENT.delete_old_version_of_file(test_file_id,v1_id)
169
+ versions = BOX_CLIENT.versions_of_file(test_file_id)
170
+ expect(versions.count).to eq(2) #this is still 2 because with Box you can restore a trashed old version
171
+
172
+ puts "get file thumbnail"
173
+ thumb = BOX_CLIENT.thumbnail(test_file_id)
174
+ expect(thumb).not_to be_nil
175
+
176
+ puts "create shared link for file"
177
+ updated_file = BOX_CLIENT.create_shared_link_for_file(test_file_id, access: :open)
178
+ expect(updated_file.shared_link.access).to eq("open")
179
+
180
+ puts "disable shared link for file"
181
+ updated_file = BOX_CLIENT.disable_shared_link_for_file(test_file_id)
182
+ expect(updated_file.shared_link).to be_nil
183
+
184
+ puts "copy file"
185
+ new_file_name = "copy of #{TEST_FILE_NAME}"
186
+ new_file = BOX_CLIENT.copy_file(test_file_id, @test_folder_id, name: new_file_name)
187
+ expect(new_file.name).to eq(new_file_name)
188
+ NEW_FILE_ID = new_file.id
189
+
190
+ puts "delete file"
191
+ result = BOX_CLIENT.delete_file(NEW_FILE_ID)
192
+ expect(result).to eq({})
193
+
194
+ puts "get trashed file info"
195
+ trashed_file = BOX_CLIENT.trashed_file(NEW_FILE_ID)
196
+ expect(trashed_file.item_status).to eq("trashed")
197
+
198
+ puts "restore trashed file"
199
+ restored_file = BOX_CLIENT.restore_trashed_file(NEW_FILE_ID)
200
+ expect(restored_file.item_status).to eq("active")
201
+
202
+ puts "trash and permanently delete file"
203
+ BOX_CLIENT.delete_file(NEW_FILE_ID)
204
+ result = BOX_CLIENT.delete_trashed_file(NEW_FILE_ID)
205
+ expect(result).to eq({})
206
+ end
207
+
208
+ it "invokes user operations" do
209
+ puts "inspect current user"
210
+ user = BOX_CLIENT.current_user
211
+ expect(user.status).to eq('active')
212
+ user = BOX_CLIENT.me(fields: [:role])
213
+ expect(user.role).to_not be_nil
214
+
215
+ puts "inspect a user"
216
+ user = BOX_CLIENT.user(@test_user_id)
217
+ expect(user.id).to eq(@test_user_id)
218
+
219
+ puts "inspect all users"
220
+ all_users = BOX_CLIENT.all_users()
221
+ test_user = all_users.find{|u| u.id == @test_user_id}
222
+ expect(test_user).to_not be_nil
223
+
224
+ puts "update user"
225
+ new_name = "Chuck Nevitt"
226
+ user = BOX_CLIENT.update_user(@test_user_id, name: new_name)
227
+ expect(user.name).to eq(new_name)
228
+
229
+ #create user is tested in the before method
230
+
231
+ puts "delete user"
232
+ result = BOX_CLIENT.delete_user(@test_user_id, force: true)
233
+ expect(result).to eq({})
234
+ end
235
+
236
+ it "invokes group operations" do
237
+ puts "create group"
238
+ group = BOX_CLIENT.create_group(TEST_GROUP_NAME)
239
+ expect(group.name).to eq(TEST_GROUP_NAME)
240
+ test_group_id = group.id
241
+
242
+ puts "inspect groups"
243
+ groups = BOX_CLIENT.groups
244
+ test_group = groups.find{|g| g.name == TEST_GROUP_NAME}
245
+ expect(test_group).to_not be_nil
246
+
247
+ puts "update group"
248
+ new_name = "Test Boxr Group Renamed"
249
+ group = BOX_CLIENT.update_group(test_group_id, new_name)
250
+ expect(group.name).to eq(new_name)
251
+ group = BOX_CLIENT.rename_group(test_group_id,TEST_GROUP_NAME)
252
+ expect(group.name).to eq(TEST_GROUP_NAME)
253
+
254
+ puts "add user to group"
255
+ group_membership = BOX_CLIENT.add_user_to_group(@test_user_id, test_group_id)
256
+ expect(group_membership.user.id).to eq(@test_user_id)
257
+ expect(group_membership.group.id).to eq(test_group_id)
258
+ membership_id = group_membership.id
259
+
260
+ puts "inspect group membership"
261
+ group_membership = BOX_CLIENT.group_membership(membership_id)
262
+ expect(group_membership.id).to eq(membership_id)
263
+
264
+ puts "inspect group memberships"
265
+ group_memberships = BOX_CLIENT.group_memberships(test_group_id)
266
+ expect(group_memberships.count).to eq(1)
267
+ expect(group_memberships.first.id).to eq(membership_id)
268
+
269
+ puts "inspect group memberships for a user"
270
+ group_memberships = BOX_CLIENT.group_memberships_for_user(@test_user_id)
271
+ expect(group_memberships.count).to eq(1)
272
+ expect(group_memberships.first.id).to eq(membership_id)
273
+
274
+ puts "inspect group memberships for me"
275
+ #this is whatever user your developer token is tied to
276
+ group_memberships = BOX_CLIENT.group_memberships_for_me
277
+ expect(group_memberships).to be_a(Array)
278
+
279
+ puts "update group membership"
280
+ group_membership = BOX_CLIENT.update_group_membership(membership_id, :admin)
281
+ expect(group_membership.role).to eq("admin")
282
+
283
+ puts "delete group membership"
284
+ result = BOX_CLIENT.delete_group_membership(membership_id)
285
+ expect(result).to eq({})
286
+ group_memberships = BOX_CLIENT.group_memberships_for_user(@test_user_id)
287
+ expect(group_memberships.count).to eq(0)
288
+
289
+ puts "inspect group collaborations"
290
+ group_collaboration = BOX_CLIENT.add_collaboration(@test_folder_id, {id: test_group_id, type: :group}, :editor)
291
+ expect(group_collaboration.accessible_by.id).to eq(test_group_id)
292
+
293
+ puts "delete group"
294
+ response = BOX_CLIENT.delete_group(test_group_id)
295
+ expect(response).to eq({})
296
+ end
297
+
298
+ it "invokes comment operations" do
299
+ new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder_id)
300
+ test_file_id = new_file.id
301
+
302
+ puts "add comment to file"
303
+ comment = BOX_CLIENT.add_comment_to_file(test_file_id, message: COMMENT_MESSAGE)
304
+ expect(comment.message).to eq(COMMENT_MESSAGE)
305
+ COMMENT_ID = comment.id
306
+
307
+ puts "reply to comment"
308
+ reply = BOX_CLIENT.reply_to_comment(COMMENT_ID, message: REPLY_MESSAGE)
309
+ expect(reply.message).to eq(REPLY_MESSAGE)
310
+
311
+ puts "get file comments"
312
+ comments = BOX_CLIENT.file_comments(test_file_id)
313
+ expect(comments.count).to eq(2)
314
+
315
+ puts "update a comment"
316
+ comment = BOX_CLIENT.change_comment(COMMENT_ID, CHANGED_COMMENT_MESSAGE)
317
+ expect(comment.message).to eq(CHANGED_COMMENT_MESSAGE)
318
+
319
+ puts "get comment info"
320
+ comment = BOX_CLIENT.comment(COMMENT_ID)
321
+ expect(comment.id).to eq(COMMENT_ID)
322
+
323
+ puts "delete comment"
324
+ result = BOX_CLIENT.delete_comment(COMMENT_ID)
325
+ expect(result).to eq({})
326
+ end
327
+
328
+ it "invokes collaborations operations" do
329
+ puts "add collaboration"
330
+ collaboration = BOX_CLIENT.add_collaboration(@test_folder_id, {id: @test_user_id, type: :user}, :editor)
331
+ expect(collaboration.accessible_by.id).to eq(@test_user_id)
332
+ collaboration_id = collaboration.id
333
+
334
+ puts "inspect collaboration"
335
+ collaboration = BOX_CLIENT.collaboration(collaboration_id)
336
+ expect(collaboration.id).to eq(collaboration_id)
337
+
338
+ puts "edit collaboration"
339
+ collaboration = BOX_CLIENT.edit_collaboration(collaboration_id, role: "viewer uploader")
340
+ expect(collaboration.role).to eq("viewer uploader")
341
+
342
+ puts "inspect folder collaborations"
343
+ collaborations = BOX_CLIENT.folder_collaborations(@test_folder_id)
344
+ expect(collaborations.count).to eq(1)
345
+ expect(collaborations[0].id).to eq(collaboration_id)
346
+
347
+ puts "remove collaboration"
348
+ result = BOX_CLIENT.remove_collaboration(collaboration_id)
349
+ expect(result).to eq({})
350
+ collaborations = BOX_CLIENT.folder_collaborations(@test_folder_id)
351
+ expect(collaborations.count).to eq(0)
352
+
353
+ puts "inspect pending collaborations"
354
+ pending_collaborations = BOX_CLIENT.pending_collaborations
355
+ expect(pending_collaborations).to eq([])
356
+ end
357
+
358
+ it "invokes task operations" do
359
+ new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder_id)
360
+ test_file_id = new_file.id
361
+ collaboration = BOX_CLIENT.add_collaboration(@test_folder_id, {id: @test_user_id, type: :user}, :editor)
362
+
363
+ puts "create task"
364
+ new_task = BOX_CLIENT.create_task(test_file_id, message: TEST_TASK_MESSAGE)
365
+ expect(new_task.message).to eq(TEST_TASK_MESSAGE)
366
+ TEST_TASK_ID = new_task.id
367
+
368
+ puts "inspect file tasks"
369
+ tasks = BOX_CLIENT.file_tasks(test_file_id)
370
+ expect(tasks.first.id).to eq(TEST_TASK_ID)
371
+
372
+ puts "inspect task"
373
+ task = BOX_CLIENT.task(TEST_TASK_ID)
374
+ expect(task.id).to eq(TEST_TASK_ID)
375
+
376
+ puts "update task"
377
+ NEW_TASK_MESSAGE = "new task message"
378
+ updated_task = BOX_CLIENT.update_task(TEST_TASK_ID, message: NEW_TASK_MESSAGE)
379
+ expect(updated_task.message).to eq(NEW_TASK_MESSAGE)
380
+
381
+ puts "create task assignment"
382
+ task_assignment = BOX_CLIENT.create_task_assignment(TEST_TASK_ID, assign_to_id: @test_user_id)
383
+ expect(task_assignment.assigned_to.id).to eq(@test_user_id)
384
+ task_assignment_id = task_assignment.id
385
+
386
+ puts "inspect task assignment"
387
+ task_assignment = BOX_CLIENT.task_assignment(task_assignment_id)
388
+ expect(task_assignment.id).to eq(task_assignment_id)
389
+
390
+ puts "inspect task assignments"
391
+ task_assignments = BOX_CLIENT.task_assignments(TEST_TASK_ID)
392
+ expect(task_assignments.count).to eq(1)
393
+ expect(task_assignments[0].id).to eq(task_assignment_id)
394
+
395
+ #TODO: can't do this test yet because the test user needs to confirm their email address before you can do this
396
+ puts "update task assignment"
397
+ expect {
398
+ box_client_as_test_user = Boxr::Client.new(ENV['BOX_DEVELOPER_TOKEN'], as_user_id: @test_user_id)
399
+ new_message = "Updated task message"
400
+ task_assignment = box_client_as_test_user.update_task_assignment(TEST_TASK_ID, resolution_state: :completed)
401
+ expect(task_assignment.resolution_state).to eq('completed')
402
+ }.to raise_error
403
+
404
+ puts "delete task assignment"
405
+ result = BOX_CLIENT.delete_task_assignment(task_assignment_id)
406
+ expect(result).to eq({})
407
+
408
+ puts "delete task"
409
+ result = BOX_CLIENT.delete_task(TEST_TASK_ID)
410
+ expect(result).to eq({})
411
+ end
412
+
413
+ it "invokes metadata operations" do
414
+ new_file = BOX_CLIENT.upload_file("./spec/test_files/#{TEST_FILE_NAME}", @test_folder_id)
415
+ test_file_id = new_file.id
416
+
417
+ puts "create metadata"
418
+ meta = {"a" => "hello", "b" => "world"}
419
+ metadata = BOX_CLIENT.create_metadata(test_file_id, meta)
420
+ expect(metadata.a).to eq("hello")
421
+
422
+ puts "update metadata"
423
+ metadata = BOX_CLIENT.update_metadata(test_file_id, [{op: :replace, path: "/b", value: "there"}])
424
+ expect(metadata.b).to eq("there")
425
+
426
+ puts "get metadata"
427
+ metadata = BOX_CLIENT.metadata(test_file_id)
428
+ expect(metadata.a).to eq("hello")
429
+
430
+ puts "delete metadata"
431
+ result = BOX_CLIENT.delete_metadata(test_file_id)
432
+ expect(result).to eq({})
433
+ end
434
+
435
+ it "invokes search operations" do
436
+ #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
437
+ #so we are searching for something that should return zero results
438
+ puts "perform search"
439
+ results = BOX_CLIENT.search("sdlfjuwnsljsdfuqpoiqweouyvnnadsfkjhiuweruywerbjvhvkjlnasoifyukhenlwdflnsdvoiuawfydfjh")
440
+ expect(results).to eq([])
14
441
  end
442
+
443
+ it "invokes a Boxr exception" do
444
+ expect { BOX_CLIENT.folder(1)}.to raise_error
445
+ end
446
+
15
447
  end
@@ -1,2 +1,4 @@
1
1
  require 'dotenv'; Dotenv.load
2
- require 'boxr'
2
+ require 'simplecov'; SimpleCov.start
3
+ require 'boxr'
4
+ require 'awesome_print'
@@ -0,0 +1 @@
1
+ This is a test file for the Boxr Gem RSpec smoke test.
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.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chad Burnette
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-26 00:00:00.000000000 Z
11
+ date: 2014-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '1.6'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: dotenv
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,34 @@ dependencies:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: awesome_print
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: lru_redux
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: oj
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -122,10 +164,13 @@ files:
122
164
  - README.md
123
165
  - Rakefile
124
166
  - boxr.gemspec
167
+ - examples/enterprise_events.rb
168
+ - examples/user_events.rb
125
169
  - lib/boxr.rb
126
170
  - lib/boxr/client.rb
127
171
  - lib/boxr/collaborations.rb
128
172
  - lib/boxr/comments.rb
173
+ - lib/boxr/events.rb
129
174
  - lib/boxr/exceptions.rb
130
175
  - lib/boxr/files.rb
131
176
  - lib/boxr/folders.rb
@@ -136,8 +181,10 @@ files:
136
181
  - lib/boxr/tasks.rb
137
182
  - lib/boxr/users.rb
138
183
  - lib/boxr/version.rb
184
+ - lib/tasks/oauth.rake
139
185
  - spec/boxr_spec.rb
140
186
  - spec/spec_helper.rb
187
+ - spec/test_files/test file.txt
141
188
  homepage: https://github.com/cburnette/boxr
142
189
  licenses:
143
190
  - MIT
@@ -166,3 +213,4 @@ summary: A Ruby client library for the Box V2 Content API that covers 100% of th
166
213
  test_files:
167
214
  - spec/boxr_spec.rb
168
215
  - spec/spec_helper.rb
216
+ - spec/test_files/test file.txt