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,662 @@
1
+ # ===========================================================================
2
+ # Project: Abbot - SproutCore Build Tools
3
+ # Copyright: ©2009 Apple, Inc.
4
+ # portions copyright @2006-2009 Sprout Systems, Inc.
5
+ # and contributors
6
+ # ===========================================================================
7
+
8
+ module SproutCore
9
+
10
+ # The PageHelper is a singleton object that can render the Page javascript
11
+ # object.
12
+ module PageHelper
13
+ @@render_contexts = []
14
+ @@outlets = []
15
+ @@styles = []
16
+ @@defines = []
17
+
18
+ # This is the current helper state used when rendering the HTML. When
19
+ # a view helper is rendered, it may add itself as an outlet to the current
20
+ # helper state instead of to the page helper.
21
+ def self.current_render_context
22
+ @@render_contexts.last
23
+ end
24
+
25
+ def self.push_render_context(state)
26
+ @@render_contexts.push(state)
27
+ end
28
+
29
+ def self.pop_render_context
30
+ @@render_contexts.pop
31
+ end
32
+
33
+ # reset the page helper.
34
+ def self.reset!
35
+ @@render_contexts = []
36
+ @@outlets = []
37
+ @@styles = []
38
+ @@defines = []
39
+ end
40
+
41
+ def self.set_define(key, opts = {})
42
+ @@defines << [key, opts]
43
+ end
44
+
45
+ def self.set_outlet(key,opts = {})
46
+ @@outlets << [key, opts]
47
+ end
48
+
49
+ def self.add_styles(styles)
50
+ @@styles << styles
51
+ end
52
+
53
+ # renders the page object for the current page. If you include a prefix
54
+ # that will be used to create a separate page object. Otherwise, the
55
+ # object will live in the SC namespace. If you provide a bundle that
56
+ # is configured to minify sources the output will be compressed.
57
+ #
58
+ # returns the text to insert into the HTML.
59
+ def self.render_js(prefix = 'SC', bundle = nil)
60
+ outlets = []
61
+ @@outlets.each do | key, opts |
62
+ outlet_path = opts[:outlet_path] || "##{opts[:id] || key}"
63
+ outlets << %{ #{key}: #{opts[:class] || 'SC.View'}.extend({\n #{ opts[:properties].gsub("\n","\n ") }\n }).outletFor("#{outlet_path}") }
64
+ end
65
+
66
+ # defines let you define classes to include in your UI.
67
+ ret = @@defines.each do | key, opts |
68
+ %{#{key} = #{opts[:class] || 'SC.View'}.extend({\n #{ opts[:properties] }\n});}
69
+ end
70
+ ret << %{#{prefix}.page = SC.Page.create({\n#{ outlets * ",\n\n" }\n}); }
71
+ bundle ? SproutCore::BuildTools::JavaScriptResourceBuilder.new(nil, nil, bundle, nil).join(ret) : ret*"\n"
72
+ end
73
+
74
+ def self.render_css
75
+ if @@styles.size > 0
76
+ %(<style type="application/css">\n#{ @@styles * "\n" }\n</style>)
77
+ else
78
+ ''
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ module ViewHelperSupport
85
+
86
+ @@helpers = {}
87
+ def self.find_helper(helper_name)
88
+ @@helpers[helper_name.to_sym] || @@helpers[:view]
89
+ end
90
+
91
+ def self.set_helper(helper_name,obj)
92
+ @@helpers[helper_name.to_sym] = obj
93
+ end
94
+
95
+ class RenderContext
96
+
97
+ # options passed in from the view helper
98
+ attr_reader :view_helper_id
99
+ attr_reader :item_id
100
+ attr_accessor :outlet
101
+ attr_accessor :define
102
+ attr_accessor :current_helper
103
+ attr_accessor :client_builder
104
+ attr_reader :render_source
105
+ attr_reader :parent_context
106
+ attr_reader :child_contexts
107
+
108
+ def initialize(view_helper_id, item_id, opts={}, client_builder = nil, render_source=nil)
109
+ @_options = opts.dup
110
+ @bindings = (@_options[:bind] || {}).dup
111
+ @outlets = []
112
+ @prototypes = {}
113
+ @view_helper_id = view_helper_id
114
+ @item_id = item_id
115
+ @outlet = opts[:outlet]
116
+ @define = opts[:define]
117
+ @client_builder = client_builder
118
+ @render_source = render_source
119
+ @parent_context = SproutCore::PageHelper.current_render_context
120
+ @parent_context.child_contexts << self if @parent_context
121
+ @child_contexts = []
122
+
123
+ @attributes = (@_options[:attributes] || {}).dup
124
+
125
+ @_properties = {}
126
+ if @_options[:properties]
127
+ @_options[:properties].each do | key, value |
128
+ @_properties[key.to_s.camelize(:lower)] = prepare_for_javascript(value)
129
+ end
130
+ end
131
+ end
132
+
133
+ def to_s
134
+ "RenderContext #{view_helper_id}[#{item_id}]"
135
+ end
136
+
137
+ def options
138
+ @_options
139
+ end
140
+
141
+ def set_outlet(key,opts = {})
142
+ @outlets << [key, opts]
143
+ end
144
+
145
+ def prepare_bindings
146
+ @bindings.each do | k,v |
147
+ key = k.to_s.camelize(:lower) + 'Binding'
148
+ @_properties[key] = v.include?('(') ? v : prepare_for_javascript(v)
149
+ end
150
+ end
151
+
152
+ def prepare_outlets
153
+ return if @outlets.size == 0
154
+ outlets = []
155
+ @outlets.each do | key, opts |
156
+ outlet_key = key.to_s.camelize(:lower)
157
+ outlets << outlet_key unless opts[:lazy]
158
+
159
+ outlet_path = opts[:outlet_path] || ".#{opts[:id] || key }?"
160
+ str = %{#{opts[:class] || 'SC.View'}.extend({\n#{ opts[:properties] }\n}).outletFor("#{outlet_path}")}
161
+ @_properties[outlet_key] = str
162
+ end
163
+
164
+ @_properties['outlets'] = outlets
165
+ end
166
+
167
+ def parent_helper(opts = {})
168
+ if @current_helper && @current_helper.parent_helper
169
+ @_options.merge! opts
170
+ @current_helper.parent_helper.prepare_context(self)
171
+ end
172
+ end
173
+
174
+ ### RENDER METHODS
175
+ def render_content
176
+ @attributes[:id] = @item_id if @item_id && !(@outlet || @define)
177
+
178
+ old_client_builder = self.client_builder
179
+ self.client_builder = @content_render_client_builder unless @content_render_client_builder.nil?
180
+ ret = _do_render(@content_render)
181
+ self.client_builder = old_client_builder
182
+ return ret
183
+ end
184
+
185
+ def render_view
186
+ prepare_bindings
187
+ prepare_outlets
188
+ _do_render(@view_render)
189
+ end
190
+
191
+ def view_class
192
+ @view_class
193
+ end
194
+
195
+ def render_styles
196
+ _do_render(@styles_render)
197
+ end
198
+
199
+ ### BASIC CONFIG METHODS
200
+ # These are called in the helper's prepare_context method.
201
+
202
+ # This method must be called to configure the view.
203
+ def view(view_class,text = nil, &block)
204
+ @view_class = view_class
205
+ @view_render = text || block if (text || block)
206
+ end
207
+
208
+ # this method must be called to configure the HTML.
209
+ # also captures the client builder in use at the time it is called.
210
+ def content(text = nil, &block)
211
+ @content_render_client_builder = self.client_builder
212
+ @content_render = text || block if (text || block)
213
+ end
214
+
215
+ # this method may be called to add CSS styles
216
+ def styles(text = nil, &block)
217
+ @styles_render = text || block if (text || block)
218
+ end
219
+
220
+ def static_url(resource_name, opts = {})
221
+ opts[:language] ||= @language
222
+ entry = @client_builder.find_resource_entry(resource_name, opts)
223
+ entry.nil? ? '' : entry.cacheable_url
224
+ end
225
+
226
+ def blank_url
227
+ static_url('blank.gif')
228
+ end
229
+
230
+ ### HTML HELPER METHODS
231
+
232
+ # This will extract the specified value and put it into an ivar you can
233
+ # access later during rendering. For example:
234
+ #
235
+ # var :label, 'Default label'
236
+ #
237
+ # will now be accessible in your code via @label
238
+ #
239
+ # Parameters:
240
+ # option_key: (req) the option to map.
241
+ # default_value: (opt) if passed, this will be used as the default value
242
+ # if the option is not passed in.
243
+ #
244
+ # :key => (opt) the name of the resulting ivar. defaults to the option
245
+ # key.
246
+ #
247
+ # :optional => (opt) if true, then the attribute will not be included if
248
+ # it is not explicitly passed in the options. if no default value is
249
+ # specified, then this will default to true, otherwise defaults to
250
+ # false.
251
+ #
252
+ # :constant => (opt) if true, then any passed in options will be ignored
253
+ # for this key and the default you specify will be used instead.
254
+ # Defaults to false
255
+ #
256
+ # you may also pass a block that will be used to compute the value at
257
+ # render time. Expect a single parameter which is the initial value.
258
+ #
259
+ def var(option_key, default_value=:__UNDEFINED__, opts={}, &block)
260
+ ret = _pair(option_key, default_value, opts, &block)
261
+ return if ret[2] # ignore
262
+ instance_variable_set("@#{ret[0]}".to_sym, ret[1])
263
+ ret[1]
264
+ end
265
+
266
+ # returns the standard attributes for the HTML. This will automatically
267
+ # include the item id. You can also declare added attributes using the
268
+ # attribute param.
269
+ def attributes
270
+ final_class_names = css_class_names
271
+ final_styles = css_styles
272
+
273
+ ret = @attributes.map do |key,value|
274
+
275
+ # if the css class or css style is declared, replace the current
276
+ # set coming from the view_helper
277
+ if key.to_sym == :class && value
278
+ final_class_names = value
279
+ nil
280
+ elsif key.to_sym == :style && value
281
+ final_styles = value
282
+ nil
283
+ else
284
+ value ? %(#{key}="#{value}") : nil
285
+ end
286
+ end
287
+
288
+ # add in class names
289
+ final_class_names = [final_class_names].flatten
290
+ final_class_names << @item_id
291
+ final_class_names.compact!
292
+ unless final_class_names.empty?
293
+ ret << %(class="#{final_class_names.uniq * ' '}")
294
+ end
295
+
296
+ # add in styles
297
+ unless final_styles.nil?
298
+ final_styles = [final_styles].flatten
299
+ final_styles.compact!
300
+ ret << %(style="#{final_styles.uniq * ' '}") unless final_styles.empty?
301
+ end
302
+
303
+ ret.compact * ' '
304
+ end
305
+
306
+ # Your view helper can add text to by appended to the styles attribute
307
+ # by adding to this array.
308
+ def css_styles
309
+ @css_styles ||= []
310
+ end
311
+
312
+ def css_styles=(new_ary)
313
+ @css_styles = new_ary
314
+ end
315
+
316
+ # Your view helper can add css classes to be appended to the classes
317
+ # attribute by adding to this array.
318
+ def css_class_names
319
+ @css_class_names ||= []
320
+ end
321
+
322
+ def css_class_names=(new_ary)
323
+ @css_class_names = new_ary
324
+ end
325
+
326
+ # This does the standard open tag with the default tag and attributes. Usually
327
+ # you can use this.
328
+ def open_tag
329
+ %{<#{@tag} #{attributes}>}
330
+ end
331
+ alias_method :ot, :open_tag
332
+
333
+ def close_tag
334
+ %{</#{@tag}>}
335
+ end
336
+ alias_method :ct, :close_tag
337
+
338
+ # Call this method in your view helper definition to map an option to
339
+ # an attribute. This attribute can then be rendered with attributes.
340
+ # This method takes the same options as var
341
+ def attribute(option_key, default_value=:__UNDEFINED__, opts={}, &block)
342
+ ret = _pair(option_key, default_value, opts, &block)
343
+ return if ret[2] # ignore
344
+ @attributes[ret[0]] = ret[1]
345
+ end
346
+
347
+ # returns all the JS properties specified by the property method.
348
+ def properties
349
+ keys = @_properties.keys
350
+ ret = []
351
+
352
+ # example element, if there is one
353
+ if @define
354
+ @_properties['emptyElement'] = %($sel("#resources? .#{@item_id}:1:1"))
355
+ ret << _partial_properties(['emptyElement'])
356
+ end
357
+
358
+ # outlets first
359
+ if keys.include?('outlets')
360
+ outlets = @_properties['outlets']
361
+ @_properties['outlets'] = '["' + (outlets * '","') + '"]'
362
+ ret << _partial_properties(['outlets'])
363
+ ret << _partial_properties(outlets,",\n\n")
364
+ keys.reject! { |k| outlets.include?(k) || (k == 'outlets') }
365
+ end
366
+
367
+ bindings = keys.reject { |k| !k.match(/Binding$/) }
368
+ if bindings.size > 0
369
+ ret << _partial_properties(bindings)
370
+ keys.reject! { |k| bindings.include?(k) }
371
+ end
372
+
373
+ if keys.size > 0
374
+ ret << _partial_properties(keys)
375
+ end
376
+
377
+ ret = ret * ",\n\n"
378
+ ' ' + ret.gsub("\n","\n ")
379
+ end
380
+
381
+ def _partial_properties(keys,join = ",\n")
382
+ ret = keys.map do |key|
383
+ value = @_properties[key]
384
+ next if value.nil?
385
+ %(#{key}: #{value})
386
+ end
387
+ ret * join
388
+ end
389
+
390
+ # Call this method to make a binding available or to set a default
391
+ # binding. You can use this for properties you want to allow a
392
+ # binding for but don't want to take as a fully property.
393
+ def bind(option_key, default_value=:__UNDEFINED__, opts={})
394
+ key, v, ignore = _pair(option_key, default_value, opts, false)
395
+
396
+ # always look for the option key in the bindings passed by the user.
397
+ # if present, this should override whatever we set
398
+ if found = @bindings[option_key.to_sym] || @bindings[option_key.to_s]
399
+ v = found
400
+ ignore = false
401
+ @bindings.delete option_key.to_sym
402
+ @bindings.delete option_key.to_s
403
+ end
404
+
405
+ # finally, set the binding value.
406
+ unless ignore
407
+ v = v.include?('(') ? v : prepare_for_javascript(v)
408
+ @_properties["#{key.camelize(:lower)}Binding"] = v
409
+ end
410
+
411
+ end
412
+
413
+ # Call this method in your view helper to specify a property you want
414
+ # added to the javascript declaration. This methos take the same
415
+ # options as var. Note that normally the type of value returned here
416
+ # will be marshalled into the proper type for JavaScript. If you
417
+ # provide a block to compute the property, however, the value will be
418
+ # inserted directly.
419
+ def property(option_key, default_value=:__UNDEFINED__, opts={}, &block)
420
+ ret = _pair(option_key, default_value, opts, &block)
421
+ key = ret[0].camelize(:lower)
422
+
423
+ unless ret[2] # ignore
424
+ value = ret[1]
425
+ value = prepare_for_javascript(value) unless block_given?
426
+ @_properties[key] = value
427
+ end
428
+
429
+ # also look for a matching binding and set it needed.
430
+ if v = @bindings[option_key.to_sym] || @bindings[option_key.to_s]
431
+ v = v.include?('(') ? v : prepare_for_javascript(v)
432
+ @_properties["#{key}Binding"] = v
433
+ @bindings.delete option_key.to_sym
434
+ @bindings.delete option_key.to_s
435
+ end
436
+
437
+ end
438
+
439
+ def prepare_for_javascript(value)
440
+ return 'null' if value.nil?
441
+ case value
442
+ when Array:
443
+ "[#{value.map { |v| prepare_for_javascript(v) } * ','}]"
444
+ when Hash:
445
+ items = value.map do |k,v|
446
+ [prepare_for_javascript(k),prepare_for_javascript(v)] * ': '
447
+ end
448
+ "{ #{items * ', '} }"
449
+ when FalseClass:
450
+ "false"
451
+ when TrueClass:
452
+ "true"
453
+ else
454
+ %("#{ value.to_s.gsub('"','\"').gsub("\n",'\n') }")
455
+ end
456
+ end
457
+
458
+ ### INTERNAL SUPPORT
459
+ private
460
+
461
+ def _do_render(render_item)
462
+ if render_item.nil?
463
+ ''
464
+ elsif render_item.instance_of?(Proc)
465
+ render_item.call
466
+ else
467
+ render_item
468
+ end
469
+ end
470
+
471
+ def _pair(option_key, default_value, opts, look_for_key = true)
472
+ if default_value.instance_of?(Hash)
473
+ opts = default_value
474
+ default_value = :__UNDEFINED__
475
+ end
476
+
477
+ # get the attribute value. possibly return if no value and optional.
478
+ optional = opts.has_key?(:optional) ? opts[:optional] : (default_value == :__UNDEFINED__)
479
+ if opts[:constant] == true
480
+ value = default_value
481
+ elsif look_for_key && options.has_key?(option_key.to_sym)
482
+ value = options[option_key.to_sym]
483
+ elsif look_for_key && options.has_key?(option_key.to_s)
484
+ value = options[option_key.to_s]
485
+ else
486
+ value = default_value
487
+ end
488
+
489
+
490
+ if (optional==true) && value == :__UNDEFINED__
491
+ ignore = true
492
+ value = nil
493
+ else
494
+ ignore = false
495
+ value = nil if value == :__UNDEFINED__
496
+ value = yield(value) if block_given?
497
+ end
498
+
499
+ attr_key = (opts[:key] || option_key).to_s
500
+ [attr_key, value, ignore]
501
+ end
502
+
503
+ end
504
+
505
+ class HelperState
506
+ attr_reader :name
507
+ attr_reader :parent_helper
508
+ attr_reader :prepare_block
509
+
510
+ def initialize(helper_name, opts={}, &block)
511
+ @name = helper_name
512
+ @prepare_block = block
513
+ unless helper_name == :view
514
+ @parent_helper = SproutCore::ViewHelperSupport.find_helper(opts[:wraps] || opts[:extends] || :view)
515
+ end
516
+ @extends = opts[:wraps].nil?
517
+ end
518
+
519
+ def prepare_context(render_context)
520
+ # automatically call parent helper if extends was used.
521
+ if parent_helper && @extends
522
+ parent_helper.prepare_context(render_context)
523
+ else
524
+ render_context.current_helper = self
525
+ end
526
+
527
+ render_context.instance_eval &prepare_block
528
+ render_context.current_helper = nil
529
+ end
530
+
531
+ end
532
+
533
+ extend SproutCore::Helpers::CaptureHelper
534
+ extend SproutCore::Helpers::TextHelper
535
+
536
+ # :outlet => define if you want this to be used as an outlet.
537
+ # :prototype => define if you want this to be used as a prototype.
538
+ def self.render_view(view_helper_id, item_id, opts={}, client_builder=nil, render_source=nil, &block)
539
+
540
+ # item_id is optional. If it is not a symbol or string, then generate
541
+ # an item_id
542
+ if item_id.instance_of?(Hash)
543
+ opts = item_id; item_id = nil
544
+ end
545
+ item_id = render_source.dom_id! if item_id.nil?
546
+
547
+ # create the new render context and set it.
548
+ client_builder = opts[:client] if opts[:client]
549
+ rc = RenderContext.new(view_helper_id, item_id, opts, client_builder, render_source)
550
+ hs = find_helper(view_helper_id)
551
+
552
+ # render the inner_html using the block, if one is given.
553
+ SproutCore::PageHelper.push_render_context(rc)
554
+ rc.options[:inner_html] = render_source.capture(&block) if block_given?
555
+
556
+ # now, use the helper state to prepare the render context. This will
557
+ # extract the properties from the options and setup the render procs.
558
+ hs.prepare_context(rc) unless hs.nil?
559
+
560
+ # now have the render context render the HTML content. This may also
561
+ # make changes to the other items to render.
562
+ ret = rc.render_content
563
+
564
+ SproutCore::PageHelper.pop_render_context
565
+
566
+ # get the JS. Save as an outlet or in the page.
567
+ cur_rc = opts[:current_context] || SproutCore::PageHelper.current_render_context
568
+ view_class = opts[:view] || rc.view_class
569
+
570
+ unless view_class.nil?
571
+ view_settings = { :id => item_id, :class => view_class, :properties => rc.render_view, :lazy => opts[:lazy], :outlet_path => opts[:outlet_path] }
572
+
573
+ # if an outlet item is passed, then register this as an outlet.
574
+ outlet = opts[:outlet]
575
+ if outlet.nil?
576
+ outlet = opts[:field].nil? ? !cur_rc.nil? : [opts[:field].to_s, 'field'].join('_').to_sym
577
+ end
578
+ define = opts[:define]
579
+ if outlet && cur_rc
580
+ outlet = item_id if outlet == true
581
+ cur_rc.set_outlet(outlet, view_settings)
582
+
583
+ elsif define
584
+ define = define.to_s.camelize.gsub('::','.')
585
+ SproutCore::PageHelper.set_define(define, view_settings)
586
+
587
+ # otherwise, add it to the page-wide setting.
588
+ else
589
+ prop = item_id.to_s.camelize(:lower)
590
+ SproutCore::PageHelper.set_outlet(prop, view_settings)
591
+ end
592
+ end
593
+
594
+ # get the styles, if any
595
+ styles = rc.render_styles
596
+ SproutCore::PageHelper.add_styles(styles) if styles && styles.size > 0
597
+
598
+ # done. return the generated HTML
599
+ render_source.concat(ret,block) if block_given?
600
+ return ret
601
+ end
602
+
603
+ end
604
+
605
+ module ViewHelpers
606
+
607
+ def view_helper(helper_name,opts={},&prepare_block)
608
+ hs = SproutCore::ViewHelperSupport::HelperState.new(helper_name,opts,&prepare_block)
609
+ SproutCore::ViewHelperSupport.set_helper(helper_name, hs)
610
+
611
+ ## install the helper method
612
+ eval %{
613
+ def #{helper_name}(item_id=nil, opts={}, &block)
614
+ SproutCore::ViewHelperSupport.render_view(:#{helper_name}, item_id, opts, bundle, self, &block)
615
+ end }
616
+
617
+ end
618
+
619
+ def render_page_views(prefix = 'SC')
620
+ ret = %(<script type="text/javascript">\n#{SproutCore::PageHelper.render_js(prefix, self.bundle)}\n</script>)
621
+ SproutCore::PageHelper.reset!
622
+ return ret
623
+ end
624
+
625
+ # Call this method to load a helper. This will get the file contents
626
+ # and eval it.
627
+ def require_helpers(helper_name, bundle=nil)
628
+
629
+ # save bundle for future use
630
+ unless bundle.nil?
631
+ old_helper_bundle = @helper_bundle
632
+ @helper_bundle = bundle
633
+ end
634
+
635
+ # Get all the helper paths we want to load
636
+ if helper_name.nil?
637
+ paths = @helper_bundle.helper_paths
638
+ else
639
+ paths = [@helper_bundle.helper_for(helper_name)]
640
+ end
641
+ paths.compact!
642
+
643
+ # Create list of loaded helper paths
644
+ @loaded_helpers ||= []
645
+
646
+ # If a helper path was found, load it. May require other helpers
647
+ paths.each do |path|
648
+ next if @loaded_helpers.include?(path)
649
+ @loaded_helpers << path
650
+
651
+ eval(@helper_bundle.helper_contents_for(path))
652
+ end
653
+
654
+ # restore old bundle helper.
655
+ unless bundle.nil?
656
+ @helper_bundle = old_helper_bundle
657
+ end
658
+ end
659
+
660
+ end
661
+
662
+ end