frontendloader 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +6 -2
- data/bin/fel +6 -0
- data/lib/FrontEndLoader.rb +126 -98
- data/lib/processors/less.rb +16 -0
- data/lib/processors/scss.rb +15 -0
- data/resources/FrontEndLoader.yml +16 -12
- data/resources/Guardfile +1 -1
- metadata +8 -27
data/README.rdoc
CHANGED
@@ -6,15 +6,19 @@
|
|
6
6
|
|
7
7
|
##Usage:
|
8
8
|
|
9
|
-
|
9
|
+
fel init
|
10
10
|
|
11
11
|
Creates a config yaml file, where you can name files and variables, and prioritize the loading of certain scripts and styles.
|
12
12
|
|
13
|
-
|
13
|
+
fel compile
|
14
14
|
|
15
15
|
- Scans the directory containing FrontendLoader.yml for .less files, .mustache templates and .js scripts.
|
16
16
|
- Compiles the .less files down to css.
|
17
17
|
- Joins the mustache templates into a single javascript object: templates = {}
|
18
18
|
- Joins javascript files together (including mustache templates) and yui compresses if set in yml.
|
19
19
|
|
20
|
+
fel watch
|
21
|
+
|
22
|
+
- Watches for file changes and automatically runs fel compile
|
23
|
+
|
20
24
|
**IMPORTANT: Requires less.js & node for .less compilation: see & install http://lesscss.org/#-server-side-usage**
|
data/bin/fel
CHANGED
data/lib/FrontEndLoader.rb
CHANGED
@@ -1,42 +1,41 @@
|
|
1
1
|
require 'jscat'
|
2
2
|
require 'filestojs'
|
3
3
|
require 'yaml'
|
4
|
+
require 'listen'
|
4
5
|
|
5
6
|
class FrontendLoader
|
6
7
|
|
7
8
|
attr_accessor :resources_path
|
9
|
+
attr_accessor :settings
|
8
10
|
|
9
11
|
def initialize
|
10
|
-
version = '0.0.
|
12
|
+
version = '0.0.4'
|
11
13
|
@gem_path = Gem.path[0]+"/gems/frontendloader-"+version
|
12
14
|
@resources_path = Gem.path[0]+"/gems/frontendloader-"+version+"/resources"
|
15
|
+
@processors = {}
|
13
16
|
end
|
14
17
|
|
15
18
|
def init_app
|
16
|
-
|
17
19
|
if File.exists? 'FrontendLoader.yml' then
|
18
20
|
puts "Frontend Loader already initialized"
|
19
21
|
return false
|
20
22
|
end
|
21
|
-
|
22
23
|
config_path = @resources_path+"/FrontendLoader.yml"
|
23
|
-
guard_path = @resources_path+"/Guardfile"
|
24
|
+
# guard_path = @resources_path+"/Guardfile"
|
24
25
|
%x[cp #{config_path} FrontendLoader.yml]
|
25
|
-
%x[cp #{guard_path} Guardfile]
|
26
|
+
# %x[cp #{guard_path} Guardfile]
|
26
27
|
puts "Created basic FrontendLoader app, check FrontendLoader.yml for config"
|
28
|
+
puts "To automatically compile upon file saves, run \"fel listen\""
|
27
29
|
end
|
28
30
|
|
29
31
|
def boilerplate
|
30
32
|
load_settings
|
31
33
|
end
|
32
|
-
|
33
34
|
|
34
35
|
def load_settings
|
35
|
-
|
36
36
|
if ! File.exists? 'FrontendLoader.yml' then
|
37
37
|
init_app
|
38
38
|
end
|
39
|
-
|
40
39
|
begin
|
41
40
|
@settings = YAML.load_file('FrontendLoader.yml')
|
42
41
|
return true
|
@@ -46,113 +45,142 @@ class FrontendLoader
|
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
48
|
+
|
49
49
|
def compile
|
50
50
|
return false unless load_settings
|
51
|
-
|
52
|
-
#less
|
53
|
-
|
54
|
-
less_files = Dir.glob("*.less")
|
55
51
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
52
|
+
#CSS
|
53
|
+
if @settings['css']['enabled'] then
|
54
|
+
css_source_files = Dir.glob("*.#{@settings['css']['format']}")
|
55
|
+
if @settings['css']['prioritize'] then
|
56
|
+
css_source_files = prioritize_files(css_source_files,@settings['css']['prioritize'])
|
57
|
+
end
|
58
|
+
if @settings['css']['ignore']
|
59
|
+
css_source_files = clean_ignored_files(css_source_files,@settings['css']['ignore'])
|
60
|
+
end
|
61
|
+
begin
|
62
|
+
css_processor_found = require "processors/#{@settings['css']['format']}.rb"
|
63
|
+
rescue Exception => e
|
64
|
+
puts "No processor for #{@settings['css']['format']} found"
|
65
|
+
css_processor_found = false
|
66
|
+
end
|
67
|
+
if css_processor_found then
|
68
|
+
css_processor = CSS_Processor.new
|
69
|
+
css_processor.process(css_source_files)
|
70
|
+
end
|
71
|
+
puts "Compiled css into css.css"
|
71
72
|
end
|
72
73
|
|
73
|
-
|
74
74
|
#TEMPLATES
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
})
|
96
|
-
|
97
|
-
%x[rm templates.js]
|
75
|
+
if @settings['templates']['enabled'] then
|
76
|
+
template_files = Dir.glob("*.#{@settings['templates']['format']}")
|
77
|
+
if @settings['templates']['prioritize'] then
|
78
|
+
template_files = prioritize_files(template_files,@settings['templates']['prioritize'])
|
79
|
+
end
|
80
|
+
if @settings['templates']['ignore'] then
|
81
|
+
template_files = clean_ignored_files(template_files,@settings['templates']['ignore'])
|
82
|
+
end
|
83
|
+
templates_source = "#{@settings['templates']['varname']} = {};\n"
|
84
|
+
template_files.each {|file|
|
85
|
+
template_markup = File.read(file)
|
86
|
+
template_markup.gsub!("\n","")
|
87
|
+
template_markup.gsub!("\"","\\\"")
|
88
|
+
template_markup = template_markup.strip.gsub(/\s{2,}/, ' ')
|
89
|
+
templates_source << "#{@settings['templates']['varname']}['#{file.split('.')[0]}'] = \"#{template_markup}\";\n"
|
90
|
+
}
|
91
|
+
puts "Compiled templates into #{@settings['templates']['varname']} variable"
|
92
|
+
else
|
93
|
+
templates_source = ""
|
94
|
+
end
|
98
95
|
|
99
|
-
|
96
|
+
#JS
|
97
|
+
if @settings['javascript']['enabled'] then
|
98
|
+
js_source_files = Dir.glob("*.js")
|
99
|
+
if @settings['javascript']['prioritize'] then
|
100
|
+
js_source_files = prioritize_files(js_source_files,@settings['javascript']['prioritize'])
|
101
|
+
end
|
102
|
+
# if @settings['javascript']['ignore'].class != Array then
|
103
|
+
# @settings['javascript']['ignore'] = []
|
104
|
+
# end
|
105
|
+
if @settings['javascript']['ignore'] then
|
106
|
+
js_source_files = clean_ignored_files(js_source_files,(@settings['javascript']['ignore'] << 'js.js'))
|
107
|
+
end
|
108
|
+
js_source = ""
|
109
|
+
js_source_files.each { |file|
|
110
|
+
js_source << File.read(file)+"\n"
|
111
|
+
}
|
112
|
+
js_source << templates_source
|
113
|
+
if @settings['javascript']['jsmin'] then
|
114
|
+
begin
|
115
|
+
jsmin = require "jsmin"
|
116
|
+
rescue Exception => e
|
117
|
+
puts "JSmin not installed"
|
118
|
+
end
|
119
|
+
if jsmin then
|
120
|
+
js_source = JSMin.minify(js_source)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
if @settings['javascript']['yui'] then
|
124
|
+
begin
|
125
|
+
yui = require "yui/compressor"
|
126
|
+
rescue Exception => e
|
127
|
+
puts "YUI compressor gem not installed"
|
128
|
+
end
|
129
|
+
if yui then
|
130
|
+
compressor = YUI::JavaScriptCompressor.new
|
131
|
+
js_source = compressor.compress(js_source)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
File.open('js.js','w') { |f|
|
135
|
+
f.write(js_source)
|
136
|
+
}
|
137
|
+
puts "Compiled javascript into js.js"
|
138
|
+
end
|
100
139
|
|
101
140
|
end
|
102
141
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
style_format = @settings['css']['framework']
|
108
|
-
style_directory = @settings['css']['directory']
|
109
|
-
style_string = ".#{view_title} {
|
110
|
-
|
111
|
-
}
|
112
|
-
"
|
113
|
-
|
114
|
-
if File.exists? "#{view_title}.#{@settings['css']['framework']}" then
|
115
|
-
puts "View already exists"
|
116
|
-
return false
|
142
|
+
def prioritize_files(files, priority_files=[],path="")
|
143
|
+
if priority_files.class != Array then
|
144
|
+
priority_files = []
|
117
145
|
end
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
classwords = view_title.split('_')
|
125
|
-
classwords.each {|word|
|
126
|
-
word.capitalize!
|
127
|
-
}
|
128
|
-
|
129
|
-
classname = classwords.join
|
130
|
-
|
131
|
-
if classwords.last != "View" then classname = classname+"View" end
|
132
|
-
|
133
|
-
js_directory = @settings['javascript']['directory']
|
134
|
-
|
135
|
-
js_string = ""
|
136
|
-
|
137
|
-
viewtemplate = File.open("#{@resources_path}/js/mootools/View.js",'r').read
|
138
|
-
js_string = js_string+viewtemplate.gsub('VIEWCLASSNAME',classname).gsub('VIEWTITLE',view_title)
|
139
|
-
|
140
|
-
|
141
|
-
File.open("#{js_directory}/#{classname}.js",'w') { |f|
|
142
|
-
f.write(js_string)
|
146
|
+
priority_files.uniq.each {|file|
|
147
|
+
if files.include? file then
|
148
|
+
files.delete file
|
149
|
+
else
|
150
|
+
priority_files.delete file
|
151
|
+
end
|
143
152
|
}
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
153
|
+
prioritized_files = priority_files + files
|
154
|
+
return prioritized_files
|
155
|
+
end
|
156
|
+
|
157
|
+
def clean_ignored_files(files, ignored_files=[],path="")
|
158
|
+
if ignored_files.class != Array then
|
159
|
+
ignored_files = []
|
160
|
+
end
|
161
|
+
cleaned_list = []
|
162
|
+
ignored_files.uniq.each {|file|
|
163
|
+
if files.include? file then
|
164
|
+
files.delete file
|
165
|
+
end
|
150
166
|
}
|
151
|
-
|
167
|
+
return files
|
168
|
+
end
|
169
|
+
|
152
170
|
|
171
|
+
def listen
|
172
|
+
begin
|
173
|
+
listener = Listen.to("./", :filter => %r{(.*).(js|css|less|scss|mustache|handlebars|html)}, :ignore => [/js.js/,/style.css/]) do
|
174
|
+
compile
|
175
|
+
end
|
176
|
+
listener = listener.ignore(/js.js/,/style.css/)
|
177
|
+
rescue Exception => e
|
178
|
+
puts "\nListening stopped"
|
179
|
+
end
|
153
180
|
end
|
154
181
|
|
155
182
|
|
183
|
+
|
156
184
|
|
157
185
|
|
158
186
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CSS_Processor
|
2
|
+
def process(less_files)
|
3
|
+
if less_files.length > 0 then
|
4
|
+
less_files.delete("style.less")
|
5
|
+
less_string = ""
|
6
|
+
less_files.each { |file|
|
7
|
+
file = file.gsub(".less","")
|
8
|
+
less_string = less_string + "@import '#{file}'; \n"
|
9
|
+
File.open('style.less','w') { |f|
|
10
|
+
f.write(less_string)
|
11
|
+
}
|
12
|
+
}
|
13
|
+
%x[lessc style.less style.css]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "sass"
|
2
|
+
|
3
|
+
class CSS_Processor
|
4
|
+
def process(files)
|
5
|
+
scss_string = ""
|
6
|
+
files.each { |file|
|
7
|
+
scss_string << File.read(file)+"\n"
|
8
|
+
}
|
9
|
+
engine = Sass::Engine.new(scss_string, :syntax => :scss)
|
10
|
+
css = engine.render
|
11
|
+
File.open('style.css','w') { |f|
|
12
|
+
f.write(css)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
@@ -1,23 +1,27 @@
|
|
1
|
-
#
|
1
|
+
# FrontendLoader Configuration
|
2
2
|
|
3
3
|
javascript:
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
enabled: true
|
5
|
+
yui: true
|
6
|
+
jsmin: true
|
7
7
|
prioritize:
|
8
|
+
- priority.js
|
8
9
|
ignore:
|
9
|
-
-
|
10
|
-
|
10
|
+
- ignored.js
|
11
11
|
|
12
12
|
css:
|
13
|
-
|
14
|
-
|
13
|
+
enabled: true
|
14
|
+
format: scss
|
15
15
|
prioritize:
|
16
|
+
- priority.scss
|
16
17
|
ignore:
|
17
|
-
|
18
|
+
- ignored.scss
|
18
19
|
|
19
20
|
templates:
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
enabled: true
|
22
|
+
format: mustache
|
23
|
+
varname: templates
|
24
|
+
prioritize:
|
25
|
+
- priority.mustache
|
23
26
|
ignore:
|
27
|
+
- ignored.mustache
|
data/resources/Guardfile
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frontendloader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,31 +12,9 @@ bindir: bin
|
|
12
12
|
cert_chain: []
|
13
13
|
date: 2011-10-28 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: jscat
|
17
|
-
requirement: &70154404499240 !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
|
-
requirements:
|
20
|
-
- - ! '>='
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 1.0.2
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: *70154404499240
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: filestojs
|
28
|
-
requirement: &70154404498760 !ruby/object:Gem::Requirement
|
29
|
-
none: false
|
30
|
-
requirements:
|
31
|
-
- - ! '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.0.1
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: *70154404498760
|
37
15
|
- !ruby/object:Gem::Dependency
|
38
16
|
name: guard
|
39
|
-
requirement: &
|
17
|
+
requirement: &70147735023720 !ruby/object:Gem::Requirement
|
40
18
|
none: false
|
41
19
|
requirements:
|
42
20
|
- - ! '>='
|
@@ -44,10 +22,10 @@ dependencies:
|
|
44
22
|
version: 0.8.8
|
45
23
|
type: :runtime
|
46
24
|
prerelease: false
|
47
|
-
version_requirements: *
|
25
|
+
version_requirements: *70147735023720
|
48
26
|
- !ruby/object:Gem::Dependency
|
49
27
|
name: guard-shell
|
50
|
-
requirement: &
|
28
|
+
requirement: &70147735022900 !ruby/object:Gem::Requirement
|
51
29
|
none: false
|
52
30
|
requirements:
|
53
31
|
- - ! '>='
|
@@ -55,7 +33,7 @@ dependencies:
|
|
55
33
|
version: 0.2.0
|
56
34
|
type: :runtime
|
57
35
|
prerelease: false
|
58
|
-
version_requirements: *
|
36
|
+
version_requirements: *70147735022900
|
59
37
|
description: Accelerated front end development
|
60
38
|
email: dan@explodingbox.com
|
61
39
|
executables:
|
@@ -65,6 +43,8 @@ extra_rdoc_files: []
|
|
65
43
|
files:
|
66
44
|
- README.rdoc
|
67
45
|
- lib/FrontEndLoader.rb
|
46
|
+
- lib/processors/less.rb
|
47
|
+
- lib/processors/scss.rb
|
68
48
|
- resources/FrontEndLoader.yml
|
69
49
|
- resources/Guardfile
|
70
50
|
- bin/fel
|
@@ -94,3 +74,4 @@ specification_version: 3
|
|
94
74
|
summary: A command line interface for rapid creation of web app interfaces, compiling
|
95
75
|
less, js and mustache files into two requests
|
96
76
|
test_files: []
|
77
|
+
has_rdoc: true
|