sproutit-sproutcore 1.0.0.20090407205609

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 (382) hide show
  1. data/Buildfile +115 -0
  2. data/History.txt +7 -0
  3. data/README.txt +102 -0
  4. data/Rakefile +54 -0
  5. data/Todo.txt +1 -0
  6. data/bin/sc-build +13 -0
  7. data/bin/sc-build-number +13 -0
  8. data/bin/sc-gen +13 -0
  9. data/bin/sc-init +13 -0
  10. data/bin/sc-manifest +13 -0
  11. data/bin/sc-server +13 -0
  12. data/bin/sproutcore +14 -0
  13. data/buildtasks/build.rake +73 -0
  14. data/buildtasks/entry.rake +59 -0
  15. data/buildtasks/manifest.rake +469 -0
  16. data/buildtasks/render.rake +21 -0
  17. data/buildtasks/target.rake +42 -0
  18. data/gen/Buildfile +16 -0
  19. data/gen/app/Buildfile +36 -0
  20. data/gen/app/README +1 -0
  21. data/gen/app/USAGE +13 -0
  22. data/gen/app/templates/apps/{target_name}/core.js +27 -0
  23. data/gen/app/templates/apps/{target_name}/english.lproj/loading.rhtml +9 -0
  24. data/gen/app/templates/apps/{target_name}/english.lproj/main_page.js +22 -0
  25. data/gen/app/templates/apps/{target_name}/english.lproj/strings.js +15 -0
  26. data/gen/app/templates/apps/{target_name}/main.js +30 -0
  27. data/gen/controller/Buildfile +18 -0
  28. data/gen/controller/README +1 -0
  29. data/gen/controller/USAGE +13 -0
  30. data/gen/controller/templates/controllers/{filename}.js +18 -0
  31. data/gen/controller/templates/tests/controllers/{filename}.js +15 -0
  32. data/gen/framework/Buildfile +36 -0
  33. data/gen/framework/README +1 -0
  34. data/gen/framework/USAGE +13 -0
  35. data/gen/framework/templates/frameworks/{target_name}/core.js +21 -0
  36. data/gen/framework/templates/frameworks/{target_name}/english.lproj/strings.js +15 -0
  37. data/gen/language/Buildfile +26 -0
  38. data/gen/language/README +1 -0
  39. data/gen/language/USAGE +13 -0
  40. data/gen/language/templates/{filename}/strings.js +14 -0
  41. data/gen/model/Buildfile +16 -0
  42. data/gen/model/README +1 -0
  43. data/gen/model/USAGE +15 -0
  44. data/gen/model/templates/fixtures/{filename}.js +35 -0
  45. data/gen/model/templates/models/{filename}.js +19 -0
  46. data/gen/model/templates/tests/models/{filename}.js +15 -0
  47. data/gen/project/Buildfile +45 -0
  48. data/gen/project/INIT +3 -0
  49. data/gen/project/README +1 -0
  50. data/gen/project/USAGE +2 -0
  51. data/gen/project/templates/{filename}/Buildfile +7 -0
  52. data/gen/project/templates/{filename}/README +7 -0
  53. data/gen/test/Buildfile +25 -0
  54. data/gen/test/README +1 -0
  55. data/gen/test/USAGE +12 -0
  56. data/gen/test/templates/tests/{filename}.js +15 -0
  57. data/gen/theme/Buildfile +36 -0
  58. data/gen/theme/README +1 -0
  59. data/gen/theme/USAGE +13 -0
  60. data/gen/theme/templates/themes/{target_name}/english.lproj/strings.js +15 -0
  61. data/gen/view/Buildfile +18 -0
  62. data/gen/view/README +1 -0
  63. data/gen/view/USAGE +13 -0
  64. data/gen/view/templates/tests/views/{filename}.js +15 -0
  65. data/gen/view/templates/views/{filename}.js +18 -0
  66. data/lib/sproutcore.rb +130 -0
  67. data/lib/sproutcore/builders/base.rb +79 -0
  68. data/lib/sproutcore/builders/combine.rb +37 -0
  69. data/lib/sproutcore/builders/html.rb +177 -0
  70. data/lib/sproutcore/builders/javascript.rb +55 -0
  71. data/lib/sproutcore/builders/minify.rb +67 -0
  72. data/lib/sproutcore/builders/sass.rb +55 -0
  73. data/lib/sproutcore/builders/strings.rb +44 -0
  74. data/lib/sproutcore/builders/stylesheet.rb +40 -0
  75. data/lib/sproutcore/builders/test.rb +58 -0
  76. data/lib/sproutcore/builders/test_index.rb +26 -0
  77. data/lib/sproutcore/buildfile.rb +483 -0
  78. data/lib/sproutcore/buildfile/build_task.rb +33 -0
  79. data/lib/sproutcore/buildfile/buildfile_dsl.rb +162 -0
  80. data/lib/sproutcore/buildfile/cloneable.rb +34 -0
  81. data/lib/sproutcore/buildfile/early_time.rb +29 -0
  82. data/lib/sproutcore/buildfile/invocation_chain.rb +64 -0
  83. data/lib/sproutcore/buildfile/namespace.rb +33 -0
  84. data/lib/sproutcore/buildfile/string_ext.rb +198 -0
  85. data/lib/sproutcore/buildfile/task.rb +304 -0
  86. data/lib/sproutcore/buildfile/task_arguments.rb +86 -0
  87. data/lib/sproutcore/buildfile/task_manager.rb +193 -0
  88. data/lib/sproutcore/deprecated/view_helper.rb +662 -0
  89. data/lib/sproutcore/helpers/capture_helper.rb +30 -0
  90. data/lib/sproutcore/helpers/cssmin.rb +202 -0
  91. data/lib/sproutcore/helpers/dom_id_helper.rb +21 -0
  92. data/lib/sproutcore/helpers/entry_sorter.rb +105 -0
  93. data/lib/sproutcore/helpers/packed_optimizer.rb +102 -0
  94. data/lib/sproutcore/helpers/static_helper.rb +268 -0
  95. data/lib/sproutcore/helpers/tag_helper.rb +117 -0
  96. data/lib/sproutcore/helpers/text_helper.rb +303 -0
  97. data/lib/sproutcore/models/generator.rb +493 -0
  98. data/lib/sproutcore/models/hash_struct.rb +109 -0
  99. data/lib/sproutcore/models/manifest.rb +342 -0
  100. data/lib/sproutcore/models/manifest_entry.rb +232 -0
  101. data/lib/sproutcore/models/project.rb +270 -0
  102. data/lib/sproutcore/models/target.rb +403 -0
  103. data/lib/sproutcore/rack/builder.rb +269 -0
  104. data/lib/sproutcore/rack/dev.rb +51 -0
  105. data/lib/sproutcore/rack/docs.rb +24 -0
  106. data/lib/sproutcore/rack/proxy.rb +92 -0
  107. data/lib/sproutcore/rack/service.rb +141 -0
  108. data/lib/sproutcore/rack/test_runner.rb +24 -0
  109. data/lib/sproutcore/render_engines/erubis.rb +55 -0
  110. data/lib/sproutcore/render_engines/haml.rb +39 -0
  111. data/lib/sproutcore/tools.rb +311 -0
  112. data/lib/sproutcore/tools/build.rb +80 -0
  113. data/lib/sproutcore/tools/build_number.rb +23 -0
  114. data/lib/sproutcore/tools/gen.rb +99 -0
  115. data/lib/sproutcore/tools/init.rb +40 -0
  116. data/lib/sproutcore/tools/manifest.rb +84 -0
  117. data/lib/sproutcore/tools/server.rb +45 -0
  118. data/spec/buildtasks/build/copy_spec.rb +60 -0
  119. data/spec/buildtasks/build/spec_helper.rb +36 -0
  120. data/spec/buildtasks/manifest/catalog_spec.rb +48 -0
  121. data/spec/buildtasks/manifest/hide_buildfiles_spec.rb +125 -0
  122. data/spec/buildtasks/manifest/localize_spec.rb +97 -0
  123. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +246 -0
  124. data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +87 -0
  125. data/spec/buildtasks/manifest/prepare_build_tasks/html_spec.rb +175 -0
  126. data/spec/buildtasks/manifest/prepare_build_tasks/javascript_spec.rb +65 -0
  127. data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +70 -0
  128. data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +152 -0
  129. data/spec/buildtasks/manifest/prepare_build_tasks/sass_spec.rb +98 -0
  130. data/spec/buildtasks/manifest/prepare_build_tasks/strings_spec.rb +64 -0
  131. data/spec/buildtasks/manifest/prepare_build_tasks/tests_spec.rb +163 -0
  132. data/spec/buildtasks/manifest/prepare_spec.rb +43 -0
  133. data/spec/buildtasks/manifest/spec_helper.rb +35 -0
  134. data/spec/buildtasks/target_spec.rb +214 -0
  135. data/spec/fixtures/builder_tests/Buildfile +15 -0
  136. data/spec/fixtures/builder_tests/apps/combine_test/a.js +1 -0
  137. data/spec/fixtures/builder_tests/apps/combine_test/b.js +1 -0
  138. data/spec/fixtures/builder_tests/apps/combine_test/c.js +1 -0
  139. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +1 -0
  140. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +1 -0
  141. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +1 -0
  142. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +2 -0
  143. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +1 -0
  144. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
  145. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
  146. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +1 -0
  147. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +4 -0
  148. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
  149. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
  150. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +4 -0
  151. data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +1 -0
  152. data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
  153. data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +15 -0
  154. data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +4 -0
  155. data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +7 -0
  156. data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +3 -0
  157. data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +8 -0
  158. data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +9 -0
  159. data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +12 -0
  160. data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +1 -0
  161. data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +3 -0
  162. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +1 -0
  163. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +1 -0
  164. data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +4 -0
  165. data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
  166. data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
  167. data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
  168. data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
  169. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
  170. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +4 -0
  171. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +1 -0
  172. data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
  173. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
  174. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +1 -0
  175. data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +1 -0
  176. data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
  177. data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
  178. data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +1 -0
  179. data/spec/fixtures/buildfiles/basic/Buildfile +16 -0
  180. data/spec/fixtures/buildfiles/basic/task_module.rake +6 -0
  181. data/spec/fixtures/buildfiles/installed/Buildfile +7 -0
  182. data/spec/fixtures/buildfiles/installed/Buildfile2 +5 -0
  183. data/spec/fixtures/buildfiles/project_test/Buildfile +4 -0
  184. data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +2 -0
  185. data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
  186. data/spec/fixtures/entry_for_project/Buildfile +1 -0
  187. data/spec/fixtures/entry_for_project/apps/test_app/entry.txt +0 -0
  188. data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
  189. data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
  190. data/spec/fixtures/find_targets/custom/Buildfile +8 -0
  191. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
  192. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
  193. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
  194. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
  195. data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +5 -0
  196. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
  197. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
  198. data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
  199. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
  200. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
  201. data/spec/fixtures/find_targets/nested/Buildfile +8 -0
  202. data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +1 -0
  203. data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
  204. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
  205. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
  206. data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
  207. data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
  208. data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
  209. data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
  210. data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
  211. data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
  212. data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
  213. data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
  214. data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
  215. data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
  216. data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
  217. data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
  218. data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
  219. data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
  220. data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
  221. data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
  222. data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
  223. data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
  224. data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
  225. data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
  226. data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
  227. data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
  228. data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
  229. data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
  230. data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
  231. data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
  232. data/spec/fixtures/ordered_entries/apps/no_requires/1.js +1 -0
  233. data/spec/fixtures/ordered_entries/apps/no_requires/B.js +1 -0
  234. data/spec/fixtures/ordered_entries/apps/no_requires/a.js +1 -0
  235. data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +1 -0
  236. data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +1 -0
  237. data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +1 -0
  238. data/spec/fixtures/ordered_entries/apps/no_requires/c.js +1 -0
  239. data/spec/fixtures/ordered_entries/apps/no_requires/core.js +1 -0
  240. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
  241. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
  242. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
  243. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
  244. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
  245. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
  246. data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +1 -0
  247. data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +1 -0
  248. data/spec/fixtures/ordered_entries/apps/with_requires/a.js +2 -0
  249. data/spec/fixtures/ordered_entries/apps/with_requires/b.js +3 -0
  250. data/spec/fixtures/ordered_entries/apps/with_requires/c.js +2 -0
  251. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +2 -0
  252. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +2 -0
  253. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +2 -0
  254. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +1 -0
  255. data/spec/fixtures/real_world/Buildfile +12 -0
  256. data/spec/fixtures/real_world/apps/account/README +1 -0
  257. data/spec/fixtures/real_world/apps/calendar/README +1 -0
  258. data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +1 -0
  259. data/spec/fixtures/real_world/apps/files/README +1 -0
  260. data/spec/fixtures/real_world/apps/mail/README +1 -0
  261. data/spec/fixtures/real_world/apps/mobile_photos/README +1 -0
  262. data/spec/fixtures/real_world/apps/photos/README +1 -0
  263. data/spec/fixtures/real_world/apps/uploader/README +1 -0
  264. data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
  265. data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
  266. data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
  267. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +26 -0
  268. data/spec/fixtures/real_world/frameworks/sproutcore/README +1 -0
  269. data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
  270. data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
  271. data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
  272. data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
  273. data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
  274. data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
  275. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
  276. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +4 -0
  277. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +1 -0
  278. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
  279. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
  280. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +1 -0
  281. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
  282. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
  283. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +4 -0
  284. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +1 -0
  285. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +1 -0
  286. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
  287. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +6 -0
  288. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +3 -0
  289. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +1 -0
  290. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
  291. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +1 -0
  292. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
  293. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
  294. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
  295. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
  296. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
  297. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
  298. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
  299. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
  300. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
  301. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
  302. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
  303. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
  304. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +1 -0
  305. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
  306. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
  307. data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +4 -0
  308. data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +1 -0
  309. data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +1 -0
  310. data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
  311. data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +6 -0
  312. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
  313. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
  314. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
  315. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +1 -0
  316. data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
  317. data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +1 -0
  318. data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
  319. data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +1 -0
  320. data/spec/fixtures/recursive_project/Buildfile +8 -0
  321. data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
  322. data/spec/lib/builders/combine_spec.rb +67 -0
  323. data/spec/lib/builders/html_spec.rb +577 -0
  324. data/spec/lib/builders/javascript_spec.rb +81 -0
  325. data/spec/lib/builders/sass_spec.rb +43 -0
  326. data/spec/lib/builders/spec_helper.rb +30 -0
  327. data/spec/lib/builders/strings_spec.rb +52 -0
  328. data/spec/lib/builders/stylesheet_spec.rb +63 -0
  329. data/spec/lib/builders/test_index_spec.rb +44 -0
  330. data/spec/lib/builders/test_spec.rb +135 -0
  331. data/spec/lib/buildfile/config_for_spec.rb +81 -0
  332. data/spec/lib/buildfile/define_spec.rb +59 -0
  333. data/spec/lib/buildfile/dup_spec.rb +65 -0
  334. data/spec/lib/buildfile/invoke_spec.rb +130 -0
  335. data/spec/lib/buildfile/load_spec.rb +49 -0
  336. data/spec/lib/buildfile/task/dup_spec.rb +55 -0
  337. data/spec/lib/buildfile/task_defined_spec.rb +17 -0
  338. data/spec/lib/buildfile_commands/build_task_spec.rb +19 -0
  339. data/spec/lib/buildfile_commands/config_spec.rb +97 -0
  340. data/spec/lib/buildfile_commands/import_spec.rb +17 -0
  341. data/spec/lib/buildfile_commands/namespace_spec.rb +18 -0
  342. data/spec/lib/buildfile_commands/proxies_spec.rb +38 -0
  343. data/spec/lib/buildfile_commands/replace_task_spec.rb +29 -0
  344. data/spec/lib/buildfile_commands/task_spec.rb +36 -0
  345. data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +26 -0
  346. data/spec/lib/models/hash_struct/deep_clone_spec.rb +27 -0
  347. data/spec/lib/models/hash_struct/has_options_spec.rb +32 -0
  348. data/spec/lib/models/hash_struct/hash_spec.rb +64 -0
  349. data/spec/lib/models/hash_struct/merge_spec.rb +26 -0
  350. data/spec/lib/models/hash_struct/method_missing.rb +41 -0
  351. data/spec/lib/models/manifest/add_entry_spec.rb +36 -0
  352. data/spec/lib/models/manifest/add_transform_spec.rb +90 -0
  353. data/spec/lib/models/manifest/build_spec.rb +78 -0
  354. data/spec/lib/models/manifest/entry_for_spec.rb +94 -0
  355. data/spec/lib/models/manifest/find_entry.rb +84 -0
  356. data/spec/lib/models/manifest/prepare_spec.rb +62 -0
  357. data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +31 -0
  358. data/spec/lib/models/manifest_entry/prepare_spec.rb +54 -0
  359. data/spec/lib/models/project/add_target_spec.rb +44 -0
  360. data/spec/lib/models/project/buildfile_spec.rb +35 -0
  361. data/spec/lib/models/project/find_targets_for_spec.rb +77 -0
  362. data/spec/lib/models/project/load_nearest_project_spec.rb +23 -0
  363. data/spec/lib/models/project/target_for_spec.rb +33 -0
  364. data/spec/lib/models/project/targets_spec.rb +62 -0
  365. data/spec/lib/models/target/compute_build_number_spec.rb +125 -0
  366. data/spec/lib/models/target/config_spec.rb +30 -0
  367. data/spec/lib/models/target/expand_required_targets_spec.rb +48 -0
  368. data/spec/lib/models/target/installed_languages_spec.rb +47 -0
  369. data/spec/lib/models/target/lproj_for_spec.rb +38 -0
  370. data/spec/lib/models/target/manifest_for_spec.rb +42 -0
  371. data/spec/lib/models/target/parent_target_spec.rb +21 -0
  372. data/spec/lib/models/target/prepare_spec.rb +53 -0
  373. data/spec/lib/models/target/required_targets_spec.rb +119 -0
  374. data/spec/lib/models/target/target_for_spec.rb +56 -0
  375. data/spec/lib/tools/build_number_spec.rb +28 -0
  376. data/spec/lib/tools/gen_spec.rb +207 -0
  377. data/spec/lib/tools/tools_spec.rb +78 -0
  378. data/spec/spec_helper.rb +138 -0
  379. data/sproutcore.gemspec +47 -0
  380. data/vendor/github_gem_lint.rb +22 -0
  381. data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
  382. metadata +1084 -0
@@ -0,0 +1,30 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009 Apple, Inc.
4
+ # portions copyright @2006-2009 Sprout Systems, Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ module SC
9
+
10
+ module Helpers
11
+
12
+ module CaptureHelper
13
+
14
+ # Captures the resulting value of the block and returns it
15
+ def capture(*args, &block)
16
+ self.renderer ? self.renderer.capture(args, &block) : block.call(*args).to_s
17
+ end
18
+
19
+ # executes the passed block, placing the resulting content into a variable called
20
+ # @content_for_area_name. You can insert this content later by including this
21
+ # variable or by calling yield(:area_name)
22
+ #
23
+ def content_for(name, &block)
24
+ eval "@content_for_#{name} = (@content_for_#{name} || '') + (capture(&block) || '')"
25
+ return '' # incase user does <%= content_for ... %>
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,202 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009 Apple, Inc.
4
+ # portions copyright @2006-2009 Sprout Systems, Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ # module and class name have been modified
9
+ #
10
+ # == MIT License
11
+ # See http://code.google.com/p/rainpress/
12
+ #
13
+ # == About
14
+ #
15
+ # Rainpress is a compressor for CSS. It's written in ruby, but should not be
16
+ # limited to ruby projects.
17
+ #
18
+ # Rainpress does not apply common compression algorithms like gzip, it removes
19
+ # unnecessary characters and replaces some attributes with a shorter equivalent
20
+ # name.
21
+ #
22
+ # == Links
23
+ #
24
+ # * {Rainpress Website}[http://rainpress.xhochy.com/]
25
+ # * {SVN repository}[http://code.google.com/p/rainpress/source]
26
+ # * {Bugtracker}[https://bugs.launchpad.net/rainpress/]
27
+ # * {Wiki}[http://code.google.com/p/rainpress/w/list]
28
+ # * {Translations}[https://translations.launchpad.net/rainpress/]
29
+ # * {XhochY Weblog (for Announcements about Rainpress)}[http://xhochy.org/en/]
30
+ # * {Mailinglist}[http://groups.google.com/group/xy-oss-projects-discussion]
31
+ # * {Continous Integration Builds and Tests}[http://cruisecontrol-rb.xhochy.com/builds/rainpress]
32
+ # * {Freshmeat Record}[http://freshmeat.net/projects/rainpress]
33
+ module SC::Helpers
34
+
35
+ # == Information
36
+ #
37
+ # This is the main class of Rainpress, create an instance of it to compress
38
+ # your CSS-styles.
39
+ #
40
+ # == Simple Usage
41
+ #
42
+ # packer = SproutCore::CSSPacker.new
43
+ # compressed_style = packer.compress(style)
44
+ class CSSPacker
45
+
46
+ # Use always this functions if you want to compress your CSS-style
47
+ #
48
+ # <b>Options:</b>
49
+ #
50
+ # * <tt>:preserveComments</tt> - if set to true, comments will not be
51
+ # removed
52
+ # * <tt>:preserveNewline</tt> - if set to true, newlines will not be removed
53
+ # * <tt>:preserveSpaces</tt> - if set to true, spaces will not be removed
54
+ # * <tt>:preserveColors</tt> - if set to true, colors will not be modified
55
+ # * <tt>:skipMisc</tt> - if set to true, miscellaneous compression parts
56
+ # will be skipped
57
+ def compress(style, options = {})
58
+ # remove comments
59
+ style = remove_comments(style) unless options[:preserveComments]
60
+
61
+ # remove newlines
62
+ style = remove_newlines(style) unless options[:preserveNewlines]
63
+
64
+ # remove unneeded spaces
65
+ style = remove_spaces(style) unless options[:preserveSpaces]
66
+
67
+ # replace colours with shorter names
68
+ style = shorten_colors(style) unless options[:preserveColors]
69
+
70
+ # make all other things
71
+ style = do_misc(style) unless options[:skipMisc]
72
+
73
+ style
74
+ end
75
+
76
+ # Remove all comments out of the CSS-Document
77
+ def remove_comments(script)
78
+ input = script
79
+ script = ''
80
+
81
+ while input.length > 0 do
82
+ pos = input.index("/*");
83
+
84
+ # No more comments
85
+ if pos == nil
86
+ script += input
87
+ input = '';
88
+ else # Comment beginning at pos
89
+ script += input[0..(pos-1)] if pos > 0 # only append text if there is some
90
+ input = input[(pos+2)..-1]
91
+ # Comment ending at pos
92
+ pos = input.index("*/")
93
+ input = input[(pos+2)..-1]
94
+ end
95
+ end
96
+
97
+ # return
98
+ script
99
+ end
100
+
101
+ # Remove all newline characters
102
+ def remove_newlines(script)
103
+ script.gsub(/\n|\r/,'')
104
+ end
105
+
106
+ # 1. Turn mutiple spaces into a single
107
+ # 2. Remove spaces around ;:{},
108
+ # 3. Remove tabs
109
+ def remove_spaces(script)
110
+ script = script.gsub(/(\s(\s)+)/, ' ')
111
+ script = script.gsub(/\s*;\s*/,';')
112
+ script = script.gsub(/\s*:\s*/,':')
113
+ script = script.gsub(/\s*\{\s*/,'{')
114
+ script = script.gsub(/\s*\}\s*/,'}')
115
+ script = script.gsub(/\s*,\s*/,',')
116
+ script.gsub("\t",'');
117
+ end
118
+
119
+ # Replace color values with their shorter equivalent
120
+ #
121
+ # 1. Turn rgb(,,)-colors into #-values
122
+ # 2. Shorten #AABBCC down to #ABC
123
+ # 3. Replace names with their shorter hex-equivalent
124
+ # * white -> #fff
125
+ # * black -> #000
126
+ # 4. Replace #-values with their shorter name
127
+ # * #f00 -> red
128
+ def shorten_colors(style)
129
+ # rgb(50,101,152) to #326598
130
+ style = style.gsub(/rgb\s*\(\s*([0-9,\s]+)\s*\)/) do |match|
131
+ out = '#'
132
+ $1.split(',').each do |num|
133
+ if num.to_i < 16
134
+ out += '0'
135
+ end
136
+ out += num.to_i.to_s(16) # convert to hex
137
+ end
138
+ out
139
+ end
140
+ # #AABBCC to #ABC, keep if preceed by a '='
141
+ style = style.gsub(/([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/) do |match|
142
+ out = match
143
+ if ($3.downcase == $4.downcase) and ($5.downcase == $6.downcase) and ($7.downcase == $8.downcase)
144
+ out = $1 + '#' + $3.downcase + $5.downcase + $7.downcase
145
+ end
146
+ out
147
+ end
148
+ # shorten several names to numbers
149
+ style = style.gsub(/:[\s]*white[\s]*;/, ':#fff;')
150
+ style = style.gsub(/:[\s]*white[\s]*\}/, ':#fff}')
151
+ style = style.gsub(/:[\s]*black[\s]*;/, ':#000;')
152
+ style = style.gsub(/:[\s]*black[\s]*\}/, ':#000}')
153
+ # shotern several numbers to names
154
+ style = style.gsub(/:[\s]*#([fF]00|[fF]{2}0000);/, ':red;')
155
+ style = style.gsub(/:[\s]*#([fF]00|[fF]{2}0000)\}/, ':red}')
156
+
157
+ style
158
+ end
159
+
160
+ # Do miscellaneous compression methods on the style
161
+ def do_misc(script)
162
+ # Replace 0(pt,px,em,%) with 0 but only when preceded by : or a white-space
163
+ script = script.gsub(/([\s:]+)(0)(px|em|%|in|cm|mm|pc|pt|ex)/) do |match|
164
+ match.gsub(/(px|em|%|in|cm|mm|pc|pt|ex)/,'')
165
+ end
166
+ # Replace 0 0 0 0; with 0.
167
+ script = script.gsub(':0 0 0 0;', ':0;')
168
+ script = script.gsub(':0 0 0 0}', ':0}')
169
+ script = script.gsub(':0 0 0;', ':0;')
170
+ script = script.gsub(':0 0 0}', ':0}')
171
+ script = script.gsub(':0 0}', ':0}')
172
+ script = script.gsub(':0 0;', ':0;')
173
+ # Replace background-position:0; with background-position:0 0;
174
+ script = script.gsub('background-position:0;', 'background-position:0 0;');
175
+ # Replace 0.6 to .6, but only when preceded by : or a white-space
176
+ script = script.gsub(/[:\s]0+\.(\d+)/) do |match|
177
+ match.sub('0', '') # only first '0' !!
178
+ end
179
+ # Replace ;;;; with ;
180
+ script = script.gsub(/[;]+/, ';')
181
+ # Replace ;} with }
182
+ script = script.gsub(';}', '}')
183
+ # Replace background-color: with background:
184
+ script = script.gsub('background-color:', 'background:')
185
+ # Replace font-weight:normal; with 400, bold with 700
186
+ script = script.gsub(/font-weight[\s]*:[\s]*normal[\s]*;/,'font-weight:400;')
187
+ script = script.gsub(/font-weight[\s]*:[\s]*normal[\s]*\}/,'font-weight:400}')
188
+ script = script.gsub(/font[\s]*:[\s]*normal[\s;\}]*/) do |match|
189
+ match.sub('normal', '400')
190
+ end
191
+ script = script.gsub(/font-weight[\s]*:[\s]*bold[\s]*;/,'font-weight:700;')
192
+ script = script.gsub(/font-weight[\s]*:[\s]*bold[\s]*\}/,'font-weight:700}')
193
+ script = script.gsub(/font[\s]*:[\s]*bold[\s;\}]*/) do |match|
194
+ match.sub('bold', '700')
195
+ end
196
+
197
+ script
198
+ end
199
+
200
+ end
201
+
202
+ end
@@ -0,0 +1,21 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009 Apple, Inc.
4
+ # portions copyright @2006-2009 Sprout Systems, Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ module SC
9
+ module Helpers
10
+
11
+ module DomIdHelper
12
+ @@tick = 0
13
+
14
+ def dom_id!(type="id")
15
+ @@tick += 1
16
+ return "#{type}_#{(Time.now.to_i + @@tick)}"
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,105 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009 Apple, Inc.
4
+ # portions copyright @2006-2009 Sprout Systems, Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ module SC
9
+
10
+ module Helpers
11
+
12
+ # Sorts a set of entries, respecting any "requires" found in the entries.
13
+ # To use the sorter, just call the class method EntrySorter.sort() passing
14
+ # the entries to sort along with any filenames you prefer to have added to
15
+ # the top. If you don't specify any filenames, then the entries will be
16
+ # sorted alphabetically except for requires.
17
+ class EntrySorter
18
+
19
+ def self.sort(entries, preferred_filenames = [])
20
+ self.new(preferred_filenames).sort(entries)
21
+ end
22
+
23
+ def initialize(preferred_filenames = [])
24
+ @preferred_filenames = preferred_filenames
25
+ end
26
+
27
+ attr_reader :preferred_filenames
28
+
29
+ def sort(entries)
30
+ # first sort entries by filename - ignoring case
31
+ entries = entries.sort do |a,b|
32
+ (a.filename || '').to_s.downcase <=> (b.filename || '').to_s.downcase
33
+ end
34
+ all_entries = entries.dup # needed for sort...
35
+
36
+ # now process each entry to handle requires
37
+ seen = []
38
+ ret = []
39
+ while cur = next_entry(entries)
40
+ add_entry_to_set(cur, ret, seen, entries, all_entries)
41
+ end
42
+
43
+ return ret
44
+ end
45
+
46
+ protected
47
+
48
+ # Converts a passed set of requires into entries
49
+ def required_entries(required, entries, requiring_entry, all_entries)
50
+ return [] if required.nil?
51
+ required.map do |filename|
52
+ filename = filename.to_s.downcase.ext('')
53
+ source_filename = "source/#{filename}"
54
+ entry = all_entries.find do |e|
55
+ e.filename.to_s.downcase.ext('') == source_filename
56
+ end
57
+
58
+ # try localized version...
59
+ if entry.nil? && !(filename =~ /^lproj\//)
60
+ source_filename = "source/lproj/#{filename}"
61
+ entry = all_entries.find do |e|
62
+ e.filename.to_s.downcase.ext('') == source_filename
63
+ end
64
+ end
65
+
66
+ if entry.nil?
67
+ SC.logger.warn "Could not find entry '#{filename}' required in #{requiring_entry.target.target_name.to_s.sub(/^\//,'')}:#{requiring_entry.filename}"
68
+ end
69
+
70
+ entry
71
+ end
72
+ end
73
+
74
+ # Returns the next entry from the set of entries based on required order.
75
+ # Removed entry from array.
76
+ def next_entry(entries)
77
+ ret = nil
78
+
79
+ # look for preferred entries first...
80
+ @preferred_filenames.each do |filename|
81
+ ret = entries.find { |e| e.filename.to_s.downcase == filename }
82
+ break if ret
83
+ end
84
+
85
+ ret ||= entries.first # else fallback to first entry in set
86
+ entries.delete(ret) if ret
87
+ return ret
88
+ end
89
+
90
+ # Adds the specified entry to the ordered array, adding required first
91
+ def add_entry_to_set(entry, ret, seen, entries, all_entries)
92
+ return if seen.include?(entry)
93
+
94
+ seen << entry
95
+ req = required_entries(entry.required, entries, entry, all_entries)
96
+ req.each do |required|
97
+ next if required.nil?
98
+ add_entry_to_set(required, ret, seen, entries, all_entries)
99
+ end
100
+ ret << entry
101
+ end
102
+
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,102 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009 Apple, Inc.
4
+ # portions copyright @2006-2009 Sprout Systems, Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ module SC::Helpers
9
+
10
+ # Given a set of targets, this can determine the optimial mix of loading
11
+ # packed targets vs individual targets to yield the smaller number of
12
+ # assets. To use this optimizer, just call the optimize() method.
13
+ class PackedOptimizer
14
+
15
+ # Returns two arrays: the first array are targets that should be loaded
16
+ # packed. The array of targets that should be loaded, but not packed.
17
+ # And optional third array is also returned that includes targets which
18
+ # were passed in but are no longer needed because they are included in
19
+ # a packed target.
20
+ def self.optimize(targets)
21
+ packed = []
22
+ unpacked = targets
23
+ cnt = packed.size + unpacked.size
24
+
25
+ # for each target, try to use the packed version and see how many
26
+ # total items we come back with. If the total number of targets is
27
+ # less than the current best option, use that instead.
28
+ targets.each do |target|
29
+ cur_packed, cur_unpacked = self.new.process(target, targets)
30
+ cur_cnt = cur_packed.size + cur_unpacked.size
31
+ if cur_cnt < cnt
32
+ packed = cur_packed
33
+ unpacked = cur_unpacked
34
+ cnt = cur_cnt
35
+ end
36
+ end
37
+
38
+ # return best!
39
+ return [packed, unpacked]
40
+ end
41
+
42
+ attr_reader :packed
43
+ attr_reader :unpacked
44
+
45
+ def initialize
46
+ @seen = []
47
+ @packed = []
48
+ @unpacked = []
49
+ end
50
+
51
+ # Sorts the passed array of targets into packed and unpacked, starting
52
+ # with the passed target as the packed target.
53
+ def process(packed_target, targets)
54
+ # manually add in packed target...
55
+ @seen << packed_target
56
+ @packed << packed_target
57
+ packed_target.expand_required_targets.each { |t| @seen << t }
58
+
59
+ # then handle the rest of the targets
60
+ targets.each { |t| process_target(t) }
61
+
62
+ return [packed, unpacked]
63
+ end
64
+
65
+ # Sorts a single target into the correct bucket based on whether it is
66
+ # seen or not. If you also pass true to the second param, the required
67
+ # targets will also be sorted.
68
+ def process_target(target)
69
+ # if target was seen already, nothing to do
70
+ return if @seen.include?(target)
71
+
72
+ # add to seen
73
+ @seen << target
74
+
75
+ # have we already seen any of the required targets?
76
+ req_targets = target.expand_required_targets
77
+ if req_targets.size > 0
78
+ already_seen = req_targets.find do |t|
79
+ @seen.include?(t)
80
+ end
81
+ else
82
+ already_seen = true
83
+ end
84
+
85
+
86
+ # if we have seen one, then we can't use the packed version so put it
87
+ # in the unpacked set.
88
+ if already_seen
89
+ req_targets.each { |t| process_target(t) }
90
+ @unpacked << target # add last to keep order intact
91
+
92
+ # if we have not seen any required, then we can mark this as packed.
93
+ # yeah! mark the required targets as seen also
94
+ else
95
+ req_targets.each { |t| @seen << t }
96
+ @packed << target
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+ end