box-api 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/Gemfile.lock +1 -1
  2. data/box-api.gemspec +1 -1
  3. data/doc/Box.html +108 -0
  4. data/doc/Box/Account.html +1099 -0
  5. data/doc/Box/Api.html +3428 -0
  6. data/doc/Box/Api/AccountExceeded.html +130 -0
  7. data/doc/Box/Api/EmailInvalid.html +141 -0
  8. data/doc/Box/Api/EmailTaken.html +130 -0
  9. data/doc/Box/Api/ErrorStatus.html +130 -0
  10. data/doc/Box/Api/Exception.html +120 -0
  11. data/doc/Box/Api/Generic.html +130 -0
  12. data/doc/Box/Api/InvalidFolder.html +141 -0
  13. data/doc/Box/Api/InvalidInput.html +130 -0
  14. data/doc/Box/Api/InvalidName.html +130 -0
  15. data/doc/Box/Api/NameTaken.html +130 -0
  16. data/doc/Box/Api/NoAccess.html +130 -0
  17. data/doc/Box/Api/NoParent.html +130 -0
  18. data/doc/Box/Api/NotAuthorized.html +130 -0
  19. data/doc/Box/Api/Restricted.html +141 -0
  20. data/doc/Box/Api/SizeExceeded.html +130 -0
  21. data/doc/Box/Api/Unknown.html +130 -0
  22. data/doc/Box/Api/UnknownResponse.html +141 -0
  23. data/doc/Box/Api/UploadFailed.html +141 -0
  24. data/doc/Box/File.html +580 -0
  25. data/doc/Box/Folder.html +1078 -0
  26. data/doc/Box/Item.html +1884 -0
  27. data/doc/_index.html +342 -0
  28. data/doc/class_list.html +47 -0
  29. data/doc/css/common.css +1 -0
  30. data/doc/css/full_list.css +53 -0
  31. data/doc/css/style.css +320 -0
  32. data/doc/file.README.html +98 -0
  33. data/doc/file_list.html +49 -0
  34. data/doc/frames.html +13 -0
  35. data/doc/index.html +98 -0
  36. data/doc/js/app.js +205 -0
  37. data/doc/js/full_list.js +150 -0
  38. data/doc/js/jquery.js +16 -0
  39. data/doc/method_list.html +574 -0
  40. data/doc/top-level-namespace.html +103 -0
  41. data/examples/login.rb +4 -4
  42. data/lib/box/account.rb +168 -51
  43. data/lib/box/api.rb +174 -16
  44. data/lib/box/api/exceptions.rb +4 -0
  45. data/lib/box/file.rb +17 -4
  46. data/lib/box/folder.rb +85 -30
  47. data/lib/box/item.rb +89 -20
  48. data/spec/account_spec.rb +0 -4
  49. data/spec/folder_spec.rb +3 -9
  50. metadata +42 -4
@@ -0,0 +1,103 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.7.2
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ relpath = '';
19
+ if (relpath != '') relpath += '/';
20
+ </script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
25
+
26
+
27
+ </head>
28
+ <body>
29
+ <script type="text/javascript" charset="utf-8">
30
+ if (window.top.frames.main) document.body.className = 'frames';
31
+ </script>
32
+
33
+ <div id="header">
34
+ <div id="menu">
35
+
36
+ <a href="_index.html">Index</a> &raquo;
37
+
38
+
39
+ <span class="title">Top Level Namespace</span>
40
+
41
+
42
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
43
+ </div>
44
+
45
+ <div id="search">
46
+
47
+ <a id="class_list_link" href="#">Class List</a>
48
+
49
+ <a id="method_list_link" href="#">Method List</a>
50
+
51
+ <a id="file_list_link" href="#">File List</a>
52
+
53
+ </div>
54
+ <div class="clear"></div>
55
+ </div>
56
+
57
+ <iframe id="search_frame"></iframe>
58
+
59
+ <div id="content"><h1>Top Level Namespace
60
+
61
+
62
+
63
+ </h1>
64
+
65
+ <dl class="box">
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ </dl>
75
+ <div class="clear"></div>
76
+
77
+ <h2>Defined Under Namespace</h2>
78
+ <p class="children">
79
+
80
+
81
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="Box.html" title="Box (module)">Box</a></span>
82
+
83
+
84
+
85
+
86
+ </p>
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+ </div>
95
+
96
+ <div id="footer">
97
+ Generated on Mon Aug 8 13:05:22 2011 by
98
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
99
+ 0.7.2 (ruby-1.9.2).
100
+ </div>
101
+
102
+ </body>
103
+ </html>
@@ -24,19 +24,19 @@ account = Box::Account.new(app_data['api_key'])
24
24
  auth_token = app_data['auth_token']
25
25
 
26
26
  # now we have enough information to log into the box api, so we try to authorize using the auth token
27
- authed = account.authorize(auth_token) do |auth_url|
27
+ account.authorize(auth_token) do |auth_url|
28
28
  # this block is called if the auth_token is invalid or missing
29
29
 
30
30
  # we use launchy to open a new browser, but you can do it however you want
31
31
  Launchy.open(auth_url)
32
32
 
33
33
  # make sure you pause until the user has authorized, or just tell them to restart the program
34
- puts "Hit any key once you have logged in on the opened web page."
34
+ puts "Please press the enter key once you have authorized this application to use your account"
35
35
  gets
36
36
  end
37
37
 
38
- unless authed
39
- # the user didn't auth like we told them to, so we can't access anything
38
+ unless account.authorized?
39
+ # the user didn't authorize like we told them to, so we can't access anything
40
40
  puts "Unable to login, please try again."
41
41
  exit
42
42
  end
@@ -2,32 +2,111 @@ require 'box/api'
2
2
  require 'box/folder'
3
3
 
4
4
  module Box
5
- class Account
6
- attr_reader :api, :ticket, :auth_token
5
+ # Represents an account on Box. In order to use the Box api, the user
6
+ # must first grant the application permission to use their account. This
7
+ # is done in the {#authorize} function. Once an account has been
8
+ # authorized, it can access all of the details and information stored
9
+ # on that account.
7
10
 
8
- # setup the api using our api_key
11
+ class Account
12
+ # @return [String] The auth token if authorization was successful.
13
+ attr_reader :auth_token
14
+
15
+ # Creates an account object using the given Box api key.
16
+ # You can then {#register} a new account or {#authorize} an
17
+ # existing account.
18
+ #
19
+ # @param [String, Api] api the api key to use for the Box api.
9
20
  def initialize(api)
10
21
  @api = case
11
22
  when api.class == Box::Api; api # use the api object as passed in
12
- else; Box::Api.new(api) # allows user to pass in the api_key rather than make a new API object themselves
23
+ else; Box::Api.new(api) # allows user to pass in a string
13
24
  end
14
25
  end
15
26
 
16
- #### AUTHENTICATION SECTION ####
17
- # register the user with the given details
27
+ # Register a new account on the Box website with the given details.
28
+ #
29
+ # @param [String] email The email address to create the account with
30
+ # @param [String] password The password to create the account with
31
+ # @return [Boolean] Whether registration was successful.
32
+ #
33
+ # @raise [Api::EmailInvalid] The email address was invalid
34
+ # @raise [Api::EmailTaken] The email address was taken
35
+ #
18
36
  def register(email, password)
19
- # note: this function can throw EmailInvalid and EmailTaken
20
37
  response = @api.register_new_user(email, password)
21
38
 
22
- cache_info(response['user']) # cache account_info, saves an extra API call
39
+ cache_info(response['user']) # cache account_info, saving an extra API call
23
40
  authorize_token(response['token'])
41
+
42
+ true
43
+ end
44
+
45
+ # Authorize the account using the given auth token, or request
46
+ # permission from the user to let this application use their account.
47
+ #
48
+ # An auth token can be reused from previous authorizations provided the
49
+ # user doesn't log out, and significantly speeds up the process. If the
50
+ # auth token if invalid or not provided, the account tries to log in
51
+ # normally and requires the user to log in and provide access for their
52
+ # account.
53
+ #
54
+ # @param [Optional, String] auth_token Uses an existing token or requests
55
+ # a new one if nil.
56
+ # @yield [authorize_url] This block called when the user has not yet
57
+ # granted this application permission to use their account. You
58
+ # must have the user navigate to the passed url and authorize
59
+ # this app before continuing.
60
+ # @return [Boolean] Whether the user is authorized.
61
+ #
62
+ # @example Authorize an account without a saved auth token.
63
+ # account.authorize do |auth_url|
64
+ # puts "Please visit #{ auth_url } and enter your account infomation"
65
+ # puts "Press the enter key once you have done this."
66
+ # gets # wait for the enter key to be pressed
67
+ # end
68
+ #
69
+ # @example Authorize an account using an existing auth token.
70
+ # auth_token = "saved auth token" # load from file ideally
71
+ # account.authorize(auth_token)
72
+ #
73
+ # @example Combining the above two for the best functionality.
74
+ # auth_token = "saved auth token" # load from file if possible
75
+ # account.authorize(auth_token) do |auth_url|
76
+ # # auth token was invalid or nil, have the user visit auth_url
77
+ # end
78
+ #
79
+ def authorize(auth_token = nil)
80
+ # use a saved auth token if it is given
81
+ if auth_token
82
+ return true if authorize_token(auth_token)
83
+ end
84
+
85
+ # the auth token either failed or was not provided
86
+ # we must try to authorize a ticket, and call the block if that fails
87
+ if not authorize_ticket and block_given?
88
+ # the supplied block should instruct the user to visit this url
89
+ yield authorize_url
90
+
91
+ # try authorizing once more
92
+ authorize_ticket
93
+ end
94
+
95
+ # return our authorized status
96
+ authorized?
24
97
  end
25
98
 
26
- # logout, rendering any auth_token useless
99
+ # Log out of the account and invalidate the auth token.
100
+ #
101
+ # @note The user will have to re-authorize if they wish to use this
102
+ # application, and the auth token will no longer work.
103
+ #
104
+ # @return [Boolean] Whether logout was successful.
105
+ #
27
106
  def logout
28
107
  begin
29
108
  @api.logout
30
- authorize_token(nil)
109
+ cache_token(nil)
31
110
  rescue Api::NotAuthorized
32
111
  # already logged out, or never logged in
33
112
  end
@@ -35,72 +114,110 @@ module Box
35
114
  true
36
115
  end
37
116
 
38
- # authorize the application either using a saved auth_token or ask for a new token
39
- def authorize(auth_token = self.auth_token)
40
- return true if auth_token and authorize_token(auth_token) # saved auth_tokens significantly speed up the authentication process
117
+ # Return the account details. A cached copy will be used if avaliable,
118
+ # and requested if it is not.
119
+ #
120
+ # @param [Boolean] refresh Will not use the cached version if true.
121
+ # @return [Hash] A hash containing all of the user's account
122
+ # details, or nil if they are not authorized. Please see the
123
+ # Box api documentation for information about each field.
124
+ #
125
+ # TODO: Add url to Box api documentation, and provide the current fields.
126
+ #
127
+ def info(refresh = false)
128
+ return @info if @info and not refresh
41
129
 
42
- if block_given? and not authorize_ticket # if we cannot authorize the ticket, the user needs to visit a web page and give our app permission
43
- yield authorize_url # the supplied block should instruct the user to visit this url, returning once they have
44
- authorize_ticket # try authorizing again, assuming the user has authed now
130
+ begin
131
+ cache_info(nil) # reset existing info
132
+ info = @api.get_account_info['user']
133
+ cache_info(info)
134
+ rescue Api::NotAuthorized, Api::InvalidInput
135
+ nil
45
136
  end
137
+ end
46
138
 
47
- authorized?
139
+ # Get the root folder of the account. You can use this {Folder} object
140
+ # to access all sub items within the account. This folder is lazy loaded,
141
+ # and a network request will be made if/when the data is requested.
142
+ #
143
+ # @return [Folder] A folder object representing the root folder.
144
+ #
145
+ def root
146
+ return @root if @root
147
+ @root = Box::Folder.new(@api, nil, :id => 0)
148
+ end
149
+
150
+ # @return [Boolean] Is the account authorized?
151
+ def authorized?
152
+ @info != nil
48
153
  end
49
154
 
50
- # tickets are used to associate authentication attempts, so each user needs their own ticket
155
+ protected
156
+
157
+ # @return [Api] The api currently in use.
158
+ attr_reader :api
159
+
160
+ # Get the cached ticket or request a new one from the Box api.
161
+ # @return [String] The authorization ticket.
51
162
  def ticket
52
163
  @ticket ||= @api.get_ticket['ticket']
53
164
  end
54
165
 
55
- # the user must visit this url to allow the application to access their account
166
+ # The url the user needs to visit in order to grant this application
167
+ # permission to use their account. This requires a ticket, which
168
+ # is either pulled from the cache or requested.
169
+ #
170
+ # @param [String] ticket Use the ticket for the url.
171
+ # If no ticket is provided, one will be requested and cached.
172
+ # @return [String] the url used for authorizing this account.
173
+ #
56
174
  def authorize_url(ticket = self.ticket)
57
175
  "#{ api.base_url }/auth/#{ ticket }"
58
176
  end
59
177
 
60
- # using the ticket, we get the auth_token providing the user has already allowed our application the privilege
61
- def authorize_ticket(ticket = self.ticket) # note: self.ticket will request a ticket if none exists, not the same as @ticket
178
+ # Attempt to authorize this account using the given ticket. This will
179
+ # only succeed if the user has granted this ticket permission, done
180
+ # by visiting and logging into the {#authorize_url}.
181
+ #
182
+ # @param [String] ticket The ticket used for authorization.
183
+ # If no ticket is provided, one will be requested and cached.
184
+ # @return [String, nil] The auth token if successful otherwise, nil.
185
+ #
186
+ def authorize_ticket(ticket = self.ticket)
62
187
  begin
63
188
  response = @api.get_auth_token(ticket)
64
189
 
65
- cache_info(response['user']) # cache account_info, saves an extra API call
66
- authorize_token(response['auth_token'])
190
+ cache_info(response['user']) # saves an extra API call
191
+ cache_token(response['auth_token'])
67
192
  rescue Api::NotAuthorized
68
- false
193
+ nil
69
194
  end
70
195
  end
71
196
 
72
- # we have a token, and we have to save it and check if it is valid
73
- def authorize_token(auth_token = self.auth_token)
74
- @api.set_auth_token(auth_token)
75
- @auth_token = auth_token if authorized? # set auth token if successful
76
- end
77
-
78
- # we are authorized if we have the user's account info
79
- def authorized?
80
- info != nil
81
- end
82
-
83
- # return the cached account info, or request it
84
- def info
85
- return @info if @info
197
+ # Attempt to authorize this account using the given auth token. This
198
+ # will only succeed if the auth token has been used before, and
199
+ # be done to make login easier.
200
+ #
201
+ # @param [String] auth_token The auth token to attempt to use
202
+ # @return [Boolean] If the attempt was successful.
203
+ #
204
+ def authorize_token(auth_token)
205
+ cache_token(auth_token)
206
+ info(true) # force a refresh
86
207
 
87
- begin
88
- info = @api.get_account_info['user']
89
- cache_info(info)
90
- rescue Api::NotAuthorized, Api::InvalidInput
91
- nil
92
- end
208
+ authorized?
93
209
  end
94
210
 
95
- # return the root of the user's folder structure
96
- def root
97
- return @root if @root
98
- @root = Box::Folder.new(@api, nil, :id => 0)
211
+ # Use and cache the given auth token.
212
+ # @param [String] auth_token The auth token to cache.
213
+ # @return [String] The auth token.
214
+ def cache_token(auth_token)
215
+ @api.set_auth_token(auth_token)
216
+ @auth_token = auth_token
99
217
  end
100
218
 
101
- protected
102
-
103
- # cache account info, possibly from get_auth_token, register_new_user, or get_account_info
219
+ # Cache the account info.
220
+ # @param [Hash] info The account info to cache.
104
221
  def cache_info(info)
105
222
  @info = info
106
223
  end
@@ -3,11 +3,36 @@ require 'box/api/exceptions'
3
3
  require 'httmultiparty'
4
4
 
5
5
  module Box
6
- class Api
7
- include HTTMultiParty # a slight modification to HTTParty, adding multi-part upload support
8
-
9
- attr_accessor :base_url, :upload_url
6
+ # A wrapper and interface to the Box api. Please visit the Box developers
7
+ # site for a full explaination of what each of the Box api methods
8
+ # expect and perform.
9
+ # TODO: Link to the site.
10
10
 
11
+ class Api
12
+ # an extension of HTTParty, adding multi-part upload support
13
+ include HTTMultiParty
14
+
15
+ # @return [String] The base url of the box api.
16
+ attr_accessor :base_url
17
+
18
+ # @return [String] The upload url of the box api.
19
+ attr_accessor :upload_url
20
+
21
+ # Create a new API object using the given parameters.
22
+ #
23
+ # @note Chances are that if the Box api is updated or moves location,
24
+ # this class will no longer work. However, the option to change
25
+ # the defaults still remains.
26
+ #
27
+ # @param [String, Api] api_key The api key for your application. You can
28
+ # request one on the Box developer website at
29
+ # {http://www.box.net/developers/services}. If an {Api} instance
30
+ # is passed instead, its key is used.
31
+ #
32
+ # @param [String] url the url of the Box api.
33
+ # @param [String] upload_url the url of the upload host for the Box api.
34
+ # @param [String] version the version of the Box api in use.
35
+ #
11
36
  def initialize(key, url = 'https://box.net', upload_url = 'https://upload.box.net', version = '1.0')
12
37
  @default_params = { :api_key => key } # add the api_key to every query
13
38
 
@@ -15,20 +40,61 @@ module Box
15
40
  @upload_url = "#{ upload_url }/api/#{ version }" # uploads use a different url than everything else
16
41
  end
17
42
 
43
+ # Make a normal REST request.
44
+ #
45
+ # @param [String] expected the normal status expected to be returned.
46
+ # If the actual status does not match, an exception is thrown.
47
+ # @param [Hash] options The parameters that wish to be passed in the
48
+ # request. These should coorespond to the api specifications,
49
+ # and will be passed along with the api key and auth token.
50
+ #
51
+ # @return [Hash] A parsed version of the XML response.
52
+ #
18
53
  def query_rest(expected, options = {})
19
54
  query_raw('get', "#{ @base_url }/rest", expected, options)['response']
20
55
  end
21
56
 
22
- def query_download(query, args, options = {})
23
- url = [ "#{ @base_url }/#{ query }", @auth_token, args ].flatten.compact.join('/') # /download/<auth_token>/<arg1>/<arg2>/<etc>
24
- query_raw('get', url, nil, options) # note, expected is nil because the return will be raw data
57
+ # Make a download request.
58
+ #
59
+ # @param [String] query the operation to be performed ("download").
60
+ # @param [Array] args an array of arguments to put in the url.
61
+ # @param [Hash] options (see #query_rest)
62
+ #
63
+ # @return The raw binary data of the file.
64
+ #
65
+ def query_download(args, options = {})
66
+ # produces: /download/<auth_token>/<arg1>/<arg2>/<etc>
67
+ url = [ "#{ @base_url }/download", @auth_token, args ].flatten.compact.join('/')
68
+ query_raw('get', url, nil, options)
25
69
  end
26
70
 
71
+ # Make an upload request.
72
+ #
73
+ # @param [String] query The operation to be performed.
74
+ # @param [Array] args (see #query_download)
75
+ # @param [String] expected (see #query_rest)
76
+ # @param [Hash] options (see #query_rest)
77
+ #
78
+ # @return (see #query_rest)
79
+ #
27
80
  def query_upload(query, args, expected, options = {})
28
- url = [ "#{ @upload_url }/#{ query }", @auth_token, args ].flatten.compact.join('/') # /upload/<auth_token>/<arg1>/<arg2>/<etc>
81
+ # produces: /upload/<auth_token>/<arg1>/<arg2>/<etc>
82
+ url = [ "#{ @upload_url }/#{ query }", @auth_token, args ].flatten.compact.join('/')
29
83
  query_raw('post', url, expected, options)['response']
30
84
  end
31
85
 
86
+ # Make a raw request.
87
+ #
88
+ # @note: HTTParty will automatically parse the response from its native
89
+ # XML to a nested hash/array structure.
90
+ #
91
+ # @param ['get', 'post'] method The HTTP method to use.
92
+ # @param [String] url The url to make the request.
93
+ # @param [String] expected (see #query_rest)
94
+ # @param [Hash] options (see #query_rest)
95
+ #
96
+ # @return (see #query_rest)
97
+ #
32
98
  def query_raw(method, url, expected, options = {})
33
99
  response = case method
34
100
  when 'get'
@@ -40,6 +106,15 @@ module Box
40
106
  handle_response(response, expected)
41
107
  end
42
108
 
109
+ # Handle the response of the request.
110
+ #
111
+ # @param [Hash] response The parsed representation of the XML response.
112
+ # @param expected (see #query_rest)
113
+ #
114
+ # @return [Hash] The response if no errors were found.
115
+ # @raise [Exception, UnknownResponse] Raises an exception if the
116
+ # response status does not match the expected. This exception
117
+ # is determined by {.get_exception}
43
118
  def handle_response(response, expected = nil)
44
119
  if expected
45
120
  begin
@@ -58,83 +133,166 @@ module Box
58
133
  response
59
134
  end
60
135
 
136
+ # TODO: Add link to API documentation for all functions below.
137
+ # TODO: Document exceptions that could be thrown.
138
+
139
+ # Request a ticket for authorization
61
140
  def get_ticket
62
141
  query_rest('get_ticket_ok', :action => :get_ticket)
63
142
  end
64
143
 
144
+ # Request an auth token given a ticket.
145
+ #
146
+ # @param [String] ticket the ticket to use.
65
147
  def get_auth_token(ticket)
66
148
  query_rest('get_auth_token_ok', :action => :get_auth_token, :ticket => ticket)
67
149
  end
68
150
 
69
- # save the auth token and add it to every request
151
+ # Add the auth token to every request.
152
+ #
153
+ # @param [String] auth_token The auth token to add to every request.
70
154
  def set_auth_token(auth_token)
71
155
  @auth_token = auth_token
72
156
  @default_params[:auth_token] = auth_token
73
157
  end
74
158
 
159
+ # Request the user be logged out.
75
160
  def logout
76
161
  query_rest('logout_ok', :action => :logout)
77
162
  end
78
163
 
79
- def register_new_user(login, password)
80
- query_rest('successful_register', :action => :register_new_user, :login => login, :password => password)
164
+ # Register a new user.
165
+ #
166
+ # @param [String] email The email address to use.
167
+ # @param [String] password The password to use.
168
+ def register_new_user(email, password)
169
+ query_rest('successful_register', :action => :register_new_user, :login => email, :password => password)
81
170
  end
82
171
 
83
- def verify_registration_email(login)
84
- query_rest('email_ok', :action => :verify_registration_email, :login => login)
172
+ # Verify a registration email.
173
+ #
174
+ # @param [String] email The email address to check.
175
+ def verify_registration_email(email)
176
+ query_rest('email_ok', :action => :verify_registration_email, :login => email)
85
177
  end
86
178
 
179
+ # Get the user's account info.
87
180
  def get_account_info
88
181
  query_rest('get_account_info_ok', :action => :get_account_info)
89
182
  end
90
183
 
91
- # TODO: Use zip compression to save space
92
- def get_account_tree(folder_id = 0, *args)
184
+ # Get the entire tree of a given folder.
185
+ #
186
+ # @param [String] folder_id The id of the folder to use.
187
+ # @param [Array] args The arguments to pass along to get_account_tree.
188
+ #
189
+ # @note This function can take a long time for large folders.
190
+ # @todo Use zip compression to save bandwidth.
191
+ #
192
+ # TODO: document the possible arguments.
193
+ def get_account_tree(folder_id, *args)
93
194
  query_rest('listing_ok', :action => :get_account_tree, :folder_id => folder_id, :params => [ 'nozip' ] + args)
94
195
  end
95
196
 
197
+ # Create a new folder.
198
+ #
199
+ # @param [String] parent_id The id of the parent folder to use.
200
+ # @param [String] name The name of the newly created folder.
201
+ # @param [Integer] shared The shared state of the new folder.
96
202
  def create_folder(parent_id, name, share = 0)
97
203
  query_rest('create_ok', :action => :create_folder, :parent_id => parent_id, :name => name, :share => share)
98
204
  end
99
205
 
206
+ # Move the item to a new destination.
207
+ #
208
+ # @param ["file", "folder"] target The type of item.
209
+ # @param [String] target_id The id of the item to move.
210
+ # @param [String] destination_id The id of the parent to move to.
100
211
  def move(target, target_id, destination_id)
101
212
  query_rest('s_move_node', :action => :move, :target => target, :target_id => target_id, :destination_id => destination_id)
102
213
  end
103
214
 
215
+ # Copy the the item to a new destination.
216
+ #
217
+ # @note The api currently only supports copying files.
218
+ #
219
+ # @param ["file"] target The type of item.
220
+ # @param [String] target_id The id of the item to copy.
221
+ # @param [String] destination_id The id of the parent to copy to.
104
222
  def copy(target, target_id, destination_id)
105
223
  query_rest('s_copy_node', :action => :copy, :target => target, :target_id => target_id, :destination_id => destination_id)
106
224
  end
107
225
 
226
+ # Rename the item.
227
+ #
228
+ # @param ["file", "folder"] target The type of item.
229
+ # @param [String] target_id The id of the item to rename.
230
+ # @param [String] new_name The new name to be used.
108
231
  def rename(target, target_id, new_name)
109
232
  query_rest('s_rename_node', :action => :rename, :target => target, :target_id => target_id, :new_name => new_name)
110
233
  end
111
234
 
235
+ # Delete the item.
236
+ #
237
+ # @param ["file", "folder"] target The type of item.
238
+ # @param [String] target_id The id of the item to delete.
112
239
  def delete(target, target_id)
113
240
  query_rest('s_delete_node', :action => :delete, :target => target, :target_id => target_id)
114
241
  end
115
242
 
243
+ # Get the file info.
244
+ #
245
+ # @param [String] file_id The file id to get info for.
116
246
  def get_file_info(file_id)
117
247
  query_rest('s_get_file_info', :action => :get_file_info, :file_id => file_id)
118
248
  end
119
249
 
250
+ # Set the item description.
251
+ #
252
+ # @param ["file", "folder"] target The type of item.
253
+ # @param [String] target_id The id of the item to describe.
254
+ # @param [String] description The description to use.
120
255
  def set_description(target, target_id, description)
121
256
  query_rest('s_set_description', :action => :set_description, :target => target, :target_id => target_id, :description => description)
122
257
  end
123
258
 
259
+ # Download the file to the given path.
260
+ #
261
+ # @note You cannot download folders.
262
+ #
263
+ # @param [String] path The path to write the file to.
264
+ # @param [String] file_id The file id to download.
265
+ # @param [Optional, String] version The version of the file to download.
124
266
  def download(path, file_id, version = nil)
125
267
  ::File.open(path, 'w') do |file|
126
- file << query_download('download', [ file_id, version ]) # write the response directly to file
268
+ file << query_download([ file_id, version ]) # write the response directly to file
127
269
  end
128
270
  end
129
271
 
272
+ # Upload the file to the specified folder.
273
+ #
274
+ # @param [String] path Upload the file at the given path.
275
+ # @param [String] folder_id The folder id of the parent folder to use.
276
+ # @param [Optional, Boolean] new_copy Upload a new copy instead of overwriting.
130
277
  def upload(path, folder_id, new_copy = false)
131
278
  query_upload('upload', folder_id, 'upload_ok', :file => ::File.new(path), :new_copy => new_copy)
132
279
  end
133
280
 
281
+ # Overwrite the given file with a new one.
282
+ #
283
+ # @param [String] path (see #upload)
284
+ # @param [String] file_id Replace the file with this id.
285
+ # @param [Optional, String] name Use a new name as well.
134
286
  def overwrite(path, file_id, name = nil)
135
287
  query_upload('overwrite', file_id, 'upload_ok', :file => ::File.new(path), :file_name => name)
136
288
  end
137
289
 
290
+ # Upload a new copy of the given file.
291
+ #
292
+ # @param [String] path (see #upload)
293
+ # @param [String] file_id The id of the file to copy.
294
+ # @param [Optional, String] name Use a new name as well.
295
+ # TODO: Verfiy this does what I think it does
138
296
  def new_copy(path, file_id, name = nil)
139
297
  query_upload('new_copy', file_id, 'upload_ok', :file => ::File.new(path), :new_file_name => name)
140
298
  end