sproutcore 1.5.0.pre.4 → 1.5.0.pre.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/CHANGELOG +6 -0
  2. data/VERSION.yml +1 -1
  3. data/lib/Buildfile +1 -1
  4. data/lib/buildtasks/build.rake +14 -6
  5. data/lib/buildtasks/manifest.rake +171 -72
  6. data/lib/frameworks/sproutcore/Buildfile +3 -5
  7. data/lib/frameworks/sproutcore/CHANGELOG.md +9 -0
  8. data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.js +2 -1
  9. data/lib/frameworks/sproutcore/apps/test_controls/resources/progress_page.js +7 -17
  10. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +7 -1
  11. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +14 -1
  12. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +0 -2
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +1 -1
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +14 -3
  15. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template/collection.js +1 -1
  16. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +2 -2
  17. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +6 -0
  18. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +1 -1
  19. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +1 -1
  20. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +49 -4
  21. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +8 -0
  22. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +46 -1
  23. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +32 -5
  24. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/checkbox.js +32 -6
  25. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +31 -3
  26. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +15 -3
  27. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio.js +28 -7
  28. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -1
  29. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +20 -1
  30. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/well.js +2 -4
  31. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +40 -34
  32. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +35 -0
  33. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +43 -0
  34. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +47 -0
  35. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +6 -16
  36. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +21 -0
  37. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +41 -1
  38. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +128 -0
  39. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +93 -3
  40. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +13 -1
  41. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +28 -0
  42. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +47 -0
  43. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +51 -0
  44. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/toolbar/method.js +33 -0
  45. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/toolbar/ui.js +29 -0
  46. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +28 -0
  47. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +9 -1
  48. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +148 -134
  49. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +18 -0
  50. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +30 -3
  51. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +9 -0
  52. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +52 -4
  53. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +2 -1
  54. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +36 -3
  55. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
  56. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +9 -1
  57. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +15 -4
  58. data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +1 -6
  59. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +4 -2
  60. data/lib/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +7 -0
  61. data/lib/frameworks/sproutcore/frameworks/desktop/views/well.js +1 -2
  62. data/lib/frameworks/sproutcore/frameworks/forms/views/form.js +3 -1
  63. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +1 -1
  64. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +0 -9
  65. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  66. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +2 -0
  67. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
  68. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +25 -1
  69. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +64 -0
  70. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +34 -27
  71. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +42 -0
  72. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +62 -0
  73. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +0 -8
  74. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +12 -0
  75. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +48 -1
  76. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +19 -0
  77. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +2 -0
  78. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +11 -5
  79. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +152 -74
  80. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +12 -9
  81. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +1476 -176
  82. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +0 -2
  83. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +227 -32
  84. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +11 -11
  85. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +1 -1
  86. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +10 -0
  87. data/lib/frameworks/sproutcore/lib/index.rhtml +30 -8
  88. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/18px/segmented.css +4 -4
  89. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented.css +4 -4
  90. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented.css +4 -4
  91. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/44px/segmented.css +4 -4
  92. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/segmented.css +4 -0
  93. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.css +5 -1
  94. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.js +11 -3
  95. data/lib/frameworks/sproutcore/themes/ace/resources/well/well.css +7 -8
  96. data/lib/frameworks/sproutcore/themes/ace/resources/well/well.js +2 -4
  97. data/lib/gen/app/templates/apps/@target_name@/Buildfile +14 -0
  98. data/lib/gen/app/templates/apps/@target_name@/theme.js +27 -0
  99. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +4 -0
  100. data/lib/gen/project/templates/@filename@/Buildfile +7 -2
  101. data/lib/gen/theme/templates/themes/@target_name@/Buildfile +3 -0
  102. data/lib/gen/theme/templates/themes/@target_name@/theme.js +23 -0
  103. data/lib/sproutcore/builders.rb +2 -0
  104. data/lib/sproutcore/builders/chance.rb +64 -0
  105. data/lib/sproutcore/builders/chance_file.rb +59 -0
  106. data/lib/sproutcore/builders/combine.rb +0 -45
  107. data/lib/sproutcore/builders/html.rb +1 -1
  108. data/lib/sproutcore/builders/minify.rb +5 -17
  109. data/lib/sproutcore/builders/module.rb +2 -2
  110. data/lib/sproutcore/builders/string_wrapper.rb +13 -15
  111. data/lib/sproutcore/helpers.rb +1 -1
  112. data/lib/sproutcore/helpers/minifier.rb +56 -0
  113. data/lib/sproutcore/helpers/static_helper.rb +86 -40
  114. data/lib/sproutcore/models/generator.rb +16 -0
  115. data/lib/sproutcore/models/manifest_entry.rb +8 -1
  116. data/lib/sproutcore/models/target.rb +101 -33
  117. data/lib/sproutcore/tools.rb +0 -7
  118. data/lib/sproutcore/tools/build.rb +2 -37
  119. data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +100 -0
  120. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +86 -9
  121. data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +1 -1
  122. data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +1 -1
  123. data/spec/buildtasks/manifest/prepare_build_tasks/module_info_spec.rb +96 -0
  124. data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +83 -0
  125. data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +37 -4
  126. data/spec/buildtasks/manifest/spec_helper.rb +4 -0
  127. data/spec/fixtures/builder_tests/Buildfile +11 -9
  128. data/spec/fixtures/builder_tests/apps/chance_test/Buildfile +14 -0
  129. data/spec/fixtures/builder_tests/apps/chance_test/core.js +27 -0
  130. data/spec/fixtures/builder_tests/apps/chance_test/main.js +30 -0
  131. data/spec/fixtures/builder_tests/apps/chance_test/resources/demo.css +6 -0
  132. data/spec/fixtures/builder_tests/apps/chance_test/resources/last_file.css +7 -0
  133. data/spec/fixtures/builder_tests/apps/chance_test/resources/loading.rhtml +9 -0
  134. data/spec/fixtures/builder_tests/apps/chance_test/resources/main_page.js +24 -0
  135. data/spec/fixtures/builder_tests/apps/chance_test/resources/z_first_file.css +6 -0
  136. data/spec/fixtures/builder_tests/apps/chance_test/theme.js +27 -0
  137. data/spec/fixtures/builder_tests/apps/module_test/module.js +1 -0
  138. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/english.lproj/req_style_2.css +0 -0
  139. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/english.lproj/test.rhtml +1 -0
  140. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/javascript.js +1 -0
  141. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/lib/alt_layout.rhtml +0 -0
  142. data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/req_js_2.js +0 -0
  143. data/spec/fixtures/builder_tests/apps/module_test/modules/dynamic_req_target_1/dynamic_req_js_1.js +0 -0
  144. data/spec/fixtures/builder_tests/apps/module_test/modules/dynamic_req_target_1/english.lproj/dynamic_req_style_1.css +0 -0
  145. data/spec/fixtures/builder_tests/apps/module_test/modules/inlined_module/README +0 -0
  146. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/req_style_1.css +0 -0
  147. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/strings.js +4 -0
  148. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/test.rhtml +1 -0
  149. data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/req_js_1.js +0 -0
  150. data/spec/fixtures/helper_tests/apps/minifier_test/core.js +8 -0
  151. data/spec/fixtures/real_world/Buildfile +11 -1
  152. data/spec/fixtures/real_world/apps/account/modules/preferences/README +0 -0
  153. data/spec/fixtures/real_world/apps/calendar/modules/preferences/README +0 -0
  154. data/spec/fixtures/real_world/apps/contacts/modules/preferences/README +0 -0
  155. data/spec/fixtures/real_world/apps/contacts/modules/printing/README +0 -0
  156. data/spec/fixtures/real_world/apps/mail/modules/preferences/README +0 -0
  157. data/spec/fixtures/real_world/apps/mail/modules/printing/README +0 -0
  158. data/spec/fixtures/real_world/apps/photos/modules/email/README +0 -0
  159. data/spec/fixtures/real_world/apps/photos/modules/preferences/README +0 -0
  160. data/spec/lib/builders/chance_file_spec.rb +63 -0
  161. data/spec/lib/builders/chance_spec.rb +81 -0
  162. data/spec/lib/builders/module_spec.rb +133 -0
  163. data/spec/lib/helpers/minifier.rb +31 -0
  164. data/spec/lib/models/project/find_targets_for_spec.rb +1 -1
  165. data/vendor/chance/lib/chance/imagers/data_url.rb +68 -17
  166. data/vendor/chance/lib/chance/instance.rb +55 -30
  167. data/vendor/chance/lib/chance/parser.rb +1 -1
  168. data/vendor/chance/lib/chance/slicing.rb +39 -3
  169. metadata +52 -7
  170. data/lib/frameworks/sproutcore/frameworks/foundation/system/logger.js +0 -163
  171. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/logger.js +0 -44
  172. data/spec/buildtasks/manifest/prepare_build_tasks/bundle_spec.rb +0 -254
  173. data/spec/fixtures/builder_tests/apps/bundle_test/bundle.js +0 -1
  174. data/spec/lib/builders/bundle_spec.rb +0 -295
@@ -117,7 +117,7 @@ module SC
117
117
  $to_html5_manifest_networks = CONFIG[:html5_manifest_networks]
118
118
  @content_for_html5_manifest = true
119
119
  end
120
- $to_minify << dst_path
120
+
121
121
  writelines dst_path, [self.render]
122
122
 
123
123
  end
@@ -54,24 +54,12 @@ module SC
54
54
 
55
55
  # Minify some javascript by invoking the YUI compressor.
56
56
  def build_javascript(dst_path)
57
- a = Regexp.new('^'+MANIFEST.build_root)
58
- if dst_path =~ a
59
- # $to_minify << dst_path
60
- FileUtils.mkdir_p(File.dirname(dst_path))
61
- FileUtils.copy(entry.source_path, dst_path)
57
+ entry.source_entry.build!
58
+ # Minify module JavaScript immediately so it can be string-wrapped
59
+ if entry.target[:target_type] == :module
60
+ SC::Helpers::Minifier.minify! dst_path
62
61
  else
63
- FileUtils.mkdir_p(File.dirname(dst_path)) # make sure loc exists...
64
- filecompress = "java -Xmx128m -jar \"" + SC.yui_jar + "\" --js \"" + entry.source_path + "\" --js_output_file \"" + dst_path + "\" 2>&1"
65
- SC.logger.info 'Compiling with YUI: '+ filecompress + "..."
66
-
67
- output = `#{filecompress}` # It'd be nice to just read STDERR, but
68
- # I can't find a reasonable, commonly-
69
- # installed, works-on-all-OSes solution.
70
- if $?.exitstatus != 0
71
- _report_error(output, entry.filename, entry.source_path)
72
- SC.logger.fatal("!!!!YUI compiler failed, please check that your js code is valid")
73
- SC.logger.fatal("!!!!Failed compiling ... "+ dst_path)
74
- end
62
+ SC::Helpers::Minifier << dst_path
75
63
  end
76
64
  end
77
65
 
@@ -53,7 +53,7 @@ module SC
53
53
  next if not string_entry
54
54
  string_url = string_entry.cacheable_url
55
55
 
56
- module_info = t.module_info({ :debug => entry[:debug], :test => entry[:test], :theme => entry[:theme], :variation => entry[:variation] })
56
+ module_info = t.module_info({ :variation => entry[:variation] })
57
57
 
58
58
  output << eruby.evaluate({
59
59
  :target_name => t[:target_name].to_s.sub(/^\//,''),
@@ -61,7 +61,7 @@ module SC
61
61
  :styles => module_info[:css_urls].map{ |url| "'#{url}'" },
62
62
  :script => script_url,
63
63
  :string => string_url,
64
- :prefetched => t[:prefetched]
64
+ :prefetched => t[:prefetched_module]
65
65
  })
66
66
  end
67
67
  writelines dst_path, [output]
@@ -15,27 +15,25 @@ module SC
15
15
  class Builder::StringWrapper < Builder::Base
16
16
 
17
17
  def build(dst_path)
18
- entries = entry[:source_entries]
18
+ src_path = entry.source_entry[:build_path]
19
+ entry.source_entry.build!
19
20
 
20
- entries.each do |entry|
21
- src_path = entry.stage![:staging_path]
22
- return if not File.exist? src_path
21
+ return if not File.exist? src_path
23
22
 
24
- # Normalize the target name by removing any initial forward slash
25
- target = entry.target
26
- target_name = target[:target_name].to_s.sub(/^\//,'')
23
+ # Normalize the target name by removing any initial forward slash
24
+ target = entry.target
25
+ target_name = target[:target_name].to_s.sub(/^\//,'')
27
26
 
28
- # Set the source property of the module's SC.MODULE_INFO hash to the
29
- # JSON-escaped contents of the file.
30
- output = "SC.MODULE_INFO['#{target_name}'].source = "
27
+ # Set the source property of the module's SC.MODULE_INFO hash to the
28
+ # JSON-escaped contents of the file.
29
+ output = "SC.MODULE_INFO['#{target_name}'].source = "
31
30
 
32
- content = readlines(src_path)
33
- output += content.join.to_json
31
+ content = readlines(src_path)
32
+ output += content.join.to_json
34
33
 
35
- output += ";"
34
+ output += ";"
36
35
 
37
- writeline dst_path, output
38
- end
36
+ writeline dst_path, output
39
37
  end
40
38
 
41
39
  end
@@ -7,5 +7,5 @@ require "sproutcore/helpers/packed_optimizer"
7
7
  require "sproutcore/helpers/static_helper"
8
8
  require "sproutcore/helpers/tag_helper"
9
9
  require "sproutcore/helpers/text_helper"
10
-
10
+ require "sproutcore/helpers/minifier"
11
11
 
@@ -0,0 +1,56 @@
1
+ module SC::Helpers
2
+
3
+ # Helper to minify JavaScript files. You can either call the class method
4
+ # minify!, or add paths using <<, then call minify_queue! to minify all files
5
+ # at once (which improves performance significantly.)
6
+
7
+ class Minifier
8
+ @@queue = []
9
+
10
+ def self.<<(item)
11
+ @@queue << item
12
+ end
13
+
14
+ def self.queue
15
+ @@queue
16
+ end
17
+
18
+ # Minifies a path or an array of paths
19
+ def self.minify!(paths)
20
+ yui_root = File.expand_path("../../../../vendor/sproutcore", __FILE__)
21
+ jar_path = File.join(yui_root, 'SCCompiler.jar')
22
+
23
+ # Convert to string if an array
24
+ if paths.respond_to? :join
25
+ paths = paths * "\" \""
26
+ end
27
+
28
+ if SC.env[:yui_minification]
29
+ command = "java -Xmx256m -jar \"" + jar_path + "\" -yuionly \"" + paths + "\" 2>&1"
30
+ else
31
+ command = "java -Xmx256m -jar \"" + jar_path + "\" \"" + paths + "\" 2>&1"
32
+ end
33
+
34
+ SC.logger.info 'Minifying...'
35
+ SC.logger.info command
36
+
37
+ output = `#{command}` # It'd be nice to just read STDERR, but
38
+ # I can't find a reasonable, commonly-
39
+ # installed, works-on-all-OSes solution.
40
+ SC.logger.info output
41
+ if $?.exitstatus != 0
42
+ SC.logger.fatal(output)
43
+ SC.logger.fatal("!!!! Minifying failed, please check that your js code is valid")
44
+ SC.logger.fatal("!!!! Failed compiling ... " + paths)
45
+ exit(1)
46
+ end
47
+ end
48
+
49
+ # Minimizes the files in the queue, then empties the queue
50
+ def self.minify_queue!
51
+ SC::Helpers::Minifier.minify! @@queue
52
+ @@queue = []
53
+ end
54
+
55
+ end
56
+ end
@@ -19,28 +19,65 @@ module SC
19
19
  # client will be used.
20
20
  #
21
21
  # bundle_name = the name of the bundle to render or nil to use the
22
- # current :language => the language to render. defaults to current
23
- # language
22
+ # current
23
+ #
24
+ # :language => the language to render. defaults to current language
25
+ # :x2 => if true, returns URLs for 2x stylesheets.
24
26
  #
25
27
  def stylesheets_for_client(target_name = nil, opts = nil)
26
28
 
29
+ urls = stylesheet_urls_for_client(target_name, opts)
30
+
27
31
  # normalize params
28
32
  if target_name.kind_of?(Hash) && opts.nil?
29
33
  opts = target_name
30
34
  target_name = nil
31
35
  end
32
36
  opts = {} if opts.nil?
37
+
38
+ # process options
39
+ include_method = opts[:include_method] ||= :link
40
+
41
+ # Convert to HTML and return
42
+ urls = urls.map do |url|
43
+ if include_method == :import
44
+ %( @import url('#{url}');)
45
+ else
46
+ %( <link href="#{url}" rel="stylesheet" type="text/css" />)
47
+ end
48
+ end
33
49
 
50
+ # if include style is @import, surround with style tags
51
+ if include_method == :import
52
+ %(<style type="text/css">\n#{urls * "\n"}</style>)
53
+ else
54
+ urls.join("\n")
55
+ end
56
+ end
57
+
58
+ # This method will return the urls of all the stylesheets
59
+ # required by the named bundle.
60
+ def stylesheet_urls_for_client(target_name = nil, opts = nil)
61
+
62
+ # normalize params
63
+ if target_name.kind_of?(Hash) && opts.nil?
64
+ opts = target_name
65
+ target_name = nil
66
+ end
67
+ opts = {} if opts.nil?
68
+
34
69
  # process options
35
70
  include_method = opts[:include_method] ||= :link
36
71
  t = target_name ? target.target_for(target_name) : target
37
72
 
73
+ # figure out stylesheet name (whether it is x2 or not)
74
+ name = "stylesheet"
75
+ name += "@2x" if opts[:x2]
76
+
38
77
  # collect urls from entries
39
78
  urls = []
40
79
  combine_stylesheets = t.config[:combine_stylesheets]
41
- combined_entries(t, opts, 'stylesheet.css', 'stylesheet-packed.css') do |cur_target, cur_entry|
42
-
43
- $to_minify << cur_entry[:build_path]
80
+ combined_entries(t, opts, name + '.css', name + '-packed.css') do |cur_target, cur_entry|
44
81
 
45
82
  # include either the entry URL or URL of ordered entries
46
83
  # depending on setup
@@ -49,26 +86,13 @@ module SC
49
86
  else
50
87
  urls += cur_entry[:ordered_entries].map { |e| e.cacheable_url }
51
88
  end
52
-
89
+
53
90
  # add any stylesheet libs from the target
54
91
  urls += (cur_target.config[:stylesheet_libs] || [])
55
92
  end
56
-
57
- # Convert to HTML and return
58
- urls = urls.map do |url|
59
- if include_method == :import
60
- %( @import url('#{url}');)
61
- else
62
- %( <link href="#{url}" rel="stylesheet" type="text/css" />)
63
- end
64
- end
65
-
66
- # if include style is @import, surround with style tags
67
- if include_method == :import
68
- %(<style type="text/css">\n#{urls * "\n"}</style>)
69
- else
70
- urls.join("\n")
71
- end
93
+
94
+ urls
95
+
72
96
  end
73
97
 
74
98
  # This method will return the HTML to link to all the javascripts
@@ -80,6 +104,26 @@ module SC
80
104
  #
81
105
  def javascripts_for_client(target_name = nil, opts = {})
82
106
 
107
+ urls = javascript_urls_for_client(target_name, opts)
108
+
109
+ # Convert to HTML and return
110
+ urls = urls.map do |url|
111
+ %( <script type="text/javascript" src="#{url}"></script>)
112
+ end
113
+
114
+ # Add preferred language definition, before other scripts...
115
+ urls.insert(0, %(<script type="text/javascript">String.preferredLanguage = "#{language}";</script>))
116
+
117
+ urls.join("\n")
118
+ end
119
+
120
+ # This method will return an array of all the javascripts
121
+ # required by the client.
122
+ #
123
+ # client_name = the name of the client to render or nil to use the
124
+ # current :language => the language to render. defaults to @language.
125
+ #
126
+ def javascript_urls_for_client(target_name = nil, opts = {})
83
127
  # normalize params
84
128
  if target_name.kind_of?(Hash) && opts.nil?
85
129
  opts = target_name
@@ -95,9 +139,6 @@ module SC
95
139
  combine_javascript = t.config[:combine_javascript]
96
140
 
97
141
  combined_entries(t, opts, 'javascript.js', 'javascript-packed.js') do |cur_target, cur_entry|
98
-
99
- $to_minify << cur_entry[:build_path]
100
-
101
142
  # include either the entry URL or URL of ordered entries
102
143
  # depending on setup
103
144
  if cur_target.config[:combine_javascript]
@@ -109,16 +150,9 @@ module SC
109
150
  # add any stylesheet libs from the target
110
151
  urls += (cur_target.config[:javascript_libs] || [])
111
152
  end
112
-
113
- # Convert to HTML and return
114
- urls = urls.map do |url|
115
- %( <script type="text/javascript" src="#{url}"></script>)
116
- end
117
-
118
- # Add preferred language definition, before other scripts...
119
- urls.insert(0, %(<script type="text/javascript">String.preferredLanguage = "#{language}";</script>))
120
-
121
- urls.join("\n")
153
+
154
+ urls
155
+
122
156
  end
123
157
 
124
158
  # Detects and includes any bootstrap code
@@ -272,11 +306,11 @@ module SC
272
306
  # theme framework, if set.
273
307
  def theme_name(opts ={})
274
308
  ret = opts[:default] || 'sc-theme'
275
- if target.config[:css_theme]
276
- ret = target.config[:css_theme]
309
+ if target.config[:theme_name]
310
+ ret = target.config[:theme_name]
277
311
  elsif target.config[:theme]
278
312
  if theme_target = target.target_for(target.config[:theme])
279
- ret = theme_target.config[:css_theme] || ret
313
+ ret = theme_target.config[:theme_name] || ret
280
314
  end
281
315
  end
282
316
  return ret
@@ -361,7 +395,13 @@ module SC
361
395
 
362
396
  # get the stylesheet or js entry for it...
363
397
  entry = cur_manifest.entry_for packed_entry_name
364
- next if entry.nil? || !entry.composite? # no stylesheet or js
398
+
399
+ # It used to be like this:
400
+ # next if entry.nil? || !entry.composite? # no stylesheet or js
401
+ # But the @2x css file is not composite. There does not seem to be
402
+ # a reason to check for composite entries, either. So, the composite
403
+ # check has been removed.
404
+ next if entry.nil? # no stylesheet or js
365
405
 
366
406
  yield(t, entry)
367
407
  end
@@ -372,7 +412,13 @@ module SC
372
412
 
373
413
  # get the stylesheet or js entry for it...
374
414
  entry = cur_manifest.entry_for entry_name
375
- next if entry.nil? || !entry.composite? # no stylesheet or js
415
+
416
+ # It used to be like this:
417
+ # next if entry.nil? || !entry.composite? # no stylesheet or js
418
+ # But the @2x css file is not composite. There does not seem to be
419
+ # a reason to check for composite entries, either. So, the composite
420
+ # check has been removed.
421
+ next if entry.nil? # no stylesheet or js
376
422
 
377
423
  yield(t, entry)
378
424
  end
@@ -51,6 +51,9 @@ module SC
51
51
  # namespace::
52
52
  # The classified version of the target name. example: "AddressBook"
53
53
  #
54
+ # css_name::
55
+ # The CSS class name version of the target name. example: 'address-book'
56
+ #
54
57
  # class_name::
55
58
  # The classified version of the filename. example: "Contact"
56
59
  #
@@ -405,17 +408,25 @@ module SC
405
408
  # snake_case("CNN") #=> "cnn"
406
409
  # snake_case("innerHTML") #=> "inner_html"
407
410
  # snake_case("Foo_Bar") #=> "foo_bar"
411
+ # snake_case("Foo-Bar") #=> "foo_bar"
408
412
  #
409
413
  # === Params
410
414
  #
411
415
  # str:: the string to snake case
412
416
  #
413
417
  def snake_case(str='')
418
+ str = str.gsub(/-/, '_')
414
419
  str = str.gsub(/([^A-Z_])([A-Z][^A-Z]?)/,'\1_\2') # most cases
415
420
  str = str.gsub(/([^_])([A-Z][^A-Z])/,'\1_\2') # HeadlineCNNNews
416
421
  str.downcase
417
422
  end
418
423
 
424
+ # Converts a string to CSS case. This method will accept CamelCase or snake case
425
+ # and normalize into a format that can be converted to CSS case.
426
+ def css_case(str='')
427
+ snake_case(str).gsub(/_/, '-')
428
+ end
429
+
419
430
  ABBREVIATIONS = %w(html css xml)
420
431
 
421
432
  # Converts a string to CamelCase. If you pass false for the second param
@@ -469,6 +480,11 @@ module SC
469
480
  self.namespace = camel_case(parts[0] || self.target_name)
470
481
  end
471
482
 
483
+ # css_name is first part css cased if defined
484
+ if (parts[0] || self.target_name) && self.css_name.nil?
485
+ self.css_name = css_case(parts[0] || self.target_name)
486
+ end
487
+
472
488
  # filename is second part snake_cased, unless already defined
473
489
  if parts[1] && self.filename.nil?
474
490
  self.filename = snake_case(parts[1])
@@ -145,9 +145,16 @@ module SC
145
145
  timestamps2.max
146
146
  end
147
147
  timestamps.max
148
- elsif composite?
149
148
 
149
+ elsif composite?
150
150
  self[:source_entries].map { |e| e.timestamp || 0 }.max || Time.now.to_i
151
+
152
+ elsif self[:timestamp]
153
+ # for certain entries, such as the Chance entry, we can't use composite entry
154
+ # but still need to have a timestamp to prevent caching. To do this, we allow
155
+ # the entry to specify the timestamp directly; it will calculate it on its own.
156
+ self[:timestamp]
157
+
151
158
  else
152
159
  File.exist?(self[:source_path]) ? File.mtime(self[:source_path]).to_i : 0
153
160
  end
@@ -160,7 +160,7 @@ module SC
160
160
  return ret unless ret.nil?
161
161
 
162
162
  # else compute return value, respecting options
163
- ret = [config[:required]]
163
+ ret = [config[:required], config[:inlined_modules]]
164
164
  if opts[:debug] && config[:debug_required]
165
165
  ret << config[:debug_required]
166
166
  end
@@ -192,16 +192,55 @@ module SC
192
192
  end
193
193
  ret = ret.compact.uniq
194
194
 
195
+ if self[:target_type].eql? :app
196
+ reqs = self.find_required_modules
197
+
198
+ if reqs.empty?
199
+ reqs = project.targets.values.select { |target| target[:target_type] == :module }
200
+
201
+ reqs = reqs.select do |target|
202
+ target[:target_name].match(/^\/?#{self[:target_name]}/)
203
+ end
204
+
205
+ ret = ret.concat(reqs)
206
+ end
207
+ end
208
+
195
209
  @required_targets[key] = ret
196
210
  return ret
197
211
  end
198
212
 
199
- # Returns all of the targets dynamically required by this target. This
200
- # will use the "deferred_modules" config, resolving the target names using
201
- # target_for().
213
+ # Returns the recursive list of required modules for this target.
214
+ #
215
+ # === Returns
216
+ # Array of targets
217
+ #
218
+ def find_required_modules(opts ={})
219
+ _find_required_modules(opts, [self])
220
+ end
221
+
222
+ def _find_required_modules(opts, seen)
223
+ ret = []
224
+ modules(opts).each do |target|
225
+ next if seen.include?(target)
226
+ seen << target # avoid loading again
227
+
228
+ # add required targets, if not already seend...
229
+ target._find_required_modules(opts, seen).each do |required|
230
+ ret << required
231
+ seen << required
232
+ end
233
+
234
+ # then add my own target...
235
+ ret << target
236
+ end
237
+ return ret.uniq.compact
238
+ end
239
+
240
+ # Returns all of the modules under this target. This
241
+ # will use the deferred_modules, prefetched_modules, and inlined_modules config
242
+ # options from the Buildfile.
202
243
  #
203
- # You may pass some additional options in which will select the set
204
- # of targets you want returned.
205
244
  #
206
245
  # === Options
207
246
  # :debug:: if true, config.debug_required will be included
@@ -218,41 +257,36 @@ module SC
218
257
  key = key.compact.join('.')
219
258
 
220
259
  # Return cache value if found
221
- ret = (@dynamic_targets ||= {})[key]
260
+ ret = (@modules ||= {})[key]
222
261
  return ret unless ret.nil?
223
262
 
224
- # Get the list of targets that should be treated as prefetched modules
225
- # from the Buildfile
263
+ # Get the list of targets that should be treated as prefetched, deferred
264
+ # or inline modules from the Buildfile
226
265
  prefetched_modules = config[:prefetched_modules]
266
+ deferred_modules = config[:deferred_modules]
267
+ inlined_modules = config[:inlined_modules]
268
+
269
+ # else compute return value, respecting options
270
+ ret = [deferred_modules, prefetched_modules, inlined_modules]
271
+ return [] if ret.compact.empty?
272
+
227
273
  if prefetched_modules
228
- # Go through each module and mark it as prefetched.
229
- # This way, we can later distinguish between deferred and prefetched
230
- # modules when generating the module_info.js file.
231
- prefetched_modules.each do |m|
232
- target = target_for(m)
233
- target[:prefetched] = true
234
- end
274
+ ret << find_dependencies_for_modules(prefetched_modules, opts, :prefetched_module)
235
275
  end
236
276
 
237
- # else compute return value, respecting options
238
- ret = [config[:deferred_modules], config[:prefetched_modules]]
277
+ if deferred_modules
278
+ ret << find_dependencies_for_modules(deferred_modules, opts, :deferred_module)
279
+ end
239
280
 
240
- if opts[:debug] && config[:debug_deferred_modules]
241
- ret << config[:debug_deferred_modules]
281
+ if inlined_modules
282
+ ret << find_dependencies_for_modules(inlined_modules, opts, :inlined_module)
242
283
  end
243
- if opts[:test] && config[:test_deferred_modules]
244
- ret << config[:test_deferred_modules]
284
+
285
+ if opts[:debug] && config[:debug_required]
286
+ ret << config[:debug_required]
245
287
  end
246
- if opts[:theme] && self.loads_theme? && config[:theme]
247
- # verify theme is a theme target type - note that if no matching
248
- # target is found, we'll just let this go through so the standard
249
- # not found warning can show.
250
- t = target_for(config[:theme])
251
- if t && t[:target_type] != :theme
252
- SC.logger.warn "Target #{config[:theme]} was set as theme for #{target_name} but it is not a theme."
253
- else
254
- ret << config[:theme]
255
- end
288
+ if opts[:test] && config[:test_required]
289
+ ret << config[:test_required]
256
290
  end
257
291
 
258
292
  ret = ret.flatten.compact.map do |n|
@@ -263,7 +297,32 @@ module SC
263
297
  end
264
298
  ret = ret.compact.uniq
265
299
 
266
- @dynamic_targets[key] = ret
300
+ @modules[key] = ret
301
+ return ret
302
+ end
303
+
304
+ # For each module in the modules array, set the 'type' property to true,
305
+ # and return an array of their dependencies, one level deep.
306
+ def find_dependencies_for_modules(modules, opts, type)
307
+ ret = []
308
+
309
+ modules.each do |m|
310
+ target = target_for(m)
311
+
312
+ if target == nil
313
+ SC.logger.warn "Could not find target #{m} that is required by #{self[:target_name]}"
314
+ return
315
+ end
316
+
317
+ target[type] = true
318
+
319
+ target.required_targets(opts).flatten.compact.each do |dependency|
320
+ if dependency[:target_type] == :module
321
+ ret << dependency[:target_name]
322
+ end
323
+ end
324
+ end
325
+
267
326
  return ret
268
327
  end
269
328
 
@@ -499,6 +558,15 @@ module SC
499
558
  if self[:target_type] == :app
500
559
  raise "module_info called on an app target"
501
560
  else
561
+
562
+ # Majd: I added this because modules shouldn't have the debug_required
563
+ # and test_required frameworks applied to them since a module shouldn't
564
+ # require a framework if the module is either deferred or prefetched
565
+ if self[:deferred_module] or self[:prefetched_module]
566
+ opts[:debug] = false
567
+ opts[:test] = false
568
+ end
569
+
502
570
  requires = required_targets(opts) # only go one-level deep!
503
571
 
504
572
  # Targets that aren't pre-loaded can't be packed together. That leaves