browse-everything 1.6.1 → 2.0.0.alpha.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: faa729e0e6ae6d2ae76c0c9364b44017d689bbb89153b3c1e98bde8c17fa1427
4
- data.tar.gz: 7a29fe7df1a1dd5bdd309e23e4edc22af28d3fb618bceaf01d852537d37fdb3b
3
+ metadata.gz: 64351da415814ba91aa2beebfc70fa27cbcc7c09ba0175f07425870b5ff4c364
4
+ data.tar.gz: 4908e6bd8ec3c2e6801fe112f3fc9458dd3ccb20b3c5e5a538a813659ddf9ea3
5
5
  SHA512:
6
- metadata.gz: 4a97f843dafad43ddb8a58cf30f663d586dcdecaec0ba1fde64f38c2189c6a3c731d9fd0e1c9c39437ce63f8ad294ded4befac02d651b9de2063eedf3b13311b
7
- data.tar.gz: 487830c4ba65dbd1810774a87fef7ecd4202e805a4153bbfdb4c333e9c833afdcfaab24de26e285c198e2bc29d1ea944f387bf1011cb21c76e697da88a23e2d3
6
+ metadata.gz: 1d14bf7d52f5d04fcffda8ced44b90c78aab2f9288b059a930b0c7a3c183a1b0a3c3be13ad2dc4e1e8bb780fc9744078a08ecea3988d92d3e1d6931956618fcd
7
+ data.tar.gz: 24ee1844450045c9985514d9f06e3db47f5275fe8ce9d2e0104e86af39a0adb931628e25e68b1dfb25fc7d9d4dc523ba73264aff12baae10df69c3573950fb4a
data/Gemfile CHANGED
@@ -9,6 +9,10 @@ group :development, :test do
9
9
  gem 'pry-byebug' unless ENV['CI']
10
10
  end
11
11
 
12
+ # "soft"/"optional" dependency, but needed for our tests of dropbox driver to pass
13
+ gem 'dropbox_api', '>= 0.1.20'
14
+ gem 'ruby-box'
15
+
12
16
  # == Extra dependencies for dummy test app ==
13
17
  #
14
18
  # Extra dependencies for dummy test app are in .gemspec as a development dependency
@@ -25,12 +29,6 @@ end
25
29
 
26
30
  ENV['RAILS_VERSION'] ||= "8.0.0"
27
31
 
28
- # json 3 dropped the quirks_mode option that ActiveSupport before 8.1 passes
29
- # when encoding, so Hash#to_json raises ArgumentError under it.
30
- if ENV['RAILS_VERSION'] != 'edge' && Gem::Version.new(ENV['RAILS_VERSION']) < Gem::Version.new('8.1')
31
- gem 'json', '< 3'
32
- end
33
-
34
32
  if ENV['RAILS_VERSION']
35
33
  if ENV['RAILS_VERSION'] == 'edge'
36
34
  gem 'rails', github: 'rails/rails'
data/README.md CHANGED
@@ -24,6 +24,31 @@ download the files.
24
24
 
25
25
  **This gem does not depend on hydra-head**
26
26
 
27
+ ## Certain drivers needing maintenance require extra setup
28
+
29
+ Certain drivers need additional development work if they are to be fully
30
+ supported again, and for now require extra opt-in setup.
31
+
32
+ ### Dropbox
33
+
34
+ The driver has a dependency on unmaintained dropbox_api gem with it's [own
35
+ dependency on old unmaintained `oauth2` 1.x](https://github.com/Jesus/dropbox_api/issues/96), so requires some opt-in setup and configuration. https://github.com/samvera/browse-everything/pull/448
36
+
37
+ * Add `dropbox_api, '>= 0.1.20'` to your Gemfile.
38
+ * Add `require 'browse_everything/driver/dropbox'` to a startup file, eg
39
+ `config/application.rb`.
40
+
41
+ ### Box.com
42
+
43
+ The driver uses unmaintained [ruby-box](https://github.com/attachmentsme/ruby-box)
44
+ gem, which should probably be replaced with [boxr](https://github.com/cburnette/boxr).
45
+ See unfinished work at https://github.com/samvera/browse-everything/pull/185
46
+
47
+ * Add `ruby-box` to your Gemfile.
48
+ * Add `require 'browse_everything/driver/box'` to a startup file, eg
49
+ `config/application.rb`.
50
+
51
+
27
52
  ## Technical Debt/Legacy warning
28
53
 
29
54
  This project has been receiving very limited maintenance for at least 2-4 years
@@ -323,12 +323,7 @@ $(function () {
323
323
 
324
324
  $(document).on('click', 'button.ev-submit', function (event) {
325
325
  event.preventDefault();
326
- // button('loading') is Bootstrap 3's button plugin. When jQuery UI's
327
- // button widget owns $.fn.button instead, it throws on the call and the
328
- // selection is never submitted. startWait() disables the button either way.
329
- if ($.fn.button && $.fn.button.Constructor) {
330
- $(this).button('loading');
331
- }
326
+ $(this).button('loading');
332
327
  startWait();
333
328
  $('form.ev-submit-form').append(Array.from(selected_files.values()));
334
329
  var main_form = $(this).closest('form');
@@ -20,12 +20,9 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'addressable', '~> 2.5'
22
22
  spec.add_dependency 'aws-sdk-s3'
23
- spec.add_dependency 'dropbox_api', '>= 0.1.20'
24
23
  spec.add_dependency 'google-apis-drive_v3'
25
24
  spec.add_dependency 'googleauth', '>= 0.6.6', '< 2.0'
26
25
  spec.add_dependency 'rails', '>= 4.2', '< 8.1'
27
- spec.add_dependency 'ruby-box'
28
- spec.add_dependency 'signet', '~> 0.8'
29
26
  spec.add_dependency 'faraday', "~> 2.0"
30
27
 
31
28
  # Development dependencies include dependencies necessary for running
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ruby-box'
4
3
  require_relative 'authentication_factory'
5
4
 
5
+ begin
6
+ gem 'ruby-box'
7
+ rescue Gem::LoadError => e
8
+ new_raise = Gem::LoadError.new("Loading BrowseEverything::Driver:Box requires the availability of gem ruby-box #{e.requirement}, please add it to your Gemfile")
9
+ new_raise.requirement = e.requirement
10
+ raise new_raise, cause: nil # cause is confusing and unneeded here.
11
+ end
12
+
6
13
  module BrowseEverything
7
14
  module Driver
8
15
  # Driver for accessing the Box API (https://www.box.com/home)
@@ -1,9 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'tmpdir'
4
- require 'dropbox_api'
5
4
  require_relative 'authentication_factory'
6
5
 
6
+ # We have an unspecified "optional" dependency, not great but it's what we got
7
+ begin
8
+ gem 'dropbox_api', '>= 0.1.20'
9
+ rescue Gem::LoadError => e
10
+ new_raise = Gem::LoadError.new("Loading BrowseEverything::Driver:Dropbox requires the availability of gem dropbox_api '#{e.requirement}', please add it to your Gemfile")
11
+ new_raise.requirement = e.requirement
12
+ raise new_raise, cause: nil # cause is confusing and unneeded here.
13
+ end
14
+
7
15
  module BrowseEverything
8
16
  module Driver
9
17
  class Dropbox < Base
@@ -55,19 +55,17 @@ module BrowseEverything
55
55
  def link_for(path)
56
56
  obj = bucket.object(full_path(path))
57
57
 
58
- response_type = config[:response_type].to_sym
59
- url = case response_type
58
+ extras = {
59
+ file_name: File.basename(path),
60
+ expires: (config[:expires_in] if config[:response_type] == :signed_url)
61
+ }.compact
62
+
63
+ url = case config[:response_type].to_sym
60
64
  when :signed_url then obj.presigned_url(:get, expires_in: config[:expires_in])
61
65
  when :public_url then obj.public_url
62
66
  when :s3_uri then "s3://#{obj.bucket_name}/#{obj.key}"
63
67
  end
64
68
 
65
- extras = {
66
- file_name: File.basename(path),
67
- file_size: object_size(obj),
68
- expires: (signed_url_expiry(url) if response_type == :signed_url)
69
- }.compact
70
-
71
69
  [url, extras]
72
70
  end
73
71
 
@@ -81,26 +79,6 @@ module BrowseEverything
81
79
 
82
80
  private
83
81
 
84
- # The size is a convenience for consumers, so credentials that can list
85
- # but not read an object (enough for an :s3_uri link) leave it out
86
- # rather than fail the link.
87
- def object_size(obj)
88
- obj.content_length
89
- rescue Aws::S3::Errors::ServiceError, Seahorse::Client::NetworkingError
90
- nil
91
- end
92
-
93
- # Retriever#retrieve parses `expires` as a time, so send when the link
94
- # expires, as the Box and Google Drive drivers do. It is read from the
95
- # signed URL itself because the SDK can sign for less than expires_in,
96
- # for example when the signing credentials are temporary.
97
- def signed_url_expiry(url)
98
- params = Rack::Utils.parse_query(URI(url).query)
99
- return unless params['X-Amz-Date'] && params['X-Amz-Expires']
100
-
101
- Time.strptime(params['X-Amz-Date'], '%Y%m%dT%H%M%S%z') + params['X-Amz-Expires'].to_i
102
- end
103
-
104
82
  def strip(path)
105
83
  path.sub %r{^/?(.+?)/?$}, '\1'
106
84
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrowseEverything
4
- VERSION = '1.6.1'
4
+ VERSION = '2.0.0.alpha.1'
5
5
  end
@@ -12,11 +12,13 @@ module BrowseEverything
12
12
  module Driver
13
13
  autoload :Base, 'browse_everything/driver/base'
14
14
  autoload :FileSystem, 'browse_everything/driver/file_system'
15
- autoload :Dropbox, 'browse_everything/driver/dropbox'
16
- autoload :Box, 'browse_everything/driver/box'
17
15
  autoload :GoogleDrive, 'browse_everything/driver/google_drive'
18
16
  autoload :S3, 'browse_everything/driver/s3'
19
17
 
18
+ # Intentionally require explicit require, as it has a non-declared dependency
19
+ # autoload :Dropbox, 'browse_everything/driver/dropbox'
20
+ # autoload :Box, 'browse_everything/driver/box'
21
+
20
22
  # Access the sorter set for the base driver class
21
23
  # @return [Proc]
22
24
  def sorter
@@ -2,16 +2,10 @@
2
2
  # To make browse-everything aware of a provider, uncomment the info for that provider and add your API key information.
3
3
  # The file_system provider can be a path to any directory on the server where your application is running.
4
4
  #
5
- # dropbox:
6
- # client_id: YOUR_DROPBOX_APP_KEY
7
- # client_secret: YOUR_DROPBOX_APP_SECRET
8
- # download_directory: tmp/
9
- # box:
10
- # client_id: YOUR_BOX_CLIENT_ID
11
- # client_secret: YOUR_BOX_CLIENT_SECRET
12
5
  # google_drive:
13
6
  # client_id: YOUR_GOOGLE_API_CLIENT_ID
14
7
  # client_secret: YOUR_GOOGLE_API_CLIENT_SECRET
8
+ #
15
9
  # s3:
16
10
  # bucket: YOUR_AWS_S3_BUCKET
17
11
  # response_type: signed_url # set to :public_url for public urls or :s3_uri for an s3://BUCKET/KEY uri
@@ -20,3 +14,22 @@
20
14
  # app_secret: YOUR_AWS_S3_SECRET # explicitly here, or left out to use system-configured
21
15
  # region: YOUR_AWS_S3_REGION # defaults.
22
16
  # See https://aws.amazon.com/blogs/security/a-new-and-standardized-way-to-manage-credentials-in-the-aws-sdks/
17
+ #
18
+ # file_system:
19
+ # allow_relative_home: true
20
+ # home: ./browseable_files
21
+ #
22
+ # # Note: dropbox requires manual addition of `dropbox_api` gem to Gemfile, and
23
+ # # `require 'browse_everything/driver/dropbox'` in a startup file.
24
+ #
25
+ # dropbox:
26
+ # client_id: YOUR_DROPBOX_APP_KEY
27
+ # client_secret: YOUR_DROPBOX_APP_SECRET
28
+ # download_directory: tmp/
29
+ #
30
+ # # Note: box requires addition of `ruby-box` to Gemfile, and
31
+ # # `require 'browse_everything/driver/box'` in a startup file.
32
+ #
33
+ # box:
34
+ # client_id: YOUR_BOX_CLIENT_ID
35
+ # client_secret: YOUR_BOX_CLIENT_SECRET
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+ #
3
+ require 'browse_everything/driver/dropbox'
2
4
 
3
5
  require File.expand_path('../spec_helper', __dir__)
4
6
 
@@ -4,7 +4,7 @@ include BrowserConfigHelper
4
4
 
5
5
  describe BrowseEverything::Browser do
6
6
  let(:file_config) do
7
- "file_system:\n home: '/file/config/home'\ndropbox:\n client_id: 'DropboxId'\n client_secret: 'DropboxClientSecret'\n download_directory: 'tmp/'"
7
+ "file_system:\n home: '/file/config/home'\ngoogle_drive:\n client_id: 'GoogleDriveId'\n client_secret: 'GoogleDriveClientSecret'\n download_directory: 'tmp/'"
8
8
  end
9
9
 
10
10
  let(:global_config) do
@@ -12,7 +12,7 @@ describe BrowseEverything::Browser do
12
12
  file_system: {
13
13
  home: '/global/config/home'
14
14
  },
15
- dropbox: {
15
+ google_drive: {
16
16
  client_id: 'DropboxId',
17
17
  client_secret: 'DropboxClientSecret',
18
18
  download_directory: 'tmp/'
@@ -25,9 +25,9 @@ describe BrowseEverything::Browser do
25
25
  file_system: {
26
26
  home: '/local/config/home'
27
27
  },
28
- dropbox: {
29
- client_id: 'DropboxId',
30
- client_secret: 'DropboxClientSecret',
28
+ google_drive: {
29
+ client_id: 'GoogleDriveId',
30
+ client_secret: 'GoogleDriveClientSecret',
31
31
  download_directory: 'tmp/'
32
32
  },
33
33
  url_options: url_options
@@ -43,9 +43,9 @@ describe BrowseEverything::Browser do
43
43
  end
44
44
 
45
45
  it 'has 2 providers' do
46
- expect(browser.providers.keys).to eq(%w[file_system dropbox])
46
+ expect(browser.providers.keys).to eq(%w[file_system google_drive])
47
47
  expect(browser.providers[:file_system]).to be_a BrowseEverything::Driver::FileSystem
48
- expect(browser.providers[:dropbox]).to be_a BrowseEverything::Driver::Dropbox
48
+ expect(browser.providers[:google_drive]).to be_a BrowseEverything::Driver::GoogleDrive
49
49
  end
50
50
 
51
51
  it 'uses the file configuration' do
@@ -60,9 +60,9 @@ describe BrowseEverything::Browser do
60
60
  before { BrowseEverything.configure(global_config) }
61
61
 
62
62
  it 'has 2 providers' do
63
- expect(browser.providers.keys).to eq(%w[file_system dropbox])
63
+ expect(browser.providers.keys).to eq(%w[file_system google_drive])
64
64
  expect(browser.providers[:file_system]).to be_a BrowseEverything::Driver::FileSystem
65
- expect(browser.providers[:dropbox]).to be_a BrowseEverything::Driver::Dropbox
65
+ expect(browser.providers[:google_drive]).to be_a BrowseEverything::Driver::GoogleDrive
66
66
  end
67
67
 
68
68
  it 'uses the global configuration' do
@@ -75,9 +75,9 @@ describe BrowseEverything::Browser do
75
75
  let(:browser) { described_class.new(local_config) }
76
76
 
77
77
  it 'has 2 providers' do
78
- expect(browser.providers.keys).to eq(%w[file_system dropbox])
78
+ expect(browser.providers.keys).to eq(%w[file_system google_drive])
79
79
  expect(browser.providers[:file_system]).to be_a BrowseEverything::Driver::FileSystem
80
- expect(browser.providers[:dropbox]).to be_a BrowseEverything::Driver::Dropbox
80
+ expect(browser.providers[:google_drive]).to be_a BrowseEverything::Driver::GoogleDrive
81
81
  end
82
82
 
83
83
  it 'uses the local configuration' do
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'browse_everything/driver/box'
4
+
3
5
  include BrowserConfigHelper
4
6
 
5
7
  describe BrowseEverything::Driver::Box do
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'browse_everything/driver/dropbox'
4
+
3
5
  include BrowserConfigHelper
4
6
 
5
7
  describe BrowseEverything::Driver::Dropbox do
@@ -134,68 +134,28 @@ describe BrowseEverything::Driver::S3 do
134
134
  context 'when retrieving the link for an asset' do
135
135
  subject { contents[2] }
136
136
 
137
- let(:signed_at) { Time.now.utc.change(usec: 0) }
138
- let(:presigned_url) do
139
- "https://s3.amazonaws.com/presigned_url?X-Amz-Date=#{signed_at.strftime('%Y%m%dT%H%M%SZ')}&X-Amz-Expires=3600"
140
- end
141
-
142
137
  before do
143
138
  object = instance_double(Aws::S3::Object)
144
- allow(object).to receive(:presigned_url).and_return(presigned_url)
139
+ allow(object).to receive(:presigned_url).and_return('https://s3.amazonaws.com/presigned_url')
145
140
  allow(object).to receive(:public_url).and_return('https://s3.amazonaws.com/public_url')
146
141
  allow(object).to receive(:bucket_name).and_return('s3.bucket')
147
142
  allow(object).to receive(:key).and_return('foo/quux.png')
148
- allow(object).to receive(:content_length).and_return(1_511_860)
149
143
  allow(provider.bucket).to receive(:object).and_return(object)
150
144
  end
151
145
 
152
146
  it ':signed_url' do
153
147
  provider.config[:response_type] = :signed_url
154
- expect(provider.link_for('foo/quux.png')).to eq [presigned_url, { file_name: 'quux.png', file_size: 1_511_860, expires: signed_at + 3600 }]
155
- end
156
-
157
- it ':signed_url reports the lifetime the URL was signed for, not expires_in' do
158
- provider.config[:response_type] = :signed_url
159
- provider.config[:expires_in] = 14400
160
- expect(provider.link_for('foo/quux.png').last[:expires]).to eq signed_at + 3600
161
- end
162
-
163
- it ':signed_url configured as a string still sends the expiry' do
164
- provider.config[:response_type] = 'signed_url'
165
- expect(provider.link_for('foo/quux.png').last[:expires]).to eq signed_at + 3600
166
- end
167
-
168
- [Aws::S3::Errors::Forbidden.new(nil, 'Forbidden'), Seahorse::Client::NetworkingError.new(Errno::ECONNRESET.new)].each do |error|
169
- it "leaves out the size when reading it raises #{error.class}" do
170
- provider.config[:response_type] = :s3_uri
171
- allow(provider.bucket.object('foo/quux.png')).to receive(:content_length).and_raise(error)
172
- expect(provider.link_for('foo/quux.png')).to eq ['s3://s3.bucket/foo/quux.png', { file_name: 'quux.png' }]
173
- end
174
- end
175
-
176
- it ':s3_uri keeps a key that is not a valid URI' do
177
- provider.config[:response_type] = :s3_uri
178
- allow(provider.bucket.object('foo/quux.png')).to receive(:key).and_return('foo/résumé file.pdf')
179
- expect(provider.link_for('foo/quux.png').first).to eq 's3://s3.bucket/foo/résumé file.pdf'
180
- end
181
-
182
- it ':signed_url gives an expiry the retriever accepts' do
183
- provider.config[:response_type] = :signed_url
184
- url, extras = provider.link_for('foo/quux.png')
185
- spec = { 'url' => url, 'expires' => extras[:expires].to_s, 'file_size' => extras[:file_size] }
186
- retriever = BrowseEverything::Retriever.new
187
- allow(retriever).to receive(:retrieve_http)
188
- expect { retriever.retrieve(spec) }.not_to raise_error
148
+ expect(provider.link_for('foo/quux.png')).to eq ['https://s3.amazonaws.com/presigned_url', { file_name: 'quux.png', expires: 14400 }]
189
149
  end
190
150
 
191
151
  it ':public_url' do
192
152
  provider.config[:response_type] = :public_url
193
- expect(provider.link_for('foo/quux.png')).to eq ['https://s3.amazonaws.com/public_url', { file_name: 'quux.png', file_size: 1_511_860 }]
153
+ expect(provider.link_for('foo/quux.png')).to eq ['https://s3.amazonaws.com/public_url', { file_name: 'quux.png' }]
194
154
  end
195
155
 
196
156
  it ':s3_uri' do
197
157
  provider.config[:response_type] = :s3_uri
198
- expect(provider.link_for('foo/quux.png')).to eq ['s3://s3.bucket/foo/quux.png', { file_name: 'quux.png', file_size: 1_511_860 }]
158
+ expect(provider.link_for('foo/quux.png')).to eq ['s3://s3.bucket/foo/quux.png', { file_name: 'quux.png' }]
199
159
  end
200
160
  end
201
161
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: browse-everything
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 2.0.0.alpha.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carolyn Cole
@@ -42,20 +42,6 @@ dependencies:
42
42
  - - ">="
43
43
  - !ruby/object:Gem::Version
44
44
  version: '0'
45
- - !ruby/object:Gem::Dependency
46
- name: dropbox_api
47
- requirement: !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- version: 0.1.20
52
- type: :runtime
53
- prerelease: false
54
- version_requirements: !ruby/object:Gem::Requirement
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: 0.1.20
59
45
  - !ruby/object:Gem::Dependency
60
46
  name: google-apis-drive_v3
61
47
  requirement: !ruby/object:Gem::Requirement
@@ -110,34 +96,6 @@ dependencies:
110
96
  - - "<"
111
97
  - !ruby/object:Gem::Version
112
98
  version: '8.1'
113
- - !ruby/object:Gem::Dependency
114
- name: ruby-box
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - ">="
118
- - !ruby/object:Gem::Version
119
- version: '0'
120
- type: :runtime
121
- prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- version: '0'
127
- - !ruby/object:Gem::Dependency
128
- name: signet
129
- requirement: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - "~>"
132
- - !ruby/object:Gem::Version
133
- version: '0.8'
134
- type: :runtime
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- requirements:
138
- - - "~>"
139
- - !ruby/object:Gem::Version
140
- version: '0.8'
141
99
  - !ruby/object:Gem::Dependency
142
100
  name: faraday
143
101
  requirement: !ruby/object:Gem::Requirement
@@ -629,7 +587,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
629
587
  - !ruby/object:Gem::Version
630
588
  version: '0'
631
589
  requirements: []
632
- rubygems_version: 4.0.22
590
+ rubygems_version: 3.7.1
633
591
  specification_version: 4
634
592
  summary: AJAX/Rails engine file browser for cloud storage services
635
593
  test_files: