clientperf 0.0.3 → 0.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.
data/CONTRIBUTORS CHANGED
@@ -1,3 +1,3 @@
1
- * Thanks to Howard Rauscher for providing much of the javascript measurement code.
1
+ * Thanks to Howard Rauscher for providing the javascript measurement code.
2
2
 
3
3
  * Thanks to the FiveRuns team, especially Bruce Williams for helping me to understand how to write rails plugins and hook into ActionController
data/History.rdoc CHANGED
@@ -1,3 +1,4 @@
1
1
  = History
2
+ * v0.1.0. This version is decent for consumption. decent graphs, layout, stable installation and compressed javascript.
2
3
  * v0.0.2. First time releasing a gem and my manifest was bad. this version fixes that
3
4
  * v0.0.1. Just in time for Austin on Rails
data/Manifest CHANGED
@@ -5,6 +5,8 @@ init.rb
5
5
  lib/clientperf.rb
6
6
  lib/clientperf_config.rb
7
7
  lib/clientperf_controller.rb
8
+ lib/clientperf_data_builder.rb
9
+ lib/clientperf_helper.rb
8
10
  lib/clientperf_migrations.rb
9
11
  lib/clientperf_result.rb
10
12
  lib/clientperf_uri.rb
data/README.rdoc CHANGED
@@ -6,9 +6,17 @@ Measures the time it takes a user's browser to get from the top of a web page to
6
6
 
7
7
  == Installation
8
8
 
9
+ Most cases:
10
+
9
11
  sudo gem install clientperf
10
12
  clientperf /path/to/rails/app
13
+ cd /path/to/rails/app
11
14
  rake db:migrate
15
+
16
+ For clientperf developers, follow the above steps to generate the clientperf tables for a rails app, then:
17
+ cd /path/to/rails/app
18
+ rm -rf vendor/plugins/clientperf
19
+ git clone git://github.com/efalcao/clientperf.git vendor/plugins/clientperf
12
20
 
13
21
  == Usage
14
22
 
data/Rakefile CHANGED
@@ -10,6 +10,5 @@ Echoe.new 'clientperf' do |p|
10
10
  p.project = 'clientperf'
11
11
  p.summary = "Instrumentation for the FiveRuns TuneUp product."
12
12
  p.url = "http://github.com/efalcao/clientperf"
13
- p.dependencies = %w(activesupport)
14
13
  p.include_rakefile = true
15
14
  end
data/TODO.rdoc CHANGED
@@ -1,5 +1,4 @@
1
1
  = TODO
2
- * charts
3
- * make it pretty
4
2
  * tests (how to test a plugin?)
5
- * indexes? other small optimizations?
3
+ * indexes? other small optimizations?
4
+ * rake-based installation rather than a gem binary? how to behave as a rail 2.1 gem when it comes to the migration?
data/bin/clientperf CHANGED
@@ -1,12 +1,20 @@
1
1
  #!/usr/bin/env ruby
2
+
3
+ # USAGE: clientperf [RAILS_ROOT]
4
+ rails_dir = ARGV[0] || Dir.pwd
5
+
2
6
  require 'fileutils'
7
+
8
+ require rails_dir + '/config/boot'
9
+ require "#{RAILS_ROOT}/config/environment"
10
+ require 'rails_generator'
11
+ require 'rails_generator/scripts/generate'
12
+
3
13
  require File.dirname(__FILE__) << "/../lib/clientperf"
4
14
  require File.dirname(__FILE__) << "/../lib/clientperf_config"
5
15
  require File.dirname(__FILE__) << "/../lib/clientperf_migrations"
6
16
 
7
- # For older Rails versions
8
- # USAGE: clientperf [RAILS_ROOT]
9
- rails_dir = ARGV[0] || Dir.pwd
17
+
10
18
  plugin_dir = File.join(rails_dir, 'vendor/plugins')
11
19
  unless File.directory?(plugin_dir)
12
20
  abort "clientperf: #{plugin_dir} does not exist; cannot install plugin"
@@ -25,7 +33,7 @@ File.readlines(File.dirname(__FILE__) << "/../Manifest").each do |line|
25
33
  end
26
34
  end
27
35
 
28
- ClientperfMigrations.new(rails_dir).install_new
36
+ ClientperfMigrations.install_new
29
37
  ClientperfConfig.create_unless_exists(rails_dir)
30
38
 
31
39
  STDERR.puts "Installed clientperf (v#{Clientperf.version}) in vendor/plugins/clientperf"
data/clientperf.gemspec CHANGED
@@ -1,22 +1,22 @@
1
1
 
2
- # Gem::Specification for Clientperf-0.0.3
2
+ # Gem::Specification for Clientperf-0.1.0
3
3
  # Originally generated by Echoe
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = %q{clientperf}
7
- s.version = "0.0.3"
7
+ s.version = "0.1.0"
8
8
 
9
9
  s.specification_version = 2 if s.respond_to? :specification_version=
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.authors = ["Eric Falcao"]
13
- s.date = %q{2008-06-20}
13
+ s.date = %q{2008-06-21}
14
14
  s.default_executable = %q{clientperf}
15
15
  s.description = %q{Instrumentation for the FiveRuns TuneUp product.}
16
16
  s.email = %q{efalcao@gmail.com}
17
17
  s.executables = ["clientperf"]
18
- s.extra_rdoc_files = ["bin/clientperf", "lib/clientperf.rb", "lib/clientperf_config.rb", "lib/clientperf_controller.rb", "lib/clientperf_migrations.rb", "lib/clientperf_result.rb", "lib/clientperf_uri.rb", "lib/extend_action_controller.rb", "LICENSE", "README.rdoc", "TODO.rdoc"]
19
- s.files = ["bin/clientperf", "CONTRIBUTORS", "History.rdoc", "init.rb", "lib/clientperf.rb", "lib/clientperf_config.rb", "lib/clientperf_controller.rb", "lib/clientperf_migrations.rb", "lib/clientperf_result.rb", "lib/clientperf_uri.rb", "lib/extend_action_controller.rb", "LICENSE", "Manifest", "rails/init.rb", "Rakefile", "README.rdoc", "TODO.rdoc", "views/clientperf/index.html.erb", "views/clientperf/show.html.erb", "views/layouts/clientperf.html.erb", "clientperf.gemspec"]
18
+ s.extra_rdoc_files = ["bin/clientperf", "lib/clientperf.rb", "lib/clientperf_config.rb", "lib/clientperf_controller.rb", "lib/clientperf_data_builder.rb", "lib/clientperf_helper.rb", "lib/clientperf_migrations.rb", "lib/clientperf_result.rb", "lib/clientperf_uri.rb", "lib/extend_action_controller.rb", "LICENSE", "README.rdoc", "TODO.rdoc"]
19
+ s.files = ["bin/clientperf", "CONTRIBUTORS", "History.rdoc", "init.rb", "lib/clientperf.rb", "lib/clientperf_config.rb", "lib/clientperf_controller.rb", "lib/clientperf_data_builder.rb", "lib/clientperf_helper.rb", "lib/clientperf_migrations.rb", "lib/clientperf_result.rb", "lib/clientperf_uri.rb", "lib/extend_action_controller.rb", "LICENSE", "Manifest", "rails/init.rb", "Rakefile", "README.rdoc", "TODO.rdoc", "views/clientperf/index.html.erb", "views/clientperf/show.html.erb", "views/layouts/clientperf.html.erb", "clientperf.gemspec"]
20
20
  s.has_rdoc = true
21
21
  s.homepage = %q{http://github.com/efalcao/clientperf}
22
22
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Clientperf", "--main", "README.rdoc"]
@@ -24,8 +24,6 @@ Gem::Specification.new do |s|
24
24
  s.rubyforge_project = %q{clientperf}
25
25
  s.rubygems_version = %q{1.0.1}
26
26
  s.summary = %q{Instrumentation for the FiveRuns TuneUp product.}
27
-
28
- s.add_dependency(%q<activesupport>, [">= 0"])
29
27
  end
30
28
 
31
29
 
@@ -43,6 +41,5 @@ end
43
41
  # p.project = 'clientperf'
44
42
  # p.summary = "Instrumentation for the FiveRuns TuneUp product."
45
43
  # p.url = "http://github.com/efalcao/clientperf"
46
- # p.dependencies = %w(activesupport)
47
44
  # p.include_rakefile = true
48
45
  # end
data/lib/clientperf.rb CHANGED
@@ -27,7 +27,7 @@ module Clientperf
27
27
  end
28
28
 
29
29
  def version
30
- "0.0.3"
30
+ "0.1.0"
31
31
  end
32
32
 
33
33
  private
@@ -1,7 +1,3 @@
1
- require 'yaml'
2
- require 'rubygems'
3
- require 'active_support'
4
-
5
1
  class ClientperfConfig
6
2
 
7
3
  delegate :[], :[]=, :each, :update, :to => :data
@@ -1,5 +1,6 @@
1
1
  class ClientperfController < ActionController::Base
2
2
  def index
3
+ ClientperfUri.destroy_all ["updated_at < ?", 1.year.ago]
3
4
  @uris = ClientperfUri.find(:all, :include => :clientperf_results)
4
5
  end
5
6
 
@@ -8,17 +9,6 @@ class ClientperfController < ActionController::Base
8
9
  @page_title = @uri.uri
9
10
  end
10
11
 
11
- def reset
12
- if request.post?
13
- if params[:id]
14
- ClientperfUri.destroy(params[:id])
15
- else
16
- ClientperfUri.destroy_all
17
- end
18
- end
19
- redirect_to :action => 'index'
20
- end
21
-
22
12
  def measure
23
13
  milliseconds = params[:e].to_i - params[:b].to_i rescue nil
24
14
  if milliseconds && params[:u]
@@ -0,0 +1,19 @@
1
+ module ClientperfDataBuilder
2
+ def build_data_for_chart(results, start_time, periods, period_increment)
3
+ max = 0
4
+ padded_results = (0..periods).map do |delta|
5
+ time_period = start_time + delta.send(period_increment)
6
+ data = get_data_or_pad(time_period, results)
7
+ max = data if data && data > max
8
+ [time_period, data]
9
+ end
10
+ [padded_results, max]
11
+ end
12
+
13
+ private
14
+
15
+ def get_data_or_pad(point, results)
16
+ data = results.detect {|p,d| point == p.to_time(:local)}
17
+ data ? data[1].to_i : 0
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ module ClientperfHelper
2
+ def chart(data)
3
+ "http://chart.apis.google.com/chart?cht=ls&chs=300x100&chm=B,e6f2fa,0,0,0|R,000000,0,0.998,1.0&chco=0f7fcf&chxt=r&chd=s:#{chart_data(data)}"
4
+ end
5
+
6
+ private
7
+
8
+ def chart_data(args)
9
+ data, max = args
10
+ max += max * 0.1
11
+ encode = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
12
+
13
+ encoded = data.map do |result|
14
+ char = 62 * result[1] / max.to_f
15
+ encode[char.round,1]
16
+ end.join
17
+ max_in_seconds = number_with_precision(max/ 1000.to_f, 2)
18
+ half_in_seconds = number_with_precision(max/ 2000.to_f, 2)
19
+ "#{encoded}&chxl=0:|0s|#{half_in_seconds}s|#{max_in_seconds}s"
20
+ end
21
+ end
@@ -23,33 +23,28 @@ class AddClientperfTables < ActiveRecord::Migration
23
23
  end)
24
24
  }
25
25
 
26
- attr_accessor :rails_dir
27
-
28
- def initialize(rails_dir)
29
- @rails_dir = rails_dir
30
- end
31
-
32
- def install_new
33
- MIGRATION_NAMES.reject {|name| exists?(name) }.each do |migration|
34
- generate(migration)
35
- install(migration)
26
+ class << self
27
+ def install_new
28
+ to_migrate = MIGRATION_NAMES.reject {|name| exists?(name) }
29
+ to_migrate.each do |migration|
30
+ generate(migration)
31
+ install(migration)
32
+ end
36
33
  end
37
- end
38
-
39
- private
40
-
41
- def generate(migration_name)
42
- `#{File.join(rails_dir, 'script', 'generate')} migration #{migration_name}`
43
- end
44
-
45
- def migration_path(migration_name)
46
- Dir[File.join(rails_dir, 'db', 'migrate', "*_#{migration_name}.rb")].first
47
- end
48
- alias_method :exists?, :migration_path
49
-
50
- def install(migration)
51
- File.open(migration_path(migration), 'w') do |file|
52
- file << MIGRATION_CONTENTS[migration.to_sym]
34
+
35
+ def generate(migration_name)
36
+ Rails::Generator::Scripts::Generate.new.run(['migration', migration_name])
37
+ end
38
+
39
+ def migration_path(migration_name)
40
+ Dir[File.join(RAILS_ROOT, 'db', 'migrate', "*_#{migration_name}.rb")].first
41
+ end
42
+ alias_method :exists?, :migration_path
43
+
44
+ def install(migration)
45
+ File.open(migration_path(migration), 'w') do |file|
46
+ file << MIGRATION_CONTENTS[migration.to_sym]
47
+ end
53
48
  end
54
49
  end
55
50
  end
@@ -2,6 +2,26 @@ class ClientperfResult < ActiveRecord::Base
2
2
  belongs_to :clientperf_uri
3
3
  after_create :update_uri
4
4
 
5
+ class << self
6
+ include ClientperfDataBuilder
7
+
8
+ def last_24_hours
9
+ start_time = (Time.now + 1.hour - 1.day).change(:min => 0)
10
+ results = average(:milliseconds, :conditions => ['created_at > ?', start_time],
11
+ :group => "date_format(created_at,'%Y-%m-%d %H')")
12
+
13
+ build_data_for_chart(results, start_time, 23, :hours)
14
+ end
15
+
16
+ def last_30_days
17
+ start_time = (Time.now + 1.day - 30.days).change(:hour => 0)
18
+ results = average(:milliseconds, :conditions => ['created_at > ?', start_time],
19
+ :group => "date_format(created_at,'%Y-%m-%d')")
20
+
21
+ build_data_for_chart(results, start_time, 29, :days)
22
+ end
23
+ end
24
+
5
25
  private
6
26
 
7
27
  def update_uri
@@ -1,86 +1,20 @@
1
1
  class ClientperfUri < ActiveRecord::Base
2
+ include ClientperfDataBuilder
3
+ has_many :clientperf_results, :dependent => :delete_all
2
4
 
3
- has_many :clientperf_results, :dependent => :delete_all do
4
- def last_hour
5
- end_time = (Time.now + 1.minute).change(:sec => 0)
6
- start_time = end_time - 1.hour
7
- results = average(:milliseconds, :conditions => ['created_at between ? and ?', start_time, end_time] ,
8
- :group => 'minute(created_at)')
5
+ def last_24_hours
6
+ start_time = (Time.now + 1.hour - 1.day).change(:min => 0)
7
+ results = clientperf_results.average(:milliseconds, :conditions => ['created_at > ?', start_time],
8
+ :group => "date_format(created_at,'%Y-%m-%d %H')")
9
9
 
10
- max = 0
11
- padded_results = (start_time.min..start_time.min + 59).map do |i|
12
- minute = i % 60
13
- data = data_for(minute, results)
14
- max = data if data && data > max
15
- [minute, data]
16
- end
17
- [padded_results, max]
18
- end
19
-
20
- def last_day
21
- end_time = (Time.now + 1.hour).change(:min => 0)
22
- start_time = end_time - 1.day
23
- results = average(:milliseconds, :conditions => ['created_at between ? and ?', start_time, end_time],
24
- :group => 'hour(created_at)')
25
-
26
- max = 0
27
- padded_results = (start_time.hour..start_time.hour + 23).map do |i|
28
- hour = i % 24
29
- data = data_for(hour, results)
30
- max = data if data && data > max
31
- [hour, data]
32
- end
33
- [padded_results, max]
34
- end
35
-
36
- def last_month
37
- end_time = (Time.now + 1.day).change(:hour => 0)
38
- start_time = end_time - 30.days
39
- results = average(:milliseconds, :conditions => ['created_at between ? and ?', start_time, end_time],
40
- :group => 'day(created_at)')
41
-
42
- max = 0
43
- padded_results = (start_time.day..start_time.day + 29).map do |i|
44
- day = i % Time.days_in_month(start_time.month)
45
- data = data_for(day, results)
46
- max = data if data && data > max
47
- [day, data]
48
- end
49
- [padded_results, max]
50
- end
51
-
52
- def data_for(point, results)
53
- data = results.detect {|p,d| point == p.to_i}
54
- data ? data[1].to_i : 0
55
- end
56
- end
57
-
58
- def chart_url
59
- "http://chart.apis.google.com/chart?cht=ls&chs=300x50&chm=B&chd=s:"
60
- end
61
-
62
- def hour_chart
63
- "#{chart_url}#{chart_data(clientperf_results.last_hour)}"
64
- end
65
-
66
- def day_chart
67
- "#{chart_url}#{chart_data(clientperf_results.last_day)}"
68
- end
69
-
70
- def month_chart
71
- "#{chart_url}#{chart_data(clientperf_results.last_month)}"
10
+ build_data_for_chart(results, start_time, 23, :hours)
72
11
  end
73
12
 
74
- private
75
-
76
- def chart_data(args)
77
- data, max = args
78
- max += 10
79
- encode = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
80
-
81
- data.map do |result|
82
- char = 62 * result[1] / max.to_f
83
- encode[char.round,1]
84
- end.join
13
+ def last_30_days
14
+ start_time = (Time.now + 1.day - 30.days).change(:hour => 0)
15
+ results = clientperf_results.average(:milliseconds, :conditions => ['created_at > ?', start_time],
16
+ :group => "date_format(created_at,'%Y-%m-%d')")
17
+
18
+ build_data_for_chart(results, start_time, 29, :days)
85
19
  end
86
20
  end
@@ -12,48 +12,28 @@ module ExtendActionController
12
12
  end
13
13
 
14
14
  def add_clientperf_to(response)
15
- if response.body =~ /<html[^>]*?>/im
16
- replacement = %q(\1
15
+ if response.body =~ /(<html[^>]*?>).*(<\/html>)/im
16
+ top = %q(\1
17
17
  <script type='text/javascript'>
18
- var clientPerfStart = (new Date()).getTime();
19
- var clientPerf = function() {
20
- var attach = function(instance, eventName, listener) {
21
- var listenerFn = listener;
22
- if (instance.addEventListener) {
23
- instance.addEventListener(eventName, listenerFn, false);
24
- }
25
- else if (instance.attachEvent) { // Internet explorer
26
- listenerFn = function() {
27
- listener(window.event);
28
- };
29
- instance.attachEvent("on" + eventName, listenerFn);
30
- }
31
- else {
32
- // I could do some further attachment here, if I wanted too. for older browsers
33
- // ex: instance['on' + eventName] = listener;
34
- throw new Error("Event registration not supported");
35
- }
36
- };
37
-
38
- var endRun = function() {
39
- var clientPerfEnd = (new Date()).getTime();
40
- var img = document.createElement('img');
41
- img.src = '/clientperf/measure.gif?b=' + clientPerfStart + '&e=' + clientPerfEnd + '&u=' + location.href;
42
- document.body.appendChild(img);
43
- };
44
-
45
- try {
46
- attach(window, 'load', endRun);
47
- }
48
- catch(e) {
49
- window.onload = endRun;
50
- }
51
- }
52
- clientPerf();
18
+ var _clientPerfStart = (new Date()).getTime();
53
19
  </script>
54
20
  )
55
21
 
56
- response.body.sub!(/(<html[^>]*?>)/im, replacement)
22
+ bottom = %q(
23
+ <script type='text/javascript'>
24
+ (function() {
25
+ function fn() { var end = (new Date()).getTime(), img = document.createElement('img'); img.src = '/clientperf/measure.gif?b='+_clientPerfStart+'&e='+end+'&u='+encodeURIComponent(location.href); document.body.appendChild(img); };
26
+ if (window.addEventListener) { window.addEventListener('load', fn, false); }
27
+ else if (window.attachEvent) { window.attachEvent('onload', fn); }
28
+ else { var chain = window.onload; window.onload = function(e) { if(chain !== undefined) { chain(e); } fn(); } }
29
+ })();
30
+ </script>
31
+ </html>
32
+ )
33
+
34
+ response.body.sub!(/(<html[^>]*?>)/im, top)
35
+ response.body.sub!(/<\/html>/im, bottom)
36
+
57
37
  response.headers["Content-Length"] = response.body.size
58
38
  end
59
39
  end
@@ -1,20 +1,26 @@
1
- <h2>all urls</h2>
2
- <table>
3
- <tr>
4
- <td>URL</td>
5
- <td># of times measured</td>
6
- <td>avg. client time (ms)</td>
7
- <td>first measured</td>
8
- <td>last measured</td>
9
- </tr>
10
- <% @uris.each do |uri| %>
11
- <tr>
12
- <td><%= link_to uri.uri, "/clientperf/#{uri.id}" %></td>
13
- <td><%= uri.clientperf_results.count %></td>
14
- <td><%= uri.clientperf_results.average(:milliseconds).to_i %></td>
15
- <td><%= uri.created_at.strftime("%M/%d/%y") %></td>
16
- <td><%= uri.updated_at.strftime("%M/%d/%y") %></td>
17
- </tr>
18
- <% end %>
19
- </table>
20
- <p><%= button_to "Reset all data", {:action => 'reset'}, :confirm => "are you sure?" %></p>
1
+ <div id="urls">
2
+ <div class="block">
3
+ <h2>all urls<span id="explanation">[ avg. seconds | # of times seen ]</span></h2>
4
+ <table>
5
+ <% @uris.each do |uri| %>
6
+ <tr>
7
+ <td class="vital-stats">[ <%= number_with_precision(uri.clientperf_results.average(:milliseconds) / 1000.to_f, 2) %>s | <%= uri.clientperf_results.count %> ]</td>
8
+ <td><%= link_to uri.uri, "/clientperf/#{uri.id}" %></td>
9
+ </tr>
10
+ <% end %>
11
+ </table>
12
+ </div>
13
+ </div>
14
+ <div id="overall">
15
+ <div class="block">
16
+ <h2>overall graphs</h2>
17
+ <div class="chart">
18
+ <h4>24 hour</h4>
19
+ <img src="<%= chart(ClientperfResult.last_24_hours) %>" />
20
+ </div>
21
+ <div class="chart">
22
+ <h4>30 day</h4>
23
+ <img src="<%= chart(ClientperfResult.last_30_days)%>" />
24
+ </div>
25
+ </div>
26
+ </div>
@@ -1,18 +1,24 @@
1
- <h2>summary</h2>
2
- <p>recorded <%= @uri.clientperf_results.count %> times with average time of <%= @uri.clientperf_results.average(:milliseconds).to_i %>ms. last recorded <%= @uri.updated_at.strftime("%Y-%m-%d") %>.</p>
3
-
4
- <h2>trends</h2>
5
- <div class="chart">
6
- <h4>last hour</h4>
7
- <img src="<%= @uri.hour_chart %>" />
1
+ <div id="trends">
2
+ <div class="block">
3
+ <h2>trends</h2>
4
+ <div class="chart">
5
+ <h4>24 hour</h4>
6
+ <img src="<%= chart(@uri.last_24_hours) %>" />
7
+ </div>
8
+ <div class="chart">
9
+ <h4>30 day</h4>
10
+ <img src="<%= chart(@uri.last_30_days)%>" />
11
+ </div>
12
+ </div>
8
13
  </div>
9
- <div class="chart">
10
- <h4>last day</h4>
11
- <img src="<%= @uri.day_chart %>" />
12
- </div>
13
- <div class="chart">
14
- <h4>last month</h4>
15
- <img src="<%= @uri.month_chart %>" />
16
- </div>
17
-
18
- <p><%= button_to "Reset this URI", {:action => 'reset', :id => @uri.id}, :confirm => "are you sure?" %></p>
14
+ <div id="summary">
15
+ <div class="block">
16
+ <h2>summary</h2>
17
+ <ul>
18
+ <li><span>measured:</span><b><%= @uri.clientperf_results.count %></b> times</li>
19
+ <li><span>average time:</span><b><%= number_with_precision(@uri.clientperf_results.average(:milliseconds) / 1000.to_f, 2) %></b> seconds</li>
20
+ <li><span>first seen:</span><b><%= @uri.created_at.strftime("%m/%d/%Y") %></b></li>
21
+ <li><span>last seen:</span><b><%= distance_of_time_in_words(@uri.updated_at, Time.now) %></b> ago</li>
22
+ </ul>
23
+ </div>
24
+ </div>
@@ -2,7 +2,21 @@
2
2
  <head>
3
3
  <title>clientperf <%= ": #{@page_title}" if @page_title %></title>
4
4
  <style type="text/css">
5
- body {margin:0; font-family: helvetica, arial, sans-serif; font-size: 14px;}
5
+ body {
6
+ margin:0;
7
+ font-family: helvetica, arial, sans-serif;
8
+ font-size: 14px;
9
+ min-width: 990px;
10
+ }
11
+
12
+ ul {
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ li {
18
+ list-style-type: none;
19
+ }
6
20
 
7
21
  #header {
8
22
  background-color: #dedede;
@@ -29,14 +43,53 @@
29
43
  #header h3 span {
30
44
  }
31
45
 
32
- #content {
33
- padding: 0 20px;
34
- }
35
-
36
46
  #content h2 {
37
- margin-top: 20px;
47
+ margin: 0 0 20px 0;
38
48
  border-bottom: 1px solid #d3d3d3;
39
49
  }
50
+
51
+ #urls, #overall, #trends, #summary {
52
+ float: left;
53
+ }
54
+
55
+ #urls, #trends {
56
+ width: 60%;
57
+ }
58
+
59
+ #urls li {
60
+ margin-bottom: 3px ;
61
+ }
62
+
63
+ .vital-stats, #explanation {
64
+ color: #666;
65
+ padding-right: 5px;
66
+ font-weight: normal;
67
+ }
68
+
69
+ #explanation {
70
+ margin-left: 10px;
71
+ font-style: italic;
72
+ font-size: 12px;
73
+ position: relative;
74
+ bottom: 2px;
75
+ }
76
+
77
+ table {
78
+ font-size: 14px;
79
+ }
80
+
81
+ td { padding-bottom: 3px;}
82
+
83
+ #overall, #summary{
84
+ width: 40%;
85
+ }
86
+
87
+ .block {
88
+ padding: 20px;
89
+ }
90
+
91
+ #summary li {margin-bottom: 6px;}
92
+ #summary li span { float:left; width: 100px; }
40
93
  </style>
41
94
  </head>
42
95
  <body>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clientperf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Falcao
@@ -9,18 +9,10 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-20 00:00:00 -05:00
12
+ date: 2008-06-21 00:00:00 -05:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: activesupport
17
- version_requirement:
18
- version_requirements: !ruby/object:Gem::Requirement
19
- requirements:
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: "0"
23
- version:
14
+ dependencies: []
15
+
24
16
  description: Instrumentation for the FiveRuns TuneUp product.
25
17
  email: efalcao@gmail.com
26
18
  executables:
@@ -32,6 +24,8 @@ extra_rdoc_files:
32
24
  - lib/clientperf.rb
33
25
  - lib/clientperf_config.rb
34
26
  - lib/clientperf_controller.rb
27
+ - lib/clientperf_data_builder.rb
28
+ - lib/clientperf_helper.rb
35
29
  - lib/clientperf_migrations.rb
36
30
  - lib/clientperf_result.rb
37
31
  - lib/clientperf_uri.rb
@@ -47,6 +41,8 @@ files:
47
41
  - lib/clientperf.rb
48
42
  - lib/clientperf_config.rb
49
43
  - lib/clientperf_controller.rb
44
+ - lib/clientperf_data_builder.rb
45
+ - lib/clientperf_helper.rb
50
46
  - lib/clientperf_migrations.rb
51
47
  - lib/clientperf_result.rb
52
48
  - lib/clientperf_uri.rb