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 CHANGED
@@ -6,15 +6,19 @@
6
6
 
7
7
  ##Usage:
8
8
 
9
- fel init
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
- fel compile
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
@@ -6,4 +6,10 @@ when "init"
6
6
  fel.init_app
7
7
  when "compile"
8
8
  fel.compile
9
+ when "listen"
10
+ fel.listen
11
+ when "watch"
12
+ fel.listen
13
+ when "--watch"
14
+ fel.listen
9
15
  end
@@ -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.1'
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
- if less_files.length > 0 then
57
-
58
- less_files.delete("style.less")
59
- less_string = ""
60
- less_files.each { |file|
61
- puts "Loading #{file}..."
62
- file = file.gsub(".less","")
63
- less_string = less_string + "@import '#{file}'; \n"
64
- File.open('style.less','w') { |f|
65
- f.write(less_string)
66
- }
67
- }
68
- %x[lessc style.less style.css]
69
- # %x[rm style.less]
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
- template_joiner = FilesToJs.new({
77
- :file_dir => '.',
78
- :file_format => @settings['templates']['format'],
79
- :js_object_name => @settings['templates']['varname'],
80
- :output => @settings['templates']['varname']+".js",
81
- })
82
- template_joiner.write_js
83
-
84
-
85
-
86
- #Javascript (includes joined templates)
87
-
88
-
89
- javascript = JsCat.new({
90
- :js_dir => '.',
91
- :prioritize => @settings['javascript']['prioritize'],
92
- :ignore => ['js.js'],
93
- :compress => @settings['javascript']['compress'],
94
- :output => 'js.js'
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
- puts "Compiled into js.js and style.css"
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
- def create_view(view_title)
105
- return false unless load_settings
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
- File.open("#{style_directory}/#{view_title}.less",'w') { |f|
121
- f.write(style_string)
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
- templates_directory = @settings['templates']['directory']
146
- templates_format = @settings['templates']['format']
147
-
148
- File.open("#{templates_directory}/#{view_title}.#{templates_format}",'w') { |f|
149
- f.write("")
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
- # FRONTENDLOADER CONFIG
1
+ # FrontendLoader Configuration
2
2
 
3
3
  javascript:
4
- framework: "mootools"
5
- directory: "."
6
- compress: false
4
+ enabled: true
5
+ yui: true
6
+ jsmin: true
7
7
  prioritize:
8
+ - priority.js
8
9
  ignore:
9
- -"js.js"
10
-
10
+ - ignored.js
11
11
 
12
12
  css:
13
- framework: "less"
14
- directory: "."
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
- format: "mustache"
21
- varname: "templates"
22
- directory: "."
21
+ enabled: true
22
+ format: mustache
23
+ varname: templates
24
+ prioritize:
25
+ - priority.mustache
23
26
  ignore:
27
+ - ignored.mustache
data/resources/Guardfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # FrontendLoader Guardfile
2
2
 
3
- ignore_paths 'js.js','templates.js', 'lfc.js'
3
+ ignore_paths 'js.js','templates.js'
4
4
 
5
5
  guard 'shell' do
6
6
  watch(/(.*).js/) {|m| `fel compile` }
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.3
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: &70154404498300 !ruby/object:Gem::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: *70154404498300
25
+ version_requirements: *70147735023720
48
26
  - !ruby/object:Gem::Dependency
49
27
  name: guard-shell
50
- requirement: &70154404497780 !ruby/object:Gem::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: *70154404497780
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