Class: ArchitectureJS::Blueprint

Inherits:
Object
  • Object
show all
Defined in:
lib/architecture-js/blueprint.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, root = nil) ⇒ Blueprint



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/architecture-js/blueprint.rb', line 26

def initialize(config, root = nil)
  raise "#{self.class}.new({ name: 'myapp' }, options): config[:name] is undefined" unless config[:name]
  @raise_errors = false
  @config_file = "#{config[:name].downcase}.blueprint"
  root ||= Dir.getwd
  @root = File.expand_path(root)
  @template_directories = ["#{@root}/templates"]
  @directories = ['lib', 'src']
  @config = {
    blueprint: 'default',
    src_dir: 'src',
    build_dir: 'lib',
    asset_root: '../',
    output: 'compressed',
    template_dir: 'templates',
    template_namespace: 'templates'
  }
  @config.merge! config unless config.nil?
  @template_directories = [*@config[:template_dir]].map { |dir| "#{@root}/#{dir}" }
  get_src_files
end

Instance Attribute Details

#blueprintObject

Returns the value of attribute blueprint.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def blueprint
  @blueprint
end

#configObject

Returns the value of attribute config.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def config
  @config
end

#config_nameObject

Returns the value of attribute config_name.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def config_name
  @config_name
end

#directoriesObject

Returns the value of attribute directories.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def directories
  @directories
end

#raise_errorsObject

Returns the value of attribute raise_errors.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def raise_errors
  @raise_errors
end

#rootObject

Returns the value of attribute root.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def root
  @root
end

#src_filesObject

Returns the value of attribute src_files.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def src_files
  @src_files
end

#template_directoriesObject

Returns the value of attribute template_directories.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def template_directories
  @template_directories
end

#templatesObject

Returns the value of attribute templates.



4
5
6
# File 'lib/architecture-js/blueprint.rb', line 4

def templates
  @templates
end

Class Method Details

.init_with_config(path) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/architecture-js/blueprint.rb', line 14

def self.init_with_config(path)
  config_file = Dir.entries(path).select {|f| f =~ /\.blueprint$/ }.first

  raise ".blueprint file was not found in #{path}/" if config_file.nil?

  config = YAML::load_file "#{path}/#{config_file}"
  config = ArchitectureJS::Helpers::symbolize_keys config

  require "#{config[:blueprint]}-architecture" unless config[:blueprint] == 'default'
  project = ArchitectureJS::BLUEPRINTS[config[:blueprint]].new config, path
end

Instance Method Details

#add_src_files_to_project(directory) ⇒ Object



142
143
144
145
146
147
# File 'lib/architecture-js/blueprint.rb', line 142

def add_src_files_to_project(directory)
  Dir["#{directory}/*.js"].each do |file|
    src_filename = file.gsub(directory, '')
    @src_files << "#{directory}#{src_filename}" unless src_filename.match(/^\/_/)
  end
end

#assign_config_variables(config) ⇒ Object



53
54
55
56
57
# File 'lib/architecture-js/blueprint.rb', line 53

def assign_config_variables(config)
  config.each do |key, value|
    @config[key.to_sym] = value
  end
end

#compile_src_file(file_path, file_name) ⇒ Object



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/architecture-js/blueprint.rb', line 161

def compile_src_file(file_path, file_name)
  sprockets = Sprockets::Secretary.new(
    root: ArchitectureJS::base_directory,
    asset_root: @config[:asset_root],
    load_path: ['repository'],
    source_files: [file_path],
    interpolate_constants: false
  )

  compiled_file = sprockets.concatenation
  message = File.exists?("#{@root}/#{@config[:build_dir]}/#{file_name}.js") ? "#{@config[:build_dir]}/#{file_name}.js updated" : "#{@config[:build_dir]}/#{file_name}.js created"
  compiled_file.save_to "#{@root}/#{@config[:build_dir]}/#{file_name}.js"
  ArchitectureJS::Notification.log message
  sprockets.install_assets

rescue Exception => error
  @errors = true
  puts ArchitectureJS::Notification.error "Sprockets error: #{error.message}"
  raise if @raise_errors
end

#compile_src_filesObject



149
150
151
152
153
154
# File 'lib/architecture-js/blueprint.rb', line 149

def compile_src_files
  @src_files.each do |file_path|
    file_name = get_file_name file_path
    compile_src_file file_path, file_name
  end
end

#compress_applicationObject



182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/architecture-js/blueprint.rb', line 182

def compress_application
  app_root = File.expand_path "#{@root}/#{@config[:build_dir]}"
  src_files = Dir.entries(app_root).reject! { |file| file =~ /^\./ }

  src_files.each do |file|
    full_path = "#{app_root}/#{file}"
    uncompressed = File.open(full_path, "r").read
    File.open(full_path, "w+") do |file|
      file << JSMin.minify(uncompressed).gsub(/\n?/, '')
    end
  end
end

#createObject



59
60
61
62
63
64
# File 'lib/architecture-js/blueprint.rb', line 59

def create
  puts ArchitectureJS::Notification.notice "Creating the #{@config[:name]} project in #{@root}" 
  create_project_scaffold
  write_config
  create_application_file
end

#create_application_fileObject



86
87
88
89
# File 'lib/architecture-js/blueprint.rb', line 86

def create_application_file
  FileUtils.touch("#{@root}/#{@config[:src_dir]}/#{@config[:name]}.js")
  puts ArchitectureJS::Notification.added "#{@config[:src_dir]}/#{@config[:name]}.js created"
end

#create_project_scaffoldObject



66
67
68
69
70
71
72
73
# File 'lib/architecture-js/blueprint.rb', line 66

def create_project_scaffold
  Dir.mkdir "#{@root}" unless File.exists? "#{@root}"

  @directories.each do |dir|
    puts ArchitectureJS::Notification.added "#{dir}/ created" unless File.exists? "#{@root}/#{dir}"
    Dir.mkdir "#{@root}/#{dir}" unless File.exists? "#{@root}/#{dir}"
  end
end

#create_templates_fileObject



128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/architecture-js/blueprint.rb', line 128

def create_templates_file
  templates_string = ''
  app_name = @config[:name]
  template_namespace = @config[:template_namespace]
  formatted_templates = @templates.map do |name, function|
    "\"#{name}\": #{function}"
  end
  template = ERB.new File.read("#{ArchitectureJS::base_directory}/templates/templates_file.erb")
  @compiled_templates_file = template.result binding
  File.open("#{@root}/#{@config[:build_dir]}/templates.js", "w+") do |f|
    f << @compiled_templates_file
  end
end

#find_templates_in_directory(dir) ⇒ Object



116
117
118
119
120
121
122
# File 'lib/architecture-js/blueprint.rb', line 116

def find_templates_in_directory(dir)
  dir_glob = File.join(dir, "**", "*.jst")
  Dir.glob(dir_glob).each do |f|
    name = get_template_name f, dir
    @templates[name] = EJS.compile(File.read f)
  end
end

#get_file_name(module_path) ⇒ Object



156
157
158
159
# File 'lib/architecture-js/blueprint.rb', line 156

def get_file_name(module_path)
  module_file = module_path.split(/[\\\/]/).last
  module_filename = module_file.gsub(/\.js$/, '')
end

#get_src_filesObject



102
103
104
105
106
107
# File 'lib/architecture-js/blueprint.rb', line 102

def get_src_files
  @src_files = []
  [*@config[:src_dir]].each do |directory| 
    add_src_files_to_project File.expand_path(directory, @root)
  end      
end

#get_template_name(file, dir, ext = '.jst') ⇒ Object



124
125
126
# File 'lib/architecture-js/blueprint.rb', line 124

def get_template_name(file, dir, ext = '.jst')
  File.basename(file.gsub(/#{dir}\/?/, ''), ext)
end

#get_templatesObject



109
110
111
112
113
114
# File 'lib/architecture-js/blueprint.rb', line 109

def get_templates
  @templates = {}
  @template_directories.each do |dir|
    find_templates_in_directory dir
  end
end

#read_configObject



48
49
50
51
# File 'lib/architecture-js/blueprint.rb', line 48

def read_config
  config = YAML::load_file("#{@root}/#{@config_file}")
  assign_config_variables config
end

#update(compress = false) ⇒ Object



91
92
93
94
95
96
97
98
99
100
# File 'lib/architecture-js/blueprint.rb', line 91

def update(compress = false)
  read_config
  get_src_files
  get_templates
  create_templates_file unless @templates.empty?
  compile_src_files
  compress_application if compress || @config[:output] == 'compressed'
  puts ArchitectureJS::Notification.log "application updated" unless @errors
  @errors = false
end

#watch(message) ⇒ Object



195
196
197
198
# File 'lib/architecture-js/blueprint.rb', line 195

def watch(message)
  watcher = ArchitectureJS::Watcher.new self
  watcher.watch message
end

#write_configObject



75
76
77
78
79
80
81
82
83
84
# File 'lib/architecture-js/blueprint.rb', line 75

def write_config
  File.open("#{@root}/#{@config_file}", "w+") do |conf_file|
    @config.each do |key, value|
      conf_file << "#{key}: #{ArchitectureJS::Helpers.array_to_yml value}\n" if value.is_a? Array
      conf_file << "#{key}: #{value}\n" if value.is_a? String
    end
  end

  puts ArchitectureJS::Notification.added "#{@config_file} created"
end