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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +16 -0
  4. data/.rubocop_todo.yml +149 -0
  5. data/.travis.yml +5 -6
  6. data/Rakefile +2 -2
  7. data/app/controllers/browse_everything_controller.rb +19 -22
  8. data/app/helpers/bootstrap_version_helper.rb +9 -11
  9. data/app/helpers/browse_everything_helper.rb +11 -22
  10. data/app/views/browse_everything/_file.html.erb +7 -11
  11. data/app/views/browse_everything/_files.html.erb +4 -7
  12. data/app/views/browse_everything/index.html.erb +1 -1
  13. data/browse-everything.gemspec +37 -34
  14. data/config/routes.rb +3 -3
  15. data/lib/browse-everything.rb +1 -1
  16. data/lib/browse_everything.rb +9 -8
  17. data/lib/browse_everything/browser.rb +4 -4
  18. data/lib/browse_everything/driver/base.rb +14 -14
  19. data/lib/browse_everything/driver/box.rb +48 -59
  20. data/lib/browse_everything/driver/dropbox.rb +10 -11
  21. data/lib/browse_everything/driver/file_system.rb +19 -24
  22. data/lib/browse_everything/driver/google_drive.rb +58 -82
  23. data/lib/browse_everything/driver/s3.rb +87 -0
  24. data/lib/browse_everything/driver/sky_drive.rb +41 -47
  25. data/lib/browse_everything/engine.rb +2 -2
  26. data/lib/browse_everything/file_entry.rb +3 -3
  27. data/lib/browse_everything/retriever.rb +19 -20
  28. data/lib/browse_everything/version.rb +1 -1
  29. data/lib/generators/browse_everything/assets_generator.rb +2 -4
  30. data/lib/generators/browse_everything/config_generator.rb +12 -12
  31. data/lib/generators/browse_everything/install_generator.rb +2 -4
  32. data/lib/generators/browse_everything/templates/browse_everything_providers.yml.example +6 -0
  33. data/spec/features/select_files_spec.rb +12 -12
  34. data/spec/features/test_compiling_stylesheets_spec.rb +2 -2
  35. data/spec/helper/browse_everything_controller_helper_spec.rb +8 -8
  36. data/spec/javascripts/jasmine_spec.rb +5 -5
  37. data/spec/javascripts/support/jasmine_helper.rb +9 -9
  38. data/spec/spec_helper.rb +26 -23
  39. data/spec/support/app/controllers/file_handler_controller.rb +3 -3
  40. data/spec/support/rake.rb +1 -1
  41. data/spec/test_app_templates/lib/generators/test_app_generator.rb +21 -22
  42. data/spec/unit/base_spec.rb +6 -6
  43. data/spec/unit/browse_everything_helper_spec.rb +9 -9
  44. data/spec/unit/browser_spec.rb +19 -19
  45. data/spec/unit/dropbox_spec.rb +44 -43
  46. data/spec/unit/file_entry_spec.rb +31 -31
  47. data/spec/unit/file_system_spec.rb +26 -26
  48. data/spec/unit/retriever_spec.rb +42 -43
  49. data/spec/unit/s3_spec.rb +77 -0
  50. data/spec/unit/sky_drive_spec.rb +31 -31
  51. data/spec/views/browse_everything/_file.html.erb_spec.rb +37 -37
  52. data/tasks/ci.rake +3 -3
  53. metadata +52 -7
  54. data/app/.DS_Store +0 -0
  55. 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>
@@ -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 = "browse-everything"
7
+ spec.name = 'browse-everything'
8
8
  spec.version = BrowseEverything::VERSION
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 = %q{AJAX/Rails engine file browser for cloud storage services}
12
- spec.summary = %q{AJAX/Rails engine file browser for cloud storage services}
13
- spec.homepage = "https://github.com/projecthydra/browse-everything"
14
- spec.license = "Apache 2"
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 = ["lib"]
19
+ spec.require_paths = ['lib']
20
20
 
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.8.6"
30
- spec.add_dependency "httparty"
31
- spec.add_development_dependency "rspec", "~> 3.0"
32
- spec.add_development_dependency "rspec-rails"
33
- spec.add_development_dependency "rspec-its"
34
- spec.add_development_dependency "simplecov"
35
- spec.add_development_dependency "bundler", "~> 1.3"
36
- spec.add_development_dependency "pry"
37
- spec.add_development_dependency "rake"
38
- spec.add_development_dependency "webmock"
39
- spec.add_development_dependency "vcr"
40
- spec.add_development_dependency "sqlite3"
41
- spec.add_development_dependency "factory_girl_rails"
42
- spec.add_development_dependency "engine_cart", '~> 0.10'
43
- spec.add_development_dependency "capybara"
44
- spec.add_development_dependency "jasmine", '~> 2.3'
45
- spec.add_development_dependency "coveralls"
46
- spec.add_development_dependency "poltergeist", "~> 1.10"
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 "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]
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
@@ -1,3 +1,3 @@
1
1
  require 'bootstrap-sass'
2
2
  require 'font-awesome-rails'
3
- require 'browse_everything'
3
+ require 'browse_everything'
@@ -1,7 +1,7 @@
1
- require "rails"
2
- require "browse_everything/version"
3
- require "browse_everything/engine"
4
- require "browse_everything/retriever"
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? or value.kind_of?(Hash)
23
+ if value.nil? || value.is_a?(Hash)
23
24
  @config = value
24
- elsif value.kind_of?(String)
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 "[DEPRECATION] `drop_box` is deprecated. Please use `dropbox` instead."
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.has_key?(:url_options)
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.to_s}"
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,session_info={})
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(path)
29
+ def contents(_path)
30
30
  []
31
31
  end
32
32
 
33
- def details(path)
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(params,data)
50
+ def connect(_params, _data)
50
51
  nil
51
52
  end
52
53
 
53
54
  private
54
55
 
55
- def callback
56
- connector_response_url(callback_options)
57
- end
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, "Box driver requires a :client_id argument"
14
+ raise BrowseEverything::InitializationError, 'Box driver requires a :client_id argument'
15
15
  end
16
16
  unless config[:client_secret]
17
- raise BrowseEverything::InitializationError, "Box driver requires a :client_secret argument"
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
- Pathname(path).join('..'),
27
- '', '..', 0, Time.now, true
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,['name','size','created_at']).collect do |f|
31
+ result += folder.items(ITEM_LIMIT, 0, %w(name size created_at)).collect do |f|
32
32
  BrowseEverything::FileEntry.new(
33
- File.join(path,f.name),#id here
34
- "#{self.key}:#{File.join(path,f.name)}",#single use link
35
- f.name,
36
- f.size,
37
- f.created_at,
38
- f.type == 'folder'
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
- #false
61
- @token.present? and @token['token'].present?
57
+ @token.present? && @token['token'].present?
62
58
  end
63
59
 
64
- def connect(params,data)
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
- session
77
- #todo error checking here
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
- begin
82
- return false unless @token.present? and @token['token'].present?
83
- new_session = RubyBox::Session.new({
84
- client_id: config[:client_id],
85
- client_secret: config[:client_secret],
86
- access_token: token
87
- })
88
- result = new_session.get( "#{RubyBox::API_URL}/users/me" )
89
- (result["status"] != 200)
90
- rescue RubyBox::AuthError => e
91
- Rails.logger.error("AuthError occured when checking token. Exception #{e.class.name} : #{e.message}. token as expired and need to refresh it")
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
- client_id: config[:client_id],
101
- client_secret: config[:client_secret],
102
- access_token: token
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
- client_id: config[:client_id],
114
- client_secret: config[:client_secret],
115
- access_token: token,
116
- refresh_token: refresh_token
117
- })
118
- RubyBox::Client.new(session)
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,:app_secret].all? { |key| config[key].present? }
13
- raise BrowseEverything::InitializationError, "Dropbox driver requires :app_key and :app_secret"
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
- [self.key,path].join(':'),
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
- [ auth_flow.start('dropbox'), @csrf ]
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, user, state = auth_flow.finish(params)
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,@csrf,'token')
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