redcar 0.2.9dev

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