snifter 0.1.0.pre

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 (69) hide show
  1. data/Gemfile +3 -0
  2. data/Gemfile.lock +46 -0
  3. data/LICENSE +20 -0
  4. data/README.md +38 -0
  5. data/Rakefile +16 -0
  6. data/bin/snifter +19 -0
  7. data/coverage/assets/0.5.3/app.js +88 -0
  8. data/coverage/assets/0.5.3/fancybox/blank.gif +0 -0
  9. data/coverage/assets/0.5.3/fancybox/fancy_close.png +0 -0
  10. data/coverage/assets/0.5.3/fancybox/fancy_loading.png +0 -0
  11. data/coverage/assets/0.5.3/fancybox/fancy_nav_left.png +0 -0
  12. data/coverage/assets/0.5.3/fancybox/fancy_nav_right.png +0 -0
  13. data/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png +0 -0
  14. data/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png +0 -0
  15. data/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png +0 -0
  16. data/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png +0 -0
  17. data/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png +0 -0
  18. data/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png +0 -0
  19. data/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png +0 -0
  20. data/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png +0 -0
  21. data/coverage/assets/0.5.3/fancybox/fancy_title_left.png +0 -0
  22. data/coverage/assets/0.5.3/fancybox/fancy_title_main.png +0 -0
  23. data/coverage/assets/0.5.3/fancybox/fancy_title_over.png +0 -0
  24. data/coverage/assets/0.5.3/fancybox/fancy_title_right.png +0 -0
  25. data/coverage/assets/0.5.3/fancybox/fancybox-x.png +0 -0
  26. data/coverage/assets/0.5.3/fancybox/fancybox-y.png +0 -0
  27. data/coverage/assets/0.5.3/fancybox/fancybox.png +0 -0
  28. data/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css +363 -0
  29. data/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  30. data/coverage/assets/0.5.3/favicon_green.png +0 -0
  31. data/coverage/assets/0.5.3/favicon_red.png +0 -0
  32. data/coverage/assets/0.5.3/favicon_yellow.png +0 -0
  33. data/coverage/assets/0.5.3/highlight.css +129 -0
  34. data/coverage/assets/0.5.3/highlight.pack.js +1 -0
  35. data/coverage/assets/0.5.3/jquery-1.6.2.min.js +18 -0
  36. data/coverage/assets/0.5.3/jquery.dataTables.min.js +152 -0
  37. data/coverage/assets/0.5.3/jquery.timeago.js +141 -0
  38. data/coverage/assets/0.5.3/jquery.url.js +174 -0
  39. data/coverage/assets/0.5.3/loading.gif +0 -0
  40. data/coverage/assets/0.5.3/magnify.png +0 -0
  41. data/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  42. data/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  43. data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  44. data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  45. data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  46. data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  47. data/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  48. data/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  49. data/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png +0 -0
  50. data/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  51. data/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png +0 -0
  52. data/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png +0 -0
  53. data/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  54. data/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  55. data/coverage/assets/0.5.3/stylesheet.css +383 -0
  56. data/coverage/index.html +875 -0
  57. data/credentials-template.yml +10 -0
  58. data/lib/snifter.rb +7 -0
  59. data/lib/snifter/app.rb +13 -0
  60. data/lib/snifter/cli.rb +45 -0
  61. data/lib/snifter/readable_time.rb +19 -0
  62. data/lib/snifter/sniffer.rb +25 -0
  63. data/lib/snifter/version.rb +4 -0
  64. data/test/unit/app_test.rb +25 -0
  65. data/test/unit/cli_test.rb +33 -0
  66. data/test/unit/readable_time_test.rb +61 -0
  67. data/test/unit/sniffer_test.rb +40 -0
  68. data/test/unit/test_helper.rb +8 -0
  69. metadata +195 -0
@@ -0,0 +1,383 @@
1
+ /* -----------------------------------------------------------------------
2
+
3
+
4
+ Blueprint CSS Framework 0.9
5
+ http://blueprintcss.org
6
+
7
+ * Copyright (c) 2007-Present. See LICENSE for more info.
8
+ * See README for instructions on how to use Blueprint.
9
+ * For credits and origins, see AUTHORS.
10
+ * This is a compressed file. See the sources in the 'src' directory.
11
+
12
+ ----------------------------------------------------------------------- */
13
+
14
+ /* reset.css */
15
+ html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
16
+ article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;}
17
+ body {line-height:1.5;}
18
+ table {border-collapse:separate;border-spacing:0;}
19
+ caption, th, td {text-align:left;font-weight:normal;}
20
+ table, td, th {vertical-align:middle;}
21
+ blockquote:before, blockquote:after, q:before, q:after {content:"";}
22
+ blockquote, q {quotes:"" "";}
23
+ a img {border:none;}
24
+
25
+ /* typography.css */
26
+ html {font-size:100.01%;}
27
+ body {font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
28
+ h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
29
+ h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
30
+ h2 {font-size:2em;margin-bottom:0.75em;}
31
+ h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
32
+ h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
33
+ h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
34
+ h6 {font-size:1em;font-weight:bold;}
35
+ h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
36
+ p {margin:0 0 1.5em;}
37
+ p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;}
38
+ p img.right {float:right;margin:1.5em 0 1.5em 1.5em;}
39
+ a:focus, a:hover {color:#000;}
40
+ a {color:#009;text-decoration:underline;}
41
+ blockquote {margin:1.5em;color:#666;font-style:italic;}
42
+ strong {font-weight:bold;}
43
+ em, dfn {font-style:italic;}
44
+ dfn {font-weight:bold;}
45
+ sup, sub {line-height:0;}
46
+ abbr, acronym {border-bottom:1px dotted #666;}
47
+ address {margin:0 0 1.5em;font-style:italic;}
48
+ del {color:#666;}
49
+ pre {margin:1.5em 0;white-space:pre;}
50
+ pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
51
+ li ul, li ol {margin:0;}
52
+ ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;}
53
+ ul {list-style-type:disc;}
54
+ ol {list-style-type:decimal;}
55
+ dl {margin:0 0 1.5em 0;}
56
+ dl dt {font-weight:bold;}
57
+ dd {margin-left:1.5em;}
58
+ table {margin-bottom:1.4em;width:100%;}
59
+ th {font-weight:bold;}
60
+ thead th {background:#c3d9ff;}
61
+ th, td, caption {padding:4px 10px 4px 5px;}
62
+ tr.even td {background:#efefef;}
63
+ tfoot {font-style:italic;}
64
+ caption {background:#eee;}
65
+ .small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
66
+ .large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
67
+ .hide {display:none;}
68
+ .quiet {color:#666;}
69
+ .loud {color:#000;}
70
+ .highlight {background:#ff0;}
71
+ .added {background:#060;color:#fff;}
72
+ .removed {background:#900;color:#fff;}
73
+ .first {margin-left:0;padding-left:0;}
74
+ .last {margin-right:0;padding-right:0;}
75
+ .top {margin-top:0;padding-top:0;}
76
+ .bottom {margin-bottom:0;padding-bottom:0;}
77
+
78
+ /* forms.css */
79
+ label {font-weight:bold;}
80
+ fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
81
+ legend {font-weight:bold;font-size:1.2em;}
82
+ input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;}
83
+ input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;}
84
+ input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;}
85
+ input.text, input.title {width:300px;padding:5px;}
86
+ input.title {font-size:1.5em;}
87
+ textarea {width:390px;height:250px;padding:5px;}
88
+ input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;}
89
+ form.inline {line-height:3;}
90
+ form.inline p {margin-bottom:0;}
91
+ .error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
92
+ .error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
93
+ .notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
94
+ .success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
95
+ .error a {color:#8a1f11;}
96
+ .notice a {color:#514721;}
97
+ .success a {color:#264409;}
98
+ .box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;}
99
+ hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
100
+ hr.space {background:#fff;color:#fff;visibility:hidden;}
101
+ .clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
102
+ .clearfix, .container {display:block;}
103
+ .clear {clear:both;}
104
+
105
+ #loading {
106
+ position: fixed;
107
+ left: 40%;
108
+ top: 50%;
109
+ }
110
+
111
+ a {
112
+ color: #333;
113
+ text-decoration: none;
114
+ }
115
+
116
+ a:hover {
117
+ color: #000;
118
+ text-decoration: underline;
119
+ }
120
+
121
+ body {
122
+ font-family: "Lucida Grande", Helvetica, "Helvetica Neue", Arial, sans-serif;
123
+ padding: 12px;
124
+ background-color: #333;
125
+ }
126
+
127
+ h1, h2, h3, h4 {
128
+ color: #1C2324;
129
+ margin: 0;
130
+ padding: 0;
131
+ margin-bottom: 12px;
132
+ }
133
+
134
+ table {
135
+ width: 100%;
136
+ }
137
+
138
+ #content {
139
+ clear: left;
140
+ background-color: white;
141
+ border: 2px solid #ddd;
142
+ border-top: 8px solid #ddd;
143
+ padding: 18px;
144
+ -webkit-border-bottom-left-radius: 5px;
145
+ -webkit-border-bottom-right-radius: 5px;
146
+ -webkit-border-top-right-radius: 5px;
147
+ -moz-border-radius-bottomleft: 5px;
148
+ -moz-border-radius-bottomright: 5px;
149
+ -moz-border-radius-topright: 5px;
150
+ border-bottom-left-radius: 5px;
151
+ border-bottom-right-radius: 5px;
152
+ border-top-right-radius: 5px;
153
+ }
154
+
155
+ .dataTables_filter, .dataTables_info {
156
+ padding: 2px 6px;
157
+ }
158
+
159
+ abbr.timeago {
160
+ text-decoration: none;
161
+ border: none;
162
+ font-weight: bold;
163
+ }
164
+
165
+ .timestamp {
166
+ float: right;
167
+ color: #ddd;
168
+ }
169
+
170
+ .group_tabs {
171
+ list-style: none;
172
+ float: left;
173
+ margin: 0;
174
+ padding: 0;
175
+ }
176
+ .group_tabs li {
177
+ display: inline;
178
+ float: left;
179
+ }
180
+
181
+ .group_tabs li a {
182
+ font-family: Helvetica, Arial, sans-serif;
183
+ display: block;
184
+ float: left;
185
+ text-decoration: none;
186
+ padding: 4px 8px;
187
+ background-color: #aaa;
188
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#DDD), to(#aaa));
189
+ background: -moz-linear-gradient(#DDD, #aaa);
190
+ background: linear-gradient(#DDD, #aaa);
191
+ text-shadow: #e5e5e5 1px 1px 0px;
192
+ border-bottom: none;
193
+ color: #333;
194
+ font-weight: bold;
195
+ margin-right: 8px;
196
+ border-top: 1px solid #efefef;
197
+ -webkit-border-top-left-radius: 2px;
198
+ -webkit-border-top-right-radius: 2px;
199
+ -moz-border-radius-topleft: 2px;
200
+ -moz-border-radius-topright: 2px;
201
+ border-top-left-radius: 2px;
202
+ border-top-right-radius: 2px;
203
+ }
204
+
205
+ .group_tabs li a:hover {
206
+ background-color: #ccc;
207
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#eee), to(#aaa));
208
+ background: -moz-linear-gradient(#eee, #aaa);
209
+ background: linear-gradient(#eee, #aaa);
210
+ }
211
+
212
+ .group_tabs li a:active {
213
+ padding-top: 5px;
214
+ padding-bottom: 3px;
215
+ }
216
+
217
+ .group_tabs li.active a {
218
+ color: black;
219
+ text-shadow: #fff 1px 1px 0px;
220
+ background-color: #ddd;
221
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#fff), to(#ddd));
222
+ background: -moz-linear-gradient(#fff, #ddd);
223
+ background: linear-gradient(#fff, #ddd);
224
+ }
225
+
226
+ .file_list {
227
+ margin-bottom: 18px;
228
+ }
229
+
230
+ a.src_link {
231
+ background: url('./magnify.png') no-repeat left 50%;
232
+ padding-left: 18px;
233
+ }
234
+
235
+ tr, td {
236
+ margin: 0;
237
+ padding: 0;
238
+ }
239
+
240
+ th {
241
+ white-space: nowrap;
242
+ }
243
+
244
+ th.ui-state-default {
245
+ cursor: pointer;
246
+ }
247
+
248
+ th span.ui-icon {
249
+ float: left;
250
+ }
251
+
252
+ td {
253
+ padding: 4px 8px;
254
+ }
255
+
256
+ td.strong {
257
+ font-weight: bold;
258
+ }
259
+
260
+ .source_table h3, .source_table h4 {
261
+ padding: 0;
262
+ margin: 0;
263
+ margin-bottom: 4px;
264
+ }
265
+
266
+ .source_table .header {
267
+ padding: 10px;
268
+ }
269
+
270
+ .source_table pre {
271
+ margin: 0;
272
+ padding: 0;
273
+ white-space: normal;
274
+ }
275
+
276
+ .source_table pre, .source_table code {
277
+ color: #000;
278
+ font-family: "Monaco", "Inconsolata", "Consolas", monospace;
279
+ }
280
+
281
+ .source_table pre {
282
+ background-color: #333;
283
+ }
284
+
285
+ .source_table pre ol {
286
+ margin: 0px;
287
+ padding: 0px;
288
+ margin-left: 45px;
289
+ font-size: 12px;
290
+ color: white;
291
+ }
292
+
293
+ .source_table pre li {
294
+ margin: 0px;
295
+ padding: 2px 6px;
296
+ border-left: 5px solid white;
297
+ }
298
+
299
+ .source_table pre li code {
300
+ white-space: pre;
301
+ white-space: pre-wrap;
302
+ }
303
+
304
+ .source_table pre .hits {
305
+ float: right;
306
+ margin-left: 10px;
307
+ padding: 2px 4px;
308
+
309
+ background-color: #444;
310
+ background: -webkit-gradient(linear, 0 0, 0 bottom, from(#222), to(#666));
311
+ background: -moz-linear-gradient(#222, #666);
312
+ background: linear-gradient(#222, #666);
313
+
314
+ color: white;
315
+ font-family: Helvetica, "Helvetica Neue", Arial, sans-serif;
316
+ font-size: 10px;
317
+ font-weight: bold;
318
+ text-align: center;
319
+ border-radius: 6px;
320
+ }
321
+
322
+ #footer {
323
+ color: #ddd;
324
+ font-size: 12px;
325
+ font-weight: bold;
326
+ margin-top: 12px;
327
+ text-align: right;
328
+ }
329
+ #footer a {
330
+ color: #eee;
331
+ text-decoration: underline;
332
+ }
333
+ #footer a:hover {
334
+ color: #fff;
335
+ text-decoration: none;
336
+ }
337
+
338
+ .green {
339
+ color: #090;
340
+ }
341
+ .red {
342
+ color: #900;
343
+ }
344
+ .yellow {
345
+ color: #da0;
346
+ }
347
+ .source_table .covered {
348
+ border-color: #090;
349
+ }
350
+ .source_table .missed {
351
+ border-color: #900;
352
+ }
353
+ .source_table .never {
354
+ border-color: black;
355
+ }
356
+ .source_table .skipped {
357
+ border-color: #fc0;
358
+ }
359
+
360
+ .source_table .covered:nth-child(odd) {
361
+ background-color: #CDF2CD;
362
+ }
363
+ .source_table .covered:nth-child(even) {
364
+ background-color: #DBF2DB;
365
+ }
366
+ .source_table .missed:nth-child(odd) {
367
+ background-color: #F7C0C0;
368
+ }
369
+ .source_table .missed:nth-child(even) {
370
+ background-color: #F7CFCF;
371
+ }
372
+ .source_table .never:nth-child(odd) {
373
+ background-color: #efefef;
374
+ }
375
+ .source_table .never:nth-child(even) {
376
+ background-color: #f4f4f4;
377
+ }
378
+ .source_table .skipped:nth-child(odd) {
379
+ background-color: #FBF0C0;
380
+ }
381
+ .source_table .skipped:nth-child(even) {
382
+ background-color: #FBFfCf;
383
+ }
@@ -0,0 +1,875 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>Code coverage for Snifter</title>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <script src='./assets/0.5.3/jquery-1.6.2.min.js' type='text/javascript'></script>
7
+ <script src='./assets/0.5.3/jquery.dataTables.min.js' type='text/javascript'></script>
8
+ <script src='./assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js' type='text/javascript'></script>
9
+ <script src='./assets/0.5.3/jquery.timeago.js' type='text/javascript'></script>
10
+ <script src='./assets/0.5.3/jquery.url.js' type='text/javascript'></script>
11
+ <script src='./assets/0.5.3/highlight.pack.js' type='text/javascript'></script>
12
+ <script src='./assets/0.5.3/app.js' type='text/javascript'></script>
13
+ <link href='./assets/0.5.3/stylesheet.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
14
+ <link href='./assets/0.5.3/highlight.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
15
+ <link href='./assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
16
+ <link href='./assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
17
+ <link rel="shortcut icon" type="image/png" href="./assets/0.5.3/favicon_green.png" />
18
+ <link rel="icon" type="image/png" href="./assets/0.5.3/favicon.png" />
19
+ </head>
20
+
21
+ <body>
22
+ <div id="loading">
23
+ <img src="./assets/0.5.3/loading.gif" alt="loading"/>
24
+ </div>
25
+ <div id="wrapper" style="display:none;">
26
+ <div class="timestamp">Generated <abbr class="timeago" title="2012-10-10T14:12:27+01:00">2012-10-10T14:12:27+01:00</abbr></div>
27
+ <ul class="group_tabs"></ul>
28
+
29
+ <div id="content">
30
+ <div class="file_list_container" id="AllFiles">
31
+ <h2>
32
+ <span class="group_name">All Files</span>
33
+ (<span class="covered_percent"><span class="green">100.0%</span></span>
34
+ covered at
35
+ <span class="covered_strength">
36
+ <span class="green">
37
+ 1.8
38
+ </span>
39
+ </span> hits/line)
40
+ </h2>
41
+ <a name="AllFiles"></a>
42
+ <div>
43
+ <b>5</b> files in total.
44
+ <b>65</b> relevant lines.
45
+ <span class="green"><b>65</b> lines covered</span> and
46
+ <span class="red"><b>0</b> lines missed </span>
47
+ </div>
48
+ <table class="file_list">
49
+ <thead>
50
+ <tr>
51
+ <th>File</th>
52
+ <th>% covered</th>
53
+ <th>Lines</th>
54
+ <th>Relevant Lines</th>
55
+ <th>Lines covered</th>
56
+ <th>Lines missed</th>
57
+ <th>Avg. Hits / Line</th>
58
+ </tr>
59
+ </thead>
60
+ <tbody>
61
+
62
+ <tr>
63
+ <td class="strong"><a href="#7d678d92babcfed0cc5fb8c66ae1de62b87a7a5e" class="src_link" title="lib/snifter.rb">lib/snifter.rb</a></td>
64
+ <td class="green strong">100.0 %</td>
65
+ <td>7</td>
66
+ <td>6</td>
67
+ <td>6</td>
68
+ <td>0</td>
69
+ <td>1.0</td>
70
+ </tr>
71
+
72
+ <tr>
73
+ <td class="strong"><a href="#853bf3e7153f0a87a2ac794b1873e1d5897af91f" class="src_link" title="lib/snifter/app.rb">lib/snifter/app.rb</a></td>
74
+ <td class="green strong">100.0 %</td>
75
+ <td>13</td>
76
+ <td>7</td>
77
+ <td>7</td>
78
+ <td>0</td>
79
+ <td>1.0</td>
80
+ </tr>
81
+
82
+ <tr>
83
+ <td class="strong"><a href="#808c96b8a0680c093ea778f7bada072f7898b223" class="src_link" title="lib/snifter/cli.rb">lib/snifter/cli.rb</a></td>
84
+ <td class="green strong">100.0 %</td>
85
+ <td>45</td>
86
+ <td>23</td>
87
+ <td>23</td>
88
+ <td>0</td>
89
+ <td>1.0</td>
90
+ </tr>
91
+
92
+ <tr>
93
+ <td class="strong"><a href="#94a6db308637ccd6f6a296fe775cebc5c85ca59f" class="src_link" title="lib/snifter/readable_time.rb">lib/snifter/readable_time.rb</a></td>
94
+ <td class="green strong">100.0 %</td>
95
+ <td>19</td>
96
+ <td>15</td>
97
+ <td>15</td>
98
+ <td>0</td>
99
+ <td>4.1</td>
100
+ </tr>
101
+
102
+ <tr>
103
+ <td class="strong"><a href="#771f3401c00ac158cc5f71878f74aaed44f4fa91" class="src_link" title="lib/snifter/sniffer.rb">lib/snifter/sniffer.rb</a></td>
104
+ <td class="green strong">100.0 %</td>
105
+ <td>25</td>
106
+ <td>14</td>
107
+ <td>14</td>
108
+ <td>0</td>
109
+ <td>1.9</td>
110
+ </tr>
111
+
112
+ </tbody>
113
+ </table>
114
+ </div>
115
+
116
+
117
+
118
+ </div>
119
+
120
+ <div id="footer">
121
+ Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.6.4
122
+ and simplecov-html v0.5.3<br/>
123
+ using Unit Tests
124
+ </div>
125
+
126
+ <div class="source_files">
127
+
128
+ <div class="source_table" id="7d678d92babcfed0cc5fb8c66ae1de62b87a7a5e">
129
+ <div class="header">
130
+ <h3>lib/snifter.rb</h3>
131
+ <h4><span class="green">100.0 %</span> covered</h4>
132
+ <div>
133
+ <b>6</b> relevant lines.
134
+ <span class="green"><b>6</b> lines covered</span> and
135
+ <span class="red"><b>0</b> lines missed.</span>
136
+ </div>
137
+ </div>
138
+
139
+ <pre>
140
+ <ol>
141
+
142
+ <li class="covered" data-hits="1" data-linenumber="1">
143
+ <span class="hits">1</span>
144
+
145
+ <code class="ruby">require 'twitter'</code>
146
+ </li>
147
+
148
+ <li class="never" data-hits="" data-linenumber="2">
149
+
150
+
151
+ <code class="ruby"></code>
152
+ </li>
153
+
154
+ <li class="covered" data-hits="1" data-linenumber="3">
155
+ <span class="hits">1</span>
156
+
157
+ <code class="ruby">require 'snifter/app'</code>
158
+ </li>
159
+
160
+ <li class="covered" data-hits="1" data-linenumber="4">
161
+ <span class="hits">1</span>
162
+
163
+ <code class="ruby">require 'snifter/cli'</code>
164
+ </li>
165
+
166
+ <li class="covered" data-hits="1" data-linenumber="5">
167
+ <span class="hits">1</span>
168
+
169
+ <code class="ruby">require 'snifter/readable_time'</code>
170
+ </li>
171
+
172
+ <li class="covered" data-hits="1" data-linenumber="6">
173
+ <span class="hits">1</span>
174
+
175
+ <code class="ruby">require 'snifter/sniffer'</code>
176
+ </li>
177
+
178
+ <li class="covered" data-hits="1" data-linenumber="7">
179
+ <span class="hits">1</span>
180
+
181
+ <code class="ruby">require 'snifter/version'</code>
182
+ </li>
183
+
184
+ </ol>
185
+ </pre>
186
+ </div>
187
+
188
+ <div class="source_table" id="853bf3e7153f0a87a2ac794b1873e1d5897af91f">
189
+ <div class="header">
190
+ <h3>lib/snifter/app.rb</h3>
191
+ <h4><span class="green">100.0 %</span> covered</h4>
192
+ <div>
193
+ <b>7</b> relevant lines.
194
+ <span class="green"><b>7</b> lines covered</span> and
195
+ <span class="red"><b>0</b> lines missed.</span>
196
+ </div>
197
+ </div>
198
+
199
+ <pre>
200
+ <ol>
201
+
202
+ <li class="covered" data-hits="1" data-linenumber="1">
203
+ <span class="hits">1</span>
204
+
205
+ <code class="ruby">module Snifter</code>
206
+ </li>
207
+
208
+ <li class="covered" data-hits="1" data-linenumber="2">
209
+ <span class="hits">1</span>
210
+
211
+ <code class="ruby"> def self.store_consumer(credentials, service=Twitter)</code>
212
+ </li>
213
+
214
+ <li class="covered" data-hits="1" data-linenumber="3">
215
+ <span class="hits">1</span>
216
+
217
+ <code class="ruby"> service.configure do |config|</code>
218
+ </li>
219
+
220
+ <li class="covered" data-hits="1" data-linenumber="4">
221
+ <span class="hits">1</span>
222
+
223
+ <code class="ruby"> config.consumer_key = credentials['consumer_key']</code>
224
+ </li>
225
+
226
+ <li class="covered" data-hits="1" data-linenumber="5">
227
+ <span class="hits">1</span>
228
+
229
+ <code class="ruby"> config.consumer_secret = credentials['consumer_secret']</code>
230
+ </li>
231
+
232
+ <li class="never" data-hits="" data-linenumber="6">
233
+
234
+
235
+ <code class="ruby"> end</code>
236
+ </li>
237
+
238
+ <li class="never" data-hits="" data-linenumber="7">
239
+
240
+
241
+ <code class="ruby"> end</code>
242
+ </li>
243
+
244
+ <li class="never" data-hits="" data-linenumber="8">
245
+
246
+
247
+ <code class="ruby"></code>
248
+ </li>
249
+
250
+ <li class="covered" data-hits="1" data-linenumber="9">
251
+ <span class="hits">1</span>
252
+
253
+ <code class="ruby"> def self.make_client(credentials)</code>
254
+ </li>
255
+
256
+ <li class="covered" data-hits="1" data-linenumber="10">
257
+ <span class="hits">1</span>
258
+
259
+ <code class="ruby"> Twitter::Client.new(:oauth_token =&gt; credentials['access_token'],</code>
260
+ </li>
261
+
262
+ <li class="never" data-hits="" data-linenumber="11">
263
+
264
+
265
+ <code class="ruby"> :oauth_token_secret =&gt; credentials['access_token_secret'])</code>
266
+ </li>
267
+
268
+ <li class="never" data-hits="" data-linenumber="12">
269
+
270
+
271
+ <code class="ruby"> end</code>
272
+ </li>
273
+
274
+ <li class="never" data-hits="" data-linenumber="13">
275
+
276
+
277
+ <code class="ruby">end</code>
278
+ </li>
279
+
280
+ </ol>
281
+ </pre>
282
+ </div>
283
+
284
+ <div class="source_table" id="808c96b8a0680c093ea778f7bada072f7898b223">
285
+ <div class="header">
286
+ <h3>lib/snifter/cli.rb</h3>
287
+ <h4><span class="green">100.0 %</span> covered</h4>
288
+ <div>
289
+ <b>23</b> relevant lines.
290
+ <span class="green"><b>23</b> lines covered</span> and
291
+ <span class="red"><b>0</b> lines missed.</span>
292
+ </div>
293
+ </div>
294
+
295
+ <pre>
296
+ <ol>
297
+
298
+ <li class="covered" data-hits="1" data-linenumber="1">
299
+ <span class="hits">1</span>
300
+
301
+ <code class="ruby">module Snifter</code>
302
+ </li>
303
+
304
+ <li class="covered" data-hits="1" data-linenumber="2">
305
+ <span class="hits">1</span>
306
+
307
+ <code class="ruby"> class CLI</code>
308
+ </li>
309
+
310
+ <li class="covered" data-hits="1" data-linenumber="3">
311
+ <span class="hits">1</span>
312
+
313
+ <code class="ruby"> def echo tweets</code>
314
+ </li>
315
+
316
+ <li class="covered" data-hits="1" data-linenumber="4">
317
+ <span class="hits">1</span>
318
+
319
+ <code class="ruby"> problem_rgx = /(unwatchable|slow|poor|(problem|error|issue)(s)?|fail(ed|ing|s)?|buffer(ing|ed)?|fuck(e(d|r)|ing|s)?)/i</code>
320
+ </li>
321
+
322
+ <li class="never" data-hits="" data-linenumber="5">
323
+
324
+
325
+ <code class="ruby"></code>
326
+ </li>
327
+
328
+ <li class="covered" data-hits="1" data-linenumber="6">
329
+ <span class="hits">1</span>
330
+
331
+ <code class="ruby"> tweets.reverse!</code>
332
+ </li>
333
+
334
+ <li class="covered" data-hits="1" data-linenumber="7">
335
+ <span class="hits">1</span>
336
+
337
+ <code class="ruby"> tweets.each { |t|</code>
338
+ </li>
339
+
340
+ <li class="covered" data-hits="1" data-linenumber="8">
341
+ <span class="hits">1</span>
342
+
343
+ <code class="ruby"> text = t.text.gsub(/\n/, ' ')</code>
344
+ </li>
345
+
346
+ <li class="covered" data-hits="1" data-linenumber="9">
347
+ <span class="hits">1</span>
348
+
349
+ <code class="ruby"> highlight text, problem_rgx</code>
350
+ </li>
351
+
352
+ <li class="never" data-hits="" data-linenumber="10">
353
+
354
+
355
+ <code class="ruby"></code>
356
+ </li>
357
+
358
+ <li class="covered" data-hits="1" data-linenumber="11">
359
+ <span class="hits">1</span>
360
+
361
+ <code class="ruby"> user = sprintf &quot;%-17s&quot;, t.from_user</code>
362
+ </li>
363
+
364
+ <li class="covered" data-hits="1" data-linenumber="12">
365
+ <span class="hits">1</span>
366
+
367
+ <code class="ruby"> time = sprintf &quot;%-12s&quot;, ReadableTime.relative(t.created_at)</code>
368
+ </li>
369
+
370
+ <li class="covered" data-hits="1" data-linenumber="13">
371
+ <span class="hits">1</span>
372
+
373
+ <code class="ruby"> rtweet = sprintf &quot;%-3s&quot;, t.retweet_count</code>
374
+ </li>
375
+
376
+ <li class="never" data-hits="" data-linenumber="14">
377
+
378
+
379
+ <code class="ruby"></code>
380
+ </li>
381
+
382
+ <li class="covered" data-hits="1" data-linenumber="15">
383
+ <span class="hits">1</span>
384
+
385
+ <code class="ruby"> puts &quot;#{yellow user} #{white time} #{green rtweet} #{cyan text}\n&quot;</code>
386
+ </li>
387
+
388
+ <li class="never" data-hits="" data-linenumber="16">
389
+
390
+
391
+ <code class="ruby"> }</code>
392
+ </li>
393
+
394
+ <li class="never" data-hits="" data-linenumber="17">
395
+
396
+
397
+ <code class="ruby"> end</code>
398
+ </li>
399
+
400
+ <li class="never" data-hits="" data-linenumber="18">
401
+
402
+
403
+ <code class="ruby"></code>
404
+ </li>
405
+
406
+ <li class="covered" data-hits="1" data-linenumber="19">
407
+ <span class="hits">1</span>
408
+
409
+ <code class="ruby"> private</code>
410
+ </li>
411
+
412
+ <li class="never" data-hits="" data-linenumber="20">
413
+
414
+
415
+ <code class="ruby"></code>
416
+ </li>
417
+
418
+ <li class="covered" data-hits="1" data-linenumber="21">
419
+ <span class="hits">1</span>
420
+
421
+ <code class="ruby"> def highlight str, rgx</code>
422
+ </li>
423
+
424
+ <li class="covered" data-hits="1" data-linenumber="22">
425
+ <span class="hits">1</span>
426
+
427
+ <code class="ruby"> str.gsub!(rgx) {|s| &quot;\033[33m#{s}\033[36m&quot; }</code>
428
+ </li>
429
+
430
+ <li class="never" data-hits="" data-linenumber="23">
431
+
432
+
433
+ <code class="ruby"> end</code>
434
+ </li>
435
+
436
+ <li class="never" data-hits="" data-linenumber="24">
437
+
438
+
439
+ <code class="ruby"></code>
440
+ </li>
441
+
442
+ <li class="never" data-hits="" data-linenumber="25">
443
+
444
+
445
+ <code class="ruby"> #red 31</code>
446
+ </li>
447
+
448
+ <li class="never" data-hits="" data-linenumber="26">
449
+
450
+
451
+ <code class="ruby"> #blue 34</code>
452
+ </li>
453
+
454
+ <li class="never" data-hits="" data-linenumber="27">
455
+
456
+
457
+ <code class="ruby"> #magenta 35</code>
458
+ </li>
459
+
460
+ <li class="never" data-hits="" data-linenumber="28">
461
+
462
+
463
+ <code class="ruby"></code>
464
+ </li>
465
+
466
+ <li class="covered" data-hits="1" data-linenumber="29">
467
+ <span class="hits">1</span>
468
+
469
+ <code class="ruby"> def green txt</code>
470
+ </li>
471
+
472
+ <li class="covered" data-hits="1" data-linenumber="30">
473
+ <span class="hits">1</span>
474
+
475
+ <code class="ruby"> &quot;\033[32m#{txt}\033[0m&quot;</code>
476
+ </li>
477
+
478
+ <li class="never" data-hits="" data-linenumber="31">
479
+
480
+
481
+ <code class="ruby"> end</code>
482
+ </li>
483
+
484
+ <li class="never" data-hits="" data-linenumber="32">
485
+
486
+
487
+ <code class="ruby"></code>
488
+ </li>
489
+
490
+ <li class="covered" data-hits="1" data-linenumber="33">
491
+ <span class="hits">1</span>
492
+
493
+ <code class="ruby"> def yellow txt</code>
494
+ </li>
495
+
496
+ <li class="covered" data-hits="1" data-linenumber="34">
497
+ <span class="hits">1</span>
498
+
499
+ <code class="ruby"> &quot;\033[33m#{txt}\033[0m&quot;</code>
500
+ </li>
501
+
502
+ <li class="never" data-hits="" data-linenumber="35">
503
+
504
+
505
+ <code class="ruby"> end</code>
506
+ </li>
507
+
508
+ <li class="never" data-hits="" data-linenumber="36">
509
+
510
+
511
+ <code class="ruby"></code>
512
+ </li>
513
+
514
+ <li class="covered" data-hits="1" data-linenumber="37">
515
+ <span class="hits">1</span>
516
+
517
+ <code class="ruby"> def cyan txt</code>
518
+ </li>
519
+
520
+ <li class="covered" data-hits="1" data-linenumber="38">
521
+ <span class="hits">1</span>
522
+
523
+ <code class="ruby"> &quot;\033[36m#{txt}\033[0m&quot;</code>
524
+ </li>
525
+
526
+ <li class="never" data-hits="" data-linenumber="39">
527
+
528
+
529
+ <code class="ruby"> end</code>
530
+ </li>
531
+
532
+ <li class="never" data-hits="" data-linenumber="40">
533
+
534
+
535
+ <code class="ruby"></code>
536
+ </li>
537
+
538
+ <li class="covered" data-hits="1" data-linenumber="41">
539
+ <span class="hits">1</span>
540
+
541
+ <code class="ruby"> def white txt</code>
542
+ </li>
543
+
544
+ <li class="covered" data-hits="1" data-linenumber="42">
545
+ <span class="hits">1</span>
546
+
547
+ <code class="ruby"> &quot;\033[37m#{txt}\033[0m&quot;</code>
548
+ </li>
549
+
550
+ <li class="never" data-hits="" data-linenumber="43">
551
+
552
+
553
+ <code class="ruby"> end</code>
554
+ </li>
555
+
556
+ <li class="never" data-hits="" data-linenumber="44">
557
+
558
+
559
+ <code class="ruby"> end</code>
560
+ </li>
561
+
562
+ <li class="never" data-hits="" data-linenumber="45">
563
+
564
+
565
+ <code class="ruby">end</code>
566
+ </li>
567
+
568
+ </ol>
569
+ </pre>
570
+ </div>
571
+
572
+ <div class="source_table" id="94a6db308637ccd6f6a296fe775cebc5c85ca59f">
573
+ <div class="header">
574
+ <h3>lib/snifter/readable_time.rb</h3>
575
+ <h4><span class="green">100.0 %</span> covered</h4>
576
+ <div>
577
+ <b>15</b> relevant lines.
578
+ <span class="green"><b>15</b> lines covered</span> and
579
+ <span class="red"><b>0</b> lines missed.</span>
580
+ </div>
581
+ </div>
582
+
583
+ <pre>
584
+ <ol>
585
+
586
+ <li class="covered" data-hits="1" data-linenumber="1">
587
+ <span class="hits">1</span>
588
+
589
+ <code class="ruby">module ReadableTime</code>
590
+ </li>
591
+
592
+ <li class="covered" data-hits="1" data-linenumber="2">
593
+ <span class="hits">1</span>
594
+
595
+ <code class="ruby"> def self.relative to</code>
596
+ </li>
597
+
598
+ <li class="covered" data-hits="20" data-linenumber="3">
599
+ <span class="hits">20</span>
600
+
601
+ <code class="ruby"> a = (Time.now-to).to_i</code>
602
+ </li>
603
+
604
+ <li class="never" data-hits="" data-linenumber="4">
605
+
606
+
607
+ <code class="ruby"></code>
608
+ </li>
609
+
610
+ <li class="covered" data-hits="20" data-linenumber="5">
611
+ <span class="hits">20</span>
612
+
613
+ <code class="ruby"> case a</code>
614
+ </li>
615
+
616
+ <li class="covered" data-hits="2" data-linenumber="6">
617
+ <span class="hits">2</span>
618
+
619
+ <code class="ruby"> when 0 then 'Just now'</code>
620
+ </li>
621
+
622
+ <li class="covered" data-hits="1" data-linenumber="7">
623
+ <span class="hits">1</span>
624
+
625
+ <code class="ruby"> when 1 then 'A sec ago'</code>
626
+ </li>
627
+
628
+ <li class="covered" data-hits="2" data-linenumber="8">
629
+ <span class="hits">2</span>
630
+
631
+ <code class="ruby"> when 2..59 then a.to_s+' secs ago'</code>
632
+ </li>
633
+
634
+ <li class="covered" data-hits="2" data-linenumber="9">
635
+ <span class="hits">2</span>
636
+
637
+ <code class="ruby"> when 60..119 then 'A min ago' #120 = 2 minutes</code>
638
+ </li>
639
+
640
+ <li class="covered" data-hits="2" data-linenumber="10">
641
+ <span class="hits">2</span>
642
+
643
+ <code class="ruby"> when 120..3540 then (a/60).to_i.to_s+' mins ago'</code>
644
+ </li>
645
+
646
+ <li class="covered" data-hits="2" data-linenumber="11">
647
+ <span class="hits">2</span>
648
+
649
+ <code class="ruby"> when 3541..7100 then 'An hour ago' # 3600 = 1 hour</code>
650
+ </li>
651
+
652
+ <li class="covered" data-hits="2" data-linenumber="12">
653
+ <span class="hits">2</span>
654
+
655
+ <code class="ruby"> when 7101..82800 then ((a+99)/3600).to_i.to_s+' hours ago'</code>
656
+ </li>
657
+
658
+ <li class="covered" data-hits="2" data-linenumber="13">
659
+ <span class="hits">2</span>
660
+
661
+ <code class="ruby"> when 82801..172000 then 'A day ago' # 86400 = 1 day</code>
662
+ </li>
663
+
664
+ <li class="covered" data-hits="2" data-linenumber="14">
665
+ <span class="hits">2</span>
666
+
667
+ <code class="ruby"> when 172001..518400 then ((a+800)/(60*60*24)).to_i.to_s+' days ago'</code>
668
+ </li>
669
+
670
+ <li class="covered" data-hits="2" data-linenumber="15">
671
+ <span class="hits">2</span>
672
+
673
+ <code class="ruby"> when 518400..1036800 then 'A week ago'</code>
674
+ </li>
675
+
676
+ <li class="covered" data-hits="1" data-linenumber="16">
677
+ <span class="hits">1</span>
678
+
679
+ <code class="ruby"> else ((a+180000)/(60*60*24*7)).to_i.to_s+' weeks ago'</code>
680
+ </li>
681
+
682
+ <li class="never" data-hits="" data-linenumber="17">
683
+
684
+
685
+ <code class="ruby"> end</code>
686
+ </li>
687
+
688
+ <li class="never" data-hits="" data-linenumber="18">
689
+
690
+
691
+ <code class="ruby"> end</code>
692
+ </li>
693
+
694
+ <li class="never" data-hits="" data-linenumber="19">
695
+
696
+
697
+ <code class="ruby">end</code>
698
+ </li>
699
+
700
+ </ol>
701
+ </pre>
702
+ </div>
703
+
704
+ <div class="source_table" id="771f3401c00ac158cc5f71878f74aaed44f4fa91">
705
+ <div class="header">
706
+ <h3>lib/snifter/sniffer.rb</h3>
707
+ <h4><span class="green">100.0 %</span> covered</h4>
708
+ <div>
709
+ <b>14</b> relevant lines.
710
+ <span class="green"><b>14</b> lines covered</span> and
711
+ <span class="red"><b>0</b> lines missed.</span>
712
+ </div>
713
+ </div>
714
+
715
+ <pre>
716
+ <ol>
717
+
718
+ <li class="covered" data-hits="1" data-linenumber="1">
719
+ <span class="hits">1</span>
720
+
721
+ <code class="ruby">module Snifter</code>
722
+ </li>
723
+
724
+ <li class="covered" data-hits="1" data-linenumber="2">
725
+ <span class="hits">1</span>
726
+
727
+ <code class="ruby"> class Sniffer</code>
728
+ </li>
729
+
730
+ <li class="covered" data-hits="1" data-linenumber="3">
731
+ <span class="hits">1</span>
732
+
733
+ <code class="ruby"> attr_reader :topic, :topic_fails</code>
734
+ </li>
735
+
736
+ <li class="never" data-hits="" data-linenumber="4">
737
+
738
+
739
+ <code class="ruby"></code>
740
+ </li>
741
+
742
+ <li class="covered" data-hits="1" data-linenumber="5">
743
+ <span class="hits">1</span>
744
+
745
+ <code class="ruby"> def initialize(client, topic)</code>
746
+ </li>
747
+
748
+ <li class="covered" data-hits="5" data-linenumber="6">
749
+ <span class="hits">5</span>
750
+
751
+ <code class="ruby"> @client = client</code>
752
+ </li>
753
+
754
+ <li class="never" data-hits="" data-linenumber="7">
755
+
756
+
757
+ <code class="ruby"></code>
758
+ </li>
759
+
760
+ <li class="covered" data-hits="5" data-linenumber="8">
761
+ <span class="hits">5</span>
762
+
763
+ <code class="ruby"> @topic = topic</code>
764
+ </li>
765
+
766
+ <li class="covered" data-hits="5" data-linenumber="9">
767
+ <span class="hits">5</span>
768
+
769
+ <code class="ruby"> @topic_fails = '### fail OR problem OR issue OR error OR slow OR buffer -&quot;no problem&quot;'.sub('###', topic)</code>
770
+ </li>
771
+
772
+ <li class="never" data-hits="" data-linenumber="10">
773
+
774
+
775
+ <code class="ruby"> end</code>
776
+ </li>
777
+
778
+ <li class="never" data-hits="" data-linenumber="11">
779
+
780
+
781
+ <code class="ruby"></code>
782
+ </li>
783
+
784
+ <li class="covered" data-hits="1" data-linenumber="12">
785
+ <span class="hits">1</span>
786
+
787
+ <code class="ruby"> def mentions</code>
788
+ </li>
789
+
790
+ <li class="covered" data-hits="1" data-linenumber="13">
791
+ <span class="hits">1</span>
792
+
793
+ <code class="ruby"> @client.search(@topic, :count =&gt; 100).results</code>
794
+ </li>
795
+
796
+ <li class="never" data-hits="" data-linenumber="14">
797
+
798
+
799
+ <code class="ruby"> end</code>
800
+ </li>
801
+
802
+ <li class="never" data-hits="" data-linenumber="15">
803
+
804
+
805
+ <code class="ruby"></code>
806
+ </li>
807
+
808
+ <li class="covered" data-hits="1" data-linenumber="16">
809
+ <span class="hits">1</span>
810
+
811
+ <code class="ruby"> def fails</code>
812
+ </li>
813
+
814
+ <li class="covered" data-hits="2" data-linenumber="17">
815
+ <span class="hits">2</span>
816
+
817
+ <code class="ruby"> @client.search(@topic_fails, :count =&gt; 100).results</code>
818
+ </li>
819
+
820
+ <li class="never" data-hits="" data-linenumber="18">
821
+
822
+
823
+ <code class="ruby"> end</code>
824
+ </li>
825
+
826
+ <li class="never" data-hits="" data-linenumber="19">
827
+
828
+
829
+ <code class="ruby"></code>
830
+ </li>
831
+
832
+ <li class="covered" data-hits="1" data-linenumber="20">
833
+ <span class="hits">1</span>
834
+
835
+ <code class="ruby"> def fails_in_last_hour</code>
836
+ </li>
837
+
838
+ <li class="covered" data-hits="1" data-linenumber="21">
839
+ <span class="hits">1</span>
840
+
841
+ <code class="ruby"> hour_ago = Time.new - 360</code>
842
+ </li>
843
+
844
+ <li class="covered" data-hits="1" data-linenumber="22">
845
+ <span class="hits">1</span>
846
+
847
+ <code class="ruby"> fails.reject { |tweet| tweet.created_at &lt; hour_ago }</code>
848
+ </li>
849
+
850
+ <li class="never" data-hits="" data-linenumber="23">
851
+
852
+
853
+ <code class="ruby"> end</code>
854
+ </li>
855
+
856
+ <li class="never" data-hits="" data-linenumber="24">
857
+
858
+
859
+ <code class="ruby"> end</code>
860
+ </li>
861
+
862
+ <li class="never" data-hits="" data-linenumber="25">
863
+
864
+
865
+ <code class="ruby">end</code>
866
+ </li>
867
+
868
+ </ol>
869
+ </pre>
870
+ </div>
871
+
872
+ </div>
873
+ </div>
874
+ </body>
875
+ </html>