opal 0.0.1 → 0.1.0

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 (306) hide show
  1. data/.gitignore +10 -1
  2. data/.gitmodules +0 -0
  3. data/Opalfile +371 -0
  4. data/README.md +45 -0
  5. data/Rakefile +237 -34
  6. data/VERSION +1 -1
  7. data/bin/opal +13 -0
  8. data/demos/apps/browser_demo/index.html +11 -0
  9. data/demos/apps/browser_demo/lib/browser_demo.rb +31 -0
  10. data/demos/apps/simple_opal/Opalfile +13 -0
  11. data/demos/apps/simple_opal/index.html +11 -0
  12. data/demos/apps/simple_opal/lib/app_controller.rb +62 -0
  13. data/demos/apps/simple_opal/lib/main_window.rb +146 -0
  14. data/demos/browser/request/index.html +52 -0
  15. data/demos/browser/request/request.rb +48 -0
  16. data/gen/browser/__PROJECT_NAME__/index.html +10 -0
  17. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +1 -0
  18. data/lib/opal.rb +48 -3
  19. data/lib/opal/builders/base.rb +50 -0
  20. data/lib/opal/builders/css.rb +46 -0
  21. data/lib/opal/builders/javascript.rb +44 -0
  22. data/lib/opal/builders/opal.rb +79 -0
  23. data/lib/opal/builders/ruby.rb +50 -0
  24. data/lib/opal/builders/ruby/generate.rb +1851 -0
  25. data/lib/opal/builders/ruby/nodes.rb +210 -0
  26. data/lib/opal/builders/ruby/ruby.rb +916 -0
  27. data/lib/opal/builders/ruby/ruby_parser.rb +6008 -0
  28. data/lib/opal/builders/ruby/ruby_parser.rb.y +1451 -0
  29. data/lib/opal/models/build_item.rb +104 -0
  30. data/lib/opal/models/hash_struct.rb +40 -0
  31. data/lib/opal/models/project.rb +215 -0
  32. data/lib/opal/models/struct_accessors.rb +58 -0
  33. data/lib/opal/models/target.rb +176 -0
  34. data/lib/opal/opal/env/console.rb +66 -0
  35. data/lib/opal/opal/env/fs.rb +98 -0
  36. data/lib/opal/opal/env/object.rb +48 -0
  37. data/lib/opal/opal/environment.rb +139 -0
  38. data/lib/opal/opal/gen.rb +62 -0
  39. data/lib/opal/opal/opal.rb +68 -0
  40. data/lib/opal/opal/repl.rb +38 -0
  41. data/lib/opal/opalfile/dsl.rb +62 -0
  42. data/lib/opal/opalfile/opalfile.rb +133 -0
  43. data/lib/opal/opalfile/task.rb +96 -0
  44. data/lib/opal/opalfile/task_manager.rb +63 -0
  45. data/lib/opal/opalfile/task_scope.rb +52 -0
  46. data/lib/opal/rack/app_server.rb +119 -0
  47. data/opals/aristo/README.md +16 -0
  48. data/opals/browser/Opalfile +11 -0
  49. data/opals/browser/README.md +146 -0
  50. data/opals/browser/SIZZLE_LICESNSE.txt +148 -0
  51. data/opals/browser/lib/browser.rb +118 -0
  52. data/opals/browser/lib/browser/builder.rb +41 -0
  53. data/opals/browser/lib/browser/canvas_context.rb +115 -0
  54. data/opals/browser/lib/browser/dimensions.rb +50 -0
  55. data/opals/browser/lib/browser/document.rb +146 -0
  56. data/opals/browser/lib/browser/element.rb +487 -0
  57. data/opals/browser/lib/browser/element/attributes.rb +88 -0
  58. data/opals/browser/lib/browser/element/css.rb +290 -0
  59. data/opals/browser/lib/browser/element/form.rb +146 -0
  60. data/opals/browser/lib/browser/event/dom_events.rb +81 -0
  61. data/opals/browser/lib/browser/event/event.rb +177 -0
  62. data/opals/browser/lib/browser/event/trigger_events.rb +53 -0
  63. data/opals/browser/lib/browser/geometry.rb +97 -0
  64. data/opals/browser/lib/browser/json.rb +32 -0
  65. data/opals/browser/lib/browser/json_parse.js +321 -0
  66. data/opals/browser/lib/browser/request/request.rb +201 -0
  67. data/opals/browser/lib/browser/sizzle.js +1068 -0
  68. data/opals/browser/lib/browser/string.rb +42 -0
  69. data/opals/browser/lib/browser/touch.rb +37 -0
  70. data/{runtime/yaml.js → opals/browser/lib/browser/vml_context.js} +8 -8
  71. data/opals/browser/lib/browser/window.rb +36 -0
  72. data/opals/browser/spec/browser/browser_detection_spec.rb +7 -0
  73. data/opals/browser/spec/document/aref_spec.rb +110 -0
  74. data/opals/browser/spec/document/ready_spec.rb +16 -0
  75. data/opals/browser/spec/element/body_spec.rb +11 -0
  76. data/opals/browser/spec/element/clear_spec.rb +26 -0
  77. data/opals/browser/spec/element/empty_spec.rb +29 -0
  78. data/opals/browser/spec/element/has_class_spec.rb +40 -0
  79. data/opals/browser/spec/element/hidden_spec.rb +23 -0
  80. data/opals/browser/spec/element/hide_spec.rb +31 -0
  81. data/opals/browser/spec/element/remove_spec.rb +25 -0
  82. data/opals/browser/spec/element/show_spec.rb +31 -0
  83. data/opals/browser/spec/element/style_spec.rb +69 -0
  84. data/opals/browser/spec/element/toggle_spec.rb +31 -0
  85. data/opals/browser/spec/element/visible_spec.rb +23 -0
  86. data/opals/browser/spec/spec_helper.rb +1 -0
  87. data/opals/cherry_kit/Opalfile +6 -0
  88. data/opals/cherry_kit/bin/cherry_kit.rb +11 -0
  89. data/opals/cherry_kit/lib/cherry_kit.rb +29 -0
  90. data/opals/foundation/Opalfile +11 -0
  91. data/opals/foundation/bin/foundation.rb +12 -0
  92. data/opals/foundation/lib/foundation.rb +32 -0
  93. data/opals/foundation/lib/foundation/__table_view_desktop/outline_view.rb +57 -0
  94. data/opals/foundation/lib/foundation/__table_view_desktop/table_column.rb +59 -0
  95. data/opals/foundation/lib/foundation/__table_view_desktop/table_header_view.rb +34 -0
  96. data/opals/foundation/lib/foundation/__table_view_desktop/table_view.rb +304 -0
  97. data/opals/foundation/lib/foundation/controllers/array_controller.rb +54 -0
  98. data/opals/foundation/lib/foundation/controllers/controller.rb +74 -0
  99. data/opals/foundation/lib/foundation/controllers/controller_selection_proxy.rb +67 -0
  100. data/opals/foundation/lib/foundation/controllers/object_controller.rb +145 -0
  101. data/opals/foundation/lib/foundation/controllers/view.rb +40 -0
  102. data/opals/foundation/lib/foundation/core/application.rb +476 -0
  103. data/opals/foundation/lib/foundation/core/attributes.rb +146 -0
  104. data/opals/foundation/lib/foundation/core/bindings.rb +125 -0
  105. data/opals/foundation/lib/foundation/core/builder.rb +101 -0
  106. data/opals/foundation/lib/foundation/core/event.rb +112 -0
  107. data/opals/foundation/lib/foundation/core/index_path.rb +49 -0
  108. data/opals/foundation/lib/foundation/core/index_set.rb +97 -0
  109. data/opals/foundation/lib/foundation/core/notification.rb +113 -0
  110. data/opals/foundation/lib/foundation/core/observable.rb +275 -0
  111. data/opals/foundation/lib/foundation/core/observable_array.rb +30 -0
  112. data/opals/foundation/lib/foundation/core/responder.rb +85 -0
  113. data/opals/foundation/lib/foundation/core/run_loop.rb +89 -0
  114. data/opals/foundation/lib/foundation/core/touch.rb +95 -0
  115. data/opals/foundation/lib/foundation/gestures/gesture_recognizer.rb +35 -0
  116. data/opals/foundation/lib/foundation/rendering/render_context.rb +100 -0
  117. data/opals/foundation/lib/foundation/rendering/renderer.rb +137 -0
  118. data/opals/foundation/lib/foundation/rendering/root_theme.rb +77 -0
  119. data/opals/foundation/lib/foundation/rendering/root_theme/button.rb +62 -0
  120. data/opals/foundation/lib/foundation/rendering/root_theme/control.rb +72 -0
  121. data/opals/foundation/lib/foundation/rendering/root_theme/label.rb +54 -0
  122. data/opals/foundation/lib/foundation/rendering/root_theme/scroller.rb +58 -0
  123. data/opals/foundation/lib/foundation/rendering/root_theme/slider.rb +72 -0
  124. data/opals/foundation/lib/foundation/rendering/root_theme/table_view.rb +97 -0
  125. data/opals/foundation/lib/foundation/rendering/root_theme/text_field.rb +55 -0
  126. data/opals/foundation/lib/foundation/rendering/root_theme/view.rb +81 -0
  127. data/opals/foundation/lib/foundation/rendering/theme.rb +38 -0
  128. data/opals/foundation/lib/foundation/table_view/cell.rb +39 -0
  129. data/opals/foundation/lib/foundation/table_view/table.rb +171 -0
  130. data/opals/foundation/lib/foundation/views/button.rb +63 -0
  131. data/opals/foundation/lib/foundation/views/checkbox.rb +28 -0
  132. data/opals/foundation/lib/foundation/views/clip.rb +47 -0
  133. data/opals/foundation/lib/foundation/views/control.rb +199 -0
  134. data/opals/foundation/lib/foundation/views/label.rb +54 -0
  135. data/opals/foundation/lib/foundation/views/scroll.rb +294 -0
  136. data/opals/foundation/lib/foundation/views/scroll_view_desktop.rb +152 -0
  137. data/opals/foundation/lib/foundation/views/scroller.rb +54 -0
  138. data/opals/foundation/lib/foundation/views/slider.rb +93 -0
  139. data/opals/foundation/lib/foundation/views/text_field.rb +83 -0
  140. data/opals/foundation/lib/foundation/views/view.rb +426 -0
  141. data/opals/foundation/lib/foundation/windows/window.rb +191 -0
  142. data/opals/foundation/resources/button/button.css +23 -0
  143. data/{runtime/init.js → opals/foundation/resources/foundation.css} +27 -33
  144. data/opals/foundation/resources/scroll/scroll.css +22 -0
  145. data/opals/foundation/resources/scroll_view/scroll_view.css +3 -0
  146. data/opals/foundation/resources/scroll_view/scroller.css +3 -0
  147. data/opals/foundation/resources/slider/regular/slider.css +3 -0
  148. data/opals/foundation/resources/slider/slider.css +27 -0
  149. data/opals/foundation/resources/table_view/outline_view.css +3 -0
  150. data/opals/foundation/resources/table_view/table_view.css +15 -0
  151. data/opals/foundation/resources/text_field/text_field.css +71 -0
  152. data/opals/foundation/spec/spec_helper.rb +1 -0
  153. data/opals/foundation/spec/system/attributes/get_attribute_spec.rb +69 -0
  154. data/opals/foundation/spec/system/attributes/get_path_spec.rb +44 -0
  155. data/opals/foundation/spec/system/attributes/set_path_spec.rb +24 -0
  156. data/opals/foundation/spec/system/attributes/set_spec.rb +58 -0
  157. data/opals/foundation/spec/system/bindings/bindings.rb +85 -0
  158. data/opals/foundation/spec/system/key_value_binding/bind_spec.rb +43 -0
  159. data/opals/foundation/spec/system/observable/dependant_keys_spec.rb +74 -0
  160. data/opals/foundation/spec/system/observable/observe_spec.rb +292 -0
  161. data/opals/foundation/spec/system/observable/remove_observer_spec.rb +60 -0
  162. data/opals/opal/Opalfile +14 -0
  163. data/opals/opal/spec/core/array/append_spec.rb +30 -0
  164. data/opals/opal/spec/core/array/assoc_spec.rb +29 -0
  165. data/opals/opal/spec/core/array/at_spec.rb +37 -0
  166. data/opals/opal/spec/core/array/clear_spec.rb +22 -0
  167. data/opals/opal/spec/core/array/collect_bang_spec.rb +27 -0
  168. data/opals/opal/spec/core/array/collect_spec.rb +27 -0
  169. data/opals/opal/spec/core/array/compact_spec.rb +15 -0
  170. data/opals/opal/spec/core/array/concat_spec.rb +15 -0
  171. data/opals/opal/spec/core/array/constructor_spec.rb +14 -0
  172. data/opals/opal/spec/core/array/each_spec.rb +9 -0
  173. data/opals/opal/spec/core/array/element_reference_spec.rb +4 -0
  174. data/opals/opal/spec/core/array/first_spec.rb +35 -0
  175. data/opals/opal/spec/core/array/include_spec.rb +9 -0
  176. data/opals/opal/spec/core/array/map_spec.rb +31 -0
  177. data/opals/opal/spec/core/builtin_constants/builtin_constants_spec.rb +7 -0
  178. data/opals/opal/spec/core/false/and_spec.rb +10 -0
  179. data/opals/opal/spec/core/false/inspect_spec.rb +6 -0
  180. data/opals/opal/spec/core/false/or_spec.rb +10 -0
  181. data/opals/opal/spec/core/false/to_s_spec.rb +6 -0
  182. data/opals/opal/spec/core/false/xor_spec.rb +10 -0
  183. data/opals/opal/spec/core/file/join_spec.rb +19 -0
  184. data/opals/opal/spec/core/kernel/instance_eval_spec.rb +0 -0
  185. data/opals/opal/spec/core/kernel/loop_spec.rb +24 -0
  186. data/opals/opal/spec/core/kernel/raise_spec.rb +0 -0
  187. data/opals/opal/spec/core/module/attr_accessor_spec.rb +28 -0
  188. data/opals/opal/spec/core/number/lt_spec.rb +12 -0
  189. data/opals/opal/spec/core/true/and_spec.rb +10 -0
  190. data/opals/opal/spec/core/true/inspect_spec.rb +6 -0
  191. data/opals/opal/spec/core/true/or_spec.rb +10 -0
  192. data/opals/opal/spec/core/true/to_s_spec.rb +6 -0
  193. data/opals/opal/spec/core/true/xor_spec.rb +10 -0
  194. data/opals/opal/spec/fixtures/super.rb +70 -0
  195. data/opals/opal/spec/language/____temp_remove_this.rb +12 -0
  196. data/opals/opal/spec/language/and_spec.rb +62 -0
  197. data/opals/opal/spec/language/array_spec.rb +52 -0
  198. data/opals/opal/spec/language/block_spec.rb +18 -0
  199. data/opals/opal/spec/language/break_spec.rb +36 -0
  200. data/opals/opal/spec/language/case_spec.rb +103 -0
  201. data/opals/opal/spec/language/def_spec.rb +11 -0
  202. data/opals/opal/spec/language/eigenclass_spec.rb +60 -0
  203. data/opals/opal/spec/language/hash_spec.rb +29 -0
  204. data/opals/opal/spec/language/if_spec.rb +54 -0
  205. data/opals/opal/spec/language/loop_spec.rb +11 -0
  206. data/opals/opal/spec/language/metaclass_spec.rb +21 -0
  207. data/opals/opal/spec/language/method_spec.rb +64 -0
  208. data/opals/opal/spec/language/next_spec.rb +25 -0
  209. data/opals/opal/spec/language/or_spec.rb +34 -0
  210. data/opals/opal/spec/language/redo_spec.rb +24 -0
  211. data/opals/opal/spec/language/rescue_spec.rb +20 -0
  212. data/opals/opal/spec/language/return_spec.rb +47 -0
  213. data/opals/opal/spec/language/string_spec.rb +25 -0
  214. data/opals/opal/spec/language/super_spec.rb +26 -0
  215. data/opals/opal/spec/language/until_spec.rb +157 -0
  216. data/opals/opal/spec/language/while_spec.rb +163 -0
  217. data/opals/opal/spec/spec_helper.rb +5 -0
  218. data/opals/runtime/Opalfile +68 -0
  219. data/opals/runtime/README.md +12 -0
  220. data/opals/runtime/docs/debugging.md +51 -0
  221. data/opals/runtime/lib/array.rb +1516 -0
  222. data/opals/runtime/lib/basic_object.rb +49 -0
  223. data/opals/runtime/lib/class.rb +54 -0
  224. data/opals/runtime/lib/dir.rb +36 -0
  225. data/opals/runtime/lib/error.rb +49 -0
  226. data/opals/runtime/lib/false_class.rb +52 -0
  227. data/opals/runtime/lib/file.rb +79 -0
  228. data/opals/runtime/lib/hash.rb +791 -0
  229. data/opals/runtime/lib/io.rb +39 -0
  230. data/opals/runtime/lib/kernel.rb +288 -0
  231. data/opals/runtime/lib/match_data.rb +36 -0
  232. data/opals/runtime/lib/module.rb +109 -0
  233. data/opals/runtime/lib/nil_class.rb +69 -0
  234. data/opals/runtime/lib/number.rb +398 -0
  235. data/opals/runtime/lib/proc.rb +77 -0
  236. data/opals/runtime/lib/range.rb +63 -0
  237. data/opals/runtime/lib/regexp.rb +111 -0
  238. data/opals/runtime/lib/ruby.rb +30 -0
  239. data/opals/runtime/lib/string.rb +328 -0
  240. data/opals/runtime/lib/symbol.rb +40 -0
  241. data/opals/runtime/lib/top_self.rb +33 -0
  242. data/opals/runtime/lib/true_class.rb +45 -0
  243. data/opals/runtime/runtime/browser.js +287 -0
  244. data/opals/runtime/runtime/debug.js +182 -0
  245. data/opals/runtime/runtime/opal.js +1010 -0
  246. data/opals/runtime/runtime/post_opal.js +1 -0
  247. data/opals/runtime/runtime/pre_opal.js +2 -0
  248. data/opals/runtime/runtime/server_side.js +50 -0
  249. data/opals/spec/LICENSE.txt +26 -0
  250. data/opals/spec/Opalfile +5 -0
  251. data/opals/spec/bin/spec.rb +43 -0
  252. data/opals/spec/lib/spec.rb +33 -0
  253. data/opals/spec/lib/spec/dsl.rb +41 -0
  254. data/opals/spec/lib/spec/example.rb +35 -0
  255. data/opals/spec/lib/spec/example/before_and_after_hooks.rb +81 -0
  256. data/opals/spec/lib/spec/example/errors.rb +42 -0
  257. data/opals/spec/lib/spec/example/example_group.rb +37 -0
  258. data/opals/spec/lib/spec/example/example_group_factory.rb +43 -0
  259. data/opals/spec/lib/spec/example/example_group_hierarchy.rb +45 -0
  260. data/opals/spec/lib/spec/example/example_group_methods.rb +142 -0
  261. data/opals/spec/lib/spec/example/example_group_proxy.rb +41 -0
  262. data/opals/spec/lib/spec/example/example_methods.rb +73 -0
  263. data/opals/spec/lib/spec/example/example_proxy.rb +48 -0
  264. data/opals/spec/lib/spec/expectations.rb +46 -0
  265. data/opals/spec/lib/spec/expectations/errors.rb +35 -0
  266. data/opals/spec/lib/spec/expectations/fail_with.rb +37 -0
  267. data/opals/spec/lib/spec/expectations/handler.rb +48 -0
  268. data/opals/spec/lib/spec/matchers.rb +50 -0
  269. data/opals/spec/lib/spec/matchers/be.rb +26 -0
  270. data/opals/spec/lib/spec/matchers/generated_descriptions.rb +47 -0
  271. data/opals/spec/lib/spec/matchers/operator_matcher.rb +66 -0
  272. data/opals/spec/lib/spec/runner.rb +48 -0
  273. data/opals/spec/lib/spec/runner/example_group_runner.rb +71 -0
  274. data/opals/spec/lib/spec/runner/formatter/html_formatter.rb +100 -0
  275. data/opals/spec/lib/spec/runner/formatter/terminal_formatter.rb +82 -0
  276. data/opals/spec/lib/spec/runner/options.rb +63 -0
  277. data/opals/spec/lib/spec/runner/reporter.rb +123 -0
  278. data/opals/spec/resources/index.html +25 -0
  279. data/opals/spec/resources/spec.css +132 -0
  280. data/spec/cherry_kit/iseq_spec.rb +38 -0
  281. data/spec/spec_helper.rb +16 -0
  282. data/spec/vienna_spec.rb +7 -0
  283. data/yard/index.html +43 -0
  284. data/yard/style.css +765 -0
  285. metadata +312 -49
  286. data/docs/jarv.rdoc +0 -27
  287. data/runtime/array.js +0 -153
  288. data/runtime/class.js +0 -469
  289. data/runtime/compar.js +0 -73
  290. data/runtime/dir.js +0 -115
  291. data/runtime/enum.js +0 -74
  292. data/runtime/file.js +0 -165
  293. data/runtime/gem.js +0 -241
  294. data/runtime/hash.js +0 -181
  295. data/runtime/load.js +0 -251
  296. data/runtime/module.js +0 -98
  297. data/runtime/number.js +0 -148
  298. data/runtime/object.js +0 -522
  299. data/runtime/opal.js +0 -200
  300. data/runtime/parse.js +0 -2218
  301. data/runtime/range.js +0 -56
  302. data/runtime/re.js +0 -91
  303. data/runtime/string.js +0 -199
  304. data/runtime/variable.js +0 -184
  305. data/runtime/vm.js +0 -1150
  306. data/tasks/build.rb +0 -16
@@ -0,0 +1,104 @@
1
+ #
2
+ # build_item.rb
3
+ # vienna
4
+ #
5
+ # Created by Adam Beynon.
6
+ # Copyright 2010 Adam Beynon.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #
26
+
27
+ require File.join(File.dirname(__FILE__), 'struct_accessors')
28
+
29
+ module Vienna
30
+
31
+ # An item to be build (ruby, css, image etc)
32
+ class BuildItem
33
+
34
+ include StructAccessors
35
+
36
+ # target
37
+ attr_reader :target
38
+
39
+ def initialize(target, options={})
40
+ # puts "making a new build item with filename: #{options[:filename]}"
41
+ @target = target
42
+ merge! options
43
+ end
44
+
45
+ # Should this item be included in the build. Items might be to start, but
46
+ # might then be hidden. e.g, ruby files are first put in a copy stage, but
47
+ # then they are changed to a 'build:ruby' stage instead, so the inital item
48
+ # will become hidden.
49
+ def hidden?
50
+ self[:hidden] ||= false
51
+ end
52
+
53
+ # For use with above: actually sets builditem to be hidden
54
+ def hide!
55
+ self[:hidden] = true
56
+ self
57
+ end
58
+
59
+ # This is called whenever the build item is created. Uses 'entry:prepare'
60
+ # task
61
+ def prepare!
62
+ opalfile = target.opalfile
63
+ if opalfile.has_task? 'build_item:prepare'
64
+ opalfile.invoke 'build_item:prepare',
65
+ :build_item => self,
66
+ :target => target,
67
+ :config => target.config,
68
+ :project => target.project
69
+ end
70
+ self
71
+ end
72
+
73
+ # Build the item
74
+ def build!
75
+ build_to build_path
76
+ end
77
+
78
+ def stage!
79
+ build_to staging_path
80
+ end
81
+
82
+ def build_to(dst_path)
83
+ raise "no build task defined for #{filename}" if build_task.nil?
84
+
85
+ # find build task
86
+ opalfile = target.opalfile
87
+ if !opalfile.has_task? build_task
88
+ raise "Could not build #{filename}: no task defined (#{build_task})"
89
+ end
90
+
91
+ opalfile.invoke build_task,
92
+ :build_item => self,
93
+ :target => target,
94
+ :config => target.config,
95
+ :project => target.project,
96
+ :src_path => source_path,
97
+ :src_paths => source_paths,
98
+ :dst_path => dst_path
99
+
100
+ self
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,40 @@
1
+ #
2
+ # hash_struct.rb
3
+ # vienna
4
+ #
5
+ # Created by Adam Beynon.
6
+ # Copyright 2010 Adam Beynon.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #
26
+
27
+ require File.join(File.dirname(__FILE__), 'struct_accessors')
28
+
29
+ module Vienna
30
+
31
+ class HashStruct
32
+
33
+ include StructAccessors
34
+
35
+ def initialize(hash)
36
+ merge! hash
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,215 @@
1
+ #
2
+ # project.rb
3
+ # vienna
4
+ #
5
+ # Created by Adam Beynon.
6
+ # Copyright 2010 Adam Beynon.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #
26
+
27
+ module Vienna
28
+
29
+ class Project
30
+
31
+ # full path to project
32
+ attr_reader :project_root
33
+
34
+ # build options
35
+ attr_reader :build_options
36
+
37
+ # the main target
38
+ attr_reader :main_target
39
+
40
+ def self.load project_path
41
+ if File.exists? File.join(project_path, 'Opalfile')
42
+ return new(project_path)
43
+ end
44
+ nil
45
+ end
46
+
47
+ BASE_OPALFILE = File.join(Vienna::PATH, 'Opalfile')
48
+
49
+ def initialize(project_root, build_options={})
50
+
51
+ # unless File.exists? File.join(project_root, 'Opalfile')
52
+ # raise "Not a valid project (no Opalfile)"
53
+ # end
54
+
55
+ @opalfile = nil
56
+ @config = nil
57
+
58
+ @build_options = build_options
59
+ @project_root = project_root
60
+ @targets = nil
61
+ # lets begin by loading our root opalfile
62
+ # @opalfile = Opalfile.new(BASE_OPALFILE)
63
+ opalfile
64
+ # puts "\n\n\n\n######################################## ENV"
65
+ # p Opalfile.env
66
+ # puts "######################################## TASKS"
67
+ # puts @opalfile.tasks.each_key.map { |key| key }
68
+ # puts "######################################## DONE\n\n\n\n"
69
+ end
70
+
71
+ def project_name
72
+ @project_name ||= File.basename @project_root
73
+ end
74
+
75
+ def inspect
76
+ "#<Vienna::Project #{File.basename(project_root)}>"
77
+ end
78
+
79
+ # Opalfile is a build task setup for each bundle, app, opal or theme. It
80
+ # allows the developer to setup custom build options and processes which
81
+ # can depend on the environment etc. Inspired by Buildfiles in Sproutcore.
82
+ def opalfile
83
+ return @opalfile if @opalfile
84
+ Opalfile.root_opalfile = BASE_OPALFILE
85
+ @opalfile = Opalfile.root_opalfile
86
+ end
87
+
88
+ def config
89
+ @config
90
+ # ...
91
+ end
92
+
93
+ # Add some options to main config
94
+ def options(options={})
95
+ # options.each do |key, value|
96
+ opalfile.config project_name.to_sym, options
97
+ # end
98
+ end
99
+
100
+ # Add a new referenced target (target_name) from the given target. The given
101
+ # target is used as it might have a sub-vendor or sub-theme where the given
102
+ # target is actually stored.
103
+ def require_target(target_name, from_target)
104
+
105
+ end
106
+
107
+ # Every target. A target is a opal, theme, or application. Recursively find
108
+ # if needed.
109
+ def targets
110
+ # If we have already found them, just return them
111
+ return @targets if @targets
112
+ # hash of targets: target name to target instance
113
+ @targets = {}
114
+ # first we must add ourselves as a target - default is opal type
115
+ # application
116
+ # puts "need to add self as target"
117
+ target = add_target :target_name => File.basename(project_root),
118
+ :target_type => :opal,
119
+ :target_root => project_root,
120
+ :project => self,
121
+ :main_target => true
122
+
123
+ @main_target = target
124
+ # find all targets for this project_root with given config
125
+ find_targets_for target, config
126
+
127
+ # puts "finished finding targets"
128
+ # targets
129
+ @targets
130
+ end
131
+
132
+ # Find all targets relative to the given root_path with the given config
133
+ def find_targets_for the_target, config
134
+ # puts "looking for targets..... #{the_target.target_name} .. #{@targets.inspect}"
135
+ # p the_target.opalfile
136
+ # puts "looking for targets"
137
+ # puts the_target.required.inspect
138
+ # puts "down to here"
139
+ the_target.required.each do |target|
140
+ # if we already know about the target, skip it
141
+ next if @targets.has_key?(target.to_s)
142
+ # currently only look in our own opals/ root
143
+ try_path = File.join(Vienna::PATH, 'opals', target.to_s)
144
+
145
+ if File.exist?(try_path) and File.directory?(try_path)
146
+ # found target, so add it
147
+ target = add_target :target_name => target.to_s,
148
+ :target_type => :opal,
149
+ :target_root => try_path,
150
+ :project => self
151
+ # search this target for all dependencies
152
+ find_targets_for target, config
153
+ else
154
+ raise "Could not find required opal #{target}. (Required in #{the_target.target_name})"
155
+ end
156
+ end
157
+
158
+ # puts "and all the way to here"
159
+
160
+ end
161
+
162
+ # add a target
163
+ def add_target(options)
164
+ targets[options[:target_name]] = Target.new options
165
+ end
166
+
167
+ def clean!
168
+ main_target.opalfile.invoke 'build:clean',
169
+ :project => self,
170
+ :target => main_target,
171
+ :config => main_target.config
172
+ end
173
+
174
+ def build!()
175
+ # get main target and put it at the end
176
+ all_targets = targets.each_value.to_a
177
+
178
+ # puts "all of our targets:"
179
+
180
+ # puts all_targets
181
+
182
+ all_targets.push all_targets.slice!(all_targets.index @main_target)
183
+ all_targets.each do |target|
184
+
185
+ # puts "\n############################################################"
186
+ # puts "# #{target.target_name}"
187
+ # puts "############################################################\n"
188
+ # prepare
189
+ target.prepare!
190
+ # go through and build each to get list of build_items
191
+ target.build!
192
+ end
193
+
194
+ # only once we have built all our targets do we run the pacakge command
195
+ # because some reliances will mean opal etc are not available until every
196
+ # opal is built
197
+ # puts "main target.."
198
+ main_target.opalfile.invoke 'build:package',
199
+ :project => self,
200
+ :target => main_target,
201
+ :config => main_target.config
202
+ end
203
+
204
+ # def get the build mode
205
+ def build_mode
206
+ @build_options[:build_mode] || :debug
207
+ end
208
+
209
+ # build root. by default this is the root of the main target, but can be
210
+ # custom
211
+ def build_root
212
+ @build_options[:build_root] || @main_target.target_root
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,58 @@
1
+ #
2
+ # struct_accessors.rb
3
+ # vienna
4
+ #
5
+ # Created by Adam Beynon.
6
+ # Copyright 2010 Adam Beynon.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #
26
+
27
+ module Vienna
28
+
29
+ module StructAccessors
30
+
31
+ def method_missing(accessor_name, *args)
32
+ accessor_name = accessor_name.to_s
33
+
34
+ # accessor =
35
+ if accessor_name =~ /=$/
36
+ accessor_name = accessor_name[0..-2]
37
+ self[accessor_name] = args[0]
38
+ else # acessor
39
+ self[accessor_name]
40
+ end
41
+ end
42
+
43
+ def merge!(options)
44
+ @__struct_accessors__ ||= {}
45
+ @__struct_accessors__.merge! options
46
+ self
47
+ end
48
+
49
+ def [](key)
50
+ @__struct_accessors__[key.to_sym]
51
+ end
52
+
53
+ def []=(key, value)
54
+ @__struct_accessors__[key.to_sym] = value
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,176 @@
1
+ #
2
+ # target.rb
3
+ # vienna
4
+ #
5
+ # Created by Adam Beynon.
6
+ # Copyright 2010 Adam Beynon.
7
+ #
8
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ # of this software and associated documentation files (the "Software"), to deal
10
+ # in the Software without restriction, including without limitation the rights
11
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ # copies of the Software, and to permit persons to whom the Software is
13
+ # furnished to do so, subject to the following conditions:
14
+ #
15
+ # The above copyright notice and this permission notice shall be included in
16
+ # all copies or substantial portions of the Software.
17
+ #
18
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ # THE SOFTWARE.
25
+ #
26
+
27
+ require File.join(File.dirname(__FILE__), 'struct_accessors')
28
+
29
+ module Vienna
30
+
31
+ class Target
32
+
33
+ include StructAccessors
34
+
35
+ attr_reader :target_name, :target_type, :target_root, :project
36
+
37
+ def initialize(opts={})
38
+ @target_name = opts.delete :target_name
39
+ @target_root = opts.delete :target_root
40
+ @target_type = opts.delete :target_type
41
+ @project = opts.delete :project
42
+ @build_items = []
43
+ @main_target = opts.delete(:main_target) || false
44
+ @required = nil
45
+ merge! opts
46
+
47
+ # get opalfile all setup
48
+ opalfile
49
+ # puts "\n\n\n\n######################################## ENV"
50
+ # p Opalfile.env
51
+ # puts "######################################## TASKS"
52
+ # puts @opalfile.tasks.each_key.map { |key| key }
53
+ # puts "######################################## DONE\n\n\n\n"
54
+ end
55
+
56
+ # builditems.. on;y those that are not hidden
57
+ def build_items
58
+ @build_items.reject { |e| e.hidden? }
59
+ end
60
+
61
+ # is this the main target
62
+ def main_target?
63
+ @main_target
64
+ end
65
+
66
+ def inspect
67
+ "#<Target name=#{target_name}, type=#{target_type}>"
68
+ end
69
+
70
+ def opalfile
71
+ @opalfile ||= Opalfile.new File.join(target_root, 'Opalfile')
72
+ end
73
+
74
+ # An array of the required items from the opal file
75
+ def required
76
+ return @required if @required
77
+ # puts "checking required"
78
+ req = config[:required]
79
+ # puts "did check rrquired"
80
+ # also make sure we include opal: bad things will happen if we dont
81
+ @required = case req
82
+ when Array
83
+ unless req.include? :opal
84
+ req << :opal
85
+ end
86
+
87
+ req
88
+ when Symbol
89
+ if req == :opal
90
+ [req]
91
+ else
92
+ [req, :opal]
93
+ end
94
+ else
95
+ # browser if we do not specify anything..
96
+ [:opal, :browser]
97
+ end
98
+ end
99
+
100
+ def config
101
+ @config ||= HashStruct.new(Opalfile.config_for(project.build_mode, target_name.to_sym))
102
+ end
103
+
104
+ def prepare!
105
+ # return
106
+ # return @self if @is_prepared
107
+ # puts "===== preparing #{target_name}"
108
+ # @is_prepared = true
109
+ # reset build items
110
+ @build_items = []
111
+ if opalfile.has_task? 'target:prepare'
112
+ opalfile.invoke 'target:prepare', :target => self,
113
+ :project => project,
114
+ :config => config
115
+ end
116
+ self
117
+ end
118
+
119
+ def build!
120
+ # return
121
+ if opalfile.has_task? 'target:build'
122
+ opalfile.invoke 'target:build', :target => self,
123
+ :project => project,
124
+ :config => config
125
+ end
126
+
127
+ # puts "################################################ build_items"
128
+
129
+ # at this point we will have a list of all our actual build items.. so go
130
+ # build them
131
+ build_items.each do |item|
132
+ # p item
133
+ item.build!
134
+ end
135
+ self
136
+ end
137
+
138
+ # find the build item with the given filename
139
+ def build_item_for(filename)
140
+ @build_items.find do |item|
141
+ item.filename == filename
142
+ end
143
+ end
144
+
145
+ # Add an item to be built. The path is relative to the target root.
146
+ def add_build_item(item_path, options={})
147
+ options[:filename] = item_path
148
+ @build_items << (res = BuildItem.new(self, options)).prepare!
149
+ res
150
+ end
151
+
152
+ # add transform (i.e. not just a copy file stage, but we need to compile it
153
+ # etc)
154
+ def add_transform(build_item, options={})
155
+ # puts "adding transform"
156
+ @build_items << (res = BuildItem.new(self, options)).prepare!
157
+ build_item.hide!
158
+ end
159
+
160
+ def add_composite(filename, options={})
161
+ options[:filename] = filename
162
+ options[:source_items] ||= []
163
+ options[:composite] = true
164
+
165
+ options[:build_path] ||= File.join(build_root, filename)
166
+ options[:staging_path] ||= File.join(staging_root, filename)
167
+
168
+ options[:target] ||= self
169
+ options[:project] ||= self
170
+
171
+ @build_items << (res = BuildItem.new(self, options)).prepare!
172
+ res.source_items.each { |item| item.hide! }
173
+ res
174
+ end
175
+ end
176
+ end