distil 0.13.6 → 0.14.0.b
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/assets/distil.js +9 -7
- data/bin/distil +36 -60
- data/distil.gemspec +17 -32
- data/distil.tmproj +46 -15
- data/lib/distil/browser.rb +30 -26
- data/lib/distil/configurable.rb +64 -153
- data/lib/distil/error-reporter.rb +22 -20
- data/lib/distil/file-vendor.rb +29 -0
- data/lib/distil/hash-additions.rb +45 -0
- data/lib/distil/javascript-code.rb +12 -0
- data/lib/distil/{task/validate-js-task.rb → javascript-file-validator.rb} +19 -23
- data/lib/distil/library.rb +243 -0
- data/lib/distil/product/cache-manifest-product.rb +21 -0
- data/lib/distil/product/css-product.rb +41 -23
- data/lib/distil/product/html-product.rb +20 -0
- data/lib/distil/product/javascript-product.rb +122 -111
- data/lib/distil/product.rb +90 -76
- data/lib/distil/project.rb +370 -104
- data/lib/distil/recursive-http-fetcher.rb +72 -0
- data/lib/distil/server.rb +43 -0
- data/lib/distil/source-file/css-file.rb +56 -3
- data/lib/distil/source-file/html-file.rb +5 -6
- data/lib/distil/source-file/javascript-file.rb +96 -8
- data/lib/distil/source-file/json-file.rb +2 -4
- data/lib/distil/source-file/yui-minifiable-file.rb +19 -0
- data/lib/distil/source-file.rb +50 -92
- data/lib/distil/subclass-tracker.rb +13 -0
- data/lib/distil.rb +21 -37
- metadata +40 -39
- data/assets/mime.types +0 -1240
- data/lib/distil/configurable/file-set.rb +0 -85
- data/lib/distil/configurable/interpolated.rb +0 -36
- data/lib/distil/configurable/output-path.rb +0 -25
- data/lib/distil/configurable/project-path.rb +0 -25
- data/lib/distil/product/concatenated.rb +0 -83
- data/lib/distil/product/debug.rb +0 -32
- data/lib/distil/product/javascript-base-product.rb +0 -35
- data/lib/distil/product/javascript-doc-product.rb +0 -61
- data/lib/distil/product/minified.rb +0 -41
- data/lib/distil/product/page-product.rb +0 -27
- data/lib/distil/product/pdoc-product.rb +0 -42
- data/lib/distil/project/distil-project.rb +0 -157
- data/lib/distil/project/external-project.rb +0 -58
- data/lib/distil/project/remote-project.rb +0 -43
- data/lib/distil/target.rb +0 -251
- data/lib/distil/task/css-dependency-task.rb +0 -64
- data/lib/distil/task/jsl-dependency-task.rb +0 -50
- data/lib/distil/task/nib-task.rb +0 -72
- data/lib/distil/task.rb +0 -50
- data/lib/jsdoc.conf +0 -18
- data/lib/test/HtmlTestReporter.js +0 -127
- data/lib/test/Test.js +0 -248
- data/lib/test/TestReporter.js +0 -79
- data/lib/test/TestRunner.js +0 -132
- data/lib/test/browser.rb +0 -97
- data/lib/test/scriptwrapper.html +0 -10
- data/lib/test/unittest.html +0 -127
data/lib/distil/configurable.rb
CHANGED
@@ -1,168 +1,79 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
def Boolean(string)
|
4
|
-
return true if string == true || string =~ /^true$/i
|
5
|
-
return false if string == false || string.nil? || string =~ /^false$/i
|
6
|
-
raise ArgumentError.new("invalid value for Boolean: \"#{string}\"")
|
7
|
-
end
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
class ValidationError < StandardError
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
class Configurable
|
16
|
-
attr_reader :options
|
1
|
+
module Distil
|
17
2
|
|
18
|
-
|
19
|
-
|
20
|
-
def get_option(name)
|
21
|
-
return nil if !@options.respond_to?(name)
|
22
|
-
value=@options[name]
|
23
|
-
value.respond_to?(:value_of) ? value.value_of(self) : value
|
24
|
-
end
|
25
|
-
|
26
|
-
def get_options(settings=nil, parent=nil)
|
27
|
-
keys= @@options.keys
|
28
|
-
values= @@options.map { |k,v| convert_type(v[:type], v[:value]) }
|
3
|
+
class Configurable
|
29
4
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
setting_keys= settings.keys.map { |key| key.to_s }
|
34
|
-
|
35
|
-
@@options.each { |key, value|
|
36
|
-
|
37
|
-
intersect= value[:aliases] & setting_keys
|
38
|
-
next if !parent && intersect.empty?
|
39
|
-
|
40
|
-
if (intersect.empty?)
|
41
|
-
s[key]= parent[key]
|
42
|
-
next
|
43
|
-
end
|
44
|
-
|
45
|
-
if (intersect.length>1)
|
46
|
-
raise ArgumentError, "Multiple variants for #{key.to_s} defined: #{intersect.join(", ")}"
|
47
|
-
end
|
48
|
-
|
49
|
-
setting_key= intersect[0]
|
50
|
-
setting_value= settings[setting_key]
|
51
|
-
settings.delete(setting_key)
|
52
|
-
|
53
|
-
# decide if any type conversions are needed...
|
54
|
-
setting_value= convert_type(value[:type], setting_value)
|
55
|
-
|
56
|
-
if (value.has_key?(:valid_values) && !value[:valid_values].include?(setting_value))
|
57
|
-
raise ValidationError, "Invalid value for '#{setting_key}': #{setting_value}"
|
58
|
-
end
|
59
|
-
|
60
|
-
s[key]= setting_value
|
61
|
-
|
62
|
-
}
|
63
|
-
|
64
|
-
@extras.merge!(settings)
|
65
|
-
s
|
66
|
-
end
|
67
|
-
|
68
|
-
# option name, [type], [default], [options]
|
69
|
-
def self.option(name, *rest)
|
70
|
-
|
71
|
-
name_string= name.to_s
|
72
|
-
|
73
|
-
info= {
|
74
|
-
:aliases=>[name_string, name_string.gsub('_', '-'), name_string.gsub('_', ' ')].uniq
|
75
|
-
}
|
76
|
-
|
77
|
-
arg= rest.shift
|
78
|
-
|
79
|
-
if (arg.is_a?(Class) || arg==URI)
|
80
|
-
info[:type]= arg
|
81
|
-
info[:value]= nil
|
82
|
-
arg= rest.shift
|
5
|
+
@@config_aliases={}
|
6
|
+
def self.alias_config_key(original, key_alias)
|
7
|
+
@@config_aliases[key_alias.to_s]= original.to_s
|
83
8
|
end
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
arg= rest.shift
|
9
|
+
|
10
|
+
def key_for_alias(key_alias)
|
11
|
+
key_alias= key_alias.to_s.gsub("-", "_").gsub(" ", "_")
|
12
|
+
@@config_aliases[key_alias] || key_alias
|
89
13
|
end
|
14
|
+
|
15
|
+
class ConfigDsl
|
90
16
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
info[:aliases].concat(arg[:aliases]).uniq!
|
95
|
-
arg.delete(:aliases)
|
17
|
+
def initialize(hash)
|
18
|
+
@hash= hash
|
19
|
+
@used= Set.new
|
96
20
|
end
|
97
|
-
info.merge!(arg)
|
98
|
-
end
|
99
21
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
22
|
+
def with_each(key)
|
23
|
+
case when @hash.include?(key.to_sym)
|
24
|
+
value= @hash[key.to_sym]
|
25
|
+
when @hash.include?(key.to_s)
|
26
|
+
value= @hash[key.to_s]
|
27
|
+
else
|
28
|
+
return
|
29
|
+
end
|
30
|
+
|
31
|
+
value= value.split(",").map { |s| s.strip } if value.is_a?(String)
|
32
|
+
value.each { |v| yield v }
|
33
|
+
@used << key.to_s
|
104
34
|
end
|
105
|
-
|
106
|
-
|
35
|
+
|
36
|
+
def with(key)
|
37
|
+
case when @hash.include?(key.to_sym)
|
38
|
+
yield @hash[key.to_sym]
|
39
|
+
when @hash.include?(key.to_s)
|
40
|
+
yield @hash[key.to_s]
|
41
|
+
else
|
42
|
+
return
|
43
|
+
end
|
44
|
+
@used << key.to_s
|
107
45
|
end
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
self.send :define_method, name do
|
116
|
-
value=@options[name]
|
117
|
-
value.respond_to?(:value_of) ? value.value_of(self) : value
|
46
|
+
|
47
|
+
def used?(key)
|
48
|
+
@used.include?(key.to_s)
|
49
|
+
end
|
50
|
+
|
118
51
|
end
|
119
52
|
|
120
|
-
|
121
|
-
|
53
|
+
def configure_with(hash)
|
54
|
+
new_hash= {}
|
55
|
+
hash.each { |key, value|
|
56
|
+
new_hash[key_for_alias(key)]= value
|
57
|
+
}
|
58
|
+
|
59
|
+
dsl= ConfigDsl.new(new_hash)
|
60
|
+
yield dsl if block_given?
|
61
|
+
|
62
|
+
new_hash.each { |key, value|
|
63
|
+
next if dsl.used?(key.to_s)
|
64
|
+
|
65
|
+
key= key_for_alias(key)
|
66
|
+
case
|
67
|
+
when self.respond_to?("#{key}=")
|
68
|
+
self.send "#{key}=", value
|
69
|
+
when self.respond_to?(key) && 0!=self.method(key).arity
|
70
|
+
self.send key, value
|
71
|
+
else
|
72
|
+
self.instance_variable_set("@#{key}", value)
|
73
|
+
end
|
74
|
+
}
|
122
75
|
end
|
123
76
|
|
124
|
-
# self.send :protected, "#{name}=".to_s
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
def initialize(options={}, parent=nil)
|
129
|
-
@extras= Hash.new
|
130
|
-
if (parent.is_a?(Configurable))
|
131
|
-
parent_options= parent.options
|
132
|
-
end
|
133
|
-
get_options(options, parent_options)
|
134
77
|
end
|
135
78
|
|
136
|
-
|
137
|
-
|
138
|
-
def convert_type(type, value)
|
139
|
-
case
|
140
|
-
when FalseClass==type || TrueClass==type
|
141
|
-
Boolean(value)
|
142
|
-
when Array==type
|
143
|
-
value.is_a?(String) ? value.split(/\s*,\s*/) : value
|
144
|
-
when Fixnum==type
|
145
|
-
value.to_i
|
146
|
-
when nil==type || NilClass==type
|
147
|
-
value
|
148
|
-
when String==type
|
149
|
-
value ? value.to_s : nil;
|
150
|
-
when value.nil?
|
151
|
-
value
|
152
|
-
when URI==type
|
153
|
-
URI.parse(value)
|
154
|
-
else
|
155
|
-
if type.respond_to?(:from_options)
|
156
|
-
type.from_options(value, self)
|
157
|
-
else
|
158
|
-
puts "type=#{type} value=#{value}"
|
159
|
-
type.new(value)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
Dir.glob("#{File.dirname(__FILE__)}/configurable/*.rb") { |file|
|
167
|
-
require file
|
168
|
-
}
|
79
|
+
end
|
@@ -23,42 +23,44 @@ module Distil
|
|
23
23
|
@@total_warning_count
|
24
24
|
end
|
25
25
|
|
26
|
+
def has_errors?
|
27
|
+
@@error_count > 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def has_warnings?
|
31
|
+
@@warning_count > 0
|
32
|
+
end
|
33
|
+
|
26
34
|
def self.error(message, file=nil, line_number=nil)
|
27
35
|
@@error_count+=1
|
28
|
-
|
29
|
-
|
36
|
+
|
37
|
+
case when file && line_number
|
38
|
+
puts "#{file}:#{line_number}: error: #{message}"
|
39
|
+
when file
|
40
|
+
puts "#{file}: error: #{message}"
|
30
41
|
else
|
31
|
-
|
42
|
+
puts "error: #{message}"
|
32
43
|
end
|
33
44
|
end
|
34
45
|
|
35
46
|
def error(message, file=nil, line_number=nil)
|
36
|
-
|
37
|
-
if (file && line_number)
|
38
|
-
printf("%s:%d: error: %s\n", file, line_number, message)
|
39
|
-
else
|
40
|
-
printf("error: %s\n", message)
|
41
|
-
end
|
47
|
+
ErrorReporter.error(message, file, line_number)
|
42
48
|
end
|
43
49
|
|
44
50
|
def self.warning(message, file=nil, line_number=nil)
|
45
51
|
@@warning_count+=1
|
46
|
-
return if (ignore_warnings)
|
47
|
-
|
48
|
-
|
52
|
+
return if (@@ignore_warnings)
|
53
|
+
case when file && line_number
|
54
|
+
puts "#{file}:#{line_number}: warning: #{message}"
|
55
|
+
when file
|
56
|
+
puts "#{file}: warning: #{message}"
|
49
57
|
else
|
50
|
-
|
58
|
+
puts "warning: #{message}"
|
51
59
|
end
|
52
60
|
end
|
53
61
|
|
54
62
|
def warning(message, file=nil, line_number=nil)
|
55
|
-
|
56
|
-
return if (ignore_warnings)
|
57
|
-
if (file && line_number)
|
58
|
-
printf("%s:%d: warning: %s\n", file, line_number, message)
|
59
|
-
else
|
60
|
-
printf("warning: %s\n", message)
|
61
|
-
end
|
63
|
+
ErrorReporter.warning(message, file, line_number)
|
62
64
|
end
|
63
65
|
|
64
66
|
def report
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Distil
|
2
|
+
|
3
|
+
module FileVendor
|
4
|
+
|
5
|
+
def cache_file(file)
|
6
|
+
@file_cache={} if @file_cache.nil?
|
7
|
+
@file_cache[file.full_path]= file
|
8
|
+
end
|
9
|
+
|
10
|
+
def file_from_path(filepath)
|
11
|
+
return if !filepath
|
12
|
+
@file_cache={} if @file_cache.nil?
|
13
|
+
full_path= File.expand_path(filepath)
|
14
|
+
file= @file_cache[full_path]
|
15
|
+
return file if file
|
16
|
+
|
17
|
+
extension= File.extname(filepath)[1..-1]
|
18
|
+
|
19
|
+
SourceFile.subclasses.each { |handler|
|
20
|
+
next if (handler.extension != extension)
|
21
|
+
return handler.new(filepath, self)
|
22
|
+
}
|
23
|
+
|
24
|
+
return SourceFile.new(filepath, self)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Hash#deep_merge
|
2
|
+
# From: http://pastie.textmate.org/pastes/30372, Elliott Hird
|
3
|
+
# Source: http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
|
4
|
+
# This file contains extensions to Ruby and other useful snippits of code.
|
5
|
+
# Time to extend Hash with some recursive merging magic.
|
6
|
+
|
7
|
+
class Hash
|
8
|
+
|
9
|
+
# Merges self with another hash, recursively.
|
10
|
+
#
|
11
|
+
# This code was lovingly stolen from some random gem:
|
12
|
+
# http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html
|
13
|
+
#
|
14
|
+
# Thanks to whoever made it.
|
15
|
+
|
16
|
+
def deep_merge(hash)
|
17
|
+
target = dup
|
18
|
+
|
19
|
+
hash.keys.each do |key|
|
20
|
+
if hash[key].is_a? Hash and self[key].is_a? Hash
|
21
|
+
target[key] = target[key].deep_merge(hash[key])
|
22
|
+
next
|
23
|
+
end
|
24
|
+
|
25
|
+
target[key] = hash[key]
|
26
|
+
end
|
27
|
+
|
28
|
+
target
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# From: http://www.gemtacular.com/gemdocs/cerberus-0.2.2/doc/classes/Hash.html
|
33
|
+
# File lib/cerberus/utils.rb, line 42
|
34
|
+
|
35
|
+
def deep_merge!(second)
|
36
|
+
second.each_pair do |k,v|
|
37
|
+
if self[k].is_a?(Hash) and second[k].is_a?(Hash)
|
38
|
+
self[k].deep_merge!(second[k])
|
39
|
+
else
|
40
|
+
self[k] = second[k]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -1,33 +1,25 @@
|
|
1
1
|
module Distil
|
2
2
|
|
3
|
+
JSL_CONF= "#{LIB_DIR}/jsl.conf"
|
3
4
|
LINT_COMMAND= "#{VENDOR_DIR}/jsl-0.3.0/bin/jsl"
|
4
|
-
# LINT_COMMAND= "/Users/jeff/.gem/ruby/1.8/gems/distil-0.
|
5
|
-
|
5
|
+
# LINT_COMMAND= "/Users/jeff/.gem/ruby/1.8/gems/distil-0.13.6/vendor/jsl-0.3.0/bin/jsl"
|
6
6
|
JS_GLOBALS= Set.new ['Array', 'Boolean', 'Date', 'Error', 'EvalError',
|
7
7
|
'Function', 'Math', 'Number', 'Object', 'RangeError',
|
8
8
|
'ReferenceError', 'RegExp', 'String', 'SyntaxError',
|
9
9
|
'TypeError', 'URIError']
|
10
|
-
|
11
|
-
|
10
|
+
|
11
|
+
module JavascriptFileValidator
|
12
12
|
|
13
13
|
include ErrorReporter
|
14
14
|
|
15
|
-
|
16
|
-
option :global_export
|
17
|
-
option :additional_globals
|
18
|
-
|
19
|
-
def handles_file(file)
|
20
|
-
return ["js"].include?(file.content_type)
|
21
|
-
end
|
22
|
-
|
23
|
-
def process_files(files)
|
15
|
+
def validate_javascript_files
|
24
16
|
return if (!File.exists?(LINT_COMMAND))
|
25
17
|
|
26
18
|
tmp= Tempfile.new("jsl.conf")
|
27
19
|
|
28
20
|
conf_files= [ "jsl.conf",
|
29
21
|
"#{ENV['HOME']}/.jsl.conf",
|
30
|
-
|
22
|
+
JSL_CONF
|
31
23
|
]
|
32
24
|
|
33
25
|
jsl_conf= conf_files.find { |f| File.exists?(f) }
|
@@ -46,19 +38,24 @@ module Distil
|
|
46
38
|
tmp << "+define #{g}\n"
|
47
39
|
}
|
48
40
|
|
49
|
-
|
50
|
-
|
51
|
-
tmp << "+alias #{original} #{full_path}\n"
|
41
|
+
libraries.each { |l|
|
42
|
+
tmp.puts "+alias #{l.name} #{l.file_for(:js, nil, DEBUG_VARIANT)}"
|
52
43
|
}
|
53
44
|
|
54
|
-
|
55
|
-
|
56
|
-
|
45
|
+
dependency_aliases.each { |name, file|
|
46
|
+
tmp.puts "+alias #{name} #{file}"
|
47
|
+
}
|
48
|
+
|
49
|
+
source_files.each { |f|
|
50
|
+
tmp.puts "+process #{f}" if f.content_type=="js"
|
57
51
|
}
|
58
52
|
|
59
53
|
tmp.close()
|
60
54
|
command= "#{LINT_COMMAND} -nologo -nofilelisting -conf #{tmp.path}"
|
61
55
|
|
56
|
+
# puts "\n\n\n\n#{name}\n\n"
|
57
|
+
# puts "jsl conf:\n#{File.read(tmp.path)}\n\n"
|
58
|
+
|
62
59
|
stdin, stdout, stderr= Open3.popen3(command)
|
63
60
|
stdin.close
|
64
61
|
output= stdout.read
|
@@ -81,8 +78,7 @@ module Distil
|
|
81
78
|
puts
|
82
79
|
end
|
83
80
|
|
84
|
-
end
|
85
|
-
|
81
|
+
end
|
86
82
|
end
|
87
83
|
|
88
|
-
end
|
84
|
+
end
|