sproutcore 1.6.0.1-java → 1.7.1.beta-java

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.
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