clientperf 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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