dev_panel 0.3 → 1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d68b76e17fb16c295f11fbc317d028bb76183d32
4
+ data.tar.gz: fd16f57f988688f96f7bf9ffe3448b7d40822805
5
+ SHA512:
6
+ metadata.gz: a4c7001f981e3c99ba2f9c93b604aea7713b3ce0f197c8271723b7531f489e3726c26ec69ed5ffa025ada87dbebd5f806dce306323168b93d7a4d3576e00aee1
7
+ data.tar.gz: 35027e9b324f9ca22c6ca5392cd077db9a01227d206b6a251c67313a2d1c0d9a5340bae834dd9a6c2c91f33c80bde193ec323fe0513b368b33ae1da1e75f8491
@@ -6,74 +6,28 @@ module DevPanel
6
6
  end
7
7
 
8
8
  def dev_panel_output
9
- self.response.body += dev_panel_ajax
9
+ self.response.body += panel
10
10
  end
11
11
 
12
- def dev_panel_ajax
13
- puts "#{jquery_cdn.nil?} + #{jquery_ui_cdn.nil?} + #{ajax_call}"
14
- jquery_cdn + jquery_ui_cdn + ajax_call
15
- end
16
-
17
- def ajax_call
12
+ def panel
18
13
  <<-html_code
19
- <div id="DevPanel"></div><script type="text/javascript">
20
- var $jq = jQuery.noConflict();
21
- $jq.ajax({
22
- url: "/__DevPanel/main",
23
- success: function(response) {
24
- $jq("#DevPanel").html(response);
25
- #{hide_container};
26
- $jq("#consoleButton").click(function(e){
27
- $("#console").toggle();
28
- $jq("#console").css('top', e.pageY + 10 + 'px');
29
- $jq("#console").css('left', e.pageX + 10 + 'px');
30
- })
31
-
32
- previous = null;
33
-
34
- $jq("#consoleInput").keydown(function(e) {
35
- if(event.keyCode == 38) {
36
- $jq("#consoleInput").val(previous);
37
- }
38
-
39
- if(event.which == 13) {
40
-
41
- if($jq("#consoleInput").val() == "") {
42
- $jq("#consoleResults").append("><br>");
43
- return "";
44
- $jq("#consoleResults")[0].scrollTop = $jq("#consoleResults")[0].scrollHeight
45
- }
46
- $jq.ajax({
47
- url: "/__DevPanel/console?query=" + $jq("#consoleInput").val(),
48
- success: function(results) {
49
- previous = $jq("#consoleInput").val()
50
- $jq("#consoleResults").append(">" + results + "<br>");
51
- $jq("#consoleInput").val("");
52
- $jq("#consoleResults")[0].scrollTop = $jq("#consoleResults")[0].scrollHeight
53
- }
54
-
55
- })
56
- }
57
- })
14
+ <script>
15
+ window.onload = function() {
16
+ body = document.getElementsByTagName('body')[0]
17
+ iframe = document.createElement('iframe')
18
+ iframe.setAttribute('src', '__DevPanel/main')
19
+ iframe.setAttribute('id', 'devPanel')
20
+ iframe.setAttribute('style', 'width: 100%; border: none;')
21
+ iframe.setAttribute('height', 50)
22
+ body.insertBefore(iframe ,body.children[0])
23
+ }
24
+
25
+ window.resizeDevPanel = function(height) {
26
+ element = document.getElementById('devPanel')
27
+ console.log(height)
28
+ element.setAttribute('height', height)
29
+ }
58
30
 
59
- $jq("#viewTime").click(function(e) {
60
- $jq("#partialList").css('top', e.pageY + 10 + 'px');
61
- $jq("#partialList").css('left', e.pageX + 10 + 'px');
62
- $jq("#partialList").toggle();
63
- });
64
- $jq("#devPanelHider").on("click", function(s) {
65
- $jq("#devPanelContainer").slideToggle(110);
66
- $jq("#partialList").hide();
67
- $jq("#console").hide();
68
- $jq.get("/__DevPanel/set_options?visible=" + $jq("#devPanelContainer").is(":visible"));
69
- });
70
- $jq("#devPanelWindow").draggable({stop: function() {
71
- $jq.get("/__DevPanel/set_options?top=" + $jq("#devPanelWindow").position().top + "&left="
72
- + $jq("#devPanelWindow").position().left + "&zindex="
73
- + $jq("#devPanelWindow").zIndex() )
74
- }});
75
- }
76
- });
77
31
  </script>
78
32
  html_code
79
33
  end
@@ -81,21 +35,5 @@ module DevPanel
81
35
  def hide_container
82
36
  (Stats.show?) ? '' : '$jq("#devPanelContainer").toggle()'
83
37
  end
84
-
85
- def config_key(value)
86
- begin
87
- return Rails.application.config.send(value)
88
- rescue
89
- return nil
90
- end
91
- end
92
-
93
- def jquery_cdn
94
- '<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>'
95
- end
96
-
97
- def jquery_ui_cdn
98
- '<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>'
99
- end
100
38
  end
101
39
  end
@@ -5,174 +5,50 @@ module DevPanel
5
5
  end
6
6
 
7
7
  def call(env)
8
- if env["REQUEST_URI"] =~ /__DevPanel\/main/
8
+ request_uri = env["REQUEST_URI"]
9
+ params = Rack::Utils.parse_query(env['QUERY_STRING'], "&")
10
+
11
+ if request_uri =~ /__DevPanel\/main/
9
12
  [200, { "Content-Type" => "text/html; charset=utf-8" }, [dev_panel_output]]
10
- elsif env["REQUEST_URI"] =~ /__DevPanel\/set_options/
11
- params = Rack::Utils.parse_query(env['QUERY_STRING'], "&")
12
- Stats.set_by_params(params)
13
+ elsif request_uri =~ /__DevPanel\/set_options/
14
+ Stats.set_by_params(params)
13
15
  [200, { "Content-Type" => "text/plain; charset=utf-8" }, ["#{Stats.show?} #{Stats.left} #{Stats.top}"]]
14
- elsif env["REQUEST_URI"] =~ /__DevPanel\/console/
15
- params = Rack::Utils.parse_query(env['QUERY_STRING'], "&")
16
+ elsif request_uri =~ /__DevPanel\/console/
16
17
  query = params["query"]
17
18
  [200, { "Content-Type" => "text/plain; charset=utf-8" }, ["#{CGI::escapeHTML(eval(query).to_s)}"]]
19
+ elsif request_uri =~ /__DevPanel\/assets/
20
+ data = File.read(File.dirname(__FILE__) + '/assets/' + request_uri.split('/__DevPanel/assets/').last)
21
+ [200, { "Content-Type" => "text/plain; charset=utf-8" }, [data]]
22
+ elsif request_uri =~ /__DevPanel\/file/
23
+ filename = request_uri.split('/__DevPanel/file/').last
24
+ data = File.read('/' + filename)
25
+ template = ERB.new File.new("#{File.dirname(__FILE__)}/views/file_viewer.html.erb").read, nil, "%"
26
+ os = OpenStruct.new(data: stats(:data), filename: filename)
27
+ result = template.result(os.instance_eval { binding })
28
+ [200, { "Content-Type" => "text/html; charset=utf-8" }, [result]]
18
29
  else
19
30
  @app.call(env)
20
31
  end
21
32
  end
22
33
 
23
34
  def dev_panel_output
24
- (css + html_containers + html_table).html_safe
25
- end
26
-
27
- def css
28
- <<-css_code
29
- <style>
30
- table {
31
- width: 100%
32
- }
33
-
34
- #devPanelWindow {
35
- border-radius: 3px;
36
- margin-bottom: 2px;
37
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.03), 1px 1px 0 rgba(0, 0, 0, 0.05), -1px 1px 0 rgba(0, 0, 0, 0.05), 0 0 0 4px rgba(0, 0, 0, 0.04);
38
- font-family: menlo, lucida console, monospace;
39
- border: 3px solid #29488B;
40
- z-index: 500000000;
41
- padding: 3px;
42
- color: #000;
43
- background-color: #F0F0F5;
44
- position: absolute;
45
- float: left;
46
- }
47
-
48
- #devPanelHider {
49
- background: #5366EB;
50
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3);
51
- font-family: arial;
52
- font-size: 12.8px;
53
- overflow: hidden;
54
- padding: 6px 10px;
55
- border: solid 1px #CCC;
56
- border-bottom: 0;
57
- border-top-left-radius: 2px;
58
- border-top-right-radius: 2px;
59
- text-align:left;
60
- border: solid 1px #fff;
61
- }
62
-
63
- .hider-color {
64
- color: #fff
65
- }
66
-
67
- #devPanelContainer {
68
- font-family: menlo, lucida console, monospace;
69
- background-color: #fff;
70
- box-shadow: inset 3px 3px 3px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1);
71
- width: 300px;
72
- padding: 2px
73
- }
74
-
75
- #devPanelContainer td {
76
- font-family: arial;
77
- font-size: 12px;
78
- font-weight: normal;
79
- padding: 5px;
80
- overflow: auto;
81
- letter-spacing: 1.5px
82
- }
83
-
84
- #devPanelContainer tr {
85
- background-color: #2E2E2E;
86
- color: rgb(238, 238, 238);
87
- border-bottom: 1px solid #4B4444;
88
- }
89
-
90
- #devPanelContainer .alt {
91
- background-color: #000000;
92
- color: rgb(238, 238, 238);
93
- border-bottom: 1px solid #4B4444;
94
- }
95
-
96
- #devPanelContainer td.firstColumn {
97
- width: 90px;
98
- font-weight: bold;
99
- }
100
-
101
- #viewTime {
102
- font-size: 10px;
103
- text-decoration: underline;
104
- }
105
-
106
- #partialList {
107
- position: absolute;
108
- top: 0px;
109
- left: 0px;
110
- background: #F1F1F1;
111
- border: 2px solid #000;
112
- background-color: #fff;
113
- box-shadow: inset 3px 3px 3px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1);
114
- font-family: arial;
115
- font-size: 10px;
116
- overflow: hidden;
117
- padding: 6px 10px;
118
- border-top-left-radius: 2px;
119
- border-top-right-radius: 2px;
120
- display: none;
121
- z-index: 500000001;
122
- }
123
-
124
- #console {
125
- position: absolute;
126
- top: 0px;
127
- left: 0px;
128
- background: #F1F1F1;
129
- border: 2px solid #000;
130
- background-color: #fff;
131
- box-shadow: inset 3px 3px 3px rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1);
132
- font-family: arial;
133
- font-size: 10px;
134
- overflow: hidden;
135
- padding: 6px 10px;
136
- border-top-left-radius: 2px;
137
- border-top-right-radius: 2px;
138
- display: none;
139
- z-index: 500000001;
140
- width: 600px;
141
- }
142
-
143
- #consoleResults {
144
- width: 97%;
145
- height: 250px;
146
- font-size: 13px;
147
- overflow-x: scroll;
148
- }
149
-
150
- #consoleInput {
151
- width: 97%;
152
- height: 20px;
153
- }
154
-
155
- .green { background: #21D61A !important}
156
- .yellow { background: #BEBE00 !important }
157
- .orange { background: #F0A811 !important }
158
- .red { background: #B90000 !important }
159
-
160
- </style>
161
- css_code
162
- end
163
-
164
- def html_containers
165
- <<-html_code
166
- <div id='partialList'>#{partial_list}</div>
167
- <div id='console'>
168
- <div id="consoleResults">></div>
169
- <input id="consoleInput" type="text" placeholder="Type Command">
170
-
171
- </div>
172
- <div id="devPanelWindow" style="top: #{Stats.top.to_s}px; left: #{Stats.left.to_s}px;" >
173
- <div id="devPanelHider" class="#{heat_color}"><a class="hider-color" href="#">#{stats(:controller)}##{stats(:action)}</a> / <span class="hider-color" style="font-size: 10px">#{Stats.data[:action_controller].duration.round(0).to_s}ms</span></div>
174
- <div id="devPanelContainer">
175
- html_code
35
+ template = ERB.new File.new("#{File.dirname(__FILE__)}/views/header.html.erb").read, nil, "%"
36
+ os = OpenStruct.new(
37
+ controller: stats(:controller),
38
+ action: stats(:action),
39
+ status: stats(:status),
40
+ partial_count: partial_count,
41
+ total_duration: Stats.total_duration.round(0).to_s,
42
+ controller_duration: Stats.controller_duration.round(0).to_s,
43
+ controller_percent: Stats.controller_duration_percent.to_s,
44
+ view_duration: Stats.view_duration.to_s,
45
+ view_duration_percent: Stats.view_duration_percent,
46
+ log: Stats.data[:log],
47
+ partial_list: Hash[Stats.data[:partials].to_a.reverse],
48
+ partial_paths: Stats.data[:partial_paths] || [],
49
+ params: stats(:params)
50
+ )
51
+ template.result(os.instance_eval { binding }).html_safe
176
52
  end
177
53
 
178
54
  def heat_color
@@ -192,53 +68,8 @@ module DevPanel
192
68
  Stats.data[:action_controller].payload[symbol]
193
69
  end
194
70
 
195
- def html_table
196
- table_rows = rowify([
197
- first_td("Tools:") + td("<a href='#' id='consoleButton'>Console</a>"),
198
- first_td("Total:") + td("#{Stats.total_duration.to_s}ms"),
199
- first_td("Controller:") + td("#{Stats.controller_duration.to_s}ms (#{Stats.controller_duration_percent}%)"),
200
- first_td("View:") + td("#{Stats.view_duration.to_s}ms (#{Stats.view_duration_percent}%)"),
201
- first_td("Partials:") + td(partial_count),
202
- first_td("Response:") + td(stats(:status)),
203
- first_td("Controller:") + td(stats(:controller)),
204
- first_td("Action:") + td(stats(:action)),
205
- first_td("Method:") + td(stats(:method)),
206
- first_td("Params:") + td(stats(:params)),
207
- first_td("Log:") + td(Stats.data[:log])
208
- ])
209
-
210
- "<table style='margin: auto; table-layout: fixed'>#{table_rows}</table></div></div>"
211
- end
212
-
213
71
  def partial_count
214
- "<div id='viewTime'>#{Stats.data[:partial_count] || 0}</div>"
215
- end
216
-
217
- def partial_list
218
- str = ""
219
- Stats.data[:partials].each_pair {|k,v| str << "#{k}: #{Stats.data[:partials][k]}<br>" } if Stats.data[:partials].present?
220
- str
221
- end
222
-
223
- def tr(content = "", klass="")
224
- "<tr class=#{klass}>#{content}</tr>"
225
- end
226
-
227
- def td(content = "")
228
- "<td>#{content}</td>"
229
- end
230
-
231
- def first_td(content = "")
232
- "<td class='firstColumn'>#{content}</td>"
72
+ Stats.data[:partial_count] || 0
233
73
  end
234
-
235
- def rowify(arr)
236
- result = ""
237
- arr.each_with_index do |data, index|
238
- result += tr(data, index.even? ? "alt" : "")
239
- end
240
- result
241
- end
242
-
243
74
  end
244
75
  end
@@ -1,60 +1,40 @@
1
1
  module DevPanel
2
+ class Config
3
+ def self.initial_value(key, default)
4
+ initial = Rails.application.config.send(key)
5
+ rescue
6
+ initial = default
7
+ end
8
+ end
9
+
2
10
  class Railtie < Rails::Railtie
3
11
  initializer "dev_panel.configure_rails_initialization" do
4
- unless Rails.env.production?
5
-
6
- Rails.application.middleware.use DevPanel::Middleware
7
-
8
- ActiveSupport::Notifications.subscribe(//) do |*args|
9
- event = ActiveSupport::Notifications::Event.new(*args)
10
- end
12
+ Rails.application.middleware.use DevPanel::Middleware
11
13
 
12
- ActiveSupport::Notifications.subscribe('start_processing.action_controller') do |*args|
13
- event = ActiveSupport::Notifications::Event.new(*args)
14
- Stats.delete_data if event.payload[:format] == :html
15
- end
16
-
17
- ActiveSupport::Notifications.subscribe('process_action.action_controller') do |*args|
18
- event = ActiveSupport::Notifications::Event.new(*args)
19
- Stats.data[:action_controller] = event if event.payload[:format] == :html
20
- end
21
-
22
- ActiveSupport::Notifications.subscribe('render_partial.action_view') do |*args|
23
- Stats.data[:partial_count] ||= 0
24
- Stats.data[:partial_count] += 1
25
- event = ActiveSupport::Notifications::Event.new(*args)
26
- partial_name = event.payload[:identifier].split("app").last
27
- Stats.data[:partials] ||= {}
28
- Stats.data[:partials][partial_name] ||= 0
29
- Stats.data[:partials][partial_name] += 1
30
- end
14
+ ActiveSupport::Notifications.subscribe(/action/) do |*args|
15
+ event = ActiveSupport::Notifications::Event.new(*args)
16
+ end
31
17
 
18
+ ActiveSupport::Notifications.subscribe('start_processing.action_controller') do |*args|
19
+ event = ActiveSupport::Notifications::Event.new(*args)
20
+ Stats.delete_data if event.payload[:format] == :html
21
+ end
32
22
 
33
- top = nil
34
- begin
35
- top = Rails.application.config.dev_panel_initial_top
36
- rescue
37
- top = 0
38
- end
39
-
23
+ ActiveSupport::Notifications.subscribe('process_action.action_controller') do |*args|
24
+ event = ActiveSupport::Notifications::Event.new(*args)
25
+ Stats.data[:action_controller] = event if event.payload[:format] == :html
26
+ end
40
27
 
41
- left = nil
42
- begin
43
- left = Rails.application.config.dev_panel_initial_left
44
- rescue
45
- left = 0
46
- end
47
-
48
- zindex = nil
49
- begin
50
- zindex = Rails.application.config.dev_panel_initial_zindex
51
- rescue
52
- zindex = 1000
53
- end
54
-
55
- DevPanel::Stats.top(top)
56
- DevPanel::Stats.left(left)
57
- DevPanel::Stats.zindex(zindex)
28
+ ActiveSupport::Notifications.subscribe('render_partial.action_view') do |*args|
29
+ Stats.data[:partial_count] ||= 0
30
+ Stats.data[:partial_count] += 1
31
+ event = ActiveSupport::Notifications::Event.new(*args)
32
+ partial_name = event.payload[:identifier].split("app").last
33
+ Stats.data[:partials] ||= {}
34
+ Stats.data[:partial_paths] ||= {}
35
+ Stats.data[:partials][partial_name] ||= 0
36
+ Stats.data[:partials][partial_name] += 1
37
+ Stats.data[:partial_paths][partial_name] = event.payload[:identifier]
58
38
  end
59
39
  end
60
40
  end
@@ -1,87 +1,96 @@
1
1
  module DevPanel
2
2
  class Stats
3
+ class << self
4
+ def defaults
5
+ {
6
+ data: { log: '' },
7
+ visible: 'false',
8
+ left: 0,
9
+ top: 0,
10
+ zindex: 1000
11
+ }
12
+ end
3
13
 
4
- @@data ||= { log: "" }
5
- @@visible = "false"
6
- @@left = 0
7
- @@top = 0
8
-
9
- def self.set_by_params(params)
10
- ['visible', 'left', 'top', 'zindex'].each do |str|
11
- Stats.send(str, params[str]) if params[str].present?
14
+ def set_defaults
15
+ defaults.each_pair do |key, value|
16
+ self.class_variable_set(:"@@#{key}", value)
17
+ end
12
18
  end
13
- Stats.log(" ")
14
- end
15
19
 
16
- def self.data
17
- @@data ||= { log: "" }
18
- end
20
+ def set_by_params(params)
21
+ ['visible', 'left', 'top', 'zindex'].each do |str|
22
+ Stats.send(str, params[str]) if params[str]
23
+ end
24
+ end
19
25
 
20
- def self.total_duration
21
- data[:action_controller].duration.round(2)
22
- end
26
+ def method_missing(*arr)
27
+ if [:left, :top, :zindex].include?(arr.first)
28
+ return self.class_variable_get(:"@@#{arr.first}") if arr.size < 2 || (invalid_number?(arr.last.to_i))
29
+ self.class_variable_set(:"@@#{arr.first}", (arr.last || defaults[arr.first]))
30
+ return self.class_variable_get(:"@@#{arr.first}")
31
+ end
32
+ end
23
33
 
24
- def self.controller_duration
25
- (data[:action_controller].duration - stats(:view_runtime)).round(2)
26
- end
34
+ def data
35
+ @@data
36
+ end
27
37
 
28
- def self.view_duration
29
- stats(:view_runtime).round(2)
30
- end
38
+ def visible(val = @@visible)
39
+ @@visible = val
40
+ end
31
41
 
32
- def self.controller_duration_percent
33
- ((controller_duration / total_duration) * 100).round(0)
34
- end
42
+ def invalid_number?(val)
43
+ val.class != Fixnum || val.nil?
44
+ end
35
45
 
36
- def self.view_duration_percent
37
- ((view_duration / total_duration) * 100).round(0)
38
- end
46
+ def total_duration
47
+ data[:action_controller].duration.round(2)
48
+ end
39
49
 
40
- def self.stats(symbol)
41
- data[:action_controller].payload[symbol]
42
- end
50
+ def controller_duration
51
+ (data[:action_controller].duration - stats(:view_runtime)).round(2)
52
+ end
43
53
 
54
+ def view_duration
55
+ stats(:view_runtime).round(2)
56
+ end
44
57
 
45
- def self.delete_data
46
- @@data = {}
47
- end
58
+ def controller_duration_percent
59
+ ((controller_duration / total_duration) * 100).round(0)
60
+ end
48
61
 
49
- def self.left(val = @@left)
50
- return @@left if val.class != Fixnum && val.empty?
51
- @@left = val || 0
52
- end
62
+ def view_duration_percent
63
+ ((view_duration / total_duration) * 100).round(0)
64
+ end
53
65
 
54
- def self.top(val = @@top)
55
- return @@top if val.class != Fixnum && val.empty?
56
- @@top = val
57
- end
58
-
59
- def self.zindex(val = @@zindex)
60
- return @@zindex if val.class != Fixnum && val.empty?
61
- @@zindex = val || 1000
62
- end
66
+ def stats(symbol)
67
+ data[:action_controller].payload[symbol]
68
+ end
63
69
 
64
- def self.visible(val = @@visible)
65
- @@visible = val
66
- end
70
+ def delete_data
71
+ @@data = {}
72
+ end
67
73
 
68
- def self.show?
69
- @@visible == "true"
70
- end
74
+ def show?
75
+ @@visible == "true"
76
+ end
71
77
 
72
- def self.log(log)
73
- @@data[:log] ||= ""
74
- @@data[:log] += "<div style='border-bottom: 1px black solid'>"
75
- @@data[:log] += CGI::escapeHTML("#{log}")
76
- @@data[:log] += "</div>"
77
- end
78
+ def log(log = nil)
79
+ return data[:log] unless log
80
+ data[:log] ||= ""
81
+ data[:log] += "<div style='border-bottom: 1px black solid'>"
82
+ data[:log] += CGI::escapeHTML("#{log}")
83
+ data[:log] += "</div>"
84
+ end
78
85
 
79
- def self.time
80
- start = Time.now
81
- yield
82
- time_spent = ((Time.now - start)*1000).round(2)
83
- self.log("Time Elapsed: #{time_spent}ms")
86
+ def time(tag = nil)
87
+ start = Time.now
88
+ yield
89
+ time_spent = ((Time.now - start)*1000).round(2)
90
+ self.log("#{tag}: Time Elapsed: #{time_spent}ms")
91
+ end
84
92
  end
85
93
 
94
+ self.set_defaults
86
95
  end
87
96
  end
metadata CHANGED
@@ -1,18 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dev_panel
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.3'
5
- prerelease:
4
+ version: '1'
6
5
  platform: ruby
7
6
  authors:
8
7
  - Matthew Stopa
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-08-29 00:00:00.000000000 Z
13
- dependencies: []
14
- description: A panel that appears in the browser to provide stats on page load times
15
- and other debugging information for Rails 3
11
+ date: 2015-11-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - '>='
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ name: rspec
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A panel that appears in the browser to provide stats on page load times and other debugging information for Rails 3 & 4
16
28
  email: matthew.p.stopa@gmail.com
17
29
  executables: []
18
30
  extensions: []
@@ -25,27 +37,25 @@ files:
25
37
  - lib/devpanel/stats.rb
26
38
  homepage: http://github.com/MattStopa/DevPanel
27
39
  licenses: []
28
- post_install_message:
40
+ metadata: {}
41
+ post_install_message:
29
42
  rdoc_options: []
30
43
  require_paths:
31
44
  - lib
32
45
  required_ruby_version: !ruby/object:Gem::Requirement
33
- none: false
34
46
  requirements:
35
- - - ! '>='
47
+ - - '>='
36
48
  - !ruby/object:Gem::Version
37
49
  version: '0'
38
50
  required_rubygems_version: !ruby/object:Gem::Requirement
39
- none: false
40
51
  requirements:
41
- - - ! '>='
52
+ - - '>='
42
53
  - !ruby/object:Gem::Version
43
54
  version: '0'
44
55
  requirements: []
45
- rubyforge_project:
46
- rubygems_version: 1.8.25
47
- signing_key:
48
- specification_version: 3
56
+ rubyforge_project:
57
+ rubygems_version: 2.4.8
58
+ signing_key:
59
+ specification_version: 4
49
60
  summary: DevPanel, a gem for performance stats and debugging information
50
61
  test_files: []
51
- has_rdoc: