Class: Volt::ComponentPaths
- Defined in:
- lib/volt/server/rack/component_paths.rb
Instance Method Summary collapse
-
#app_folders ⇒ Object
Yield for every folder where we might find components.
-
#asset_folders ⇒ Object
Return every asset folder we need to serve from.
-
#component_paths(name) ⇒ Object
Returns all paths for a specific component.
-
#components ⇒ Object
returns an array of every folder that is a component.
-
#initialize(root = nil) ⇒ ComponentPaths
constructor
A new instance of ComponentPaths.
- #load_views_and_routes(volt_app) ⇒ Object
-
#require_in_components(volt_app) ⇒ Object
Makes each components classes available on the load path, require classes.
-
#setup_load_paths ⇒ Object
Setup load path for components.
Constructor Details
#initialize(root = nil) ⇒ ComponentPaths
Returns a new instance of ComponentPaths.
6 7 8 |
# File 'lib/volt/server/rack/component_paths.rb', line 6 def initialize(root = nil) @root = root || Dir.pwd end |
Instance Method Details
#app_folders ⇒ Object
Yield for every folder where we might find components
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/volt/server/rack/component_paths.rb', line 11 def app_folders # Find all app folders @app_folders ||= begin volt_app = File.(File.join(File.dirname(__FILE__), '../../../../app')) app_folders = [volt_app, "#{@root}/app", "#{@root}/vendor/app"].map { |f| File.(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 ⇒ Object
Return every asset folder we need to serve from
112 113 114 115 116 117 118 119 120 121 |
# 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) ⇒ Object
Returns all paths for a specific component
101 102 103 104 105 106 107 108 109 |
# 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 ⇒ Object
returns an array of every folder that is a component
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# 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) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# 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) ⇒ Object
Makes each components classes available on the load path, require classes.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# 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 ⇒ Object
Setup load path for components
58 59 60 61 62 63 64 |
# 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 |