ymdp 0.0.12 → 0.0.13

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.0.13
@@ -250,7 +250,7 @@ class TemplateCompiler
250
250
  attr_accessor :domain, :git_hash, :options
251
251
 
252
252
  def self.compile
253
- time do
253
+ time("", :title => "YMDP") do
254
254
  system "rm ./tmp/*"
255
255
 
256
256
  options = parse_options
@@ -357,6 +357,7 @@ class TemplateCompiler
357
357
  system "rm -rf #{dir}/assets/javascripts"
358
358
  system "rm -rf #{dir}/assets/stylesheets"
359
359
  system "rm -rf #{dir}/assets/yrb"
360
+ system "rm #{TMP_DIR}/*"
360
361
  end
361
362
 
362
363
  def log(text)
@@ -0,0 +1,236 @@
1
+ require 'lib/init'
2
+
3
+ require 'translator/base'
4
+
5
+ @key = ENV["key"] || ""
6
+ @key = @key.upcase
7
+
8
+ ASSETS_ROOT = "#{YMDP_ROOT}/app/assets"
9
+ YRB_ROOT = "#{ASSETS_ROOT}/yrb"
10
+
11
+ namespace :keys do
12
+ task :add_new do
13
+ Dir["./app/assets/yrb/*.pres"].each do |path|
14
+ # system "cat app/assets/new/keys_en-US.pres >> app/assets/yrb/keys_en-US.pres"
15
+ new_path = path.gsub("yrb", "new")
16
+ system "cat #{new_path} >> #{path}"
17
+ end
18
+ end
19
+
20
+ task :new_since do
21
+ @date = ENV["date"]
22
+ if @date
23
+ change_keys do |line|
24
+ puts line
25
+ if line =~ /#{@date}/
26
+ @on ||= true
27
+ end
28
+ line if @on
29
+ end
30
+ else
31
+ message = "Must define a date with 'date='"
32
+ growl(message)
33
+ raise message
34
+ end
35
+ end
36
+
37
+ task :combine do
38
+ system "rm #{TMP_DIR}/*"
39
+ each_locale do |path|
40
+ puts path
41
+ filename = path.split("/").last
42
+ lang = "en-US"
43
+ if filename =~ /_(.*)\.pres/
44
+ lang = $1
45
+ end
46
+
47
+ File.open(path, "r") do |f|
48
+ File.open("#{TMP_DIR}/keys_#{lang}.pres", "a") do |tmp|
49
+ tmp.write(f.read)
50
+ end
51
+ end
52
+ end
53
+
54
+ system "rm -rf #{YRB_ROOT}/*"
55
+ system "cp #{TMP_DIR}/* #{YRB_ROOT}"
56
+
57
+ system "rm #{TMP_DIR}/*"
58
+ end
59
+
60
+ task :destroy do
61
+ system "rm #{TMP_DIR}/*"
62
+
63
+ raise "Must define a key with 'key='" if @key == ""
64
+
65
+ change_keys do |line|
66
+ line_array = parse_yrb(line)
67
+
68
+ if line_array[0] == @key
69
+ line = ""
70
+ end
71
+
72
+ line
73
+ end
74
+
75
+ system "rm #{TMP_DIR}/*"
76
+ end
77
+
78
+ desc "Translate any new keys into non-US languages"
79
+ task :translate do
80
+ ApplicationView::Translator::YRB.translate
81
+ end
82
+
83
+ task :rename do
84
+ system "rm #{TMP_DIR}/*"
85
+
86
+ @to = ENV["to"] || ""
87
+ @to = @to.upcase
88
+
89
+ raise "Must define a key with 'key='" if @key == ""
90
+ raise "Must define a new key name with 'to='" if @to == ""
91
+
92
+ change_keys do |line|
93
+ line_array = parse_yrb(line)
94
+
95
+ if line_array[0] == @key
96
+ line = "#{@to}=#{line_array[1]}"
97
+ end
98
+
99
+ line
100
+ end
101
+
102
+ system "rm #{TMP_DIR}/*"
103
+ end
104
+
105
+ # task :unused do
106
+ # # this probably would be more complicated than it's worth
107
+ #
108
+ # keys = []
109
+ # unused_keys = []
110
+ # File.open("#{YRB_ROOT}/keys_en-US.pres", "r") do |f|
111
+ # f.readlines.each do |line|
112
+ # key = parse_yrb(line).first
113
+ # keys << key unless key.blank?
114
+ # end
115
+ # end
116
+ #
117
+ # keys.each do |key|
118
+ # puts "grep #{key} ./servers/* -R -i"
119
+ # if `grep #{key} ./servers/* -R -i`.length < 10
120
+ # puts "OMG"
121
+ # end
122
+ # end
123
+ # end
124
+
125
+ task :list do
126
+ each_locale do |path|
127
+ filename = path.split("/").last
128
+ lang = "en-US"
129
+ if filename =~ /_(.*)\.pres/
130
+ lang = $1
131
+ end
132
+
133
+ puts lang
134
+
135
+ File.open(path, "r") do |f|
136
+ f.readlines.each do |line|
137
+ puts line if line =~ /^#{@key}=/
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ task :convert_to_yml do
144
+ each_locale do |path|
145
+ # puts path
146
+ filename = path.split("/").last
147
+ lang = "en-US"
148
+ if filename =~ /_(.*)\.pres/
149
+ lang = $1
150
+ end
151
+
152
+ puts "#{lang}:"
153
+
154
+ File.open(path, "r") do |f|
155
+ f.readlines.each do |line|
156
+ if @key.blank? || line =~ /^#{@key}=/
157
+ k,v = parse_yrb(line)
158
+ puts " #{k.downcase}: #{v}"
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ def change_keys
167
+ each_locale do |path|
168
+ @on = false
169
+ puts path
170
+ filename = path.split("/").last
171
+ File.open(path, "r") do |f|
172
+ File.open("#{TMP_DIR}/#{filename}", "w") do |tmp|
173
+ f.readlines.each do |line|
174
+ new_line = yield line
175
+ tmp.write new_line
176
+ end
177
+ end
178
+ end
179
+ system "cp #{TMP_DIR}/#{filename} #{path}"
180
+ end
181
+ end
182
+
183
+ def change_keys_with_lang
184
+ each_locale do |path|
185
+ puts path
186
+ filename = path.split("/").last
187
+ lang = "en-US"
188
+ if filename =~ /_(.*)\.pres/
189
+ lang = $1
190
+ end
191
+ File.open(path, "r") do |f|
192
+ File.open("#{TMP_DIR}/#{filename}", "w") do |tmp|
193
+ f.readlines.each do |line|
194
+ new_line = yield line, lang, filename
195
+ tmp.write new_line
196
+ end
197
+ end
198
+ end
199
+ system "cp #{TMP_DIR}/#{filename} #{path}"
200
+ end
201
+ end
202
+
203
+ def parse_yrb(line)
204
+ key = value = nil
205
+ unless line =~ /#/
206
+ tokens = line.split("=")
207
+ key = tokens.shift
208
+ value = tokens.join("=")
209
+ end
210
+ [key, value]
211
+ end
212
+
213
+ def each_locale
214
+ Dir["#{YRB_ROOT}/*.pres"].each do |path|
215
+ yield path
216
+ end
217
+ end
218
+
219
+ def to_yrb(key, value)
220
+ "#{key}=#{value}\n"
221
+ end
222
+
223
+ def yrb_to_hash(path)
224
+ hash = {}
225
+ File.open(path, "r") do |f|
226
+ f.readlines.each do |line|
227
+ k, v = parse_yrb(line)
228
+
229
+ if k
230
+ hash[k] = v
231
+ end
232
+ end
233
+ end
234
+ hash
235
+ end
236
+
@@ -0,0 +1,720 @@
1
+ include Timer
2
+ include ApplicationView::Config
3
+
4
+ @start_time = Time.now
5
+
6
+ begin
7
+ CATEGORIES = YAML.load_file("./config/categories.yml")["categories"] unless defined?(CATEGORIES)
8
+ rescue
9
+ CATEGORIES = {} unless defined?(CATEGORIES)
10
+ end
11
+
12
+ Dir.mkdir(TMP_DIR) rescue Errno::EEXIST
13
+
14
+ def set_application_variables(application)
15
+ @application = application
16
+ @application_id = SERVERS[@application]["application_id"]
17
+ @assets_id = SERVERS[@application]["assets_id"]
18
+ @dir = @application
19
+ rescue
20
+ end
21
+
22
+ def create_from_servers
23
+ SERVERS.keys.each do |key|
24
+ yield key.to_sym, "set_#{key}".to_sym
25
+ end
26
+ end
27
+
28
+ def create_from_default_server
29
+ yield @default_server
30
+ end
31
+
32
+ def create_from_categories(task_name)
33
+ CATEGORIES.keys.each do |category|
34
+ desc "#{task_name.to_s.capitalize} the #{category}"
35
+ task category.to_sym => ["set_#{category}", task_name]
36
+ end
37
+ end
38
+
39
+ # rake deploy app=staging PATH=views/settings
40
+ # rake deploy app=my
41
+
42
+ @username = CONFIG["username"]
43
+ @password = CONFIG["password"]
44
+
45
+ unless @username
46
+ puts
47
+ puts "Enter your username in ./config/config.yml"
48
+ puts
49
+ raise "Username not found."
50
+ end
51
+
52
+ unless @password
53
+ puts
54
+ puts "Enter your password in ./config/config.yml"
55
+ puts
56
+ raise "Password not found."
57
+ end
58
+
59
+
60
+ @default_server = CONFIG["default_server"] || "staging"
61
+ @application = ENV["app"] || @default_server
62
+ set_application_variables(@application)
63
+ @path = ENV["path"] || ENV["p"] || ""
64
+ @dry_run = ENV["dry_run"]
65
+ @confirm = ENV["confirm"]
66
+ @build_message = ENV["build"]
67
+ @view = ENV["view"]
68
+ @lang = ENV["lang"]
69
+
70
+ @sync = ENV["sync"]
71
+
72
+ @validate_html = (ENV["validate_html"] || CONFIG["validate_html"].to_s) != "false"
73
+ @validate_js_assets = (ENV["validate_js_assets"] || CONFIG["validate_js_assets"].to_s) != "false"
74
+ @validate_json_assets = (ENV["validate_json_assets"] || CONFIG["validate_json_assets"].to_s) != "false"
75
+ @validate_embedded_js = (ENV["validate_embedded_js"] || CONFIG["validate_embedded_js_deploy"].to_s) != "false"
76
+
77
+ create_from_servers do |key, set_task|
78
+ task set_task do
79
+ set_application_variables(key.to_s)
80
+ end
81
+ end
82
+
83
+ desc "Default task shows documentation"
84
+ task :default do
85
+ docs = <<-DOCS
86
+ USAGE: rake TASK [app={application}] [path={path}], [dry_run=true], [dir={directory}], [application_id={app_id}] [skip_validation=true]
87
+
88
+ GETTING STARTED:
89
+
90
+ 1. First, copy the config.yml.example file to config.yml with the command:
91
+
92
+ ./script/config
93
+
94
+ 2. Enter the correct username and password in ./config/config.yml
95
+
96
+ 3. Download local copies of all our remote applications from YMDP:
97
+
98
+ rake create:all
99
+
100
+ 4. Edit the HTML template in the subdirectories "app/views" and "app/assets".
101
+
102
+ 5. To build the views and javascript files from edited templates, and commit the changes:
103
+
104
+ ./script/build -m "<commit_message>"
105
+
106
+ 6. To deploy your local changes to the staging server:
107
+
108
+ rake deploy:views
109
+ rake deploy:javascripts
110
+
111
+ DOCS
112
+ puts docs
113
+ end
114
+
115
+ desc "Some more help"
116
+ task :help do
117
+ docs = <<-DOCS
118
+
119
+ #{please_install_rhino}
120
+
121
+ FOR HELP:
122
+
123
+ To list reference for all tasks:
124
+
125
+ rake tasks
126
+
127
+ To get help for a specific command (this is still in progress):
128
+
129
+ rake create:help
130
+ rake deploy:help
131
+ rake validate:help
132
+
133
+ DOCS
134
+ puts docs
135
+ end
136
+
137
+ desc "Show usage for tasks"
138
+ task :tasks do
139
+ docs = <<-DOCS
140
+ USAGE: rake TASK [app={application}] [path={path}], [dry_run=true], [dir={directory}], [application_id={app_id}]
141
+
142
+ VALID TASKS:
143
+
144
+ create creates a new local copy of an existing YMDP application
145
+ deploy deploys local copy of YMDP application to remote server
146
+ validate validates javascript assets
147
+
148
+ The "create" and "deploy" tasks can be subtasked with the name of a server:
149
+
150
+ create:my create a new local copy of the production application
151
+ deploy:staging deploy local changes to the staging application
152
+
153
+ The "validate" task can be subtasked with "all" to validate all the javascripts for the given server:
154
+
155
+ validate:all validates all our javascript assets for the given server (including JSON)
156
+
157
+ DOCS
158
+ # TODO: add more documentation
159
+
160
+ puts docs
161
+ end
162
+
163
+ desc "Deploys application to YMDP servers"
164
+ task :deploy do
165
+ time("Deployed #{@application}: #{@path}") do
166
+ deploy(@application, @path)
167
+ end
168
+ end
169
+
170
+ desc "Deploys application to YMDP servers, matching a path"
171
+ task :deploy_path do
172
+ time("Deployed #{@application}: #{@path}") do
173
+ deploy_path(@application, @path)
174
+ end
175
+ end
176
+
177
+ task :deploy_yrb do
178
+ time("Deployed #{@application}: #{@path}") do
179
+ deploy_yrb(@application, @path, {:lang => @lang, :view => @view})
180
+ end
181
+ end
182
+
183
+ desc "List files"
184
+ task :list_assets do
185
+ puts list(@application, @path)
186
+ end
187
+
188
+ desc "Quality-control to determine if all the assets have the same ID"
189
+ task :check_assets do
190
+ report_asset_ids(@application, @path)
191
+ end
192
+
193
+ desc "Update remote assets which don't match the correct asset ID"
194
+ task :fix_assets do
195
+ fix_assets(@application, @path)
196
+ end
197
+
198
+ desc "Validates all javascripts"
199
+ task :validate => "validate:all"
200
+
201
+
202
+ namespace :check_assets do
203
+ create_from_servers do |key, set_task|
204
+ desc "Check asset IDs on #{key} server"
205
+ task key => [set_task, :check_assets]
206
+ end
207
+ end
208
+
209
+ namespace :fix_assets do
210
+ create_from_servers do |key, set_task|
211
+ desc "Update remote assets which don't match the correct asset ID on #{key} server"
212
+ task key => [set_task, :fix_assets]
213
+ end
214
+ end
215
+
216
+ namespace :list_assets do
217
+ create_from_servers do |key, set_task|
218
+ desc "List files from #{key} application"
219
+ task key => [set_task, :list]
220
+ end
221
+
222
+ create_from_servers do |key, set_task|
223
+ namespace key do
224
+ desc "Lists views from the #{key} server"
225
+ task :views => [set_task, :set_views, :list_assets]
226
+
227
+ desc "Lists all assets from the #{key} server"
228
+ task :assets => [set_task, :set_assets, :list_assets]
229
+
230
+ desc "Lists javascript assets from the #{key} server"
231
+ task :javascripts => [set_task, :set_javascripts, :list_assets]
232
+
233
+ desc "Lists image assets from the #{key} server"
234
+ task :images => [set_task, :set_images, :list_assets]
235
+
236
+ desc "Lists YRB bundles from the #{key} server"
237
+ task :yrb => [set_task, :set_yrb, :list_assets]
238
+
239
+ desc "Lists everything except images from the the #{key} server"
240
+ task :code => ["list_assets:#{key}:views", :skip_validation, "list_assets:#{key}:javascripts", "list_assets:#{key}:yrb"]
241
+ end
242
+ end
243
+
244
+ create_from_categories(:list)
245
+ end
246
+
247
+ namespace :validate do
248
+ create_from_servers do |key, set_task|
249
+ namespace key do
250
+ desc "Validates all javascripts (excluding prototype/scriptaculous)"
251
+ task :javascripts => [set_task, "validate:javascripts"]
252
+
253
+ desc "Validates all JSON"
254
+ task :json => [set_task, "validate:json"] do
255
+ end
256
+
257
+ desc "Validates all HTML"
258
+ task :html => [set_task,"validate:html"] do
259
+ end
260
+
261
+ desc "Validates all embedded JavaScript"
262
+ task :embedded_js => [set_task,"validate:embedded_js"] do
263
+ end
264
+
265
+ desc "Validates all javascripts and JSON and HTML"
266
+ task :all => [set_task, "validate:all"]
267
+ end
268
+ end
269
+
270
+ desc "Validates all javascripts (excluding prototype/scriptaculous)"
271
+ task :javascripts do
272
+ puts "\nValidating external JavaScript assets in #{@application}..."
273
+ Dir["#{BASE_PATH}/servers/#{@application}/assets/javascripts/*.js"].each do |path|
274
+ ApplicationView::Validator::JavaScript.validate(path)
275
+ end
276
+ end
277
+
278
+ desc "Validates all JSON"
279
+ task :json do
280
+ puts "\nValidating JSON in #{@application}..."
281
+ Dir["./servers/#{@application}/assets/yrb/*json"].each do |json|
282
+ filename = json.split("/").last
283
+ path = "#{BASE_PATH}/servers/#{@application}/assets/yrb/#{filename}"
284
+ ApplicationView::Validator::JSON.validate(path)
285
+ end
286
+ end
287
+
288
+ desc "Validates all HTML"
289
+ task :html do
290
+ puts "\nValidating HTML in #{@application}..."
291
+ `rm -rf #{TMP_DIR}`
292
+ Dir.mkdir(TMP_DIR) rescue Errno::EEXIST
293
+ Dir["./servers/#{@application}/views/*"].each do |filename|
294
+ ApplicationView::Validator::HTML.validate(filename) if filename =~ /#{@path}/
295
+ end
296
+ end
297
+
298
+ desc "Validates all JavaScript inside HTML"
299
+ task :embedded_js do
300
+ if @path =~ /views/
301
+ validate_path = @path.gsub(/views\/$/, "/*")
302
+ else
303
+ validate_path = "views/*"
304
+ end
305
+ puts "\nValidating embedded JavaScript in #{@application}..."
306
+ Dir["./servers/#{@application}/views/*"].each do |filename|
307
+ validated_embedded_js(filename) if filename =~ /#{@path}/
308
+ end
309
+ end
310
+
311
+ desc "Validates all javascripts and JSON"
312
+ task :all => ["validate:javascripts", "validate:json", "validate:html", "validate:embedded_js"]
313
+ end
314
+
315
+ task :set_yrb do
316
+ @path = "assets/yrb/"
317
+ end
318
+
319
+ task :set_sync do
320
+ @sync = true
321
+ end
322
+
323
+ desc "Syncs default server"
324
+ task :sync => [:set_sync, :deploy]
325
+
326
+ namespace :sync do
327
+ create_from_servers do |key, set_task|
328
+ desc "Syncs application with #{key} server"
329
+ task key => [set_task, :set_sync, :deploy]
330
+ end
331
+
332
+ create_from_servers do |key, set_task|
333
+ namespace key do
334
+ desc "Syncs views to the #{key} server"
335
+ task :views => [set_task, :set_views, :set_sync, :deploy]
336
+
337
+ desc "Syncs all assets to the #{key} server"
338
+ task :assets => [set_task, :set_assets, :set_sync, :deploy]
339
+
340
+ desc "Syncs javascript assets to the #{key} server"
341
+ task :javascripts => [set_task, :set_javascripts, :set_sync, :deploy]
342
+
343
+ desc "Syncs image assets to the #{key} server"
344
+ task :images => [set_task, :set_images, :set_sync, :deploy]
345
+
346
+ desc "Syncs YRB bundles to the #{key} server"
347
+ task :yrb => [set_task, :set_yrb, :set_sync, :deploy_yrb]
348
+
349
+ desc "Syncs everything except images to the the #{key} server"
350
+ task :code => [set_task, "deploy:#{key}:views", :skip_validation, "deploy:#{key}:javascripts", "deploy:#{key}:yrb"]
351
+ end
352
+ end
353
+
354
+ task :yrb => [:set_yrb, :set_sync, :deploy_yrb]
355
+
356
+ create_from_categories(:sync)
357
+ end
358
+
359
+ namespace :deploy do
360
+ desc "Show shows documentation"
361
+ task :help do
362
+ docs = <<-DOCS
363
+ USAGE: rake deploy [app={application}] [path={path}], [dry_run=true], [dir={directory}], [application_id={app_id}]
364
+
365
+ Deploys the local application to the remote YMDP servers. Validates javascript assets beforehand, aborting the deploy in case of validation errors.
366
+
367
+ Run without options, the default is to deploy everything to the staging server.
368
+
369
+ Specify the application to deploy to:
370
+ rake deploy app=staging
371
+ rake deploy app=my
372
+ rake deploy app=alpha
373
+
374
+ NOTE: use subtasks to simplify specifying the application:
375
+ rake deploy:my
376
+ rake deploy:alpha
377
+ rake deploy:staging
378
+
379
+ VALID SUBTASKS: my, alpha, staging
380
+
381
+ Specify files to deploy:
382
+ rake deploy path=views
383
+ rake deploy path=views/settings
384
+ rake deploy path=assets/javascripts/application.js
385
+
386
+ NOTE: use subtasks to simplify the subset of files to deploy,
387
+ rake deploy:views
388
+ rake deploy:javascripts
389
+
390
+ VALID SUBTASKS: views, assets, javascripts, images, yrb
391
+
392
+
393
+ DOCS
394
+ # TODO: add more documentation
395
+
396
+ puts docs
397
+ end
398
+
399
+ create_from_servers do |key, set_task|
400
+ desc "Deploys application to #{key} server"
401
+ task key => [set_task, :deploy]
402
+ end
403
+
404
+ create_from_servers do |key, set_task|
405
+ namespace key do
406
+ desc "Deploys views to the #{key} server"
407
+ task :views => [set_task, :set_views, :deploy]
408
+
409
+ desc "Deploys all assets to the #{key} server"
410
+ task :assets => [set_task, :set_assets, :deploy]
411
+
412
+ desc "Deploys javascript assets to the #{key} server"
413
+ task :javascripts => [set_task, :set_javascripts, :deploy]
414
+
415
+ desc "Deploys image assets to the #{key} server"
416
+ task :images => [set_task, :set_images, :deploy]
417
+
418
+ desc "Deploys YRB bundles to the #{key} server"
419
+ task :yrb => [set_task, :set_yrb, :deploy_yrb]
420
+
421
+ desc "Deploys everything except images to the the #{key} server"
422
+ task :code => [set_task, "deploy:#{key}:views", :skip_validation, "deploy:#{key}:javascripts", "deploy:#{key}:yrb"]
423
+ end
424
+ end
425
+
426
+ task :yrb => [:set_yrb, :deploy_yrb]
427
+
428
+ create_from_categories(:deploy)
429
+ end
430
+
431
+
432
+ # rake create app=my path=./my
433
+ # rake create app=staging path=staging
434
+
435
+ desc "Creates a new local copy of a YMDP application"
436
+ task :create do
437
+ puts "about to create_directory for #{@application}"
438
+ time("Created") do
439
+ create_directory_from_application(@application, @path)
440
+ end
441
+ end
442
+
443
+ # rake create:my path=./my
444
+ # rake create:staging path=staging
445
+
446
+ namespace :create do
447
+ desc "Create all applications"
448
+ task :all do
449
+ time("Created all applications") do
450
+ SERVERS.each do |key, values|
451
+ create_directory_from_application(values["server"])
452
+ end
453
+ end
454
+ end
455
+
456
+ create_from_servers do |key, set_task|
457
+ desc "Creates local application from #{key} server"
458
+ task key do
459
+ @application = key.to_s
460
+ Rake::Task["create"].invoke
461
+ end
462
+ end
463
+ end
464
+
465
+
466
+
467
+ # TASKS TO SET UP ENVIRONMENT
468
+
469
+ CATEGORIES.each do |name, path|
470
+ task "set_#{name}" do
471
+ @path = "#{path}/#{@path}"
472
+ end
473
+ end
474
+
475
+
476
+ # END OF RAKE TASKS
477
+
478
+ def invoke_ymdt(command_string, application, path="", return_results=false)
479
+ dir = "./servers/" << application
480
+ path = dir << "/" << path
481
+
482
+ command = []
483
+ command << command_string
484
+ command << "\"#{path}\""
485
+ command << "-s" if @sync
486
+
487
+ ymdt_command(command, return_results)
488
+ end
489
+
490
+ def ymdt_command(commands, return_results=false)
491
+ command = []
492
+ # command << "php"
493
+ command << "./script/ymdt"
494
+
495
+ command << commands
496
+
497
+ command << "-u#{@username}"
498
+ command << "-p#{@password}"
499
+ command_string = command.join(" ")
500
+
501
+ display_string = command_string.dup
502
+ display_string.gsub!(@username, "[username]")
503
+ display_string.gsub!(@password, "[password]")
504
+
505
+ puts
506
+ puts display_string
507
+
508
+ unless @dry_run
509
+ if return_results
510
+ `#{command_string}`
511
+ else
512
+ puts
513
+ system command_string
514
+ end
515
+ end
516
+ end
517
+
518
+ def validated_embedded_js(path)
519
+ # jslint only accepts files, later we can hack it to accept stdin pipes
520
+ doc = open(path) { |f|
521
+ Hpricot(f)
522
+ }
523
+
524
+ js_fragment_path = TMP_DIR + "/#{File.basename(path)}_js_fragment"
525
+
526
+ File.open(js_fragment_path,'w') do |f|
527
+ (doc / "script").each { |js| f.puts js.inner_html + "\n\n" }
528
+ end
529
+
530
+ ApplicationView::Validator::JavaScript.validate(js_fragment_path)
531
+ system "rm #{js_fragment_path}"
532
+ end
533
+
534
+ def deploy(application, path)
535
+ puts "\nDeploying #{application}: #{path}"
536
+
537
+ Rake::Task["validate:html"].invoke if validate_html?
538
+ Rake::Task["validate:embedded_js"].invoke if validate_embedded_js?
539
+ Rake::Task["validate:#{application}:javascripts"].invoke if validate_js_assets?
540
+ Rake::Task["validate:#{application}:json"].invoke if validate_json_assets?
541
+
542
+ puts "About to invoke_ymdt: put, #{application}, #{path}"
543
+ invoke_ymdt("put", application, path)
544
+ end
545
+
546
+ def deploy_path(application, path)
547
+ puts "\nDeploying #{application}: #{path}"
548
+
549
+ Rake::Task["validate:html"].invoke if validate_html?
550
+ Rake::Task["validate:embedded_js"].invoke if validate_embedded_js?
551
+ Rake::Task["validate:#{application}:javascripts"].invoke if validate_js_assets?
552
+ Rake::Task["validate:#{application}:json"].invoke if validate_json_assets?
553
+
554
+ dir = "./servers/#{application}"
555
+
556
+ if path =~ /\/$/
557
+ deploy(application, path)
558
+ else
559
+ path =~ /^(.*)\/.*$/
560
+ short_path = $1
561
+
562
+ full_path = "#{dir}/#{short_path}/**"
563
+
564
+ Dir[full_path].each do |file|
565
+ new_path = file.gsub(/#{dir}\//, "")
566
+
567
+ if file =~ Regexp.new(path)
568
+ puts file
569
+ invoke_ymdt("put", application, new_path)
570
+ end
571
+ end
572
+ end
573
+ end
574
+
575
+ def deploy_yrb(application, path, options={})
576
+ lang = options[:lang]
577
+ view = options[:view]
578
+
579
+ if lang
580
+ new_path = "#{path}/keys_#{lang}.json"
581
+ deploy_path(application, new_path)
582
+ else
583
+ deploy_path(application, path)
584
+ end
585
+ end
586
+
587
+ def list(application, path)
588
+ invoke_ymdt("ls", application, path, true)
589
+ end
590
+
591
+ def check_asset_ids(application, path)
592
+ result = list(application, path)
593
+
594
+ lines = result.split("\n")
595
+ wrong_lines = []
596
+
597
+ lines.each do |line|
598
+ if line =~ /om\/assets\/(.*)\//
599
+ match = $1
600
+
601
+ if match =~ /#{@assets_id}/
602
+ puts line
603
+ else
604
+ wrong_lines << line
605
+ end
606
+ end
607
+ end
608
+
609
+ wrong_lines
610
+ end
611
+
612
+ def report_asset_ids(application, path)
613
+ time("Listed asset ids") do
614
+ wrong_ids = []
615
+ wrong_lines = check_asset_ids(application, path)
616
+
617
+ puts
618
+
619
+ if wrong_lines.any?
620
+ message = "Some assets do not have the specified asset ID of #{@assets_id}"
621
+ puts message
622
+ wrong_lines.each do |line|
623
+ if line =~ /om\/assets\/(.*)\//
624
+ match = $1
625
+ if match !~ /#{@assets_id}/
626
+ wrong_id = match.split("/").first
627
+ wrong_ids << wrong_id unless wrong_ids.include?(wrong_id)
628
+ end
629
+ end
630
+ puts line
631
+ end
632
+ puts
633
+ puts "The above assets do not have the specified asset ID of #{@assets_id}"
634
+ puts
635
+ if wrong_ids.any?
636
+ puts "Here are the other asset IDs used:"
637
+ wrong_ids.each do |wrong_id|
638
+ puts " " + wrong_id;
639
+ first_index = @assets_id.split("_").last
640
+ second_index = wrong_id.split("_").last
641
+ if second_index.to_i > first_index.to_i
642
+ puts
643
+ puts " This index is higher than the stored application ID."
644
+ puts " You can update your servers.yml with the following settings:"
645
+ puts
646
+ puts "servers:"
647
+ puts " #{@application}:"
648
+ puts " dir: #{@dir}"
649
+ puts " application_id: #{@application_id}"
650
+ puts " assets_id: #{wrong_id}"
651
+ else
652
+ puts
653
+ puts " This index is lower than the stored application ID."
654
+ puts
655
+ puts " Run rake fix_assets:#{application} to update remote assets"
656
+ end
657
+ end
658
+ end
659
+ else
660
+ message = "All assets have the specified asset ID of #{@assets_id}"
661
+ end
662
+ end
663
+ end
664
+
665
+ def fix_assets(application, path)
666
+ time("Fixed assets") do
667
+ Rake::Task["validate:all"].invoke unless @skip_validation
668
+ @skip_validation = true
669
+
670
+ wrong_lines = check_asset_ids(application, path)
671
+
672
+ if wrong_lines.any?
673
+ wrong_lines.each do |line|
674
+ filename = line.split(" ")[0]
675
+
676
+ puts deploy(application, filename)
677
+ end
678
+ else
679
+ message = "All assets are up to date"
680
+ end
681
+ end
682
+ end
683
+
684
+ def create_directory_from_application(application, path="")
685
+ time("Done creating #{application}: #{path}") do
686
+ puts "Creating #{application}: #{path}"
687
+ application_id = SERVERS[application]["application_id"]
688
+
689
+ dir = "./servers/#{application}"
690
+
691
+ if path == ""
692
+ path = dir
693
+ else
694
+ path = "./" << path
695
+ end
696
+
697
+ command = []
698
+
699
+ command << "get"
700
+ command << path
701
+ command << "-a#{application_id}"
702
+
703
+ ymdt_command(command)
704
+ end
705
+ end
706
+
707
+ def please_install_rhino
708
+ output = <<-DOC
709
+ NOTE:
710
+
711
+ You must have Rhino installed in your classpath to validate javascripts, which is required to deploy. Download Rhino from:
712
+
713
+ http://www.mozilla.org/rhino/download.html
714
+
715
+ To put Rhino into your Java classpath, run:
716
+
717
+ mkdir -p ~/Library/Java/Extensions/
718
+ cp rhino****/js.jar ~/Library/Java/Extensions/
719
+ DOC
720
+ end