ymdp 0.1.6 → 0.1.7
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/History.txt +21 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/ymdp/application_view.rb +153 -116
- data/lib/ymdp/base.rb +22 -1
- data/lib/ymdp/compiler/domains.rb +1 -1
- data/lib/ymdp/compiler/git_helper.rb +18 -15
- data/lib/ymdp/compiler/template.rb +46 -40
- data/lib/ymdp/configuration/config.rb +3 -3
- data/lib/ymdp/processor/compressor.rb +66 -13
- data/lib/ymdp/processor/form_post.rb +2 -2
- data/lib/ymdp/processor/validator.rb +36 -16
- data/lib/ymdp/processor/w3c.rb +20 -18
- data/lib/ymdp/support/file.rb +45 -78
- data/lib/ymdp/translator/base.rb +39 -38
- data/spec/application_view_spec.rb +376 -0
- data/spec/compiler_spec.rb +49 -7
- data/spec/compiler_template_spec.rb +243 -11
- data/spec/compressor_spec.rb +123 -0
- data/spec/configuration_spec.rb +116 -3
- data/spec/file_spec.rb +103 -0
- data/spec/git_helper_spec.rb +53 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/stubs.rb +42 -2
- data/spec/translator_spec.rb +317 -1
- data/spec/validator_spec.rb +171 -0
- data/spec/ymdp_base_spec.rb +40 -0
- data/ymdp.gemspec +11 -4
- metadata +11 -4
- data/lib/ymdp/helpers.rb +0 -4
- data/lib/ymdp/support/blank.rb +0 -58
@@ -31,19 +31,19 @@ module YMDP
|
|
31
31
|
@verbose = params[:verbose]
|
32
32
|
@domain = params[:domain]
|
33
33
|
|
34
|
-
@file = params[:file]
|
35
|
-
@assets_directory = "/om/assets/#{servers[@domain]['assets_id']}"
|
36
|
-
@hash = params[:git_hash]
|
37
|
-
@message = params[:message]
|
38
|
-
|
39
34
|
server_settings = servers[@domain]
|
40
35
|
if server_settings
|
41
36
|
@server = server_settings["server"]
|
42
37
|
else
|
43
|
-
raise StandardError.new("
|
38
|
+
raise StandardError.new("Server settings are required.")
|
44
39
|
end
|
45
40
|
|
46
|
-
raise StandardError.new("
|
41
|
+
raise StandardError.new("Server name does not exist in server settings.") unless @server
|
42
|
+
|
43
|
+
@file = params[:file]
|
44
|
+
@assets_directory = "/om/assets/#{servers[@domain]['assets_id']}"
|
45
|
+
@hash = params[:git_hash]
|
46
|
+
@message = params[:message]
|
47
47
|
|
48
48
|
set_content_variables
|
49
49
|
|
@@ -73,12 +73,13 @@ module YMDP
|
|
73
73
|
# If the filename begins with a _ it's a partial.
|
74
74
|
#
|
75
75
|
def partial?
|
76
|
-
@file =~
|
76
|
+
File.basename(@file) =~ /^_/
|
77
77
|
end
|
78
78
|
|
79
79
|
# Compile this view unless it is a partial.
|
80
80
|
#
|
81
81
|
def build
|
82
|
+
# puts "Base build"
|
82
83
|
unless partial?
|
83
84
|
write_template(processed_template)
|
84
85
|
end
|
@@ -87,17 +88,20 @@ module YMDP
|
|
87
88
|
# Returns the compiled template code after its Haml or ERB has been processed.
|
88
89
|
#
|
89
90
|
def processed_template
|
91
|
+
# "Base processed_template"
|
90
92
|
result = ""
|
91
|
-
File.
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
result = process_template(template)
|
97
|
-
end
|
93
|
+
template = File.read(@file)
|
94
|
+
if @file =~ /\.haml$/
|
95
|
+
result = process_haml(template, @file)
|
96
|
+
else
|
97
|
+
result = process_template(template)
|
98
98
|
end
|
99
99
|
result
|
100
100
|
end
|
101
|
+
|
102
|
+
def base_filename(filename)
|
103
|
+
raise "Define in child"
|
104
|
+
end
|
101
105
|
|
102
106
|
# Implemented in child classes, this defines what must be done to process a template.
|
103
107
|
#
|
@@ -153,11 +157,15 @@ module YMDP
|
|
153
157
|
#
|
154
158
|
def write_template_without_layout(result)
|
155
159
|
path = destination_path
|
156
|
-
|
160
|
+
|
161
|
+
# puts "\n\n\nBase write_template_without_layout: #{result}, #{path}"
|
162
|
+
|
157
163
|
File.open(path, "w") do |f|
|
158
164
|
f.write(result)
|
159
165
|
end
|
160
166
|
verbose "Finished writing #{path}.\n"
|
167
|
+
|
168
|
+
result
|
161
169
|
end
|
162
170
|
|
163
171
|
# Writes the input string to the destination file, passing it through the
|
@@ -166,21 +174,16 @@ module YMDP
|
|
166
174
|
# The application layout can be either Haml or ERB.
|
167
175
|
#
|
168
176
|
def write_template_with_layout(result)
|
177
|
+
# puts "Base write_template_with_layout"
|
169
178
|
@content = result
|
179
|
+
layout = result
|
180
|
+
|
170
181
|
application_layout = "#{paths[:base_path]}\/app\/views\/layouts\/application.html"
|
171
182
|
haml_layout = application_layout + ".haml"
|
172
|
-
erb_layout = application_layout + ".erb"
|
173
183
|
|
174
184
|
if File.exists?(haml_layout)
|
175
|
-
|
176
|
-
|
177
|
-
process_haml(template, haml_layout)
|
178
|
-
end
|
179
|
-
elsif File.exists?(erb_layout)
|
180
|
-
layout = File.open(erb_layout) do |f|
|
181
|
-
template = f.read
|
182
|
-
process_template(erb_layout)
|
183
|
-
end
|
185
|
+
template = File.read(haml_layout)
|
186
|
+
layout = process_haml(template, haml_layout)
|
184
187
|
end
|
185
188
|
|
186
189
|
write_template_without_layout(layout)
|
@@ -192,6 +195,7 @@ module YMDP
|
|
192
195
|
# uses a template or not.
|
193
196
|
#
|
194
197
|
def write_template(result)
|
198
|
+
# puts "Base write_template"
|
195
199
|
write_template_with_layout(result)
|
196
200
|
end
|
197
201
|
|
@@ -211,10 +215,7 @@ module YMDP
|
|
211
215
|
#
|
212
216
|
include ActionView::Helpers::TagHelper
|
213
217
|
|
214
|
-
|
215
|
-
include ApplicationHelper
|
216
|
-
rescue NameError
|
217
|
-
end
|
218
|
+
include ApplicationHelper if defined?(ApplicationHelper)
|
218
219
|
|
219
220
|
include YMDP::ApplicationView
|
220
221
|
include YMDP::AssetTagHelper
|
@@ -242,12 +243,14 @@ module YMDP
|
|
242
243
|
# Process this template with ERB.
|
243
244
|
#
|
244
245
|
def process_template(template)
|
246
|
+
# puts "View process_template"
|
245
247
|
ERB.new(template, 0, "%<>").result(binding)
|
246
248
|
end
|
247
249
|
|
248
250
|
# Process this template with Haml.
|
249
251
|
#
|
250
252
|
def process_haml(template, filename=nil)
|
253
|
+
# puts "View process_haml"
|
251
254
|
options = {}
|
252
255
|
if filename
|
253
256
|
options[:filename] = filename
|
@@ -260,8 +263,11 @@ module YMDP
|
|
260
263
|
# Validate the resulting HTML file if that option is turned on.
|
261
264
|
#
|
262
265
|
def write_template(result)
|
263
|
-
|
266
|
+
# puts "View write_template"
|
267
|
+
result = super(result)
|
264
268
|
YMDP::Validator::HTML.validate(destination_path) if CONFIG.validate_html?
|
269
|
+
|
270
|
+
result
|
265
271
|
end
|
266
272
|
end
|
267
273
|
|
@@ -277,7 +283,7 @@ module YMDP
|
|
277
283
|
def write_template(result)
|
278
284
|
filename = @file.split("/").last
|
279
285
|
tmp_filename = "./tmp/#{filename}"
|
280
|
-
save_to_file(result, tmp_filename)
|
286
|
+
F.save_to_file(result, tmp_filename)
|
281
287
|
result = YMDP::Compressor::JavaScript.compress(tmp_filename) if CONFIG.compress_embedded_js?
|
282
288
|
write_template_without_layout(result)
|
283
289
|
end
|
@@ -382,14 +388,14 @@ module YMDP
|
|
382
388
|
key, value = key_and_value_from_line(line)
|
383
389
|
unless key.blank?
|
384
390
|
if @hash.has_key?(key)
|
385
|
-
puts
|
386
|
-
puts "Duplicate value in #{destination_path}"
|
387
|
-
puts " #{key}=#{@hash[key]}"
|
388
|
-
puts " #{key}=#{value}"
|
389
|
-
puts
|
391
|
+
$stdout.puts
|
392
|
+
$stdout.puts "Duplicate value in #{destination_path}"
|
393
|
+
$stdout.puts " #{key}=#{@hash[key]}"
|
394
|
+
$stdout.puts " #{key}=#{value}"
|
395
|
+
$stdout.puts
|
390
396
|
if @hash[key] == value
|
391
|
-
puts " Values are the same but duplicate values still should not exist!"
|
392
|
-
puts
|
397
|
+
$stdout.puts " Values are the same but duplicate values still should not exist!"
|
398
|
+
$stdout.puts
|
393
399
|
end
|
394
400
|
raise "Duplicate key error"
|
395
401
|
end
|
@@ -403,7 +409,7 @@ module YMDP
|
|
403
409
|
# Write JSON file to its destination.
|
404
410
|
#
|
405
411
|
def write_template(result)
|
406
|
-
puts destination_path if CONFIG.verbose?
|
412
|
+
$stdout.puts destination_path if CONFIG.verbose?
|
407
413
|
write_template_without_layout(result)
|
408
414
|
end
|
409
415
|
end
|
@@ -110,9 +110,9 @@ module YMDP
|
|
110
110
|
end
|
111
111
|
|
112
112
|
def file_not_found(filename)
|
113
|
-
puts
|
114
|
-
puts "Create #{filename} with the following command:\n\n ./script/config"
|
115
|
-
puts
|
113
|
+
$stdout.puts
|
114
|
+
$stdout.puts "Create #{filename} with the following command:\n\n ./script/config"
|
115
|
+
$stdout.puts
|
116
116
|
|
117
117
|
raise "File not found: #{filename}"
|
118
118
|
end
|
@@ -1,20 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ymdp/base'
|
3
|
+
require 'active_support'
|
1
4
|
require 'support/file'
|
2
5
|
|
3
6
|
module YMDP
|
4
|
-
module Compressor
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
module Compressor #:nodoc:
|
8
|
+
# Compresses a file using the specified compressor/minifier (currently YUI Compressor 2.4.2).
|
9
|
+
#
|
10
|
+
# === Usage
|
11
|
+
#
|
12
|
+
# YMDP::Compressor::Base.compress("filename.js", "type" => "js")
|
13
|
+
#
|
14
|
+
# YMDP::Compressor::Base.compress("filename.css", "type" => "css")
|
15
|
+
#
|
16
|
+
# Outputs the compressed file to <tt>_path_.min.</tt>
|
17
|
+
#
|
18
|
+
# === Options
|
19
|
+
#
|
20
|
+
# "type":: "js" or "css". Identifies the file type.
|
21
|
+
#
|
22
|
+
# "obfuscate":: true or false. Change internal variable names within the code.
|
23
|
+
#
|
24
|
+
# "verbose":: true or false. Output warnings about code quality.
|
25
|
+
#
|
26
|
+
# "preserve_semi":: true or false. Preserve unnecessary semicolons.
|
27
|
+
#
|
28
|
+
# TODO: Make it support multiple compressors.
|
29
|
+
#
|
30
|
+
# TODO: Convert it to an object, so you instantiate the Compressor class and then call it
|
31
|
+
# on a file or a string.
|
32
|
+
#
|
33
|
+
# TODO: Get some stringify_keys! action going so you can send in symbols or strings.
|
34
|
+
#
|
35
|
+
class Base < YMDP::Base
|
8
36
|
def self.compress(path, options={})
|
37
|
+
options.stringify_keys!
|
9
38
|
compressed_display_path = display_path(path)
|
10
39
|
compressed_path = "#{path}.min"
|
11
40
|
|
12
41
|
options["type"] ||= "js"
|
13
|
-
|
42
|
+
options["type"] = options["type"].to_s
|
43
|
+
|
44
|
+
# if the compressed_file exists, don't create it again
|
45
|
+
#
|
14
46
|
unless File.exists?(compressed_path)
|
15
47
|
$stdout.print " #{compressed_display_path} compressing . . . "
|
16
48
|
compressed = ''
|
17
49
|
|
50
|
+
# set options and defaults
|
51
|
+
#
|
18
52
|
if options.delete("obfuscate")
|
19
53
|
options["nomunge"] = ""
|
20
54
|
end
|
@@ -27,21 +61,26 @@ module YMDP
|
|
27
61
|
options["preserve-semi"] = ""
|
28
62
|
end
|
29
63
|
|
64
|
+
# join the options together for appending to the command line
|
65
|
+
#
|
30
66
|
options_string = options.map {|k,v| "--#{k} #{v}"}.join(" ")
|
31
67
|
|
32
|
-
|
68
|
+
# call the compressor
|
69
|
+
#
|
70
|
+
command = "java -jar ./script/yuicompressor-2.4.2.jar #{options_string} #{path} -o #{compressed_path} 2>&1"
|
71
|
+
result = F.execute(command, :return => true)
|
33
72
|
|
34
73
|
result.split("\n").each do |line|
|
35
74
|
if line =~ /\[ERROR\] (\d+):(\d+):(.*)/
|
36
75
|
line_number = $1.to_i
|
37
76
|
error = "Error at #{compressed_display_path} line #{line_number} character #{$2}: #{$3}"
|
38
|
-
error += get_line_from_file(path, line_number)
|
77
|
+
error += F.get_line_from_file(path, line_number)
|
39
78
|
|
40
79
|
$stdout.puts error
|
41
|
-
|
80
|
+
g(error)
|
42
81
|
end
|
43
82
|
end
|
44
|
-
|
83
|
+
|
45
84
|
if result =~ /ERROR/
|
46
85
|
raise "JavaScript errors in #{compressed_display_path}"
|
47
86
|
else
|
@@ -49,10 +88,10 @@ module YMDP
|
|
49
88
|
end
|
50
89
|
end
|
51
90
|
|
91
|
+
# The compressed file should exist now. If it does, use it. If not, raise an error.
|
92
|
+
#
|
52
93
|
if File.exists?(compressed_path)
|
53
|
-
File.
|
54
|
-
compressed = c.read
|
55
|
-
end
|
94
|
+
compressed = File.read(compressed_path)
|
56
95
|
else
|
57
96
|
raise "File does not exist: #{compressed_display_path}"
|
58
97
|
end
|
@@ -61,13 +100,27 @@ module YMDP
|
|
61
100
|
end
|
62
101
|
end
|
63
102
|
|
103
|
+
# Compresses a CSS file using the specified compressor/minifier (currently YUI Compressor 2.4.2).
|
104
|
+
#
|
105
|
+
# === Usage
|
106
|
+
#
|
107
|
+
# YMDP::Compressor::Stylesheet.compress("filename.css")
|
108
|
+
#
|
64
109
|
class Stylesheet < Base
|
110
|
+
# TODO: Add options hash
|
65
111
|
def self.compress(path)
|
66
112
|
super(path, "type" => "css")
|
67
113
|
end
|
68
114
|
end
|
69
115
|
|
70
|
-
|
116
|
+
# Compresses a JavaScript file using the specified compressor/minifier (currently YUI Compressor 2.4.2).
|
117
|
+
#
|
118
|
+
# === Usage
|
119
|
+
#
|
120
|
+
# YMDP::Compressor::JavaScript.compress("filename.js")
|
121
|
+
#
|
122
|
+
class JavaScript < Base
|
123
|
+
# TODO: Add options hash
|
71
124
|
def self.compress(filename)
|
72
125
|
super(filename, "type" => "js")
|
73
126
|
end
|
@@ -1,37 +1,51 @@
|
|
1
|
+
require 'ymdp/base'
|
1
2
|
require 'support/file'
|
2
3
|
require 'processor/w3c'
|
3
4
|
require 'processor/form_post'
|
4
5
|
|
5
6
|
module YMDP
|
6
7
|
module Validator
|
7
|
-
class Base
|
8
|
-
extend YMDP::FileSupport
|
8
|
+
class Base < YMDP::Base
|
9
9
|
end
|
10
10
|
|
11
11
|
class HTML < Base
|
12
12
|
def self.validate(path)
|
13
13
|
html_display_path = display_path(path)
|
14
|
+
log_path = "#{TMP_PATH}/#{File.basename(path)}_errors.html"
|
14
15
|
|
16
|
+
log_path = validation_errors(path)
|
17
|
+
if log_path
|
18
|
+
g("HTML validation errors found")
|
19
|
+
F.execute "open #{log_path}"
|
20
|
+
raise "Invalid HTML"
|
21
|
+
else
|
22
|
+
$stdout.puts " #{html_display_path} validating . . . OK"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.validation_errors(path)
|
27
|
+
html_display_path = display_path(path)
|
15
28
|
doctype = CONFIG["doctype"] || "HTML 4.0 Transitional"
|
16
29
|
|
17
|
-
resp = post_file_to_w3c_validator(path, doctype)
|
30
|
+
resp = W3CPoster.post_file_to_w3c_validator(path, doctype)
|
18
31
|
html = resp.read_body
|
19
32
|
if html.include? "[Valid]"
|
20
|
-
|
21
|
-
else
|
33
|
+
false
|
34
|
+
else
|
22
35
|
log_path = "#{TMP_PATH}/#{File.basename(path)}_errors.html"
|
23
36
|
$stdout.puts " #{html_display_path} is not valid HTML, writing to #{display_path(log_path)}"
|
24
37
|
$stdout.puts
|
25
38
|
$stdout.puts " To view errors:"
|
26
39
|
$stdout.puts " open #{display_path(log_path)}"
|
27
40
|
$stdout.puts
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
41
|
+
|
42
|
+
File.open(log_path,'w') do |f|
|
43
|
+
f.puts html
|
44
|
+
end
|
45
|
+
|
46
|
+
$stdout.puts " Viewing errors..."
|
47
|
+
log_path
|
48
|
+
end
|
35
49
|
end
|
36
50
|
end
|
37
51
|
|
@@ -79,7 +93,7 @@ JSLINT
|
|
79
93
|
f.puts output
|
80
94
|
end
|
81
95
|
|
82
|
-
results =
|
96
|
+
results = F.execute("java org.mozilla.javascript.tools.shell.Main ./script/jslint.js #{js_fragment_path}", :return => true)
|
83
97
|
|
84
98
|
if results =~ /jslint: No problems found/
|
85
99
|
$stdout.puts "OK"
|
@@ -89,12 +103,12 @@ JSLINT
|
|
89
103
|
if result =~ /line (\d+) character (\d+): (.*)/
|
90
104
|
line_number = $1.to_i
|
91
105
|
error = "Error at #{fragment_display_path} line #{line_number-jslint_settings_count} character #{$2}: #{$3}"
|
92
|
-
error += get_line_from_file(js_fragment_path, line_number)
|
106
|
+
error += F.get_line_from_file(js_fragment_path, line_number)
|
93
107
|
|
94
108
|
$stdout.puts error
|
95
109
|
end
|
96
110
|
end
|
97
|
-
message = "
|
111
|
+
message = "JavaScript Errors embedded in #{display}"
|
98
112
|
g(message)
|
99
113
|
raise message
|
100
114
|
end
|
@@ -103,12 +117,18 @@ JSLINT
|
|
103
117
|
end
|
104
118
|
|
105
119
|
class JSON < JavaScript
|
106
|
-
def pre_process(output)
|
120
|
+
def self.pre_process(output)
|
107
121
|
output
|
108
122
|
end
|
109
123
|
|
110
124
|
def self.jslint_settings
|
111
125
|
end
|
112
126
|
end
|
127
|
+
|
128
|
+
class Stylesheet < Base
|
129
|
+
def self.validate(filename)
|
130
|
+
true
|
131
|
+
end
|
132
|
+
end
|
113
133
|
end
|
114
134
|
end
|