Class: ComponentFiles

Inherits:
Object show all
Defined in:
lib/volt/server/rack/component_files.rb

Overview

Takes in the path to a component and gets all other components required from this one

Instance Method Summary collapse

Constructor Details

#initialize(component_name, component_paths, main_component = false) ⇒ ComponentFiles

Returns a new instance of ComponentFiles.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/volt/server/rack/component_files.rb', line 7

def initialize(component_name, component_paths, main_component=false)
  @component_name = component_name
  @component_paths = component_paths
  @asset_folders = []
  @components = [component_name]
  @main_component = main_component
  
  if @main_component
    # Add in volt's JS files first
    component('volt')
  end
  
  load_child_components
  add_asset_folder(component_name)
end

Instance Method Details

#add_asset_folder(component_name) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/volt/server/rack/component_files.rb', line 41

def add_asset_folder(component_name)
  path = path_to_component(component_name)
  
  asset_folder = File.join(path, 'assets')
  if File.directory?(asset_folder)
    @asset_folders << asset_folder
  end
end

#asset_foldersObject

Returns every asset folder that is included from this component. This means this components assets folder and any in the dependency chain.



75
76
77
78
79
80
81
82
# File 'lib/volt/server/rack/component_files.rb', line 75

def asset_folders
  files = []
  @asset_folders.each do |asset_folder|
    files << yield(asset_folder)
  end
  
  return files.flatten
end

#component(name) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/volt/server/rack/component_files.rb', line 27

def component(name)
  # Load any sub-requires
  child_files = ComponentFiles.new(name, @component_paths)
  new_components = child_files.components
  
  # remove any we already have
  new_components = new_components - @components
  new_components.each {|nc| add_asset_folder(nc) }
  
  @components += new_components
  
  return @components
end

#component_pathsObject



54
55
56
# File 'lib/volt/server/rack/component_files.rb', line 54

def component_paths
  @components.map {|c| [path_to_component(c), c] }
end

#componentsObject



23
24
25
# File 'lib/volt/server/rack/component_files.rb', line 23

def components
  @components
end

#css_filesObject



103
104
105
106
107
# File 'lib/volt/server/rack/component_files.rb', line 103

def css_files
  asset_folders do |asset_folder|
    Dir["#{asset_folder}/**/*.{css,scss}"].map {|path| '/assets' + path[asset_folder.size..-1].gsub(/[.]scss$/, '') }
  end
end

#javascript_filesObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/volt/server/rack/component_files.rb', line 85

def javascript_files
  javascript_files = asset_folders do |asset_folder|
    Dir["#{asset_folder}/**/*.js"].map {|path| '/assets' + path[asset_folder.size..-1] }
  end
  
  opal_js_files = []
  if Volt.source_maps?
    opal_js_files << environment['volt/templates/page'].to_a.map {|v| '/assets/' + v.logical_path + '?body=1' }
  else
    opal_js_files << '/assets/volt/templates/page.js'
  end
  opal_js_files << '/components/home.js'

  javascript_files.insert(2, *opal_js_files)
  
  return javascript_files
end

#load_child_componentsObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/volt/server/rack/component_files.rb', line 58

def load_child_components
  path = path_to_component
  if path
    dependencies_file = File.join(path_to_component, "config/dependencies.rb")
  else
    raise "Unable to find component #{@component_name.inspect}"
  end
  
  if File.exists?(dependencies_file)
    # Run the dependencies file in this ComponentFiles context
    code = File.read(dependencies_file)
    instance_eval(code)
  end
end

#path_to_component(name = nil) ⇒ Object



50
51
52
# File 'lib/volt/server/rack/component_files.rb', line 50

def path_to_component(name=nil)
  @component_paths.component_path(name || @component_name)
end