all_seeing_eye 0.0.14 → 0.0.15
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/VERSION +1 -1
- data/all_seeing_eye.gemspec +2 -3
- data/lib/all_seeing_eye/model.rb +23 -16
- data/lib/all_seeing_eye/server.rb +6 -6
- data/lib/all_seeing_eye/server/public/style.css +6 -1
- data/lib/all_seeing_eye/server/views/field.erb +13 -4
- data/test/model_test.rb +9 -5
- metadata +4 -5
- data/lib/all_seeing_eye/server/views/view.erb +0 -63
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.15
|
data/all_seeing_eye.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{all_seeing_eye}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.15"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Josh Symonds"]
|
12
|
-
s.date = %q{2011-08-
|
12
|
+
s.date = %q{2011-08-12}
|
13
13
|
s.default_executable = %q{all-seeing-eye}
|
14
14
|
s.description = %q{AllSeeingEye observes all requests, with parameters that you specify, to Redis. Then it composes them into graphs for you to see.}
|
15
15
|
s.email = %q{veraticus@gmail.com}
|
@@ -44,7 +44,6 @@ Gem::Specification.new do |s|
|
|
44
44
|
"lib/all_seeing_eye/server/views/layout.erb",
|
45
45
|
"lib/all_seeing_eye/server/views/left.erb",
|
46
46
|
"lib/all_seeing_eye/server/views/total.erb",
|
47
|
-
"lib/all_seeing_eye/server/views/view.erb",
|
48
47
|
"test/base_test.rb",
|
49
48
|
"test/fixtures/all_seeing_eye.yml",
|
50
49
|
"test/fixtures/redis-test.conf",
|
data/lib/all_seeing_eye/model.rb
CHANGED
@@ -57,7 +57,7 @@ class AllSeeingEye::Model
|
|
57
57
|
|
58
58
|
def self.find_by_field(field, options = {})
|
59
59
|
if options[:value]
|
60
|
-
all = AllSeeingEye.redis.sort("allseeingeye:#{self.model_name}:fields:#{field}:#{options[:value]}", :by => 'nosort', :get => "allseeingeye:#{self.model_name}:*").collect{|o| self.load(o)}
|
60
|
+
all = AllSeeingEye.redis.sort("allseeingeye:#{self.model_name}:fields:#{field}:#{options[:value]}", :by => 'nosort', :get => "allseeingeye:#{self.model_name}:*", :limit => options[:offset] && options[:limit] ? [options[:offset], options[:limit]] : nil).collect{|o| self.load(o)}
|
61
61
|
all = all.find_all{|o| o.created_at > options[:start]} if options[:start]
|
62
62
|
all = all.find_all{|o| o.created_at < options[:stop]} if options[:stop]
|
63
63
|
all
|
@@ -71,19 +71,18 @@ class AllSeeingEye::Model
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.count_by_field(field, options = {})
|
74
|
-
options = {:start => '-inf', :stop => '+inf'}.merge(options)
|
74
|
+
options = {:start => '-inf', :stop => '+inf', :offset => nil, :limit => nil}.merge(options)
|
75
75
|
|
76
|
-
|
77
|
-
"allseeingeye:#{self.model_name}:fields:#{field}:#{options[:value]}:count"
|
76
|
+
raw_list, needs_pruning = if options[:value]
|
77
|
+
[AllSeeingEye.redis.zrangebyscore("allseeingeye:#{self.model_name}:fields:#{field}:#{options[:value]}:count", '-inf', '+inf', :with_scores => true), true]
|
78
78
|
else
|
79
79
|
if AllSeeingEye.redis.exists("allseeingeye:#{self.model_name}:fields:#{field}:count")
|
80
|
-
"allseeingeye:#{self.model_name}:fields:#{field}:count"
|
80
|
+
[AllSeeingEye.redis.zrangebyscore("allseeingeye:#{self.model_name}:fields:#{field}:count", '-inf', '+inf', :with_scores => true), true]
|
81
81
|
else
|
82
|
-
"allseeingeye:#{self.model_name}:fields:#{field}"
|
82
|
+
[AllSeeingEye.redis.zrangebyscore("allseeingeye:#{self.model_name}:fields:#{field}", options[:start], options[:stop], :with_scores => true), false]
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
raw_list = AllSeeingEye.redis.zrangebyscore(key, options[:start], options[:stop], :with_scores => true)
|
87
86
|
list = []
|
88
87
|
raw_list.each_with_index do |value, index|
|
89
88
|
if index % 2 == 0
|
@@ -92,7 +91,11 @@ class AllSeeingEye::Model
|
|
92
91
|
list.last[1] = value.to_i
|
93
92
|
end
|
94
93
|
end
|
95
|
-
|
94
|
+
if needs_pruning
|
95
|
+
list = list.find_all{|i| i.first.to_i > options[:start]} if options[:start] && options[:start] != '-inf'
|
96
|
+
list = list.find_all{|i| i.first.to_i < options[:stop]} if options[:stop] && options[:stop] != '+inf'
|
97
|
+
end
|
98
|
+
list.sort{|a, b| a.first.to_i == 0 ? b.last <=> a.last : a.first <=> b.first}
|
96
99
|
end
|
97
100
|
|
98
101
|
def self.first
|
@@ -105,15 +108,19 @@ class AllSeeingEye::Model
|
|
105
108
|
|
106
109
|
def self.search(query, options = {})
|
107
110
|
if query =~ /^[\sa-zA-Z0-9,-]*? to [\sa-zA-Z0-9,-]*?$/
|
108
|
-
start = Chronic.parse(query.split(' to ').first, :context => :past)
|
109
|
-
stop = Chronic.parse(query.split(' to ').last, :context => :past)
|
110
|
-
|
111
|
+
start = Chronic.parse(query.split(' to ').first, :context => :past).to_i
|
112
|
+
stop = Chronic.parse(query.split(' to ').last, :context => :past).to_i
|
113
|
+
if options[:count]
|
114
|
+
return self.count_by_field('created_at', :start => start, :stop => stop)
|
115
|
+
else
|
116
|
+
return AllSeeingEye.redis.zrangebyscore("allseeingeye:#{self.model_name}:fields:created_at", start, stop, :with_scores => false).collect{|id| self.find(id)}
|
117
|
+
end
|
111
118
|
elsif query =~ /^(#{self.field_names.join('|')}):(.*)$/
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
119
|
+
if options[:count]
|
120
|
+
self.count_by_field($1, :value => $2)
|
121
|
+
else
|
122
|
+
self.find_by_field($1, :value => $2)
|
123
|
+
end
|
117
124
|
end
|
118
125
|
end
|
119
126
|
|
@@ -66,6 +66,7 @@ class AllSeeingEye
|
|
66
66
|
|
67
67
|
def show(page, layout = true)
|
68
68
|
response["Cache-Control"] = "max-age=0, private, must-revalidate"
|
69
|
+
@page = params[:page].blank? ? 1 : params[:page].to_i if page == :field || page == 'field'
|
69
70
|
erb page.to_sym, {:layout => layout}
|
70
71
|
end
|
71
72
|
|
@@ -85,8 +86,7 @@ class AllSeeingEye
|
|
85
86
|
get '/search/:id' do
|
86
87
|
@field = 'total'
|
87
88
|
@query = params[:id]
|
88
|
-
@requests = AllSeeingEye::Request.search(@query)
|
89
|
-
@counts = AllSeeingEye::Request.conglomerate(@requests)
|
89
|
+
@requests = AllSeeingEye::Request.search(@query, :count => true)
|
90
90
|
show :total
|
91
91
|
end
|
92
92
|
|
@@ -117,10 +117,10 @@ class AllSeeingEye
|
|
117
117
|
@id = params[:captures].first
|
118
118
|
@view = f
|
119
119
|
@requests = AllSeeingEye::Request.find_by_field(@field, :value => @id)
|
120
|
-
|
121
|
-
@requests.each {|r| next if r.send(@view.to_sym).nil?;
|
122
|
-
@
|
123
|
-
show :
|
120
|
+
counts = Hash.new(0)
|
121
|
+
@requests.each {|r| next if r.send(@view.to_sym).nil?; counts[r.send(@view.to_sym)] += 1}
|
122
|
+
@requests = counts.sort {|a, b| b.last <=> a.last}
|
123
|
+
show :field
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -228,4 +228,9 @@ tr:last-child td.last {
|
|
228
228
|
}
|
229
229
|
#page #graph {
|
230
230
|
width: 98%; height: 500px; margin: 0 10px;
|
231
|
-
}
|
231
|
+
}
|
232
|
+
#page #pager {
|
233
|
+
width: 95%; height: 30px; margin: 10px 0; padding: 0 10px;
|
234
|
+
}
|
235
|
+
#pager #previous {float: left;}
|
236
|
+
#pager #next {float: right;}
|
@@ -1,23 +1,32 @@
|
|
1
1
|
<%= partial(:left) %>
|
2
2
|
|
3
|
+
<% paged_requests = @requests[((@page - 1) * 10)..(@page * 10)] %>
|
4
|
+
|
3
5
|
<div id='right'>
|
4
6
|
<% if @query %>
|
5
7
|
<h1>Search » <%= humanize @query %> » <%= humanize @field %></h1>
|
8
|
+
<% elsif @view %>
|
9
|
+
<h1><a href='/fields/<%= @field %>'><%= humanize @field %></a> » <%= humanize @id %> » <%= humanize @view %></h1>
|
6
10
|
<% else %>
|
7
11
|
<h1><%= humanize @field %></h1>
|
8
12
|
<% end %>
|
9
13
|
|
10
|
-
<% if
|
14
|
+
<% if paged_requests.nil? || paged_requests.empty? %>
|
11
15
|
<h2>No requests found.</h2>
|
12
16
|
<% else %>
|
13
17
|
<div id='graph'></div>
|
18
|
+
|
19
|
+
<div id='pager'>
|
20
|
+
<% if @page != 1 %><a href='<%= u "#{current_page}?page=#{@page - 1}"%>' id='previous'>« previous</a><% end %>
|
21
|
+
<% if @requests.count > @page * 10 %><a href='<%= u "#{current_page}?page=#{@page + 1}"%>' id='next'>next »</a><% end %>
|
22
|
+
</div>
|
14
23
|
|
15
24
|
<script type='text/javascript'>
|
16
|
-
var ids = [ <%=
|
25
|
+
var ids = [ <%= paged_requests.collect{|r| "'#{r.first}'"}.join(',') %>]
|
17
26
|
|
18
27
|
$.plot($("#graph"),
|
19
28
|
[{
|
20
|
-
data: [ <%=
|
29
|
+
data: [ <%= paged_requests.enum_for(:each_with_index).collect {|f, i| "[#{i}, #{f.last}]"}.join(',') %> ],
|
21
30
|
label: 'requests'
|
22
31
|
}],
|
23
32
|
{
|
@@ -27,7 +36,7 @@
|
|
27
36
|
grid: { hoverable: true, clickable: true },
|
28
37
|
xaxis: {
|
29
38
|
autoscaleMargin: 0.05,
|
30
|
-
ticks: [ <%=
|
39
|
+
ticks: [ <%= paged_requests.enum_for(:each_with_index).collect {|f, i| "[#{i}, '#{f.first.split(' ').join('\n').gsub('/','/\n')}']"}.join(',') %> ]
|
31
40
|
},
|
32
41
|
yaxis: {
|
33
42
|
autoscaleMargin: 0.01
|
data/test/model_test.rb
CHANGED
@@ -163,6 +163,10 @@ context 'class methods with setup' do
|
|
163
163
|
assert results.collect(&:id).include?(@obj4.id)
|
164
164
|
end
|
165
165
|
|
166
|
+
test 'find model objects with a limit and offset' do
|
167
|
+
|
168
|
+
end
|
169
|
+
|
166
170
|
test 'find model objects by a date field' do
|
167
171
|
results = AllSeeingEye::Model.find_by_field('created_at', :start => @obj1.created_at, :stop => @obj4.created_at)
|
168
172
|
|
@@ -215,12 +219,11 @@ context 'class methods with setup' do
|
|
215
219
|
assert results.collect(&:id).include?(@obj6.id)
|
216
220
|
end
|
217
221
|
|
218
|
-
test 'search
|
219
|
-
results = AllSeeingEye::Model.search('
|
222
|
+
test 'search for a count on a specific field' do
|
223
|
+
results = AllSeeingEye::Model.search('uri:/test/', :count => true)
|
220
224
|
|
221
|
-
assert_equal
|
222
|
-
|
223
|
-
assert results.collect(&:id).include?(@obj6.id)
|
225
|
+
assert_equal 4, results.count
|
226
|
+
assert_equal results.last, [((@obj6.created_at.to_i / 60) * 60).to_s, 2]
|
224
227
|
end
|
225
228
|
end
|
226
229
|
|
@@ -246,6 +249,7 @@ context 'many objects' do
|
|
246
249
|
test 'get the created count' do
|
247
250
|
counts = AllSeeingEye::Model.count_by_field('created_at')
|
248
251
|
|
252
|
+
assert_equal counts, AllSeeingEye::Model.search('ten years ago to one year from now', :count => true)
|
249
253
|
assert_equal (@obj999.created_at.to_i / 60) * 60, counts.first.first.to_i
|
250
254
|
assert_equal (@obj0.created_at.to_i / 60) * 60, counts.last.first.to_i
|
251
255
|
assert_equal 2000, counts.inject(0) {|sum, k| sum + k.last}
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: all_seeing_eye
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 15
|
10
|
+
version: 0.0.15
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Josh Symonds
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-08-
|
18
|
+
date: 2011-08-12 00:00:00 -05:00
|
19
19
|
default_executable: all-seeing-eye
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -199,7 +199,6 @@ files:
|
|
199
199
|
- lib/all_seeing_eye/server/views/layout.erb
|
200
200
|
- lib/all_seeing_eye/server/views/left.erb
|
201
201
|
- lib/all_seeing_eye/server/views/total.erb
|
202
|
-
- lib/all_seeing_eye/server/views/view.erb
|
203
202
|
- test/base_test.rb
|
204
203
|
- test/fixtures/all_seeing_eye.yml
|
205
204
|
- test/fixtures/redis-test.conf
|
@@ -1,63 +0,0 @@
|
|
1
|
-
<%= partial(:left) %>
|
2
|
-
|
3
|
-
<div id='right'>
|
4
|
-
<h1><a href='/fields/<%= @field %>'><%= humanize @field %></a> » <%= humanize @id %> » <%= humanize @view %></h1>
|
5
|
-
|
6
|
-
<% if @counts.flatten.empty? %>
|
7
|
-
<h2>No requests found.</h2>
|
8
|
-
<% else %>
|
9
|
-
<div id='graph'></div>
|
10
|
-
|
11
|
-
<script type='text/javascript'>
|
12
|
-
$.plot($("#graph"),
|
13
|
-
[{
|
14
|
-
data: [ <%= @counts.enum_for(:each_with_index).collect {|f, i| "[#{i}, #{f.last}]"}.join(',') %> ],
|
15
|
-
label: 'requests'
|
16
|
-
}],
|
17
|
-
{
|
18
|
-
series: {
|
19
|
-
bars: { show: true, align: "center", barWidth: 0.9}
|
20
|
-
},
|
21
|
-
grid: { hoverable: true, clickable: true },
|
22
|
-
xaxis: {
|
23
|
-
autoscaleMargin: 0.05,
|
24
|
-
ticks: [ <%= @counts.reverse.enum_for(:each_with_index).collect {|f, i| "[#{i}, '#{f.first.to_s.split(' ').join('\n').gsub('/','/\n')}']"}.join(',') %> ]
|
25
|
-
},
|
26
|
-
yaxis: {
|
27
|
-
autoscaleMargin: 0.01
|
28
|
-
},
|
29
|
-
legend: {
|
30
|
-
show: false
|
31
|
-
},
|
32
|
-
colors: ["#6bc2f6", "#d18b2c", "#dba255", "#919733"]
|
33
|
-
});
|
34
|
-
|
35
|
-
var previousPoint = null;
|
36
|
-
|
37
|
-
$("#graph").bind("plothover", function (event, pos, item) {
|
38
|
-
if (item) {
|
39
|
-
if (previousPoint != item.dataIndex) {
|
40
|
-
previousPoint = item.dataIndex;
|
41
|
-
|
42
|
-
$("#tooltip").remove();
|
43
|
-
var x = item.datapoint[0].toFixed(2),
|
44
|
-
y = item.datapoint[1].toFixed(2);
|
45
|
-
|
46
|
-
showTooltip(item.pageX, item.pageY,
|
47
|
-
Math.round(y) + ' ' + item.series.label + ' for ' + item.series.xaxis.ticks[item.dataIndex].label );
|
48
|
-
}
|
49
|
-
}
|
50
|
-
else {
|
51
|
-
$("#tooltip").remove();
|
52
|
-
previousPoint = null;
|
53
|
-
}
|
54
|
-
});
|
55
|
-
|
56
|
-
$("#graph").bind("plotclick", function (event, pos, item) {
|
57
|
-
if (item) {
|
58
|
-
window.location = "/fields/<%= @field %>/" + encodeURIComponent(ids[item.dataIndex])
|
59
|
-
}
|
60
|
-
});
|
61
|
-
</script>
|
62
|
-
<% end %>
|
63
|
-
</div>
|