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,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
+