web-console 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +132 -85
  3. data/lib/web_console.rb +14 -13
  4. data/lib/web_console/errors.rb +7 -0
  5. data/lib/web_console/{repl.rb → evaluator.rb} +7 -10
  6. data/lib/web_console/helper.rb +22 -0
  7. data/lib/web_console/integration.rb +8 -0
  8. data/lib/web_console/{core_ext/exception → integration}/cruby.rb +0 -0
  9. data/lib/web_console/integration/jruby.rb +111 -0
  10. data/lib/web_console/integration/rubinius.rb +66 -0
  11. data/lib/web_console/middleware.rb +117 -0
  12. data/lib/web_console/railtie.rb +61 -0
  13. data/lib/web_console/request.rb +30 -0
  14. data/lib/web_console/session.rb +65 -0
  15. data/lib/web_console/template.rb +49 -0
  16. data/lib/web_console/templates/_inner_console_markup.html +3 -0
  17. data/lib/web_console/templates/_markup.html +4 -0
  18. data/lib/web_console/templates/_prompt_box_markup.html +2 -0
  19. data/lib/web_console/templates/console.js +373 -0
  20. data/lib/web_console/templates/error_page.js +83 -0
  21. data/lib/web_console/templates/index.html +8 -0
  22. data/lib/web_console/templates/layouts/inlined_string.erb +1 -0
  23. data/lib/web_console/templates/layouts/javascript.erb +5 -0
  24. data/lib/web_console/templates/main.js +24 -0
  25. data/lib/web_console/templates/style.css +9 -0
  26. data/lib/web_console/version.rb +1 -1
  27. data/lib/web_console/whiny_request.rb +38 -0
  28. data/lib/web_console/whitelist.rb +42 -0
  29. data/test/dummy/config/environments/test.rb +0 -4
  30. data/test/dummy/log/development.log +7075 -0
  31. data/test/dummy/log/test.log +66006 -0
  32. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  33. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  34. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  35. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  36. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  37. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  38. data/test/support/scenarios/bad_custom_error_scenario.rb +17 -0
  39. data/test/support/scenarios/basic_nested_scenario.rb +15 -0
  40. data/test/support/scenarios/custom_error_scenario.rb +11 -0
  41. data/test/support/scenarios/eval_nested_scenario.rb +15 -0
  42. data/test/support/scenarios/flat_scenario.rb +9 -0
  43. data/test/support/scenarios/reraised_scenario.rb +21 -0
  44. data/test/test_helper.rb +50 -3
  45. data/test/web_console/evaluator_test.rb +73 -0
  46. data/test/web_console/helper_test.rb +76 -0
  47. data/test/web_console/integration_test.rb +47 -0
  48. data/test/web_console/middleware_test.rb +116 -0
  49. data/test/web_console/railtie_test.rb +99 -0
  50. data/test/web_console/request_test.rb +52 -0
  51. data/test/web_console/session_test.rb +59 -0
  52. data/test/web_console/whiny_request_test.rb +33 -0
  53. data/test/web_console/whitelist_test.rb +43 -0
  54. metadata +66 -56
  55. data/lib/action_dispatch/debug_exceptions.rb +0 -105
  56. data/lib/action_dispatch/exception_wrapper.rb +0 -38
  57. data/lib/action_dispatch/templates/rescues/_request_and_response.html.erb +0 -34
  58. data/lib/action_dispatch/templates/rescues/_request_and_response.text.erb +0 -23
  59. data/lib/action_dispatch/templates/rescues/_source.erb +0 -29
  60. data/lib/action_dispatch/templates/rescues/_trace.html.erb +0 -72
  61. data/lib/action_dispatch/templates/rescues/_trace.text.erb +0 -9
  62. data/lib/action_dispatch/templates/rescues/_web_console.html.erb +0 -420
  63. data/lib/action_dispatch/templates/rescues/diagnostics.html.erb +0 -18
  64. data/lib/action_dispatch/templates/rescues/diagnostics.text.erb +0 -9
  65. data/lib/action_dispatch/templates/rescues/layout.erb +0 -160
  66. data/lib/action_dispatch/templates/rescues/missing_template.html.erb +0 -13
  67. data/lib/action_dispatch/templates/rescues/missing_template.text.erb +0 -3
  68. data/lib/action_dispatch/templates/rescues/routing_error.html.erb +0 -34
  69. data/lib/action_dispatch/templates/rescues/routing_error.text.erb +0 -11
  70. data/lib/action_dispatch/templates/rescues/template_error.html.erb +0 -22
  71. data/lib/action_dispatch/templates/rescues/template_error.text.erb +0 -7
  72. data/lib/action_dispatch/templates/rescues/unknown_action.html.erb +0 -6
  73. data/lib/action_dispatch/templates/rescues/unknown_action.text.erb +0 -3
  74. data/lib/action_dispatch/templates/routes/_route.html.erb +0 -16
  75. data/lib/action_dispatch/templates/routes/_table.html.erb +0 -200
  76. data/lib/assets/javascripts/web-console.js +0 -1
  77. data/lib/assets/javascripts/web_console.js +0 -41
  78. data/lib/web_console/controller_helpers.rb +0 -46
  79. data/lib/web_console/core_ext/exception.rb +0 -7
  80. data/lib/web_console/core_ext/exception/jruby.rb +0 -25
  81. data/lib/web_console/core_ext/exception/rubinius.rb +0 -32
  82. data/lib/web_console/engine.rb +0 -47
  83. data/lib/web_console/repl_session.rb +0 -89
  84. data/lib/web_console/unsupported_platforms.rb +0 -28
  85. data/lib/web_console/view_helpers.rb +0 -16
  86. data/test/action_pack/exception_wrapper_test.rb +0 -26
  87. data/test/controllers/tests_controller_test.rb +0 -41
  88. data/test/web_console/core_ext/exception_test.rb +0 -46
  89. data/test/web_console/engine_test.rb +0 -108
  90. data/test/web_console/repl_session_test.rb +0 -32
  91. data/test/web_console/repl_test.rb +0 -75
@@ -1,18 +0,0 @@
1
- <header>
2
- <h1>
3
- <%= @exception.class.to_s %>
4
- <% if @request.parameters['controller'] %>
5
- in <%= @request.parameters['controller'].camelize %>Controller<% if @request.parameters['action'] %>#<%= @request.parameters['action'] %><% end %>
6
- <% end %>
7
- </h1>
8
- </header>
9
-
10
- <div id="container">
11
- <h2><%= h @exception.message %></h2>
12
-
13
- <%= render template: "rescues/_source" %>
14
- <%= render template: "rescues/_trace" %>
15
- <%= render template: "rescues/_request_and_response" %>
16
- </div>
17
-
18
- <%= render template: "rescues/_web_console" %>
@@ -1,9 +0,0 @@
1
- <%= @exception.class.to_s %><%
2
- if @request.parameters['controller']
3
- %> in <%= @request.parameters['controller'].camelize %>Controller<% if @request.parameters['action'] %>#<%= @request.parameters['action'] %><% end %>
4
- <% end %>
5
-
6
- <%= @exception.message %>
7
- <%= render template: "rescues/_source" %>
8
- <%= render template: "rescues/_trace" %>
9
- <%= render template: "rescues/_request_and_response" %>
@@ -1,160 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8" />
5
- <title>Action Controller: Exception caught</title>
6
- <style>
7
- body {
8
- background-color: #FAFAFA;
9
- color: #333;
10
- margin: 0px;
11
- }
12
-
13
- body, p, ol, ul, td {
14
- font-family: helvetica, verdana, arial, sans-serif;
15
- font-size: 13px;
16
- line-height: 18px;
17
- }
18
-
19
- pre {
20
- font-size: 11px;
21
- white-space: pre-wrap;
22
- }
23
-
24
- pre.box {
25
- border: 1px solid #EEE;
26
- padding: 10px;
27
- margin: 0px;
28
- width: 958px;
29
- }
30
-
31
- header {
32
- color: #F0F0F0;
33
- background: #C52F24;
34
- padding: 0.5em 1.5em;
35
- }
36
-
37
- h1 {
38
- margin: 0.2em 0;
39
- line-height: 1.1em;
40
- font-size: 2em;
41
- }
42
-
43
- h2 {
44
- color: #C52F24;
45
- line-height: 25px;
46
- }
47
-
48
- .details {
49
- border: 1px solid #D0D0D0;
50
- border-radius: 4px;
51
- margin: 1em 0px;
52
- display: block;
53
- width: 978px;
54
- }
55
-
56
- .summary {
57
- padding: 8px 15px;
58
- border-bottom: 1px solid #D0D0D0;
59
- display: block;
60
- }
61
-
62
- .details pre {
63
- margin: 5px;
64
- border: none;
65
- }
66
-
67
- #container {
68
- box-sizing: border-box;
69
- width: 100%;
70
- padding: 0 1.5em;
71
- }
72
-
73
- .source * {
74
- margin: 0px;
75
- padding: 0px;
76
- }
77
-
78
- .source {
79
- border: 1px solid #D9D9D9;
80
- background: #ECECEC;
81
- width: 978px;
82
- }
83
-
84
- .source pre {
85
- padding: 10px 0px;
86
- border: none;
87
- }
88
-
89
- .source .data {
90
- font-size: 80%;
91
- overflow: auto;
92
- background-color: #FFF;
93
- }
94
-
95
- .info {
96
- padding: 0.5em;
97
- }
98
-
99
- .source .data .line_numbers {
100
- background-color: #ECECEC;
101
- color: #AAA;
102
- padding: 1em .5em;
103
- border-right: 1px solid #DDD;
104
- text-align: right;
105
- }
106
-
107
- .line {
108
- padding-left: 10px;
109
- }
110
-
111
- .line:hover {
112
- background-color: #F6F6F6;
113
- }
114
-
115
- .line.active {
116
- background-color: #FFCCCC;
117
- }
118
-
119
- .hidden {
120
- display: none;
121
- }
122
-
123
- a { color: #980905; }
124
- a:visited { color: #666; }
125
- a.trace-frames { color: #666; }
126
- a:hover { color: #C52F24; }
127
- a.trace-frames.selected { color: #C52F24 }
128
-
129
- <%= yield :style %>
130
- </style>
131
-
132
- <script>
133
- var toggle = function(id) {
134
- var s = document.getElementById(id).style;
135
- s.display = s.display == 'none' ? 'block' : 'none';
136
- return false;
137
- }
138
- var show = function(id) {
139
- document.getElementById(id).style.display = 'block';
140
- }
141
- var hide = function(id) {
142
- document.getElementById(id).style.display = 'none';
143
- }
144
- var toggleTrace = function() {
145
- return toggle('blame_trace');
146
- }
147
- var toggleSessionDump = function() {
148
- return toggle('session_dump');
149
- }
150
- var toggleEnvDump = function() {
151
- return toggle('env_dump');
152
- }
153
- </script>
154
- </head>
155
- <body>
156
-
157
- <%= yield %>
158
-
159
- </body>
160
- </html>
@@ -1,13 +0,0 @@
1
- <header>
2
- <h1>Template is missing</h1>
3
- </header>
4
-
5
- <div id="container">
6
- <h2><%= h @exception.message %></h2>
7
-
8
- <%= render template: "rescues/_source" %>
9
- <%= render template: "rescues/_trace" %>
10
- <%= render template: "rescues/_request_and_response" %>
11
- </div>
12
-
13
- <%= render template: "rescues/_web_console" %>
@@ -1,3 +0,0 @@
1
- Template is missing
2
-
3
- <%= @exception.message %>
@@ -1,34 +0,0 @@
1
- <header>
2
- <h1>Routing Error</h1>
3
- </header>
4
- <div id="container">
5
- <h2><%= h @exception.message %></h2>
6
- <% unless @exception.failures.empty? %>
7
- <p>
8
- <h2>Failure reasons:</h2>
9
- <ol>
10
- <% @exception.failures.each do |route, reason| %>
11
- <li><code><%= route.inspect.delete('\\') %></code> failed because <%= reason.downcase %></li>
12
- <% end %>
13
- </ol>
14
- </p>
15
- <% end %>
16
-
17
- <%= render template: "rescues/_trace" %>
18
-
19
- <% if @routes_inspector %>
20
- <h2>
21
- Routes
22
- </h2>
23
-
24
- <p>
25
- Routes match in priority from top to bottom
26
- </p>
27
-
28
- <%= @routes_inspector.format(ActionDispatch::Routing::HtmlTableFormatter.new(self)) %>
29
- <% end %>
30
-
31
- <%= render template: "rescues/_request_and_response" %>
32
- </div>
33
-
34
- <%= render template: "rescues/_web_console" %>
@@ -1,11 +0,0 @@
1
- Routing Error
2
-
3
- <%= @exception.message %>
4
- <% unless @exception.failures.empty? %>
5
- Failure reasons:
6
- <% @exception.failures.each do |route, reason| %>
7
- - <%= route.inspect.delete('\\') %></code> failed because <%= reason.downcase %>
8
- <% end %>
9
- <% end %>
10
-
11
- <%= render template: "rescues/_trace", format: :text %>
@@ -1,22 +0,0 @@
1
- <header>
2
- <h1>
3
- <%= @exception.original_exception.class.to_s %> in
4
- <%= @request.parameters["controller"].camelize if @request.parameters["controller"] %>#<%= @request.parameters["action"] %>
5
- </h1>
6
- </header>
7
-
8
- <div id="container">
9
- <p>
10
- Showing <i><%= @exception.file_name %></i> where line <b>#<%= @exception.line_number %></b> raised:
11
- </p>
12
- <pre><code><%= h @exception.message %></code></pre>
13
-
14
- <%= render template: "rescues/_source" %>
15
-
16
- <p><%= @exception.sub_template_message %></p>
17
-
18
- <%= render template: "rescues/_trace" %>
19
- <%= render template: "rescues/_request_and_response" %>
20
- </div>
21
-
22
- <%= render template: "rescues/_web_console" %>
@@ -1,7 +0,0 @@
1
- <%= @exception.original_exception.class.to_s %> in <%= @request.parameters["controller"].camelize if @request.parameters["controller"] %>#<%= @request.parameters["action"] %>
2
-
3
- Showing <%= @exception.file_name %> where line #<%= @exception.line_number %> raised:
4
- <%= @exception.message %>
5
- <%= @exception.sub_template_message %>
6
- <%= render template: "rescues/_trace", format: :text %>
7
- <%= render template: "rescues/_request_and_response", format: :text %>
@@ -1,6 +0,0 @@
1
- <header>
2
- <h1>Unknown action</h1>
3
- </header>
4
- <div id="container">
5
- <h2><%= h @exception.message %></h2>
6
- </div>
@@ -1,3 +0,0 @@
1
- Unknown action
2
-
3
- <%= @exception.message %>
@@ -1,16 +0,0 @@
1
- <tr class='route_row' data-helper='path'>
2
- <td data-route-name='<%= route[:name] %>'>
3
- <% if route[:name].present? %>
4
- <%= route[:name] %><span class='helper'>_path</span>
5
- <% end %>
6
- </td>
7
- <td data-route-verb='<%= route[:verb] %>'>
8
- <%= route[:verb] %>
9
- </td>
10
- <td data-route-path='<%= route[:path] %>' data-regexp='<%= route[:regexp] %>'>
11
- <%= route[:path] %>
12
- </td>
13
- <td data-route-reqs='<%= route[:reqs] %>'>
14
- <%= route[:reqs] %>
15
- </td>
16
- </tr>
@@ -1,200 +0,0 @@
1
- <% content_for :style do %>
2
- #route_table {
3
- margin: 0;
4
- border-collapse: collapse;
5
- }
6
-
7
- #route_table thead tr {
8
- border-bottom: 2px solid #ddd;
9
- }
10
-
11
- #route_table thead tr.bottom {
12
- border-bottom: none;
13
- }
14
-
15
- #route_table thead tr.bottom th {
16
- padding: 10px 0;
17
- line-height: 15px;
18
- }
19
-
20
- #route_table tbody tr {
21
- border-bottom: 1px solid #ddd;
22
- }
23
-
24
- #route_table tbody tr:nth-child(odd) {
25
- background: #f2f2f2;
26
- }
27
-
28
- #route_table tbody.exact_matches,
29
- #route_table tbody.fuzzy_matches {
30
- background-color: LightGoldenRodYellow;
31
- border-bottom: solid 2px SlateGrey;
32
- }
33
-
34
- #route_table tbody.exact_matches tr,
35
- #route_table tbody.fuzzy_matches tr {
36
- background: none;
37
- border-bottom: none;
38
- }
39
-
40
- #route_table td {
41
- padding: 4px 30px;
42
- }
43
-
44
- #path_search {
45
- width: 80%;
46
- font-size: inherit;
47
- }
48
- <% end %>
49
-
50
- <table id='route_table' class='route_table'>
51
- <thead>
52
- <tr>
53
- <th>Helper</th>
54
- <th>HTTP Verb</th>
55
- <th>Path</th>
56
- <th>Controller#Action</th>
57
- </tr>
58
- <tr class='bottom'>
59
- <th><%# Helper %>
60
- <%= link_to "Path", "#", 'data-route-helper' => '_path',
61
- title: "Returns a relative path (without the http or domain)" %> /
62
- <%= link_to "Url", "#", 'data-route-helper' => '_url',
63
- title: "Returns an absolute url (with the http and domain)" %>
64
- </th>
65
- <th><%# HTTP Verb %>
66
- </th>
67
- <th><%# Path %>
68
- <%= search_field(:path, nil, id: 'search', placeholder: "Path Match") %>
69
- </th>
70
- <th><%# Controller#action %>
71
- </th>
72
- </tr>
73
- </thead>
74
- <tbody class='exact_matches' id='exact_matches'>
75
- </tbody>
76
- <tbody class='fuzzy_matches' id='fuzzy_matches'>
77
- </tbody>
78
- <tbody>
79
- <%= yield %>
80
- </tbody>
81
- </table>
82
-
83
- <script type='text/javascript'>
84
- // Iterates each element through a function
85
- function each(elems, func) {
86
- if (!elems instanceof Array) { elems = [elems]; }
87
- for (var i = 0, len = elems.length; i < len; i++) {
88
- func(elems[i]);
89
- }
90
- }
91
-
92
- // Sets innerHTML for an element
93
- function setContent(elem, text) {
94
- elem.innerHTML = text;
95
- }
96
-
97
- // Enables path search functionality
98
- function setupMatchPaths() {
99
- // Check if the user input (sanitized as a path) matches the regexp data attribute
100
- function checkExactMatch(section, elem, value) {
101
- var string = sanitizePath(value),
102
- regexp = elem.getAttribute("data-regexp");
103
-
104
- showMatch(string, regexp, section, elem);
105
- }
106
-
107
- // Check if the route path data attribute contains the user input
108
- function checkFuzzyMatch(section, elem, value) {
109
- var string = elem.getAttribute("data-route-path"),
110
- regexp = value;
111
-
112
- showMatch(string, regexp, section, elem);
113
- }
114
-
115
- // Display the parent <tr> element in the appropriate section when there's a match
116
- function showMatch(string, regexp, section, elem) {
117
- if(string.match(RegExp(regexp))) {
118
- section.appendChild(elem.parentNode.cloneNode(true));
119
- }
120
- }
121
-
122
- // Check if there are any matched results in a section
123
- function checkNoMatch(section, defaultText, noMatchText) {
124
- if (section.innerHTML === defaultText) {
125
- setContent(section, defaultText + noMatchText);
126
- }
127
- }
128
-
129
- // Ensure path always starts with a slash "/" and remove params or fragments
130
- function sanitizePath(path) {
131
- var path = path.charAt(0) == '/' ? path : "/" + path;
132
- return path.replace(/\#.*|\?.*/, '');
133
- }
134
-
135
- var regexpElems = document.querySelectorAll('#route_table [data-regexp]'),
136
- searchElem = document.querySelector('#search'),
137
- exactMatches = document.querySelector('#exact_matches'),
138
- fuzzyMatches = document.querySelector('#fuzzy_matches');
139
-
140
- // Remove matches when no search value is present
141
- searchElem.onblur = function(e) {
142
- if (searchElem.value === "") {
143
- setContent(exactMatches, "");
144
- setContent(fuzzyMatches, "");
145
- }
146
- }
147
-
148
- // On key press perform a search for matching paths
149
- searchElem.onkeyup = function(e){
150
- var userInput = searchElem.value,
151
- defaultExactMatch = '<tr><th colspan="4">Paths Matching (' + escape(sanitizePath(userInput)) +'):</th></tr>',
152
- defaultFuzzyMatch = '<tr><th colspan="4">Paths Containing (' + escape(userInput) +'):</th></tr>',
153
- noExactMatch = '<tr><th colspan="4">No Exact Matches Found</th></tr>',
154
- noFuzzyMatch = '<tr><th colspan="4">No Fuzzy Matches Found</th></tr>';
155
-
156
- // Clear out results section
157
- setContent(exactMatches, defaultExactMatch);
158
- setContent(fuzzyMatches, defaultFuzzyMatch);
159
-
160
- // Display exact matches and fuzzy matches
161
- each(regexpElems, function(elem) {
162
- checkExactMatch(exactMatches, elem, userInput);
163
- checkFuzzyMatch(fuzzyMatches, elem, userInput);
164
- })
165
-
166
- // Display 'No Matches' message when no matches are found
167
- checkNoMatch(exactMatches, defaultExactMatch, noExactMatch);
168
- checkNoMatch(fuzzyMatches, defaultFuzzyMatch, noFuzzyMatch);
169
- }
170
- }
171
-
172
- // Enables functionality to toggle between `_path` and `_url` helper suffixes
173
- function setupRouteToggleHelperLinks() {
174
-
175
- // Sets content for each element
176
- function setValOn(elems, val) {
177
- each(elems, function(elem) {
178
- setContent(elem, val);
179
- });
180
- }
181
-
182
- // Sets onClick event for each element
183
- function onClick(elems, func) {
184
- each(elems, function(elem) {
185
- elem.onclick = func;
186
- });
187
- }
188
-
189
- var toggleLinks = document.querySelectorAll('#route_table [data-route-helper]');
190
- onClick(toggleLinks, function(){
191
- var helperTxt = this.getAttribute("data-route-helper"),
192
- helperElems = document.querySelectorAll('[data-route-name] span.helper');
193
-
194
- setValOn(helperElems, helperTxt);
195
- });
196
- }
197
-
198
- setupMatchPaths();
199
- setupRouteToggleHelperLinks();
200
- </script>