browse-everything 1.0.0.rc2 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +93 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +43 -35
  5. data/CONTRIBUTING.md +3 -3
  6. data/Gemfile +3 -6
  7. data/LICENSE.txt +205 -22
  8. data/README.md +17 -15
  9. data/app/assets/javascripts/browse_everything/behavior.js +201 -158
  10. data/app/assets/javascripts/treetable.webpack.js +687 -0
  11. data/app/assets/stylesheets/browse_everything.scss +0 -0
  12. data/app/assets/stylesheets/{_browse_everything_bootstrap3.scss → browse_everything/_browse_everything_bootstrap3.scss} +6 -5
  13. data/app/assets/stylesheets/{_browse_everything_bootstrap4.scss → browse_everything/_browse_everything_bootstrap4.scss} +0 -0
  14. data/app/controllers/browse_everything_controller.rb +60 -60
  15. data/app/helpers/browse_everything_helper.rb +4 -0
  16. data/app/views/browse_everything/_files.html.erb +4 -2
  17. data/browse-everything.gemspec +8 -7
  18. data/lib/browse_everything.rb +2 -1
  19. data/lib/browse_everything/auth/google/credentials.rb +5 -5
  20. data/lib/browse_everything/auth/google/request_parameters.rb +38 -38
  21. data/lib/browse_everything/driver/base.rb +14 -14
  22. data/lib/browse_everything/driver/box.rb +62 -55
  23. data/lib/browse_everything/driver/dropbox.rb +37 -21
  24. data/lib/browse_everything/driver/file_system.rb +30 -18
  25. data/lib/browse_everything/driver/google_drive.rb +40 -39
  26. data/lib/browse_everything/driver/s3.rb +61 -45
  27. data/lib/browse_everything/file_entry.rb +1 -1
  28. data/lib/browse_everything/retriever.rb +72 -67
  29. data/lib/browse_everything/version.rb +1 -1
  30. data/lib/generators/browse_everything/templates/browse_everything_providers.yml.example +1 -0
  31. data/spec/features/test_compiling_stylesheets_spec.rb +1 -1
  32. data/spec/lib/browse_everything/browser_spec.rb +5 -3
  33. data/spec/lib/browse_everything/driver/dropbox_spec.rb +20 -1
  34. data/spec/lib/browse_everything/driver_spec.rb +43 -3
  35. data/spec/spec_helper.rb +9 -2
  36. data/spec/support/capybara.rb +0 -5
  37. data/spec/test_app_templates/Gemfile.extra +9 -0
  38. data/spec/test_app_templates/lib/generators/test_app_generator.rb +56 -5
  39. metadata +72 -39
  40. data/.travis.yml +0 -33
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrowseEverything
4
- VERSION = '1.0.0.rc2'
4
+ VERSION = '1.1.1'
5
5
  end
@@ -5,6 +5,7 @@
5
5
  # dropbox:
6
6
  # client_id: YOUR_DROPBOX_APP_KEY
7
7
  # client_secret: YOUR_DROPBOX_APP_SECRET
8
+ # download_directory: tmp/
8
9
  # box:
9
10
  # client_id: YOUR_BOX_CLIENT_ID
10
11
  # client_secret: YOUR_BOX_CLIENT_SECRET
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe 'Compiling the stylesheets', type: :feature do
3
+ describe 'Compiling the stylesheets', type: :feature, js: true do
4
4
  it 'does not raise errors' do
5
5
  visit '/'
6
6
  expect(page).not_to have_content 'Sass::SyntaxError'
@@ -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'"
7
+ "file_system:\n home: '/file/config/home'\ndropbox:\n client_id: 'DropboxId'\n client_secret: 'DropboxClientSecret'\n download_directory: 'tmp/'"
8
8
  end
9
9
 
10
10
  let(:global_config) do
@@ -14,7 +14,8 @@ describe BrowseEverything::Browser do
14
14
  },
15
15
  dropbox: {
16
16
  client_id: 'DropboxId',
17
- client_secret: 'DropboxClientSecret'
17
+ client_secret: 'DropboxClientSecret',
18
+ download_directory: 'tmp/'
18
19
  }
19
20
  }
20
21
  end
@@ -26,7 +27,8 @@ describe BrowseEverything::Browser do
26
27
  },
27
28
  dropbox: {
28
29
  client_id: 'DropboxId',
29
- client_secret: 'DropboxClientSecret'
30
+ client_secret: 'DropboxClientSecret',
31
+ download_directory: 'tmp/'
30
32
  },
31
33
  url_options: url_options
32
34
  }
@@ -8,7 +8,8 @@ describe BrowseEverything::Driver::Dropbox do
8
8
  let(:provider_yml) do
9
9
  {
10
10
  client_id: 'client-id',
11
- client_secret: 'client-secret'
11
+ client_secret: 'client-secret',
12
+ download_directory: 'spec/fixtures/'
12
13
  }
13
14
  end
14
15
  let(:oauth_response_body) do
@@ -63,6 +64,10 @@ describe BrowseEverything::Driver::Dropbox do
63
64
 
64
65
  before { driver.connect({ code: 'code' }, {}, connector_response_url_options) }
65
66
 
67
+ it 'accesses the download directory' do
68
+ expect(driver.config).to include('download_directory' => 'spec/fixtures/')
69
+ end
70
+
66
71
  describe '#auth_link' do
67
72
  subject { driver.auth_link(connector_response_url_options) }
68
73
 
@@ -133,6 +138,20 @@ describe BrowseEverything::Driver::Dropbox do
133
138
  expect(downloaded_file.read).not_to be_empty
134
139
  end
135
140
  end
141
+
142
+ context 'when the configuration does not specify a download directory' do
143
+ let(:provider_yml) do
144
+ {
145
+ client_id: 'client-id',
146
+ client_secret: 'client-secret'
147
+ }
148
+ end
149
+ let(:downloaded_file_path) { link_args.first }
150
+
151
+ it 'uses the "tmp" directory as the default path' do
152
+ expect(downloaded_file_path).to include '/tmp/Getting Started.pdf'
153
+ end
154
+ end
136
155
  end
137
156
  end
138
157
  end
@@ -15,9 +15,49 @@ describe BrowseEverything::Driver do
15
15
  end
16
16
  end
17
17
 
18
- describe '#sorter' do
19
- it 'defaults to nil' do
20
- expect(described_class.sorter).to be nil
18
+ after do
19
+ Object.send(:remove_const, :MyDriver)
20
+ end
21
+
22
+ describe '#default_sorter' do
23
+ let(:file1) do
24
+ instance_double(BrowseEverything::FileEntry)
25
+ end
26
+ let(:file2) do
27
+ instance_double(BrowseEverything::FileEntry)
28
+ end
29
+ let(:file3) do
30
+ instance_double(BrowseEverything::FileEntry)
31
+ end
32
+ let(:files) do
33
+ [
34
+ file1,
35
+ file2,
36
+ file3
37
+ ]
38
+ end
39
+
40
+ before do
41
+ class MyNewDriver < BrowseEverything::Driver::Base; end
42
+
43
+ allow(file1).to receive(:container?).and_return(false)
44
+ allow(file1).to receive(:name).and_return('test file1')
45
+ allow(file2).to receive(:container?).and_return(false)
46
+ allow(file2).to receive(:name).and_return('test file2')
47
+ allow(file3).to receive(:container?).and_return(true)
48
+ allow(file3).to receive(:name).and_return('test container1')
49
+ end
50
+ after do
51
+ Object.send(:remove_const, :MyNewDriver)
52
+ end
53
+
54
+ it 'defaults to proc which sorts by containers' do
55
+ expect(MyNewDriver.default_sorter).to be_a(Proc)
56
+
57
+ results = MyNewDriver.default_sorter.call(files)
58
+ expect(results.first.name).to eq file3.name
59
+ expect(results[1].name).to eq file1.name
60
+ expect(results.last.name).to eq file2.name
21
61
  end
22
62
  end
23
63
 
@@ -4,7 +4,7 @@ ENV['RAILS_ENV'] ||= 'test'
4
4
  require 'bundler/setup'
5
5
 
6
6
  def coverage_needed?
7
- ENV['COVERAGE'] || ENV['TRAVIS']
7
+ ENV['COVERAGE'] || ENV['CI']
8
8
  end
9
9
 
10
10
  if coverage_needed?
@@ -36,6 +36,7 @@ require 'capybara/rspec'
36
36
  require 'rspec'
37
37
  require 'rspec/rails'
38
38
  require 'rspec/its'
39
+ require 'webdrivers'
39
40
 
40
41
  # Requires supporting ruby files with custom matchers and macros, etc,
41
42
  # in spec/support/ and its subdirectories.
@@ -45,6 +46,12 @@ require 'webmock/rspec'
45
46
  WebMock.disable_net_connect!(allow_localhost: true)
46
47
 
47
48
  RSpec.configure do |config|
49
+ config.before(:each, type: :feature) { WebMock.disable! }
50
+ config.after(:each, type: :feature) do
51
+ WebMock.enable!
52
+ WebMock.disable_net_connect!(allow_localhost: true)
53
+ end
54
+
48
55
  config.expect_with :rspec do |c|
49
56
  c.syntax = %i[should expect]
50
57
  end
@@ -80,7 +87,7 @@ module BrowserConfigHelper
80
87
  app_key: 'S3AppKey',
81
88
  app_secret: 'S3AppSecret',
82
89
  bucket: 's3.bucket',
83
- region: 's3.region'
90
+ region: 'us-east-1'
84
91
  })
85
92
  end
86
93
 
@@ -4,11 +4,6 @@ require 'selenium-webdriver'
4
4
 
5
5
  # Temporary pin until chromedriver-helper patched to deal with change in chromedriver versioning
6
6
  # See https://github.com/flavorjones/chromedriver-helper/pull/63
7
- # @note In January 2018, TravisCI disabled Chrome sandboxing in its Linux
8
- # container build environments to mitigate Meltdown/Spectre
9
- # vulnerabilities, at which point Hyrax could no longer use the
10
- # Capybara-provided :selenium_chrome_headless driver (which does not
11
- # include the `--no-sandbox` argument).
12
7
  Capybara.register_driver :selenium_chrome_headless_sandboxless do |app|
13
8
  browser_options = ::Selenium::WebDriver::Chrome::Options.new
14
9
  browser_options.args << '--headless'
@@ -1,6 +1,15 @@
1
1
  gem 'jquery-rails'
2
2
  gem 'puma-rails'
3
3
 
4
+ if ENV['RAILS_VERSION']
5
+ case ENV['RAILS_VERSION']
6
+ when /6\./
7
+ gem 'webpacker', '~> 4.0'
8
+ when /5\./
9
+ gem 'webpacker', '~> 4.0'
10
+ end
11
+ end
12
+
4
13
  if ENV['TEST_BOOTSTRAP'] == "3"
5
14
  gem "bootstrap-sass"
6
15
  else
@@ -19,20 +19,71 @@ class TestAppGenerator < Rails::Generators::Base
19
19
  insert_into_file 'app/assets/stylesheets/application.css.scss', after: '*/' do
20
20
  if ENV['TEST_BOOTSTRAP'] == "3"
21
21
  # bootstrap 3 from bootstrap-sass gem
22
- %(\n\n@import "bootstrap-sprockets";\n@import "bootstrap";\n@import "browse_everything_bootstrap3";)
22
+ %(\n\n@import "bootstrap-sprockets";\n@import "bootstrap";\n@import "browse_everything/browse_everything_bootstrap3";)
23
23
  else
24
24
  # bootstrap4 from bootstrap gem
25
- %(\n\n@import "bootstrap";\n@import "browse_everything_bootstrap4";)
25
+ %(\n\n@import "bootstrap";\n@import "browse_everything/browse_everything_bootstrap4";)
26
26
  end
27
27
  end
28
28
  end
29
29
 
30
30
  def inject_javascript
31
- insert_into_file 'app/assets/javascripts/application.js', after: '//= require_tree .' do
32
- %(
31
+ if /^6\./.match?(Rails.version)
32
+ # Both jQuery and Twitter Bootstrap 3.x need to be added for legacy JavaScript
33
+ system('yarn add jquery@3.3.1')
34
+ system('yarn add bootstrap@3.4.1')
35
+ system('yarn install')
36
+
37
+ # Adding the JavaScript module dependencies
38
+ insert_into_file 'app/javascript/packs/application.js', after: 'require("channels")' do
39
+ %(
40
+ require("jquery")
41
+ require("bootstrap")
42
+ )
43
+ end
44
+
45
+ # Here the JavaScript needs to be injected for Webpacker
46
+ insert_into_file 'config/webpack/environment.js', after: "const { environment } = require('@rails/webpacker')" do
47
+ %(
48
+ const webpack = require('webpack')
49
+
50
+ environment.plugins.prepend('Provide',
51
+ new webpack.ProvidePlugin({
52
+ $: 'jquery/src/jquery',
53
+ jQuery: 'jquery/src/jquery'
54
+ })
55
+ )
56
+ )
57
+ end
58
+
59
+ # Copy the TreeTable JavaScript
60
+ copy_file('../../app/assets/javascripts/treetable.webpack.js', 'app/javascript/packs/treetable.js')
61
+
62
+ # Copy the browse_everything JavaScript
63
+ copy_file('../../app/assets/javascripts/browse_everything/behavior.js', 'app/javascript/packs/browse-everything.js')
64
+
65
+ # Adding the JavaScript module dependencies
66
+ insert_into_file 'app/javascript/packs/browse-everything.js', before: "'use strict';" do
67
+ %(
68
+ require("bootstrap")
69
+ require("./treetable")
70
+ )
71
+ end
72
+
73
+ # Load the new packs into the view
74
+ insert_into_file 'app/views/layouts/application.html.erb', before: '</head>' do
75
+ %(
76
+ <%= javascript_pack_tag 'treetable', 'data-turbolinks-track': 'reload' %>
77
+ <%= javascript_pack_tag 'browse-everything', 'data-turbolinks-track': 'reload' %>
78
+ )
79
+ end
80
+ else
81
+ insert_into_file 'app/assets/javascripts/application.js', after: '//= require_tree .' do
82
+ %(
33
83
  //= require jquery
34
84
  //= require browse_everything
35
- )
85
+ )
86
+ end
36
87
  end
37
88
  end
38
89
 
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.0.0.rc2
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carolyn Cole
@@ -10,10 +10,10 @@ authors:
10
10
  - Thomas Scherz
11
11
  - Xiaoming Wang
12
12
  - Jeremy Friesen
13
- autorequire:
13
+ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2018-11-28 00:00:00.000000000 Z
16
+ date: 2020-11-17 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: addressable
@@ -75,30 +75,42 @@ dependencies:
75
75
  name: google_drive
76
76
  requirement: !ruby/object:Gem::Requirement
77
77
  requirements:
78
- - - "~>"
78
+ - - ">="
79
79
  - !ruby/object:Gem::Version
80
80
  version: '2.1'
81
+ - - "<"
82
+ - !ruby/object:Gem::Version
83
+ version: '4'
81
84
  type: :runtime
82
85
  prerelease: false
83
86
  version_requirements: !ruby/object:Gem::Requirement
84
87
  requirements:
85
- - - "~>"
88
+ - - ">="
86
89
  - !ruby/object:Gem::Version
87
90
  version: '2.1'
91
+ - - "<"
92
+ - !ruby/object:Gem::Version
93
+ version: '4'
88
94
  - !ruby/object:Gem::Dependency
89
95
  name: googleauth
90
96
  requirement: !ruby/object:Gem::Requirement
91
97
  requirements:
92
- - - '='
98
+ - - ">="
93
99
  - !ruby/object:Gem::Version
94
100
  version: 0.6.6
101
+ - - "<"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.0'
95
104
  type: :runtime
96
105
  prerelease: false
97
106
  version_requirements: !ruby/object:Gem::Requirement
98
107
  requirements:
99
- - - '='
108
+ - - ">="
100
109
  - !ruby/object:Gem::Version
101
110
  version: 0.6.6
111
+ - - "<"
112
+ - !ruby/object:Gem::Version
113
+ version: '1.0'
102
114
  - !ruby/object:Gem::Dependency
103
115
  name: rails
104
116
  requirement: !ruby/object:Gem::Requirement
@@ -106,6 +118,9 @@ dependencies:
106
118
  - - ">="
107
119
  - !ruby/object:Gem::Version
108
120
  version: '4.2'
121
+ - - "<"
122
+ - !ruby/object:Gem::Version
123
+ version: '7.0'
109
124
  type: :runtime
110
125
  prerelease: false
111
126
  version_requirements: !ruby/object:Gem::Requirement
@@ -113,6 +128,9 @@ dependencies:
113
128
  - - ">="
114
129
  - !ruby/object:Gem::Version
115
130
  version: '4.2'
131
+ - - "<"
132
+ - !ruby/object:Gem::Version
133
+ version: '7.0'
116
134
  - !ruby/object:Gem::Dependency
117
135
  name: ruby-box
118
136
  requirement: !ruby/object:Gem::Requirement
@@ -142,19 +160,19 @@ dependencies:
142
160
  - !ruby/object:Gem::Version
143
161
  version: '0.8'
144
162
  - !ruby/object:Gem::Dependency
145
- name: thor
163
+ name: sprockets
146
164
  requirement: !ruby/object:Gem::Requirement
147
165
  requirements:
148
166
  - - "~>"
149
167
  - !ruby/object:Gem::Version
150
- version: '0.19'
168
+ version: '3.7'
151
169
  type: :runtime
152
170
  prerelease: false
153
171
  version_requirements: !ruby/object:Gem::Requirement
154
172
  requirements:
155
173
  - - "~>"
156
174
  - !ruby/object:Gem::Version
157
- version: '0.19'
175
+ version: '3.7'
158
176
  - !ruby/object:Gem::Dependency
159
177
  name: typhoeus
160
178
  requirement: !ruby/object:Gem::Requirement
@@ -173,28 +191,28 @@ dependencies:
173
191
  name: bixby
174
192
  requirement: !ruby/object:Gem::Requirement
175
193
  requirements:
176
- - - ">="
194
+ - - "~>"
177
195
  - !ruby/object:Gem::Version
178
- version: '1.0'
196
+ version: '3.0'
179
197
  type: :development
180
198
  prerelease: false
181
199
  version_requirements: !ruby/object:Gem::Requirement
182
200
  requirements:
183
- - - ">="
201
+ - - "~>"
184
202
  - !ruby/object:Gem::Version
185
- version: '1.0'
203
+ version: '3.0'
186
204
  - !ruby/object:Gem::Dependency
187
205
  name: bundler
188
206
  requirement: !ruby/object:Gem::Requirement
189
207
  requirements:
190
- - - "~>"
208
+ - - ">="
191
209
  - !ruby/object:Gem::Version
192
210
  version: '1.3'
193
211
  type: :development
194
212
  prerelease: false
195
213
  version_requirements: !ruby/object:Gem::Requirement
196
214
  requirements:
197
- - - "~>"
215
+ - - ">="
198
216
  - !ruby/object:Gem::Version
199
217
  version: '1.3'
200
218
  - !ruby/object:Gem::Dependency
@@ -211,20 +229,6 @@ dependencies:
211
229
  - - ">="
212
230
  - !ruby/object:Gem::Version
213
231
  version: '0'
214
- - !ruby/object:Gem::Dependency
215
- name: chromedriver-helper
216
- requirement: !ruby/object:Gem::Requirement
217
- requirements:
218
- - - '='
219
- - !ruby/object:Gem::Version
220
- version: 1.2.0
221
- type: :development
222
- prerelease: false
223
- version_requirements: !ruby/object:Gem::Requirement
224
- requirements:
225
- - - '='
226
- - !ruby/object:Gem::Version
227
- version: 1.2.0
228
232
  - !ruby/object:Gem::Dependency
229
233
  name: coveralls
230
234
  requirement: !ruby/object:Gem::Requirement
@@ -365,6 +369,20 @@ dependencies:
365
369
  - - ">="
366
370
  - !ruby/object:Gem::Version
367
371
  version: '0'
372
+ - !ruby/object:Gem::Dependency
373
+ name: rspec_junit_formatter
374
+ requirement: !ruby/object:Gem::Requirement
375
+ requirements:
376
+ - - ">="
377
+ - !ruby/object:Gem::Version
378
+ version: '0'
379
+ type: :development
380
+ prerelease: false
381
+ version_requirements: !ruby/object:Gem::Requirement
382
+ requirements:
383
+ - - ">="
384
+ - !ruby/object:Gem::Version
385
+ version: '0'
368
386
  - !ruby/object:Gem::Dependency
369
387
  name: rubocop-rspec
370
388
  requirement: !ruby/object:Gem::Requirement
@@ -421,6 +439,20 @@ dependencies:
421
439
  - - ">="
422
440
  - !ruby/object:Gem::Version
423
441
  version: '0'
442
+ - !ruby/object:Gem::Dependency
443
+ name: webdrivers
444
+ requirement: !ruby/object:Gem::Requirement
445
+ requirements:
446
+ - - ">="
447
+ - !ruby/object:Gem::Version
448
+ version: '0'
449
+ type: :development
450
+ prerelease: false
451
+ version_requirements: !ruby/object:Gem::Requirement
452
+ requirements:
453
+ - - ">="
454
+ - !ruby/object:Gem::Version
455
+ version: '0'
424
456
  - !ruby/object:Gem::Dependency
425
457
  name: webmock
426
458
  requirement: !ruby/object:Gem::Requirement
@@ -447,12 +479,12 @@ executables: []
447
479
  extensions: []
448
480
  extra_rdoc_files: []
449
481
  files:
482
+ - ".circleci/config.yml"
450
483
  - ".engine_cart.yml"
451
484
  - ".gitignore"
452
485
  - ".rspec"
453
486
  - ".rubocop.yml"
454
487
  - ".rubocop_todo.yml"
455
- - ".travis.yml"
456
488
  - CODE_OF_CONDUCT.md
457
489
  - CONTRIBUTING.md
458
490
  - Gemfile
@@ -463,9 +495,11 @@ files:
463
495
  - SUPPORT.md
464
496
  - app/assets/javascripts/browse_everything.js
465
497
  - app/assets/javascripts/browse_everything/behavior.js
466
- - app/assets/stylesheets/_browse_everything_bootstrap3.scss
467
- - app/assets/stylesheets/_browse_everything_bootstrap4.scss
498
+ - app/assets/javascripts/treetable.webpack.js
499
+ - app/assets/stylesheets/browse_everything.scss
468
500
  - app/assets/stylesheets/browse_everything/_browse_everything.scss
501
+ - app/assets/stylesheets/browse_everything/_browse_everything_bootstrap3.scss
502
+ - app/assets/stylesheets/browse_everything/_browse_everything_bootstrap4.scss
469
503
  - app/assets/stylesheets/jquery.treetable.theme.browse.css
470
504
  - app/controllers/browse_everything_controller.rb
471
505
  - app/helpers/browse_everything_helper.rb
@@ -549,7 +583,7 @@ homepage: https://github.com/projecthydra/browse-everything
549
583
  licenses:
550
584
  - Apache 2
551
585
  metadata: {}
552
- post_install_message:
586
+ post_install_message:
553
587
  rdoc_options: []
554
588
  require_paths:
555
589
  - lib
@@ -560,13 +594,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
560
594
  version: '0'
561
595
  required_rubygems_version: !ruby/object:Gem::Requirement
562
596
  requirements:
563
- - - ">"
597
+ - - ">="
564
598
  - !ruby/object:Gem::Version
565
- version: 1.3.1
599
+ version: '0'
566
600
  requirements: []
567
- rubyforge_project:
568
- rubygems_version: 2.7.3
569
- signing_key:
601
+ rubygems_version: 3.0.3
602
+ signing_key:
570
603
  specification_version: 4
571
604
  summary: AJAX/Rails engine file browser for cloud storage services
572
605
  test_files: