Skip to content

Commit

Permalink
Restructuring the resolution of container resources for directories
Browse files Browse the repository at this point in the history
Fixing the Controller suite
  • Loading branch information
jrgriffiniii committed Dec 16, 2019
1 parent 410e229 commit bff4793
Show file tree
Hide file tree
Showing 16 changed files with 467 additions and 95 deletions.
4 changes: 4 additions & 0 deletions .rubocop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ Metrics/BlockLength:
Exclude:
- '*.gemspec'
- 'spec/**/*'
Metrics/ClassLength:
Exclude:
- 'lib/browse_everything/retriever.rb'
- 'lib/browse_everything/driver/google_drive.rb'
Metrics/MethodLength:
Exclude:
- 'app/controllers/browse_everything_controller.rb'
Expand Down
59 changes: 49 additions & 10 deletions app/assets/javascripts/browse_everything/behavior.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,51 @@ function BrowseEverythingForm(form) {
* Append a hidden <input> element for the form for a file entry
* @param resource {BrowseEverythingResource}
*/
BrowseEverythingForm.prototype.appendFileInputElement = function(resource) {
BrowseEverythingForm.prototype.appendFileInputElements = function(resource) {
// Add the location
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][location]'/>").val(resource.getLocation());
this.$form.append(hidden_input);
var location_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][location]'/>").val(resource.getLocation());
this.$form.append(location_input);

// Add the name
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][name]'/>").val(resource.getName());
this.$form.append(hidden_input);
var name_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][name]'/>").val(resource.getName());
this.$form.append(name_input);

// Add the size
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][size]'/>").val(resource.getSize());
this.$form.append(hidden_input);
var size_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][size]'/>").val(resource.getSize());
this.$form.append(size_input);

// Add the type
var type_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][container]'/>").val(false);
this.$form.append(type_input);

var provider_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_files][][provider]'/>").val( resource.$element.data('ev-provider') );
this.$form.append(provider_input);
};

/**
* Append a hidden <input> element for the form for a directory entry
* @param resource {BrowseEverythingResource}
*/
BrowseEverythingForm.prototype.appendDirectoryInputElement = function(resource) {
var hidden_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][location]'/>").val(resource.getLocation());
this.$form.append(hidden_input);
BrowseEverythingForm.prototype.appendDirectoryInputElements = function(resource) {
// Add the location
var location_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][location]'/>").val(resource.getLocation());
this.$form.append(location_input);

// Add the name
var name_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][name]'/>").val(resource.getName());
this.$form.append(name_input);

// Add the size
var size_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][size]'/>").val(resource.getSize());
this.$form.append(size_input);

// Add the type
var type_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][container]'/>").val(true);
this.$form.append(type_input);

// Add the provider
var provider_input = $("<input type='hidden' class='ev-url' name='browse_everything[selected_directories][][provider]'/>").val( resource.$element.data('ev-provider') );
this.$form.append(provider_input);
};

/**
Expand Down Expand Up @@ -62,6 +85,22 @@ BrowseEverythingResource.prototype.getLocation = function () {
return this.$element.data('ev-location');
};

/*
*
* @return {string}
*/
BrowseEverythingResource.prototype.getName = function () {
return this.$element.data('ev-file-name');
};

/*
*
* @return {string}
*/
BrowseEverythingResource.prototype.getSize = function () {
return this.$element.data('ev-file-size');
};

/*
* Static factory method for building objects
* @param element {Element|jQuery}
Expand Down
10 changes: 4 additions & 6 deletions app/controllers/browse_everything_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,24 +81,22 @@ def resolve
selected_links = []
selected_directories = []
payload = {}
last_provider_key = nil

selected_files.each do |file|
binding.pry
location = file[:location]
provider_key_value, id = location.split(/:/)
provider_key = provider_key_value.to_sym
provider = browser.providers[provider_key]

values = browser.providers[provider_key].link_for(id, file[:name], file[:size])
values = provider.link_for(id, file[:name], file[:size], file[:container] == "true")
values.each do |value|
(url, extra) = value
result = { url: url }
result.merge!(extra) unless extra.nil?
selected_links << result unless result.fetch(:directory, false)
# These are being ignored
selected_directories << result if result.fetch(:directory, false) && !selected_directories.include?(result)
end

last_provider_key = provider_key
end

payload = selected_links
Expand Down Expand Up @@ -167,7 +165,7 @@ def provider_name
# Hence, a Browser must be reinstantiated for each request using the state provided in the Rails session
# @return [BrowseEverything::Browser]
def browser
BrowserFactory.build(session: session, url_options: url_options)
BrowseEverything.current_browser = BrowserFactory.build(session: session, url_options: url_options)
end

# Retrieves a cached provider, or, defaults to the first configured provider
Expand Down
60 changes: 59 additions & 1 deletion app/views/browse_everything/_files.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,67 @@
<% provider_contents.each_with_index do |file, index| %>
<% next if file.nil? %>
<%= render partial: 'file', locals: { file: file, index: index, path: browse_everything_engine.contents_path(provider_name, file.id), parent: parent, disabled: disabled?(file: file) } %>
<% path = browse_everything_engine.contents_path(provider_name, file.id) %>
<% disabled = disabled?(file: file) %>

<tr class="provider-contents-row"
role="row"
tabindex="-1"
data-ev-location="<%= file.location %>"
data-ev-file-name="<%= file.name %>"
data-ev-file-size="<%= file.size %>"
data-ev-file-date="<%= file.mtime %>"
<%= file.container? ? 'data-ev-container' : '' %>
data-ev-provider="<%= file.provider_name %>"
data-tt-id="<%= path %>"
data-tt-parent-id="<%= parent %>"
data-tt-branch="<%= file.container? ? 'true' : 'false' %>">

<td role="gridcell" title="<%= file.name %>" class="<%=file.container? ? 'ev-container' : 'ev-file'%> ev-file-name">
<% if disabled %>
<span title="<%= t('browse_everything.size_disabled', max_size: number_to_human_size(max_size)) %>"
class="<%=file.container? ? 'folder' : 'file'%>" aria-hidden="true">
<%= file.name %>
</span>
<span class="sr-only"><%= file.container? ? ', folder' : ', file' %> </span>
<% else %>
<%= link_to(path, class: 'ev-link') do %>
<span class="<%=file.container? ? 'folder' : 'file'%>" aria-hidden="true"/>
<%= file.name %>
<span class="sr-only"><%= file.container? ? ', folder' : ', file' %> </span>
<% end %>
<% end %>
</td>
<% if file.container? %>
<td role="gridcell" class="ev-directory-select">
<%= check_box_tag(:select_all, "0", false, class: "ev-select-all") %>
</td>
<% else %>
<td role="gridcell" class="ev-file-select">
<%= check_box_tag(file.id.to_s.parameterize, "0", false, class: "ev-select-file") %>
</td>
<% end %>
<% if file.size %>
<td role="gridcell" class="ev-file-size">
<%= number_to_human_size(file.size).sub(/Bytes/,'bytes') %>
</td>
<% else %>
<td role="gridcell" class="ev-file-size">Unknown</td>
<% end %>

<td role="gridcell" class="ev-file-kind">
<%= file.type %>
</td>

<% if file.mtime %>
<td role="gridcell" class="ev-file-date">
<%= file.mtime.strftime('%F %R') %>
</td>
<% else %>
<td role="gridcell" class="ev-file-date">Unknown</td>
<% end %>
</tr>
<% end %>
<%= render partial: 'files_pages' %>
</table>
14 changes: 10 additions & 4 deletions lib/browse_everything.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,15 @@ class NotAuthorizedError < StandardError; end

class << self
attr_writer :config
attr_accessor :current_browser

def current_provider
current_browser.session
end

def configure(value)
return if value.nil?

if value.is_a?(Hash)
@config = ActiveSupport::HashWithIndifferentAccess.new value
elsif value.is_a?(String)
Expand All @@ -78,10 +84,10 @@ def configure(value)
end

def config
if @config.nil?
config_path = Rails.root.join 'config', 'browse_everything_providers.yml'
configure config_path.to_s
end
return @config unless @config.nil?

config_path = Rails.root.join('config', 'browse_everything_providers.yml')
configure(config_path.to_s)
@config
end
end
Expand Down
17 changes: 12 additions & 5 deletions lib/browse_everything/browser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,27 @@ class Browser
attr_reader :providers

def initialize(opts = {})
url_options = {}
config = BrowseEverything.config

if opts.key?(:url_options)
url_options = opts.delete(:url_options)
# config = config.merge(opts.deep_stringify_keys)
config = config.merge(opts)
else
url_options = opts
opts = BrowseEverything.config
end

@providers = ActiveSupport::HashWithIndifferentAccess.new
opts.each_pair do |driver_key, config|

# This iterates through the configuration for each provider
config.each_pair do |driver_key, driver_config|
begin
driver = driver_key.to_s
driver_klass = BrowseEverything::Driver.const_get((config[:driver] || driver).camelize.to_sym)
@providers[driver_key] = driver_klass.new(config.merge(url_options: url_options))
driver_name = driver_config[:driver] || driver
driver_const = driver_name.camelize.to_sym
driver_klass = BrowseEverything::Driver.const_get(driver_const)
driver_args = driver_config.merge(url_options: url_options)
@providers[driver_key] = driver_klass.new(driver_args)
rescue NameError
Rails.logger.warn "Unknown provider: #{driver}"
end
Expand Down
13 changes: 13 additions & 0 deletions lib/browse_everything/driver/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,19 @@ def default_sorter
def inherited(subclass)
subclass.sorter = sorter
end

# Determine the content media/MIME type from the file extension name
# @param [String] extname
# @return [String]
def mime_type(extname)
Rack::Mime.mime_type(extname)
end

# Generate the default content media/MIME type for a container resource
# @return [String]
def container_mime_type
'application/x-directory'
end
end

# Constructor
Expand Down
19 changes: 17 additions & 2 deletions lib/browse_everything/driver/box.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,13 @@ def link_for(id)
file = box_client.file_by_id(id)
download_url = file.download_url
auth_header = { 'Authorization' => "Bearer #{@token}" }
extras = { auth_header: auth_header, expires: 1.hour.from_now, file_name: file.name, file_size: file.size.to_i }
extras = {
auth_token: @token,
auth_header: auth_header,
expires: 1.hour.from_now,
file_name: file.name,
file_size: file.size.to_i
}
[download_url, extras]
end

Expand Down Expand Up @@ -147,7 +153,16 @@ def expiration_time
# @param file [String] ID to the file resource
# @return [BrowseEverything::File]
def directory_entry(file)
BrowseEverything::FileEntry.new(file.id, "#{key}:#{file.id}", file.name, file.size, file.created_at, file.type == 'folder')
BrowseEverything::FileEntry.new(
file.id,
"#{key}:#{file.id}",
file.name,
file.size,
file.created_at,
file.type == 'folder',
nil,
'box'
)
end
end
end
Expand Down

0 comments on commit bff4793

Please sign in to comment.