class Volt::ComponentPaths
Public Class Methods
new(root = nil)
click to toggle source
# File lib/volt/server/rack/component_paths.rb, line 6 def initialize(root = nil) @root = root || Dir.pwd end
Public Instance Methods
app_folders() { |app_folder| ... }
click to toggle source
Yield for every folder where we might find components
# File lib/volt/server/rack/component_paths.rb, line 11 def app_folders # Find all app folders @app_folders ||= begin volt_app = File.expand_path(File.join(File.dirname(__FILE__), '../../../../app')) app_folders = [volt_app, "#{@root}/app", "#{@root}/vendor/app"].map { |f| File.expand_path(f) } # Gem folders with volt in them # TODO: we should probably qualify this a bit more app_folders += Gem.loaded_specs.values .select {|gem| gem.name =~ /^volt/ } .map {|gem| "#{gem.full_gem_path}/app" } app_folders.uniq end # Yield each app folder and return a flattened array with # the results files = [] @app_folders.each do |app_folder| files << yield(app_folder) end files.flatten end
asset_folders() { |asset_folder| ... }
click to toggle source
Return every asset folder we need to serve from
# File lib/volt/server/rack/component_paths.rb, line 112 def asset_folders folders = [] app_folders do |app_folder| Dir["#{app_folder}/*/assets"].sort.each do |asset_folder| folders << yield(asset_folder) end end folders.flatten end
component_paths(name)
click to toggle source
Returns all paths for a specific component
# File lib/volt/server/rack/component_paths.rb, line 101 def component_paths(name) folders = components[name] if folders return folders else return nil end end
components()
click to toggle source
returns an array of every folder that is a component
# File lib/volt/server/rack/component_paths.rb, line 38 def components return @components if @components @components = {} app_folders do |app_folder| Dir["#{app_folder}/*"].sort.each do |folder| if File.directory?(folder) folder_name = folder[/[^\/]+$/] # Add in the folder if it's not alreay in there folders = (@components[folder_name] ||= []) folders << folder unless folders.include?(folder) end end end @components end
load_views_and_routes(volt_app)
click to toggle source
# File lib/volt/server/rack/component_paths.rb, line 83 def load_views_and_routes(volt_app) component_names = [] app_folders do |app_folder| Dir["#{app_folder}/*"].map { |cp| cp[/[^\/]+$/] }.each do |component_name| component_names << component_name end end # Load in all views and routes # TODO: Nested components listed twice are are loaded multiple times component_names.uniq.each do |component_name| code = Volt::ComponentCode.new(volt_app, component_name, self, false).code # Evaluate returned code, the ```volt_app``` variable is set for access. eval(code) end end
require_in_components(volt_app)
click to toggle source
Makes each components classes available on the load path, require classes.
# File lib/volt/server/rack/component_paths.rb, line 67 def require_in_components(volt_app) if RUBY_PLATFORM == 'opal' else app_folders do |app_folder| # Sort so we get consistent load order across platforms Dir["#{app_folder}/*/{controllers,models,tasks}/*.rb"].each do |ruby_file| path = ruby_file.gsub(/^#{app_folder}\//, '')[0..-4] require(path) end end # Delay the loading of views volt_app.templates.template_loader = -> { load_views_and_routes(volt_app) } end end
setup_load_paths()
click to toggle source
Setup load path for components
# File lib/volt/server/rack/component_paths.rb, line 58 def setup_load_paths unless RUBY_PLATFORM == 'opal' app_folders do |app_folder| $LOAD_PATH.unshift(app_folder) end end end