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