maglev-webtools 0.2.1 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (296) hide show
  1. data/README.rdoc +38 -29
  2. data/bin/webtools +22 -1
  3. data/lib/web_tools/code_browser.rb +156 -0
  4. data/lib/web_tools/debugger.rb +96 -199
  5. data/lib/web_tools/info.rb +1 -3
  6. data/lib/web_tools/method_list.rb +67 -0
  7. data/lib/web_tools/middleware/debugger.rb +10 -16
  8. data/lib/web_tools/object_log.rb +24 -0
  9. data/lib/web_tools/session_list.rb +119 -0
  10. data/lib/web_tools/shared_page_cache.rb +30 -0
  11. data/lib/web_tools/stat_process.rb +24 -0
  12. data/lib/web_tools/statistics.rb +14 -0
  13. data/lib/web_tools/support/app_model.rb +66 -101
  14. data/lib/web_tools/support/code_browser.rb +88 -86
  15. data/lib/web_tools/support/debugger.rb +303 -0
  16. data/lib/web_tools/support/error_log.rb +33 -0
  17. data/lib/web_tools/support/ruby.rb +60 -121
  18. data/lib/web_tools/support/service_helper.rb +38 -10
  19. data/lib/web_tools/support/smalltalk_extensions.rb +12 -0
  20. data/lib/web_tools/tool.rb +48 -0
  21. data/lib/web_tools/ui.rb +14 -53
  22. data/lib/web_tools/version_report.rb +29 -0
  23. data/lib/web_tools/workspace.rb +77 -0
  24. data/lib/web_tools.rb +14 -4
  25. data/public/CodeBrowser.html +51 -0
  26. data/public/CodeMirror/LICENSE +19 -0
  27. data/public/CodeMirror/css/codemirror.css +67 -0
  28. data/public/CodeMirror/css/default.css +18 -0
  29. data/public/CodeMirror/js/codemirror.js +2131 -0
  30. data/public/CodeMirror/js/ruby.js +195 -0
  31. data/public/CodeMirror/js/smalltalk.js +139 -0
  32. data/public/Debugger.html +28 -0
  33. data/public/MethodList.html +20 -0
  34. data/public/ObjectLog.html +20 -0
  35. data/public/SessionList.html +31 -0
  36. data/public/SharedPageCache.html +78 -0
  37. data/public/Statistics.html +64 -0
  38. data/public/VersionReport.html +50 -0
  39. data/public/Workspace.html +39 -0
  40. data/public/css/CodeBrowser.css +24 -0
  41. data/public/css/Debugger.css +32 -0
  42. data/public/css/MethodList.css +8 -0
  43. data/public/css/ObjectLog.css +5 -0
  44. data/public/css/SessionList.css +9 -0
  45. data/public/css/Statistics.css +24 -0
  46. data/public/{stylesheets → css}/base/images/ui-anim_basic_16x16.gif +0 -0
  47. data/public/{stylesheets → css}/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  48. data/public/{stylesheets → css}/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  49. data/public/{stylesheets → css}/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  50. data/public/{stylesheets → css}/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  51. data/public/{stylesheets → css}/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  52. data/public/{stylesheets → css}/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  53. data/public/{stylesheets → css}/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  54. data/public/{stylesheets → css}/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  55. data/public/{stylesheets → css}/base/images/ui-icons_222222_256x240.png +0 -0
  56. data/public/{stylesheets → css}/base/images/ui-icons_2e83ff_256x240.png +0 -0
  57. data/public/{stylesheets → css}/base/images/ui-icons_454545_256x240.png +0 -0
  58. data/public/{stylesheets → css}/base/images/ui-icons_888888_256x240.png +0 -0
  59. data/public/{stylesheets → css}/base/images/ui-icons_cd0a0a_256x240.png +0 -0
  60. data/public/{stylesheets → css}/base/jquery.ui.accordion.css +0 -0
  61. data/public/{stylesheets → css}/base/jquery.ui.all.css +0 -0
  62. data/public/{stylesheets → css}/base/jquery.ui.autocomplete.css +0 -0
  63. data/public/{stylesheets → css}/base/jquery.ui.base.css +0 -0
  64. data/public/{stylesheets → css}/base/jquery.ui.button.css +0 -0
  65. data/public/{stylesheets → css}/base/jquery.ui.core.css +0 -0
  66. data/public/{stylesheets → css}/base/jquery.ui.datepicker.css +0 -0
  67. data/public/{stylesheets → css}/base/jquery.ui.dialog.css +0 -0
  68. data/public/{stylesheets → css}/base/jquery.ui.progressbar.css +0 -0
  69. data/public/{stylesheets → css}/base/jquery.ui.resizable.css +0 -0
  70. data/public/{stylesheets → css}/base/jquery.ui.selectable.css +0 -0
  71. data/public/{stylesheets → css}/base/jquery.ui.slider.css +0 -0
  72. data/public/{stylesheets → css}/base/jquery.ui.tabs.css +0 -0
  73. data/public/{stylesheets → css}/base/jquery.ui.theme.css +0 -0
  74. data/public/css/editor.css +25 -0
  75. data/public/css/jjmenu.css +33 -0
  76. data/public/css/menuitem.gif +0 -0
  77. data/public/css/more.gif +0 -0
  78. data/public/{stylesheets → css}/reset.css +1 -1
  79. data/public/css/smoothness/images/ui-anim_basic_16x16.gif +0 -0
  80. data/public/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  81. data/public/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  82. data/public/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  83. data/public/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  84. data/public/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  85. data/public/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  86. data/public/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  87. data/public/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  88. data/public/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  89. data/public/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  90. data/public/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  91. data/public/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  92. data/public/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  93. data/public/css/smoothness/jquery-ui.css +489 -0
  94. data/public/css/ui-lightness/images/ui-anim_basic_16x16.gif +0 -0
  95. data/public/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  96. data/public/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  97. data/public/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  98. data/public/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  99. data/public/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  100. data/public/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  101. data/public/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  102. data/public/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  103. data/public/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  104. data/public/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  105. data/public/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  106. data/public/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  107. data/public/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  108. data/public/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  109. data/public/css/ui-lightness/jquery-ui.css +489 -0
  110. data/public/css/webtools.css +65 -0
  111. data/public/favicon.ico +0 -0
  112. data/public/flot/API.txt +1201 -0
  113. data/public/flot/FAQ.txt +76 -0
  114. data/public/flot/LICENSE.txt +22 -0
  115. data/public/flot/Makefile +9 -0
  116. data/public/flot/NEWS.txt +508 -0
  117. data/public/flot/PLUGINS.txt +137 -0
  118. data/public/flot/README.txt +90 -0
  119. data/public/flot/examples/ajax.html +143 -0
  120. data/public/flot/examples/annotating.html +75 -0
  121. data/public/flot/examples/arrow-down.gif +0 -0
  122. data/public/flot/examples/arrow-left.gif +0 -0
  123. data/public/flot/examples/arrow-right.gif +0 -0
  124. data/public/flot/examples/arrow-up.gif +0 -0
  125. data/public/flot/examples/basic.html +38 -0
  126. data/public/flot/examples/data-eu-gdp-growth-1.json +4 -0
  127. data/public/flot/examples/data-eu-gdp-growth-2.json +4 -0
  128. data/public/flot/examples/data-eu-gdp-growth-3.json +4 -0
  129. data/public/flot/examples/data-eu-gdp-growth-4.json +4 -0
  130. data/public/flot/examples/data-eu-gdp-growth-5.json +4 -0
  131. data/public/flot/examples/data-eu-gdp-growth.json +4 -0
  132. data/public/flot/examples/data-japan-gdp-growth.json +4 -0
  133. data/public/flot/examples/data-usa-gdp-growth.json +4 -0
  134. data/public/flot/examples/graph-types.html +75 -0
  135. data/public/flot/examples/hs-2004-27-a-large_web.jpg +0 -0
  136. data/public/flot/examples/image.html +45 -0
  137. data/public/flot/examples/index.html +44 -0
  138. data/public/flot/examples/interacting-axes.html +97 -0
  139. data/public/flot/examples/interacting.html +93 -0
  140. data/public/flot/examples/layout.css +6 -0
  141. data/public/flot/examples/multiple-axes.html +60 -0
  142. data/public/flot/examples/navigate.html +118 -0
  143. data/public/flot/examples/percentiles.html +57 -0
  144. data/public/flot/examples/pie.html +756 -0
  145. data/public/flot/examples/realtime.html +83 -0
  146. data/public/flot/examples/resize.html +61 -0
  147. data/public/flot/examples/selection.html +114 -0
  148. data/public/flot/examples/setting-options.html +61 -0
  149. data/public/flot/examples/stacking.html +77 -0
  150. data/public/flot/examples/symbols.html +49 -0
  151. data/public/flot/examples/thresholding.html +54 -0
  152. data/public/flot/examples/time.html +71 -0
  153. data/public/flot/examples/tracking.html +95 -0
  154. data/public/flot/examples/turning-series.html +98 -0
  155. data/public/flot/examples/visitors.html +90 -0
  156. data/public/flot/examples/zooming.html +98 -0
  157. data/public/flot/excanvas.js +1427 -0
  158. data/public/flot/excanvas.min.js +1 -0
  159. data/public/flot/jquery.colorhelpers.js +179 -0
  160. data/public/flot/jquery.colorhelpers.min.js +1 -0
  161. data/public/flot/jquery.flot.crosshair.js +167 -0
  162. data/public/flot/jquery.flot.crosshair.min.js +1 -0
  163. data/public/flot/jquery.flot.fillbetween.js +183 -0
  164. data/public/flot/jquery.flot.fillbetween.min.js +1 -0
  165. data/public/flot/jquery.flot.image.js +238 -0
  166. data/public/flot/jquery.flot.image.min.js +1 -0
  167. data/public/flot/jquery.flot.js +2599 -0
  168. data/public/flot/jquery.flot.min.js +6 -0
  169. data/public/flot/jquery.flot.navigate.js +336 -0
  170. data/public/flot/jquery.flot.navigate.min.js +1 -0
  171. data/public/flot/jquery.flot.pie.js +750 -0
  172. data/public/flot/jquery.flot.pie.min.js +1 -0
  173. data/public/flot/jquery.flot.resize.js +60 -0
  174. data/public/flot/jquery.flot.resize.min.js +1 -0
  175. data/public/flot/jquery.flot.selection.js +344 -0
  176. data/public/flot/jquery.flot.selection.min.js +1 -0
  177. data/public/flot/jquery.flot.stack.js +184 -0
  178. data/public/flot/jquery.flot.stack.min.js +1 -0
  179. data/public/flot/jquery.flot.symbol.js +70 -0
  180. data/public/flot/jquery.flot.symbol.min.js +1 -0
  181. data/public/flot/jquery.flot.threshold.js +103 -0
  182. data/public/flot/jquery.flot.threshold.min.js +1 -0
  183. data/public/flot/jquery.js +8316 -0
  184. data/public/flot/jquery.min.js +23 -0
  185. data/public/genPacking.pl +30 -0
  186. data/public/index.html +28 -0
  187. data/public/install.tpz +66 -0
  188. data/public/installAndRun.tpz +5 -0
  189. data/public/jsTree/jquery.jstree.js +3510 -0
  190. data/public/jsTree/themes/default/d.gif +0 -0
  191. data/public/jsTree/themes/default/d.png +0 -0
  192. data/public/jsTree/themes/default/style.css +73 -0
  193. data/public/jsTree/themes/default/throbber.gif +0 -0
  194. data/public/readMe.txt +9 -0
  195. data/public/scripts/CodeBrowser.js +645 -0
  196. data/public/scripts/Debugger.js +134 -0
  197. data/public/scripts/MethodList.js +72 -0
  198. data/public/scripts/ObjectLog.js +59 -0
  199. data/public/scripts/SessionList.js +164 -0
  200. data/public/scripts/Statistics.js +266 -0
  201. data/public/scripts/editor.js +430 -0
  202. data/public/scripts/jjmenu.js +375 -0
  203. data/public/scripts/jquery-ui.js +1012 -0
  204. data/public/scripts/jquery.js +154 -0
  205. data/public/scripts/webtools.js +374 -0
  206. data/public/src/CodeBrowser.gs +416 -0
  207. data/public/src/Debugger.gs +132 -0
  208. data/public/src/MethodList.gs +130 -0
  209. data/public/src/ObjectLog.gs +73 -0
  210. data/public/src/Server.gs +544 -0
  211. data/public/src/SessionList.gs +172 -0
  212. data/public/src/SharedPageCache.gs +66 -0
  213. data/public/src/StatProcess.gs +280 -0
  214. data/public/src/StatProcessType.gs +242 -0
  215. data/public/src/StatStatistic.gs +381 -0
  216. data/public/src/Statistics.gs +222 -0
  217. data/public/src/Statmonitor.gs +490 -0
  218. data/public/src/Tool.gs +86 -0
  219. data/public/src/VersionReport.gs +52 -0
  220. data/public/src/Workspace.gs +163 -0
  221. data/views/debugger.rhtml +6 -9
  222. metadata +344 -243
  223. data/lib/web_tools/#debugger.rb# +0 -212
  224. data/lib/web_tools/browser.rb +0 -45
  225. data/public/images/favicon.ico +0 -0
  226. data/public/javascript/CodeMirror/LICENSE +0 -23
  227. data/public/javascript/CodeMirror/css/Smalltalk.css +0 -34
  228. data/public/javascript/CodeMirror/js/codemirror.js +0 -582
  229. data/public/javascript/CodeMirror/js/editor.js +0 -1671
  230. data/public/javascript/CodeMirror/js/highlight.js +0 -68
  231. data/public/javascript/CodeMirror/js/parseSmalltalk.js +0 -126
  232. data/public/javascript/CodeMirror/js/parsedummy.js +0 -32
  233. data/public/javascript/CodeMirror/js/select.js +0 -699
  234. data/public/javascript/CodeMirror/js/stringstream.js +0 -159
  235. data/public/javascript/CodeMirror/js/tokenize.js +0 -57
  236. data/public/javascript/CodeMirror/js/undo.js +0 -413
  237. data/public/javascript/CodeMirror/js/util.js +0 -133
  238. data/public/javascript/CodeMirror/testSmalltalkParser.html +0 -116
  239. data/public/javascript/ace/ace-uncompressed.js +0 -17299
  240. data/public/javascript/ace/ace.js +0 -1
  241. data/public/javascript/ace/keybinding-emacs.js +0 -1
  242. data/public/javascript/ace/keybinding-vim.js +0 -1
  243. data/public/javascript/ace/mode-c_cpp.js +0 -1
  244. data/public/javascript/ace/mode-clojure.js +0 -1
  245. data/public/javascript/ace/mode-coffee.js +0 -1
  246. data/public/javascript/ace/mode-csharp.js +0 -1
  247. data/public/javascript/ace/mode-css.js +0 -1
  248. data/public/javascript/ace/mode-groovy.js +0 -1
  249. data/public/javascript/ace/mode-html.js +0 -1
  250. data/public/javascript/ace/mode-java.js +0 -1
  251. data/public/javascript/ace/mode-javascript.js +0 -1
  252. data/public/javascript/ace/mode-json.js +0 -1
  253. data/public/javascript/ace/mode-lua.js +0 -1
  254. data/public/javascript/ace/mode-markdown.js +0 -1
  255. data/public/javascript/ace/mode-ocaml.js +0 -1
  256. data/public/javascript/ace/mode-perl.js +0 -1
  257. data/public/javascript/ace/mode-php.js +0 -1
  258. data/public/javascript/ace/mode-python.js +0 -1
  259. data/public/javascript/ace/mode-ruby.js +0 -1
  260. data/public/javascript/ace/mode-scad.js +0 -1
  261. data/public/javascript/ace/mode-scala.js +0 -1
  262. data/public/javascript/ace/mode-scss.js +0 -1
  263. data/public/javascript/ace/mode-svg.js +0 -1
  264. data/public/javascript/ace/mode-textile.js +0 -1
  265. data/public/javascript/ace/mode-xml.js +0 -1
  266. data/public/javascript/ace/theme-clouds.js +0 -1
  267. data/public/javascript/ace/theme-clouds_midnight.js +0 -1
  268. data/public/javascript/ace/theme-cobalt.js +0 -1
  269. data/public/javascript/ace/theme-crimson_editor.js +0 -1
  270. data/public/javascript/ace/theme-dawn.js +0 -1
  271. data/public/javascript/ace/theme-eclipse.js +0 -1
  272. data/public/javascript/ace/theme-idle_fingers.js +0 -1
  273. data/public/javascript/ace/theme-kr_theme.js +0 -1
  274. data/public/javascript/ace/theme-merbivore.js +0 -1
  275. data/public/javascript/ace/theme-merbivore_soft.js +0 -1
  276. data/public/javascript/ace/theme-mono_industrial.js +0 -1
  277. data/public/javascript/ace/theme-monokai.js +0 -1
  278. data/public/javascript/ace/theme-pastel_on_dark.js +0 -1
  279. data/public/javascript/ace/theme-solarized_dark.js +0 -1
  280. data/public/javascript/ace/theme-solarized_light.js +0 -1
  281. data/public/javascript/ace/theme-textmate.js +0 -1
  282. data/public/javascript/ace/theme-twilight.js +0 -1
  283. data/public/javascript/ace/theme-vibrant_ink.js +0 -1
  284. data/public/javascript/ace/worker-coffee.js +0 -1
  285. data/public/javascript/ace/worker-css.js +0 -1
  286. data/public/javascript/ace/worker-javascript.js +0 -1
  287. data/public/javascript/webtools/browser.js +0 -260
  288. data/public/javascript/webtools/debugger.coffee +0 -286
  289. data/public/javascript/webtools/debugger.js +0 -366
  290. data/public/javascript/webtools/sessions.coffee +0 -17
  291. data/public/javascript/webtools/sessions.js +0 -27
  292. data/public/javascript/webtools/version.coffee +0 -14
  293. data/public/javascript/webtools/version.js +0 -20
  294. data/public/stylesheets/jquery.contextMenu.css +0 -62
  295. data/public/stylesheets/webtools.css +0 -53
  296. data/public/test.html +0 -47
@@ -0,0 +1,33 @@
1
+ # A singleton to hold on to the debuggable processes
2
+
3
+ module WebTools
4
+ module Support
5
+ module ErrorLog
6
+ extend self
7
+ extend Enumerable
8
+
9
+ Entry = Struct.new :exception, :thread
10
+
11
+ def add(hash)
12
+ list << Entry.new(hash[:exception], hash[:thread])
13
+ list.last
14
+ end
15
+
16
+ def delete(entry)
17
+ list.delete entry
18
+ end
19
+
20
+ def list
21
+ defined?(@@list) ? @@list : @@list = []
22
+ end
23
+
24
+ def to_a
25
+ list
26
+ end
27
+
28
+ def each(&block)
29
+ list.each(&block)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,132 +1,71 @@
1
- require 'maglev/method_source'
2
1
  module WebTools
3
- # Provide information about the Ruby environment
4
- module Ruby
5
- # Traverse the Ruby namespace hierarchy and execute block for all classes
6
- # and modules. Returns an IdentitySet of all classes and modules found.
7
- # Skips autoloads (i.e., does not trigger them and does not yield them to
8
- # the block).
9
- #
10
- # @param [Module] klass The Class or Module object to start traversal.
11
- # Default is Object.
12
- #
13
- # @param [IdentitySet] rg The recursion guard used to prevent infinite
14
- # loops; also used as return value.
15
- #
16
- # @return [IdentitySet] An IdentitySet of all the Classes and Modules
17
- # registered in the Ruby namespace
18
- #
19
- def each_module(klass=Object, rg=IdentitySet.new, &block)
20
- raise 'Must be class or module' unless Module === klass
21
- unless rg.include?(klass)
22
- rg.add klass
23
- yield klass
24
- klass.constants.each do |c|
25
- unless klass.autoload?(c)
26
- obj = klass.const_get c
27
- each_module(obj, rg, &block) if Module === obj
28
- end
29
- end
30
- end
31
- rg
32
- end
33
- module_function :each_module
34
-
35
- # Returns a sorted list of class and module names in the Ruby Namespace
36
- #
37
- # @return [Array] sorted list of class and module names found in the Ruby
38
- # namespace hierarchy.
39
- def class_and_module_names
40
- names = []
41
- each_module { |klass| names << klass.name }
42
- names.sort
43
- end
44
- module_function :class_and_module_names
45
-
46
- # A simple message from Ruby Land.
47
- def say_something
48
- "Hello from MagLev, My name is '#{self.name}'"
49
- end
50
- module_function :say_something
2
+ module Support
3
+ # Provide information about the Ruby environment
4
+ module Ruby
5
+ MODULE_MOD_FNS = Module.instance_methods(false)
51
6
 
52
- # Return an object named in the Ruby namespace.
53
- #
54
- # @param [String] name The name of the object. E.g., "Object",
55
- # "Errno::EACCES", "Foo::Bar::Baz".
56
- #
57
- # @return [Object] the named object.
58
- #
59
- # @raise [NameError] if the name can't be found
60
- def find_in_namespace(name)
61
- name.split('::').inject(Object) do |parent, name|
62
- obj = parent.const_get name
7
+ def module_info_for(name)
8
+ mod = find_in_namespace name
9
+ { :constants => mod.constants.sort,
10
+ :class_methods => module_fns_for(mod),
11
+ :instance_methods => mod.instance_methods(false).sort }
63
12
  end
64
- end
65
- module_function :find_in_namespace
13
+ module_function :module_info_for
66
14
 
67
- MODULE_MOD_FNS = Module.instance_methods(false)
68
-
69
- def module_info_for(name)
70
- mod = find_in_namespace name
71
- { :constants => mod.constants.sort,
72
- :class_methods => module_fns_for(mod),
73
- :instance_methods => mod.instance_methods(false).sort }
74
- end
75
- module_function :module_info_for
15
+ def module_fns_for(mod)
16
+ res = []
17
+ begin
18
+ sclass = mod.__singleton_class
19
+ res = sclass.instance_methods(false) - MODULE_MOD_FNS
20
+ rescue => e
21
+ # nothing
22
+ end
23
+ res
24
+ end
25
+ module_function :module_fns_for
76
26
 
77
- def module_fns_for(mod)
78
- res = []
79
- begin
80
- sclass = mod.__singleton_class
81
- res = sclass.instance_methods(false) - MODULE_MOD_FNS
82
- rescue => e
83
- # nothing
27
+ # Get the source code for the named class and method
28
+ #
29
+ # The success of this method depends on being called from a Ruby stack,
30
+ # not a Smalltalk stack.
31
+ #
32
+ # @param [String] The name of the class
33
+ # @param [String] The method name
34
+ # @param [Boolean] if true, then look for a class method, otherwise look
35
+ # for an instance method.
36
+ def source_for(class_name, method_name, instance_method=true)
37
+ klass = find_in_namespace(class_name)
38
+ gsnmeth = klass.gs_method_for(method_name, instance_method)
39
+ src = gsnmeth.__source_string
40
+ file,line = gsnmeth.__source_location
41
+ file.nil? ? "#{src}\n# No file information available." : "#{src}\n##{file}:#{line}"
84
42
  end
85
- res
86
- end
87
- module_function :module_fns_for
43
+ module_function :source_for
88
44
 
89
- # Get the source code for the named class and method
90
- #
91
- # The success of this method depends on being called from a Ruby stack,
92
- # not a Smalltalk stack.
93
- #
94
- # @param [String] The name of the class
95
- # @param [String] The method name
96
- # @param [Boolean] if true, then look for a class method, otherwise look
97
- # for an instance method.
98
- def source_for(class_name, method_name, instance_method=true)
99
- klass = find_in_namespace(class_name)
100
- gsnmeth = klass.gs_method_for(method_name, instance_method)
101
- src = gsnmeth.__source_string
102
- file,line = gsnmeth.__source_location
103
- file.nil? ? "#{src}\n# No file information available." : "#{src}\n##{file}:#{line}"
104
- end
105
- module_function :source_for
45
+ # Return a display string suitable for rendering a constant.
46
+ # Currently, it just returns the results of #inspect on the object.
47
+ #
48
+ # TODO
49
+ # 1. If the const value is a proc, then return "Proc: " + the source code.
50
+ #
51
+ # @param [String,Symbol] class_name The name of the class to query.
52
+ # @param [String,Symbol] const_name The name of the constant.
53
+ # @return [String] A description of the constant.
54
+ #
55
+ def const_info_for(class_name, const_name)
56
+ klass = find_in_namespace class_name
57
+ const = klass.const_get const_name
58
+ const.inspect
59
+ end
60
+ module_function :const_info_for
106
61
 
107
- # Return a display string suitable for rendering a constant.
108
- # Currently, it just returns the results of #inspect on the object.
109
- #
110
- # TODO
111
- # 1. If the const value is a proc, then return "Proc: " + the source code.
112
- #
113
- # @param [String,Symbol] class_name The name of the class to query.
114
- # @param [String,Symbol] const_name The name of the constant.
115
- # @return [String] A description of the constant.
116
- #
117
- def const_info_for(class_name, const_name)
118
- klass = find_in_namespace class_name
119
- const = klass.const_get const_name
120
- const.inspect
62
+ # def logit(msg)
63
+ # File.open("/tmp/log", "a+") do |f|
64
+ # f.puts msg
65
+ # f.flush
66
+ # end
67
+ # end
68
+ # module_function :logit
121
69
  end
122
- module_function :const_info_for
123
-
124
- # def logit(msg)
125
- # File.open("/tmp/log", "a+") do |f|
126
- # f.puts msg
127
- # f.flush
128
- # end
129
- # end
130
- # module_function :logit
131
70
  end
132
71
  end
@@ -1,22 +1,50 @@
1
1
  require 'json/pure' unless defined? JSON
2
+ require 'rack/contrib/jsonp'
2
3
 
3
4
  module WebTools::Support::ServiceHelper
4
5
  def self.included(base)
5
- base.set :show_exceptions, true
6
+ base.set :show_exceptions, false
6
7
  base.set :raise_errors, false
8
+ base.set :method_override, true
9
+ base.set :logging, true
10
+ base.use Rack::JSONP
7
11
 
8
12
  base.error do
9
13
  excep = request.env['sinatra.error']
10
- { '_stack' => excep.backtrace.join("<br>") }.to_json
14
+ puts
15
+ p excep.message
16
+ puts excep.backtrace
17
+ json('_stack' => excep.backtrace.join("<br>"),
18
+ '_error' => excep.message)
11
19
  end
12
- end
13
20
 
14
- # Returns a JSON string that contains the data under the "data" key.
15
- # Adds other keys (_time, _stack) if appropriate.
16
- def prepare_data(data)
17
- raise "Expecting Hash" unless Hash === data
18
- data['_time'] = ((Time.now - @ts) * 1_000).to_i
19
- data['_stack'] = @stack
20
- data.to_json
21
+ base.before do
22
+ @ts = Time.now
23
+ end
24
+
25
+ base.helpers do
26
+ def non_meta_name(str)
27
+ if str =~ /^#<Class:.*>$/
28
+ str["#<Class:".length..-2]
29
+ else
30
+ str
31
+ end
32
+ end
33
+
34
+ def json(obj)
35
+ content_type :json
36
+ obj.to_hash.tap do |o|
37
+ o["_time"] = ((Time.now - @ts) * 1000).to_i
38
+ end.to_json
39
+ end
40
+
41
+ def reflect(obj)
42
+ system.reflect(obj)
43
+ end
44
+
45
+ def system
46
+ @reflection ||= MirrorAPI::Reflection.new
47
+ end
48
+ end
21
49
  end
22
50
  end
@@ -8,6 +8,8 @@ class Maglev::System
8
8
  #
9
9
  class_primitive_nobridge 'current_session_ids', 'currentSessions'
10
10
 
11
+ class_primitive_nobridge 'max_session_id', 'maxSessionId'
12
+
11
13
  # Return the cache process slot number (a SmallInteger) for the given
12
14
  # session ID. The session must be connected to the same shared page
13
15
  # cache as the session invoking this method.
@@ -52,6 +54,16 @@ class Maglev::System
52
54
  # must have the SessionAccess privilege.
53
55
  #
54
56
  class_primitive_nobridge 'description_of_session', 'descriptionOfSession:'
57
+
58
+ class_primitive_nobridge 'cache_statistics', 'cacheStatisticsAt:'
59
+ class_primitive_nobridge 'cache_statistics_description_for_type', 'cacheStatisticsDescriptionForType:'
60
+
61
+ begin
62
+ StatStatistic = __resolve_smalltalk_global(:StatStatistic)
63
+ class StatStatistic
64
+ class_primitive_nobridge 'cache_stat_descriptions', 'cacheStatDescriptions'
65
+ end
66
+ rescue Exception; end
55
67
  end
56
68
 
57
69
  # The stoneVersionReport returns a StringKeyValueDictionary.
@@ -0,0 +1,48 @@
1
+ require 'web_tools'
2
+ require 'sinatra/base'
3
+ require 'web_tools/support/service_helper'
4
+ require 'web_tools/support/error_log'
5
+
6
+ module WebTools
7
+ class Tool < Sinatra::Base
8
+ include WebTools::Support::ServiceHelper
9
+
10
+ before do
11
+ params.each do |k,v|
12
+ params[k] = Rack::Utils.unescape(v)
13
+ params[k] = false if v == "false"
14
+ params[k] = nil if v == "null"
15
+ params.delete(k) if v == "null" || v.empty?
16
+ end
17
+ end
18
+
19
+ class << self
20
+ def inherited(subclass)
21
+ super
22
+ self.subclasses << subclass
23
+ end
24
+
25
+ def dont_show!
26
+ @dont_show = true
27
+ end
28
+
29
+ def dont_show?
30
+ !!@dont_show
31
+ end
32
+
33
+ def subclasses
34
+ @subclasses ||= []
35
+ end
36
+
37
+ def display_name
38
+ name.split("::").last
39
+ end
40
+
41
+ def file_name
42
+ display_name + ".html"
43
+ end
44
+
45
+ alias description name
46
+ end
47
+ end
48
+ end
data/lib/web_tools/ui.rb CHANGED
@@ -1,67 +1,28 @@
1
1
  require 'sinatra/base'
2
2
  require 'web_tools'
3
+ require 'web_tools/support/service_helper'
3
4
 
4
5
  class WebTools::UI < Sinatra::Base
5
- use WebTools::Browser
6
- use WebTools::Debugger
7
- use WebTools::Info
6
+ PUBLIC_FOLDER = File.expand_path("../../../public", __FILE__)
7
+ include WebTools::Support::ServiceHelper
8
8
 
9
- before do
10
- @location = env["SCRIPT_NAME"]
11
- @javascripts = %w[
12
- https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
13
- https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js
14
- ]
15
- @stylesheets = %w[reset.css webtools.css]
9
+ helpers do
10
+ def static(file) File.read("#{PUBLIC_FOLDER}/#{file}.html") end
16
11
  end
17
12
 
18
13
  get '/' do
19
- erb :index
14
+ static :index
20
15
  end
21
16
 
22
- get '/browser' do
23
- @javascripts += %w[webtools/browser.js CodeMirror/js/codemirror.js]
24
- erb :browser
17
+ get '/tools' do
18
+ json "tools" => (WebTools::Tool.subclasses.reject(&:dont_show?).sort_by(&:name).map do |cls|
19
+ { "file" => cls.file_name,
20
+ "name" => cls.display_name,
21
+ "description" => cls.description }
22
+ end)
25
23
  end
26
24
 
27
- get '/debugger' do
28
- @javascripts += %w[
29
- ace/ace.js
30
- ace/mode-ruby.js
31
- webtools/debugger.js]
32
- erb :debugger
33
- end
34
-
35
- get '/info/version' do
36
- @javascripts += %w[webtools/version.js]
37
- @stylesheets = []
38
- erb :version
39
- end
40
-
41
- get '/info/sessions' do
42
- @javascripts += %w[webtools/sessions.js]
43
- @stylesheets = []
44
- erb :sessions
45
- end
46
-
47
- private
48
-
49
- def erb(*args, &block)
50
- @stylesheets = @stylesheets.map do |path|
51
- unless path =~ /^((http)|\/)/
52
- "#{@location}/stylesheets/#{path}"
53
- else
54
- path
55
- end
56
- end
57
-
58
- @javascripts = @javascripts.map do |path|
59
- unless path =~ /^((http)|\/)/
60
- "#{@location}/javascript/#{path}"
61
- else
62
- path
63
- end
64
- end
65
- super
25
+ get '/*' do
26
+ "#{params[:splat]} not implemented"
66
27
  end
67
28
  end
@@ -0,0 +1,29 @@
1
+ require 'sinatra/base'
2
+ require 'web_tools'
3
+ require 'web_tools/support/service_helper'
4
+
5
+ class WebTools::VersionReport < WebTools::Tool
6
+
7
+ def self.description
8
+ 'Information about the Stone and Gem processes and their host(s)'
9
+ end
10
+
11
+ get '/' do
12
+ json("stone" => stone_version_report,
13
+ "gem" => gem_version_report)
14
+ end
15
+
16
+ def stone_version_report
17
+ results = { }
18
+ rpt = Maglev::System.stone_version_report
19
+ rpt.keys.each { |k| results[k] = rpt.at(k) }
20
+ results
21
+ end
22
+
23
+ def gem_version_report
24
+ results = { }
25
+ rpt = Maglev::System.gem_version_report
26
+ rpt.keys.each { |k| results[k] = rpt.at(k) }
27
+ results
28
+ end
29
+ end