web-console 2.0.0.beta2 → 2.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of web-console might be problematic. Click here for more details.

Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.markdown +304 -19
  4. data/app/assets/javascripts/web_console/application.js +1 -0
  5. data/app/assets/javascripts/web_console/console_sessions.js +172 -0
  6. data/app/assets/stylesheets/web_console/application.css +13 -0
  7. data/app/assets/stylesheets/web_console/console_sessions.css.erb +6 -0
  8. data/app/controllers/web_console/application_controller.rb +13 -0
  9. data/app/controllers/web_console/console_sessions_controller.rb +43 -0
  10. data/app/helpers/web_console/application_helper.rb +4 -0
  11. data/app/helpers/web_console/console_session_helper.rb +4 -0
  12. data/app/models/web_console/console_session.rb +96 -0
  13. data/app/views/layouts/web_console/application.html.erb +14 -0
  14. data/app/views/web_console/console_sessions/index.html.erb +15 -0
  15. data/config/routes.rb +11 -0
  16. data/lib/action_dispatch/debug_exceptions.rb +69 -69
  17. data/lib/action_dispatch/exception_wrapper.rb +2 -1
  18. data/lib/assets/javascripts/web-console.js +1 -0
  19. data/lib/assets/javascripts/web_console.js +41 -0
  20. data/lib/web_console.rb +14 -15
  21. data/lib/web_console/colors.rb +87 -0
  22. data/lib/web_console/colors/light.rb +24 -0
  23. data/lib/web_console/colors/monokai.rb +24 -0
  24. data/lib/web_console/colors/solarized.rb +47 -0
  25. data/lib/web_console/colors/tango.rb +24 -0
  26. data/lib/web_console/colors/xterm.rb +24 -0
  27. data/lib/web_console/engine.rb +95 -0
  28. data/lib/web_console/exception_extension.rb +10 -11
  29. data/lib/web_console/repl_session.rb +5 -3
  30. data/lib/web_console/slave.rb +139 -0
  31. data/lib/web_console/version.rb +1 -1
  32. data/lib/web_console/view_helpers.rb +3 -7
  33. data/test/controllers/web_console/console_sessions_controller_test.rb +95 -0
  34. data/test/dummy/app/controllers/exception_test_controller.rb +4 -0
  35. data/test/dummy/app/views/exception_test/xhr.html.erb +1 -0
  36. data/test/dummy/config/application.rb +37 -1
  37. data/test/dummy/config/environments/test.rb +2 -0
  38. data/test/dummy/config/routes.rb +1 -0
  39. data/test/dummy/db/development.sqlite3 +0 -0
  40. data/test/dummy/log/development.log +61814 -0
  41. data/test/dummy/log/test.log +8621 -3
  42. data/test/dummy/tmp/cache/assets/development/sprockets/038461854af2e8bccdb29768efd4768f +0 -0
  43. data/test/dummy/tmp/cache/assets/development/sprockets/0ec396634a5f6808b026257fd107c355 +0 -0
  44. data/test/dummy/tmp/cache/assets/development/sprockets/127a54171eea8d294e4673599861787d +0 -0
  45. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  46. data/test/dummy/tmp/cache/assets/development/sprockets/17c571144b4e44da39bddb2d2c412414 +0 -0
  47. data/test/dummy/tmp/cache/assets/development/sprockets/1cb77d8cf661ccbc9de08f347c89b9f1 +0 -0
  48. data/test/dummy/tmp/cache/assets/development/sprockets/204edd12a29660722d4e0d8de9bd6652 +0 -0
  49. data/test/dummy/tmp/cache/assets/development/sprockets/2b96b037f3dfeccfe27113eb95b06ea1 +0 -0
  50. data/test/dummy/tmp/cache/assets/development/sprockets/2c853768baf811357d81d41bdfd05dcf +0 -0
  51. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  52. data/test/dummy/tmp/cache/assets/development/sprockets/314d48e543146f617c4d3439a4d8d40d +0 -0
  53. data/test/dummy/tmp/cache/assets/development/sprockets/34f21019a876722b8c24a6da4f0ef50b +0 -0
  54. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  55. data/test/dummy/tmp/cache/assets/development/sprockets/36341e42f23669574fa1027d0958ff3e +0 -0
  56. data/test/dummy/tmp/cache/assets/development/sprockets/44117154e909436e7eeaf10cdb18d2b4 +0 -0
  57. data/test/dummy/tmp/cache/assets/development/sprockets/496864a905d53afd8e176f29500f96a8 +0 -0
  58. data/test/dummy/tmp/cache/assets/development/sprockets/55b7b76605fdffe31d737d4ac1f1ef7b +0 -0
  59. data/test/dummy/tmp/cache/assets/development/sprockets/5ac98782fe3dfd0a766f75ce1801f0a0 +0 -0
  60. data/test/dummy/tmp/cache/assets/development/sprockets/6088d6f344b38303cc8028057d69e0f9 +0 -0
  61. data/test/dummy/tmp/cache/assets/development/sprockets/676dcf9b2d01b9dc7bd3183d8da88463 +0 -0
  62. data/test/dummy/tmp/cache/assets/development/sprockets/680381170dc160e358fc28076ea6886c +0 -0
  63. data/test/dummy/tmp/cache/assets/development/sprockets/6ad7acc9a22fe2a67ec24a1fc866c20e +0 -0
  64. data/test/dummy/tmp/cache/assets/development/sprockets/6bdb0d0c602e0e1bc304dc697e2cc6de +0 -0
  65. data/test/dummy/tmp/cache/assets/development/sprockets/6dc8d7aa69668fce85683aaad6615432 +0 -0
  66. data/test/dummy/tmp/cache/assets/development/sprockets/6e4d5b32cc444226f6597198994ccd5e +0 -0
  67. data/test/dummy/tmp/cache/assets/development/sprockets/74db0ca5cb8c8c347c9131a3ff516748 +0 -0
  68. data/test/dummy/tmp/cache/assets/development/sprockets/7999e525c88173c1beb785f002effc1d +0 -0
  69. data/test/dummy/tmp/cache/assets/development/sprockets/7a50a9e605754e99783de95715b976b0 +0 -0
  70. data/test/dummy/tmp/cache/assets/development/sprockets/806b0e33a2fe8e1245534345fa27c30a +0 -0
  71. data/test/dummy/tmp/cache/assets/development/sprockets/8aa4c7aabff23c8089d41e9e54193483 +0 -0
  72. data/test/dummy/tmp/cache/assets/development/sprockets/90396626cba6cbec37e32038e6c54e76 +0 -0
  73. data/test/dummy/tmp/cache/assets/development/sprockets/976b28910aa72c90a3b30c6e940f51df +0 -0
  74. data/test/dummy/tmp/cache/assets/development/sprockets/99e1bd7cbc437505bc8f07bc528c721c +0 -0
  75. data/test/dummy/tmp/cache/assets/development/sprockets/aaccf2c9ae2add0863c9a49e0042a097 +0 -0
  76. data/test/dummy/tmp/cache/assets/development/sprockets/ae4677d24a79d9411f2fced5011d5807 +0 -0
  77. data/test/dummy/tmp/cache/assets/development/sprockets/b2401118729720034b6f3eda0b4c5025 +0 -0
  78. data/test/dummy/tmp/cache/assets/development/sprockets/c649837df826fc310cb80f1adafd6b8d +0 -0
  79. data/test/dummy/tmp/cache/assets/development/sprockets/cac185d59612fae451a12df3fc21bb51 +0 -0
  80. data/test/dummy/tmp/cache/assets/development/sprockets/cb0065359d3b5b296f71d673f4b276e9 +0 -0
  81. data/test/dummy/tmp/cache/assets/development/sprockets/cee8c6b09c33d2b276753e959712724e +0 -0
  82. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sprockets/d1f6e06bc2f112c4ec3a4c3f68351878 +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sprockets/d20d83fd7ffa378b1b2b901786d640f3 +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sprockets/d38c7c3aa1e72b55769ccb3607641ef4 +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sprockets/d6b85d8b0b5c569388b89e56e9f6fed7 +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sprockets/d982412def520c434e2240eae6d29cf2 +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sprockets/df048a8b0897b9c04acdf59c8f95b18f +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sprockets/df600f50f002512c95d93bcfbab891ed +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sprockets/e6d6b8bde546349764be7b44ffcf5807 +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sprockets/eb25265794d2f7afd1684779d84efdac +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sprockets/ee8826b12b7d9bfd717df950b58f82ab +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sprockets/ef9824789c6ed3483590e0564a12e1d1 +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sprockets/fc7201c6cbef32453aa4175c520c8eae +0 -0
  97. data/test/dummy/tmp/cache/assets/test/sprockets/17c571144b4e44da39bddb2d2c412414 +0 -0
  98. data/test/dummy/tmp/cache/assets/test/sprockets/36341e42f23669574fa1027d0958ff3e +0 -0
  99. data/test/dummy/tmp/cache/assets/test/sprockets/55b7b76605fdffe31d737d4ac1f1ef7b +0 -0
  100. data/test/dummy/tmp/cache/assets/test/sprockets/5ac98782fe3dfd0a766f75ce1801f0a0 +0 -0
  101. data/test/dummy/tmp/cache/assets/test/sprockets/680381170dc160e358fc28076ea6886c +0 -0
  102. data/test/dummy/tmp/cache/assets/test/sprockets/6ad7acc9a22fe2a67ec24a1fc866c20e +0 -0
  103. data/test/dummy/tmp/cache/assets/test/sprockets/6e4d5b32cc444226f6597198994ccd5e +0 -0
  104. data/test/dummy/tmp/cache/assets/test/sprockets/7a50a9e605754e99783de95715b976b0 +0 -0
  105. data/test/dummy/tmp/cache/assets/test/sprockets/8aa4c7aabff23c8089d41e9e54193483 +0 -0
  106. data/test/dummy/tmp/cache/assets/test/sprockets/b2401118729720034b6f3eda0b4c5025 +0 -0
  107. data/test/dummy/tmp/cache/assets/test/sprockets/cb0065359d3b5b296f71d673f4b276e9 +0 -0
  108. data/test/dummy/tmp/cache/assets/test/sprockets/d1f6e06bc2f112c4ec3a4c3f68351878 +0 -0
  109. data/test/dummy/tmp/cache/assets/test/sprockets/d6b85d8b0b5c569388b89e56e9f6fed7 +0 -0
  110. data/test/dummy/tmp/cache/assets/test/sprockets/d982412def520c434e2240eae6d29cf2 +0 -0
  111. data/test/dummy/tmp/cache/assets/test/sprockets/df048a8b0897b9c04acdf59c8f95b18f +0 -0
  112. data/test/dummy/tmp/cache/assets/test/sprockets/e6d6b8bde546349764be7b44ffcf5807 +0 -0
  113. data/test/models/console_session_test.rb +58 -0
  114. data/test/web_console/colors_test.rb +58 -0
  115. data/test/web_console/engine_test.rb +136 -0
  116. data/test/web_console/slave_test.rb +71 -0
  117. data/vendor/assets/javascripts/term.js +5726 -0
  118. metadata +188 -7
  119. data/lib/web_console/railtie.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa9bc0cbd67b25849857f7a177f4b7ba07661181
4
- data.tar.gz: addbbd283a8ea089987778866ddf54d944ce5f6d
3
+ metadata.gz: afe33c91afb082074dd982930c4aef140c279c9e
4
+ data.tar.gz: e77676a84dde11dae828446db54974a79fbe3896
5
5
  SHA512:
6
- metadata.gz: 66d8cd7737d30e96e28e26b3a069cffab520b1b1a6013ac8941cc9d59526ffe43b8a2d98780f726f9758b377ad7f41596b42f4155c1d76328138ce292cdbe2ba
7
- data.tar.gz: aff25f96874d6a599a44cbe25411689a44f225d6ca97cac4a4682920b8fbb88c57e1d42e30f9ceebc84659d33a33def808d335bb86d5481768b792dff3586f22
6
+ metadata.gz: 8180671dcf6b9227a3f0c1d1ccf5397f8926734b91a2586bf83f4a2f06b9b1fd7de58f10a13731108493459111c4a522ffde51c14dd668aa2f90255c7e0c6ce1
7
+ data.tar.gz: fbed5ea4aa571865488f344f94b35d05f81b39174f52ddab726f43cbb77274f91aedd1ef72d904a611848082d5f57f920b891614a5610a6755a498a319613eee
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2013 Genadi Samokovarov and Guillermo Iguaran
1
+ Copyright 2014 Charlie Somerville, Genadi Samokovarov, Guillermo Iguaran and Ryan Dao
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.markdown CHANGED
@@ -8,61 +8,346 @@
8
8
  </p>
9
9
 
10
10
  <p align=center>
11
- <em>Web Console is going through an overhaul. If you are looking for a stable
11
+ <em>Web Console is currently in beta for <code>2.0.0</code>. If you're searching for a stable
12
12
  version documentation, checkout the links above.</em>
13
13
  </p>
14
14
 
15
15
  Web Console [![Travis](https://travis-ci.org/rails/web-console.png)](https://travis-ci.org/rails/web-console)
16
16
  ===========
17
17
 
18
- Web Console is a debugging console for your Rails application. It is launched whenever an error occurs or manually by using the console helper.
18
+ _Web Console_ is a set of debugging tools for your Rails application.
19
19
 
20
+ **A debugging tool in the default error page.**
21
+
22
+ An interactive console is launched automatically in the default Rails error
23
+ page. It makes it easy to inspect the stack trace and execute Ruby code in the stack
24
+ trace's bindings.
25
+
26
+ _(Check out [better_errors] as a great alternative for any Rack application!)_
27
+
28
+ ![image](https://cloud.githubusercontent.com/assets/705116/3825943/a010af92-1d5a-11e4-84c2-4ed0ba367f4e.gif)
29
+
30
+ **A debugging tool in your views.**
31
+
32
+ Drop `<%= console %>` anywhere in a view to launch an interactive console session and
33
+ execute code in it.
34
+
35
+ ![image](https://cloud.githubusercontent.com/assets/705116/3825939/7e284de0-1d5a-11e4-9896-81465a38da76.gif)
36
+
37
+ **A [VT100] compatible terminal.**
38
+
39
+ Running `rails console` is quite handy. Sometimes, though, you can't easily
40
+ access it, or maybe you want to easily share your session with a friend without
41
+ configuring a remote desktop server.
42
+
43
+ _Web Console_ can help you by running `rails console` _(or any other
44
+ commandline app)_, in full featured terminal right in the browser.
45
+
46
+ ![demo](http://f.cl.ly/items/3N3K412T381u2w360F2M/Screen%20Shot%202013-09-06%20at%208.24.57%20PM.png)
20
47
 
21
48
  Requirements
22
49
  ------------
23
50
 
24
51
  _Web Console_ has been tested on the following rubies.
25
52
 
53
+ * _MRI Ruby_ 2.1.0
26
54
  * _MRI Ruby_ 2.0.0
27
55
  * _MRI Ruby_ 1.9.3
28
56
 
29
- _Web Console_ is built explicitly for _Rails 4_.
57
+ There is an experimental _JRuby_ 1.7 support. See Installation section for more
58
+ information.
30
59
 
31
- Dependencies
32
- ------------
60
+ _Rubunius_ in 1.9 mode may work, but it hasn't been explicitly tested.
33
61
 
34
- Web Console is bundled with `bindings_of_caller`. Because of the dependency, the gem only works on MRI Ruby at the moment.
62
+ _Web Console_ is built explicitly for _Rails 4_. Check out the
63
+ [web-console-rails3] project for a _Rails 3_ compatible build.
35
64
 
36
65
  Installation
37
66
  ------------
38
67
 
39
- Add the `web-console` gem to your Gemfile. Be sure to use the master branch version for now:
68
+ To install it in your current application, add the following to your `Gemfile`.
69
+
70
+ ```ruby
71
+ group :development do
72
+ gem 'web-console', '2.0.0.beta2'
73
+ end
74
+ ```
75
+
76
+ For _JRuby_ support, you need to add an unreleased version of
77
+ `binding_of_caller`.
40
78
 
41
- gem 'web-console', git: 'git://github.com/rails/web-console'
79
+ ```ruby
80
+ group :development do
81
+ gem 'web-console', '2.0.0.beta2'
82
+ gem 'binding_of_caller', github: 'banister/binding_of_caller'
83
+ end
84
+ ```
42
85
 
86
+ After you save the `Gemfile` changes, make sure to run `bundle install` and
87
+ restart your server for the _Web Console_ to kick in.
43
88
 
44
- Use Cases
89
+ Configuration
45
90
  -------------
46
91
 
47
- ### Debug when an error happens
92
+ ### config.web_console.automount
48
93
 
49
- Web Console is launched automatically in the default Rails error page. It's easy to inspect the stack trace and execute Ruby code in the stack trace's bindings.
94
+ If you want to automatically mount `WebConsole::Engine`, you can set this
95
+ option to `true`. The terminal will be mounted at the location pointed by
96
+ `config.web_console.default_mount_path`.
50
97
 
51
- ![image](https://cloud.githubusercontent.com/assets/705116/3825943/a010af92-1d5a-11e4-84c2-4ed0ba367f4e.gif)
98
+ Defaults to `false`.
52
99
 
53
- ### Inspect view and controller binding
100
+ _(Note that, this option used to default to `true` in the 1.0 days. We no
101
+ longer automatically mount the web terminal at `/console`.)_.
54
102
 
55
- In your view, drop `<%= console %>` anywhere to launch the console and execute code in the view binding. A helper for running the console in the controller binding is under development.
103
+ ### config.web_console.default_mount_path
56
104
 
57
- ![image](https://cloud.githubusercontent.com/assets/705116/3825939/7e284de0-1d5a-11e4-9896-81465a38da76.gif)
105
+ By default, the console will be mounted on `/console`.
106
+
107
+ _(This happens only in the development and test environments!)_.
108
+
109
+ Say you want to mount the console to `/debug`, so you can more easily remember
110
+ where to go, when your application needs debugging.
111
+
112
+ ```ruby
113
+ class Application < Rails::Application
114
+ config.web_console.default_mount_path = '/debug'
115
+ end
116
+ ```
117
+
118
+ > Today we have learned in the agony of war that great power involves great
119
+ > responsibility.
120
+ >
121
+ > -- <cite>Franklin D. Roosevelt</cite>
122
+
123
+ _Web Console_ is a powerful tool. It allows you to execute arbitrary code on
124
+ the server, so you should be very careful, who you give access to it.
125
+
126
+ ### config.web_console.whitelisted_ips
127
+
128
+ By default, only requests coming from `127.0.0.1` are allowed.
129
+
130
+ `config.web_console.whitelisted_ips` lets you control which IP's have access to
131
+ the console.
132
+
133
+ Let's say you want to share your console with just that one roommate, you like
134
+ and his/her IP is `192.168.0.100`.
135
+
136
+ ```ruby
137
+ class Application < Rails::Application
138
+ config.web_console.whitelisted_ips = %w( 127.0.0.1 192.168.0.100 )
139
+ end
140
+ ```
141
+
142
+ From the example, you can guess that `config.web_console.whitelisted_ips`
143
+ accepts an array of ip addresses, provided as strings. An important thing to
144
+ note here is that, we won't push `127.0.0.1` if you manually set the option!
145
+
146
+ Now let's assume you like all of your roommates. Instead of enumerating their
147
+ IP's, you can whitelist the whole private network. Now every time their IP's
148
+ change, you'll have them covered.
149
+
150
+ ```ruby
151
+ class Application < Rails::Application
152
+ config.web_console.whitelisted_ips = '192.168.0.0/16'
153
+ end
154
+ ```
155
+
156
+ You can see that `config.web_console.whitelisted_ips` accepts plains strings
157
+ too. More than that, they can cover whole networks.
158
+
159
+ Again, note that this network doesn't allow `127.0.0.1`. If you want to access
160
+ the console, you have to do so from it's external IP or add `127.0.0.1` to the
161
+ mix.
162
+
163
+ ### config.web_console.command
164
+
165
+ By default, _Web Console_ will run `Rails.root.join('bin/rails console)` to
166
+ spawn you a fresh Rails console. If the relative `bin/rails` doesn't exist,
167
+ `rails console` will be run instead.
168
+
169
+ One of the advantages of being a [VT100] emulator is that _Web Console_ can run
170
+ most of your terminal applications.
171
+
172
+ Let say _(for some reason)_ you can't run SSH on your server machine. You can
173
+ run [`login`][login] instead to let users sign into the host system.
174
+
175
+ ```ruby
176
+ class Application < Rails::Application
177
+ # You have to run /bin/login as root. That should worry you and you may work
178
+ # around it by running ssh connecting to the same machine.
179
+ config.web_console.command = 'sudo /bin/login'
180
+ end
181
+ ```
182
+
183
+ _Poor man's solution to SSH._ ![boom](http://f.cl.ly/items/3n2h0p1w0B261u2d201b/boom.png)
184
+
185
+ **If you ever decide to use _Web Console_ that way, use SSL to encrypt the
186
+ traffic, otherwise all the input (including the negotiated username and
187
+ password) can be easily sniffed!**
188
+
189
+ ### config.web_console.term
190
+
191
+ By default, the _Web Console_ terminal will report itself as `xterm-color`. You
192
+ can override this option to change it with this option.
193
+
194
+ ### config.web_console.timeout
195
+
196
+ You may have noticed that _Web Console_ client sends a lot of requests to the
197
+ server. And by a lot, we really mean, **a lot** _(every few milliseconds)_.
198
+ We do this since we can't reliably predict when the output of your command
199
+ execution will come available, so we poll for it.
200
+
201
+ This option control how much will the server wait on the process output pipe
202
+ for input, before signalling the client to try again.
203
+
204
+ Maybe some day Web Sockets or SSE can be used for more efficient communication.
205
+ Until that day, you can use long-polling. To enable it, use [Puma] as your
206
+ development server and add the following to your configuration.
207
+
208
+ ```ruby
209
+ class Application < Rails::Application
210
+ # You have to explicitly enable the concurrency, as in development mode,
211
+ # the falsy config.cache_classes implies no concurrency support.
212
+ #
213
+ # The concurrency is enabled by removing the Rack::Lock middleware, which
214
+ # wraps each request in a mutex, effectively making the request handling
215
+ # synchronous.
216
+ config.allow_concurrency = true
217
+
218
+ # For long-polling, 45 seconds timeout for the development server seems
219
+ # reasonable. You may want to experiment with the value.
220
+ config.web_console.timeout = 45.seconds
221
+ end
222
+ ```
223
+
224
+ Styling
225
+ -------
226
+
227
+ If you would like to style the terminal a bit different than the default
228
+ appearance, you can do so with the following options.
229
+
230
+ ### config.web_console.style.colors
231
+
232
+ _Web Console_ supports up to 256 color themes, though most of the common
233
+ terminal themes are usually 16 colors.
234
+
235
+ The default color theme is a white-on-black theme called `light`. For
236
+ different appearance you may want to experiment with the other included color
237
+ themes.
238
+
239
+ - `monokai` _the default Sublime Text colors_
240
+ - `solarized_dark` _light version of the common solarized colors_
241
+ - `solarized_light` _dark version of the common solarized colors_
242
+ - `tango` _theme based on the tango colors_
243
+ - `xterm` _the standard xterm theme_
244
+
245
+ If you would like to use a custom theme, you may do so with the following
246
+ syntax.
247
+
248
+ ```ruby
249
+ class Application < Rails::Application
250
+ # First, you have to define and register your custom color theme. Each color
251
+ # theme is mapped to a name.
252
+ WebConsole::Colors.register_theme(:custom) do |c|
253
+ # The most common color themes are the 16 colors one. They are built from 3
254
+ # parts.
255
+
256
+ # 8 darker colors.
257
+ c.add '#000000'
258
+ c.add '#cd0000'
259
+ c.add '#00cd00'
260
+ c.add '#cdcd00'
261
+ c.add '#0000ee'
262
+ c.add '#cd00cd'
263
+ c.add '#00cdcd'
264
+ c.add '#e5e5e5'
265
+
266
+ # 8 lighter colors.
267
+ c.add '#7f7f7f'
268
+ c.add '#ff0000'
269
+ c.add '#00ff00'
270
+ c.add '#ffff00'
271
+ c.add '#5c5cff'
272
+ c.add '#ff00ff'
273
+ c.add '#00ffff'
274
+ c.add '#ffffff'
275
+
276
+ # Background and foreground colors.
277
+ c.background '#ffffff'
278
+ c.foreground '#000000'
279
+ end
280
+
281
+ # Now you have to tell Web Console to actually use it.
282
+ config.web_console.style.colors = :custom
283
+ end
284
+ ```
285
+
286
+ ### config.web_console.style.font
287
+
288
+ You may also change the font, which is following the CSS font property syntax.
289
+ By default it is `large DejaVu Sans Mono, Liberation Mono, monospace`.
290
+
291
+ Shout-out
292
+ ---------
293
+
294
+ Great thanks to [Charlie Somerville] for [better_errors]! Most of the exception
295
+ binding code is coming straight out of the [better_errors] project.
58
296
 
59
297
  FAQ
60
298
  ---
61
299
 
62
- ### Is there any plan to support JRuby and Rubinius?
300
+ ### I'm running JRuby and /console doesn't load.
301
+
302
+ **TL;DR** Give it a bit of time, it will load.
303
+
304
+ While spawning processes is relatively cheap on _MRI_, this is not the case in
305
+ _JRuby_. Spawning another process is slow. Spawning another **JRuby** process
306
+ is even slower. Read more about the problem at the _JRuby_ [wiki].
307
+
308
+ ### I'm running JRuby and there's no console on the default error page.
309
+
310
+ _JRuby_ support in the default error page requires the latest is experimental
311
+ and requires an unreleased version of `web-console` and `binding_of_caller`.
312
+
313
+ To try it out, put this in your Gemfile.
314
+
315
+ ```ruby
316
+ group :development do
317
+ gem 'web-console', github: 'rails/web-console'
318
+ gem 'binding_of_caller', github: 'banister/binding_of_caller'
319
+ end
320
+ ```
321
+
322
+ You would also have to run you Rails server in JRuby's interpreted mode. Enable
323
+ it with code snippet below, then start your development Rails server with
324
+ `rails server`, as usual.
325
+
326
+ ```bash
327
+ export JRUBY_OPTS=-J-Djruby.compile.mode=OFF
328
+
329
+ # If you run JRuby 1.7.12 and above, you can use:
330
+ # export JRUBY_OPTS=--dev
331
+ ```
332
+
333
+ _(Please, note that we don't guarantee master to be stable and we
334
+ will appreciate any issue reports!)_
335
+
336
+ ### Changing the colors is broken.
337
+
338
+ Some of the style sheets may be cached on the file system. Run
339
+ `rake tmp:cache:clear` to clear those up.
63
340
 
64
- `bindings_of_caller` only works on MRI Ruby at the moment. There's a plan to make Web Console work with JRuby and Rubinius, but most likely without the ability to navigate exception backtrace.
341
+ ### How to view local and instance variables in an interactive console?
65
342
 
66
- ### How to get local and instance variables of a binding in the console?
343
+ The interactive console executes Ruby code. Invoking `instance_variables` and
344
+ `local_variables` will give you what you want.
67
345
 
68
- The console executes Ruby code, and therefore, invoking `instance_variables` and `local_variables` will give you what you want.
346
+ [Docker]: http://www.docker.io/
347
+ [Puma]: http://puma.io/
348
+ [VT100]: http://en.wikipedia.org/wiki/VT100
349
+ [login]: http://linux.die.net/man/1/login
350
+ [web-console-rails3]: https://github.com/gsamokovarov/web-console-rails3
351
+ [wiki]: https://github.com/jruby/jruby/wiki/Improving-startup-time#avoid-spawning-sub-rubies
352
+ [better_errors]: https://github.com/charliesome/better_errors
353
+ [Charlie Somerville]: https://github.com/charliesome
@@ -0,0 +1 @@
1
+ //= require_tree .
@@ -0,0 +1,172 @@
1
+ //= require web-console
2
+
3
+ var AJAXTransport = (function(WebConsole) {
4
+
5
+ var inherits = WebConsole.inherits;
6
+ var EventEmitter = WebConsole.EventEmitter;
7
+
8
+ var FORM_MIME_TYPE = 'application/x-www-form-urlencoded; charset=utf-8';
9
+
10
+ var AJAXTransport = function(options) {
11
+ EventEmitter.call(this);
12
+ options || (options = {});
13
+
14
+ this.url = (typeof options.url === 'string') ? {
15
+ input: options.url,
16
+ pendingOutput: options.url,
17
+ configuration: options.url
18
+ } : options.url;
19
+
20
+ this.pendingInput = '';
21
+
22
+ this.initializeEventHandlers();
23
+ };
24
+
25
+ inherits(AJAXTransport, EventEmitter);
26
+
27
+ // Initializes the default event handlers.
28
+ AJAXTransport.prototype.initializeEventHandlers = function() {
29
+ this.on('input', this.sendInput);
30
+ this.on('configuration', this.sendConfiguration);
31
+ this.once('initialization', function(cols, rows) {
32
+ this.emit('configuration', cols, rows);
33
+ this.pollForPendingOutput();
34
+ });
35
+ };
36
+
37
+ // Shorthand for creating XHR requests.
38
+ AJAXTransport.prototype.createRequest = function(method, url, options) {
39
+ options || (options = {});
40
+
41
+ var request = new XMLHttpRequest;
42
+ request.open(method, url);
43
+
44
+ if (typeof options.form === 'object') {
45
+ var content = [], form = options.form;
46
+
47
+ for (var key in form) {
48
+ var value = form[key];
49
+ content.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
50
+ }
51
+
52
+ request.setRequestHeader('Content-Type', FORM_MIME_TYPE);
53
+ request.data = content.join('&');
54
+ }
55
+
56
+ return request;
57
+ };
58
+
59
+ AJAXTransport.prototype.pollForPendingOutput = function() {
60
+ var request = this.createRequest('GET', this.url.pendingOutput);
61
+
62
+ var self = this;
63
+ request.onreadystatechange = function() {
64
+ if (request.readyState === XMLHttpRequest.DONE) {
65
+ if (request.status === 200) {
66
+ self.emit('pendingOutput', request.responseText);
67
+ self.pollForPendingOutput();
68
+ } else {
69
+ self.emit('disconnect', request);
70
+ }
71
+ }
72
+ };
73
+
74
+ request.send(null);
75
+ };
76
+
77
+ // Send the input to the server.
78
+ //
79
+ // Each key press is encoded to an intermediate format, before it is sent to
80
+ // the server.
81
+ //
82
+ // WebConsole#keysPressed is an alias for WebConsole#sendInput.
83
+ AJAXTransport.prototype.sendInput = function(input) {
84
+ input || (input = '');
85
+
86
+ if (this.disconnected) return;
87
+ if (this.sendingInput) return this.pendingInput += input;
88
+
89
+ // Indicate that we are starting to send input.
90
+ this.sendingInput = true;
91
+
92
+ var request = this.createRequest('PUT', this.url.input, {
93
+ form: { input: this.pendingInput + input }
94
+ });
95
+
96
+ // Clear the pending input.
97
+ this.pendingInput = '';
98
+
99
+ var self = this;
100
+ request.onreadystatechange = function() {
101
+ if (request.readyState === XMLHttpRequest.DONE) {
102
+ self.sendingInput = false;
103
+ if (self.pendingInput) self.sendInput();
104
+ }
105
+ };
106
+
107
+ request.send(request.data);
108
+ };
109
+
110
+ // Send the terminal configuration to the server.
111
+ //
112
+ // Right now by configuration, we understand the terminal widht and terminal
113
+ // height.
114
+ //
115
+ // WebConsole#resized is an alias for WebConsole#sendconfiguration.
116
+ AJAXTransport.prototype.sendConfiguration = function(cols, rows) {
117
+ if (this.disconnected) return;
118
+
119
+ var request = this.createRequest('PUT', this.url.configuration, {
120
+ form: { width: cols, height: rows }
121
+ });
122
+
123
+ // Just send the configuration and don't care about any output.
124
+ request.send(request.data);
125
+ };
126
+
127
+ return AJAXTransport;
128
+
129
+ }).call(this, WebConsole);
130
+
131
+ window.addEventListener('load', function() {
132
+ var geometry = calculateFitScreenGeometry();
133
+ config.terminal.cols = geometry[0];
134
+ config.terminal.rows = geometry[1];
135
+
136
+ var terminal = window.terminal = new WebConsole.Terminal(config.terminal);
137
+
138
+ terminal.on('data', function(data) {
139
+ transport.emit('input', data);
140
+ });
141
+
142
+ var transport = new AJAXTransport(config.transport);
143
+
144
+ transport.on('pendingOutput', function(response) {
145
+ var json = JSON.parse(response);
146
+ if (json.output) terminal.write(json.output);
147
+ });
148
+
149
+ transport.on('disconnect', function() {
150
+ terminal.destroy();
151
+ });
152
+
153
+ transport.emit('initialization', terminal.cols, terminal.rows);
154
+
155
+ // Utilities
156
+ // ---------
157
+
158
+ function calculateFitScreenGeometry() {
159
+ // Currently, resizing term.js is broken. E.g. opening vi causes it to go
160
+ // back to 80x24 and fail with off-by-one error. Other stuff, like chip8
161
+ // are rendered incorrectly and so on.
162
+ //
163
+ // To work around it, create a temporary terminal, just so we can get the
164
+ // best dimensions for the screen.
165
+ var temporary = new WebConsole.Terminal;
166
+ try {
167
+ return temporary.fitScreen();
168
+ } finally {
169
+ temporary.destroy();
170
+ }
171
+ }
172
+ });