gruffy 0.0.2 → 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.
- checksums.yaml +4 -4
- data/lib/gruffy.rb +32 -0
- data/lib/gruffy/accumulator_bar.rb +18 -0
- data/lib/gruffy/area.rb +51 -0
- data/lib/gruffy/bar.rb +108 -0
- data/lib/gruffy/bar_conversion.rb +46 -0
- data/lib/gruffy/base.rb +1201 -0
- data/lib/gruffy/bezier.rb +46 -0
- data/lib/gruffy/bullet.rb +111 -0
- data/lib/gruffy/deprecated.rb +39 -0
- data/lib/gruffy/dot.rb +125 -0
- data/lib/gruffy/line.rb +365 -0
- data/lib/gruffy/mini/bar.rb +37 -0
- data/lib/gruffy/mini/legend.rb +114 -0
- data/lib/gruffy/mini/pie.rb +36 -0
- data/lib/gruffy/mini/side_bar.rb +35 -0
- data/lib/gruffy/net.rb +127 -0
- data/lib/gruffy/photo_bar.rb +100 -0
- data/lib/gruffy/pie.rb +271 -0
- data/lib/gruffy/scatter.rb +314 -0
- data/lib/gruffy/scene.rb +209 -0
- data/lib/gruffy/side_bar.rb +138 -0
- data/lib/gruffy/side_stacked_bar.rb +97 -0
- data/lib/gruffy/spider.rb +125 -0
- data/lib/gruffy/stacked_area.rb +67 -0
- data/lib/gruffy/stacked_bar.rb +61 -0
- data/lib/gruffy/stacked_mixin.rb +23 -0
- data/lib/gruffy/themes.rb +102 -0
- data/lib/gruffy/version.rb +3 -0
- data/rails_generators/gruffy/gruffy_generator.rb +63 -0
- data/rails_generators/gruffy/templates/controller.rb +32 -0
- data/rails_generators/gruffy/templates/functional_test.rb +24 -0
- metadata +33 -2
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
require File.dirname(__FILE__) + '/base'
|
3
|
+
require File.dirname(__FILE__) + '/stacked_mixin'
|
4
|
+
|
5
|
+
class Gruffy::StackedArea < Gruffy::Base
|
6
|
+
include StackedMixin
|
7
|
+
attr_accessor :last_series_goes_on_bottom
|
8
|
+
|
9
|
+
def draw
|
10
|
+
get_maximum_by_stack
|
11
|
+
super
|
12
|
+
|
13
|
+
return unless @has_data
|
14
|
+
|
15
|
+
@x_increment = @graph_width / (@column_count - 1).to_f
|
16
|
+
@d = @d.stroke 'transparent'
|
17
|
+
|
18
|
+
height = Array.new(@column_count, 0)
|
19
|
+
|
20
|
+
data_points = nil
|
21
|
+
iterator = last_series_goes_on_bottom ? :reverse_each : :each
|
22
|
+
@norm_data.send(iterator) do |data_row|
|
23
|
+
prev_data_points = data_points
|
24
|
+
data_points = Array.new
|
25
|
+
|
26
|
+
@d = @d.fill data_row[DATA_COLOR_INDEX]
|
27
|
+
|
28
|
+
data_row[DATA_VALUES_INDEX].each_with_index do |data_point, index|
|
29
|
+
# Use incremented x and scaled y
|
30
|
+
new_x = @graph_left + (@x_increment * index)
|
31
|
+
new_y = @graph_top + (@graph_height - data_point * @graph_height - height[index])
|
32
|
+
|
33
|
+
height[index] += (data_point * @graph_height)
|
34
|
+
|
35
|
+
data_points << new_x
|
36
|
+
data_points << new_y
|
37
|
+
|
38
|
+
draw_label(new_x, index)
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
if prev_data_points
|
43
|
+
poly_points = data_points.dup
|
44
|
+
(prev_data_points.length/2 - 1).downto(0) do |i|
|
45
|
+
poly_points << prev_data_points[2*i]
|
46
|
+
poly_points << prev_data_points[2*i+1]
|
47
|
+
end
|
48
|
+
poly_points << data_points[0]
|
49
|
+
poly_points << data_points[1]
|
50
|
+
else
|
51
|
+
poly_points = data_points.dup
|
52
|
+
poly_points << @graph_right
|
53
|
+
poly_points << @graph_bottom - 1
|
54
|
+
poly_points << @graph_left
|
55
|
+
poly_points << @graph_bottom - 1
|
56
|
+
poly_points << data_points[0]
|
57
|
+
poly_points << data_points[1]
|
58
|
+
end
|
59
|
+
@d = @d.polyline(*poly_points)
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
@d.draw(@base_image)
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
require File.dirname(__FILE__) + '/base'
|
3
|
+
require File.dirname(__FILE__) + '/stacked_mixin'
|
4
|
+
|
5
|
+
class Gruffy::StackedBar < Gruffy::Base
|
6
|
+
include StackedMixin
|
7
|
+
|
8
|
+
# Spacing factor applied between bars
|
9
|
+
attr_accessor :bar_spacing
|
10
|
+
|
11
|
+
# Number of pixels between bar segments
|
12
|
+
attr_accessor :segment_spacing
|
13
|
+
|
14
|
+
# Draws a bar graph, but multiple sets are stacked on top of each other.
|
15
|
+
def draw
|
16
|
+
get_maximum_by_stack
|
17
|
+
super
|
18
|
+
return unless @has_data
|
19
|
+
|
20
|
+
# Setup spacing.
|
21
|
+
#
|
22
|
+
# Columns sit stacked.
|
23
|
+
@bar_spacing ||= 0.9
|
24
|
+
@segment_spacing ||= 1
|
25
|
+
@bar_width = @graph_width / @column_count.to_f
|
26
|
+
padding = (@bar_width * (1 - @bar_spacing)) / 2
|
27
|
+
|
28
|
+
@d = @d.stroke_opacity 0.0
|
29
|
+
|
30
|
+
height = Array.new(@column_count, 0)
|
31
|
+
|
32
|
+
@norm_data.each_with_index do |data_row, row_index|
|
33
|
+
data_row[DATA_VALUES_INDEX].each_with_index do |data_point, point_index|
|
34
|
+
@d = @d.fill data_row[DATA_COLOR_INDEX]
|
35
|
+
|
36
|
+
# Calculate center based on bar_width and current row
|
37
|
+
label_center = @graph_left + (@bar_width * point_index) + (@bar_width * @bar_spacing / 2.0)
|
38
|
+
draw_label(label_center, point_index)
|
39
|
+
|
40
|
+
next if (data_point == 0)
|
41
|
+
# Use incremented x and scaled y
|
42
|
+
left_x = @graph_left + (@bar_width * point_index) + padding
|
43
|
+
left_y = @graph_top + (@graph_height -
|
44
|
+
data_point * @graph_height -
|
45
|
+
height[point_index]) + @segment_spacing
|
46
|
+
right_x = left_x + @bar_width * @bar_spacing
|
47
|
+
right_y = @graph_top + @graph_height - height[point_index] - @segment_spacing
|
48
|
+
|
49
|
+
# update the total height of the current stacked bar
|
50
|
+
height[point_index] += (data_point * @graph_height )
|
51
|
+
|
52
|
+
@d = @d.rectangle(left_x, left_y, right_x, right_y)
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
@d.draw(@base_image)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module Gruffy::Base::StackedMixin
|
3
|
+
# Used by StackedBar and child classes.
|
4
|
+
#
|
5
|
+
# tsal: moved from Base 03 FEB 2007
|
6
|
+
DATA_VALUES_INDEX = Gruffy::Base::DATA_VALUES_INDEX
|
7
|
+
def get_maximum_by_stack
|
8
|
+
# Get sum of each stack
|
9
|
+
max_hash = {}
|
10
|
+
@data.each do |data_set|
|
11
|
+
data_set[DATA_VALUES_INDEX].each_with_index do |data_point, i|
|
12
|
+
max_hash[i] = 0.0 unless max_hash[i]
|
13
|
+
max_hash[i] += data_point.to_f
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# @maximum_value = 0
|
18
|
+
max_hash.keys.each do |key|
|
19
|
+
@maximum_value = max_hash[key] if max_hash[key] > @maximum_value
|
20
|
+
end
|
21
|
+
@minimum_value = 0
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Gruffy
|
2
|
+
module Themes
|
3
|
+
|
4
|
+
# A color scheme similar to the popular presentation software.
|
5
|
+
KEYNOTE = {
|
6
|
+
:colors => [
|
7
|
+
'#FDD84E', # yellow
|
8
|
+
'#6886B4', # blue
|
9
|
+
'#72AE6E', # green
|
10
|
+
'#D1695E', # red
|
11
|
+
'#8A6EAF', # purple
|
12
|
+
'#EFAA43', # orange
|
13
|
+
'white'
|
14
|
+
],
|
15
|
+
:marker_color => 'white',
|
16
|
+
:font_color => 'white',
|
17
|
+
:background_colors => %w(black #4a465a)
|
18
|
+
}
|
19
|
+
|
20
|
+
# A color scheme plucked from the colors on the popular usability blog.
|
21
|
+
THIRTYSEVEN_SIGNALS = {
|
22
|
+
:colors => [
|
23
|
+
'#FFF804', # yellow
|
24
|
+
'#336699', # blue
|
25
|
+
'#339933', # green
|
26
|
+
'#ff0000', # red
|
27
|
+
'#cc99cc', # purple
|
28
|
+
'#cf5910', # orange
|
29
|
+
'black'
|
30
|
+
],
|
31
|
+
:marker_color => 'black',
|
32
|
+
:font_color => 'black',
|
33
|
+
:background_colors => %w(#d1edf5 white)
|
34
|
+
}
|
35
|
+
|
36
|
+
# A color scheme from the colors used on the 2005 Rails keynote
|
37
|
+
# presentation at RubyConf.
|
38
|
+
RAILS_KEYNOTE = {
|
39
|
+
:colors => [
|
40
|
+
'#00ff00', # green
|
41
|
+
'#333333', # grey
|
42
|
+
'#ff5d00', # orange
|
43
|
+
'#f61100', # red
|
44
|
+
'white',
|
45
|
+
'#999999', # light grey
|
46
|
+
'black'
|
47
|
+
],
|
48
|
+
:marker_color => 'white',
|
49
|
+
:font_color => 'white',
|
50
|
+
:background_colors => %w(#0083a3 #0083a3)
|
51
|
+
}
|
52
|
+
|
53
|
+
# A color scheme similar to that used on the popular podcast site.
|
54
|
+
ODEO = {
|
55
|
+
:colors => [
|
56
|
+
'#202020', # grey
|
57
|
+
'white',
|
58
|
+
'#3a5b87', # dark blue
|
59
|
+
'#a21764', # dark pink
|
60
|
+
'#8ab438', # green
|
61
|
+
'#999999', # light grey
|
62
|
+
'black'
|
63
|
+
],
|
64
|
+
:marker_color => 'white',
|
65
|
+
:font_color => 'white',
|
66
|
+
:background_colors => %w(#ff47a4 #ff1f81)
|
67
|
+
}
|
68
|
+
|
69
|
+
# A pastel theme
|
70
|
+
PASTEL = {
|
71
|
+
:colors => [
|
72
|
+
'#a9dada', # blue
|
73
|
+
'#aedaa9', # green
|
74
|
+
'#daaea9', # peach
|
75
|
+
'#dadaa9', # yellow
|
76
|
+
'#a9a9da', # dk purple
|
77
|
+
'#daaeda', # purple
|
78
|
+
'#dadada' # grey
|
79
|
+
],
|
80
|
+
:marker_color => '#aea9a9', # Grey
|
81
|
+
:font_color => 'black',
|
82
|
+
:background_colors => 'white'
|
83
|
+
}
|
84
|
+
|
85
|
+
# A greyscale theme
|
86
|
+
GREYSCALE = {
|
87
|
+
:colors => [
|
88
|
+
'#282828', #
|
89
|
+
'#383838', #
|
90
|
+
'#686868', #
|
91
|
+
'#989898', #
|
92
|
+
'#c8c8c8', #
|
93
|
+
'#e8e8e8', #
|
94
|
+
],
|
95
|
+
:marker_color => '#aea9a9', # Grey
|
96
|
+
:font_color => 'black',
|
97
|
+
:background_colors => 'white'
|
98
|
+
}
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class GruffyGenerator < Rails::Generator::NamedBase
|
2
|
+
|
3
|
+
attr_reader :controller_name,
|
4
|
+
:controller_class_path,
|
5
|
+
:controller_file_path,
|
6
|
+
:controller_class_nesting,
|
7
|
+
:controller_class_nesting_depth,
|
8
|
+
:controller_class_name,
|
9
|
+
:controller_singular_name,
|
10
|
+
:controller_plural_name,
|
11
|
+
:parent_folder_for_require
|
12
|
+
alias_method :controller_file_name, :controller_singular_name
|
13
|
+
alias_method :controller_table_name, :controller_plural_name
|
14
|
+
|
15
|
+
def initialize(runtime_args, runtime_options = {})
|
16
|
+
super
|
17
|
+
|
18
|
+
# Take controller name from the next argument.
|
19
|
+
@controller_name = runtime_args.shift
|
20
|
+
|
21
|
+
base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
|
22
|
+
@controller_class_name_without_nesting, @controller_singular_name, @controller_plural_name = inflect_names(base_name)
|
23
|
+
|
24
|
+
if @controller_class_nesting.empty?
|
25
|
+
@controller_class_name = @controller_class_name_without_nesting
|
26
|
+
else
|
27
|
+
@controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def manifest
|
32
|
+
record do |m|
|
33
|
+
# Check for class naming collisions.
|
34
|
+
m.class_collisions controller_class_path, "#{controller_class_name}Controller",
|
35
|
+
"#{controller_class_name}ControllerTest"
|
36
|
+
|
37
|
+
# Controller, helper, views, and test directories.
|
38
|
+
m.directory File.join('app/controllers', controller_class_path)
|
39
|
+
m.directory File.join('test/functional', controller_class_path)
|
40
|
+
|
41
|
+
m.template 'controller.rb',
|
42
|
+
File.join('app/controllers',
|
43
|
+
controller_class_path,
|
44
|
+
"#{controller_file_name}_controller.rb")
|
45
|
+
|
46
|
+
# For some reason this doesn't take effect if done in initialize()
|
47
|
+
@parent_folder_for_require = @controller_class_path.join('/').gsub(%r%app/controllers/?%, '')
|
48
|
+
@parent_folder_for_require += @parent_folder_for_require.blank? ? '' : '/'
|
49
|
+
|
50
|
+
m.template 'functional_test.rb',
|
51
|
+
File.join('test/functional',
|
52
|
+
controller_class_path,
|
53
|
+
"#{controller_file_name}_controller_test.rb")
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
# Override with your own usage banner.
|
60
|
+
def banner
|
61
|
+
"Usage: #{$0} gruffy ControllerName"
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class <%= controller_class_name %>Controller < ApplicationController
|
2
|
+
|
3
|
+
# To make caching easier, add a line like this to config/routes.rb:
|
4
|
+
# map.graph "graph/:action/:id/image.png", :controller => "graph"
|
5
|
+
#
|
6
|
+
# Then reference it with the named route:
|
7
|
+
# image_tag graph_url(:action => 'show', :id => 42)
|
8
|
+
|
9
|
+
def show
|
10
|
+
g = Gruffy::Line.new
|
11
|
+
# Uncomment to use your own theme or font
|
12
|
+
# See http://colourlovers.com or http://www.firewheeldesign.com/widgets/ for color ideas
|
13
|
+
# g.theme = {
|
14
|
+
# :colors => ['#663366', '#cccc99', '#cc6633', '#cc9966', '#99cc99'],
|
15
|
+
# :marker_color => 'white',
|
16
|
+
# :background_colors => ['black', '#333333']
|
17
|
+
# }
|
18
|
+
# g.font = File.expand_path('artwork/fonts/VeraBd.ttf', RAILS_ROOT)
|
19
|
+
|
20
|
+
g.title = "Gruffy-o-Rama"
|
21
|
+
|
22
|
+
g.data("Apples", [1, 2, 3, 4, 4, 3])
|
23
|
+
g.data("Oranges", [4, 8, 7, 9, 8, 9])
|
24
|
+
g.data("Watermelon", [2, 3, 1, 5, 6, 8])
|
25
|
+
g.data("Peaches", [9, 9, 10, 8, 7, 9])
|
26
|
+
|
27
|
+
g.labels = {0 => '2004', 2 => '2005', 4 => '2006'}
|
28
|
+
|
29
|
+
send_data(g.to_blob, :disposition => 'inline', :type => 'image/png', :filename => "gruffy.png")
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.dirname(__FILE__) + '<%= '/..' * controller_class_name.split("::").length %>/test_helper'
|
2
|
+
require '<%= parent_folder_for_require %><%= controller_file_name %>_controller'
|
3
|
+
|
4
|
+
# Re-raise errors caught by the controller.
|
5
|
+
class <%= controller_class_name %>Controller; def rescue_action(e) raise e end; end
|
6
|
+
|
7
|
+
class <%= controller_class_name %>ControllerTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
#fixtures :data
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@controller = <%= controller_class_name %>Controller.new
|
13
|
+
@request = ActionController::TestRequest.new
|
14
|
+
@response = ActionController::TestResponse.new
|
15
|
+
end
|
16
|
+
|
17
|
+
# TODO Replace this with your actual tests
|
18
|
+
def test_show
|
19
|
+
get :show
|
20
|
+
assert_response :success
|
21
|
+
assert_equal 'image/png', @response.headers['Content-Type']
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gruffy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wuttikrai Limsakul
|
@@ -64,7 +64,38 @@ email:
|
|
64
64
|
executables: []
|
65
65
|
extensions: []
|
66
66
|
extra_rdoc_files: []
|
67
|
-
files:
|
67
|
+
files:
|
68
|
+
- lib/gruffy.rb
|
69
|
+
- lib/gruffy/accumulator_bar.rb
|
70
|
+
- lib/gruffy/area.rb
|
71
|
+
- lib/gruffy/bar.rb
|
72
|
+
- lib/gruffy/bar_conversion.rb
|
73
|
+
- lib/gruffy/base.rb
|
74
|
+
- lib/gruffy/bezier.rb
|
75
|
+
- lib/gruffy/bullet.rb
|
76
|
+
- lib/gruffy/deprecated.rb
|
77
|
+
- lib/gruffy/dot.rb
|
78
|
+
- lib/gruffy/line.rb
|
79
|
+
- lib/gruffy/mini/bar.rb
|
80
|
+
- lib/gruffy/mini/legend.rb
|
81
|
+
- lib/gruffy/mini/pie.rb
|
82
|
+
- lib/gruffy/mini/side_bar.rb
|
83
|
+
- lib/gruffy/net.rb
|
84
|
+
- lib/gruffy/photo_bar.rb
|
85
|
+
- lib/gruffy/pie.rb
|
86
|
+
- lib/gruffy/scatter.rb
|
87
|
+
- lib/gruffy/scene.rb
|
88
|
+
- lib/gruffy/side_bar.rb
|
89
|
+
- lib/gruffy/side_stacked_bar.rb
|
90
|
+
- lib/gruffy/spider.rb
|
91
|
+
- lib/gruffy/stacked_area.rb
|
92
|
+
- lib/gruffy/stacked_bar.rb
|
93
|
+
- lib/gruffy/stacked_mixin.rb
|
94
|
+
- lib/gruffy/themes.rb
|
95
|
+
- lib/gruffy/version.rb
|
96
|
+
- rails_generators/gruffy/gruffy_generator.rb
|
97
|
+
- rails_generators/gruffy/templates/controller.rb
|
98
|
+
- rails_generators/gruffy/templates/functional_test.rb
|
68
99
|
homepage: https://rubygems.org/gems/gruffy
|
69
100
|
licenses:
|
70
101
|
- MIT
|