redcar 0.2.9dev

Sign up to get free protection for your applications and to get access to all the features.
Files changed (600) hide show
  1. data/CHANGES +64 -0
  2. data/LICENSE +32 -0
  3. data/README.md +64 -0
  4. data/ROADMAP.md +69 -0
  5. data/Rakefile +223 -0
  6. data/bin/redcar +6 -0
  7. data/config/default.yaml +15 -0
  8. data/ext/extconf.rb +18 -0
  9. data/lib/freebase2/README.txt +47 -0
  10. data/lib/freebase2/bin/default.yaml +15 -0
  11. data/lib/freebase2/bin/install.rb +42 -0
  12. data/lib/freebase2/bin/run.rb +48 -0
  13. data/lib/freebase2/lib/freebase/configuration.rb +535 -0
  14. data/lib/freebase2/lib/freebase/core.rb +197 -0
  15. data/lib/freebase2/lib/freebase/databus.rb +1128 -0
  16. data/lib/freebase2/lib/freebase/freebase.rb +60 -0
  17. data/lib/freebase2/lib/freebase/logger.rb +117 -0
  18. data/lib/freebase2/lib/freebase/plugin.rb +384 -0
  19. data/lib/freebase2/lib/freebase/properties.rb +130 -0
  20. data/lib/freebase2/lib/freebase/readers.rb +321 -0
  21. data/lib/freebase2/notes +61 -0
  22. data/lib/freebase2/plugins/raa_webrick/httpd.rb +125 -0
  23. data/lib/freebase2/plugins/raa_webrick/plugin.yaml +7 -0
  24. data/lib/freebase2/plugins/raa_webrick/web_root/test.html +5 -0
  25. data/lib/freebase2/plugins/raa_webrick/webserver.yaml +6 -0
  26. data/lib/freebase2/plugins/raa_xmlrpc4r/plugin.xml +8 -0
  27. data/lib/freebase2/plugins/raa_xmlrpc4r/rpcd.rb +54 -0
  28. data/lib/freebase2/regress/README +1 -0
  29. data/lib/little_plugger/History.txt +20 -0
  30. data/lib/little_plugger/Rakefile +34 -0
  31. data/lib/little_plugger/lib/little-plugger.rb +323 -0
  32. data/lib/little_plugger/spec/little-plugger_spec.rb +26 -0
  33. data/lib/little_plugger/spec/spec_helper.rb +16 -0
  34. data/lib/logging/History.txt +240 -0
  35. data/lib/logging/Rakefile +37 -0
  36. data/lib/logging/data/bad_logging_1.rb +13 -0
  37. data/lib/logging/data/bad_logging_2.rb +21 -0
  38. data/lib/logging/data/logging.rb +42 -0
  39. data/lib/logging/data/logging.yaml +63 -0
  40. data/lib/logging/data/simple_logging.rb +13 -0
  41. data/lib/logging/examples/appenders.rb +47 -0
  42. data/lib/logging/examples/classes.rb +41 -0
  43. data/lib/logging/examples/consolidation.rb +83 -0
  44. data/lib/logging/examples/formatting.rb +51 -0
  45. data/lib/logging/examples/hierarchies.rb +73 -0
  46. data/lib/logging/examples/layouts.rb +48 -0
  47. data/lib/logging/examples/loggers.rb +29 -0
  48. data/lib/logging/examples/names.rb +43 -0
  49. data/lib/logging/examples/simple.rb +17 -0
  50. data/lib/logging/lib/logging.rb +501 -0
  51. data/lib/logging/lib/logging/appender.rb +251 -0
  52. data/lib/logging/lib/logging/appenders.rb +131 -0
  53. data/lib/logging/lib/logging/appenders/buffering.rb +168 -0
  54. data/lib/logging/lib/logging/appenders/console.rb +60 -0
  55. data/lib/logging/lib/logging/appenders/email.rb +75 -0
  56. data/lib/logging/lib/logging/appenders/file.rb +58 -0
  57. data/lib/logging/lib/logging/appenders/growl.rb +197 -0
  58. data/lib/logging/lib/logging/appenders/io.rb +69 -0
  59. data/lib/logging/lib/logging/appenders/rolling_file.rb +293 -0
  60. data/lib/logging/lib/logging/appenders/string_io.rb +68 -0
  61. data/lib/logging/lib/logging/appenders/syslog.rb +194 -0
  62. data/lib/logging/lib/logging/config/configurator.rb +188 -0
  63. data/lib/logging/lib/logging/config/yaml_configurator.rb +191 -0
  64. data/lib/logging/lib/logging/layout.rb +117 -0
  65. data/lib/logging/lib/logging/layouts.rb +47 -0
  66. data/lib/logging/lib/logging/layouts/basic.rb +32 -0
  67. data/lib/logging/lib/logging/layouts/parseable.rb +211 -0
  68. data/lib/logging/lib/logging/layouts/pattern.rb +311 -0
  69. data/lib/logging/lib/logging/log_event.rb +45 -0
  70. data/lib/logging/lib/logging/logger.rb +503 -0
  71. data/lib/logging/lib/logging/repository.rb +232 -0
  72. data/lib/logging/lib/logging/root_logger.rb +61 -0
  73. data/lib/logging/lib/logging/stats.rb +278 -0
  74. data/lib/logging/lib/logging/utils.rb +153 -0
  75. data/lib/logging/lib/spec/logging_helper.rb +34 -0
  76. data/lib/logging/test/appenders/test_buffered_io.rb +176 -0
  77. data/lib/logging/test/appenders/test_console.rb +66 -0
  78. data/lib/logging/test/appenders/test_email.rb +170 -0
  79. data/lib/logging/test/appenders/test_file.rb +95 -0
  80. data/lib/logging/test/appenders/test_growl.rb +127 -0
  81. data/lib/logging/test/appenders/test_io.rb +129 -0
  82. data/lib/logging/test/appenders/test_rolling_file.rb +200 -0
  83. data/lib/logging/test/appenders/test_syslog.rb +194 -0
  84. data/lib/logging/test/benchmark.rb +86 -0
  85. data/lib/logging/test/config/test_configurator.rb +70 -0
  86. data/lib/logging/test/config/test_yaml_configurator.rb +40 -0
  87. data/lib/logging/test/layouts/test_basic.rb +42 -0
  88. data/lib/logging/test/layouts/test_json.rb +112 -0
  89. data/lib/logging/test/layouts/test_pattern.rb +198 -0
  90. data/lib/logging/test/layouts/test_yaml.rb +121 -0
  91. data/lib/logging/test/setup.rb +44 -0
  92. data/lib/logging/test/test_appender.rb +152 -0
  93. data/lib/logging/test/test_consolidate.rb +46 -0
  94. data/lib/logging/test/test_layout.rb +110 -0
  95. data/lib/logging/test/test_log_event.rb +80 -0
  96. data/lib/logging/test/test_logger.rb +699 -0
  97. data/lib/logging/test/test_logging.rb +267 -0
  98. data/lib/logging/test/test_repository.rb +158 -0
  99. data/lib/logging/test/test_root_logger.rb +81 -0
  100. data/lib/logging/test/test_stats.rb +274 -0
  101. data/lib/logging/test/test_utils.rb +116 -0
  102. data/lib/redcar.rb +12 -0
  103. data/lib/redcar/boot.rb +105 -0
  104. data/lib/redcar/install.rb +97 -0
  105. data/lib/redcar/plist.rb +83 -0
  106. data/lib/redcar/ruby_extensions.rb +14 -0
  107. data/lib/redcar/runner.rb +32 -0
  108. data/lib/redcar/usage.rb +24 -0
  109. data/lib/regex_replace.rb +220 -0
  110. data/plugins/application/features/main_menu.feature +9 -0
  111. data/plugins/application/features/main_window.feature +8 -0
  112. data/plugins/application/features/step_definitions/dialog_steps.rb +5 -0
  113. data/plugins/application/features/step_definitions/menu_steps.rb +21 -0
  114. data/plugins/application/features/step_definitions/window_steps.rb +4 -0
  115. data/plugins/application/features/support/env.rb +32 -0
  116. data/plugins/application/lib/application.rb +128 -0
  117. data/plugins/application/lib/application/assets/file.png +0 -0
  118. data/plugins/application/lib/application/command.rb +70 -0
  119. data/plugins/application/lib/application/command/executor.rb +46 -0
  120. data/plugins/application/lib/application/command/history.rb +49 -0
  121. data/plugins/application/lib/application/dialog.rb +15 -0
  122. data/plugins/application/lib/application/menu.rb +27 -0
  123. data/plugins/application/lib/application/menu/builder.rb +51 -0
  124. data/plugins/application/lib/application/menu/item.rb +26 -0
  125. data/plugins/application/lib/application/notebook.rb +77 -0
  126. data/plugins/application/lib/application/sensitive.rb +57 -0
  127. data/plugins/application/lib/application/sensitivity.rb +78 -0
  128. data/plugins/application/lib/application/tab.rb +47 -0
  129. data/plugins/application/lib/application/tab/command.rb +5 -0
  130. data/plugins/application/lib/application/window.rb +139 -0
  131. data/plugins/application/plugin.yaml +11 -0
  132. data/plugins/application/spec/application/application_spec.rb +23 -0
  133. data/plugins/application/spec/application/command/executor_spec.rb +67 -0
  134. data/plugins/application/spec/application/command/history_spec.rb +49 -0
  135. data/plugins/application/spec/application/command_spec.rb +59 -0
  136. data/plugins/application/spec/application/controllers/application_controller.rb +4 -0
  137. data/plugins/application/spec/application/controllers/notebook_controller.rb +4 -0
  138. data/plugins/application/spec/application/controllers/window_controller.rb +5 -0
  139. data/plugins/application/spec/application/menu/builder_spec.rb +57 -0
  140. data/plugins/application/spec/application/menu/menu_item_spec.rb +17 -0
  141. data/plugins/application/spec/application/menu_spec.rb +36 -0
  142. data/plugins/application/spec/application/notebook_spec.rb +26 -0
  143. data/plugins/application/spec/application/sensitive_spec.rb +156 -0
  144. data/plugins/application/spec/application/window_spec.rb +24 -0
  145. data/plugins/application/spec/spec_helper.rb +7 -0
  146. data/plugins/application_swt/lib/application_swt.rb +70 -0
  147. data/plugins/application_swt/lib/application_swt/cucumber_patches.rb +118 -0
  148. data/plugins/application_swt/lib/application_swt/cucumber_runner.rb +25 -0
  149. data/plugins/application_swt/lib/application_swt/dialog_adapter.rb +23 -0
  150. data/plugins/application_swt/lib/application_swt/event_loop.rb +27 -0
  151. data/plugins/application_swt/lib/application_swt/menu.rb +59 -0
  152. data/plugins/application_swt/lib/application_swt/menu/binding_translator.rb +39 -0
  153. data/plugins/application_swt/lib/application_swt/notebook.rb +129 -0
  154. data/plugins/application_swt/lib/application_swt/notebook/drag_and_drop_listener.rb +71 -0
  155. data/plugins/application_swt/lib/application_swt/swt/grid_data.rb +11 -0
  156. data/plugins/application_swt/lib/application_swt/swt_wrapper.rb +106 -0
  157. data/plugins/application_swt/lib/application_swt/tab.rb +58 -0
  158. data/plugins/application_swt/lib/application_swt/window.rb +142 -0
  159. data/plugins/application_swt/plugin.yaml +11 -0
  160. data/plugins/application_swt/spec/application_swt/menu/binding_translator_spec.rb +45 -0
  161. data/plugins/application_swt/spec/application_swt/menu_spec.rb +7 -0
  162. data/plugins/application_swt/spec/spec_helper.rb +18 -0
  163. data/plugins/application_swt/vendor/swt/linux/dummy +1 -0
  164. data/plugins/application_swt/vendor/swt/osx/dummy +1 -0
  165. data/plugins/application_swt/vendor/swt/osx64/dummy +1 -0
  166. data/plugins/application_swt/vendor/swt/win32/dummy +1 -0
  167. data/plugins/core/lib/core.rb +29 -0
  168. data/plugins/core/lib/core/controller.rb +5 -0
  169. data/plugins/core/lib/core/gui.rb +87 -0
  170. data/plugins/core/lib/core/logger.rb +25 -0
  171. data/plugins/core/lib/core/model.rb +9 -0
  172. data/plugins/core/lib/core/observable.rb +111 -0
  173. data/plugins/core/lib/core/plugin.rb +5 -0
  174. data/plugins/core/plugin.yaml +7 -0
  175. data/plugins/core/spec/core/gui_spec.rb +27 -0
  176. data/plugins/core/spec/core/observable_spec.rb +104 -0
  177. data/plugins/core/spec/spec_helper.rb +4 -0
  178. data/plugins/edit_view/features/multiple_notebooks.feature +77 -0
  179. data/plugins/edit_view/features/multiple_windows.feature +48 -0
  180. data/plugins/edit_view/features/new_tab.feature +12 -0
  181. data/plugins/edit_view/features/step_definitions/key_steps.rb +48 -0
  182. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +60 -0
  183. data/plugins/edit_view/features/step_definitions/tab_steps.rb +55 -0
  184. data/plugins/edit_view/features/step_definitions/window_steps.rb +80 -0
  185. data/plugins/edit_view/features/support/env.rb +66 -0
  186. data/plugins/edit_view/lib/edit_view.rb +76 -0
  187. data/plugins/edit_view/lib/edit_view/command.rb +6 -0
  188. data/plugins/edit_view/lib/edit_view/document.rb +63 -0
  189. data/plugins/edit_view/lib/edit_view/edit_tab.rb +29 -0
  190. data/plugins/edit_view/lib/edit_view/mirror.rb +42 -0
  191. data/plugins/edit_view/plugin.yaml +14 -0
  192. data/plugins/edit_view/spec/edit_view/document_spec.rb +77 -0
  193. data/plugins/edit_view/spec/spec_helper.rb +4 -0
  194. data/plugins/edit_view_swt/lib/edit_view_swt.rb +170 -0
  195. data/plugins/edit_view_swt/lib/edit_view_swt/document.rb +31 -0
  196. data/plugins/edit_view_swt/lib/edit_view_swt/edit_tab.rb +33 -0
  197. data/plugins/edit_view_swt/plugin.yaml +14 -0
  198. data/plugins/edit_view_swt/vendor/dummy +1 -0
  199. data/plugins/edit_view_swt/vendor/java-mateview.rb +12 -0
  200. data/plugins/project/features/fixtures/winter.txt +1 -0
  201. data/plugins/project/features/open_and_save_files.feature +22 -0
  202. data/plugins/project/features/step_definitions/file_steps.rb +24 -0
  203. data/plugins/project/features/support/env.rb +15 -0
  204. data/plugins/project/lib/project.rb +79 -0
  205. data/plugins/project/lib/project/dir_mirror.rb +53 -0
  206. data/plugins/project/lib/project/file_mirror.rb +70 -0
  207. data/plugins/project/plugin.yaml +12 -0
  208. data/plugins/project/spec/project/dir_mirror_spec.rb +76 -0
  209. data/plugins/project/spec/project/file_mirror_spec.rb +78 -0
  210. data/plugins/project/spec/spec_helper.rb +4 -0
  211. data/plugins/redcar/plugin.yaml +20 -0
  212. data/plugins/redcar/redcar.rb +166 -0
  213. data/plugins/repl/lib/repl.rb +44 -0
  214. data/plugins/repl/lib/repl/internal_mirror.rb +98 -0
  215. data/plugins/repl/plugin.yaml +12 -0
  216. data/plugins/repl/spec/repl/internal_mirror_spec.rb +147 -0
  217. data/plugins/repl/spec/spec_helper.rb +4 -0
  218. data/plugins/tree_view/lib/tree_view.rb +7 -0
  219. data/plugins/tree_view/lib/tree_view/mirror.rb +74 -0
  220. data/plugins/tree_view/plugin.yaml +14 -0
  221. data/plugins/tree_view/spec/spec_helper.rb +4 -0
  222. data/plugins/tree_view_swt/lib/tree_view_swt.rb +5 -0
  223. data/plugins/tree_view_swt/plugin.yaml +14 -0
  224. data/textmate/Bundles/C.tmbundle/Snippets/010_main_______main__.plist +20 -0
  225. data/textmate/Bundles/C.tmbundle/Snippets/030_for_int_loop___fori__.plist +19 -0
  226. data/textmate/Bundles/C.tmbundle/Snippets/Include_header_once_only_guard.plist +28 -0
  227. data/textmate/Bundles/C.tmbundle/Snippets/Typedef.tmSnippet +16 -0
  228. data/textmate/Bundles/C.tmbundle/Snippets/__1_begin_________1_end_______beginend__.plist +16 -0
  229. data/textmate/Bundles/C.tmbundle/Snippets/__endif.plist +17 -0
  230. data/textmate/Bundles/C.tmbundle/Snippets/__ifndef__________define__________endif.tmSnippet +18 -0
  231. data/textmate/Bundles/C.tmbundle/Snippets/__include________inc__.plist +16 -0
  232. data/textmate/Bundles/C.tmbundle/Snippets/__pragma_mark___mark__.plist +21 -0
  233. data/textmate/Bundles/C.tmbundle/Snippets/class______class__.plist +24 -0
  234. data/textmate/Bundles/C.tmbundle/Snippets/do___while_loop___do__.plist +18 -0
  235. data/textmate/Bundles/C.tmbundle/Snippets/fprintf_______.tmSnippet +16 -0
  236. data/textmate/Bundles/C.tmbundle/Snippets/if______if__.plist +19 -0
  237. data/textmate/Bundles/C.tmbundle/Snippets/namespace______namespace__.plist +20 -0
  238. data/textmate/Bundles/C.tmbundle/Snippets/next___include________Inc__.plist +16 -0
  239. data/textmate/Bundles/C.tmbundle/Snippets/printf______printf__.plist +16 -0
  240. data/textmate/Bundles/C.tmbundle/Snippets/read_file___readF__.plist +23 -0
  241. data/textmate/Bundles/C.tmbundle/Snippets/std____map___map__.plist +16 -0
  242. data/textmate/Bundles/C.tmbundle/Snippets/std____vector___v__.plist +16 -0
  243. data/textmate/Bundles/C.tmbundle/Snippets/struct.plist +19 -0
  244. data/textmate/Bundles/C.tmbundle/Snippets/template___typename________template__.plist +16 -0
  245. data/textmate/Bundles/C.tmbundle/Syntaxes/C.plist +1084 -0
  246. data/textmate/Bundles/C.tmbundle/Syntaxes/C____.plist +521 -0
  247. data/textmate/Bundles/CSS.tmbundle/Snippets/Fixed_Position_Bottom_100___wide_IE6.tmSnippet +18 -0
  248. data/textmate/Bundles/CSS.tmbundle/Snippets/__important_CSS_______.plist +18 -0
  249. data/textmate/Bundles/CSS.tmbundle/Snippets/background____color_image_repeat_attachment_position___background__.plist +16 -0
  250. data/textmate/Bundles/CSS.tmbundle/Snippets/background__attachment___scroll__fixed___background__.plist +16 -0
  251. data/textmate/Bundles/CSS.tmbundle/Snippets/background__color____color__hex___background__.plist +16 -0
  252. data/textmate/Bundles/CSS.tmbundle/Snippets/background__color____color__name___background__.plist +16 -0
  253. data/textmate/Bundles/CSS.tmbundle/Snippets/background__color____color__rgb___background__.plist +16 -0
  254. data/textmate/Bundles/CSS.tmbundle/Snippets/background__color____transparent___background__.plist +16 -0
  255. data/textmate/Bundles/CSS.tmbundle/Snippets/background__image____none___background__.plist +16 -0
  256. data/textmate/Bundles/CSS.tmbundle/Snippets/background__image____url___background__.plist +16 -0
  257. data/textmate/Bundles/CSS.tmbundle/Snippets/background__position____position___background__.plist +16 -0
  258. data/textmate/Bundles/CSS.tmbundle/Snippets/background__repeat____r__r__x__r__y__n__r___background__.plist +16 -0
  259. data/textmate/Bundles/CSS.tmbundle/Snippets/border_____size_style_color___border__.plist +16 -0
  260. data/textmate/Bundles/CSS.tmbundle/Snippets/border__bottom___size_style_color___border__.plist +16 -0
  261. data/textmate/Bundles/CSS.tmbundle/Snippets/border__bottom__color___size_style_color___border__.plist +16 -0
  262. data/textmate/Bundles/CSS.tmbundle/Snippets/border__bottom__style___size_style_color___border__.plist +16 -0
  263. data/textmate/Bundles/CSS.tmbundle/Snippets/border__bottom__width___size_style_color___border__.plist +16 -0
  264. data/textmate/Bundles/CSS.tmbundle/Snippets/border__color___color___border__.plist +16 -0
  265. data/textmate/Bundles/CSS.tmbundle/Snippets/border__left___size_style_color___border__.plist +16 -0
  266. data/textmate/Bundles/CSS.tmbundle/Snippets/border__left__color___color___border__.plist +16 -0
  267. data/textmate/Bundles/CSS.tmbundle/Snippets/border__left__style___style___border__.plist +16 -0
  268. data/textmate/Bundles/CSS.tmbundle/Snippets/border__left__width___size___border__.plist +16 -0
  269. data/textmate/Bundles/CSS.tmbundle/Snippets/border__right___size_style_color___border__.plist +16 -0
  270. data/textmate/Bundles/CSS.tmbundle/Snippets/border__right__color___color___border__.plist +16 -0
  271. data/textmate/Bundles/CSS.tmbundle/Snippets/border__right__style___style___border__.plist +16 -0
  272. data/textmate/Bundles/CSS.tmbundle/Snippets/border__right__width___size___border__.plist +16 -0
  273. data/textmate/Bundles/CSS.tmbundle/Snippets/border__style___style___border__.plist +16 -0
  274. data/textmate/Bundles/CSS.tmbundle/Snippets/border__top___size_style_color___border__.plist +16 -0
  275. data/textmate/Bundles/CSS.tmbundle/Snippets/border__top__color___color___border__.plist +16 -0
  276. data/textmate/Bundles/CSS.tmbundle/Snippets/border__top__style___style___border__.plist +16 -0
  277. data/textmate/Bundles/CSS.tmbundle/Snippets/border__top__width___size___border__.plist +16 -0
  278. data/textmate/Bundles/CSS.tmbundle/Snippets/border__width___width___border__.plist +16 -0
  279. data/textmate/Bundles/CSS.tmbundle/Snippets/clear___value___clear__.plist +16 -0
  280. data/textmate/Bundles/CSS.tmbundle/Snippets/color____color__hex___color__.plist +16 -0
  281. data/textmate/Bundles/CSS.tmbundle/Snippets/color____color__name___color__.plist +16 -0
  282. data/textmate/Bundles/CSS.tmbundle/Snippets/color____color__rgb___color__.plist +16 -0
  283. data/textmate/Bundles/CSS.tmbundle/Snippets/cursor___type___cursor__.plist +16 -0
  284. data/textmate/Bundles/CSS.tmbundle/Snippets/cursor___url___cursor__.plist +16 -0
  285. data/textmate/Bundles/CSS.tmbundle/Snippets/direction___ltr__rtl___direction__.plist +16 -0
  286. data/textmate/Bundles/CSS.tmbundle/Snippets/display___block___display__.plist +16 -0
  287. data/textmate/Bundles/CSS.tmbundle/Snippets/display___common__types___display__.plist +16 -0
  288. data/textmate/Bundles/CSS.tmbundle/Snippets/display___inline___display__.plist +16 -0
  289. data/textmate/Bundles/CSS.tmbundle/Snippets/display___table__types___display__.plist +16 -0
  290. data/textmate/Bundles/CSS.tmbundle/Snippets/filter___AlphaImageLoader___for_IE_PNGs_____background__.plist +19 -0
  291. data/textmate/Bundles/CSS.tmbundle/Snippets/float___left__right__none___float__.plist +16 -0
  292. data/textmate/Bundles/CSS.tmbundle/Snippets/font_____style_variant_weight_size__line__height_font___family___font__.plist +16 -0
  293. data/textmate/Bundles/CSS.tmbundle/Snippets/font___size_font___font__.plist +16 -0
  294. data/textmate/Bundles/CSS.tmbundle/Snippets/font__family_____family___font__.plist +16 -0
  295. data/textmate/Bundles/CSS.tmbundle/Snippets/font__size___size___font__.plist +16 -0
  296. data/textmate/Bundles/CSS.tmbundle/Snippets/font__style_____normal__italic__oblique___font__.plist +16 -0
  297. data/textmate/Bundles/CSS.tmbundle/Snippets/font__variant_____normal__small__caps___font__.plist +16 -0
  298. data/textmate/Bundles/CSS.tmbundle/Snippets/font__weight___weight___font__.plist +16 -0
  299. data/textmate/Bundles/CSS.tmbundle/Snippets/letter__spacing_____length__em___letter__.plist +16 -0
  300. data/textmate/Bundles/CSS.tmbundle/Snippets/letter__spacing_____length__px___letter__.plist +16 -0
  301. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style___type_position_image___list__.plist +16 -0
  302. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__image___url___list__.plist +16 -0
  303. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__position___pos___list__.plist +16 -0
  304. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__type___asian___list__.plist +16 -0
  305. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__type___marker__list__.plist +16 -0
  306. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__type___numeric___list__.plist +16 -0
  307. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__type___other___list__.plist +16 -0
  308. data/textmate/Bundles/CSS.tmbundle/Snippets/list__style__type___roman__alpha__greek___list__.plist +16 -0
  309. data/textmate/Bundles/CSS.tmbundle/Snippets/margin___T_R_B_L___margin__.plist +16 -0
  310. data/textmate/Bundles/CSS.tmbundle/Snippets/margin___V_H___margin__.plist +16 -0
  311. data/textmate/Bundles/CSS.tmbundle/Snippets/margin_____all___margin__.plist +16 -0
  312. data/textmate/Bundles/CSS.tmbundle/Snippets/margin__bottom___length___margin__.plist +16 -0
  313. data/textmate/Bundles/CSS.tmbundle/Snippets/margin__left___length___margin__.plist +16 -0
  314. data/textmate/Bundles/CSS.tmbundle/Snippets/margin__right___length___margin__.plist +16 -0
  315. data/textmate/Bundles/CSS.tmbundle/Snippets/margin__top___length___margin__.plist +16 -0
  316. data/textmate/Bundles/CSS.tmbundle/Snippets/marker__offset___auto___marker__.plist +16 -0
  317. data/textmate/Bundles/CSS.tmbundle/Snippets/marker__offset___length___marker__.plist +16 -0
  318. data/textmate/Bundles/CSS.tmbundle/Snippets/opacity_____for_Safari___FF_and_IE_____opacity__.plist +18 -0
  319. data/textmate/Bundles/CSS.tmbundle/Snippets/overflow___type___overflow__.plist +16 -0
  320. data/textmate/Bundles/CSS.tmbundle/Snippets/padding_____T_R_B_L___padding__.plist +16 -0
  321. data/textmate/Bundles/CSS.tmbundle/Snippets/padding_____V_H___padding__.plist +16 -0
  322. data/textmate/Bundles/CSS.tmbundle/Snippets/padding_____all___padding__.plist +16 -0
  323. data/textmate/Bundles/CSS.tmbundle/Snippets/padding__bottom___length___margin__.plist +16 -0
  324. data/textmate/Bundles/CSS.tmbundle/Snippets/padding__left___length___margin__.plist +16 -0
  325. data/textmate/Bundles/CSS.tmbundle/Snippets/padding__right___length___margin__.plist +16 -0
  326. data/textmate/Bundles/CSS.tmbundle/Snippets/padding__top___length___margin__.plist +16 -0
  327. data/textmate/Bundles/CSS.tmbundle/Snippets/position___type___position__.plist +16 -0
  328. data/textmate/Bundles/CSS.tmbundle/Snippets/properties_______________.plist +19 -0
  329. data/textmate/Bundles/CSS.tmbundle/Snippets/scrollbar.tmSnippet +23 -0
  330. data/textmate/Bundles/CSS.tmbundle/Snippets/selection.tmSnippet +20 -0
  331. data/textmate/Bundles/CSS.tmbundle/Snippets/text__align___left__center__right___txt__.plist +16 -0
  332. data/textmate/Bundles/CSS.tmbundle/Snippets/text__decoration___none__underline__overline__line__through__blink___text__.plist +16 -0
  333. data/textmate/Bundles/CSS.tmbundle/Snippets/text__indent___length___text__.plist +16 -0
  334. data/textmate/Bundles/CSS.tmbundle/Snippets/text__shadow___color__hex_x_y_blur___text__.plist +16 -0
  335. data/textmate/Bundles/CSS.tmbundle/Snippets/text__shadow___color__rgb_x_y_blur___text__.plist +16 -0
  336. data/textmate/Bundles/CSS.tmbundle/Snippets/text__shadow___none___text__.plist +16 -0
  337. data/textmate/Bundles/CSS.tmbundle/Snippets/text__transform___capitalize__upper__lower___text__.plist +16 -0
  338. data/textmate/Bundles/CSS.tmbundle/Snippets/text__transform___none___text__.plist +16 -0
  339. data/textmate/Bundles/CSS.tmbundle/Snippets/vertical__align___type___vertical__.plist +16 -0
  340. data/textmate/Bundles/CSS.tmbundle/Snippets/visibility___type___visibility__.plist +16 -0
  341. data/textmate/Bundles/CSS.tmbundle/Snippets/white__space____normal__pre__nowrap___white__.plist +16 -0
  342. data/textmate/Bundles/CSS.tmbundle/Snippets/word__spacing____length___word__.plist +16 -0
  343. data/textmate/Bundles/CSS.tmbundle/Snippets/word__spacing____normal___word__.plist +16 -0
  344. data/textmate/Bundles/CSS.tmbundle/Snippets/z__index___index___z__.plist +16 -0
  345. data/textmate/Bundles/CSS.tmbundle/Syntaxes/CSS.plist +543 -0
  346. data/textmate/Bundles/HTML.tmbundle/Snippets/Arrow___arrow__.plist +16 -0
  347. data/textmate/Bundles/HTML.tmbundle/Snippets/Backspace___backspace__.plist +16 -0
  348. data/textmate/Bundles/HTML.tmbundle/Snippets/Backtab___backtab__.plist +16 -0
  349. data/textmate/Bundles/HTML.tmbundle/Snippets/Command___command__.plist +16 -0
  350. data/textmate/Bundles/HTML.tmbundle/Snippets/Control___control__.plist +16 -0
  351. data/textmate/Bundles/HTML.tmbundle/Snippets/Delete___delete__.plist +16 -0
  352. data/textmate/Bundles/HTML.tmbundle/Snippets/DocType_HTML_4_0_Strict.plist +18 -0
  353. data/textmate/Bundles/HTML.tmbundle/Snippets/DocType_XHTL_1_0_Frameset.plist +18 -0
  354. data/textmate/Bundles/HTML.tmbundle/Snippets/DocType_XHTML_1_0_Strict.plist +18 -0
  355. data/textmate/Bundles/HTML.tmbundle/Snippets/DocType_XHTML_1_0_Transitional.plist +18 -0
  356. data/textmate/Bundles/HTML.tmbundle/Snippets/DocType_XHTML_1_1.plist +18 -0
  357. data/textmate/Bundles/HTML.tmbundle/Snippets/Down___down__.plist +16 -0
  358. data/textmate/Bundles/HTML.tmbundle/Snippets/Embed_QT_movie___movie__.plist +26 -0
  359. data/textmate/Bundles/HTML.tmbundle/Snippets/Emphasize.tmSnippet +16 -0
  360. data/textmate/Bundles/HTML.tmbundle/Snippets/Enter___enter__.plist +16 -0
  361. data/textmate/Bundles/HTML.tmbundle/Snippets/Escape___escape__.plist +16 -0
  362. data/textmate/Bundles/HTML.tmbundle/Snippets/Fieldset.tmSnippet +22 -0
  363. data/textmate/Bundles/HTML.tmbundle/Snippets/HTML________4_0_Transitional___doctype__.plist +18 -0
  364. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer.tmSnippet +16 -0
  365. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer_5_0_only.tmSnippet +16 -0
  366. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer_5_5_only.tmSnippet +16 -0
  367. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer_5_x.tmSnippet +16 -0
  368. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer_6_and_below.tmSnippet +16 -0
  369. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer_6_only.tmSnippet +16 -0
  370. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___Internet_Explorer_7__.tmSnippet +16 -0
  371. data/textmate/Bundles/HTML.tmbundle/Snippets/IE_Conditional_Comment___NOT_Internet_Explorer.tmSnippet +16 -0
  372. data/textmate/Bundles/HTML.tmbundle/Snippets/Input_with_Label.tmSnippet +19 -0
  373. data/textmate/Bundles/HTML.tmbundle/Snippets/Left___left__.plist +16 -0
  374. data/textmate/Bundles/HTML.tmbundle/Snippets/Option.tmSnippet +18 -0
  375. data/textmate/Bundles/HTML.tmbundle/Snippets/Option___option__.plist +16 -0
  376. data/textmate/Bundles/HTML.tmbundle/Snippets/Return___return__.plist +16 -0
  377. data/textmate/Bundles/HTML.tmbundle/Snippets/Right___right__.plist +16 -0
  378. data/textmate/Bundles/HTML.tmbundle/Snippets/Select_Box.tmSnippet +22 -0
  379. data/textmate/Bundles/HTML.tmbundle/Snippets/Shift___shift__.plist +16 -0
  380. data/textmate/Bundles/HTML.tmbundle/Snippets/Smart_return__indent_for_tag_pairs.plist +18 -0
  381. data/textmate/Bundles/HTML.tmbundle/Snippets/Strong.tmSnippet +16 -0
  382. data/textmate/Bundles/HTML.tmbundle/Snippets/Tab___tab__.plist +16 -0
  383. data/textmate/Bundles/HTML.tmbundle/Snippets/Up___up__.plist +16 -0
  384. data/textmate/Bundles/HTML.tmbundle/Snippets/Wrap_Selection_In_Tag.plist +16 -0
  385. data/textmate/Bundles/HTML.tmbundle/Snippets/Wrap_in___________________.plist +14 -0
  386. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML_____input__.plist +16 -0
  387. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML_____textarea__.plist +16 -0
  388. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___a_mailto_____.plist +16 -0
  389. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___base__.plist +16 -0
  390. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___body__.plist +18 -0
  391. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___br_____.plist +16 -0
  392. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___div__.plist +18 -0
  393. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___form__.plist +20 -0
  394. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___h1__.plist +16 -0
  395. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___head__.plist +20 -0
  396. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___link__.plist +16 -0
  397. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___meta__.plist +16 -0
  398. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___nbsp___NonBreakingSpace.plist +16 -0
  399. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___script__.plist +18 -0
  400. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___script_src_____.plist +16 -0
  401. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___style__.plist +18 -0
  402. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___table__.plist +19 -0
  403. data/textmate/Bundles/HTML.tmbundle/Snippets/XHTML___title__.plist +16 -0
  404. data/textmate/Bundles/HTML.tmbundle/Syntaxes/HTML.plist +962 -0
  405. data/textmate/Bundles/HTML.tmbundle/Templates/HTML /342/200/223 4.0 Strict/index.html" +15 -0
  406. data/textmate/Bundles/HTML.tmbundle/Templates/HTML /342/200/223 4.0 Strict/info.plist" +20 -0
  407. data/textmate/Bundles/HTML.tmbundle/Templates/HTML /342/200/224 4.0 Transitional/index.html" +15 -0
  408. data/textmate/Bundles/HTML.tmbundle/Templates/HTML /342/200/224 4.0 Transitional/info.plist" +20 -0
  409. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.0 Frameset/index.html" +16 -0
  410. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.0 Frameset/info.plist" +16 -0
  411. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.0 Strict/index.html" +16 -0
  412. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.0 Strict/info.plist" +16 -0
  413. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.0 Transitional/index.html" +16 -0
  414. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.0 Transitional/info.plist" +16 -0
  415. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.1/index.html" +15 -0
  416. data/textmate/Bundles/HTML.tmbundle/Templates/XHTML /342/200/223 1.1/info.plist" +16 -0
  417. data/textmate/Bundles/RedcarRepl.tmbundle/Syntaxes/InternalRuby.plist +54 -0
  418. data/textmate/Bundles/Ruby.tmbundle/Snippets/060_ruby_if_else.plist +20 -0
  419. data/textmate/Bundles/Ruby.tmbundle/Snippets/070_ruby_if.plist +18 -0
  420. data/textmate/Bundles/Ruby.tmbundle/Snippets/080_ruby_case.plist +19 -0
  421. data/textmate/Bundles/Ruby.tmbundle/Snippets/Add_____________Marker.tmSnippet +16 -0
  422. data/textmate/Bundles/Ruby.tmbundle/Snippets/Array_new__10________i____________Arr__.plist +16 -0
  423. data/textmate/Bundles/Ruby.tmbundle/Snippets/Benchmark_bmbm_______do____end.tmSnippet +19 -0
  424. data/textmate/Bundles/Ruby.tmbundle/Snippets/Dir__________.tmSnippet +16 -0
  425. data/textmate/Bundles/Ruby.tmbundle/Snippets/Dir_glob___________do___file______end____Dir__.plist +16 -0
  426. data/textmate/Bundles/Ruby.tmbundle/Snippets/File_foreach____________do___line______end____File__.plist +16 -0
  427. data/textmate/Bundles/Ruby.tmbundle/Snippets/File_open________________file________.tmSnippet +16 -0
  428. data/textmate/Bundles/Ruby.tmbundle/Snippets/File_read__________.tmSnippet +16 -0
  429. data/textmate/Bundles/Ruby.tmbundle/Snippets/Hash_new______hash___key___hash__key_______________Has__.plist +16 -0
  430. data/textmate/Bundles/Ruby.tmbundle/Snippets/Insert_ERb__s______________or_______________.tmSnippet +16 -0
  431. data/textmate/Bundles/Ruby.tmbundle/Snippets/Marshal_dump__obj___file______Md__.plist +16 -0
  432. data/textmate/Bundles/Ruby.tmbundle/Snippets/Marshal_load__obj______Ml__.plist +16 -0
  433. data/textmate/Bundles/Ruby.tmbundle/Snippets/PStore_new________.tmSnippet +16 -0
  434. data/textmate/Bundles/Ruby.tmbundle/Snippets/RDoc_documentation_block.tmSnippet +20 -0
  435. data/textmate/Bundles/Ruby.tmbundle/Snippets/Wrap_in_Begin________Rescue________End.plist +23 -0
  436. data/textmate/Bundles/Ruby.tmbundle/Snippets/YAML_dump_______file______Yd____.plist +16 -0
  437. data/textmate/Bundles/Ruby.tmbundle/Snippets/YAML_load__file______Yl____.plist +16 -0
  438. data/textmate/Bundles/Ruby.tmbundle/Snippets/__END__.tmSnippet +17 -0
  439. data/textmate/Bundles/Ruby.tmbundle/Snippets/______usr__local__bin__ruby___w.plist +17 -0
  440. data/textmate/Bundles/Ruby.tmbundle/Snippets/__yields___RDoc_comment.tmSnippet +16 -0
  441. data/textmate/Bundles/Ruby.tmbundle/Snippets/alias_method_______am__.plist +16 -0
  442. data/textmate/Bundles/Ruby.tmbundle/Snippets/all________e____________all__.plist +16 -0
  443. data/textmate/Bundles/Ruby.tmbundle/Snippets/any________e____________any__.plist +16 -0
  444. data/textmate/Bundles/Ruby.tmbundle/Snippets/application_code_______app__.plist +18 -0
  445. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert__________as__.plist +16 -0
  446. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_equal.tmSnippet +16 -0
  447. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_in_delta__________asid__.plist +16 -0
  448. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_instance_of__________asio__.plist +16 -0
  449. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_kind_of__________asko__.plist +16 -0
  450. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_match__________asm__.plist +16 -0
  451. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_nil__________asn__.plist +16 -0
  452. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_no_match__________asnm__.plist +16 -0
  453. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_not_equal__________asne__.plist +16 -0
  454. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_not_nil__________asnn__.plist +16 -0
  455. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_not_same__________asns__.plist +16 -0
  456. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_nothing_raised___________________asnr__.plist +16 -0
  457. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_nothing_thrown_____________asnt__.plist +16 -0
  458. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_operator__________aso__.plist +16 -0
  459. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_raise___________________asr__.plist +16 -0
  460. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_respond_to__________asrt__.plist +16 -0
  461. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_same__________ass__.plist +16 -0
  462. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_send__________ass__.plist +16 -0
  463. data/textmate/Bundles/Ruby.tmbundle/Snippets/assert_throws___________________ast__.plist +16 -0
  464. data/textmate/Bundles/Ruby.tmbundle/Snippets/attr_accessor_______rw__.plist +16 -0
  465. data/textmate/Bundles/Ruby.tmbundle/Snippets/attr_reader_______r__.plist +16 -0
  466. data/textmate/Bundles/Ruby.tmbundle/Snippets/attr_writer_______w__.plist +16 -0
  467. data/textmate/Bundles/Ruby.tmbundle/Snippets/class_______DelegateClass____initialize____end____class__.plist +24 -0
  468. data/textmate/Bundles/Ruby.tmbundle/Snippets/class_______ParentClass____initialize____end.plist +22 -0
  469. data/textmate/Bundles/Ruby.tmbundle/Snippets/class_______Struct____initialize____end.plist +22 -0
  470. data/textmate/Bundles/Ruby.tmbundle/Snippets/class_______Test____Unit____TestCase____end____tc__.plist +24 -0
  471. data/textmate/Bundles/Ruby.tmbundle/Snippets/class______self____end.tmSnippet +18 -0
  472. data/textmate/Bundles/Ruby.tmbundle/Snippets/class____end____cla__.plist +18 -0
  473. data/textmate/Bundles/Ruby.tmbundle/Snippets/class____initialize____end.plist +22 -0
  474. data/textmate/Bundles/Ruby.tmbundle/Snippets/class____instance_methods____undef____initialize____end____class__.plist +30 -0
  475. data/textmate/Bundles/Ruby.tmbundle/Snippets/class_from_name________clafn__.plist +16 -0
  476. data/textmate/Bundles/Ruby.tmbundle/Snippets/classify______e____________clas__.plist +16 -0
  477. data/textmate/Bundles/Ruby.tmbundle/Snippets/collect______e____________col__.plist +16 -0
  478. data/textmate/Bundles/Ruby.tmbundle/Snippets/deep_copy__________dee__.plist +16 -0
  479. data/textmate/Bundles/Ruby.tmbundle/Snippets/def_delegator______defd__.plist +16 -0
  480. data/textmate/Bundles/Ruby.tmbundle/Snippets/def_delegators______defds__.plist +16 -0
  481. data/textmate/Bundles/Ruby.tmbundle/Snippets/def_end.plist +18 -0
  482. data/textmate/Bundles/Ruby.tmbundle/Snippets/def_method_missing____end____mm__.plist +18 -0
  483. data/textmate/Bundles/Ruby.tmbundle/Snippets/def_self____end____defs__.plist +18 -0
  484. data/textmate/Bundles/Ruby.tmbundle/Snippets/def_test_____end____t__.plist +18 -0
  485. data/textmate/Bundles/Ruby.tmbundle/Snippets/delete_if______e____________deli__.plist +16 -0
  486. data/textmate/Bundles/Ruby.tmbundle/Snippets/detect______e____________det__.plist +16 -0
  487. data/textmate/Bundles/Ruby.tmbundle/Snippets/directory____.tmSnippet +16 -0
  488. data/textmate/Bundles/Ruby.tmbundle/Snippets/do___obj______end___doo__.plist +18 -0
  489. data/textmate/Bundles/Ruby.tmbundle/Snippets/downto__0________n____________dow__.plist +16 -0
  490. data/textmate/Bundles/Ruby.tmbundle/Snippets/each______e____________ea__.plist +16 -0
  491. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_byte______byte____________eab__.plist +16 -0
  492. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_char______chr____________eac____.plist +16 -0
  493. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_cons____________group____________eac____.plist +16 -0
  494. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_index______i____________eai__.plist +16 -0
  495. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_key______key____________eak__.plist +16 -0
  496. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_line______line____________eal__.plist +16 -0
  497. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_pair______name___val____________eap__.plist +16 -0
  498. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_slice______group____________eas__.plist +16 -0
  499. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_value______val____________eav__.plist +16 -0
  500. data/textmate/Bundles/Ruby.tmbundle/Snippets/each_with_index______e___i____________eawi__.plist +16 -0
  501. data/textmate/Bundles/Ruby.tmbundle/Snippets/elsif____.tmSnippet +17 -0
  502. data/textmate/Bundles/Ruby.tmbundle/Snippets/embed_string_variable.plist +16 -0
  503. data/textmate/Bundles/Ruby.tmbundle/Snippets/extend_Forwardable____Forw__.plist +16 -0
  504. data/textmate/Bundles/Ruby.tmbundle/Snippets/fetch__name________key____________fet__.plist +16 -0
  505. data/textmate/Bundles/Ruby.tmbundle/Snippets/fill__range________i____________fil__.plist +16 -0
  506. data/textmate/Bundles/Ruby.tmbundle/Snippets/find______e____________fin__.plist +16 -0
  507. data/textmate/Bundles/Ruby.tmbundle/Snippets/find_all______e____________fina__.plist +16 -0
  508. data/textmate/Bundles/Ruby.tmbundle/Snippets/flatten_once____fla__.plist +16 -0
  509. data/textmate/Bundles/Ruby.tmbundle/Snippets/flunk__________fl__.plist +16 -0
  510. data/textmate/Bundles/Ruby.tmbundle/Snippets/grep____pattern__________match____________gre__.plist +16 -0
  511. data/textmate/Bundles/Ruby.tmbundle/Snippets/gsub________________match____________gsu__.plist +16 -0
  512. data/textmate/Bundles/Ruby.tmbundle/Snippets/hash_pair_______.plist +16 -0
  513. data/textmate/Bundles/Ruby.tmbundle/Snippets/hash_pointer.plist +16 -0
  514. data/textmate/Bundles/Ruby.tmbundle/Snippets/include_Comparable_______Comp__.plist +20 -0
  515. data/textmate/Bundles/Ruby.tmbundle/Snippets/include_Enumerable_______Enum__.plist +20 -0
  516. data/textmate/Bundles/Ruby.tmbundle/Snippets/inject__init________mem___var____________inj__.plist +16 -0
  517. data/textmate/Bundles/Ruby.tmbundle/Snippets/lambda______args____________lam__.plist +16 -0
  518. data/textmate/Bundles/Ruby.tmbundle/Snippets/loop_________.tmSnippet +16 -0
  519. data/textmate/Bundles/Ruby.tmbundle/Snippets/map______e____________map__.plist +16 -0
  520. data/textmate/Bundles/Ruby.tmbundle/Snippets/map_with_index______e___i____________mapwi__.plist +16 -0
  521. data/textmate/Bundles/Ruby.tmbundle/Snippets/max______a___b____________max__.plist +16 -0
  522. data/textmate/Bundles/Ruby.tmbundle/Snippets/min______a___b____________min__.plist +16 -0
  523. data/textmate/Bundles/Ruby.tmbundle/Snippets/module____ClassMethods____end.plist +29 -0
  524. data/textmate/Bundles/Ruby.tmbundle/Snippets/module____end.plist +18 -0
  525. data/textmate/Bundles/Ruby.tmbundle/Snippets/module____module_function____end.plist +20 -0
  526. data/textmate/Bundles/Ruby.tmbundle/Snippets/namespace______do____end.tmSnippet +18 -0
  527. data/textmate/Bundles/Ruby.tmbundle/Snippets/open____path__or__url_______w_____do___doc______end___ope__.plist +16 -0
  528. data/textmate/Bundles/Ruby.tmbundle/Snippets/open_yield_block_______.plist +16 -0
  529. data/textmate/Bundles/Ruby.tmbundle/Snippets/option_parse_____________optp__.plist +43 -0
  530. data/textmate/Bundles/Ruby.tmbundle/Snippets/partition______e____________par__.plist +16 -0
  531. data/textmate/Bundles/Ruby.tmbundle/Snippets/path_from_here________.tmSnippet +16 -0
  532. data/textmate/Bundles/Ruby.tmbundle/Snippets/randomize____ran__.plist +16 -0
  533. data/textmate/Bundles/Ruby.tmbundle/Snippets/reject______e____________rej__.plist +16 -0
  534. data/textmate/Bundles/Ruby.tmbundle/Snippets/require___________req__.plist +16 -0
  535. data/textmate/Bundles/Ruby.tmbundle/Snippets/require___tc____________ts__.plist +20 -0
  536. data/textmate/Bundles/Ruby.tmbundle/Snippets/require_gem_______.tmSnippet +16 -0
  537. data/textmate/Bundles/Ruby.tmbundle/Snippets/results_report_______________.tmSnippet +16 -0
  538. data/textmate/Bundles/Ruby.tmbundle/Snippets/reverse_each______e____________rea__.plist +16 -0
  539. data/textmate/Bundles/Ruby.tmbundle/Snippets/scan________________match____________sca__.plist +16 -0
  540. data/textmate/Bundles/Ruby.tmbundle/Snippets/select______e____________sel__.plist +16 -0
  541. data/textmate/Bundles/Ruby.tmbundle/Snippets/singleton_class____.tmSnippet +16 -0
  542. data/textmate/Bundles/Ruby.tmbundle/Snippets/sort______a___b____________sor__.plist +16 -0
  543. data/textmate/Bundles/Ruby.tmbundle/Snippets/sort_by______e____________sorb__.plist +16 -0
  544. data/textmate/Bundles/Ruby.tmbundle/Snippets/step__2________e____________ste__.plist +16 -0
  545. data/textmate/Bundles/Ruby.tmbundle/Snippets/sub________________match____________sub__.plist +16 -0
  546. data/textmate/Bundles/Ruby.tmbundle/Snippets/task___task_name__________dependent_____tasks___do____end.tmSnippet +19 -0
  547. data/textmate/Bundles/Ruby.tmbundle/Snippets/times______n____________tim__.plist +16 -0
  548. data/textmate/Bundles/Ruby.tmbundle/Snippets/transaction_________do____end.tmSnippet +16 -0
  549. data/textmate/Bundles/Ruby.tmbundle/Snippets/unix_filter______uni__.plist +18 -0
  550. data/textmate/Bundles/Ruby.tmbundle/Snippets/unless___unless__.plist +18 -0
  551. data/textmate/Bundles/Ruby.tmbundle/Snippets/until_____end.tmSnippet +18 -0
  552. data/textmate/Bundles/Ruby.tmbundle/Snippets/untitled.plist +19 -0
  553. data/textmate/Bundles/Ruby.tmbundle/Snippets/upto__1_0__0_0________n____________upt__.plist +16 -0
  554. data/textmate/Bundles/Ruby.tmbundle/Snippets/usage_if________usai__.plist +18 -0
  555. data/textmate/Bundles/Ruby.tmbundle/Snippets/usage_unless________usau__.plist +18 -0
  556. data/textmate/Bundles/Ruby.tmbundle/Snippets/when.plist +17 -0
  557. data/textmate/Bundles/Ruby.tmbundle/Snippets/while_____end.tmSnippet +18 -0
  558. data/textmate/Bundles/Ruby.tmbundle/Snippets/xmlread______.tmSnippet +16 -0
  559. data/textmate/Bundles/Ruby.tmbundle/Snippets/xpath_______________.tmSnippet +18 -0
  560. data/textmate/Bundles/Ruby.tmbundle/Snippets/zip__enums________row____________zip__.plist +16 -0
  561. data/textmate/Bundles/Ruby.tmbundle/Syntaxes/Ruby.plist +2763 -0
  562. data/textmate/Bundles/Source.tmbundle/Snippets/Continue_line_comment.plist +35 -0
  563. data/textmate/Bundles/Source.tmbundle/Snippets/Escaped_Quote_Pair_____________.plist +14 -0
  564. data/textmate/Bundles/Source.tmbundle/Snippets/Escaped_Single_Quote_Pair_____________.plist +14 -0
  565. data/textmate/Bundles/Source.tmbundle/Snippets/Frame_text.plist +16 -0
  566. data/textmate/Bundles/Source.tmbundle/Snippets/__n.plist +16 -0
  567. data/textmate/Bundles/Text.tmbundle/Snippets/010_Copyright.plist +14 -0
  568. data/textmate/Bundles/Text.tmbundle/Snippets/Conitnue_bullet.plist +17 -0
  569. data/textmate/Bundles/Text.tmbundle/Snippets/Conitnue_light_bullet.plist +17 -0
  570. data/textmate/Bundles/Text.tmbundle/Snippets/Conitnue_star_bullet.plist +17 -0
  571. data/textmate/Bundles/Text.tmbundle/Snippets/Insert_ISO_date.plist +14 -0
  572. data/textmate/Bundles/Text.tmbundle/Snippets/Lorem_ipsum.plist +14 -0
  573. data/textmate/Bundles/Text.tmbundle/Syntaxes/Plain_text.plist +83 -0
  574. data/textmate/Bundles/Text.tmbundle/Templates/Empty file/info.plist +14 -0
  575. data/textmate/Bundles/Text.tmbundle/Templates/From Clipboard/info.plist +17 -0
  576. data/textmate/Themes/Active4D.tmTheme +407 -0
  577. data/textmate/Themes/All Hallow's Eve.tmTheme +277 -0
  578. data/textmate/Themes/Amy.tmTheme +557 -0
  579. data/textmate/Themes/Blackboard.tmTheme +350 -0
  580. data/textmate/Themes/Brilliance Black.tmTheme +2619 -0
  581. data/textmate/Themes/Brilliance Dull.tmTheme +2243 -0
  582. data/textmate/Themes/Cobalt.tmTheme +559 -0
  583. data/textmate/Themes/Dawn.tmTheme +437 -0
  584. data/textmate/Themes/Eiffel.tmTheme +439 -0
  585. data/textmate/Themes/Espresso Libre.tmTheme +402 -0
  586. data/textmate/Themes/IDLE.tmTheme +235 -0
  587. data/textmate/Themes/LAZY.tmTheme +291 -0
  588. data/textmate/Themes/Mac Classic.tmTheme +450 -0
  589. data/textmate/Themes/MagicWB (Amiga).tmTheme +376 -0
  590. data/textmate/Themes/Pastels on Dark.tmTheme +701 -0
  591. data/textmate/Themes/Railscasts.tmTheme +278 -0
  592. data/textmate/Themes/Slush & Poppies.tmTheme +336 -0
  593. data/textmate/Themes/SpaceCadet.tmTheme +212 -0
  594. data/textmate/Themes/Sunburst.tmTheme +665 -0
  595. data/textmate/Themes/Twilight.tmTheme +514 -0
  596. data/textmate/Themes/Vibrant Ink.tmTheme +447 -0
  597. data/textmate/Themes/Zenburnesque.tmTheme +343 -0
  598. data/textmate/Themes/choco.tmTheme +542 -0
  599. data/textmate/Themes/iPlastic.tmTheme +286 -0
  600. metadata +673 -0
@@ -0,0 +1,197 @@
1
+ # Purpose: FreeBASE Core module. Starts all plugins
2
+ #
3
+ # $Id: core.rb,v 1.4 2004/10/14 20:54:34 ljulliar Exp $
4
+ #
5
+ # Authors: Rich Kilmer <rich@infoether.com>
6
+ # Contributors:
7
+ # - Laurent Julliard <laurent AT moldus DOT org)
8
+ #
9
+ # This file is part of the FreeRIDE project
10
+ #
11
+ # This application is free software; you can redistribute it and/or
12
+ # modify it under the terms of the Ruby license defined in the
13
+ # COPYING file.
14
+ #
15
+ # Copyright (c) 2001 Rich Kilmer. All rights reserved.
16
+ #
17
+
18
+ require 'rbconfig'
19
+
20
+ module FreeBASE
21
+
22
+ ##
23
+ # The Core class starts the FreeBASE service that manages
24
+ # the installed plugins.
25
+ #
26
+ class Core
27
+
28
+ include Config
29
+
30
+ # The master bus FreeBASE::DataBus
31
+ attr_reader :bus
32
+
33
+ # The logger utility
34
+ attr_reader :log
35
+
36
+ ##
37
+ # Constructs a new Core, loads the setup.rb, and loads the plugins
38
+ #
39
+ def initialize(propertiesFile, defaultPropertiesFile, options = {})
40
+ @propertiesFile = propertiesFile
41
+ @defaultPropertiesFile = defaultPropertiesFile
42
+ init_bus
43
+ load_properties
44
+ load_setup
45
+ end
46
+
47
+ ##
48
+ # Starts the Core service. This method blocks until shutdown.
49
+ #
50
+ def startup(options={})
51
+ # push all plugin paths into the require path. Prepend codebase
52
+ # if it's a relative path
53
+ @properties["config/plugin_path"].split(";").each do |path|
54
+ path = File.join($FR_CODEBASE,path) unless File.absolute_path?(path)
55
+ $:.push path
56
+ end
57
+ @bus["/log/info"] << "--- #{@properties['config/product_name']} Started on #{Time.now.to_s}"
58
+ @bus["/system/state/all_plugins_loaded"].data = false
59
+ @plugin_config = Configuration.new(self, @properties["config/plugin_path"])
60
+ if options[:require_only]
61
+ @plugin_config.require_plugins
62
+ else
63
+ @plugin_config.load_plugins
64
+ @plugin_config.start_plugins unless options[:load_only]
65
+ end
66
+ @bus["/system/state/all_plugins_loaded"].data = true
67
+ @core_thread = Thread.current
68
+ end
69
+
70
+ def load_plugins
71
+ startup(:load_only => true)
72
+ end
73
+
74
+ def require_files
75
+ startup(:require_only => true)
76
+ end
77
+
78
+ ##
79
+ # Shuts down the system by notifying each installed plugin via
80
+ # publishing the Core instance to the local plugin bus ['/command/shutdown']
81
+ # Shutdown stops if requested by a plugin to abort.
82
+ #
83
+ def shutdown
84
+ @plugin_config.stop_plugins
85
+ @plugin_config.unload_plugins
86
+ @bus["/system/state/all_plugins_loaded"].data = false;
87
+ @bus["/log/info"] << "--- Shutting down #{@properties['config/product_name']} on #{Time.now.to_s}"
88
+ @core_thread.wakeup if @core_thread.stop?
89
+ end
90
+
91
+
92
+ private
93
+
94
+ def init_bus
95
+ @bus = DataBus.new
96
+ # Publishing an integer to this location will shut down FreeBASE in that many seconds
97
+ @bus["/system/shutdown"].validate_with("Specify number of seconds") do |args|
98
+ args.size==1 and args[0].respond_to? "to_i" # validate convertable to integer
99
+ end
100
+ @bus["/system/shutdown"].set_proc do |seconds|
101
+ Thread.new do
102
+ puts "Shutdown in #{seconds.to_i} seconds..."
103
+ sleep seconds.to_i
104
+ shutdown
105
+ end
106
+ true
107
+ end
108
+
109
+ @bus["/system/test"].set_proc do
110
+ require 'test/unit'
111
+
112
+ # we do not want the tests to run on exit:
113
+ Test::Unit.run = false
114
+
115
+ suite = Test::Unit::TestSuite.new()
116
+
117
+ @bus["/plugins/"].children.each do |plugin_slot|
118
+ if plugin_slot["actions"].children.map{|c| c.name}.include? "test"
119
+ plugin = plugin_slot.data
120
+ plugin.plugin_configuration.tests.each do |test_info|
121
+ plugin.require_testcase(test_info["path"])
122
+ suite << eval(test_info["testcase"]).suite
123
+ end
124
+ end
125
+ end
126
+
127
+ require 'test/unit/ui/console/testrunner'
128
+
129
+ begin
130
+ Test::Unit::UI::Console::TestRunner.new(suite).start
131
+ rescue Object => e
132
+ puts e
133
+ puts e.message
134
+ puts e.backtrace
135
+ end
136
+ end
137
+
138
+ # Set up logger
139
+ @bus["log/info"].queue
140
+ @bus["log/error"].queue
141
+ @bus["log/debug"].queue
142
+ @bus["log"].subscribe do |event, slot|
143
+ if event == :notify_queue_join and slot.name != "log"
144
+ @bus["log"].call(slot.name, slot.queue.leave) if @bus["log"].is_proc_slot?
145
+ slot.queue.leave if slot.queue.count > 500
146
+ end
147
+ end
148
+ end
149
+
150
+ ##
151
+ # Loads the setup.rb file by eval'ing the contents into this instance
152
+ #
153
+ def load_setup
154
+ setupFile = @properties["config/setup_file"]
155
+ return unless (setupFile and File.exist?(setupFile))
156
+ file = File.new(setupFile)
157
+ setup = file.read
158
+ file.close
159
+ instance_eval(setup)
160
+ end
161
+
162
+ ##
163
+ # Builds the default properties file if it does not exist
164
+ #
165
+ def load_properties
166
+ unless Properties.exist?(@propertiesFile)
167
+ Properties.copy(@defaultPropertiesFile, @propertiesFile)
168
+ @properties = Properties.new("Core configuration file",
169
+ "1.0",
170
+ @bus["/system/properties"],
171
+ @propertiesFile)
172
+ @properties["version/major"] = Redcar::VERSION_MAJOR
173
+ @properties["version/minor"] = Redcar::VERSION_MINOR
174
+ @properties["version/release"] = Redcar::VERSION_RELEASE
175
+ else
176
+ @properties = Properties.new("Core configuration file",
177
+ "1.0",
178
+ @bus["/system/properties"],
179
+ @propertiesFile)
180
+ was_version = [@properties["version/major"],@properties["version/minor"],@properties["version/release"]].join('.')
181
+ is_version = [Redcar::VERSION_MAJOR, Redcar::VERSION_MINOR, Redcar::VERSION_RELEASE].join('.')
182
+
183
+ if (is_version < was_version)
184
+ puts "="*70
185
+ puts "WARNING!! You are running an old version of #{$FREEBASE_APPLICATION} (#{is_version}) against #{$FREEBASE_APPLICATION} configuration files created with a newer version (#{was_version}). This may cause serious troubles including #{$FREEBASE_APPLICATION} crashes."
186
+ puts "="*70
187
+ else
188
+ @properties["version/major"] = Redcar::VERSION_MAJOR
189
+ @properties["version/minor"] = Redcar::VERSION_MINOR
190
+ @properties["version/release"] = Redcar::VERSION_RELEASE
191
+ end
192
+ end
193
+ @properties['config/codebase'] = $FR_CODEBASE
194
+ end
195
+ end
196
+
197
+ end
@@ -0,0 +1,1128 @@
1
+ # Purpose: FreeBASE Databus. A publish/subscribe hierarchical system.
2
+ #
3
+ # $Id: databus.rb,v 1.6 2006/06/04 05:50:00 curthibbs Exp $
4
+ #
5
+ # Authors: Rich Kilmer <rich@infoether.com>
6
+ # based on an original design by Curt Hibbs <curt@hibbs.com>
7
+ # Contributors:
8
+ #
9
+ # This file is part of the FreeRIDE project
10
+ #
11
+ # This application is free software; you can redistribute it and/or
12
+ # modify it under the terms of the Ruby license defined in the
13
+ # COPYING file.
14
+ #
15
+ # Copyright (c) 2001 Rich Kilmer. All rights reserved.
16
+ #
17
+
18
+ require 'thread'
19
+
20
+ module FreeBASE
21
+ module DataBusHelper
22
+ def self.included(klass)
23
+ klass.send(:extend, self)
24
+ end
25
+
26
+ def bus(arg=nil, safe=false)
27
+ if safe
28
+ bits = arg.split("/")[1..-1]
29
+ path = "/"
30
+ bits.length.times do |i|
31
+ if $BUS[path].has_child? bits[i]
32
+ path += "/"+bits[i]
33
+ else
34
+ return nil
35
+ end
36
+ end
37
+ $BUS[arg]
38
+ else
39
+ if arg
40
+ $BUS[arg]
41
+ else
42
+ $BUS
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ ##
49
+ # The DataBus class is used to manage a publish/subscribe system
50
+ # Usage::
51
+ #
52
+ # class SubscriptionTest
53
+ # def databus_notify(event, slot)
54
+ # puts "Tester Class got #{slot.data}"
55
+ # end
56
+ # end
57
+ #
58
+ # databus = FreeBASE::DataBus.new
59
+ # st = SubscriptionTest.new
60
+ # databus["/foo/bar"].subscribe(st)
61
+ # id = databus["/foo/bar"].subscribe {|event, slot| puts "Block got #{slot.data}" }
62
+ # databus["/foo/bar"].data = "data :-)" #=> publishes data
63
+ # databus["/foo/bar"].unsubscribe(id)
64
+ # databus["/foo/bar"].unsubscribe(st)
65
+ # databus["/foo/bar/int"].validate("Does not implement to_i") { | value | value.respond_to? "to_i" }
66
+ # databus["/foo/bar/int"].data = Hash.new #=> raises Does not implement to_i
67
+ #
68
+ # stack, data, proc, queue
69
+ #
70
+ class DataBus
71
+
72
+ SEPARATOR = 47; # 47 is ASCII for /
73
+
74
+ SUBSCRIBER = 0
75
+ EVENT = 1
76
+ SLOT = 2
77
+
78
+ # True to enable validating values in slots, default=true
79
+ attr_accessor :validation_enabled
80
+
81
+ # True if notify method propagates to parent.notify, default=true
82
+ attr_accessor :propagate_notifications
83
+
84
+ # The root of this DataBus
85
+ attr_reader :root
86
+
87
+ # The parent slot
88
+ attr_reader :parent
89
+
90
+ attr_reader :state
91
+
92
+ attr_reader :notification_thread
93
+
94
+ ##
95
+ # Constructs a DataBus
96
+ #
97
+ def initialize
98
+ @root = Slot.new("", nil, self)
99
+ @notification_queue = []
100
+ @idCount = 0
101
+ @validation_enabled = true
102
+ @propagate_notifications = true
103
+
104
+ # If only one bus, last created is available through $BUS and Object#bus:
105
+ $BUS = self
106
+ #start
107
+ end
108
+
109
+ ##
110
+ # Place a notification event into the queue to be delivered asynchronously
111
+ #
112
+ # to:: [Proc | #databus_notify] The object to deliver the event to
113
+ # event:: [Symbol] The event symbol
114
+ # slot:: [DataBus::Slot] The slot that the event occurred at
115
+ #
116
+ def queue_notification(to, event, slot)
117
+ @notification_queue << [to, event, slot]
118
+ @notification_thread.wakeup if @notification_thread.stop?
119
+ end
120
+
121
+ ##
122
+ # Starts the asynchronous notification queue
123
+ #
124
+ def start
125
+ @notification_thread = Thread.new {
126
+ loop do
127
+ while notification = @notification_queue.shift
128
+ if notification[SUBSCRIBER].kind_of? Proc
129
+ notification[SUBSCRIBER].call(notification[EVENT], notification[SLOT])
130
+ else
131
+ notification[SUBSCRIBER].databus_notify(notification[EVENT], notification[SLOT])
132
+ end
133
+ end
134
+ sleep unless @notification_queue.size > 0
135
+ end
136
+ }
137
+ end
138
+
139
+ ##
140
+ # Navigates to a path (relative) to the root
141
+ #
142
+ # path:: [String] The path (i.e. /foo/bar or foo/bar)
143
+ # return:: [FreeBASE::DataBus::Slot] The new or existing slot
144
+ # see:: FreeBASE::DataBus::Slot#[]
145
+ #
146
+ def [](path)
147
+ @root[path]
148
+ end
149
+
150
+ ##
151
+ # Incremented subscriber id counter
152
+ #
153
+ # return:: [Integer] unique id (incremented)
154
+ #
155
+ def idCount
156
+ @idCount = @idCount + 1
157
+ end
158
+
159
+ ##
160
+ # The LinkSlot class represents a slot that is a logical link
161
+ # to another slot in the databus
162
+ #
163
+ class LinkSlot
164
+ attr_reader :path, :parent, :name
165
+
166
+ ##
167
+ # Constructs a new link slot with the given name and parent
168
+ # linked to the supplied slot
169
+ #
170
+ # name:: [String] the name of this link slot
171
+ # parent:: [FreeBASE::DataBus::Slot] The parent of this slot
172
+ # link:: [FreeBASE::DataBus::Slot] The slot to link to
173
+ #
174
+ def initialize(name, parent, link)
175
+ @name = name
176
+ @parent = parent
177
+ @path = parent.nil? ? "/" : "#{parent.path}#{name}/"
178
+ @link = link
179
+ end
180
+
181
+ ##
182
+ # Unlinks this slot from the parent
183
+ #
184
+ def unlink
185
+ @parent.unlink(self)
186
+ end
187
+
188
+ ##
189
+ # Unlinks if pruning link slot, otherwise forwards to linked slot
190
+ #
191
+ # name:: [String=nil] The name of the slot to unlink
192
+ #
193
+ def prune(name=nil)
194
+ unlink unless name
195
+ @link.prune(name) if name
196
+ end
197
+
198
+ ##
199
+ # Returns if this slot is a link slot
200
+ #
201
+ # return:: [Boolean] True for all LinkSlot instances
202
+ #
203
+ def is_link_slot?
204
+ return true
205
+ end
206
+
207
+ ##
208
+ # Forward all unhandled calls to the linked slot
209
+ #
210
+ def method_missing(meth, *attrs, &block)
211
+ @link.send(meth, *attrs, &block)
212
+ end
213
+ end
214
+
215
+ ##
216
+ # The Slot class represents a subscribe and/or publish node
217
+ #
218
+ class Slot
219
+ DATA = "data_slot"
220
+ QUEUE = "queue_slot"
221
+ STACK = "stack_slot"
222
+ PROC = "proc_slot"
223
+ MAP = "map_slot"
224
+
225
+ # True if notify method propagates to parent.notify, default=true
226
+ attr_accessor :propagate_notifications
227
+
228
+ attr_reader :path, :parent, :name, :attrs
229
+
230
+ ##
231
+ # Creates a new Slot
232
+ #
233
+ # name:: [String] The name of the slot
234
+ # parent:: [Slot | Databus] The parent slot (or nil if root
235
+ # databus:: [Databus] The databus instance
236
+ #
237
+ def initialize(name, parent, databus)
238
+ @name = name
239
+ @parent = parent
240
+ @path = parent.nil? ? "/" : "#{parent.path}#{name}/"
241
+ @databus = databus
242
+ @slots = Hash.new
243
+ @subscribers = Hash.new
244
+ @propagate_notifications = true
245
+ notify(:notify_slot_add)
246
+ end
247
+
248
+ ##
249
+ # Returns if this slot is the root slot
250
+ #
251
+ # return:: [Boolean] true if this slot is root
252
+ #
253
+ def root?
254
+ return true if self==@databus.root
255
+ end
256
+
257
+ ##
258
+ # Sets this slots active manager
259
+ #
260
+ # manager:: [Object] The object to manager this slot
261
+ # raise:: [RuntimeException] If this slot is alread managed
262
+ #
263
+ def manager=(manager)
264
+ raise "Slot #{@path} already has an active manager: #{@manager}" if @manager
265
+ @manager = manager
266
+ notify(:notify_slot_managed)
267
+ end
268
+
269
+ ##
270
+ # Returns the manager of this slot (or its parent manager if
271
+ # this slot does not have a manager
272
+ #
273
+ # return:: [Object] The manager of this slot or nil
274
+ #
275
+ def manager
276
+ return @manager if @manager or root?
277
+ return @parent.manager
278
+ end
279
+
280
+ ##
281
+ # Determines if this slot has an active manager registered
282
+ # on it. This does not access the parent's manager if one
283
+ # is not set on this slot (as does the _manager method.
284
+ #
285
+ # return:: [Boolean] True if this slot has an active manager
286
+ #
287
+ def managed?
288
+ return @manager ? true : false
289
+ end
290
+
291
+ ##
292
+ # Checks if this slot has a child slot of the given name
293
+ #
294
+ # name:: [String] The name of the child slot
295
+ # return:: [Boolean] True if child slot exists, otherwise false
296
+ #
297
+ def has_child?(name=nil)
298
+ unless name
299
+ return true if @slots.size > 0
300
+ return false
301
+ end
302
+ return @slots.has_key?(name)
303
+ end
304
+
305
+ ##
306
+ # Returns all the children of this slot.
307
+ #
308
+ def children
309
+ c = []
310
+ self.each_slot {|slot| c << slot }
311
+ c
312
+ end
313
+
314
+ ##
315
+ # Navigates to a path (relative) to the current object (with DataBus as root)
316
+ #
317
+ # path:: [String] The path (i.e. /foo/bar or foo/bar)
318
+ # return:: [FreeBASE::DataBus::Slot] The new or existing slot
319
+ #
320
+ def [](path)
321
+ path = path.split("/") if path.kind_of? String
322
+ while path.first == "." # ignore single dot ./foo
323
+ path.shift
324
+ end
325
+ subslot = path.shift
326
+ unless root?
327
+ return @databus.root[path] if subslot == "" # started at root /foo
328
+ return parent[path] if subslot==".." # parent ../foo
329
+ end
330
+ while subslot=="" # get rid of multi-slashes ///foo
331
+ subslot = path.shift
332
+ end
333
+ return self unless subslot # path now empty...return self
334
+ unless (child = @slots[subslot]) # is child a defined ?
335
+ child = @slots[subslot]= Slot.new(subslot, self, @databus) # build new one
336
+ end
337
+ while path.first=="" # get rid of multi-slashes foo///bar
338
+ path.shift
339
+ end
340
+ return child if path.empty?
341
+ return child[path]
342
+ end
343
+
344
+ ##
345
+ # Prunes (removes) this slot (and all child slots)
346
+ #
347
+ # name:: [String=nil] The name of the child slot (nil == current slot)
348
+ # notification: :notify_slot_prune
349
+ #
350
+ def prune(name=nil)
351
+ if name and @slots[name]
352
+ @slots[name].notify(:notify_slot_prune)
353
+ @slots.delete(name)
354
+ return
355
+ end
356
+ raise "Cannot prune root slot" if root?
357
+ @slots.values.each {|slot| slot.prune}
358
+ @parent.prune(@name)
359
+ end
360
+
361
+ ##
362
+ # Iterates over the sub-slots and link slots
363
+ #
364
+ # recurse:: [Boolean=false] if true, recurses all child slots
365
+ # yeild:: [FreeBASE::DataBus::Slot] The child slot
366
+ #
367
+ def each_slot(recurse=false, &block)
368
+ return unless block_given?
369
+ @slots.keys.sort.each do |name|
370
+ slot = @slots[name]
371
+ yield slot
372
+ slot.each_slot(recurse, &block) if recurse
373
+ end
374
+ end
375
+
376
+ ##
377
+ # Links a child slot name to another slot in the databus
378
+ #
379
+ # child_name:: [String] The name of the child
380
+ # destination:: [String | FreeBASE::DataBus::Slot] The destination of the link
381
+ #
382
+ def link(child_name, destination)
383
+ destination = self[destination] if destination.kind_of? String
384
+ raise "Can only link to a DataBus::Slot" unless destination.kind_of? Slot
385
+ child = LinkSlot.new(child_name, self, destination)
386
+ @slots[child_name] = child
387
+ notify(:notify_slot_link, child)
388
+ child
389
+ end
390
+
391
+ ##
392
+ # Unlinks a child slot name to another slot in the databus
393
+ #
394
+ # child:: [String] The name of the child
395
+ #
396
+ def unlink(child)
397
+ return unless child
398
+ child = child.name unless child.kind_of? String
399
+ child = @slots.delete(child)
400
+ notify(:notify_slot_unlink, child) if child
401
+ end
402
+
403
+ ##
404
+ # Returns if this slot is a link slot
405
+ #
406
+ # return:: [Boolean] True is the slot is a link
407
+ #
408
+ def is_link_slot?
409
+ return false
410
+ end
411
+
412
+ ##
413
+ # Make the slot a Data slot and set the value of the data.
414
+ # notification :notify_data_set
415
+ #
416
+ # object:: [Object] The object to store in the slot
417
+ # raise:: [RuntimeException] If there is a validator and it fails to validate the object
418
+ # raise:: [RuntimeException] If this slot is not a Data slot
419
+ #
420
+ def data=(object)
421
+ check_type(DATA)
422
+ validate(object)
423
+ @data = object
424
+ notify(:notify_data_set)
425
+ end
426
+
427
+ ##
428
+ # Retrieves the value of the data object if this is a Data slot
429
+ #
430
+ # return:: [Object] The object stored in the slot
431
+ # raise:: [RuntimeException] If this slot is not a Data slot
432
+ #
433
+ def data
434
+ check_type(DATA)
435
+ return @data
436
+ end
437
+ alias_method :value, :data
438
+
439
+ ##
440
+ # Checks is this is a Data slot
441
+ #
442
+ # return:: [Boolean] true if this is a Data slot
443
+ #
444
+ def is_data_slot?
445
+ return @type==DATA
446
+ end
447
+
448
+ ##
449
+ # calls queue.join if this is a queue slot
450
+ #
451
+ def join(object)
452
+ return self.queue.join(object)
453
+ end
454
+
455
+ ##
456
+ # calls queue.join if this is a queue slot
457
+ #
458
+ def <<(object)
459
+ return self.queue << object
460
+ end
461
+
462
+ ##
463
+ # calls queue.leave is this is a queue slot
464
+ #
465
+ def leave
466
+ return self.queue.leave
467
+ end
468
+
469
+ ##
470
+ # calls stack.push if this is a stack slot
471
+ #
472
+ def push(object)
473
+ return self.stack.push(object)
474
+ end
475
+
476
+ ##
477
+ # calls stack.pop if this is a stack slot
478
+ #
479
+ def pop
480
+ return self.stack.pop
481
+ end
482
+
483
+ ##
484
+ # calls map.put if this is a map slot
485
+ #
486
+ def put(key, value)
487
+ return self.map.put(key,value)
488
+ end
489
+
490
+ ##
491
+ # calls map.get if this is a map slot
492
+ #
493
+ def get(key)
494
+ return self.map.get(key)
495
+ end
496
+
497
+ ##
498
+ # removes a key if this is a map slot
499
+ #
500
+ def remove(key)
501
+ return self.map.remove
502
+ end
503
+
504
+ ##
505
+ # Clears the stack or queue or map depending on the slot type
506
+ #
507
+ def clear
508
+ return self.queue.clear if is_queue_slot?
509
+ return self.stack.clear if is_stack_slot?
510
+ return self.map.clear if is_map_slot?
511
+ end
512
+
513
+ ##
514
+ # Return the number of objects in the stack or queue
515
+ #
516
+ # return:: [Integer] The number of objects
517
+ #
518
+ def count
519
+ return self.queue.count if is_queue_slot?
520
+ return self.stack.count if is_stack_slot?
521
+ return self.map.count if is_map_slot?
522
+ end
523
+
524
+ ##
525
+ # Retrieves the Queue object if this is a Queue slot
526
+ #
527
+ # return:: [FreeBASE::DataBus::Queue] The queue object of this slot
528
+ # raise:: [RuntimeException] If this slot is not a Queue slot
529
+ #
530
+ def queue
531
+ check_type(QUEUE)
532
+ @queue = Queue.new(self) unless @queue
533
+ return @queue
534
+ end
535
+
536
+ ##
537
+ # Checks if this is a Queue slot
538
+ #
539
+ # return:: [Boolean] true if this is a Queue slot
540
+ #
541
+ def is_queue_slot?
542
+ return @type==QUEUE
543
+ end
544
+
545
+ ##
546
+ # Retrieves the Stack object if this is a Stack slot
547
+ #
548
+ # return:: [FreeBASE::DataBus::Stack] The Stack object of this slot
549
+ # raise:: [RuntimeException] If this slot is not a Stack slot
550
+ #
551
+ def stack
552
+ check_type(STACK)
553
+ @stack = Stack.new(self) unless @stack
554
+ return @stack
555
+ end
556
+
557
+ ##
558
+ # Checks if this is a Stack slot
559
+ #
560
+ # return:: [Boolean] true if this is a Stack slot
561
+ #
562
+ def is_stack_slot?
563
+ return @type==STACK
564
+ end
565
+
566
+ ##
567
+ # Retrieves the ProcWrapper object if this is a queue slot
568
+ #
569
+ # return:: [FreeBASE::DataBus::ProcWrapper] The ProcWrapper object of this Proc slot
570
+ # raise:: [RuntimeException] If this slot is not a Proc slot
571
+ #
572
+ def proc
573
+ check_type(PROC)
574
+ @proc = ProcWrapper.new(self) unless @proc
575
+ return @proc
576
+ end
577
+
578
+ ##
579
+ # Checks if this is a Proc slot
580
+ #
581
+ # return:: [Boolean] true if this is a Proc slot
582
+ #
583
+ def is_proc_slot?
584
+ return @type==PROC
585
+ end
586
+
587
+ ##
588
+ # calls proc.set_proc if this is a proc slot
589
+ #
590
+ def set_proc(proc=nil, &block)
591
+ self.proc.set_proc(proc, &block)
592
+ end
593
+
594
+ ##
595
+ # calls proc.call if this is a proc slot (invoke is an alias)
596
+ #
597
+ def call(*args, &block)
598
+ return self.proc.call(*args, &block)
599
+ end
600
+ alias_method :invoke, :call
601
+
602
+ ##
603
+ # Retrieves the Map object if this is a hash slot
604
+ #
605
+ # return:: [FreeBASE::DataBus::Map] The HashWrapper object of this Hash slot
606
+ # raise:: [RuntimeException] If this slot is not a Hash slot
607
+ #
608
+ def map
609
+ check_type(MAP)
610
+ @map = Map.new(self) unless @map
611
+ return @map
612
+ end
613
+
614
+ ##
615
+ # Checks if this is a map slot
616
+ #
617
+ # return:: [Boolean] true if this is a map slot
618
+ #
619
+ def is_map_slot?
620
+ return @type==MAP
621
+ end
622
+
623
+ ##
624
+ # Checks to see if the type of slot is as specified. If the type is not defined, the
625
+ # type is set to the supplied type.
626
+ #
627
+ # type:: [String] The type of slot
628
+ # raise:: [RuntimeException] If the slot is of a different type that what is supplied
629
+ #
630
+ def check_type(type)
631
+ return if @type == type
632
+ raise "Slot #{path} cannot be set as a #{type} because its already a #{@type}" if @type
633
+ @type = type
634
+ end
635
+
636
+ private :check_type
637
+
638
+ ##
639
+ # Sends out a notification to subscribers of this slot. If this slot
640
+ # has a parent, the notification is propagated to the parent's notify method
641
+ # until the root slot is reached.
642
+ #
643
+ # event:: [Symbol] The event (:notify_obj_action)
644
+ # slot:: [Slot=self] The slot that has the action on it
645
+ #
646
+ def notify(event, slot = self)
647
+ if @subscribers.size > 0
648
+ @subscribers.each_value do |subscriber|
649
+ #@databus.queue_notification(subscriber, event, slot)
650
+ if subscriber.kind_of? Proc
651
+ subscriber.call(event, slot)
652
+ else
653
+ subscriber.databus_notify(event, slot)
654
+ end
655
+ end
656
+ end
657
+ @parent.notify(event, slot) if @propagate_notifications && @databus.propagate_notifications && @parent
658
+ end
659
+
660
+ ##
661
+ # Returns the subscribers to this slot (as a hash).
662
+ #
663
+ def subscribers
664
+ return @subscribers
665
+ end
666
+
667
+ ##
668
+ # If a validator is set on this slot, it is called with the
669
+ # data object
670
+ #
671
+ # object:: [Object] The object to validate against
672
+ # raise:: [RuntimeException] If validator fails
673
+ #
674
+ def validate(object)
675
+ if @databus.validation_enabled and @validator
676
+ raise@validatorError unless @validator.call(object)
677
+ end
678
+ end
679
+
680
+ ##
681
+ # The Subscription class is used to hold the slot so
682
+ # that one can cancel with the object.
683
+ #
684
+ # subscription = @databus['slot'].subscribe { |event, slot| ... }
685
+ # subscription.cancel
686
+ #
687
+ class Subscription
688
+ def initialize(slot)
689
+ @slot = slot
690
+ end
691
+
692
+ ##
693
+ # Cancel this subscription
694
+ #
695
+ def cancel
696
+ @slot.unsubscribe(self)
697
+ end
698
+ end
699
+
700
+ ##
701
+ # Subscribe to this slot
702
+ #
703
+ # subscriber:: [Object_databus_notify] The object to process the slot (response w/databus_notify(message, slot)
704
+ # &block:: [Block |message, slot|] The block to process the slot
705
+ # return:: [Object] The subscription ID (used for unsubscribe)
706
+ #
707
+ def subscribe(subscriber=nil, &block)
708
+ if subscriber
709
+ unless subscriber.respond_to?("databus_notify")
710
+ raise "Subscribers must impliment the databus_notify method"
711
+ end
712
+ @subscribers[subscriber] = subscriber
713
+ return subscriber
714
+ else
715
+ subscription = Subscription.new(self)
716
+ @subscribers[subscription] = Proc.new(&block)
717
+ return subscription
718
+ end
719
+ end
720
+
721
+ ##
722
+ # Unsubscribes to this slot
723
+ #
724
+ # subscriber:: [Object] The id returned from subscribe
725
+ #
726
+ def unsubscribe(subscriber)
727
+ @subscribers.delete(subscriber)
728
+ end
729
+
730
+ ##
731
+ # Dumps (puts) the subscriber list
732
+ #
733
+ def dump(array = nil)
734
+ if array
735
+ first = false
736
+ else
737
+ first = true
738
+ array = []
739
+ end
740
+ array << "Slot #{@path} [type='#{@type}', data='#{@data}', manager='#{@manager.class}']" if @type
741
+ @slots.each_value {|slot| slot.dump(array)}
742
+ array.each {|slot| puts slot} if first
743
+ end
744
+
745
+ ##
746
+ # Sets the validator for this slot
747
+ #
748
+ # validatorError:: [String=""] The error string to display if failure occurs
749
+ # &block:: [Block |object|] The block to process the published object. Must return true if object is valid.
750
+ #
751
+ def validate_with(validatorError="", &block)
752
+ @validator = block
753
+ @validatorError = "Object published into #{@path} did not pass validator: #{validatorError}"
754
+ end
755
+
756
+ ##
757
+ # Overrides method_missing to be able to set attributes using the following
758
+ # syntax:
759
+ # get:: slot.attr_<name> to get an attribute vulue
760
+ # set:: slot.attr_<name>=value to set and attribute value
761
+ #
762
+ def method_missing(methId, *args, &block)
763
+ tag = methId.id2name
764
+ if tag[0..4]=="attr_"
765
+ @attrs ||= {}
766
+ if tag[-1]==61 # 'attr_???='
767
+ attrname = tag[5..-2]
768
+ case attrname
769
+ when "parent", "name", "path"
770
+ raise "Attribute set by constructor"
771
+ else
772
+ @attrs[attrname] = args[0]
773
+ notify(:notify_attribute_set, self)
774
+ end
775
+ return
776
+ else
777
+ attrname = tag[5..-1]
778
+ case attrname
779
+ when "parent"
780
+ return @parent
781
+ when "name"
782
+ return @name
783
+ when "path"
784
+ return @path
785
+ else
786
+ return @attrs[attrname]
787
+ end
788
+ end
789
+ end
790
+ super
791
+ end
792
+
793
+ end
794
+
795
+ ##
796
+ # The Queue class represents a FIFO list for Slots that may need
797
+ # to manage such data (such as User Interface event propagation).
798
+ #
799
+ class Queue
800
+
801
+ ##
802
+ # Create the Queue object
803
+ #
804
+ # slot:: [FreeBASE::DataBus::Slot] The slot this queue belongs to.
805
+ #
806
+ def initialize(slot)
807
+ @slot = slot
808
+ @queue = []
809
+ end
810
+
811
+ ##
812
+ # Have the object join the queue
813
+ # notification :notify_queue_join
814
+ #
815
+ # object:: [Object] The object to place in the queue
816
+ #
817
+ def join(object)
818
+ @slot.validate(object)
819
+ @queue << object
820
+ @slot.notify(:notify_queue_join)
821
+ end
822
+
823
+ ##
824
+ # Same as _join(object)
825
+ #
826
+ def <<(object)
827
+ join(object)
828
+ end
829
+
830
+ ##
831
+ # Have the first object leave the queue
832
+ # notification :notify_queue_leave
833
+ #
834
+ # return:: [Object] The first object in the queue or nil
835
+ #
836
+ def leave
837
+ result = @queue.shift
838
+ @slot.notify(:notify_queue_leave)
839
+ return result
840
+ end
841
+
842
+ ##
843
+ # Return the number of objects in the stack
844
+ #
845
+ # return:: [Integer] The number of objects
846
+ #
847
+ def count
848
+ return @queue.size
849
+ end
850
+
851
+ ##
852
+ # Clear all objects from the queue
853
+ # notification :notify_queue_clear
854
+ #
855
+ def clear
856
+ @queue.clear
857
+ @slot.notify(:notify_queue_clear)
858
+ end
859
+
860
+ ##
861
+ # Return a given element in the queue. Leave it in place
862
+ # notification :none
863
+ # return: the value of the element at index
864
+ def [] (index)
865
+ @queue[index]
866
+ end
867
+
868
+ end
869
+
870
+ ##
871
+ # The Stack class represents a LIFO list for Slots that may need
872
+ # to manage such data.
873
+ #
874
+ class Stack
875
+
876
+ ##
877
+ # Create the Stack object
878
+ #
879
+ # slot:: [FreeBASE::DataBus::Slot] The slot this queue belongs to.
880
+ #
881
+ def initialize(slot)
882
+ @slot = slot
883
+ @stack = []
884
+ end
885
+
886
+ ##
887
+ # Push an object onto the stack.
888
+ # notification :notify_stack_push
889
+ #
890
+ # object:: [Object] The object to push on the stack
891
+ #
892
+ def push(object)
893
+ @slot.validate(object)
894
+ @stack.push object
895
+ @slot.notify(:notify_stack_push)
896
+ end
897
+
898
+ ##
899
+ # Pop an object off the stack.
900
+ # notification :notify_stack_pop
901
+ #
902
+ # return:: [Object] The object to popped from the stack
903
+ #
904
+ def pop
905
+ result = @stack.pop
906
+ @slot.notify(:notify_stack_pop)
907
+ return result
908
+ end
909
+
910
+ ##
911
+ # Return the number of objects in the stack
912
+ #
913
+ # return:: [Integer] The number of objects
914
+ #
915
+ def count
916
+ return @stack.size
917
+ end
918
+
919
+ ##
920
+ # Clear all objects from the stack
921
+ # notification :notify_stack_clear
922
+ #
923
+ def clear
924
+ @stack.clear
925
+ end
926
+
927
+ ##
928
+ # Return a given element in the stack. Leave it in place
929
+ # notification :none
930
+ # return: the value of the element at index
931
+ def [] (index)
932
+ @queue[index]
933
+ end
934
+
935
+ end
936
+
937
+ ##
938
+ # The ProcWrapper holds the Proc object for the Proc slot
939
+ #
940
+ # Usage::
941
+ # p = ProcWrapper.new(self)
942
+ # p.set {|p1, p2| puts p1,p2}
943
+ # p.call("one", "two") #=> "one"\n"two"
944
+ #
945
+ class ProcWrapper
946
+
947
+ ##
948
+ # Create the ProcWrapper object
949
+ #
950
+ # slot:: [FreeBASE::DataBus::Slot] The slot this proc wrapper belongs to.
951
+ #
952
+ def initialize(slot)
953
+ @slot = slot
954
+ end
955
+
956
+ ##
957
+ # Sets the proc
958
+ #
959
+ # proc:: [Proc = nil] The (optional) Proc to store
960
+ # &block:: [Block] The block to store
961
+ #
962
+ def set_proc(proc=nil, &block)
963
+ block = proc if proc
964
+ @proc = block
965
+ @slot.notify(:notify_proc_set)
966
+ end
967
+
968
+ ##
969
+ # Gets the proc
970
+ #
971
+ # return:: [Proc] The proc stored in this slot
972
+ #
973
+ def get_proc
974
+ return @proc
975
+ end
976
+
977
+ ##
978
+ # Calls the stored proc.
979
+ # nofication :notify_proc_call
980
+ #
981
+ # *args:: [*Array] The calling param array
982
+ # return:: [Object] The result of the proc
983
+ # raise:: [RuntimeException] If validator is enabled and the supplied args fail validation
984
+ #
985
+ def call(*args)
986
+ @slot.validate(args)
987
+ result = nil
988
+ result = @proc.call(*args) if @proc
989
+ @slot.notify(:notify_proc_call)
990
+ return result
991
+ end
992
+ end
993
+
994
+ ##
995
+ # The Map holds the Hash object for the Hash slot
996
+ #
997
+ # Usage::
998
+ # p = HashWrapper.new(self)
999
+ # p.put(key, value)
1000
+ # p.get(key) #=> value
1001
+ #
1002
+ class Map
1003
+ ##
1004
+ # Create the Map object
1005
+ #
1006
+ # slot:: [FreeBASE::DataBus::Slot] The slot this proc wrapper belongs to.
1007
+ #
1008
+ def initialize(slot)
1009
+ @slot = slot
1010
+ @map = {}
1011
+ end
1012
+
1013
+ ##
1014
+ # Sets the hash
1015
+ #
1016
+ # hash:: [Hash] The Hash to store
1017
+ #
1018
+ def map=(hash)
1019
+ @map=hash
1020
+ @slot.notify(:notify_map_set)
1021
+ end
1022
+
1023
+ ##
1024
+ # Clears the hash
1025
+ #
1026
+ def clear()
1027
+ @map = {}
1028
+ @slot.notify(:notify_map_cleared)
1029
+ end
1030
+
1031
+ ##
1032
+ # Removes an item from the hash
1033
+ #
1034
+ # key:: [key] The key to remove
1035
+ #
1036
+ def remove(key)
1037
+ @map.delete(key)
1038
+ @slot.notify(:notify_map_remove)
1039
+ end
1040
+
1041
+ ##
1042
+ # Gets the value
1043
+ #
1044
+ # key:: [Object] The key
1045
+ # return:: [Object] The value of the specified key
1046
+ #
1047
+ def get(key)
1048
+ return @map[key]
1049
+ end
1050
+
1051
+ ##
1052
+ # Sets the value of the supplied key
1053
+ #
1054
+ # key:: [Object] The key
1055
+ # value:: [Object] The value
1056
+ #
1057
+ def put(key, value)
1058
+ @map[key]=value
1059
+ @slot.notify(:notify_map_put)
1060
+ end
1061
+
1062
+ ##
1063
+ # Returns if the map slot contains the given key
1064
+ #
1065
+ # key:: [Object] The key
1066
+ # return:: [Boolean] true if the map has the key, otherwise false
1067
+ #
1068
+ def has_key?(key)
1069
+ return @map.has_key?(key)
1070
+ end
1071
+
1072
+ ##
1073
+ # Return the number of objects in the hash
1074
+ #
1075
+ # return:: [Integer] The number of objects
1076
+ #
1077
+ def count
1078
+ return @map.size
1079
+ end
1080
+
1081
+ end
1082
+
1083
+ ##
1084
+ # The Adapter is a helper class that allows for connecting slot
1085
+ # values together (in a Thread-safe way) so that changes to
1086
+ # one (or more) slots would result in automatic updates to
1087
+ # other slots
1088
+ #
1089
+ class Adapter
1090
+
1091
+ ##
1092
+ # Construct an Adapter object and subscribes to the supplied slots.
1093
+ #
1094
+ # slots:: [Array of FreeBASE::DataBus::Slot] The slots that the supplied block needs to manage
1095
+ # &block:: [Block | msg, slot |] The block to process the slot changes
1096
+ #
1097
+ def initialize(slots, &block)
1098
+ block = proc if proc
1099
+ slots.each {|slot| slot.subscribe(self)}
1100
+ @proc = block
1101
+ @thread_queue = []
1102
+ end
1103
+
1104
+ ##
1105
+ # Called from databus when slots are updated. This method
1106
+ # queues calling threads to ensure only a single thread updating
1107
+ # at the same time.
1108
+ #
1109
+ # msg:: [Symbol] the message symbol
1110
+ # slot:: [FreeBASE::DataBus::Slot] the slot that was updated
1111
+ #
1112
+ def databus_notify(msg, slot)
1113
+ return if @current_thread == Thread.current
1114
+ if @current_thread
1115
+ @thread_queue << Thread.current
1116
+ Thread.current.stop
1117
+ end
1118
+ @current_thread = Thread.current
1119
+ @proc.call(msg, slot)
1120
+ @current_thread = nil
1121
+ @thread_queue.shift.wake if @thread_queue.size>0
1122
+ end
1123
+ end
1124
+
1125
+
1126
+ end
1127
+ end
1128
+