riojs 0.0.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 (270) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +24 -0
  3. data/VERSION +1 -0
  4. data/bin/rio +5 -0
  5. data/generators/rio_app/USAGE +19 -0
  6. data/generators/rio_app/rio_app_generator.rb +40 -0
  7. data/generators/rio_app/templates/app.build +10 -0
  8. data/generators/rio_app/templates/app.css +0 -0
  9. data/generators/rio_app/templates/app.js +20 -0
  10. data/generators/rio_app/templates/app_view.html.erb +19 -0
  11. data/generators/rio_app/templates/fixture.js +4 -0
  12. data/generators/rio_app/templates/rio.html.erb +18 -0
  13. data/generators/rio_app/templates/rio_controller.rb +2 -0
  14. data/generators/rio_app/templates/spec.js +7 -0
  15. data/generators/rio_component/USAGE +13 -0
  16. data/generators/rio_component/rio_component_generator.rb +16 -0
  17. data/generators/rio_component/templates/component.css +0 -0
  18. data/generators/rio_component/templates/component.js +11 -0
  19. data/generators/rio_component/templates/fixture.js +3 -0
  20. data/generators/rio_component/templates/spec.js +6 -0
  21. data/generators/rio_model/USAGE +12 -0
  22. data/generators/rio_model/rio_model_generator.rb +21 -0
  23. data/generators/rio_model/templates/fixture.js +3 -0
  24. data/generators/rio_model/templates/model.js +9 -0
  25. data/generators/rio_model/templates/spec.js +6 -0
  26. data/generators/rio_page/USAGE +14 -0
  27. data/generators/rio_page/rio_page_generator.rb +16 -0
  28. data/generators/rio_page/templates/fixture.js +3 -0
  29. data/generators/rio_page/templates/page.css +12 -0
  30. data/generators/rio_page/templates/page.js +12 -0
  31. data/generators/rio_page/templates/page.jst +64 -0
  32. data/generators/rio_page/templates/spec.js +6 -0
  33. data/generators/rio_resource/USAGE +20 -0
  34. data/generators/rio_resource/rio_resource_generator.rb +10 -0
  35. data/generators/rio_resource/templates/controller.rb +3 -0
  36. data/init.rb +4 -0
  37. data/install/config/juggernaut_hosts.yml +18 -0
  38. data/install/lib/tasks/rio.rake +1 -0
  39. data/install/script/rio_server +37 -0
  40. data/lib/rio/autospec.rb +86 -0
  41. data/lib/rio/install.rb +90 -0
  42. data/lib/rio/juggernaut.rb +212 -0
  43. data/lib/rio/path.rb +3 -0
  44. data/lib/rio/rio_compressor.rb +219 -0
  45. data/lib/rio/rio_file_controller.rb +16 -0
  46. data/lib/rio/rio_on_rails.rb +586 -0
  47. data/lib/rio/rio_proxy_controller.rb +60 -0
  48. data/lib/rio/rio_push_controller.rb +48 -0
  49. data/lib/rio/rio_routes.rb +24 -0
  50. data/lib/rio/rio_spec_controller.rb +70 -0
  51. data/lib/riojs.rb +14 -0
  52. data/lib/tasks/rio.rb +63 -0
  53. data/public/images/background-chiffon.png +0 -0
  54. data/public/images/button-gradient-overlay-down.png +0 -0
  55. data/public/images/button-gradient-overlay.png +0 -0
  56. data/public/images/icons/add.png +0 -0
  57. data/public/images/icons/error-big.png +0 -0
  58. data/public/images/icons/warning-big.png +0 -0
  59. data/public/images/rio-logo-big.png +0 -0
  60. data/public/images/rio-logo.png +0 -0
  61. data/public/images/splitter-handle-horizontal.png +0 -0
  62. data/public/images/splitter-handle-vertical.png +0 -0
  63. data/public/images/tab-bar-gradient-overlay.png +0 -0
  64. data/public/images/title-gradient-overlay.png +0 -0
  65. data/public/images/trash.gif +0 -0
  66. data/public/javascripts/components/accordion.js +144 -0
  67. data/public/javascripts/components/alert_box.js +59 -0
  68. data/public/javascripts/components/base.js +47 -0
  69. data/public/javascripts/components/box.js +63 -0
  70. data/public/javascripts/components/button.js +98 -0
  71. data/public/javascripts/components/checkbox.js +44 -0
  72. data/public/javascripts/components/container.js +265 -0
  73. data/public/javascripts/components/grid_view.js +107 -0
  74. data/public/javascripts/components/image.js +19 -0
  75. data/public/javascripts/components/input.js +171 -0
  76. data/public/javascripts/components/label.js +15 -0
  77. data/public/javascripts/components/lightbox.js +160 -0
  78. data/public/javascripts/components/link.js +43 -0
  79. data/public/javascripts/components/list_item.js +44 -0
  80. data/public/javascripts/components/list_view.js +192 -0
  81. data/public/javascripts/components/marquee.js +131 -0
  82. data/public/javascripts/components/menu.js +89 -0
  83. data/public/javascripts/components/notification.js +75 -0
  84. data/public/javascripts/components/overlay.js +134 -0
  85. data/public/javascripts/components/panel.js +146 -0
  86. data/public/javascripts/components/radio.js +46 -0
  87. data/public/javascripts/components/splitter.js +65 -0
  88. data/public/javascripts/components/tab_bar.js +64 -0
  89. data/public/javascripts/components/tab_panel.js +57 -0
  90. data/public/javascripts/components/textarea.js +223 -0
  91. data/public/javascripts/components/toggle_button.js +22 -0
  92. data/public/javascripts/components/tooltip.js +80 -0
  93. data/public/javascripts/lib/application.js +482 -0
  94. data/public/javascripts/lib/attr.js +760 -0
  95. data/public/javascripts/lib/benchmark.js +235 -0
  96. data/public/javascripts/lib/blank.html +39 -0
  97. data/public/javascripts/lib/boot.js +300 -0
  98. data/public/javascripts/lib/clipboard.js +96 -0
  99. data/public/javascripts/lib/collection_entity.js +46 -0
  100. data/public/javascripts/lib/component.js +129 -0
  101. data/public/javascripts/lib/console.js +75 -0
  102. data/public/javascripts/lib/console/apps/console.build +43 -0
  103. data/public/javascripts/lib/console/apps/console.js +28 -0
  104. data/public/javascripts/lib/console/blank.html +39 -0
  105. data/public/javascripts/lib/console/components/benchmark.js +196 -0
  106. data/public/javascripts/lib/console/components/console.js +352 -0
  107. data/public/javascripts/lib/console/components/dependencies_list.js +17 -0
  108. data/public/javascripts/lib/console/components/docs.js +66 -0
  109. data/public/javascripts/lib/console/components/playground.js +30 -0
  110. data/public/javascripts/lib/console/console.html +27 -0
  111. data/public/javascripts/lib/console/console_commands.js +287 -0
  112. data/public/javascripts/lib/console/console_commands.js.rej +21 -0
  113. data/public/javascripts/lib/console/console_mixin.js +22 -0
  114. data/public/javascripts/lib/console/docs/files.html +579 -0
  115. data/public/javascripts/lib/console/docs/index.html +323 -0
  116. data/public/javascripts/lib/console/docs/symbols/Object.html +291 -0
  117. data/public/javascripts/lib/console/docs/symbols/_global_.html +413 -0
  118. data/public/javascripts/lib/console/docs/symbols/rio.AIM.html +490 -0
  119. data/public/javascripts/lib/console/docs/symbols/rio.Application.html +841 -0
  120. data/public/javascripts/lib/console/docs/symbols/rio.Attr.html +1075 -0
  121. data/public/javascripts/lib/console/docs/symbols/rio.Binding.html +272 -0
  122. data/public/javascripts/lib/console/docs/symbols/rio.Component.html +419 -0
  123. data/public/javascripts/lib/console/docs/symbols/rio.Cookie.html +543 -0
  124. data/public/javascripts/lib/console/docs/symbols/rio.DelayedTask#initialize.html +270 -0
  125. data/public/javascripts/lib/console/docs/symbols/rio.DelayedTask.html +391 -0
  126. data/public/javascripts/lib/console/docs/symbols/rio.JsTemplate.html +271 -0
  127. data/public/javascripts/lib/console/docs/symbols/rio.Juggernaut.html +329 -0
  128. data/public/javascripts/lib/console/docs/symbols/rio.Model.html +822 -0
  129. data/public/javascripts/lib/console/docs/symbols/rio.Page.html +383 -0
  130. data/public/javascripts/lib/console/docs/symbols/rio.Template.html +328 -0
  131. data/public/javascripts/lib/console/docs/symbols/rio.Utils.html +617 -0
  132. data/public/javascripts/lib/console/docs/symbols/rio.html +506 -0
  133. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_components_base.js.html +54 -0
  134. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_application.js.html +490 -0
  135. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_attr.js.html +768 -0
  136. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_boot.js.html +308 -0
  137. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_clipboard.js.html +103 -0
  138. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_collection_entity.js.html +53 -0
  139. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_component.js.html +137 -0
  140. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_cookie.js.html +81 -0
  141. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_delayed_task.js.html +68 -0
  142. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_file.js.html +80 -0
  143. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_flash_detect.js.html +129 -0
  144. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_form.js.html +95 -0
  145. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_id.js.html +50 -0
  146. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_inflector.js.html +167 -0
  147. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_js_template.js.html +283 -0
  148. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_juggernaut.js.html +303 -0
  149. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_key_map.js.html +68 -0
  150. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_layout_manager.js.html +175 -0
  151. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_log.js.html +17 -0
  152. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_model.js.html +1074 -0
  153. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_page.js.html +246 -0
  154. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_parameters.js.html +66 -0
  155. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_protohack.js.html +305 -0
  156. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_push.js.html +12 -0
  157. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_rsh.js.html +659 -0
  158. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_swfobject.js.html +12 -0
  159. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_tag.js.html +60 -0
  160. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_template.js.html +64 -0
  161. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_theme.js.html +105 -0
  162. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_undo.js.html +142 -0
  163. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_utils.js.html +87 -0
  164. data/public/javascripts/lib/console/docs/symbols/src/public_javascripts_lib_yaml.js.html +88 -0
  165. data/public/javascripts/lib/console/file-small.png +0 -0
  166. data/public/javascripts/lib/console/green-circle.png +0 -0
  167. data/public/javascripts/lib/console/loading.gif +0 -0
  168. data/public/javascripts/lib/console/pages/console_page.js +149 -0
  169. data/public/javascripts/lib/console/pages/console_page.jst +27 -0
  170. data/public/javascripts/lib/console/red-circle.png +0 -0
  171. data/public/javascripts/lib/cookie.js +74 -0
  172. data/public/javascripts/lib/delayed_task.js +61 -0
  173. data/public/javascripts/lib/dependencies.js +76 -0
  174. data/public/javascripts/lib/environment.js +30 -0
  175. data/public/javascripts/lib/event.simulate.js +137 -0
  176. data/public/javascripts/lib/expressinstall.swf +0 -0
  177. data/public/javascripts/lib/file.js +72 -0
  178. data/public/javascripts/lib/flash_detect.js +122 -0
  179. data/public/javascripts/lib/flashembed.min.js +16 -0
  180. data/public/javascripts/lib/form.js +88 -0
  181. data/public/javascripts/lib/id.js +43 -0
  182. data/public/javascripts/lib/inflector.js +160 -0
  183. data/public/javascripts/lib/instrumenter.js +106 -0
  184. data/public/javascripts/lib/js_template.js +275 -0
  185. data/public/javascripts/lib/jslint.js +4950 -0
  186. data/public/javascripts/lib/juggernaut.js +295 -0
  187. data/public/javascripts/lib/juggernaut.swf +0 -0
  188. data/public/javascripts/lib/key_map.js +60 -0
  189. data/public/javascripts/lib/layout_manager.js +167 -0
  190. data/public/javascripts/lib/model.js +1067 -0
  191. data/public/javascripts/lib/page.js +238 -0
  192. data/public/javascripts/lib/parameters.js +59 -0
  193. data/public/javascripts/lib/png_fix.js +75 -0
  194. data/public/javascripts/lib/protohack.js +297 -0
  195. data/public/javascripts/lib/push.js +5 -0
  196. data/public/javascripts/lib/rio.build +28 -0
  197. data/public/javascripts/lib/rio_development.build +5 -0
  198. data/public/javascripts/lib/rio_lint.js +66 -0
  199. data/public/javascripts/lib/rsh.js +651 -0
  200. data/public/javascripts/lib/spec.js +545 -0
  201. data/public/javascripts/lib/spec_runner.js +242 -0
  202. data/public/javascripts/lib/swfobject.js +5 -0
  203. data/public/javascripts/lib/tag.js +52 -0
  204. data/public/javascripts/lib/undo.js +134 -0
  205. data/public/javascripts/lib/utils.js +80 -0
  206. data/public/javascripts/lib/yaml.js +80 -0
  207. data/public/javascripts/pages/playground_page.js +15 -0
  208. data/public/javascripts/prototype/builder.js +146 -0
  209. data/public/javascripts/prototype/controls.js +1004 -0
  210. data/public/javascripts/prototype/dragdrop.js +1030 -0
  211. data/public/javascripts/prototype/effects.js +1137 -0
  212. data/public/javascripts/prototype/prototype.js +4320 -0
  213. data/public/javascripts/prototype/slider.js +283 -0
  214. data/public/javascripts/prototype/sound.js +67 -0
  215. data/public/javascripts/specs/components/box_spec.js +6 -0
  216. data/public/javascripts/specs/components/checkbox_spec.js +26 -0
  217. data/public/javascripts/specs/components/container_spec.js +6 -0
  218. data/public/javascripts/specs/components/input_spec.js +71 -0
  219. data/public/javascripts/specs/components/panel_spec.js +6 -0
  220. data/public/javascripts/specs/components/radio_spec.js +40 -0
  221. data/public/javascripts/specs/fixtures/components/box.js +3 -0
  222. data/public/javascripts/specs/fixtures/components/checkbox.js +9 -0
  223. data/public/javascripts/specs/fixtures/components/container.js +3 -0
  224. data/public/javascripts/specs/fixtures/components/input.js +12 -0
  225. data/public/javascripts/specs/fixtures/components/menu.js +19 -0
  226. data/public/javascripts/specs/fixtures/components/menu_item.js +18 -0
  227. data/public/javascripts/specs/fixtures/components/radio.js +11 -0
  228. data/public/javascripts/specs/lib/application_spec.js +281 -0
  229. data/public/javascripts/specs/lib/attr_spec.js +1514 -0
  230. data/public/javascripts/specs/lib/benchmark_spec.js +361 -0
  231. data/public/javascripts/specs/lib/collection_entity_spec.js +131 -0
  232. data/public/javascripts/specs/lib/component_spec.js +86 -0
  233. data/public/javascripts/specs/lib/form_spec.js +171 -0
  234. data/public/javascripts/specs/lib/id_spec.js +21 -0
  235. data/public/javascripts/specs/lib/instrumenter_spec.js +5 -0
  236. data/public/javascripts/specs/lib/js_template_spec.js +131 -0
  237. data/public/javascripts/specs/lib/key_map_spec.js +227 -0
  238. data/public/javascripts/specs/lib/model_spec.js +2268 -0
  239. data/public/javascripts/specs/lib/parameters_spec.js +94 -0
  240. data/public/javascripts/specs/lib/spec_spec.js +943 -0
  241. data/public/javascripts/specs/lib/undo_spec.js +105 -0
  242. data/public/javascripts/specs/lib/yaml_spec.js +127 -0
  243. data/public/sounds/basso.wav +0 -0
  244. data/public/sounds/purr.wav +0 -0
  245. data/public/stylesheets/components/accordion.css +24 -0
  246. data/public/stylesheets/components/alert_box.css +35 -0
  247. data/public/stylesheets/components/box.css +0 -0
  248. data/public/stylesheets/components/button.css +39 -0
  249. data/public/stylesheets/components/checkbox.css +9 -0
  250. data/public/stylesheets/components/container.css +3 -0
  251. data/public/stylesheets/components/grid_view.css +52 -0
  252. data/public/stylesheets/components/input.css +10 -0
  253. data/public/stylesheets/components/label.css +3 -0
  254. data/public/stylesheets/components/lightbox.css +31 -0
  255. data/public/stylesheets/components/link.css +4 -0
  256. data/public/stylesheets/components/list_view.css +23 -0
  257. data/public/stylesheets/components/marquee.css +29 -0
  258. data/public/stylesheets/components/menu.css +34 -0
  259. data/public/stylesheets/components/notification.css +52 -0
  260. data/public/stylesheets/components/overlay.css +8 -0
  261. data/public/stylesheets/components/panel.css +36 -0
  262. data/public/stylesheets/components/radio.css +9 -0
  263. data/public/stylesheets/components/splitter.css +35 -0
  264. data/public/stylesheets/components/tab_bar.css +59 -0
  265. data/public/stylesheets/components/tab_panel.css +15 -0
  266. data/public/stylesheets/components/textarea.css +11 -0
  267. data/public/stylesheets/components/tooltip.css +10 -0
  268. data/public/stylesheets/console.css +151 -0
  269. data/public/stylesheets/css_reset.css +55 -0
  270. metadata +343 -0
@@ -0,0 +1,6 @@
1
+ describe(rio.pages.<%= class_name %>Page, {
2
+ beforeEach: function() {
3
+
4
+ }
5
+
6
+ });
@@ -0,0 +1,20 @@
1
+ Description:
2
+ Generates a "rio-ready" rails resource and the corresponding rio model.
3
+
4
+ Examples:
5
+
6
+ ./script/generate rio_resource post
7
+
8
+ This will create a standard rails resource with the line:
9
+
10
+ rio_resource
11
+
12
+ in the PostController
13
+
14
+
15
+ ./script/generate rio_model post title:string body:text published:boolean
16
+
17
+ creates an end-to-end model with the corresponding attributes
18
+
19
+
20
+
@@ -0,0 +1,10 @@
1
+ class RioResourceGenerator < Rails::Generator::NamedBase
2
+ def manifest
3
+ record do |m|
4
+ m.dependency "resource", [name] + @args
5
+ m.dependency "rio_model", [name] + @args
6
+
7
+ m.template "controller.rb", "app/controllers/#{file_name}s_controller.rb", :collision => :force
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ class <%= class_name %>sController < ApplicationController
2
+ rio_resource
3
+ end
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ # Placeholder to satisfy Rails and allow it to use generators.
2
+ #
3
+ # Do NOT add any require statements to this file. Doing
4
+ # so will cause Rails to load this plugin all of the time.
@@ -0,0 +1,18 @@
1
+ # You should list any juggernaut hosts here.
2
+ # You need only specify the secret key if you're using that type of authentication (see juggernaut.yml)
3
+ #
4
+ # Name: Mapping:
5
+ # :port internal push server's port
6
+ # :host internal push server's host/ip
7
+ # :public_host public push server's host/ip (accessible from external clients)
8
+ # :public_port public push server's port
9
+ # :secret_key (optional) shared secret (should map to the key specified in the push server's config)
10
+ # :environment (optional) limit host to a particular RAILS_ENV
11
+
12
+ :hosts:
13
+ - :port: 5001
14
+ :host: 127.0.0.1
15
+ :public_host: 127.0.0.1
16
+ :public_port: 5001
17
+ # :secret_key: your_secret_key
18
+ # :environment: :development
@@ -0,0 +1 @@
1
+ require "tasks/rio"
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require "rio/path"
5
+ require "rio/autospec"
6
+
7
+ JUGGERNAUT_PID_FILE = "tmp/pids/juggernaut.pid"
8
+
9
+ def kill_juggernaut
10
+ return unless File.exist?(JUGGERNAUT_PID_FILE)
11
+ system("kill #{File.read(JUGGERNAUT_PID_FILE).strip}")
12
+ system("rm #{JUGGERNAUT_PID_FILE}")
13
+ end
14
+
15
+ def start_juggernaut
16
+ kill_juggernaut
17
+ system("juggernaut -d -P #{JUGGERNAUT_PID_FILE} -c config/juggernaut.yml -l log/juggernaut.log")
18
+ end
19
+
20
+ def start_autospec
21
+ fork do
22
+ require "rio/autospec"
23
+
24
+ AutoSpec.run
25
+ end
26
+ end
27
+
28
+ def start_server
29
+ system("script/server #{ARGV}")
30
+ end
31
+
32
+ start_juggernaut
33
+ start_autospec
34
+ start_server
35
+
36
+ kill_juggernaut
37
+
@@ -0,0 +1,86 @@
1
+ ENV['RAILS_ENV'] = "development"
2
+
3
+ require 'find'
4
+ require 'rio/juggernaut'
5
+ require 'rio/path'
6
+ require 'active_support'
7
+
8
+ class AutoSpec
9
+ def self.run
10
+ self.new.run
11
+ end
12
+
13
+ attr_accessor :directories, :last_mtime
14
+
15
+ def initialize
16
+ rio_root = Rio::ROOT
17
+ js_root = File.join("public", "javascripts")
18
+ rio_js_root = File.join(rio_root, "public", "javascripts")
19
+ css_root = File.join("public", "stylesheets")
20
+ rio_css_root = File.join(rio_root, "public", "stylesheets")
21
+
22
+ self.directories = [js_root, rio_js_root, css_root, rio_css_root]
23
+ self.last_mtime = Time.now
24
+ end
25
+
26
+ def run
27
+ if (!Juggernaut)
28
+ puts "Juggernaut needs to be running for autospec to work"
29
+ return
30
+ end
31
+ begin
32
+ loop do
33
+ wait_for_changes
34
+ files = find_files_to_broadcast
35
+ self.last_mtime = files.values.map {|d| d[:mtime] }.max
36
+ broadcast_changes(files)
37
+ end
38
+ rescue Interrupt
39
+ puts
40
+ # Quit with ^C
41
+ end
42
+ end
43
+
44
+ def broadcast_changes(files)
45
+ puts "\n\nBroadcasting updates for: \n"
46
+ puts files.values.map{|d| d[:rio_name]}.join(", ")
47
+
48
+ Juggernaut.send_to_all("rio.console.touch([#{ files.values.map{|d| "'" + d[:rio_name] + "'"}.join(", ") }])")
49
+ end
50
+
51
+ def wait_for_changes
52
+ Kernel.sleep 1 until !find_files_to_broadcast.empty?
53
+ end
54
+
55
+ def find_files_to_broadcast
56
+ files = find_files
57
+ files.each do |filename, data|
58
+ files.delete(filename) unless self.last_mtime < data[:mtime]
59
+ end
60
+ files
61
+ end
62
+
63
+ def find_files
64
+ result = {}
65
+ targets = self.directories
66
+
67
+ # from ZenTest
68
+ targets.each do |target|
69
+ Find.find(target) do |f|
70
+
71
+ next if test ?d, f
72
+ next if f =~ /(swp|~|rej|orig)$/ # temporary/patch files
73
+ next if f =~ /(\.svn)/ # svn files
74
+ next if f =~ /\/\.?#/ # Emacs autosave/cvs merge files
75
+ next if f =~ /\.DS_Store/ # OSX metadata
76
+
77
+ filename = f.sub(/^\.\//, '')
78
+
79
+ rio_name = Regexp.new("^#{Regexp.escape(target)}(.*)").match(filename)[1]
80
+ result[filename] = { :mtime => File.stat(filename).mtime, :rio_name => rio_name } rescue next
81
+ end
82
+ end
83
+
84
+ return result
85
+ end
86
+ end
@@ -0,0 +1,90 @@
1
+ require 'fileutils'
2
+
3
+ module Rio
4
+ class Install
5
+ ROOT = File.join(File.dirname(__FILE__), "..", "..", "install")
6
+
7
+ def self.install!
8
+ self.print_banner
9
+ self.create_public_directories!
10
+ self.install_dependencies!
11
+ self.add_gem_require_to_environment!
12
+ self.add_juggernaut_config!
13
+ self.print_readme
14
+ end
15
+
16
+ private
17
+
18
+ def self.print_banner
19
+ puts ""
20
+ puts "Installing rio dependencies"
21
+ puts ""
22
+ end
23
+
24
+ def self.print_readme
25
+ puts ""
26
+ puts IO.read(File.join(ROOT, "..", 'README.rdoc'))
27
+ puts ""
28
+ end
29
+
30
+ def self.create_public_directories!
31
+ ["apps", "components", "lib", "models", "pages", "specs"].each do |path|
32
+ self.mkdir!(File.join("public", "javascripts", path))
33
+ end
34
+ self.mkdir!("public/stylesheets/components")
35
+ self.mkdir!("public/stylesheets/pages")
36
+ end
37
+
38
+ def self.install_dependencies!
39
+ install_items! File.join('..', 'public', 'javascripts', 'lib', 'expressinstall.swf'), File.join('public', 'javascripts', 'lib')
40
+ install_items! File.join('..', 'public', 'javascripts', 'lib', 'juggernaut.swf'), File.join('public', 'javascripts', 'lib')
41
+ install_items! File.join('..', 'public', 'javascripts', 'lib', 'environment.js'), File.join('public', 'javascripts', 'lib')
42
+ install_items! File.join('config')
43
+ install_items! File.join('lib')
44
+ install_items! File.join('script')
45
+ end
46
+
47
+ def self.add_gem_require_to_environment!
48
+ sentinel = 'Rails::Initializer.run do |config|'
49
+ gsub_file 'config/environment.rb', /(#{Regexp.escape(sentinel)})/mi do |match|
50
+ "#{match}\n config.gem \"riojs\"\n"
51
+ end
52
+ end
53
+
54
+ def self.add_juggernaut_config!
55
+ system('juggernaut -g config/juggernaut.yml')
56
+ end
57
+
58
+ def self.mkdir!(path)
59
+ puts "\tcreate #{path}" unless File.exist?(path)
60
+
61
+ FileUtils.mkdir_p(path)
62
+ end
63
+
64
+ def self.install_items!(from, to = from)
65
+
66
+ src = File.join(ROOT, from)
67
+ if File.directory?(src)
68
+ self.mkdir!(to)
69
+ Dir.entries(src).reject do |entry|
70
+ entry.match(/^\..*/)
71
+ end.each do |entry|
72
+ install_items! File.join(from, entry), File.join(to, entry)
73
+ end
74
+ else
75
+ dest_dirname = File.dirname(to)
76
+ FileUtils.mkdir_p(dest_dirname) unless File.exists?(dest_dirname)
77
+ FileUtils.cp(src, to)
78
+
79
+ installed_path = to.match(/#{File.basename(src)}$/) ? to : "#{to}/#{File.basename(src)}"
80
+ puts "\tinstall #{installed_path}"
81
+ end
82
+ end
83
+
84
+ def self.gsub_file(path, regexp, *args, &block)
85
+ content = File.read(path).gsub(regexp, *args, &block)
86
+ File.open(path, 'wb') { |file| file.write(content) }
87
+ end
88
+ end
89
+ end
90
+
@@ -0,0 +1,212 @@
1
+ require "yaml"
2
+ require "socket"
3
+ require "erb"
4
+
5
+ module Juggernaut
6
+ CONFIG = YAML::load(ERB.new(IO.read("config/juggernaut_hosts.yml")).result).freeze
7
+ CR = "\0"
8
+
9
+ class << self
10
+
11
+ def send_to_all(data)
12
+ fc = {
13
+ :command => :broadcast,
14
+ :body => data,
15
+ :type => :to_channels,
16
+ :client_id => 0,
17
+ :channels => []
18
+ }
19
+ send_data(fc)
20
+ end
21
+
22
+ def send_to_channels(data, channels)
23
+ fc = {
24
+ :command => :broadcast,
25
+ :body => data,
26
+ :type => :to_channels,
27
+ :client_id => 0,
28
+ :channels => channels
29
+ }
30
+ send_data(fc)
31
+ end
32
+ alias send_to_channel send_to_channels
33
+
34
+ def send_to_clients(data, client_ids)
35
+ fc = {
36
+ :command => :broadcast,
37
+ :body => data,
38
+ :type => :to_clients,
39
+ :client_id => 0,
40
+ :client_ids => client_ids
41
+ }
42
+ send_data(fc)
43
+ end
44
+ alias send_to_client send_to_clients
45
+
46
+ def send_to_clients_on_channels(data, client_ids, channels)
47
+ fc = {
48
+ :command => :broadcast,
49
+ :body => data,
50
+ :type => :to_clients,
51
+ :client_id => 0,
52
+ :client_ids => client_ids,
53
+ :channels => channels
54
+ }
55
+ send_data(fc)
56
+ end
57
+ alias send_to_client_on_channel send_to_clients_on_channels
58
+ alias send_to_client_on_channel send_to_clients_on_channels
59
+
60
+ def remove_channels_from_clients(client_ids, channels)
61
+ fc = {
62
+ :command => :query,
63
+ :type => :remove_channels_from_client,
64
+ :client_ids => client_ids,
65
+ :channels => channels
66
+ }
67
+ send_data(fc)
68
+ end
69
+ alias remove_channel_from_client remove_channels_from_clients
70
+ alias remove_channels_from_client remove_channels_from_clients
71
+
72
+ def remove_all_channels(channels)
73
+ fc = {
74
+ :command => :query,
75
+ :type => :remove_all_channels,
76
+ :channels => channels
77
+ }
78
+ send_data(fc)
79
+ end
80
+
81
+ def show_clients
82
+ fc = {
83
+ :command => :query,
84
+ :client_id => 0,
85
+ :type => :show_clients
86
+ }
87
+ send_data(fc, true).flatten
88
+ end
89
+
90
+ def show_connected_clients
91
+ show_clients
92
+ end
93
+
94
+ def show_client(client_id)
95
+ fc = {
96
+ :command => :query,
97
+ :type => :show_client,
98
+ :client_id => client_id
99
+ }
100
+ send_data(fc, true).flatten[0]
101
+ end
102
+
103
+ def show_clients_for_channels(channels)
104
+ fc = {
105
+ :command => :query,
106
+ :type => :show_clients_for_channels,
107
+ :channels => channels
108
+ }
109
+ send_data(fc, true).flatten
110
+ end
111
+ alias show_clients_for_channel show_clients_for_channels
112
+
113
+ def send_data(hash, response = false)
114
+ hash[:channels] = hash[:channels].to_a if hash[:channels]
115
+ hash[:client_ids] = hash[:client_ids].to_a if hash[:client_ids]
116
+
117
+ res = []
118
+ hosts.each do |address|
119
+ begin
120
+ hash[:secret_key] = address[:secret_key] if address[:secret_key]
121
+ @socket = TCPSocket.new(address[:host], address[:port])
122
+ # the \0 is to mirror flash
123
+ @socket.print(hash.to_json + CR)
124
+ @socket.flush
125
+ res << @socket.readline(CR) if response
126
+ ensure
127
+ @socket.close if @socket and !@socket.closed?
128
+ end
129
+ end
130
+ res.collect {|r| ActiveSupport::JSON.decode(r.chomp!(CR)) } if response
131
+ end
132
+
133
+ private
134
+
135
+ def hosts
136
+ CONFIG[:hosts].select {|h|
137
+ !h[:environment] or h[:environment].to_s == ENV['RAILS_ENV']
138
+ }
139
+ end
140
+
141
+ end
142
+
143
+ module RenderExtension
144
+ def self.included(base)
145
+ base.send :include, InstanceMethods
146
+ end
147
+
148
+ module InstanceMethods
149
+ # We can't protect these as ActionMailer complains
150
+ # protected
151
+
152
+ def render_with_juggernaut(options = nil, old_local_assigns={}, &block)
153
+ if options == :juggernaut or (options.is_a?(Hash) and options[:juggernaut])
154
+ add_variables_to_assigns
155
+ @template.send! :evaluate_assigns
156
+
157
+ generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(@template, &block)
158
+ render_for_juggernaut(generator.to_s, options.is_a?(Hash) ? options[:juggernaut] : nil)
159
+ else
160
+ render_without_juggernaut(options, old_local_assigns, &block)
161
+ end
162
+ end
163
+
164
+ def render_juggernaut(*args)
165
+ juggernaut_options = args.last.is_a?(Hash) ? args.pop : {}
166
+ render_for_juggernaut(render_to_string(*args), juggernaut_options)
167
+ end
168
+
169
+ def render_for_juggernaut(data, options = {})
170
+ if !options or !options.is_a?(Hash)
171
+ return Juggernaut.send_to_all(data)
172
+ end
173
+
174
+ case options[:type]
175
+ when :send_to_all
176
+ Juggernaut.send_to_all(data)
177
+ when :send_to_channels:
178
+ juggernaut_needs options, :channels
179
+ Juggernaut.send_to_channels(data, options[:channels])
180
+ when :send_to_channel:
181
+ juggernaut_needs options, :channel
182
+ Juggernaut.send_to_channel(data, options[:channel])
183
+ when :send_to_client:
184
+ juggernaut_needs options, :client_id
185
+ Juggernaut.send_to_client(data, options[:client_id])
186
+ when :send_to_clients:
187
+ juggernaut_needs options, :client_ids
188
+ Juggernaut.send_to_clients(data, options[:client_ids])
189
+ when :send_to_client_on_channel:
190
+ juggernaut_needs options, :client_id, :channels
191
+ Juggernaut.send_to_clients_on_channel(data, options[:client_id], options[:channels])
192
+ when :send_to_clients_on_channel:
193
+ juggernaut_needs options, :client_ids, :channel
194
+ Juggernaut.send_to_clients_on_channel(data, options[:client_ids], options[:channel])
195
+ when :send_to_client_on_channels:
196
+ juggernaut_needs options, :client_ids, :channel
197
+ Juggernaut.send_to_clients_on_channel(data, options[:client_id], options[:channels])
198
+ when :send_to_clients_on_channels:
199
+ juggernaut_needs options, :client_ids, :channel
200
+ Juggernaut.send_to_clients_on_channel(data, options[:client_ids], options[:channels])
201
+ end
202
+ end
203
+
204
+ def juggernaut_needs(options, *args)
205
+ args.each do |a|
206
+ raise "You must specify #{a}" unless options[a]
207
+ end
208
+ end
209
+
210
+ end
211
+ end
212
+ end