sproutit-sproutcore 1.0.0.20090407205609

Sign up to get free protection for your applications and to get access to all the features.
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,44 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__), 'base'))
9
+ require 'fileutils'
10
+
11
+ module SC
12
+
13
+ # This builder is used to generate a file containing all of the loc strings
14
+ # for a particular manifest. The strings file is used when generating
15
+ # HTML try to map localized strings
16
+ class Builder::Strings < Builder::Base
17
+
18
+ def build(dst_path)
19
+ data = parse_strings_js(entry.source_path)
20
+ writelines dst_path, [data.to_yaml]
21
+ end
22
+
23
+ def parse_strings_js(source_path)
24
+ return {} if !File.exists?(source_path)
25
+
26
+ # read the file in and strip out comments...
27
+ str = File.read(source_path)
28
+ str = str.gsub(/\/\/.*$/,'').gsub(/\/\*.*\*\//m,'')
29
+
30
+ # Now build the hash
31
+ ret = {}
32
+ str.scan(/['"](.+)['"]\s*:\s*['"](.+)['"],?\s*$/) do |x,y|
33
+ # x & y are JS strings that must be evaled as such..
34
+ #x = eval(%("#{x}"))
35
+ y = eval(%[<<__EOF__\n#{y}\n__EOF__]).chop
36
+ ret[x] = y
37
+ end
38
+ return ret
39
+ end
40
+
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,40 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__), 'base'))
9
+ require 'fileutils'
10
+
11
+ module SC
12
+
13
+ # This builder is used to process a single CSS stylesheet. Converts any
14
+ # build tool directives (such as sc_require() and sc_resource()) into
15
+ # comments. It will also substitute any calls to sc_static() (or
16
+ # static_url()) This builder does NOT handle combining multiple stylesheets
17
+ # into one. See the Builder::CombineStylesheets builder instead.
18
+ #
19
+ class Builder::Stylesheet < Builder::Base
20
+
21
+ def build(dst_path)
22
+ lines = readlines(entry.source_path).map { |l| rewrite_inline_code(l) }
23
+ writelines dst_path, lines
24
+ end
25
+
26
+ # Rewrites any inline content such as static urls. Subclasseses can
27
+ # override this to rewrite any other inline content.
28
+ #
29
+ # The default will rewrite calls to static_url().
30
+ def rewrite_inline_code(line)
31
+ # look for sc_require, require or sc_resource. wrap in comment
32
+ line = line.gsub(/((sc_require|require|sc_resource)\(\s*['"].*["']\s*\)\s*\;)/, '/* \1 */')
33
+ line = replace_static_url(line)
34
+ end
35
+
36
+ def static_url(url=''); "url('#{url}')" ; end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,58 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__), 'html'))
9
+
10
+ module SC
11
+
12
+ # Builds an HTML files. This will setup an HtmlContext and then invokes
13
+ # the render engines for each source before finally rendering the layout.
14
+ class Builder::Test < Builder::Html
15
+
16
+ def initialize(entry)
17
+ super(entry)
18
+ @layout = @target.config.test_layout || 'lib/test.rhtml'
19
+ end
20
+
21
+ # Always include any required test targets as well when loading unit
22
+ # tests.
23
+ def expand_required_targets(target, opts = {})
24
+ opts[:test] = true
25
+ super(target, opts)
26
+ end
27
+
28
+ protected
29
+
30
+ def render_entry(entry)
31
+ entry.stage!
32
+
33
+ case entry.ext
34
+ when 'js':
35
+ render_jstest(entry)
36
+ when 'rhtml':
37
+ entry.target.buildfile.invoke 'render:erubis',
38
+ :entry => entry,
39
+ :src_path => entry.staging_path,
40
+ :context => self
41
+ end
42
+ end
43
+
44
+ def default_content_for_key; :body; end
45
+
46
+ # Renders an individual test into a script tag. Also places the test
47
+ # into its own closure so that globals defined by one test will not
48
+ # conflict with any others.
49
+ def render_jstest(entry)
50
+ lines = readlines(entry.staging_path)
51
+ lines.unshift %[<script type="text/javascript">\n(function() {\n]
52
+ lines.push %[\n})();\n</script>\n]
53
+ @content_for_final = (@content_for_final || '') + lines.join("")
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,26 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__), 'base'))
9
+
10
+ module SC
11
+
12
+ # Builds an HTML files. This will setup an HtmlContext and then invokes
13
+ # the render engines for each source before finally rendering the layout.
14
+ class Builder::TestIndex < Builder::Base
15
+
16
+ def build(dst_path)
17
+ require 'json'
18
+ items = entry.source_entries.map do |e|
19
+ { "filename" => e.filename.ext(''), "url" => e.url }
20
+ end
21
+ writelines dst_path, [items.to_json]
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,483 @@
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
+ require File.join(File.dirname(__FILE__), 'models', 'hash_struct')
9
+ require File.join(File.dirname(__FILE__), 'buildfile', 'cloneable')
10
+ require File.join(File.dirname(__FILE__), 'buildfile', 'task_manager')
11
+
12
+ module SC
13
+
14
+ # A Buildfile is a special type of file that contains the configurations and
15
+ # build tasks used for a particular project or project target. Buildfiles
16
+ # are based on Rake but largely use their own syntax and helper methods.
17
+ #
18
+ # Whenever you create a project, you will often also add a Buildfile,
19
+ # sc-config, or sc-config.rb file. All of these files are laoded into the
20
+ # build system using this class. The other model objects will then
21
+ # reference their buildfile to extract configuration information and to find
22
+ # key tasks required for the build process.
23
+ #
24
+ # == Loading a Buildfile
25
+ #
26
+ # To load a buildfile, just use the load() method:
27
+ #
28
+ # buildfile = Buildfile.load('/path/to/buildfile')
29
+ #
30
+ # You can also load multiple buildfiles by calling the load!() method on
31
+ # an exising Buildfile object or by passing a directory with several
32
+ # buildfiles in it:
33
+ #
34
+ # buildfile = Buildfile.new
35
+ # buildfile.load!('buildfile1').load!('buildfile2')
36
+ #
37
+ # == Defining a Buildfile
38
+ #
39
+ # Finally, you can also define new settings on a buildfile directly. Simply
40
+ # use the define() method:
41
+ #
42
+ # buildfile = Buildfile.define do
43
+ # task :demo_task
44
+ # end
45
+ #
46
+ # You can also define additional tasks on an existing buildfile object like
47
+ # so:
48
+ #
49
+ # buildfile = Buildfile.new
50
+ # buildfile.define! do
51
+ # task :demo_task
52
+ # end
53
+ #
54
+ # When you call define!() on a buildfile, the block is executed in the
55
+ # context of the buildfile object, just like a Buildfile loaded from disk.
56
+ # You will not usually use define!() on a buildfile in normal code, but it
57
+ # is very useful for unit testing.
58
+ #
59
+ # == Executing Tasks
60
+ #
61
+ # Once a buildfile is loaded, you can execute tasks on the buildfile using
62
+ # the invoke() method. You should pass the name of the task you want
63
+ # to execute along with any constants you want set for the task to access:
64
+ #
65
+ # buildfile.invoke :demo_task, :context => my_context
66
+ #
67
+ # With the above example, the demo_task could access the "context" as a
68
+ # global constant like do:
69
+ #
70
+ # task :demo_task do
71
+ # CONTEXT.name = "demo!"
72
+ # end
73
+ #
74
+ # == Accessing Configs
75
+ #
76
+ # Configs are stored in a "normalized" state in the "configs" property. You
77
+ # can access configs directly this way, but the more useful way to access
78
+ # configs is through the config_for() method. Pass the name of the target
79
+ # that is the current "focus" of the config:
80
+ #
81
+ # config = buildfile.config_for('/sproutcore') # target always starts w /
82
+ #
83
+ # Configs can be specified in different "contexts" by the buildfile. When
84
+ # you call this method, the configs will be merged together, layering any
85
+ # configs that are targeted specifically at the /sproutcore target over the
86
+ # top of globally defined configs. The current build mode is also reflected
87
+ # in this call.
88
+ #
89
+ class Buildfile
90
+
91
+ # Default buildfile names. Override with SC.env.buildfile_names
92
+ BUILDFILE_NAMES = %w(Buildfile sc-config sc-config.rb)
93
+
94
+ include Cloneable
95
+ include TaskManager
96
+
97
+ # The location of the buildfile represented by this object.
98
+ attr_accessor :path
99
+
100
+ ################################################
101
+ # CLASS METHODS
102
+ #
103
+
104
+ # Determines if this directory has a buildfile or not...
105
+ def self.has_buildfile?(dir_path, buildfile_names=nil)
106
+ buildfile_names ||= (SC.env.buildfile_names || BUILDFILE_NAMES)
107
+ buildfile_names.each do |path|
108
+ path = File.join(dir_path, path)
109
+ return true if File.exist?(path) && !File.directory?(path)
110
+ end
111
+ return false
112
+ end
113
+
114
+ # Loads the buildfile at the specified path. This simply creates a new
115
+ # instance and loads it.
116
+ #
117
+ # === Params
118
+ # path:: the path to laod at
119
+ #
120
+ # === Returns
121
+ # A new Buildfile instance
122
+ #
123
+ def self.load(path)
124
+ self.new.load!(path)
125
+ end
126
+
127
+ # Creates a new buildfile and then gives you an opportunity to define
128
+ # its contents by executing the passed block in the context of the
129
+ # buildfile.
130
+ #
131
+ # === Returns
132
+ # A new buildfile instance
133
+ #
134
+ def self.define(&block)
135
+ self.new.define!(&block)
136
+ end
137
+
138
+ ################################################
139
+ # TASK METHODS
140
+ #
141
+
142
+ attr_reader :current_path
143
+
144
+ # Extend the buildfile dynamically by executing the named task. This
145
+ # will yield the block if given after making the buildfile the current
146
+ # build file.
147
+ #
148
+ # === Params
149
+ # string:: optional string to eval
150
+ # &block:: optional block to execute
151
+ #
152
+ # === Returns
153
+ # self
154
+ #
155
+ def define!(string=nil, &block)
156
+ context = reset_define_context :current_mode => :all
157
+ instance_eval(string) if string
158
+ instance_eval(&block) if block_given?
159
+ load_imports
160
+ reset_define_context context
161
+ return self
162
+ end
163
+
164
+ def task_defined?(task_name)
165
+ !!lookup(task_name)
166
+ end
167
+
168
+ # Loads the contents of the passed file into the buildfile object. The
169
+ # contents will be executed in the context of the buildfile object. If
170
+ # the filename passed is nil or the file does not exist, this will simply
171
+ # do nothing.
172
+ #
173
+ # === Params
174
+ # filename:: the buildfile to load or a directory
175
+ # buildfile_names:: optional array of names to search in directory
176
+ #
177
+ # === Returns
178
+ # self
179
+
180
+ def load!(filename=nil, buildfile_names=nil)
181
+
182
+ # If a directory is passed, look for any buildfile and load them...
183
+ if File.directory?(filename)
184
+
185
+ # search directory for buildfiles and load them.
186
+ buildfile_names ||= (SC.env.buildfile_names || BUILDFILE_NAMES)
187
+ buildfile_names.each do |path|
188
+ path = File.join(filename, path)
189
+ next unless File.exist?(path) && !File.directory?(path)
190
+ load!(path)
191
+ end
192
+
193
+ elsif File.exist?(filename)
194
+ old_path = @current_path
195
+ @current_path = filename
196
+ loaded_paths << filename # save loaded paths
197
+ define!(File.read(filename)) if filename && File.exist?(filename)
198
+ @current_path = old_path
199
+ end
200
+ return self
201
+ end
202
+
203
+ def loaded_paths; @loaded_paths ||= []; end
204
+
205
+ # Executes the name task. Unlike invoke_task, this method will execute
206
+ # the task even if it has already been executed before. You can also
207
+ # pass a hash of additional constants that will be set on the global
208
+ # namespace before the task is invoked.
209
+ #
210
+ # === Params
211
+ # task_name:: the full name of the task, including namespaces
212
+ # consts:: Optional hash of constant values to set on the env
213
+ def invoke(task_name, consts = nil)
214
+ consts = set_kernel_consts consts # save to restore
215
+ self[task_name.to_s].invoke
216
+ set_kernel_consts consts # clear constants
217
+ end
218
+
219
+ # Returns true if the buildfile has the named task defined
220
+ #
221
+ # === Params
222
+ # task_name:: the full name of the task, including namespaces
223
+ def has_task?(task_name)
224
+ !self[task_name.to_s].nil?
225
+ end
226
+
227
+ ################################################
228
+ # RAKE SUPPORT
229
+ #
230
+
231
+ # Add a file to the list of files to be imported.
232
+ def add_import(fn)
233
+ @pending_imports << fn
234
+ end
235
+
236
+ # Load the pending list of imported files.
237
+ def load_imports
238
+ while fn = @pending_imports.shift
239
+ next if @imported.member?(fn)
240
+ if fn_task = lookup(fn)
241
+ fn_task.invoke
242
+ end
243
+ load!(fn)
244
+ @imported << fn
245
+ end
246
+ end
247
+
248
+ # Support redefining a task...
249
+ def intern(task_class, task_name)
250
+ ret = super(task_class, task_name)
251
+ ret.clear if @is_redefining
252
+ return ret
253
+ end
254
+
255
+ # Application options from the command line
256
+ attr_reader :options
257
+
258
+ ################################################
259
+ # CONFIG METHODS
260
+ #
261
+
262
+ def current_mode
263
+ @define_context.current_mode
264
+ end
265
+
266
+ def current_mode=(new_mode)
267
+ @define_context.current_mode = new_mode
268
+ end
269
+
270
+ # Configures the buildfile for use with the specified target. Call this
271
+ # BEFORE you load any actual file contents.
272
+ #
273
+ # === Returns
274
+ # self
275
+ #
276
+ def for_target(target)
277
+ @target_name = target.target_name.to_s
278
+ return self
279
+ end
280
+
281
+ # The namespace for this buildfile. This should be name equal to the
282
+ # namespace of the target that owns the buildfile, if there is one
283
+ attr_reader :target_name
284
+
285
+ # The hash of configs as loaded from the files. The configs are stored
286
+ # by mode and then by config name. To get a merged config, use
287
+ # config_for().
288
+ attr_reader :configs
289
+
290
+ # The hash of proxy commands
291
+
292
+ # Merge the passed hash of options into the config hash. This method
293
+ # is usually used by the config global helper
294
+ #
295
+ # === Params
296
+ # config_name:: the name of the config to set
297
+ # config_mode:: the mode to store the config. If omitted use current
298
+ # opts: the config options to merge in
299
+ #
300
+ # === Returns
301
+ # receiver
302
+ #
303
+ def add_config(config_name, config_mode, opts=nil)
304
+ # Normalize Params
305
+ if opts.nil?
306
+ opts = config_mode; config_mode = nil
307
+ end
308
+ config_mode = current_mode if config_mode.nil?
309
+
310
+ # Normalize the config name -- :all or 'all' is OK, absolute OK.
311
+ config_name = config_name.to_s
312
+ if config_name != 'all' && (config_name[0..0] != '/')
313
+ if target_name && (config_name == File.basename(target_name))
314
+ config_name = target_name
315
+ else
316
+ config_name = [target_name, config_name].join('/')
317
+ end
318
+ end
319
+
320
+ # Perform Merge
321
+ mode_configs = (self.configs[config_mode.to_sym] ||= HashStruct.new)
322
+ config = (mode_configs[config_name.to_sym] ||= HashStruct.new)
323
+ config.merge!(opts)
324
+ end
325
+
326
+ # Returns the merged config setting for the config name and mode. If
327
+ # no mode is specified the :all mode is assumed.
328
+ #
329
+ # This will merge config hashes in the following order (mode/name):
330
+ #
331
+ # all:all -> mode:all -> all:config -> mode:config
332
+ #
333
+ #
334
+
335
+ # === Params
336
+ # config_name:: The config name
337
+ # mode_name:: optional mode name
338
+ #
339
+ # === Returns
340
+ # merged config -- a HashStruct
341
+ def config_for(config_name, mode_name=nil)
342
+ mode_name = :all if mode_name.nil? || mode_name.to_s.size == 0
343
+ config_name = :all if config_name.nil? || config_name.to_s.size == 0
344
+
345
+ # collect the hashes
346
+ all_configs = configs[:all]
347
+ cur_configs = configs[mode_name]
348
+ ret = HashStruct.new
349
+
350
+ # now merge em! -- note that this assumes the merge method will handle
351
+ # self.merge(self) & self.merge(nil) gracefully
352
+ ret.merge!(all_configs[:all]) if all_configs
353
+ ret.merge!(cur_configs[:all]) if cur_configs
354
+ ret.merge!(all_configs[config_name]) if all_configs
355
+ ret.merge!(cur_configs[config_name]) if cur_configs
356
+
357
+ # Done -- return result
358
+ return ret
359
+ end
360
+
361
+ ################################################
362
+ # PROJECT & TARGET METHODS
363
+ #
364
+
365
+ # This is set if you use the project helper method in your buildfile.
366
+ attr_accessor :project_name
367
+
368
+ def project_type; @project_type || :default; end
369
+ attr_writer :project_type
370
+
371
+ # Returns YES if this buildfile appears to represent a project. If you
372
+ # use the project() helper method, it will set this
373
+ def project?; @is_project || false; end
374
+ def project!; @is_project = true; end
375
+
376
+ ################################################
377
+ # PROXY METHODS
378
+ #
379
+
380
+ # The hash of all proxies paths and their options
381
+ attr_reader :proxies
382
+
383
+ # Adds a proxy to the list of proxy paths. These are used only in server
384
+ # mode to proxy certain URLs. If you call this method with the same
385
+ # proxy path more than once, the options will be merged.
386
+ #
387
+ # === Params
388
+ # :proxy_path the URL to proxy
389
+ # :opts any proxy options
390
+ #
391
+ # === Returns
392
+ # receiver
393
+ #
394
+ def add_proxy(proxy_path, opts={})
395
+ @proxies[proxy_path] = HashStruct.new(opts)
396
+ return self
397
+ end
398
+
399
+ ################################################
400
+ # INTERNAL SUPPORT
401
+ #
402
+
403
+ def initialize
404
+ super
405
+ @configs = HashStruct.new
406
+ @proxies = HashStruct.new
407
+ @pending_imports = []
408
+ @imported = []
409
+ @options = HashStruct.new
410
+ end
411
+
412
+ # When dup'ing, rewrite the @tasks hash to use clones of the tasks
413
+ # the point to the new application object.
414
+ def dup
415
+ ret = super
416
+
417
+ # Make sure the tasks themselves are cloned
418
+ tasks = ret.instance_variable_get('@tasks')
419
+ tasks.each do | key, task |
420
+ tasks[key] = task.dup(ret)
421
+ end
422
+
423
+ # Deep clone the config and proxy hashes as well...
424
+ %w(@configs @proxies @options).each do |ivar|
425
+ cloned_ivar = instance_variable_get(ivar).deep_clone
426
+ ret.instance_variable_set(ivar, cloned_ivar)
427
+ end
428
+
429
+ ret.instance_variable_set('@is_project', false) # transient - do not dup
430
+
431
+ return ret
432
+ end
433
+
434
+ protected
435
+
436
+ # Save off the old define context and replace it with the passed context
437
+ # This is used during a call to define()
438
+ def reset_define_context(context=nil)
439
+ ret = @define_context
440
+ @define_context = HashStruct.new(context || {})
441
+ return ret
442
+ end
443
+
444
+ # For each key in the passed hash, this will register a global
445
+ def set_kernel_consts(env = nil)
446
+ return env if env.nil?
447
+
448
+ # for each item in the passed environment, convert to uppercase constant
449
+ # and set in global namespace. Save the old value so that it can be
450
+ # restored later.
451
+ ret = {}
452
+ env.each do |key, value|
453
+ const_key = key.to_s.upcase.to_sym
454
+
455
+ # Save the old const value
456
+ ret[key] = Kernel.const_get(const_key) rescue nil
457
+
458
+ # Reset
459
+ Kernel.const_reset(const_key, value)
460
+ end
461
+
462
+ # Also, save env. Used mostly for logging
463
+ ret['TASK_ENV'] = Kernel.const_get('TASK_ENV') rescue nil
464
+ Kernel.const_reset('TASK_ENV', env)
465
+
466
+ return ret
467
+ end
468
+
469
+ end
470
+
471
+ end
472
+
473
+ # Add public method to kernel to remove defined constant using private
474
+ # method.
475
+ module Kernel
476
+ def const_reset(key, value)
477
+ remove_const(key) if const_defined?(key)
478
+ const_set key, value
479
+ end
480
+ end
481
+
482
+ SC.require_all_libs_relative_to(__FILE__)
483
+