distil 0.10.4 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/Rakefile +2 -1
  2. data/VERSION +1 -1
  3. data/assets/distil.js +359 -0
  4. data/bin/distil +33 -10
  5. data/distil.gemspec +35 -24
  6. data/lib/distil/configurable/file-set.rb +86 -0
  7. data/lib/distil/configurable/interpolated.rb +36 -0
  8. data/lib/distil/configurable/output-path.rb +25 -0
  9. data/lib/distil/configurable/project-path.rb +25 -0
  10. data/lib/distil/configurable.rb +164 -0
  11. data/lib/distil/error-reporter.rb +63 -0
  12. data/lib/distil/product/concatenated.rb +85 -0
  13. data/lib/distil/product/css-product.rb +37 -0
  14. data/lib/distil/product/debug.rb +34 -0
  15. data/lib/distil/product/javascript-base-product.rb +35 -0
  16. data/lib/distil/product/javascript-doc-product.rb +61 -0
  17. data/lib/distil/product/javascript-product.rb +131 -0
  18. data/lib/distil/product/minified.rb +32 -0
  19. data/lib/distil/product.rb +97 -0
  20. data/lib/distil/project/distil-project.rb +99 -0
  21. data/lib/distil/project/external-project.rb +53 -0
  22. data/lib/distil/project.rb +78 -0
  23. data/lib/distil/source-file/css-file.rb +14 -0
  24. data/lib/distil/source-file/html-file.rb +14 -0
  25. data/lib/distil/source-file/javascript-file.rb +17 -0
  26. data/lib/distil/source-file/json-file.rb +16 -0
  27. data/lib/distil/source-file.rb +172 -0
  28. data/lib/distil/target.rb +235 -0
  29. data/lib/distil/task/css-dependency-task.rb +64 -0
  30. data/lib/distil/task/jsl-dependency-task.rb +49 -0
  31. data/lib/distil/task/nib-task.rb +72 -0
  32. data/lib/distil/task/validate-js-task.rb +75 -0
  33. data/lib/distil/task.rb +50 -0
  34. data/lib/distil.rb +72 -0
  35. data/lib/jsl.conf +4 -0
  36. data/vendor/jsl-0.3.0/src/Makefile.ref +16 -6
  37. data/vendor/jsl-0.3.0/src/config.mk +32 -2
  38. data/vendor/jsl-0.3.0/src/fdlibm/Makefile.ref +1 -2
  39. data/vendor/jsl-0.3.0/src/jsl.c +124 -13
  40. data/vendor/jsl-0.3.0/src/rules.mk +2 -1
  41. metadata +49 -28
  42. data/lib/bootstrap-template.js +0 -58
  43. data/lib/configurable.rb +0 -161
  44. data/lib/file-set.rb +0 -49
  45. data/lib/file-types/css-file.rb +0 -12
  46. data/lib/file-types/html-file.rb +0 -11
  47. data/lib/file-types/javascript-file.rb +0 -24
  48. data/lib/file-types/json-file.rb +0 -17
  49. data/lib/filter.rb +0 -41
  50. data/lib/filters/css-filter.rb +0 -58
  51. data/lib/filters/file-reference-filter.rb +0 -30
  52. data/lib/filters/jsl-dependency-filter.rb +0 -44
  53. data/lib/project.rb +0 -174
  54. data/lib/source-file.rb +0 -197
  55. data/lib/target.rb +0 -102
  56. data/lib/task.rb +0 -212
  57. data/lib/tasks/copy-task.rb +0 -17
  58. data/lib/tasks/css-task.rb +0 -12
  59. data/lib/tasks/javascript-task.rb +0 -206
  60. data/lib/tasks/multiple-output-task.rb +0 -140
  61. data/lib/tasks/output-task.rb +0 -76
  62. data/lib/tasks/single-output-task.rb +0 -104
  63. data/lib/tasks/test-task.rb +0 -280
@@ -1,104 +0,0 @@
1
- require "#{$script_dir}/tasks/output-task.rb"
2
-
3
- class SingleOutputTask < OutputTask
4
-
5
- option :output_name, ""
6
-
7
- def initialize(target, options)
8
- super(target, options)
9
-
10
- type= output_extension
11
- return if (!type)
12
-
13
- if (!output_name.empty?)
14
- target_name= "#{output_name}"
15
- prefix= "#{output_folder}/"
16
- else
17
- target_name= "#{target.target_name}".downcase
18
- prefix= "#{output_folder}/#{project_name}"
19
- if ("all"==target_name)
20
- target_name= ""
21
- else
22
- prefix= "#{prefix}-"
23
- end
24
- end
25
-
26
- @name_concat= "#{prefix}#{target_name}-uncompressed#{type}"
27
- @name_min= "#{prefix}#{target_name}#{type}"
28
- @name_gz= "#{prefix}#{target_name}#{type}.gz"
29
- @name_debug= "#{prefix}#{target_name}-debug#{type}"
30
-
31
- @concatenation_join_string= ""
32
- @products= [@name_concat, @name_min, @name_gz, @name_debug]
33
-
34
- @concat = ""
35
- @debug = ""
36
- end
37
-
38
- def process_file(file)
39
- if (!@concat.empty?)
40
- @concat << @concatenation_join_string||""
41
- end
42
- @concat << file.filtered_content(options)
43
- @debug << file.debug_content(options)
44
- end
45
-
46
- def process_files
47
- @included_files.each { |f| process_file(f) }
48
- end
49
-
50
- def uncompressed_preamble
51
- ""
52
- end
53
-
54
- def uncompressed_postscript
55
- ""
56
- end
57
-
58
- def finish
59
- return if (!output_type)
60
-
61
- # Clear old files
62
- [@name_concat, @name_min, @name_gz, @name_debug].each { |file|
63
- next if (!File.exists?(file))
64
- File.delete(file)
65
- }
66
-
67
- return if (""==@concat)
68
-
69
- params= {
70
- "VERSION"=>@options.version
71
- }
72
-
73
- concat= replace_tokens(@concat, params)
74
-
75
- File.open(@name_concat, "w") { |f|
76
- f.write(notice_text)
77
- f.write(uncompressed_preamble)
78
- f.write(concat)
79
- f.write(uncompressed_postscript)
80
- }
81
-
82
- minified= minify(concat)
83
-
84
- File.open(@name_min, "w") { |f|
85
- f.write(notice_text)
86
- f.write(minified)
87
- }
88
-
89
- Zlib::GzipWriter.open(@name_gz) { |f|
90
- f.write(notice_text)
91
- f.write(minified)
92
- }
93
-
94
- return if (""==@debug)
95
-
96
- File.open(@name_debug, "w") { |f|
97
- f.write(notice_text)
98
- debug= replace_tokens(@debug, params)
99
- f.write(debug)
100
- }
101
- end
102
-
103
- end
104
-
@@ -1,280 +0,0 @@
1
- #######
2
- # NOT READY FOR USE
3
- #######
4
-
5
-
6
- require 'webrick'
7
- require "#{$script_dir}/test/browser.rb"
8
-
9
- include WEBrick
10
-
11
- $unit_test_html= File.read("#{$script_dir}/test/unittest.html")
12
- $script_wrapper_html= File.read("#{$script_dir}/test/scriptwrapper.html")
13
-
14
- def replace_tokens(string, params)
15
- return string.gsub(/(\n[\t ]*)?@([^@ \t\r\n]*)@/) { |m|
16
- key= $2
17
- ws= $1
18
- value= params[key]||m;
19
- if (ws && ws.length)
20
- ws + value.split("\n").join(ws);
21
- else
22
- value
23
- end
24
- }
25
- end
26
-
27
- def relative_path(file, output_folder)
28
- outputFolder= File.expand_path(output_folder).to_s
29
- file= File.expand_path(file).to_s
30
-
31
- # Remove leading slash and split into parts
32
- file_parts= file.slice(1..-1).split('/');
33
- output_parts= outputFolder.slice(1..-1).split('/');
34
-
35
- common_prefix_length= 0
36
-
37
- file_parts.each_index { |i|
38
- common_prefix_length= i
39
- break if file_parts[i]!=output_parts[i]
40
- }
41
-
42
- return '../'*(output_parts.length-common_prefix_length) + file_parts[common_prefix_length..-1].join('/')
43
- end
44
-
45
- def order_files(file, ordered_files= Array.new, probed= Set.new)
46
- return if probed.include?(file)
47
- return if ordered_files.include?(file)
48
- probed << file
49
-
50
- file.dependencies.each { |d| order_files(d, ordered_files, probed) }
51
- ordered_files << file
52
-
53
- ordered_files
54
- end
55
-
56
- # Create an HTML wrapper file for a JavaScript file. The wrapper will include
57
- # one script tag for each imported file in the script. This means you don't
58
- # have to write lots of silly wrapper HTML files for your tests.
59
- def html_wrapper_for_script_file(script_file)
60
- source_file= SourceFile.from_path(script_file)
61
-
62
- files= order_files(source_file)
63
-
64
- current_dir= File.expand_path('.')
65
-
66
- files.map! { |file|
67
- # file= file.gsub(/-uncompressed\.js/, '-debug.js')
68
- file.relative_to_folder(current_dir)
69
- }
70
-
71
- scripts= files.map { |file|
72
- "<script src=\"#{file}\" type=\"text/javascript\" charset=\"utf-8\"></script>"
73
- }
74
-
75
- replace_tokens($script_wrapper_html, {
76
- "scripts" => scripts.join("\n"),
77
- "title" => "#{script_file}"
78
- })
79
- end
80
-
81
- class ScriptWrapper < HTTPServlet::AbstractServlet
82
-
83
- def do_GET(request, response)
84
- response.status = 200
85
- response['Content-Type'] = 'text/html'
86
-
87
- file= request.query.to_s
88
- response.body = html_wrapper_for_script_file(file)
89
- end
90
-
91
- end
92
-
93
- class WEBrick::HTTPServlet::AbstractServlet
94
- def prevent_caching(res)
95
- res['ETag'] = nil
96
- res['Last-Modified'] = Time.now + 100**4
97
- res['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'
98
- res['Pragma'] = 'no-cache'
99
- res['Expires'] = Time.now - 100**4
100
- end
101
- end
102
-
103
- class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler
104
- def do_GET(req, res)
105
- super
106
- set_default_content_type(res, req.path)
107
- prevent_caching(res)
108
- end
109
-
110
- def set_default_content_type(res, path)
111
- res['Content-Type'] = case path
112
- when /\.js$/ then 'text/javascript'
113
- when /\.html$/ then 'text/html'
114
- when /\.css$/ then 'text/css'
115
- else 'text/plain'
116
- end
117
- end
118
- end
119
-
120
- class BrowserTestServlet < HTTPServlet::AbstractServlet
121
-
122
- def initialize(server, browser_test)
123
- super(server)
124
- @browser_test= browser_test
125
- end
126
-
127
- def generate_file(filename)
128
- params= {
129
- 'file'=>filename
130
- }
131
- return replace_tokens($unit_test_html, params)
132
- end
133
-
134
- def do_GET(request, response)
135
- prevent_caching(response)
136
-
137
- file= request.query.to_s
138
- if ("first_file"==file)
139
- response.status= 302
140
- response['Location']= @browser_test.next_file
141
- response.body= "Forwarded..."
142
- return
143
- end
144
-
145
- response.status = 200
146
- response['Content-Type'] = 'text/html'
147
- response.body = $unit_test_html
148
- end
149
-
150
- def do_POST(request, response)
151
- prevent_caching(response)
152
- q= request.query
153
-
154
- failures= []
155
-
156
- q['failures'].split('~!~').each { |line|
157
- failures << "#{line}"
158
- }
159
-
160
- location= @browser_test.send_results({
161
- 'failures' => failures,
162
- 'passed' => q['numberOfPasses'].to_i,
163
- 'failed' => q['numberOfFailures'].to_i,
164
- 'skipped' => q['numberOfSkipped'].to_i
165
- })
166
-
167
- response.status= 302
168
- response['Location']= location
169
- response.body="Redirected..."
170
- end
171
-
172
- end
173
-
174
- class TestTask < Task
175
-
176
- option :browsers, ['safari']
177
- option :tests, FileSet
178
- option :run_tests, false
179
-
180
- def initialize(target, options)
181
- super(target, options)
182
- @result_queue= Queue.new
183
- @file_queue= Queue.new
184
-
185
- @files_to_include= @options.tests.to_a
186
-
187
- @passed= 0
188
- @failed= 0
189
- @skipped= 0
190
- end
191
-
192
- def handles_file?(file_name)
193
- "#{file_name}"[/\.js$/] || "#{file_name}"[/\.html$/]
194
- end
195
-
196
- def start_webserver()
197
- access_log_stream = File.open('/dev/null', 'w')
198
- access_log = [[access_log_stream, AccessLog::COMBINED_LOG_FORMAT]]
199
-
200
- # @server = HTTPServer.new(:Port=>8000)
201
- #
202
- @server = HTTPServer.new(:Port=>8000, :Logger=>Log.new(nil, BasicLog::WARN),
203
- :AccessLog=>[])
204
-
205
- @server.mount "/wrapped", ScriptWrapper
206
- @server.mount "/lib", NonCachingFileHandler, $script_dir
207
- @server.mount "/", NonCachingFileHandler, "."
208
-
209
- trap "INT" do @server.shutdown end
210
- t= Thread.new { @server.start }
211
- end
212
-
213
- def next_file()
214
- file= @file_queue.pop
215
- file= relative_path(file, Dir.getwd)
216
-
217
- if (file[/\.js$/])
218
- file= "/wrapped?#{file}"
219
- end
220
- return file
221
- end
222
-
223
- def send_results(results)
224
- @result_queue.push(results)
225
- next_file
226
- end
227
-
228
- def cleanup()
229
- # find the files again, because tests often include output files, which may
230
- # not be present in a clean build
231
- find_files
232
-
233
- return if (!@options.run_tests || 'false'===@options.run_tests || 'no'===@options.run_tests)
234
- return if (0==@included_files.length)
235
-
236
- start_webserver
237
- @server.mount "/unittest", BrowserTestServlet, self
238
-
239
- puts "browsers=#{@options.browsers.inspect}"
240
- browsers= @options.browsers.map { |b| "#{b}".downcase }
241
-
242
- browsers.each { |b|
243
- browser= ($browsers[b]).new
244
- next if !browser.supported?
245
-
246
- browser.setup
247
- browser.visit("http://localhost:8000/unittest")
248
-
249
- @included_files.each { |f|
250
-
251
- @file_queue.push(f)
252
- status= @result_queue.pop
253
-
254
- file= File.expand_path(f)
255
-
256
- @passed= status['passed']
257
- @failed= status['failed']
258
- @skipped= status['skipped']
259
-
260
- status['failures'].each { |line|
261
- puts "#{file}: #{line}"
262
- }
263
-
264
- }
265
-
266
- # release waiting call to send_results
267
- @file_queue.push('about:blank');
268
-
269
- puts "#{b}: #{@passed} passed #{@failed} failed #{@skipped} skipped\n"
270
- }
271
-
272
- @server.unmount "/unittest"
273
- @server.shutdown
274
- end
275
-
276
- def need_to_build
277
- true
278
- end
279
-
280
- end