browse-everything 0.10.5 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +16 -0
- data/.rubocop_todo.yml +149 -0
- data/.travis.yml +5 -6
- data/Rakefile +2 -2
- data/app/controllers/browse_everything_controller.rb +19 -22
- data/app/helpers/bootstrap_version_helper.rb +9 -11
- data/app/helpers/browse_everything_helper.rb +11 -22
- data/app/views/browse_everything/_file.html.erb +7 -11
- data/app/views/browse_everything/_files.html.erb +4 -7
- data/app/views/browse_everything/index.html.erb +1 -1
- data/browse-everything.gemspec +37 -34
- data/config/routes.rb +3 -3
- data/lib/browse-everything.rb +1 -1
- data/lib/browse_everything.rb +9 -8
- data/lib/browse_everything/browser.rb +4 -4
- data/lib/browse_everything/driver/base.rb +14 -14
- data/lib/browse_everything/driver/box.rb +48 -59
- data/lib/browse_everything/driver/dropbox.rb +10 -11
- data/lib/browse_everything/driver/file_system.rb +19 -24
- data/lib/browse_everything/driver/google_drive.rb +58 -82
- data/lib/browse_everything/driver/s3.rb +87 -0
- data/lib/browse_everything/driver/sky_drive.rb +41 -47
- data/lib/browse_everything/engine.rb +2 -2
- data/lib/browse_everything/file_entry.rb +3 -3
- data/lib/browse_everything/retriever.rb +19 -20
- data/lib/browse_everything/version.rb +1 -1
- data/lib/generators/browse_everything/assets_generator.rb +2 -4
- data/lib/generators/browse_everything/config_generator.rb +12 -12
- data/lib/generators/browse_everything/install_generator.rb +2 -4
- data/lib/generators/browse_everything/templates/browse_everything_providers.yml.example +6 -0
- data/spec/features/select_files_spec.rb +12 -12
- data/spec/features/test_compiling_stylesheets_spec.rb +2 -2
- data/spec/helper/browse_everything_controller_helper_spec.rb +8 -8
- data/spec/javascripts/jasmine_spec.rb +5 -5
- data/spec/javascripts/support/jasmine_helper.rb +9 -9
- data/spec/spec_helper.rb +26 -23
- data/spec/support/app/controllers/file_handler_controller.rb +3 -3
- data/spec/support/rake.rb +1 -1
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +21 -22
- data/spec/unit/base_spec.rb +6 -6
- data/spec/unit/browse_everything_helper_spec.rb +9 -9
- data/spec/unit/browser_spec.rb +19 -19
- data/spec/unit/dropbox_spec.rb +44 -43
- data/spec/unit/file_entry_spec.rb +31 -31
- data/spec/unit/file_system_spec.rb +26 -26
- data/spec/unit/retriever_spec.rb +42 -43
- data/spec/unit/s3_spec.rb +77 -0
- data/spec/unit/sky_drive_spec.rb +31 -31
- data/spec/views/browse_everything/_file.html.erb_spec.rb +37 -37
- data/tasks/ci.rake +3 -3
- metadata +52 -7
- data/app/.DS_Store +0 -0
- data/app/views/.DS_Store +0 -0
@@ -8,7 +8,7 @@
|
|
8
8
|
<div class="modal-body ev-body" tabindex="-1">
|
9
9
|
<div class="ev-browser row<%=bs2('-fluid')%>" aria-live="polite">
|
10
10
|
<div class="<%=fa3or4('fa3','fa4')%> <%=bs2or3('bs2 span','bs3 col-xs-')%>12 ev-files list">
|
11
|
-
<%= render :partial => 'files' %>
|
11
|
+
<%= render :partial => 'files' if provider.present? %>
|
12
12
|
</div>
|
13
13
|
</div>
|
14
14
|
</div>
|
data/browse-everything.gemspec
CHANGED
@@ -4,44 +4,47 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'browse_everything/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'browse-everything'
|
8
8
|
spec.version = BrowseEverything::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
9
|
+
spec.authors = ['Carolyn Cole', 'Jessie Keck', 'Michael B. Klein', 'Thomas Scherz', 'Xiaoming Wang', 'Jeremy Friesen']
|
10
|
+
spec.email = ['cam156@psu.edu', 'jkeck@stanford.edu', 'mbklein@gmail.com', 'scherztc@ucmail.uc.edu', 'xw5d@virginia.edu', 'jeremy.n.friesen@gmail.com']
|
11
|
+
spec.description = 'AJAX/Rails engine file browser for cloud storage services'
|
12
|
+
spec.summary = 'AJAX/Rails engine file browser for cloud storage services'
|
13
|
+
spec.homepage = 'https://github.com/projecthydra/browse-everything'
|
14
|
+
spec.license = 'Apache 2'
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency
|
22
|
-
spec.add_dependency
|
23
|
-
spec.add_dependency
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_dependency
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency
|
28
|
-
spec.add_dependency
|
29
|
-
spec.add_dependency
|
30
|
-
spec.add_dependency
|
31
|
-
spec.
|
32
|
-
spec.
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
41
|
-
spec.add_development_dependency
|
42
|
-
spec.add_development_dependency
|
43
|
-
spec.add_development_dependency
|
44
|
-
spec.add_development_dependency
|
45
|
-
spec.add_development_dependency
|
46
|
-
spec.add_development_dependency
|
21
|
+
spec.add_dependency 'rails', '>= 3.1'
|
22
|
+
spec.add_dependency 'google_drive'
|
23
|
+
spec.add_dependency 'dropbox-sdk', '>= 1.6.2'
|
24
|
+
spec.add_dependency 'skydrive'
|
25
|
+
spec.add_dependency 'ruby-box'
|
26
|
+
spec.add_dependency 'sass-rails'
|
27
|
+
spec.add_dependency 'bootstrap-sass'
|
28
|
+
spec.add_dependency 'font-awesome-rails'
|
29
|
+
spec.add_dependency 'google-api-client', '~> 0.9'
|
30
|
+
spec.add_dependency 'signet'
|
31
|
+
spec.add_dependency 'httparty'
|
32
|
+
spec.add_dependency 'aws-sdk'
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
34
|
+
spec.add_development_dependency 'rspec-rails'
|
35
|
+
spec.add_development_dependency 'rspec-its'
|
36
|
+
spec.add_development_dependency 'rubocop'
|
37
|
+
spec.add_development_dependency 'simplecov'
|
38
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
39
|
+
spec.add_development_dependency 'pry'
|
40
|
+
spec.add_development_dependency 'rake'
|
41
|
+
spec.add_development_dependency 'webmock'
|
42
|
+
spec.add_development_dependency 'vcr'
|
43
|
+
spec.add_development_dependency 'sqlite3'
|
44
|
+
spec.add_development_dependency 'factory_girl_rails'
|
45
|
+
spec.add_development_dependency 'engine_cart', '~> 0.10'
|
46
|
+
spec.add_development_dependency 'capybara'
|
47
|
+
spec.add_development_dependency 'jasmine', '~> 2.3'
|
48
|
+
spec.add_development_dependency 'coveralls'
|
49
|
+
spec.add_development_dependency 'poltergeist', '~> 1.10'
|
47
50
|
end
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
BrowseEverything::Engine.routes.draw do
|
2
|
-
get
|
3
|
-
match
|
4
|
-
match
|
2
|
+
get 'connect', to: 'browse_everything#auth', as: 'connector_response'
|
3
|
+
match 'resolve', to: 'browse_everything#resolve', as: 'resolver', via: [:get, :post]
|
4
|
+
match ':provider(/*path)', to: 'browse_everything#show', as: 'contents', via: [:get, :post]
|
5
5
|
root to: 'browse_everything#index'
|
6
6
|
end
|
data/lib/browse-everything.rb
CHANGED
data/lib/browse_everything.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'rails'
|
2
|
+
require 'browse_everything/version'
|
3
|
+
require 'browse_everything/engine'
|
4
|
+
require 'browse_everything/retriever'
|
5
5
|
|
6
6
|
module BrowseEverything
|
7
7
|
class InitializationError < RuntimeError; end
|
@@ -15,17 +15,18 @@ module BrowseEverything
|
|
15
15
|
autoload :SkyDrive, 'browse_everything/driver/sky_drive'
|
16
16
|
autoload :Box, 'browse_everything/driver/box'
|
17
17
|
autoload :GoogleDrive, 'browse_everything/driver/google_drive'
|
18
|
+
autoload :S3, 'browse_everything/driver/s3'
|
18
19
|
end
|
19
20
|
|
20
21
|
class << self
|
21
22
|
def configure(value)
|
22
|
-
if value.nil?
|
23
|
+
if value.nil? || value.is_a?(Hash)
|
23
24
|
@config = value
|
24
|
-
elsif value.
|
25
|
+
elsif value.is_a?(String)
|
25
26
|
@config = YAML.load(ERB.new(File.read(value)).result)
|
26
27
|
|
27
28
|
if @config.include? 'drop_box'
|
28
|
-
warn
|
29
|
+
warn '[DEPRECATION] `drop_box` is deprecated. Please use `dropbox` instead.'
|
29
30
|
@config['dropbox'] = @config.delete('drop_box')
|
30
31
|
end
|
31
32
|
|
@@ -36,7 +37,7 @@ module BrowseEverything
|
|
36
37
|
|
37
38
|
def config
|
38
39
|
if @config.nil?
|
39
|
-
configure(File.join(Rails.root.to_s,'config','browse_everything_providers.yml'))
|
40
|
+
configure(File.join(Rails.root.to_s, 'config', 'browse_everything_providers.yml'))
|
40
41
|
end
|
41
42
|
@config
|
42
43
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module BrowseEverything
|
2
2
|
class Browser
|
3
3
|
attr_reader :providers
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(opts = {})
|
6
6
|
url_options = {}
|
7
|
-
if opts.
|
7
|
+
if opts.key?(:url_options)
|
8
8
|
url_options = opts.delete(:url_options)
|
9
9
|
else
|
10
10
|
url_options = opts
|
@@ -12,12 +12,12 @@ module BrowseEverything
|
|
12
12
|
end
|
13
13
|
|
14
14
|
@providers = {}
|
15
|
-
opts.each_pair do |driver,config|
|
15
|
+
opts.each_pair do |driver, config|
|
16
16
|
begin
|
17
17
|
driver_klass = BrowseEverything::Driver.const_get((config[:driver] || driver.to_s).camelize.to_sym)
|
18
18
|
@providers[driver] = driver_klass.new(config.merge(url_options: url_options))
|
19
19
|
rescue
|
20
|
-
Rails.logger.warn "Unknown provider: #{driver
|
20
|
+
Rails.logger.warn "Unknown provider: #{driver}"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -5,8 +5,8 @@ module BrowseEverything
|
|
5
5
|
|
6
6
|
attr_reader :config, :name
|
7
7
|
attr_accessor :token
|
8
|
-
|
9
|
-
def initialize(config,
|
8
|
+
|
9
|
+
def initialize(config, _session_info = {})
|
10
10
|
@config = config
|
11
11
|
validate_config
|
12
12
|
end
|
@@ -26,11 +26,11 @@ module BrowseEverything
|
|
26
26
|
def validate_config
|
27
27
|
end
|
28
28
|
|
29
|
-
def contents(
|
29
|
+
def contents(_path)
|
30
30
|
[]
|
31
31
|
end
|
32
32
|
|
33
|
-
def details(
|
33
|
+
def details(_path)
|
34
34
|
nil
|
35
35
|
end
|
36
36
|
|
@@ -42,26 +42,26 @@ module BrowseEverything
|
|
42
42
|
false
|
43
43
|
end
|
44
44
|
|
45
|
+
# @return [Array{URI,Object}] 2 elements: the URI, and session data to store under "#{provider_name}_data"
|
45
46
|
def auth_link
|
46
47
|
[]
|
47
48
|
end
|
48
49
|
|
49
|
-
def connect(
|
50
|
+
def connect(_params, _data)
|
50
51
|
nil
|
51
52
|
end
|
52
53
|
|
53
54
|
private
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
# remove the script_name parameter from the url_options since that is causing issues
|
60
|
-
# with the route not containing the engine path in rails 4.2.0
|
61
|
-
def callback_options
|
62
|
-
config[:url_options].reject {|k,v| k == :script_name}
|
63
|
-
end
|
56
|
+
def callback
|
57
|
+
connector_response_url(callback_options)
|
58
|
+
end
|
64
59
|
|
60
|
+
# remove the script_name parameter from the url_options since that is causing issues
|
61
|
+
# with the route not containing the engine path in rails 4.2.0
|
62
|
+
def callback_options
|
63
|
+
config[:url_options].reject { |k, _v| k == :script_name }
|
64
|
+
end
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -4,38 +4,38 @@ module BrowseEverything
|
|
4
4
|
require 'ruby-box'
|
5
5
|
|
6
6
|
ITEM_LIMIT = 99999
|
7
|
-
|
7
|
+
|
8
8
|
def icon
|
9
9
|
'cloud'
|
10
10
|
end
|
11
11
|
|
12
12
|
def validate_config
|
13
13
|
unless config[:client_id]
|
14
|
-
raise BrowseEverything::InitializationError,
|
14
|
+
raise BrowseEverything::InitializationError, 'Box driver requires a :client_id argument'
|
15
15
|
end
|
16
16
|
unless config[:client_secret]
|
17
|
-
raise BrowseEverything::InitializationError,
|
17
|
+
raise BrowseEverything::InitializationError, 'Box driver requires a :client_secret argument'
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
def contents(path='')
|
22
|
-
path.sub!(/^[\/.]+/,'')
|
21
|
+
def contents(path = '')
|
22
|
+
path.sub!(/^[\/.]+/, '')
|
23
23
|
result = []
|
24
24
|
unless path.empty?
|
25
25
|
result << BrowseEverything::FileEntry.new(
|
26
|
-
|
27
|
-
|
26
|
+
Pathname(path).join('..'),
|
27
|
+
'', '..', 0, Time.now, true
|
28
28
|
)
|
29
29
|
end
|
30
30
|
folder = path.empty? ? box_client.root_folder : box_client.folder(path)
|
31
|
-
result += folder.items(ITEM_LIMIT,0,
|
31
|
+
result += folder.items(ITEM_LIMIT, 0, %w(name size created_at)).collect do |f|
|
32
32
|
BrowseEverything::FileEntry.new(
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
File.join(path, f.name), # id here
|
34
|
+
"#{key}:#{File.join(path, f.name)}", # single use link
|
35
|
+
f.name,
|
36
|
+
f.size,
|
37
|
+
f.created_at,
|
38
|
+
f.type == 'folder'
|
39
39
|
)
|
40
40
|
end
|
41
41
|
result
|
@@ -44,12 +44,9 @@ module BrowseEverything
|
|
44
44
|
def link_for(path)
|
45
45
|
file = box_client.file(path)
|
46
46
|
download_url = file.download_url
|
47
|
-
auth_header = {'Authorization' => "Bearer #{@token}"}
|
47
|
+
auth_header = { 'Authorization' => "Bearer #{@token}" }
|
48
48
|
extras = { auth_header: auth_header, expires: 1.hour.from_now, file_name: file.name, file_size: file.size.to_i }
|
49
|
-
[download_url,extras]
|
50
|
-
end
|
51
|
-
|
52
|
-
def details(f)
|
49
|
+
[download_url, extras]
|
53
50
|
end
|
54
51
|
|
55
52
|
def auth_link
|
@@ -57,68 +54,60 @@ module BrowseEverything
|
|
57
54
|
end
|
58
55
|
|
59
56
|
def authorized?
|
60
|
-
|
61
|
-
@token.present? and @token['token'].present?
|
57
|
+
@token.present? && @token['token'].present?
|
62
58
|
end
|
63
59
|
|
64
|
-
def connect(params,
|
65
|
-
access_token=oauth_client.get_access_token(params[:code])
|
66
|
-
@token = {'token' => access_token.token, 'refresh_token' => access_token.refresh_token}
|
60
|
+
def connect(params, _data)
|
61
|
+
access_token = oauth_client.get_access_token(params[:code])
|
62
|
+
@token = { 'token' => access_token.token, 'refresh_token' => access_token.refresh_token }
|
67
63
|
end
|
68
64
|
|
69
65
|
private
|
70
|
-
def oauth_client
|
71
|
-
session = RubyBox::Session.new({
|
72
|
-
client_id: config[:client_id],
|
73
|
-
client_secret: config[:client_secret]
|
74
|
-
})
|
75
66
|
|
76
|
-
|
77
|
-
|
67
|
+
def oauth_client
|
68
|
+
RubyBox::Session.new(client_id: config[:client_id],
|
69
|
+
client_secret: config[:client_secret])
|
70
|
+
# TODO: error checking here
|
78
71
|
end
|
79
72
|
|
80
73
|
def token_expired?(token)
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
return true
|
93
|
-
end
|
74
|
+
return false unless @token.present? && @token['token'].present?
|
75
|
+
new_session = RubyBox::Session.new(
|
76
|
+
client_id: config[:client_id],
|
77
|
+
client_secret: config[:client_secret],
|
78
|
+
access_token: token
|
79
|
+
)
|
80
|
+
result = new_session.get("#{RubyBox::API_URL}/users/me")
|
81
|
+
result['status'] != 200
|
82
|
+
rescue RubyBox::AuthError => e
|
83
|
+
Rails.logger.error("AuthError occured when checking token. Exception #{e.class.name} : #{e.message}. token as expired and need to refresh it")
|
84
|
+
return true
|
94
85
|
end
|
95
86
|
|
96
87
|
def refresh_token
|
97
88
|
refresh_token = @token['refresh_token']
|
98
89
|
token = @token['token']
|
99
|
-
session = RubyBox::Session.new(
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
90
|
+
session = RubyBox::Session.new(
|
91
|
+
client_id: config[:client_id],
|
92
|
+
client_secret: config[:client_secret],
|
93
|
+
access_token: token
|
94
|
+
)
|
104
95
|
access_token = session.refresh_token(refresh_token)
|
105
|
-
@token = {'token' => access_token.token, 'refresh_token' => access_token.refresh_token}
|
96
|
+
@token = { 'token' => access_token.token, 'refresh_token' => access_token.refresh_token }
|
106
97
|
end
|
107
98
|
|
108
99
|
def box_client
|
109
100
|
refresh_token if token_expired?(@token['token'])
|
110
101
|
token = @token['token']
|
111
102
|
refresh_token = @token['refresh_token']
|
112
|
-
session = RubyBox::Session.new(
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
103
|
+
session = RubyBox::Session.new(
|
104
|
+
client_id: config[:client_id],
|
105
|
+
client_secret: config[:client_secret],
|
106
|
+
access_token: token,
|
107
|
+
refresh_token: refresh_token
|
108
|
+
)
|
109
|
+
RubyBox::Client.new(session)
|
119
110
|
end
|
120
|
-
|
121
111
|
end
|
122
|
-
|
123
112
|
end
|
124
113
|
end
|
@@ -3,19 +3,18 @@ require 'dropbox_sdk'
|
|
3
3
|
module BrowseEverything
|
4
4
|
module Driver
|
5
5
|
class Dropbox < Base
|
6
|
-
|
7
6
|
def icon
|
8
7
|
'dropbox'
|
9
8
|
end
|
10
9
|
|
11
10
|
def validate_config
|
12
|
-
unless [:app_key
|
13
|
-
raise BrowseEverything::InitializationError,
|
11
|
+
unless [:app_key, :app_secret].all? { |key| config[key].present? }
|
12
|
+
raise BrowseEverything::InitializationError, 'Dropbox driver requires :app_key and :app_secret'
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
17
|
-
def contents(path='')
|
18
|
-
path.sub!(/^[\/.]+/,'')
|
16
|
+
def contents(path = '')
|
17
|
+
path.sub!(/^[\/.]+/, '')
|
19
18
|
result = []
|
20
19
|
unless path.empty?
|
21
20
|
result << BrowseEverything::FileEntry.new(
|
@@ -27,7 +26,7 @@ module BrowseEverything
|
|
27
26
|
path = info['path']
|
28
27
|
BrowseEverything::FileEntry.new(
|
29
28
|
path,
|
30
|
-
[
|
29
|
+
[key, path].join(':'),
|
31
30
|
File.basename(path),
|
32
31
|
info['bytes'],
|
33
32
|
Time.parse(info['modified']),
|
@@ -46,12 +45,12 @@ module BrowseEverything
|
|
46
45
|
end
|
47
46
|
|
48
47
|
def auth_link
|
49
|
-
[
|
48
|
+
[auth_flow.start('dropbox'), @csrf]
|
50
49
|
end
|
51
50
|
|
52
|
-
def connect(params,data)
|
51
|
+
def connect(params, data)
|
53
52
|
@csrf = data
|
54
|
-
@token,
|
53
|
+
@token, _user, _state = auth_flow.finish(params)
|
55
54
|
@token
|
56
55
|
end
|
57
56
|
|
@@ -60,15 +59,15 @@ module BrowseEverything
|
|
60
59
|
end
|
61
60
|
|
62
61
|
private
|
62
|
+
|
63
63
|
def auth_flow
|
64
64
|
@csrf ||= {}
|
65
|
-
DropboxOAuth2Flow.new(config[:app_key], config[:app_secret], callback.to_s
|
65
|
+
DropboxOAuth2Flow.new(config[:app_key], config[:app_secret], callback.to_s, @csrf, 'token')
|
66
66
|
end
|
67
67
|
|
68
68
|
def client
|
69
69
|
DropboxClient.new(token)
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
72
|
end
|
74
73
|
end
|