sproutcore 1.6.0.1-java → 1.7.1.beta-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. data/CHANGELOG +21 -0
  2. data/Gemfile +5 -0
  3. data/Rakefile +26 -13
  4. data/VERSION.yml +2 -2
  5. data/lib/Buildfile +43 -4
  6. data/lib/buildtasks/build.rake +10 -0
  7. data/lib/buildtasks/helpers/file_rule.rb +22 -0
  8. data/lib/buildtasks/helpers/file_rule_list.rb +137 -0
  9. data/lib/buildtasks/manifest.rake +133 -122
  10. data/lib/frameworks/sproutcore/CHANGELOG.md +69 -2
  11. data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +1 -0
  12. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +28 -22
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +9 -5
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +1 -1
  15. data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +18 -13
  16. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +5 -3
  17. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +2 -0
  18. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +80 -0
  19. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +84 -116
  20. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +8 -5
  21. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +157 -157
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +5 -3
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +6 -6
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +10 -7
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +106 -0
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +18 -0
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +71 -1
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/attribute_bindings_test.js +38 -0
  29. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +47 -0
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +18 -18
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +42 -10
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +26 -1
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
  35. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +15 -2
  36. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +108 -108
  37. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
  38. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -4
  39. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +2 -2
  40. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +26 -0
  41. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +4 -1
  44. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +6 -0
  45. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +26 -5
  46. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +97 -96
  47. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -3
  48. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +17 -4
  49. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +7 -7
  50. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +7 -5
  51. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +12 -3
  52. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +23 -14
  53. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +5 -1
  54. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +28 -0
  55. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +235 -0
  56. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +363 -0
  57. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +250 -0
  58. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +92 -0
  59. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +25 -0
  60. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +33 -0
  61. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +76 -0
  62. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +50 -0
  63. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +143 -0
  64. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +258 -0
  65. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +1164 -0
  66. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +332 -0
  67. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +236 -0
  68. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +347 -0
  69. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +15 -0
  70. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +10 -0
  71. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +804 -0
  72. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +133 -0
  73. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +3 -3
  74. data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +3 -1
  75. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +3 -3
  76. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +2 -1
  77. data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +2 -1
  78. data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +2 -4
  79. data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +2 -4
  80. data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +2 -4
  81. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +2 -2
  82. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +29 -3
  83. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
  84. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +1 -1
  85. data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -1
  86. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +3 -3
  87. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -2
  88. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
  89. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
  90. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/segmented.css +1 -1
  91. data/lib/gen/app/templates/apps/@target_name@/Buildfile +3 -5
  92. data/lib/gen/app/templates/apps/@target_name@/resources/_theme.css +18 -0
  93. data/lib/gen/project/templates/@filename@/Buildfile +2 -2
  94. data/lib/sproutcore.rb +30 -5
  95. data/lib/sproutcore/builders.rb +1 -0
  96. data/lib/sproutcore/builders/chance_file.rb +9 -16
  97. data/lib/sproutcore/builders/html.rb +2 -1
  98. data/lib/sproutcore/builders/minify.rb +4 -35
  99. data/lib/sproutcore/builders/module.rb +38 -1
  100. data/lib/sproutcore/builders/split.rb +63 -0
  101. data/lib/sproutcore/builders/strings.rb +7 -1
  102. data/lib/sproutcore/helpers.rb +1 -1
  103. data/lib/sproutcore/helpers/css_split.rb +190 -0
  104. data/lib/sproutcore/helpers/entry_sorter.rb +2 -0
  105. data/lib/sproutcore/helpers/minifier.rb +40 -16
  106. data/lib/sproutcore/helpers/static_helper.rb +35 -17
  107. data/lib/sproutcore/models/manifest.rb +26 -0
  108. data/lib/sproutcore/models/target.rb +12 -1
  109. data/lib/sproutcore/rack.rb +1 -0
  110. data/lib/sproutcore/rack/proxy.rb +244 -225
  111. data/lib/sproutcore/rack/restrict_ip.rb +67 -0
  112. data/lib/sproutcore/rack/service.rb +8 -2
  113. data/lib/sproutcore/tools.rb +102 -46
  114. data/lib/sproutcore/tools/build.rb +91 -43
  115. data/lib/sproutcore/tools/gen.rb +2 -3
  116. data/lib/sproutcore/tools/manifest.rb +22 -16
  117. data/lib/sproutcore/tools/server.rb +21 -0
  118. data/spec/buildtasks/helpers/accept_list +22 -0
  119. data/spec/buildtasks/helpers/accept_list.rb +128 -0
  120. data/spec/buildtasks/helpers/list.json +11 -0
  121. data/spec/buildtasks/manifest/prepare_build_tasks/chance_2x_spec.rb +1 -39
  122. data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +0 -38
  123. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +4 -4
  124. data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +2 -2
  125. data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_indirect_spec.rb +7 -16
  126. data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_spec.rb +7 -17
  127. data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +11 -6
  128. data/spec/fixtures/builder_tests/Buildfile +2 -1
  129. data/spec/fixtures/builder_tests/apps/module_test/modules/required_module/core.js +0 -0
  130. data/spec/lib/builders/module_spec.rb +1 -1
  131. data/spec/spec_helper.rb +1 -0
  132. data/sproutcore.gemspec +4 -9
  133. data/vendor/chance/lib/chance.rb +25 -6
  134. data/vendor/chance/lib/chance/factory.rb +45 -0
  135. data/vendor/chance/lib/chance/instance.rb +173 -28
  136. data/vendor/chance/lib/chance/instance/data_url.rb +0 -29
  137. data/vendor/chance/lib/chance/instance/slicing.rb +57 -4
  138. data/vendor/chance/lib/chance/instance/spriting.rb +112 -21
  139. data/vendor/chance/lib/chance/parser.rb +80 -52
  140. data/vendor/sproutcore/SCCompiler.jar +0 -0
  141. data/vendor/sproutcore/lib/args4j-2.0.12.jar +0 -0
  142. data/vendor/sproutcore/lib/yuicompressor-2.4.2.jar +0 -0
  143. metadata +84 -25
@@ -0,0 +1,67 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009-2011 Apple Inc.
4
+ # portions copyright @2006-2011 Strobe Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ # For all those working in internet cafes...
9
+ # We feel for you. Go to a real cafe instead. They have internet, too.
10
+ module SC
11
+ module Rack
12
+ class RestrictIP
13
+ def initialize(app, allow_ips=[])
14
+ @app = app
15
+ @allow = allow_ips
16
+ end
17
+
18
+ # checks if an IP, such as 127.0.0.1, matches a mask, such as 127.*.*.*
19
+ def ip_is_valid(ip, mask)
20
+ ip_parts = ip.split('.')
21
+ mask_parts = mask.split('.')
22
+
23
+ if mask_parts.length != 4
24
+ SC.logger.fatal "Invalid IP mask: #{mask}\n"
25
+ exit
26
+ end
27
+
28
+ ip_idx = 0
29
+ mask_parts.each {|mask_part|
30
+ ip_part = ip_parts[ip_idx]
31
+
32
+ # * means anything matches
33
+ if mask_part == '*'
34
+ next
35
+ end
36
+
37
+ if ip_part != mask_part
38
+ return false
39
+ end
40
+
41
+ ip_idx = ip_idx + 1
42
+ }
43
+
44
+ return true
45
+ end
46
+
47
+ def call(env)
48
+ ip = env['REMOTE_ADDR']
49
+
50
+ is_valid = false
51
+ @allow.each {|mask|
52
+ if ip_is_valid(ip, mask)
53
+ is_valid = true
54
+ break
55
+ end
56
+ }
57
+
58
+ if is_valid
59
+ return @app.call(env)
60
+ else
61
+ SC.logger << "Blocked connection attempt by ip: #{ip}\n"
62
+ return [403, { 'Content-Type' => 'text/plain' }, "YOU CANNOT BEEZ HERE."]
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -59,7 +59,7 @@ module SC
59
59
  self.filesystem = opts[:Filesystem]
60
60
 
61
61
  projects = opts.delete(:projects) || [opts.delete(:project)].compact
62
- app = self.new(*projects)
62
+ app = self.new(*projects, opts)
63
63
 
64
64
  opts[:Host] ||= opts[:host] # allow either case.
65
65
  opts[:Port] ||= opts[:port] || '4020'
@@ -93,7 +93,7 @@ module SC
93
93
  server.run app, opts
94
94
  end
95
95
 
96
- def initialize(*projects)
96
+ def initialize(*projects, opts)
97
97
  @projects = projects.flatten
98
98
 
99
99
  # Get apps for each project & cascade if needed
@@ -105,6 +105,12 @@ module SC
105
105
  @app = ::Rack::ConditionalGet.new(@app)
106
106
  #@app = ::Rack::Deflater.new(@app)
107
107
 
108
+ # preprocess IPs so we can restrict properly
109
+ ips = opts[:allow_from_ips] || '127.0.0.1'
110
+ SC.logger << "Allowing access only from IPs: #{ips}. Use --allow-from-ips='*.*.*.*' to allow all\n"
111
+ ips = ips.split(',')
112
+
113
+ @app = SC::Rack::RestrictIP.new(@app, ips)
108
114
  end
109
115
 
110
116
  def call(env); @app.call(env); end
@@ -32,17 +32,27 @@ module SC
32
32
 
33
33
  # All sproutcore tools can take some standard options. These are
34
34
  # processed automatically when the tool is loaded
35
- class_option "project", :type => :string
36
- class_option "mode", :type => :string
37
- class_option "logfile", :type => :string
38
- class_option "build", :type => :string, :aliases => "-b"
39
- class_option "build-targets", :type => :string
40
- class_option "yui-minification", :type => :boolean
41
- class_option "dont-minify", :type => :boolean
42
- class_option "verbose", :type => :boolean, :aliases => "-v"
43
- class_option "very-verbose", :type => :boolean, :aliases => "-V"
44
- class_option "library", :type => :string #deprecated
45
- class_option "environment", :type => :string #deprecated
35
+ class_option "project", :type => :string
36
+ class_option "mode", :type => :string
37
+ class_option "logfile", :type => :string
38
+ class_option "build", :type => :string, :aliases => "-b"
39
+ class_option "build-targets",:type => :string,
40
+ :desc => "Targets to build (excluding their dependencies)"
41
+
42
+ class_option "yui-minification", :type => :boolean,
43
+ :desc => "Deprecated. Does nothing."
44
+
45
+ class_option "dont-minify", :type => :boolean,
46
+ :desc => "Disables minification for the build."
47
+
48
+ class_option "verbose", :type => :boolean, :aliases => "-v"
49
+ class_option "very-verbose", :type => :boolean, :aliases => "-V"
50
+
51
+ class_option "library", :type => :string, #deprecated
52
+ :desc => "Deprecated."
53
+ class_option "environment", :type => :string, #deprecated
54
+ :desc => "Deprecated."
55
+ class_option "help", :type => :boolean
46
56
 
47
57
  default_task :banner
48
58
 
@@ -199,6 +209,20 @@ module SC
199
209
  end
200
210
  end
201
211
 
212
+ # This is the root project, so we must also load the "include targets" used to
213
+ # make additional frameworks available to SC apps.
214
+ SC.include_targets.each {|target|
215
+ target_path = File.expand_path target[:path]
216
+ target_name = File.join "/", target[:name]
217
+
218
+ # Note: target names must begin with / to be valid.
219
+ t = ret.add_target target_name, :framework, { :source_root => target_path }
220
+
221
+ if t.config[:allow_nested_targets]
222
+ ret.find_targets_for(target_path, target_name, t.config)
223
+ end
224
+ }
225
+
202
226
  info "Loaded project at: #{ret.project_root}" unless ret.nil?
203
227
  @project = ret
204
228
  end
@@ -269,26 +293,6 @@ module SC
269
293
  targets = tar
270
294
  end
271
295
 
272
- # If include required was specified, merge in all required bundles as
273
- # well. Note that we do this whether --build-targets is specified or not.
274
- if options[:'include-required']
275
- tar = targets.clone
276
- targets.each do |target|
277
- required = target.expand_required_targets :theme => true,
278
- :debug => target.config.load_debug,
279
- :tests => target.config.load_tests
280
-
281
- required.each {|t|
282
- t.config[:minify_javascript] = false if not targets.include? t
283
- }
284
-
285
- tar += required
286
- end
287
-
288
- targets = tar.flatten.uniq.compact
289
- end
290
-
291
-
292
296
  targets
293
297
 
294
298
  end
@@ -342,35 +346,87 @@ module SC
342
346
  SC.logger.info "Using build numbers: #{numbers.map { |k,v| "#{k}: #{v}" }.join(',')}"
343
347
  end
344
348
  end
345
-
346
- # Core method to process command line options and then build a manifest.
347
- # Shared by sc-manifest, sc-build and sc-docs commands.
348
- def build_manifests(*targets)
349
-
349
+
350
+ def each_manifest_for_targets(*targets)
350
351
  # setup build numbers
351
352
  find_build_numbers(*targets)
352
353
 
353
354
  requires_project! # get project
355
+
354
356
  targets = find_targets(*targets) # get targets
355
- languages = find_languages(*targets) # get languages
356
357
 
357
358
  # log output
358
359
  SC.logger.info "Building targets: #{targets.map { |t| t.target_name } * ","}"
360
+
361
+ languages = find_languages(*targets) # get languages
359
362
  SC.logger.info "Building languages: #{ languages * "," }"
363
+
364
+ index = 1
365
+ count = targets.length * languages.length
366
+ SC.logger.info "Total target/language combinations to build: #{count}"
367
+
368
+ targets.each {|target|
369
+ languages.each {|l|
370
+ manifest = target.manifest_for :language => l
371
+ SC.logger.info "Creating manifest #{index} of #{count} for: #{manifest.target.target_name}:#{manifest.language}"
372
+
373
+ yield manifest
374
+
375
+ index += 1
376
+ }
377
+ }
378
+
379
+ end
360
380
 
361
- # Now fetch the manifests to build. One per target/language
362
- manifests = targets.map do |target|
363
- languages.map { |l| target.manifest_for :language => l }
364
- end
365
- manifests.flatten!
366
-
381
+ # Core method to process command line options and then build a manifest.
382
+ # Shared by sc-manifest, sc-build and sc-docs commands.
383
+ def build_manifests(*targets)
367
384
  # Build'em
368
- manifests.each do |manifest|
369
- SC.logger.info "Building manifest for: #{manifest.target.target_name}:#{manifest.language}"
385
+ each_manifest_for_targets(*targets) do |manifest|
370
386
  manifest.build!
387
+
388
+ yield manifest
371
389
  end
390
+ end
391
+
392
+ # Loops over all of the manifest's entries and builds all essential entries.
393
+ # Entries such as javascript.js are considered non-essential because they will
394
+ # not actually be used in a fully built app (except for modules).
395
+ #
396
+ # It also does a check to ensure that all JS being written is minified.
397
+ def build_entries_for_manifest(manifest, allow_comments)
398
+ if manifest.entries.size > 0
399
+ target = manifest.target
400
+ info "Building entries for #{target.target_name}:#{manifest.language}..."
401
+
402
+ # we ONLY generate non-packed javascript.js files for modules, which may need
403
+ # to lazily load them. Otherwise: NOPE!
404
+ generate_javascript = false
405
+ if target[:target_type] === :module
406
+ generate_javascript = true
407
+ end
372
408
 
373
- return manifests
409
+ target_build_root = Pathname.new(manifest.target.project.project_root)
410
+ manifest.entries.each do |entry|
411
+ # Skip combined JS when it is a target that doesn't need it.
412
+ # We can't just skip all non-packed JS, because you can use sc_resource to split
413
+ # the JS out, and that won't work properly. :combine, likewise, is used for sc_resource.
414
+ # So, we skip the entry IF it is javascript.js--because that is how the pack task itself
415
+ # knows the difference.
416
+ next if not generate_javascript and entry[:filename] == 'javascript.js'
417
+
418
+ # For security, skip AND WARN about files which are not minified
419
+ if not SC.env[:dont_minify] and not allow_comments and entry[:entry_type] == :javascript and not entry[:minified]
420
+ SC.logger.fatal "SECURITY: Entry not minified: #{entry[:filename]}; target: #{target[:target_name]}"
421
+ SC.logger.fatal "All entries must be minified in a final build UNLESS --allow-commented-js argument is supplied."
422
+ exit(1)
423
+ end
424
+
425
+ dst = Pathname.new(entry.build_path).relative_path_from(target_build_root)
426
+ info " #{entry.filename} -> #{dst}"
427
+ entry.build!
428
+ end
429
+ end
374
430
  end
375
431
 
376
432
  # Logs the contents of the passed file path to the logger
@@ -13,49 +13,70 @@ $to_html5_manifest_networks = []
13
13
 
14
14
  module SC
15
15
  class Tools
16
-
16
+
17
17
  desc "build [TARGET..]", "Builds one or more targets"
18
- method_options(MANIFEST_OPTIONS)
18
+
19
+ # Standard manifest options. Used by build tool as well.
20
+ method_option :languages, :type => :string,
21
+ :desc => "The languages to build."
22
+
23
+ method_option :symlink, :default => false
24
+
25
+ method_option :buildroot, :type => :string,
26
+ :desc => "The path to build to."
27
+ method_option :stageroot, :type => :string,
28
+ :aliases => %w(--target -t),
29
+ :desc => "The path to stage to."
30
+ method_option :format, :type => :string
31
+ method_option :output, :type => :string
32
+ method_option :all, :type => false
33
+ method_option :build_numbers, :type => :string, :aliases => ['-B'],
34
+ :desc => "The identifier(s) for the build."
35
+ method_option :include_required, :default => false, :aliases => '-r',
36
+ :desc => "Deprecated. All builds build dependencies."
37
+
38
+
19
39
  method_option :entries, :type => :string
20
- method_option :clean, :type => :boolean, :aliases => "-c"
21
- # This is defined in MANIFEST_OPTIONS but I add the aliases here only since we use target elsewhere
22
- method_option :buildroot, :type => :string, :aliases => %w(--target -t)
40
+ method_option :whitelist, :type => :string,
41
+ :desc => "The whitelist to use when building. By default, Whitelist (if present)"
42
+ method_option :blacklist, :type => :string,
43
+ :desc => "The blacklist to use when building. By default, Blacklist (if present)"
44
+ method_option :accept, :type => :string,
45
+ :desc => "The SproutCore Accept file to determine which files to include. By default, Accept (if present)"
46
+ method_option :allow_commented_js, :type => :boolean,
47
+ :desc => "If supplied, commented JS will be allowed into the build."
23
48
  def build(*targets)
49
+ if options.help
50
+ help('build')
51
+ return
52
+ end
53
+
24
54
  t1 = Time.now
25
55
  SC.logger.info 'Starting build process...'
26
56
  # Copy some key props to the env
57
+ SC.env.whitelist_name = options.whitelist
58
+ SC.env.blacklist_name = options.blacklist
59
+ SC.env.accept_name = options.accept
27
60
  SC.env.build_prefix = options.buildroot if options.buildroot
28
61
  SC.env.staging_prefix = options.stageroot if options.stageroot
29
62
  SC.env.use_symlink = options.symlink
30
- SC.env.clean = options.clean
31
63
 
32
64
  # Get entries option
33
65
  entry_filters = nil
34
66
  if options[:entries]
35
67
  entry_filters = options[:entries].split(',')
36
68
  end
37
-
69
+
70
+ # We want Chance to clear files like sprites immediately after they're asked for,
71
+ # because we'll only need them once during a build.
72
+ Chance.clear_files_immediately
73
+
38
74
  # Get the manifests to build
39
- manifests = build_manifests(*targets)
40
-
41
- # First clean all manifests
42
- # Do this before building so we don't accidentally erase already build
43
- # nested targets.
44
- if SC.env.clean
45
- manifests.each do |manifest|
46
- build_root = manifest.target.build_root
47
- info "Cleaning #{build_root}"
48
- FileUtils.rm_r(build_root) if File.directory?(build_root)
49
-
50
- staging_root = manifest.target.staging_root
51
- info "Cleaning #{staging_root}"
52
- FileUtils.rm_r(staging_root) if File.directory?(staging_root)
53
- end
54
- end
55
-
56
- # Now build entries for each manifest...
57
- manifests.each do |manifest|
58
-
75
+ manifests = build_manifests(*targets) do |manifest|
76
+ # This is our own logic to prevent processing a manifest twice
77
+ next if manifest[:built_by_builder]
78
+ manifest[:built_by_builder] = true
79
+
59
80
  # get entries. If "entries" option was specified, use to filter
60
81
  # filename. Must match end of filename.
61
82
  entries = manifest.entries
@@ -71,24 +92,49 @@ module SC
71
92
  end
72
93
 
73
94
  # if there are entries to build, log and build
74
- if entries.size > 0
75
- info "Building entries for #{manifest.target.target_name}:#{manifest.language}..."
76
-
77
- target_build_root = Pathname.new(manifest.target.project.project_root)
78
- entries.each do |entry|
79
- dst = Pathname.new(entry.build_path).relative_path_from(target_build_root)
80
- info " #{entry.filename} -> #{dst}"
81
- entry.build!
82
- end
83
-
84
- end
95
+ build_entries_for_manifest manifest, options.allow_commented_js
96
+
97
+ # Build dependencies
98
+ target = manifest.target
99
+ required = target.expand_required_targets :theme => true,
100
+ :debug => target.config.load_debug,
101
+ :tests => target.config.load_tests,
102
+
103
+ # Modules are not 'required' technically, as they may be loaded
104
+ # lazily. However, we want to know all targets that should be built,
105
+ # so we'll include modules as well.
106
+ :modules => true
107
+
108
+
109
+ required.each {|t|
110
+ m = t.manifest_for (manifest.variation)
111
+
112
+
113
+ # And, yes, the same as above. We're just building entries for all required targets.
114
+ # We're also going to mark them as fully-built so they don't get built again.
115
+ next if m[:built_by_builder]
116
+ m[:built_by_builder] = true
117
+ m.build!
118
+
119
+ build_entries_for_manifest m, options.allow_commented_js
120
+
121
+
122
+ }
123
+
124
+ # Clean up
125
+ manifest.reset!
126
+ Chance::ChanceFactory.clear_instances
85
127
  end
86
128
 
87
- if $to_html5_manifest.length > 0
88
- $to_html5_manifest.each do |entry|
89
- SC::Helpers::HTML5Manifest.new.build(entry)
90
- end
91
- end
129
+ # The HTML5 manifest generator does not work properly; it is unstable (can cause crashes)
130
+ # and won't pick up modules. We need an alternative implemenation, preferably one that uses
131
+ # Abbot's own manifests to figure out what files are required. This is non-trivial, however.
132
+ #
133
+ # if $to_html5_manifest.length > 0
134
+ # $to_html5_manifest.each do |entry|
135
+ # SC::Helpers::HTML5Manifest.new.build(entry)
136
+ # end
137
+ # end
92
138
 
93
139
  SC::Helpers::Minifier.wait
94
140
 
@@ -98,5 +144,7 @@ module SC
98
144
  seconds = seconds%60
99
145
  puts 'Build time '+minutes.floor.to_s+ ' minutes '+seconds.floor.to_s+' secs'
100
146
  end
147
+
101
148
  end
149
+
102
150
  end