gerbilcharts 0.0.3

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 (82) hide show
  1. data/History.txt +11 -0
  2. data/License.txt +21 -0
  3. data/Manifest.txt +75 -0
  4. data/PostInstall.txt +7 -0
  5. data/README.txt +174 -0
  6. data/Rakefile +4 -0
  7. data/lib/gerbilcharts.rb +18 -0
  8. data/lib/gerbilcharts/charts.rb +16 -0
  9. data/lib/gerbilcharts/charts/area_chart.rb +36 -0
  10. data/lib/gerbilcharts/charts/bar_chart.rb +33 -0
  11. data/lib/gerbilcharts/charts/bar_chart_compact.rb +26 -0
  12. data/lib/gerbilcharts/charts/chart_base.rb +123 -0
  13. data/lib/gerbilcharts/charts/impulse_chart.rb +30 -0
  14. data/lib/gerbilcharts/charts/line_chart.rb +35 -0
  15. data/lib/gerbilcharts/charts/stacked_area_chart.rb +31 -0
  16. data/lib/gerbilcharts/models.rb +19 -0
  17. data/lib/gerbilcharts/models/bucketized_timeseries_graph_model.rb +138 -0
  18. data/lib/gerbilcharts/models/discrete_time_range.rb +63 -0
  19. data/lib/gerbilcharts/models/graph_model.rb +89 -0
  20. data/lib/gerbilcharts/models/graph_model_group.rb +240 -0
  21. data/lib/gerbilcharts/models/monotonous_graph_model.rb +192 -0
  22. data/lib/gerbilcharts/models/presets.rb +94 -0
  23. data/lib/gerbilcharts/models/raw_range.rb +68 -0
  24. data/lib/gerbilcharts/models/round_range.rb +104 -0
  25. data/lib/gerbilcharts/models/round_time_range.rb +105 -0
  26. data/lib/gerbilcharts/models/sampled_timeseries_graph_model.rb +80 -0
  27. data/lib/gerbilcharts/models/simple_timeseries_model_group.rb +68 -0
  28. data/lib/gerbilcharts/models/time_series_graph_model.rb +34 -0
  29. data/lib/gerbilcharts/public/brushmetal.css +197 -0
  30. data/lib/gerbilcharts/public/gerbil.js +327 -0
  31. data/lib/gerbilcharts/surfaces.rb +32 -0
  32. data/lib/gerbilcharts/surfaces/area_surface.rb +46 -0
  33. data/lib/gerbilcharts/surfaces/axis.rb +31 -0
  34. data/lib/gerbilcharts/surfaces/bar_surface.rb +62 -0
  35. data/lib/gerbilcharts/surfaces/basic_grid.rb +17 -0
  36. data/lib/gerbilcharts/surfaces/chart.rb +132 -0
  37. data/lib/gerbilcharts/surfaces/graph_element.rb +170 -0
  38. data/lib/gerbilcharts/surfaces/grid.rb +38 -0
  39. data/lib/gerbilcharts/surfaces/horizontal_axis.rb +32 -0
  40. data/lib/gerbilcharts/surfaces/horizontal_name_axis.rb +28 -0
  41. data/lib/gerbilcharts/surfaces/horizontal_time_axis.rb +25 -0
  42. data/lib/gerbilcharts/surfaces/impulse_surface.rb +47 -0
  43. data/lib/gerbilcharts/surfaces/legend.rb +59 -0
  44. data/lib/gerbilcharts/surfaces/line_surface.rb +53 -0
  45. data/lib/gerbilcharts/surfaces/mark_band.rb +17 -0
  46. data/lib/gerbilcharts/surfaces/panel.rb +17 -0
  47. data/lib/gerbilcharts/surfaces/pie_surface.rb +16 -0
  48. data/lib/gerbilcharts/surfaces/rect.rb +86 -0
  49. data/lib/gerbilcharts/surfaces/stacked_area_surface.rb +66 -0
  50. data/lib/gerbilcharts/surfaces/stacked_grid.rb +15 -0
  51. data/lib/gerbilcharts/surfaces/surface.rb +20 -0
  52. data/lib/gerbilcharts/surfaces/surface_background.rb +13 -0
  53. data/lib/gerbilcharts/surfaces/title_panel.rb +44 -0
  54. data/lib/gerbilcharts/surfaces/tracker.rb +62 -0
  55. data/lib/gerbilcharts/surfaces/vertical_axis.rb +46 -0
  56. data/lib/gerbilcharts/svgdc.rb +22 -0
  57. data/lib/gerbilcharts/svgdc/filters.rb +40 -0
  58. data/lib/gerbilcharts/svgdc/presentation_attributes.rb +50 -0
  59. data/lib/gerbilcharts/svgdc/svg_circle.rb +22 -0
  60. data/lib/gerbilcharts/svgdc/svg_custom_win.rb +36 -0
  61. data/lib/gerbilcharts/svgdc/svg_element.rb +87 -0
  62. data/lib/gerbilcharts/svgdc/svg_line.rb +26 -0
  63. data/lib/gerbilcharts/svgdc/svg_polygon.rb +34 -0
  64. data/lib/gerbilcharts/svgdc/svg_polyline.rb +27 -0
  65. data/lib/gerbilcharts/svgdc/svg_rect.rb +29 -0
  66. data/lib/gerbilcharts/svgdc/svg_shape.rb +10 -0
  67. data/lib/gerbilcharts/svgdc/svg_text.rb +21 -0
  68. data/lib/gerbilcharts/svgdc/svg_win.rb +52 -0
  69. data/lib/gerbilcharts/svgdc/svgdc.rb +335 -0
  70. data/lib/gerbilcharts/svgdc/transformations.rb +66 -0
  71. data/lib/gerbilcharts/version.rb +9 -0
  72. data/setup.rb +1585 -0
  73. data/test/test_Scratch.rb +21 -0
  74. data/test/test_charts.rb +119 -0
  75. data/test/test_gerbilcharts.rb +11 -0
  76. data/test/test_helper.rb +2 -0
  77. data/test/test_models.rb +118 -0
  78. data/test/test_noob.rb +81 -0
  79. data/test/test_ranges.rb +135 -0
  80. data/test/test_svgdc.rb +221 -0
  81. data/test/trafgen.rb +25 -0
  82. metadata +156 -0
@@ -0,0 +1,17 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # Basic Grid - just X-markers light dashed
4
+ #
5
+ class BasicGrid < Grid
6
+ def initialize(opts={})
7
+ super(opts)
8
+ @class = "grid"
9
+ end
10
+
11
+ def int_render(g)
12
+ super
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,132 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # == Chart - container class
4
+ # Base from which all chart are derived
5
+ class Chart < GraphElement
6
+
7
+ attr_reader :anchor
8
+ attr_reader :elements
9
+ attr_reader :needslayout
10
+ attr_reader :modelgroup
11
+ attr_reader :stylesheet
12
+ attr_reader :filters
13
+ attr_reader :href
14
+ attr_reader :javascripts
15
+ attr_reader :ajaxOptions
16
+ attr_reader :ajaxContext
17
+
18
+ def initialize( opt={})
19
+ super(opt)
20
+ set_defaults
21
+ @children = []
22
+ @filters = []
23
+ @stylesheet = opt[:style] if defined? opt[:style]
24
+ @javascripts = opt[:javascripts] if opt[:javascripts]
25
+ @needslayout=false
26
+ end
27
+
28
+ def set_defaults
29
+ @javascripts = { "/javascripts/gerbil.js" => false, "/javascripts/prototype.js" => false }
30
+ end
31
+
32
+ def set_modelgroup(g)
33
+ @modelgroup=g
34
+ end
35
+
36
+ def usesAjax?
37
+ if @ajaxOptions
38
+ return true
39
+ else
40
+ return false
41
+ end
42
+ end
43
+
44
+ def set_ajaxOptions(h)
45
+ @ajaxOptions={} if @ajaxOptions == nil
46
+ @ajaxOptions.merge!(h)
47
+ end
48
+
49
+ def set_ajaxContext(h)
50
+ @ajaxContext={} if @ajaxContext == nil
51
+ @ajaxContext.merge!(h)
52
+ end
53
+
54
+
55
+ def add_child(e,opts={})
56
+ @children << e
57
+ @needslayout=true
58
+ e.setparent(self)
59
+ set_anchor(e) if opts[:anchor]
60
+ end
61
+
62
+ def render(ropts={})
63
+ svgdc = GerbilCharts::SVGDC::SVGDC.new(@bounds.width, @bounds.height)
64
+
65
+ dolayout if @needslayout
66
+
67
+ @children.each do |ch|
68
+ ch.render(svgdc)
69
+ end
70
+
71
+ @filters.each do |f|
72
+ svgdc.add_filter(f)
73
+ end
74
+
75
+ @javascripts.each_pair do |scr,inline|
76
+ svgdc.add_javascriptfile(scr, inline)
77
+ end
78
+
79
+ # set model hash, and other template contexts
80
+ if @ajaxOptions
81
+ @ajaxContext.store(:axdigest,@modelgroup.models_digest)
82
+ end
83
+
84
+ svgdc.set_ajaxOptions(@ajaxOptions) if @ajaxOptions
85
+
86
+ svgdc.set_ajaxContext(@ajaxContext) if @ajaxContext
87
+
88
+ svgdc.set_stylesheet(@stylesheet) if @stylesheet
89
+
90
+ svgdc.render(ropts)
91
+ end
92
+
93
+ def getmodelgroup
94
+ return @modelgroup
95
+ end
96
+
97
+ def create_filter(f)
98
+ @filters << f
99
+ end
100
+
101
+ def sethref(h)
102
+ @href=h
103
+ end
104
+
105
+ protected
106
+ def dolayout
107
+ spare = Rect.new
108
+ spare.from_wh @bounds.width,@bounds.height
109
+
110
+ @children.each do |ch|
111
+ spare=ch.munch spare
112
+ end
113
+
114
+ @anchor.setbounds spare
115
+
116
+ @children.each do |ch|
117
+ ch.align_to_anchor @anchor
118
+ end
119
+
120
+ @needslayout=false
121
+ end
122
+
123
+ private
124
+ def set_anchor(a)
125
+ raise "Only one anchor element supported" if @anchor
126
+ @anchor =a
127
+ end
128
+ end
129
+
130
+ end
131
+
132
+
@@ -0,0 +1,170 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # Graph - base for everything you place on the graph (all rectangular)
4
+ #
5
+ class GraphElement
6
+
7
+ # constants
8
+ EXP_FIXED=1
9
+ EXP_FILL=2
10
+
11
+ # orientations
12
+ ORIENT_NORTH=1
13
+ ORIENT_SOUTH=2
14
+ ORIENT_EAST=3
15
+ ORIENT_WEST=4
16
+ ORIENT_NORTHEAST=5
17
+ ORIENT_NORTHWEST=6
18
+ ORIENT_SOUTHEAST=7
19
+ ORIENT_SOUTHWEST=8
20
+ ORIENT_OVERLAY=9
21
+
22
+
23
+ # public ro attributes
24
+ attr_reader :class
25
+ attr_reader :group
26
+ attr_reader :bounds
27
+ attr_reader :lay_orient
28
+ attr_reader :lay_expand
29
+ attr_reader :lay_dimension
30
+ attr_reader :parent
31
+
32
+ def initialize( opt={} )
33
+ @lay_orient= opt[:orient] if defined? opt[:orient]
34
+ @lay_expand= opt[:expand] if defined? opt[:expand]
35
+ @lay_dimension= opt[:dim] if defined? opt[:dim]
36
+ @bounds = Rect.new
37
+ if opt[:width] and opt[:height]
38
+ @bounds.from_wh(opt[:width],opt[:height])
39
+ end
40
+ if opt[:class]
41
+ @class=opt[:class]
42
+ end
43
+ @group="default"
44
+ @global_chart_options=opt
45
+ end
46
+
47
+ def needslayout?
48
+ if @lay_orient
49
+ return true
50
+ else
51
+ return false
52
+ end
53
+ end
54
+
55
+ def setparent(par)
56
+ @parent=par
57
+ end
58
+
59
+ def isoverlay?
60
+ if defined? @lay_orient and @lay_orient == ORIENT_OVERLAY
61
+ return true
62
+ else
63
+ return false
64
+ end
65
+ end
66
+
67
+ def scale_x val,range
68
+ return @bounds.left + @bounds.width * range.scale_factor(val)
69
+ end
70
+
71
+ def scale_y val,range
72
+ return @bounds.bottom - @bounds.height * range.scale_factor(val)
73
+ end
74
+
75
+
76
+ def setbounds rcbounds
77
+ @bounds.initfrom rcbounds
78
+ end
79
+
80
+ # setup SVG group element and call int_render
81
+ def render(sdc)
82
+ w=sdc.newwin(@group)
83
+ # w.add_transformation(TTranslate.new(@bounds.left, @bounds.top))
84
+ sdc.setactivewindow(w)
85
+ int_render(sdc)
86
+ sdc.setactivewindow
87
+ end
88
+
89
+ # render direct - directly render SVG using builder for complex elements
90
+ def render_direct(sdc)
91
+ raise "This Graph Element cannot render directly, incorrect usage"
92
+ end
93
+
94
+ def munch(layrect)
95
+ raise "Element does not need to be laid out" if not needslayout?
96
+
97
+ @bounds.initfrom(layrect)
98
+ case @lay_orient
99
+ when ORIENT_SOUTH
100
+ @bounds.clip_b @lay_dimension
101
+ layrect.crop_b @lay_dimension
102
+ when ORIENT_NORTH
103
+ @bounds.clip_t @lay_dimension
104
+ layrect.crop_t @lay_dimension
105
+ when ORIENT_EAST
106
+ @bounds.clip_r @lay_dimension
107
+ layrect.crop_r @lay_dimension
108
+ when ORIENT_WEST
109
+ @bounds.clip_l @lay_dimension
110
+ layrect.crop_l @lay_dimension
111
+ when ORIENT_SOUTHEAST
112
+ @bounds.clip_b @lay_dimension
113
+ @bounds.clip_r @lay_dimension
114
+ when ORIENT_NORTHEAST
115
+ @bounds.clip_t @lay_dimension
116
+ @bounds.clip_r @lay_dimension
117
+ when ORIENT_SOUTHWEST
118
+ @bounds.clip_b @lay_dimension
119
+ @bounds.clip_l @lay_dimension
120
+ when ORIENT_NORTHWEST
121
+ @bounds.clip_t @lay_dimension
122
+ @bounds.clip_l @lay_dimension
123
+ end
124
+ return layrect
125
+ end
126
+
127
+ def align_to_anchor(anc)
128
+ case @lay_orient
129
+ when ORIENT_SOUTH
130
+ @bounds.left= anc.bounds.left
131
+ @bounds.right=anc.bounds.right
132
+ when ORIENT_NORTH
133
+ @bounds.left= anc.bounds.left
134
+ @bounds.right=anc.bounds.right
135
+ when ORIENT_EAST
136
+ @bounds.top= anc.bounds.top
137
+ @bounds.bottom=anc.bounds.bottom
138
+ when ORIENT_WEST
139
+ @bounds.top= anc.bounds.top
140
+ @bounds.bottom=anc.bounds.bottom
141
+ when ORIENT_OVERLAY
142
+ @bounds.initfrom anc.bounds
143
+ end
144
+ end
145
+
146
+ # query a global option, return the defval if option is not set
147
+ def get_global_option(optsym, defval)
148
+ if @global_chart_options[optsym]
149
+ return @global_chart_options[optsym]
150
+ else
151
+ return defval
152
+ end
153
+ end
154
+
155
+ # utility methods to derived classes
156
+ protected
157
+
158
+ def max(a,b)
159
+ return (a>b)?a:b
160
+ end
161
+
162
+ def min(a,b)
163
+ return (a<b)?a:b
164
+ end
165
+
166
+
167
+ end
168
+
169
+ end
170
+
@@ -0,0 +1,38 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # = Grid - grid overlay
4
+ # Draws both x and y grids
5
+ class Grid < GraphElement
6
+
7
+ def initialize(opts={})
8
+ super(opts)
9
+ end
10
+
11
+ def int_render(g)
12
+ ry = grid_range_y
13
+ ry.each_label do |val,label|
14
+ yp = scale_y val,ry
15
+ g.line(@bounds.left,yp,@bounds.right,yp, {:class => "gridlineh"})
16
+ end
17
+
18
+ rx = grid_range_x
19
+ rx.each_label do |val,label|
20
+ xp = scale_x val,rx
21
+ g.line(xp,@bounds.top,xp,@bounds.bottom, {:class => "gridlinev"})
22
+ end
23
+ end
24
+
25
+ protected
26
+
27
+ def grid_range_x
28
+ return parent.modelgroup.effective_round_range_x
29
+ end
30
+
31
+ def grid_range_y
32
+ return parent.modelgroup.effective_round_range_y0
33
+ end
34
+
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,32 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ class HorizontalAxis < Axis
4
+
5
+ def initialize(opts={})
6
+ @class = "haxis"
7
+ super(opts)
8
+ end
9
+
10
+ def int_render(g)
11
+ super
12
+
13
+ return if parent.modelgroup.empty?
14
+
15
+ rx = parent.modelgroup.effective_round_range_x
16
+ rx.each_label do |val,label|
17
+ xp = scale_x val,rx
18
+
19
+ # make sure edge ones are visible
20
+ if (xp>=@bounds.right-10)
21
+ xp = @bounds.right-10
22
+ end
23
+
24
+ g.textout(xp, @bounds.top+10, label, {:class => "axislabel"})
25
+ g.line(xp,@bounds.top-2,xp,@bounds.top+3, {:class => "axistickmajor"})
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,28 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # = Horizontal name axis
4
+ #
5
+ # Draws names of models instead of values, used for bar charts
6
+ class HorizontalNameAxis < Axis
7
+
8
+ def initialize(opts={})
9
+ @class = "haxis"
10
+ super(opts)
11
+ end
12
+
13
+ def int_render(g)
14
+ super
15
+
16
+ # p "Horiz name axis #{parent.anchor.element_spacing} spacing"
17
+ xp = @bounds.left + parent.anchor.element_spacing + parent.anchor.element_width/2
18
+ parent.modelgroup.each_model_with_index do |m,i|
19
+ yoff=get_stagger_off(i,10)
20
+ g.textout(xp, @bounds.top+15+yoff, m.name, {:class => "axislabel","text-anchor" => "middle"})
21
+ xp += parent.anchor.element_width + parent.anchor.element_spacing
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,25 @@
1
+ module GerbilCharts::Surfaces
2
+
3
+ # = HorizontalTimeAxis
4
+ # Draws time labels along x-axis
5
+ # Most charts use this type of x-axis in time series charts
6
+ class HorizontalTimeAxis < HorizontalAxis
7
+
8
+ def initialize(opts={})
9
+ @class = "haxis"
10
+ super(opts)
11
+ end
12
+
13
+ def int_render(g)
14
+ super
15
+
16
+ rx = parent.modelgroup.effective_round_range_x
17
+ sfmt = rx.format_min_value
18
+ g.textout(@bounds.left-20, @bounds.top+20, sfmt, {:class => "axislabelt0"})
19
+ g.line(@bounds.left,@bounds.top,@bounds.left,@bounds.top+10,{:class => "axistickmajor"})
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end