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.
- data/CHANGELOG +6 -0
- data/VERSION.yml +1 -1
- data/lib/Buildfile +1 -1
- data/lib/buildtasks/build.rake +14 -6
- data/lib/buildtasks/manifest.rake +171 -72
- data/lib/frameworks/sproutcore/Buildfile +3 -5
- data/lib/frameworks/sproutcore/CHANGELOG.md +9 -0
- data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.js +2 -1
- data/lib/frameworks/sproutcore/apps/test_controls/resources/progress_page.js +7 -17
- data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +7 -1
- data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +14 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +0 -2
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +14 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template/collection.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +6 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +49 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +8 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +46 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +32 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/checkbox.js +32 -6
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +31 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +15 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio.js +28 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +20 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/well.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +40 -34
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +35 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +43 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +47 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +6 -16
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +21 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +41 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +128 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +93 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +13 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +28 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +47 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +51 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/toolbar/method.js +33 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/toolbar/ui.js +29 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +28 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +9 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +148 -134
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +18 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +30 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +9 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +52 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +36 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +9 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +15 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +1 -6
- data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +4 -2
- data/lib/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/well.js +1 -2
- data/lib/frameworks/sproutcore/frameworks/forms/views/form.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +0 -9
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +25 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +64 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +34 -27
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +42 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +62 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +0 -8
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +12 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +48 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +19 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +11 -5
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +152 -74
- data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +12 -9
- data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +1476 -176
- data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +0 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +227 -32
- data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +11 -11
- data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +10 -0
- data/lib/frameworks/sproutcore/lib/index.rhtml +30 -8
- data/lib/frameworks/sproutcore/themes/ace/resources/segmented/18px/segmented.css +4 -4
- data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented.css +4 -4
- data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented.css +4 -4
- data/lib/frameworks/sproutcore/themes/ace/resources/segmented/44px/segmented.css +4 -4
- data/lib/frameworks/sproutcore/themes/ace/resources/segmented/segmented.css +4 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.css +5 -1
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.js +11 -3
- data/lib/frameworks/sproutcore/themes/ace/resources/well/well.css +7 -8
- data/lib/frameworks/sproutcore/themes/ace/resources/well/well.js +2 -4
- data/lib/gen/app/templates/apps/@target_name@/Buildfile +14 -0
- data/lib/gen/app/templates/apps/@target_name@/theme.js +27 -0
- data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +4 -0
- data/lib/gen/project/templates/@filename@/Buildfile +7 -2
- data/lib/gen/theme/templates/themes/@target_name@/Buildfile +3 -0
- data/lib/gen/theme/templates/themes/@target_name@/theme.js +23 -0
- data/lib/sproutcore/builders.rb +2 -0
- data/lib/sproutcore/builders/chance.rb +64 -0
- data/lib/sproutcore/builders/chance_file.rb +59 -0
- data/lib/sproutcore/builders/combine.rb +0 -45
- data/lib/sproutcore/builders/html.rb +1 -1
- data/lib/sproutcore/builders/minify.rb +5 -17
- data/lib/sproutcore/builders/module.rb +2 -2
- data/lib/sproutcore/builders/string_wrapper.rb +13 -15
- data/lib/sproutcore/helpers.rb +1 -1
- data/lib/sproutcore/helpers/minifier.rb +56 -0
- data/lib/sproutcore/helpers/static_helper.rb +86 -40
- data/lib/sproutcore/models/generator.rb +16 -0
- data/lib/sproutcore/models/manifest_entry.rb +8 -1
- data/lib/sproutcore/models/target.rb +101 -33
- data/lib/sproutcore/tools.rb +0 -7
- data/lib/sproutcore/tools/build.rb +2 -37
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +100 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +86 -9
- data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +1 -1
- data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +1 -1
- data/spec/buildtasks/manifest/prepare_build_tasks/module_info_spec.rb +96 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +83 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +37 -4
- data/spec/buildtasks/manifest/spec_helper.rb +4 -0
- data/spec/fixtures/builder_tests/Buildfile +11 -9
- data/spec/fixtures/builder_tests/apps/chance_test/Buildfile +14 -0
- data/spec/fixtures/builder_tests/apps/chance_test/core.js +27 -0
- data/spec/fixtures/builder_tests/apps/chance_test/main.js +30 -0
- data/spec/fixtures/builder_tests/apps/chance_test/resources/demo.css +6 -0
- data/spec/fixtures/builder_tests/apps/chance_test/resources/last_file.css +7 -0
- data/spec/fixtures/builder_tests/apps/chance_test/resources/loading.rhtml +9 -0
- data/spec/fixtures/builder_tests/apps/chance_test/resources/main_page.js +24 -0
- data/spec/fixtures/builder_tests/apps/chance_test/resources/z_first_file.css +6 -0
- data/spec/fixtures/builder_tests/apps/chance_test/theme.js +27 -0
- data/spec/fixtures/builder_tests/apps/module_test/module.js +1 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/english.lproj/req_style_2.css +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/english.lproj/test.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/javascript.js +1 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/lib/alt_layout.rhtml +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/deferred_module/req_js_2.js +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/dynamic_req_target_1/dynamic_req_js_1.js +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/dynamic_req_target_1/english.lproj/dynamic_req_style_1.css +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/inlined_module/README +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/req_style_1.css +0 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/strings.js +4 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/english.lproj/test.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_target/req_js_1.js +0 -0
- data/spec/fixtures/helper_tests/apps/minifier_test/core.js +8 -0
- data/spec/fixtures/real_world/Buildfile +11 -1
- data/spec/fixtures/real_world/apps/account/modules/preferences/README +0 -0
- data/spec/fixtures/real_world/apps/calendar/modules/preferences/README +0 -0
- data/spec/fixtures/real_world/apps/contacts/modules/preferences/README +0 -0
- data/spec/fixtures/real_world/apps/contacts/modules/printing/README +0 -0
- data/spec/fixtures/real_world/apps/mail/modules/preferences/README +0 -0
- data/spec/fixtures/real_world/apps/mail/modules/printing/README +0 -0
- data/spec/fixtures/real_world/apps/photos/modules/email/README +0 -0
- data/spec/fixtures/real_world/apps/photos/modules/preferences/README +0 -0
- data/spec/lib/builders/chance_file_spec.rb +63 -0
- data/spec/lib/builders/chance_spec.rb +81 -0
- data/spec/lib/builders/module_spec.rb +133 -0
- data/spec/lib/helpers/minifier.rb +31 -0
- data/spec/lib/models/project/find_targets_for_spec.rb +1 -1
- data/vendor/chance/lib/chance/imagers/data_url.rb +68 -17
- data/vendor/chance/lib/chance/instance.rb +55 -30
- data/vendor/chance/lib/chance/parser.rb +1 -1
- data/vendor/chance/lib/chance/slicing.rb +39 -3
- metadata +52 -7
- data/lib/frameworks/sproutcore/frameworks/foundation/system/logger.js +0 -163
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/logger.js +0 -44
- data/spec/buildtasks/manifest/prepare_build_tasks/bundle_spec.rb +0 -254
- data/spec/fixtures/builder_tests/apps/bundle_test/bundle.js +0 -1
- data/spec/lib/builders/bundle_spec.rb +0 -295
@@ -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
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
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({ :
|
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[:
|
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
|
-
|
18
|
+
src_path = entry.source_entry[:build_path]
|
19
|
+
entry.source_entry.build!
|
19
20
|
|
20
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
31
|
+
content = readlines(src_path)
|
32
|
+
output += content.join.to_json
|
34
33
|
|
35
|
-
|
34
|
+
output += ";"
|
36
35
|
|
37
|
-
|
38
|
-
end
|
36
|
+
writeline dst_path, output
|
39
37
|
end
|
40
38
|
|
41
39
|
end
|
data/lib/sproutcore/helpers.rb
CHANGED
@@ -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
|
23
|
-
#
|
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, '
|
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
|
-
|
58
|
-
|
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
|
-
|
114
|
-
|
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[:
|
276
|
-
ret = target.config[:
|
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[:
|
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
|
-
|
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
|
-
|
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
|
200
|
-
#
|
201
|
-
#
|
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 = (@
|
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
|
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
|
-
|
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
|
-
|
238
|
-
|
277
|
+
if deferred_modules
|
278
|
+
ret << find_dependencies_for_modules(deferred_modules, opts, :deferred_module)
|
279
|
+
end
|
239
280
|
|
240
|
-
if
|
241
|
-
ret <<
|
281
|
+
if inlined_modules
|
282
|
+
ret << find_dependencies_for_modules(inlined_modules, opts, :inlined_module)
|
242
283
|
end
|
243
|
-
|
244
|
-
|
284
|
+
|
285
|
+
if opts[:debug] && config[:debug_required]
|
286
|
+
ret << config[:debug_required]
|
245
287
|
end
|
246
|
-
if opts[:
|
247
|
-
|
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
|
-
@
|
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
|