widescreen 0.0.1 → 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/README.html ADDED
@@ -0,0 +1,178 @@
1
+ <head>
2
+ <style>
3
+ body {
4
+ font-family: georgia, arial, helvetica;
5
+ padding: 1em;
6
+ }
7
+ p {
8
+ max-width: 40em;
9
+ }
10
+ h1 {
11
+ background-color: #f1f1fd;
12
+ border-bottom: 1px solid blue;
13
+ padding: .25em 1em;
14
+ margin: 1em -1em .25em;
15
+ }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <h1>Widescreen<a href="http://travis-ci.org/martinciu/widescreen"><img src="https://secure.travis-ci.org/martinciu/widescreen.png?branch=master" alt="travis-ci" /></a></h1>
20
+
21
+ <p>Rack based event statistic framework for any Rack app</p>
22
+
23
+ <h2>Requirements</h2>
24
+
25
+ <p>Widescreen uses redis as a datastore.</p>
26
+
27
+ <p>Widescreen only supports redis 2.0 or greater.</p>
28
+
29
+ <p>If you're on OS X, Homebrew is the simplest way to install Redis:</p>
30
+
31
+ <pre><code>$ brew install redis
32
+ $ redis-server /usr/local/etc/redis.conf
33
+ </code></pre>
34
+
35
+ <p>You now have a Redis daemon running on 6379.</p>
36
+
37
+ <h2>Setup</h2>
38
+
39
+ <p>If you are using bundler add widescreen to your Gemfile:</p>
40
+
41
+ <pre><code>gem 'widescreen'
42
+ </code></pre>
43
+
44
+ <p>Then run:</p>
45
+
46
+ <pre><code>bundle install
47
+ </code></pre>
48
+
49
+ <p>Otherwise install the gem:</p>
50
+
51
+ <pre><code>gem install widescreen
52
+ </code></pre>
53
+
54
+ <p>and require it in your project:</p>
55
+
56
+ <pre><code>require 'widescreen'
57
+ </code></pre>
58
+
59
+ <h2>Usage</h2>
60
+
61
+ <p>Anywhere in you code call</p>
62
+
63
+ <pre><code>Widescreen::Stat.add(:metric_name, 10)
64
+ </code></pre>
65
+
66
+ <p>to increase counter by 10 for <code>metric_name</code> metric or</p>
67
+
68
+ <pre><code>Widescreen::Stat.add(:metric_name)
69
+ </code></pre>
70
+
71
+ <p>to increase it by 1</p>
72
+
73
+ <h2>Web Interface</h2>
74
+
75
+ <p>Widescreen comes with a Sinatra-based front end to get an overview of how your experiments are doing.</p>
76
+
77
+ <p>If you are running Rails 2: You can mount this inside your app using Rack::URLMap in your <code>config.ru </code></p>
78
+
79
+ <pre><code>require 'widescreen/dashboard'
80
+
81
+ run Rack::URLMap.new \
82
+ "/" =&gt; Your::App.new,
83
+ "/widescreen" =&gt; Widescreen::Dashboard.new
84
+ </code></pre>
85
+
86
+ <p>However, if you are using Rails 3: You can mount this inside your app routes by first adding this to config/routes.rb</p>
87
+
88
+ <pre><code>mount Widescreen::Dashboard, :at =&gt; 'widescreen'
89
+ </code></pre>
90
+
91
+ <p>You may want to password protect that page, you can do so with <code>Rack::Auth::Basic</code></p>
92
+
93
+ <pre><code>Widescreen::Dashboard.use Rack::Auth::Basic do |username, password|
94
+ username == 'admin' &amp;&amp; password == 'p4s5w0rd'
95
+ end
96
+ </code></pre>
97
+
98
+ <p>Dashboard is heavely inspirated by <a href="https://github.com/defunkt/resque">Resque</a> and <a href="https://github.com/andrew/split">Split</a></p>
99
+
100
+ <h2>Configuration</h2>
101
+
102
+ <h3>Redis</h3>
103
+
104
+ <p>You may want to change the Redis host and port Wide connects to, or
105
+ set various other options at startup.</p>
106
+
107
+ <p>Widescreen has a <code>redis</code> setter which can be given a string or a Redis
108
+ object. This means if you're already using Redis in your app, Widescreen
109
+ can re-use the existing connection.</p>
110
+
111
+ <p>String: <code>Widescreen.redis = 'localhost:6379'</code></p>
112
+
113
+ <p>Redis: <code>Widescreen.redis = $redis</code></p>
114
+
115
+ <p>For our rails app we have a <code>config/initializers/widescreen.rb</code> file where
116
+ we load <code>config/widescreen.yml</code> by hand and set the Redis information
117
+ appropriately.</p>
118
+
119
+ <p>Here's our <code>config/widescreen.yml</code>:</p>
120
+
121
+ <pre><code>development: localhost:6379
122
+ test: localhost:6379
123
+ staging: redis1.example.com:6379
124
+ fi: localhost:6379
125
+ production: redis1.example.com:6379
126
+ </code></pre>
127
+
128
+ <p>And our initializer:</p>
129
+
130
+ <pre><code>rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..'
131
+ rails_env = ENV['RAILS_ENV'] || 'development'
132
+
133
+ widescreen_config = YAML.load_file(rails_root + '/config/widescreen.yml')
134
+ Widescreen.redis = widescreen_config[rails_env]
135
+ </code></pre>
136
+
137
+ <h2>Namespaces</h2>
138
+
139
+ <p>If you're running multiple, separate instances of widescreen you may want
140
+ to namespace the keyspaces so they do not overlap. This is not unlike
141
+ the approach taken by many memcached clients.</p>
142
+
143
+ <p>This feature is provided by the [redis-namespace][rs] library, which
144
+ widescreen uses by default to separate the keys it manages from other keys
145
+ in your Redis server.</p>
146
+
147
+ <p>Simply use the <code>Widescreen.redis.namespace</code> accessor:</p>
148
+
149
+ <pre><code>Widescreen.redis.namespace = "widescreen:blog"
150
+ </code></pre>
151
+
152
+ <p>We recommend sticking this in your initializer somewhere after Redis
153
+ is configured.</p>
154
+
155
+ <h2>Development</h2>
156
+
157
+ <p>Source hosted at <a href="http://github.com/martinciu/widescreen">GitHub</a>.
158
+ Report Issues/Feature requests on <a href="http://github.com/martinciu/widescreen/issues">GitHub Issues</a>.</p>
159
+
160
+ <p>Tests can be ran with <code>rake test</code></p>
161
+
162
+ <h3>Note on Patches/Pull Requests</h3>
163
+
164
+ <ul>
165
+ <li>Fork the project.</li>
166
+ <li>Make your feature addition or bug fix.</li>
167
+ <li>Add tests for it. This is important so I don't break it in a
168
+ future version unintentionally.</li>
169
+ <li>Commit, do not mess with rakefile, version, or history.
170
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)</li>
171
+ <li>Send me a pull request. Bonus points for topic branches.</li>
172
+ </ul>
173
+
174
+
175
+ <h2>Copyright</h2>
176
+
177
+ <p>Copyright (c) 2011 Marcin Ciunelis. See <a href="https://github.com/martinciu/widescreen/blob/master/LICENSE">LICENSE</a> for details.</p>
178
+
data/README.md CHANGED
@@ -46,7 +46,27 @@ to increase it by 1
46
46
 
47
47
  ## Web Interface
48
48
 
49
- Web interface is on to-do list. It will be simple sinatra app similar to Resque web interface
49
+ Widescreen comes with a Sinatra-based front end to get an overview of how your experiments are doing.
50
+
51
+ If you are running Rails 2: You can mount this inside your app using Rack::URLMap in your `config.ru `
52
+
53
+ require 'widescreen/dashboard'
54
+
55
+ run Rack::URLMap.new \
56
+ "/" => Your::App.new,
57
+ "/widescreen" => Widescreen::Dashboard.new
58
+
59
+ However, if you are using Rails 3: You can mount this inside your app routes by first adding this to config/routes.rb
60
+
61
+ mount Widescreen::Dashboard, :at => 'widescreen'
62
+
63
+ You may want to password protect that page, you can do so with `Rack::Auth::Basic`
64
+
65
+ Widescreen::Dashboard.use Rack::Auth::Basic do |username, password|
66
+ username == 'admin' && password == 'p4s5w0rd'
67
+ end
68
+
69
+ Dashboard is inspirated by [Resque](https://github.com/defunkt/resque) and [Split](https://github.com/andrew/split)
50
70
 
51
71
  ## Configuration
52
72
 
File without changes
@@ -0,0 +1,48 @@
1
+ html, body, div, span, applet, object, iframe,
2
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
3
+ a, abbr, acronym, address, big, cite, code,
4
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
5
+ small, strike, strong, sub, sup, tt, var,
6
+ dl, dt, dd, ul, li,
7
+ form, label, legend,
8
+ table, caption, tbody, tfoot, thead, tr, th, td {
9
+ margin: 0;
10
+ padding: 0;
11
+ border: 0;
12
+ outline: 0;
13
+ font-weight: inherit;
14
+ font-style: normal;
15
+ font-size: 100%;
16
+ font-family: inherit;
17
+ }
18
+
19
+ :focus {
20
+ outline: 0;
21
+ }
22
+
23
+ body {
24
+ line-height: 1;
25
+ }
26
+
27
+ ul {
28
+ list-style: none;
29
+ }
30
+
31
+ table {
32
+ border-collapse: collapse;
33
+ border-spacing: 0;
34
+ }
35
+
36
+ caption, th, td {
37
+ text-align: left;
38
+ font-weight: normal;
39
+ }
40
+
41
+ blockquote:before, blockquote:after,
42
+ q:before, q:after {
43
+ content: "";
44
+ }
45
+
46
+ blockquote, q {
47
+ quotes: "" "";
48
+ }
@@ -0,0 +1,85 @@
1
+ html { background:#efefef; font-family:Arial, Verdana, sans-serif; font-size:13px; }
2
+ body { padding:0; margin:0; }
3
+
4
+ .header { background:#000; padding:8px 5% 0 5%; border-bottom:1px solid #444;border-bottom:5px solid #049405;}
5
+ .header h1 { color:#333; font-size:90%; font-weight:bold; margin-bottom:6px;}
6
+ .header ul li { display:inline;}
7
+ .header ul li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; padding:8px; -webkit-border-top-right-radius:6px; -webkit-border-top-left-radius:6px; -moz-border-radius-topleft:6px; -moz-border-radius-topright:6px; }
8
+ .header ul li a:hover { background:#333;}
9
+ .header ul li.current a { background:#049405; font-weight:bold; color:#fff;}
10
+
11
+ .header .namespace { position: absolute; right: 75px; top: 10px; color: #7A7A7A; }
12
+
13
+ .subnav { padding:2px 5% 7px 5%; background:#049405; font-size:90%;}
14
+ .subnav li { display:inline;}
15
+ .subnav li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; background:#dd5b5b; padding:5px; -webkit-border-radius:3px; -moz-border-radius:3px;}
16
+ .subnav li.current a { background:#fff; font-weight:bold; color:#049405;}
17
+ .subnav li a:active { background:#b00909;}
18
+
19
+ #main { padding:10px 5%; background:#fff; overflow:hidden; }
20
+ #main .logo { float:right; margin:10px;}
21
+ #main span.hl { background:#efefef; padding:2px;}
22
+ #main h1 { margin:10px 0; font-size:190%; font-weight:bold; color:#049405;}
23
+ #main h2 { margin:10px 0; font-size:130%;}
24
+ #main table { width:100%; margin:10px 0;}
25
+ #main table tr td, #main table tr th { border:1px solid #ccc; padding:6px;}
26
+ #main table tr th { background:#efefef; color:#888; font-size:80%; font-weight:bold;}
27
+ #main table tr td.no-data { text-align:center; padding:40px 0; color:#999; font-style:italic; font-size:130%;}
28
+ #main a { color:#111;}
29
+ #main p { margin:5px 0;}
30
+ #main p.intro { margin-bottom:15px; font-size:85%; color:#999; margin-top:0; line-height:1.3;}
31
+ #main h1.wi { margin-bottom:5px;}
32
+ #main p.sub { font-size:95%; color:#999;}
33
+
34
+ #main table.queues { width:40%;}
35
+ #main table.queues td.queue { font-weight:bold; width:50%;}
36
+ #main table.queues tr.failed td { border-top:2px solid; font-size:90%; }
37
+ #main table.queues tr.failure td { background:#ffecec; border-top:2px solid #d37474; font-size:90%; color:#d37474;}
38
+ #main table.queues tr.failure td a{ color:#d37474;}
39
+
40
+ #main table.jobs td.class { font-family:Monaco, "Courier New", monospace; font-size:90%; width:50%;}
41
+ #main table.jobs td.args{ width:50%;}
42
+
43
+ #main table.workers td.icon {width:1%; background:#efefef;text-align:center;}
44
+ #main table.workers td.where { width:25%;}
45
+ #main table.workers td.queues { width:35%;}
46
+ #main .queue-tag { background:#b1d2e9; padding:2px; margin:0 3px; font-size:80%; text-decoration:none; text-transform:uppercase; font-weight:bold; color:#3274a2; -webkit-border-radius:4px; -moz-border-radius:4px;}
47
+ #main table.workers td.queues.queue { width:10%;}
48
+ #main table.workers td.process { width:35%;}
49
+ #main table.workers td.process span.waiting { color:#999; font-size:90%;}
50
+ #main table.workers td.process small { font-size:80%; margin-left:5px;}
51
+ #main table.workers td.process code { font-family:Monaco, "Courier New", monospace; font-size:90%;}
52
+ #main table.workers td.process small a { color:#999;}
53
+ #main.polling table.workers tr.working td { background:#f4ffe4; color:#7ac312;}
54
+ #main.polling table.workers tr.working td.where a { color:#7ac312;}
55
+ #main.polling table.workers tr.working td.process code { font-weight:bold;}
56
+
57
+
58
+ #main table.stats th { font-size:100%; width:40%; color:#000;}
59
+ #main hr { border:0; border-top:5px solid #efefef; margin:15px 0;}
60
+
61
+ #footer { padding:10px 5%; background:#efefef; color:#999; font-size:85%; line-height:1.5; border-top:5px solid #ccc; padding-top:10px;}
62
+ #footer p a { color:#999;}
63
+
64
+ #main p.poll { background:url(poll.png) no-repeat 0 2px; padding:3px 0; padding-left:23px; float:right; font-size:85%; }
65
+
66
+ #main ul.failed {}
67
+ #main ul.failed li {background:-webkit-gradient(linear, left top, left bottom, from(#efefef), to(#fff)) #efefef; margin-top:10px; padding:10px; overflow:hidden; -webkit-border-radius:5px; border:1px solid #ccc; }
68
+ #main ul.failed li dl dt {font-size:80%; color:#999; width:60px; float:left; padding-top:1px; text-align:right;}
69
+ #main ul.failed li dl dd {margin-bottom:10px; margin-left:70px;}
70
+ #main ul.failed li dl dd .retried { float:right; text-align: right; }
71
+ #main ul.failed li dl dd .retried .remove { display:none; margin-top: 8px; }
72
+ #main ul.failed li.hover dl dd .retried .remove { display:block; }
73
+ #main ul.failed li dl dd .controls { display:none; float:right; }
74
+ #main ul.failed li.hover dl dd .controls { display:block; }
75
+ #main ul.failed li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%; white-space: pre-wrap;}
76
+ #main ul.failed li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; }
77
+ #main ul.failed li dl dd.error pre { margin-top:3px; line-height:1.3;}
78
+
79
+ #main p.pagination { background:#efefef; padding:10px; overflow:hidden;}
80
+ #main p.pagination a.less { float:left;}
81
+ #main p.pagination a.more { float:right;}
82
+
83
+ #main form {float:right; margin-top:-10px;}
84
+
85
+ #main .time a.toggle_format {text-decoration:none;}
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>Widecreen</title>
6
+ <link href="<%=url 'reset.css' %>" media="screen" rel="stylesheet" type="text/css">
7
+ <link href="<%=url 'style.css' %>" media="screen" rel="stylesheet" type="text/css">
8
+ </head>
9
+ <body>
10
+ <div class="header">
11
+ <ul class='nav'>
12
+ <li class="current"><a href="<%= url '/' %>">Metrics</a></li>
13
+ </ul>
14
+ <abbr class="namespace" title="Widescreen's Redis Namespace">
15
+ <%= Widescreen.redis.namespace %>
16
+ </abbr>
17
+ </div>
18
+
19
+ <div id="main">
20
+ <%= yield %>
21
+ </div>
22
+
23
+ <div id="footer">
24
+ <p>Powered by <a href="http://github.com/martinciu/widescreen">Widescreen</a> v<%=Widescreen::VERSION%></p>
25
+ <p>Connected to Redis namespace <%= Widescreen.redis.namespace %> on <%=Widescreen.redis_id%></p>
26
+ </div>
27
+
28
+ </body>
29
+ </html>
@@ -0,0 +1,13 @@
1
+ <h1><%= @metric.name %></h1>
2
+ <table class='stats'>
3
+ <% for stat in @metric.stats %>
4
+ <tr>
5
+ <th>
6
+ <%= stat.time %>
7
+ </th>
8
+ <td>
9
+ <%= stat.value %>
10
+ </td>
11
+ </tr>
12
+ <% end %>
13
+ </table>
@@ -0,0 +1,10 @@
1
+ <h1>Available Metrics</h1>
2
+ <table class='stats'>
3
+ <% for metric in @metrics %>
4
+ <tr>
5
+ <td>
6
+ <a href="<%= url "metrics/#{metric.name}" %>"><%= metric.name %></a>
7
+ </td>
8
+ </tr>
9
+ <% end %>
10
+ </table>
@@ -0,0 +1,33 @@
1
+ require 'sinatra/base'
2
+
3
+ module Widescreen
4
+ class Dashboard < Sinatra::Base
5
+ dir = File.dirname(File.expand_path(__FILE__))
6
+
7
+ set :views, "#{dir}/dashboard/views"
8
+ set :public_folder, "#{dir}/dashboard/public"
9
+ set :static, true
10
+ set :method_override, true
11
+
12
+ helpers do
13
+ def url(*path_parts)
14
+ [ path_prefix, path_parts ].join("/").squeeze('/')
15
+ end
16
+
17
+ def path_prefix
18
+ request.env['SCRIPT_NAME']
19
+ end
20
+ end
21
+
22
+ get '/' do
23
+ @metrics = Widescreen::Metric.all
24
+ erb :metrics
25
+ end
26
+
27
+ get '/metrics/:name' do
28
+ @metric = Widescreen::Metric.find(params[:name])
29
+ erb :metric
30
+ end
31
+
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module Widescreen
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/widescreen.rb CHANGED
@@ -4,6 +4,7 @@ require 'time'
4
4
  require 'widescreen/version'
5
5
  require 'widescreen/metric'
6
6
  require 'widescreen/stat'
7
+ require 'widescreen/dashboard'
7
8
 
8
9
  module Widescreen
9
10
  SEPARATOR = "|"
@@ -45,4 +46,14 @@ module Widescreen
45
46
  self.redis = Redis.respond_to?(:connect) ? Redis.connect : "localhost:6379"
46
47
  self.redis
47
48
  end
49
+
50
+ def redis_id
51
+ # support 1.x versions of redis-rb
52
+ if redis.respond_to?(:server)
53
+ redis.server
54
+ else
55
+ redis.client.id
56
+ end
57
+ end
58
+
48
59
  end
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup(:default, :test)
4
4
  Bundler.require(:default, :test)
5
+ require 'rack/test'
5
6
 
6
7
  dir = File.dirname(File.expand_path(__FILE__))
7
8
  $LOAD_PATH.unshift dir + '/../lib'
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Widescreen::Dashboard do
4
+ include Rack::Test::Methods
5
+
6
+ def app
7
+ @app ||= Widescreen::Dashboard
8
+ end
9
+
10
+ before(:each) do
11
+ Widescreen.redis.flushall
12
+ Widescreen::Stat.add('foo', 10)
13
+ end
14
+
15
+ it "should respond to /" do
16
+ get '/'
17
+ last_response.ok?.must_equal true
18
+ end
19
+
20
+ it "should respond to /metrics/foo" do
21
+ get '/metrics/foo'
22
+ last_response.ok?.must_equal true
23
+ end
24
+
25
+ end
data/widescreen.gemspec CHANGED
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.add_dependency 'redis', '~> 2.2.2'
21
21
  s.add_dependency 'redis-namespace', '~> 1.0.3'
22
- s.add_development_dependency 'rake'
22
+ s.add_dependency 'sinatra', '>= 1.2.6'
23
+ s.add_development_dependency 'rake', '~> 0.9.2'
23
24
  s.add_development_dependency 'minitest', '~> 2.6.1'
24
25
  s.add_development_dependency 'timecop', '~> 0.3.5'
25
-
26
+ s.add_development_dependency 'rack-test', '~> 0.6'
26
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: widescreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-10-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &2162119200 !ruby/object:Gem::Requirement
16
+ requirement: &2153430700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.2.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2162119200
24
+ version_requirements: *2153430700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: redis-namespace
27
- requirement: &2162118580 !ruby/object:Gem::Requirement
27
+ requirement: &2153430100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,21 +32,32 @@ dependencies:
32
32
  version: 1.0.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2162118580
35
+ version_requirements: *2153430100
36
36
  - !ruby/object:Gem::Dependency
37
- name: rake
38
- requirement: &2162118160 !ruby/object:Gem::Requirement
37
+ name: sinatra
38
+ requirement: &2153429480 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
42
42
  - !ruby/object:Gem::Version
43
- version: '0'
43
+ version: 1.2.6
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2153429480
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &2153428860 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.9.2
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *2162118160
57
+ version_requirements: *2153428860
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: minitest
49
- requirement: &2162117460 !ruby/object:Gem::Requirement
60
+ requirement: &2153407880 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 2.6.1
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2162117460
68
+ version_requirements: *2153407880
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: timecop
60
- requirement: &2162096100 !ruby/object:Gem::Requirement
71
+ requirement: &2153406800 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ~>
@@ -65,7 +76,18 @@ dependencies:
65
76
  version: 0.3.5
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2162096100
79
+ version_requirements: *2153406800
80
+ - !ruby/object:Gem::Dependency
81
+ name: rack-test
82
+ requirement: &2153405700 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '0.6'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2153405700
69
91
  description:
70
92
  email: marcin.ciunelis@gmail.com
71
93
  executables: []
@@ -76,14 +98,23 @@ files:
76
98
  - .travis.yml
77
99
  - Gemfile
78
100
  - LICENSE
101
+ - README.html
79
102
  - README.md
80
103
  - Rakefile
81
104
  - lib/widescreen.rb
105
+ - lib/widescreen/dashboard.rb
106
+ - lib/widescreen/dashboard/public/favicon.ico
107
+ - lib/widescreen/dashboard/public/reset.css
108
+ - lib/widescreen/dashboard/public/style.css
109
+ - lib/widescreen/dashboard/views/layout.erb
110
+ - lib/widescreen/dashboard/views/metric.erb
111
+ - lib/widescreen/dashboard/views/metrics.erb
82
112
  - lib/widescreen/metric.rb
83
113
  - lib/widescreen/stat.rb
84
114
  - lib/widescreen/version.rb
85
115
  - spec/redis-test.conf
86
116
  - spec/spec_helper.rb
117
+ - spec/widescreen/dashboard_spec.rb
87
118
  - spec/widescreen/metric_spec.rb
88
119
  - spec/widescreen/stat_spec.rb
89
120
  - widescreen.gemspec
@@ -101,7 +132,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
132
  version: '0'
102
133
  segments:
103
134
  - 0
104
- hash: 225638225036064920
135
+ hash: -2060582431598513102
105
136
  required_rubygems_version: !ruby/object:Gem::Requirement
106
137
  none: false
107
138
  requirements:
@@ -110,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
141
  version: '0'
111
142
  segments:
112
143
  - 0
113
- hash: 225638225036064920
144
+ hash: -2060582431598513102
114
145
  requirements: []
115
146
  rubyforge_project:
116
147
  rubygems_version: 1.8.10
@@ -120,5 +151,6 @@ summary: Rack based event statistic framework for any Rack app
120
151
  test_files:
121
152
  - spec/redis-test.conf
122
153
  - spec/spec_helper.rb
154
+ - spec/widescreen/dashboard_spec.rb
123
155
  - spec/widescreen/metric_spec.rb
124
156
  - spec/widescreen/stat_spec.rb