gerbilcharts 0.2.13 → 0.5.9
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/History.txt +35 -0
- data/Manifest.txt +8 -0
- data/README.txt +8 -8
- data/lib/gerbilcharts/charts.rb +3 -0
- data/lib/gerbilcharts/charts/bubble_chart.rb +30 -0
- data/lib/gerbilcharts/charts/conversation_ring.rb +31 -0
- data/lib/gerbilcharts/charts/line_chart.rb +1 -0
- data/lib/gerbilcharts/charts/matrix_chart.rb +32 -0
- data/lib/gerbilcharts/charts/square_line_chart.rb +7 -0
- data/lib/gerbilcharts/models.rb +1 -0
- data/lib/gerbilcharts/models/bucketized_timeseries_graph_model.rb +1 -1
- data/lib/gerbilcharts/models/graph_model_group.rb +19 -2
- data/lib/gerbilcharts/models/matrix_model.rb +85 -0
- data/lib/gerbilcharts/models/monotonous_graph_model.rb +5 -1
- data/lib/gerbilcharts/models/presets.rb +18 -11
- data/lib/gerbilcharts/models/raw_range.rb +1 -1
- data/lib/gerbilcharts/models/round_range.rb +3 -1
- data/lib/gerbilcharts/models/round_time_range.rb +19 -29
- data/lib/gerbilcharts/models/sampled_timeseries_graph_model.rb +1 -1
- data/lib/gerbilcharts/public/brushmetal.css +123 -74
- data/lib/gerbilcharts/public/gerbil.js +104 -64
- data/lib/gerbilcharts/surfaces.rb +3 -0
- data/lib/gerbilcharts/surfaces/bubble_surface.rb +105 -0
- data/lib/gerbilcharts/surfaces/chart.rb +4 -2
- data/lib/gerbilcharts/surfaces/conversation_ring.rb +64 -0
- data/lib/gerbilcharts/surfaces/detailed_legend.rb +35 -13
- data/lib/gerbilcharts/surfaces/graph_element.rb +8 -1
- data/lib/gerbilcharts/surfaces/grid.rb +8 -2
- data/lib/gerbilcharts/surfaces/horizontal_axis.rb +12 -3
- data/lib/gerbilcharts/surfaces/horizontal_time_axis.rb +5 -4
- data/lib/gerbilcharts/surfaces/impulse_surface.rb +1 -1
- data/lib/gerbilcharts/surfaces/legend.rb +43 -6
- data/lib/gerbilcharts/surfaces/mark_band.rb +17 -1
- data/lib/gerbilcharts/surfaces/matrix_surface.rb +87 -0
- data/lib/gerbilcharts/surfaces/pie_surface.rb +109 -96
- data/lib/gerbilcharts/surfaces/rect.rb +18 -0
- data/lib/gerbilcharts/surfaces/stacked_area_surface.rb +42 -2
- data/lib/gerbilcharts/surfaces/stacked_grid.rb +1 -3
- data/lib/gerbilcharts/surfaces/title_panel.rb +7 -2
- data/lib/gerbilcharts/surfaces/tracker.rb +4 -1
- data/lib/gerbilcharts/surfaces/vertical_axis.rb +2 -2
- data/lib/gerbilcharts/svgdc.rb +1 -0
- data/lib/gerbilcharts/svgdc/css_inliner.rb +2 -2
- data/lib/gerbilcharts/svgdc/svg_ellipse.rb +21 -0
- data/lib/gerbilcharts/svgdc/svg_polygon.rb +19 -0
- data/lib/gerbilcharts/svgdc/svgdc.rb +4 -1
- data/lib/gerbilcharts/version.rb +2 -3
- data/test/test_bar.rb +1 -1
- data/test/test_bubble.rb +52 -0
- data/test/test_conversation.rb +34 -0
- data/test/test_lines.rb +3 -3
- data/test/test_matrix.rb +34 -0
- data/test/test_noob.rb +9 -6
- data/test/test_pie.rb +2 -2
- data/test/test_ranges.rb +15 -2
- data/test/test_sa.rb +88 -0
- metadata +14 -2
@@ -6,8 +6,8 @@ module GerbilCharts::Models
|
|
6
6
|
# and the label values are neat and clean
|
7
7
|
#
|
8
8
|
class Presets
|
9
|
-
|
10
|
-
|
9
|
+
|
10
|
+
public
|
11
11
|
PRESETS = [
|
12
12
|
[0,0], [1,0.2], [5,1], [10,1],[20,5],
|
13
13
|
[50,10],[100,25],[200,50], [500,100], [1000,200],
|
@@ -16,9 +16,10 @@ protected
|
|
16
16
|
[500000,100000],[800000,200000],
|
17
17
|
[1000000,200000],[2000000,500000], [3000000,500000], [4000000,1000000],
|
18
18
|
[5000000,1000000],[6000000, 1000000],
|
19
|
-
|
20
|
-
[100000000,25000000], [500000000,100000000],
|
21
|
-
|
19
|
+
[8000000,2000000], [10000000,2000000], [20000000,5000000], [50000000, 10000000],
|
20
|
+
[100000000,25000000], [200000000,50000000], [500000000,100000000],
|
21
|
+
[1000000000, 250000000] , [3000000000, 1000000000] , [5000000000, 1000000000] ,
|
22
|
+
[10000000000,2000000000] ,
|
22
23
|
]
|
23
24
|
|
24
25
|
TIMEPRESETS = [
|
@@ -26,10 +27,11 @@ protected
|
|
26
27
|
[30,10],[60,10],[120,15], [300,60], [600,120],
|
27
28
|
[900,300], [1800,300],
|
28
29
|
[3600,900], [7200,1800],[10800,3600], [14400,3600], [21600,7200],
|
29
|
-
[43200, 10800],
|
30
|
-
[172800, 43200],
|
30
|
+
[43200, 10800], [86400,21600],
|
31
|
+
[172800, 43200], [259200,86400],
|
31
32
|
[604800, 86400], [1209600,172800],
|
32
33
|
[2419200, 604800],
|
34
|
+
[4848400, 604800],
|
33
35
|
[7257600, 2419200],
|
34
36
|
[14515200,7257600],
|
35
37
|
[29030400,7257600],
|
@@ -58,8 +60,8 @@ protected
|
|
58
60
|
UNITPRESETS.each do |unit|
|
59
61
|
if raw_value.abs >= unit[0]
|
60
62
|
retval = raw_value / unit[0]
|
61
|
-
sout=format("%.
|
62
|
-
sout.gsub! "
|
63
|
+
sout=format("%.1f%s", retval, unit[1])
|
64
|
+
sout.gsub! "\.0",""
|
63
65
|
return sout
|
64
66
|
end
|
65
67
|
end
|
@@ -71,6 +73,11 @@ protected
|
|
71
73
|
# interval = desired window in seconds
|
72
74
|
def format_timeval ( tvsec, interval)
|
73
75
|
t = Time.at(tvsec).getlocal
|
76
|
+
|
77
|
+
if t.hour + t.min == 0
|
78
|
+
return t.strftime("%b-%d")
|
79
|
+
end
|
80
|
+
|
74
81
|
if interval < 60
|
75
82
|
return t.strftime("%M:%S")
|
76
83
|
elsif interval < 300
|
@@ -80,9 +87,9 @@ protected
|
|
80
87
|
elsif interval < 86400
|
81
88
|
return t.strftime("%H:%M")
|
82
89
|
elsif interval < 259200
|
83
|
-
return t.strftime("%
|
90
|
+
return t.strftime("%H:%M")
|
84
91
|
elsif interval < 604800
|
85
|
-
return t.
|
92
|
+
return t.strftime("%b-%d")
|
86
93
|
elsif interval < 2419200
|
87
94
|
return t.strftime("%b-%d")
|
88
95
|
else
|
@@ -45,11 +45,13 @@ class RoundRange < RawRange
|
|
45
45
|
# provide ticks (per label interval)
|
46
46
|
def each_tick(tpl)
|
47
47
|
|
48
|
-
|
48
|
+
return "Range not aligned with presets (call round range first)" if not @lmax
|
49
49
|
|
50
50
|
return if @lmax==0
|
51
|
+
return if tpl==0
|
51
52
|
|
52
53
|
lint = @lmax/tpl
|
54
|
+
return if lint==0
|
53
55
|
if @rmin % lint != 0
|
54
56
|
v = (@rmin+lint) - (@rmin%lint)
|
55
57
|
else
|
@@ -19,8 +19,10 @@ class RoundTimeRange < RawRange
|
|
19
19
|
super()
|
20
20
|
@rdelta,@ldelta=round_delta(raw_range.delta)
|
21
21
|
@rmin=raw_range.rmin
|
22
|
-
|
23
|
-
|
22
|
+
|
23
|
+
# this can be rdelta or ldelta for wider or tighter
|
24
|
+
#@rmax=round_max(raw_range.rmax,@rdelta)
|
25
|
+
@rmax=round_max(raw_range.rmax,@ldelta)
|
24
26
|
end
|
25
27
|
|
26
28
|
# provide labels
|
@@ -30,19 +32,8 @@ class RoundTimeRange < RawRange
|
|
30
32
|
raise "Range not aligned with presets (call round range first)" if not @ldelta
|
31
33
|
|
32
34
|
return if @ldelta == 0
|
33
|
-
|
34
|
-
if (@rmin.tv_sec % @ldelta) != @gmhalfhour
|
35
|
-
ni_sec = (@rmin.tv_sec+@ldelta)/@ldelta
|
36
35
|
|
37
|
-
|
38
|
-
if @ldelta >= 3600
|
39
|
-
v = Time.at(@ldelta * ni_sec.to_i - @gmhalfhour)
|
40
|
-
else
|
41
|
-
v = Time.at(@ldelta * ni_sec.to_i)
|
42
|
-
end
|
43
|
-
else
|
44
|
-
v = @rmin
|
45
|
-
end
|
36
|
+
v = get_label_start_time
|
46
37
|
|
47
38
|
while (v<=@rmax) do
|
48
39
|
yield v, format_timeval(v,@rdelta)
|
@@ -59,18 +50,7 @@ class RoundTimeRange < RawRange
|
|
59
50
|
|
60
51
|
subtick_delta = ideal_subtick_interval(@ldelta)
|
61
52
|
|
62
|
-
|
63
|
-
ni_sec = (@rmin.tv_sec+subtick_delta)/subtick_delta
|
64
|
-
|
65
|
-
# if labeling hours, make sure you account tz weirdness like india GMT +5:30
|
66
|
-
if @ldelta >= 3600
|
67
|
-
v = Time.at(subtick_delta* ni_sec.to_i - @gmhalfhour)
|
68
|
-
else
|
69
|
-
v = Time.at(subtick_delta * ni_sec.to_i)
|
70
|
-
end
|
71
|
-
else
|
72
|
-
v = @rmin
|
73
|
-
end
|
53
|
+
v = get_label_start_time
|
74
54
|
|
75
55
|
while (v<=@rmax) do
|
76
56
|
yield v
|
@@ -121,7 +101,7 @@ private
|
|
121
101
|
# Eg. 10x of 2 hours will be 12 min ticks = FAIL
|
122
102
|
def ideal_subtick_interval(label_interval)
|
123
103
|
|
124
|
-
case
|
104
|
+
case label_interval
|
125
105
|
when (0..1*MINUTE); return 10
|
126
106
|
when (1*MINUTE..5*MINUTE); return 1*MINUTE
|
127
107
|
when (5*MINUTE..15*MINUTE); return 3*MINUTE
|
@@ -134,8 +114,18 @@ private
|
|
134
114
|
end
|
135
115
|
end
|
136
116
|
|
137
|
-
|
138
|
-
|
117
|
+
def get_label_start_time
|
118
|
+
# if labeling hours, make sure you account tz weirdness like india GMT +5:30
|
119
|
+
if @ldelta >= 86400
|
120
|
+
v = Time.mktime(@rmin.year, @rmin.month, @rmin.day,
|
121
|
+
0,0,0,0) + 86400
|
122
|
+
elsif
|
123
|
+
tbase = Time.mktime(@rmin.year, @rmin.month, @rmin.day,0,0,0,0)
|
124
|
+
sec_inc = @rmin.tv_sec - tbase.tv_sec
|
125
|
+
v = Time.at( tbase.tv_sec + @ldelta*(sec_inc/@ldelta).ceil)
|
126
|
+
end
|
127
|
+
return v
|
128
|
+
end
|
139
129
|
end
|
140
130
|
|
141
131
|
end
|
@@ -1,139 +1,153 @@
|
|
1
1
|
.surfacepanel
|
2
2
|
{
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
fill: none;
|
4
|
+
stroke-width: 1;
|
5
|
+
stroke: black;
|
6
6
|
}
|
7
7
|
.gridlineh
|
8
8
|
{
|
9
|
-
|
10
|
-
|
9
|
+
stroke-width: 0.7;
|
10
|
+
stroke: #ccc;
|
11
11
|
}
|
12
12
|
.gridlinev
|
13
13
|
{
|
14
|
-
|
15
|
-
|
14
|
+
stroke-width: 0.7;
|
15
|
+
stroke: #ccc;
|
16
16
|
}
|
17
17
|
.gridlinesub
|
18
18
|
{
|
19
|
-
|
20
|
-
|
19
|
+
stroke-width: 0.5;
|
20
|
+
stroke: #eee;
|
21
21
|
}
|
22
22
|
.surfaceback
|
23
23
|
{
|
24
|
-
|
24
|
+
fill: white;
|
25
|
+
stroke: none;
|
25
26
|
}
|
26
27
|
.axispanel
|
27
28
|
{
|
28
|
-
|
29
|
+
fill: #EEEEEE;
|
30
|
+
stroke: none;
|
29
31
|
}
|
30
32
|
.axistickmajor
|
31
33
|
{
|
32
|
-
|
33
|
-
|
34
|
+
stroke-width: 2;
|
35
|
+
stroke: black;
|
34
36
|
}
|
35
37
|
.axistickminor
|
36
38
|
{
|
37
|
-
|
38
|
-
|
39
|
+
stroke-width: 1;
|
40
|
+
stroke: black;
|
39
41
|
}
|
40
42
|
.panel
|
41
43
|
{
|
42
|
-
|
44
|
+
fill: white;
|
43
45
|
}
|
44
46
|
|
45
47
|
.legend
|
46
48
|
{
|
47
|
-
|
49
|
+
fill: red;
|
50
|
+
}
|
51
|
+
.x_mk
|
52
|
+
{
|
53
|
+
fill: yellow;
|
54
|
+
fill-opacity: 0.10;
|
55
|
+
stroke: gray;
|
56
|
+
}
|
57
|
+
#ref_mod
|
58
|
+
{
|
59
|
+
fill: gray;
|
60
|
+
fill-opacity: 0.20;
|
61
|
+
stroke: none;
|
48
62
|
}
|
49
63
|
#item0
|
50
64
|
{
|
51
65
|
stroke: none;
|
52
|
-
fill: #
|
66
|
+
fill: #2166AC;
|
53
67
|
}
|
54
68
|
#item1
|
55
69
|
{
|
56
70
|
stroke: none;
|
57
|
-
fill: #
|
71
|
+
fill: #4393C3;
|
58
72
|
}
|
59
73
|
#item2
|
60
74
|
{
|
61
75
|
stroke: none;
|
62
|
-
fill:
|
76
|
+
fill: #92C5DE;
|
63
77
|
}
|
64
78
|
#item3
|
65
79
|
{
|
66
80
|
stroke: none;
|
67
|
-
fill
|
81
|
+
fill:#D1E5F0;
|
68
82
|
}
|
69
83
|
#item4
|
70
84
|
{
|
71
85
|
stroke: none;
|
72
|
-
fill
|
86
|
+
fill:#D6604D; /*FDDBC7*/
|
73
87
|
}
|
74
88
|
#item5
|
75
89
|
{
|
76
90
|
stroke: none;
|
77
|
-
fill
|
91
|
+
fill:#FDDBC7;
|
78
92
|
}
|
79
93
|
#item6
|
80
94
|
{
|
81
95
|
stroke: none;
|
82
|
-
fill:
|
96
|
+
fill: #2166AC;
|
83
97
|
}
|
84
98
|
#item7
|
85
99
|
{
|
86
100
|
stroke: none;
|
87
|
-
fill: #
|
101
|
+
fill: #4393C3;
|
88
102
|
}
|
89
103
|
#item8
|
90
104
|
{
|
91
105
|
stroke: none;
|
92
|
-
fill: #
|
106
|
+
fill: #92C5DE;
|
93
107
|
}
|
94
108
|
#item9
|
95
109
|
{
|
96
110
|
stroke: none;
|
97
|
-
fill:
|
111
|
+
fill: #92C5DE;
|
98
112
|
}
|
99
113
|
#item10
|
100
114
|
{
|
101
115
|
stroke: none;
|
102
|
-
fill:
|
116
|
+
fill: #D1E5F0;
|
103
117
|
}
|
104
118
|
#lineitem0
|
105
119
|
{
|
106
|
-
stroke: #
|
120
|
+
stroke: #2166AC;
|
107
121
|
stroke-width: 2;
|
108
122
|
}
|
109
123
|
#lineitem1
|
110
124
|
{
|
111
|
-
stroke: #
|
125
|
+
stroke: #4393C3;
|
112
126
|
stroke-width: 2;
|
113
127
|
}
|
114
128
|
#lineitem2
|
115
129
|
{
|
116
|
-
stroke
|
130
|
+
stroke:#92C5DE;
|
117
131
|
stroke-width: 2;
|
118
132
|
}
|
119
133
|
#lineitem3
|
120
134
|
{
|
121
|
-
stroke
|
135
|
+
stroke:#D1E5F0;
|
122
136
|
stroke-width: 2;
|
123
137
|
}
|
124
138
|
#lineitem4
|
125
139
|
{
|
126
|
-
stroke
|
140
|
+
stroke:#FDDBC7;
|
127
141
|
stroke-width: 2;
|
128
142
|
}
|
129
143
|
#lineitem5
|
130
144
|
{
|
131
|
-
stroke:
|
132
|
-
stroke-width:
|
145
|
+
stroke: #F4A582;
|
146
|
+
stroke-width:2;
|
133
147
|
}
|
134
148
|
#lineitem6
|
135
149
|
{
|
136
|
-
stroke:
|
150
|
+
stroke: #D6604D;
|
137
151
|
stroke-width: 2;
|
138
152
|
}
|
139
153
|
#lineitem7
|
@@ -148,71 +162,106 @@
|
|
148
162
|
}
|
149
163
|
.axislabel
|
150
164
|
{
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
165
|
+
font-family: monospace;
|
166
|
+
font-size: 11px;
|
167
|
+
fill: black;
|
168
|
+
stroke: none;
|
155
169
|
}
|
156
170
|
|
157
171
|
.axislabelt0
|
158
172
|
{
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
173
|
+
font-family: monospace;
|
174
|
+
font-size: 9px;
|
175
|
+
fill: black;
|
176
|
+
stroke: none;
|
163
177
|
}
|
164
178
|
.titletext
|
165
179
|
{
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
font-weight: bold;
|
180
|
+
fill: #999;
|
181
|
+
stroke:none;
|
182
|
+
font-family: Arial, Helvetica, sans-serif;
|
183
|
+
font-size: 22px;
|
171
184
|
}
|
172
185
|
.titlepanel
|
173
186
|
{
|
174
|
-
|
175
|
-
|
187
|
+
fill: none;
|
188
|
+
fill-opacity: 0.5;
|
189
|
+
}
|
190
|
+
.titletool
|
191
|
+
{
|
192
|
+
fill: #AAA;
|
193
|
+
stroke:none;
|
194
|
+
font-family: Arial, Helvetica, sans-serif;
|
195
|
+
font-size: 10px;
|
176
196
|
}
|
177
197
|
.legendpanel
|
178
198
|
{
|
179
|
-
|
180
|
-
|
199
|
+
fill: white;
|
200
|
+
fill-opacity: 0.6;
|
201
|
+
stroke: #ddd;
|
181
202
|
}
|
182
203
|
|
183
204
|
.legendtext
|
184
205
|
{
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
206
|
+
font-family: Arial,Helvetica,sans-serif;
|
207
|
+
font-size: 10px;
|
208
|
+
fill: black;
|
209
|
+
stroke: none;
|
189
210
|
}
|
190
211
|
.legendstats
|
191
212
|
{
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
213
|
+
font-family: monospace;
|
214
|
+
font-size: 10px;
|
215
|
+
fill: black;
|
216
|
+
stroke: none;
|
196
217
|
}
|
197
218
|
|
198
219
|
.elementlabel
|
199
220
|
{
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
221
|
+
font-family: Arial,Helvetica,sans-serif;
|
222
|
+
font-size: 10px;
|
223
|
+
fill: black;
|
224
|
+
stroke: none;
|
225
|
+
}
|
226
|
+
.elementlabel_large
|
227
|
+
{
|
228
|
+
font-family: Arial,Helvetica,sans-serif;
|
229
|
+
font-size: 10px;
|
230
|
+
fill: black;
|
231
|
+
stroke: none;
|
232
|
+
}
|
233
|
+
.elementlabel_huge
|
234
|
+
{
|
235
|
+
font-family: Arial,Helvetica,sans-serif;
|
236
|
+
font-size: 12px;
|
237
|
+
fill: black;
|
238
|
+
stroke: none;
|
204
239
|
}
|
205
240
|
.elementvalue
|
206
241
|
{
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
242
|
+
font-family: Arial,Helvetica,sans-serif;
|
243
|
+
font-size: 10px;
|
244
|
+
fill: black;
|
245
|
+
stroke: none;
|
246
|
+
}
|
247
|
+
.elementvalue_large
|
248
|
+
{
|
249
|
+
font-family: Arial,Helvetica,sans-serif;
|
250
|
+
font-size: 10px;
|
251
|
+
fill: black;
|
252
|
+
stroke: none;
|
253
|
+
}
|
254
|
+
.elementvalue_huge
|
255
|
+
{
|
256
|
+
font-family: Arial,Helvetica,sans-serif;
|
257
|
+
font-size: 12px;
|
258
|
+
fill: black;
|
259
|
+
stroke: none;
|
211
260
|
}
|
212
261
|
.trackerpanel
|
213
262
|
{
|
214
263
|
fill: white;
|
215
|
-
fill-opacity: 0.
|
264
|
+
fill-opacity: 0.0;
|
216
265
|
}
|
217
266
|
.trackerrect
|
218
267
|
{
|
@@ -223,13 +272,13 @@
|
|
223
272
|
{
|
224
273
|
font-family: courier;
|
225
274
|
font-size: 11px;
|
226
|
-
|
227
|
-
|
275
|
+
fill: black;
|
276
|
+
stroke: none;
|
228
277
|
}
|
229
278
|
.trackertextfromts
|
230
279
|
{
|
231
280
|
font-family: courier;
|
232
281
|
font-size: 9px;
|
233
|
-
|
234
|
-
|
282
|
+
fill: black;
|
283
|
+
stroke: none;
|
235
284
|
}
|