browse-everything 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,14 +16,14 @@ module BrowseEverything
16
16
  class << self
17
17
  private
18
18
 
19
- def klass_for(metadata)
20
- case metadata
21
- when DropboxApi::Metadata::File
22
- FileFactory
23
- else
24
- ResourceFactory
25
- end
19
+ def klass_for(metadata)
20
+ case metadata
21
+ when DropboxApi::Metadata::File
22
+ FileFactory
23
+ else
24
+ ResourceFactory
26
25
  end
26
+ end
27
27
  end
28
28
  end
29
29
 
@@ -138,44 +138,44 @@ module BrowseEverything
138
138
 
139
139
  private
140
140
 
141
- def session
142
- AuthenticationFactory.new(
143
- self.class.authentication_klass,
144
- config[:client_id],
145
- config[:client_secret]
146
- )
147
- end
141
+ def session
142
+ AuthenticationFactory.new(
143
+ self.class.authentication_klass,
144
+ config[:client_id],
145
+ config[:client_secret]
146
+ )
147
+ end
148
148
 
149
- def authenticate
150
- session.authenticate
151
- end
149
+ def authenticate
150
+ session.authenticate
151
+ end
152
152
 
153
- def authenticator
154
- @authenticator ||= authenticate
155
- end
153
+ def authenticator
154
+ @authenticator ||= authenticate
155
+ end
156
156
 
157
- def client
158
- DropboxApi::Client.new(token)
159
- end
157
+ def client
158
+ DropboxApi::Client.new(token)
159
+ end
160
160
 
161
- def redirect_uri(url_options)
162
- connector_response_url(**url_options)
163
- end
161
+ def redirect_uri(url_options)
162
+ connector_response_url(**url_options)
163
+ end
164
164
 
165
- # Ensures that the "tmp" directory is used if there is no default download
166
- # directory specified in the configuration
167
- # @return [String]
168
- def default_download_directory
169
- Rails.root.join('tmp')
170
- end
165
+ # Ensures that the "tmp" directory is used if there is no default download
166
+ # directory specified in the configuration
167
+ # @return [String]
168
+ def default_download_directory
169
+ Rails.root.join('tmp')
170
+ end
171
171
 
172
- # Retrieves the directory path for downloads used when retrieving the
173
- # resource from Dropbox
174
- # @return [String]
175
- def download_directory_path
176
- dir_path = config[:download_directory] || default_download_directory
177
- File.expand_path(dir_path)
178
- end
172
+ # Retrieves the directory path for downloads used when retrieving the
173
+ # resource from Dropbox
174
+ # @return [String]
175
+ def download_directory_path
176
+ dir_path = config[:download_directory] || default_download_directory
177
+ File.expand_path(dir_path)
178
+ end
179
179
  end
180
180
  end
181
181
  end
@@ -55,25 +55,25 @@ module BrowseEverything
55
55
 
56
56
  private
57
57
 
58
- # Construct an array of FileEntry objects for the contents of a
59
- # directory
60
- # @param real_path [String] path to the file system directory
61
- # @return [Array<BrowseEverything::FileEntry>]
62
- def make_directory_entry(real_path)
63
- entries = []
64
- entries + Dir[File.join(real_path, '*')].collect { |f| details(f) }
65
- end
58
+ # Construct an array of FileEntry objects for the contents of a
59
+ # directory
60
+ # @param real_path [String] path to the file system directory
61
+ # @return [Array<BrowseEverything::FileEntry>]
62
+ def make_directory_entry(real_path)
63
+ entries = []
64
+ entries + Dir[File.join(real_path, '*')].collect { |f| details(f) }
65
+ end
66
66
 
67
- def make_pathname(path)
68
- Pathname.new(File.expand_path(path)).relative_path_from(Pathname.new(config[:home]))
69
- end
67
+ def make_pathname(path)
68
+ Pathname.new(File.expand_path(path)).relative_path_from(Pathname.new(config[:home]))
69
+ end
70
70
 
71
- def file_size(path)
72
- File.size(path).to_i
73
- rescue StandardError => error
74
- Rails.logger.error "Failed to find the file size for #{path}: #{error}"
75
- 0
76
- end
71
+ def file_size(path)
72
+ File.size(path).to_i
73
+ rescue StandardError => error
74
+ Rails.logger.error "Failed to find the file size for #{path}: #{error}"
75
+ 0
76
+ end
77
77
  end
78
78
  end
79
79
  end
@@ -191,50 +191,50 @@ module BrowseEverything
191
191
 
192
192
  private
193
193
 
194
- def client_secrets
195
- {
196
- Google::Auth::ClientId::WEB_APP => {
197
- Google::Auth::ClientId::CLIENT_ID => config[:client_id],
198
- Google::Auth::ClientId::CLIENT_SECRET => config[:client_secret]
199
- }
194
+ def client_secrets
195
+ {
196
+ Google::Auth::ClientId::WEB_APP => {
197
+ Google::Auth::ClientId::CLIENT_ID => config[:client_id],
198
+ Google::Auth::ClientId::CLIENT_SECRET => config[:client_secret]
200
199
  }
201
- end
200
+ }
201
+ end
202
202
 
203
- # This is required for using the googleauth Gem
204
- # @see http://www.rubydoc.info/gems/googleauth/Google/Auth/Stores/FileTokenStore FileTokenStore for googleauth
205
- # @return [Tempfile] temporary file within which to cache credentials
206
- def file_token_store_path
207
- Tempfile.new('gdrive.yaml')
208
- end
203
+ # This is required for using the googleauth Gem
204
+ # @see http://www.rubydoc.info/gems/googleauth/Google/Auth/Stores/FileTokenStore FileTokenStore for googleauth
205
+ # @return [Tempfile] temporary file within which to cache credentials
206
+ def file_token_store_path
207
+ Tempfile.new('gdrive.yaml')
208
+ end
209
209
 
210
- def scope
211
- Google::Apis::DriveV3::AUTH_DRIVE
212
- end
210
+ def scope
211
+ Google::Apis::DriveV3::AUTH_DRIVE
212
+ end
213
213
 
214
- # Provides the user ID for caching access tokens
215
- # (This is a hack which attempts to anonymize the access tokens)
216
- # @return [String] the ID for the user
217
- def user_id
218
- 'current_user'
219
- end
214
+ # Provides the user ID for caching access tokens
215
+ # (This is a hack which attempts to anonymize the access tokens)
216
+ # @return [String] the ID for the user
217
+ def user_id
218
+ 'current_user'
219
+ end
220
220
 
221
- # Please see https://developers.google.com/drive/v3/web/manage-downloads
222
- # @param id [String] the ID for the Google Drive File
223
- # @return [String] the URL for the file download
224
- def download_url(id)
225
- "https://www.googleapis.com/drive/v3/files/#{id}?alt=media"
226
- end
221
+ # Please see https://developers.google.com/drive/v3/web/manage-downloads
222
+ # @param id [String] the ID for the Google Drive File
223
+ # @return [String] the URL for the file download
224
+ def download_url(id)
225
+ "https://www.googleapis.com/drive/v3/files/#{id}?alt=media"
226
+ end
227
227
 
228
- # Restore the credentials for the Google API
229
- # @param access_token [String] the access token redeemed using an authorization code
230
- # @return Credentials credentials restored from a cached access token
231
- def restore_credentials(access_token)
232
- client = Auth::Google::Credentials.new
233
- client.client_id = client_id.id
234
- client.client_secret = client_id.secret
235
- client.update_token!('access_token' => access_token)
236
- @credentials = client
237
- end
228
+ # Restore the credentials for the Google API
229
+ # @param access_token [String] the access token redeemed using an authorization code
230
+ # @return Credentials credentials restored from a cached access token
231
+ def restore_credentials(access_token)
232
+ client = Auth::Google::Credentials.new
233
+ client.client_id = client_id.id
234
+ client.client_secret = client_id.secret
235
+ client.update_token!('access_token' => access_token)
236
+ @credentials = client
237
+ end
238
238
  end
239
239
  end
240
240
  end
@@ -79,79 +79,79 @@ module BrowseEverything
79
79
 
80
80
  private
81
81
 
82
- def strip(path)
83
- path.sub %r{^/?(.+?)/?$}, '\1'
84
- end
82
+ def strip(path)
83
+ path.sub %r{^/?(.+?)/?$}, '\1'
84
+ end
85
85
 
86
- def from_base(key)
87
- Pathname.new(key).relative_path_from(Pathname.new(config[:base].to_s)).to_s
88
- end
86
+ def from_base(key)
87
+ Pathname.new(key).relative_path_from(Pathname.new(config[:base].to_s)).to_s
88
+ end
89
89
 
90
- def full_path(path)
91
- config[:base].present? ? File.join(config[:base], path) : path
92
- end
90
+ def full_path(path)
91
+ config[:base].present? ? File.join(config[:base], path) : path
92
+ end
93
93
 
94
- def aws_config
95
- result = {}
96
- result[:credentials] = Aws::Credentials.new(config[:app_key], config[:app_secret]) if config[:app_key].present?
97
- result[:region] = config[:region] if config.key?(:region)
98
- result
99
- end
94
+ def aws_config
95
+ result = {}
96
+ result[:credentials] = Aws::Credentials.new(config[:app_key], config[:app_secret]) if config[:app_key].present?
97
+ result[:region] = config[:region] if config.key?(:region)
98
+ result
99
+ end
100
100
 
101
- def session
102
- AuthenticationFactory.new(
103
- self.class.authentication_klass,
104
- aws_config
105
- )
106
- end
101
+ def session
102
+ AuthenticationFactory.new(
103
+ self.class.authentication_klass,
104
+ aws_config
105
+ )
106
+ end
107
107
 
108
- def authenticate
109
- session.authenticate
110
- end
108
+ def authenticate
109
+ session.authenticate
110
+ end
111
111
 
112
- def client
113
- @client ||= authenticate
114
- end
112
+ def client
113
+ @client ||= authenticate
114
+ end
115
115
 
116
- # Construct a BrowseEverything::FileEntry object
117
- # @param name [String]
118
- # @param size [String]
119
- # @param date [DateTime]
120
- # @param dir [String]
121
- # @return [BrowseEverything::FileEntry]
122
- def entry_for(name, size, date, dir)
123
- BrowseEverything::FileEntry.new(name, [key, name].join(':'), File.basename(name), size, date, dir)
124
- end
116
+ # Construct a BrowseEverything::FileEntry object
117
+ # @param name [String]
118
+ # @param size [String]
119
+ # @param date [DateTime]
120
+ # @param dir [String]
121
+ # @return [BrowseEverything::FileEntry]
122
+ def entry_for(name, size, date, dir)
123
+ BrowseEverything::FileEntry.new(name, [key, name].join(':'), File.basename(name), size, date, dir)
124
+ end
125
125
 
126
- # Populate the entries with FileEntry objects from an S3 listing
127
- # @param listing [Seahorse::Client::Response]
128
- def add_directories(listing)
129
- listing.common_prefixes.each do |prefix|
130
- new_entry = entry_for(from_base(prefix.prefix), 0, Time.current, true)
131
- @entries << new_entry unless new_entry.nil?
132
- end
126
+ # Populate the entries with FileEntry objects from an S3 listing
127
+ # @param listing [Seahorse::Client::Response]
128
+ def add_directories(listing)
129
+ listing.common_prefixes.each do |prefix|
130
+ new_entry = entry_for(from_base(prefix.prefix), 0, Time.current, true)
131
+ @entries << new_entry unless new_entry.nil?
133
132
  end
133
+ end
134
134
 
135
- # Given a listing and a S3 listing and path, populate the entries
136
- # @param listing [Seahorse::Client::Response]
137
- # @param path [String]
138
- def add_files(listing, path)
139
- listing.contents.each do |entry|
140
- key = from_base(entry.key)
141
- new_entry = entry_for(key, entry.size, entry.last_modified, false)
142
- @entries << new_entry unless strip(key) == strip(path) || new_entry.nil?
143
- end
135
+ # Given a listing and a S3 listing and path, populate the entries
136
+ # @param listing [Seahorse::Client::Response]
137
+ # @param path [String]
138
+ def add_files(listing, path)
139
+ listing.contents.each do |entry|
140
+ key = from_base(entry.key)
141
+ new_entry = entry_for(key, entry.size, entry.last_modified, false)
142
+ @entries << new_entry unless strip(key) == strip(path) || new_entry.nil?
144
143
  end
144
+ end
145
145
 
146
- # For a given path to a S3 resource, retrieve the listing object and
147
- # construct the file entries
148
- # @param path [String]
149
- def generate_listing(path)
150
- client
151
- listing = client.list_objects(bucket: config[:bucket], delimiter: '/', prefix: full_path(path))
152
- add_directories(listing)
153
- add_files(listing, path)
154
- end
146
+ # For a given path to a S3 resource, retrieve the listing object and
147
+ # construct the file entries
148
+ # @param path [String]
149
+ def generate_listing(path)
150
+ client
151
+ listing = client.list_objects(bucket: config[:bucket], delimiter: '/', prefix: full_path(path))
152
+ add_directories(listing)
153
+ add_files(listing, path)
154
+ end
155
155
  end
156
156
  end
157
157
  end
@@ -15,7 +15,7 @@ module BrowseEverything
15
15
  end
16
16
 
17
17
  def relative_parent_path?
18
- name =~ /^\.\.?$/ ? true : false
18
+ name.match?(/^\.\.?$/)
19
19
  end
20
20
 
21
21
  def container?
@@ -89,81 +89,81 @@ module BrowseEverything
89
89
 
90
90
  private
91
91
 
92
- # Extract and parse options used to download a file or resource from an HTTP API
93
- # @param options [Hash]
94
- # @return [Hash]
95
- def extract_download_options(options)
96
- url = options.fetch('url')
97
-
98
- # This avoids the potential for a KeyError
99
- headers = options.fetch('headers', {}) || {}
100
-
101
- file_size_value = options.fetch('file_size', 0)
102
- file_size = file_size_value.to_i
103
-
104
- output = {
105
- url: ::Addressable::URI.parse(url),
106
- headers: headers,
107
- file_size: file_size
108
- }
109
-
110
- output[:file_size] = get_file_size(output) if output[:file_size] < 1
111
- output
112
- end
92
+ # Extract and parse options used to download a file or resource from an HTTP API
93
+ # @param options [Hash]
94
+ # @return [Hash]
95
+ def extract_download_options(options)
96
+ url = options.fetch('url')
113
97
 
114
- # Retrieve the file from the file system
115
- # @param options [Hash]
116
- def retrieve_file(options)
117
- file_uri = options.fetch(:url)
118
- file_size = options.fetch(:file_size)
119
-
120
- retrieved = 0
121
- File.open(file_uri.path, 'rb') do |f|
122
- until f.eof?
123
- chunk = f.read(chunk_size)
124
- retrieved += chunk.length
125
- yield(chunk, retrieved, file_size)
126
- end
127
- end
128
- end
98
+ # This avoids the potential for a KeyError
99
+ headers = options.fetch('headers', {}) || {}
129
100
 
130
- # Retrieve a resource over the HTTP
131
- # @param options [Hash]
132
- def retrieve_http(options)
133
- file_size = options.fetch(:file_size)
134
- headers = options.fetch(:headers)
135
- url = options.fetch(:url)
136
- retrieved = 0
137
-
138
- request = Typhoeus::Request.new(url.to_s, method: :get, headers: headers)
139
- request.on_headers do |response|
140
- raise DownloadError.new("#{self.class}: Failed to download #{url}: Status Code: #{response.code}", response) unless response.code == 200
141
- end
142
- request.on_body do |chunk|
143
- retrieved += chunk.bytesize
101
+ file_size_value = options.fetch('file_size', 0)
102
+ file_size = file_size_value.to_i
103
+
104
+ output = {
105
+ url: ::Addressable::URI.parse(url),
106
+ headers: headers,
107
+ file_size: file_size
108
+ }
109
+
110
+ output[:file_size] = get_file_size(output) if output[:file_size] < 1
111
+ output
112
+ end
113
+
114
+ # Retrieve the file from the file system
115
+ # @param options [Hash]
116
+ def retrieve_file(options)
117
+ file_uri = options.fetch(:url)
118
+ file_size = options.fetch(:file_size)
119
+
120
+ retrieved = 0
121
+ File.open(file_uri.path, 'rb') do |f|
122
+ until f.eof?
123
+ chunk = f.read(chunk_size)
124
+ retrieved += chunk.length
144
125
  yield(chunk, retrieved, file_size)
145
126
  end
146
- request.run
147
127
  end
128
+ end
148
129
 
149
- # Retrieve the file size
150
- # @param options [Hash]
151
- # @return [Integer] the size of the requested file
152
- def get_file_size(options)
153
- url = options.fetch(:url)
154
- headers = options.fetch(:headers)
155
- file_size = options.fetch(:file_size)
156
-
157
- case url.scheme
158
- when 'file'
159
- File.size(url.path)
160
- when /https?/
161
- response = Typhoeus.head(url.to_s, headers: headers)
162
- length_value = response.headers['Content-Length'] || file_size
163
- length_value.to_i
164
- else
165
- raise URI::BadURIError, "Unknown URI scheme: #{url.scheme}"
166
- end
130
+ # Retrieve a resource over the HTTP
131
+ # @param options [Hash]
132
+ def retrieve_http(options)
133
+ file_size = options.fetch(:file_size)
134
+ headers = options.fetch(:headers)
135
+ url = options.fetch(:url)
136
+ retrieved = 0
137
+
138
+ request = Typhoeus::Request.new(url.to_s, method: :get, headers: headers)
139
+ request.on_headers do |response|
140
+ raise DownloadError.new("#{self.class}: Failed to download #{url}: Status Code: #{response.code}", response) unless response.code == 200
167
141
  end
142
+ request.on_body do |chunk|
143
+ retrieved += chunk.bytesize
144
+ yield(chunk, retrieved, file_size)
145
+ end
146
+ request.run
147
+ end
148
+
149
+ # Retrieve the file size
150
+ # @param options [Hash]
151
+ # @return [Integer] the size of the requested file
152
+ def get_file_size(options)
153
+ url = options.fetch(:url)
154
+ headers = options.fetch(:headers)
155
+ file_size = options.fetch(:file_size)
156
+
157
+ case url.scheme
158
+ when 'file'
159
+ File.size(url.path)
160
+ when /https?/
161
+ response = Typhoeus.head(url.to_s, headers: headers)
162
+ length_value = response.headers['Content-Length'] || file_size
163
+ length_value.to_i
164
+ else
165
+ raise URI::BadURIError, "Unknown URI scheme: #{url.scheme}"
166
+ end
167
+ end
168
168
  end
169
169
  end