chart_js 1.0.1pre → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7f13b0859e5ac864e7cccebeced78fd8d346760f
4
- data.tar.gz: 81b71502bcd6a500b2059f62adac77c4e1497483
2
+ SHA256:
3
+ metadata.gz: e954b9160710621bd2ab2e31e6b331bd3a91d5b51034aa34067d64cc1fd505f7
4
+ data.tar.gz: 62d724692b5cc246de04e93077cc1d913a0897d3aa3a8409c2204d28066b059b
5
5
  SHA512:
6
- metadata.gz: 37a8343901fee4db6a17bb7f7bb9f8835446a386a99802e37c47b096c709f9d6648455008185012df14c1cf124cc71123dde7ba9a80b36bd80cb67c65a469b67
7
- data.tar.gz: b28bd3c2f1f3f0ac4e47828a1e1f65fa8398bdcac9c14ea1f62ace9b99c5a9ee12346c02e15c90aad5282f074ba7bb201a27ea8c1ac9e49097d547e2fb3230f9
6
+ metadata.gz: 63eeb922760959d2211eaefbb3afb6734d2df3796fd92cb51d92ae341f1ad899886ea950f23c03ed55c19904dbaafa8bbd29b4c6d4f1f133f13a779070dd5745
7
+ data.tar.gz: a659fa4048fe4169464055f8d242b6045812035fce1631bf2fffd4becc9c607c1cf5cbfef5c6f81b3e8e47773cec8e77b23f9c96edd5ece78680476dc04b0927
data/README.md CHANGED
@@ -4,9 +4,7 @@
4
4
 
5
5
  ## Installation
6
6
 
7
- This gem is still in development. Install with `--pre`.
8
-
9
- $ gem install chart_js --pre
7
+ $ gem install chart_js
10
8
 
11
9
  ## Usage
12
10
 
@@ -17,11 +17,12 @@ Gem::Specification.new do |spec|
17
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
18
  f.match(%r{^(test|spec|features)/})
19
19
  end
20
- spec.bindir = "exe"
21
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ # spec.bindir = "exe"
21
+ # spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.15"
25
- spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency "bundler", "~> 2.1"
25
+ spec.add_development_dependency "rake", "~> 13.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
+ spec.add_development_dependency "pry", "~> 0.12"
27
28
  end
@@ -0,0 +1,14 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+
5
+ ChartJS.bar do
6
+ file "example.html"
7
+ data do
8
+ labels ["a", "b", "c"]
9
+ dataset "Example" do
10
+ color :random
11
+ data [1, 2, 3]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,35 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+ require "willow_run"
5
+ require "sinatra"
6
+
7
+ set :bind, '0.0.0.0'
8
+ set :port, 3141
9
+
10
+ get "/update_source", provides: 'text/event-stream' do
11
+ stream(:keep_open) do |out|
12
+ loop do
13
+ out << ChartJS.data do
14
+ { label: Time.now.strftime("%r"), value: WillowRun::Status.new.getinfo.agrctlrssi }
15
+ end
16
+ sleep 2
17
+ end
18
+ end
19
+ end
20
+
21
+ get "/" do
22
+ chart = ChartJS.bar do
23
+ data do
24
+ labels Array.new
25
+ dataset WillowRun::Status.new.getinfo.ssid do
26
+ color :random
27
+ data Array.new
28
+ end
29
+ end
30
+ event_stream "/update_source" do
31
+ push
32
+ end
33
+ end
34
+ chart.to_html
35
+ end
@@ -0,0 +1,33 @@
1
+ ## path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+ ChartJS.doughnut do
5
+ file "example.html"
6
+ data do
7
+ dataset "a" do
8
+ color :random
9
+ data 1
10
+ end
11
+ dataset "b" do
12
+ color :random
13
+ data 2
14
+ end
15
+ dataset "c" do
16
+ color :random
17
+ data 3
18
+ end
19
+ end
20
+ end
21
+ #ChartJS.doughnut do
22
+ # file "example.html"
23
+ # data do
24
+ # dataset "Good" do
25
+ # color "#5cb85c"
26
+ # data 20
27
+ # end
28
+ # dataset "Bad" do
29
+ # color "#d9534f"
30
+ # data 4
31
+ # end
32
+ # end
33
+ #end
@@ -0,0 +1,14 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+
5
+ ChartJS.line do
6
+ file "example.html"
7
+ data do
8
+ labels ["a", "b", "c"]
9
+ dataset "Example" do
10
+ color :random
11
+ data [1, 2, 3]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,46 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+ require "willow_run"
5
+ require "sinatra"
6
+
7
+ set :bind, '0.0.0.0'
8
+ set :port, 3141
9
+
10
+ get "/update_source", provides: 'text/event-stream' do
11
+ stream(:keep_open) do |out|
12
+ loop do
13
+ out << ChartJS.data do
14
+ { label: Time.now.strftime("%r"),
15
+ value: WillowRun::Status.new.getinfo.agrctlrssi
16
+ color: "##{SecureRandom.hex(6)}"
17
+ }
18
+ end
19
+ sleep 5
20
+ end
21
+ end
22
+ end
23
+
24
+ get "/" do
25
+ chart = ChartJS.build do
26
+ type "line"
27
+ data do
28
+ labels Array.new
29
+ dataset WillowRun::Status.new.getinfo.ssid do
30
+ color Array.new
31
+ data Array.new
32
+ point do
33
+ radius 0
34
+ hit_radius 3
35
+ end
36
+ line do
37
+ tension :false
38
+ end
39
+ end
40
+ end
41
+ event_stream "/update_source" do
42
+ push
43
+ end
44
+ end
45
+ chart.to_html
46
+ end
@@ -0,0 +1,21 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+
5
+ ChartJS.pie do
6
+ file "example.html"
7
+ data do
8
+ dataset "a" do
9
+ color :random
10
+ data 1
11
+ end
12
+ dataset "b" do
13
+ color :random
14
+ data 2
15
+ end
16
+ dataset "c" do
17
+ color :random
18
+ data 3
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+
5
+ ChartJS.radar do
6
+ file "example.html"
7
+ data do
8
+ labels ["a", "b", "c"]
9
+ dataset "Example" do
10
+ color :random
11
+ data [1, 2, 3]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,39 @@
1
+ # path setting magic for example directory only
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
3
+ require "chart_js"
4
+ require "willow_run"
5
+ require "sinatra"
6
+
7
+ get "/update_source", provides: 'text/event-stream' do
8
+ stream(:keep_open) do |out|
9
+ loop do
10
+ out << ChartJS.data do
11
+ { label: Time.now.strftime("%r"), data: WillowRun::Status.new.getinfo.agrctlrssi }
12
+ end
13
+ sleep 2
14
+ end
15
+ end
16
+ end
17
+
18
+ get "/" do
19
+ chart = ChartJS.line do
20
+ data do
21
+ labels Array.new
22
+ dataset WillowRun::Status.new.getinfo.ssid do
23
+ color :random
24
+ data Array.new
25
+ point do
26
+ radius 0
27
+ hit_radius 2
28
+ end
29
+ line do
30
+ tension :false
31
+ end
32
+ end
33
+ end
34
+ event_stream "/update_source" do
35
+ push
36
+ end
37
+ end
38
+ chart.to_html
39
+ end
@@ -1,21 +1,88 @@
1
+ # coding: utf-8
2
+ # This file is part of ChartJS
3
+ # See https://github.com/picatz/chart_js for more information.
4
+ # Copyright (C) 2017 Kent 'picat' Gruber
5
+ # This program is published under MIT license.
6
+
1
7
  require "chart_js/version"
2
8
  require "chart_js/chart/chart"
3
- require "chart_js/chart/charts"
4
9
 
10
+ # Chart JS is a simple yet flexible JavaScript charting library. This
11
+ # gem is a Ruby Domain Specific Language which allows you to easily
12
+ # build charts without touching a single line of JavaScript or HTML.
13
+ # @author Kent 'picat' Gruber
5
14
  module ChartJS
15
+ # NOTE: I did not write every word of this inline documentation and credit
16
+ # much of it to to people over at http://www.chartjs.org/
17
+
18
+ # Build a chart, do some stuff!
6
19
  def self.build(&block)
7
20
  Chart.new(&block)
8
21
  end
9
-
22
+
23
+ # A line chart is a way of plotting data points on a line. Often,
24
+ # it is used to show trend data, or the comparison of two data sets.
10
25
  def self.line(&block)
11
- Charts.line(&block)
26
+ chart = Chart.new
27
+ chart.type('line')
28
+ chart.build(&block)
12
29
  end
13
30
 
31
+ # A radar chart is a way of showing multiple data points and
32
+ # the variation between them. They are often useful for
33
+ # comparing the points of two or more different data sets.
14
34
  def self.radar(&block)
15
- Charts.radar(&block)
35
+ chart = Chart.new
36
+ chart.type('radar')
37
+ chart.build(&block)
38
+ end
39
+
40
+ # Pie charts are probably one of the most commonly used charts.
41
+ # They are divided into segments, the arc of each segment
42
+ # shows the proportional value of each piece of data. They are
43
+ # excellent at showing the relational proportions between data.
44
+ def self.pie(&block)
45
+ chart = Chart.new
46
+ chart.type('pie')
47
+ chart.build(&block)
16
48
  end
17
-
18
- def self.bar(&block)
19
- Charts.bar(&block)
49
+
50
+ # Doughnut charts are probably one of the most commonly used charts.
51
+ # They are divided into segments, the arc of each segment
52
+ # shows the proportional value of each piece of data. They are
53
+ # excellent at showing the relational proportions between data but
54
+ # with a big'O hole in the middle.
55
+ def self.doughnut(&block)
56
+ chart = Chart.new
57
+ chart.type('doughnut')
58
+ chart.build(&block)
59
+ end
60
+
61
+ # A bar chart provides a way of showing data values represented
62
+ # as vertical bars. It is sometimes used to show trend data,
63
+ # and the comparison of multiple data sets side by side.
64
+ def self.bar(type = :vertical, &block)
65
+ chart = Chart.new
66
+ case type
67
+ when :vertical
68
+ chart.type('bar')
69
+ when :horizontal
70
+ chart.type('horizontalBar')
71
+ end
72
+ chart.build(&block)
73
+ end
74
+
75
+ # Need to send some server-side event data? You found your method. Optionally, it'll
76
+ # even call the "to_json" on the object your sending ( if it accepts
77
+ # that method call ); otherwise you should really only send
78
+ # JSON that is already formatted. Otherwise it'll just send the plaintext.
79
+ #
80
+ # Live life the way you want to.
81
+ def self.data(json: false, &block)
82
+ if json
83
+ "data: #{block.call} \r\n\n"
84
+ else
85
+ "data: #{block.call.to_json} \r\n\n"
86
+ end
20
87
  end
21
88
  end
@@ -44,7 +44,7 @@ module ChartJS
44
44
  @opts = Opts.new.build(&block)
45
45
  end
46
46
 
47
- def cdn(version: "2.6.0", min: true)
47
+ def cdn(version: "2.9.3", min: true)
48
48
  if min
49
49
  "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/#{version}/Chart.min.js\"></script>"
50
50
  else
@@ -67,13 +67,13 @@ module ChartJS
67
67
  var ctx = document.getElementById(\"#{id}\").getContext(\"2d\");
68
68
  new Chart(ctx, config);
69
69
  };
70
- </script>"
70
+ </script>"
71
71
  end
72
72
 
73
73
  def to_html(width: "60%", heigth: width, head: true, cdn: head, version: "2.6.0", body: true, id: random_id, script: true)
74
74
  str = []
75
75
  if cdn
76
- str << "<head>#{cdn(version: version)}</head>"
76
+ str << "<head>#{cdn(version: version)}</head>"
77
77
  end
78
78
  str << "<body>" if body
79
79
  str << "<div id=\"canvas-holder\" style=\"width:#{width} heigth:#{heigth}\">"
@@ -3,16 +3,19 @@ require "securerandom"
3
3
  require_relative "data.rb"
4
4
  require_relative "opts.rb"
5
5
  require_relative "file.rb"
6
+ require_relative "event_stream.rb"
6
7
 
7
8
  module ChartJS
8
9
 
9
10
  class Chart
10
11
 
11
12
  def initialize(&block)
12
- @type = nil
13
- @data = nil
14
- @opts = nil
15
- @file = false
13
+ @type = nil
14
+ @data = nil
15
+ @opts = nil
16
+ @file = false
17
+ @stream = false
18
+ @chart_obj = 'chart' + SecureRandom.uuid.gsub("-","")
16
19
  build(&block) if block_given?
17
20
  end
18
21
 
@@ -26,7 +29,21 @@ module ChartJS
26
29
  end
27
30
 
28
31
  def to_h
29
- { type: @type, data: @data.to_h, options: @opts.to_h }
32
+ case type
33
+ when 'pie'
34
+ { type: @type, data: @data.to_h(:pie), options: @opts.to_h }
35
+ when 'doughnut'
36
+ { type: @type, data: @data.to_h(:pie), options: @opts.to_h }
37
+ when 'line'
38
+ data = @data.to_h(false)
39
+ data['datasets'].each do |set|
40
+ set['fill'] = false unless set['fill']
41
+ end
42
+ #data['fill'] = false unless data['fill']
43
+ { type: @type, data: data, options: @opts.to_h }
44
+ else
45
+ { type: @type, data: @data.to_h(false), options: @opts.to_h }
46
+ end
30
47
  end
31
48
 
32
49
  def to_json(type = :pretty)
@@ -49,7 +66,7 @@ module ChartJS
49
66
  @opts = Opts.new.build(&block)
50
67
  end
51
68
 
52
- def cdn(version: "2.6.0", min: true)
69
+ def cdn(version: "2.9.3", min: true)
53
70
  if min
54
71
  "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/#{version}/Chart.min.js\"></script>"
55
72
  else
@@ -61,31 +78,42 @@ module ChartJS
61
78
  "##{SecureRandom.hex(3)}"
62
79
  end
63
80
 
64
- def random_id
65
- SecureRandom.uuid
81
+ def chart_obj(value = nil)
82
+ return @chart_obj if value.nil?
83
+ @chart_obj = value
84
+ end
85
+
86
+ def random_id(force: false)
87
+ return @id unless @id.nil? or force
88
+ @id = SecureRandom.uuid
89
+ end
90
+
91
+
92
+ def event_stream(path, chart: chart_obj, &block)
93
+ @stream = EventStream.new(path, chart)
94
+ @stream.build(&block) if block_given?
66
95
  end
67
96
 
68
- def script(config: to_json, id: random_id, chart_name: id)
97
+ def script(config: to_json, id: random_id, chart: chart_obj)
69
98
  "<script>
70
99
  var config = #{config}
71
- window.onload = function() {
72
- var ctx = document.getElementById(\"#{id}\").getContext(\"2d\");
73
- var #{chart_name} = new Chart(ctx, config);
74
- };
75
- </script>"
100
+ var ctx = document.getElementById(\"#{id}\").getContext(\"2d\");
101
+ var #{chart} = new Chart(ctx, config);
102
+ </script>"
76
103
  end
77
104
 
78
- def to_html(width: "60%", heigth: width, head: true, cdn: head, version: "2.6.0", body: true, id: random_id, script: true, chart_name: id)
105
+ def to_html(width: "60%", heigth: width, head: true, cdn: head, version: "2.6.0", body: true, id: random_id, script: true, chart: chart_obj, stream: true)
79
106
  str = []
80
107
  if cdn
81
- str << "<head>#{cdn(version: version)}</head>"
108
+ str << "<head>#{cdn(version: version)}</head>"
82
109
  end
83
110
  str << "<body>" if body
84
111
  str << "<div id=\"canvas-holder\" style=\"width:#{width} heigth:#{heigth}\">"
85
112
  str << "<canvas id=\"#{id}\"/>"
86
113
  str << "</div>"
87
114
  str << "</body>" if body
88
- str << script(id: id, chart_name: chart_name) if script
115
+ str << script(id: id, chart: chart) if script
116
+ str << @stream.to_html if @stream && stream
89
117
  str.join("\n")
90
118
  end
91
119
 
@@ -1,14 +1,17 @@
1
1
  require_relative "dataset.rb"
2
+ require_relative "helpers/dates.rb"
2
3
 
3
4
  module ChartJS
4
5
 
5
6
  class Data
6
7
 
8
+ include Helpers::Dates
9
+
7
10
  def initialize
8
11
  @container = Hash.new
9
12
  @datasets = Hash.new
10
13
  end
11
-
14
+
12
15
  def build(&block)
13
16
  instance_eval(&block)
14
17
  self
@@ -23,13 +26,34 @@ module ChartJS
23
26
  @datasets[label] = Dataset.new(label, &block)
24
27
  end
25
28
 
26
- def to_h
27
- cont = @container.dup
28
- cont['datasets'] = []
29
- @datasets.each do |_, data|
30
- cont['datasets'] << data.to_h
29
+ def to_h(type)
30
+ case type
31
+ when :pie
32
+ @container
33
+ @container['labels'] = Array.new
34
+ @container['datasets'] = Array.new
35
+ @container['datasets'] << Hash.new
36
+ @datasets.each do |label, data|
37
+ @container['labels'] << label
38
+ data.to_h.each do |key, value|
39
+ if @container['datasets'][0][key].is_a? Array
40
+ @container['datasets'][0][key] << value
41
+ else
42
+ @container['datasets'][0][key] = Array.new
43
+ @container['datasets'][0][key] << value
44
+ end
45
+ end
46
+ end
47
+ @container
48
+ else
49
+ cont = @container.dup
50
+ cont['datasets'] = []
51
+ @datasets.each do |_, data|
52
+ cont['datasets'] << data.to_h
53
+ end
54
+ cont
55
+
31
56
  end
32
- cont
33
57
  end
34
58
 
35
59
  end
@@ -9,7 +9,7 @@ module ChartJS
9
9
 
10
10
  def initialize(label, &block)
11
11
  @container = Hash.new
12
- fill(false)
12
+ #fill(false)
13
13
  label(label)
14
14
  build(&block)
15
15
  end
@@ -10,7 +10,32 @@ module ChartJS
10
10
  instance_eval(&block)
11
11
  @container
12
12
  end
13
+
14
+ def stepped(value = true)
15
+ @container['steppedLine'] = case value
16
+ when true # Step-before Interpolation -> eq "before"
17
+ true
18
+ when false # No Step Interpolation
19
+ false
20
+ when :before || "before"
21
+ "before"
22
+ when :after || "after"
23
+ "after"
24
+ else
25
+ raise "Oops."
26
+ end
27
+ end
13
28
 
29
+ def tension(value = 1)
30
+ if value.is_a? Integer
31
+ @container['lineTension'] = value
32
+ elsif value == "flase" || value == :false
33
+ @container['lineTension'] = 0
34
+ else
35
+ raise "Oops"
36
+ end
37
+ end
38
+
14
39
  end
15
40
 
16
41
  end
@@ -0,0 +1,68 @@
1
+ require_relative 'event_streams/event_streams'
2
+
3
+ module ChartJS
4
+
5
+ class EventStream
6
+
7
+ def to_html(source: @path, chart: @chart)
8
+ str = ""
9
+ str << "<script>\n"
10
+ str << "var source = new EventSource('#{path}');\n"
11
+ str << "var json;\n"
12
+ str << @counter if @counter
13
+ str << @push.to_s if @push
14
+ str << @pop if @pop
15
+ str << @raw if @raw
16
+ str << "</script>\n"
17
+ end
18
+
19
+ def push(dataset: 0, chart: @chart, &block)
20
+ @push = EventStreams.push(dataset: dataset, chart: @chart, &block)
21
+ end
22
+
23
+ #def count(dataset: 0, chart: @chart, &block)
24
+
25
+
26
+ #end
27
+
28
+ def raw(chart: @chart, str: nil, file: nil, without_source: true, update: true)
29
+ @raw = ""
30
+ @raw = @raw + "source.onmessage = function(e) { json = JSON.parse(e.data);"
31
+ return @raw if str.nil? and file.nil?
32
+ @raw = @raw + str unless str.nil?
33
+ @raw = @raw + File.readlines(file) unless file.nil?
34
+ @rar = @raw + "#{chart}.update();" if update
35
+ @raw = @raw + "};"
36
+ end
37
+
38
+ def counter(dataset:, chart: @chart, counter: "counter")
39
+ str = ""
40
+ str << "var #{counter} = 0;\n"
41
+ str << "source.onmessage = function(e) { #{counter} += 1 };\n"
42
+ end
43
+
44
+ def chart(chart_obj = nil)
45
+ return @chart if chart_obj.nil?
46
+ @chart = chart_obj
47
+ end
48
+
49
+ def initialize(path, chart)
50
+ @push = nil
51
+ chart(chart)
52
+ path(path)
53
+ build(block) if block_given?
54
+ end
55
+
56
+ def build(&block)
57
+ instance_eval(&block)
58
+ self
59
+ end
60
+
61
+ def path(value = nil)
62
+ return @path if value.nil?
63
+ @path = value
64
+ end
65
+
66
+ end
67
+
68
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'push'
2
+
3
+ module ChartJS
4
+
5
+ module EventStreams
6
+ def self.push(chart:, dataset:, &block)
7
+ Push.new(chart: chart, dataset: dataset, &block)
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,80 @@
1
+ module ChartJS
2
+
3
+ module EventStreams
4
+ class Push
5
+ def initialize(chart:, dataset:, &block)
6
+ @str = ""
7
+ @chart = chart
8
+ dataset(dataset)
9
+ @str << "source.onmessage = function(e) { \n"
10
+ @str << "json = JSON.parse(e.data);\n"
11
+ base(json: 'data', dataset: dataset, chart: chart)
12
+ @str << "if(json.label){ #{chart}.data.labels.push(json.label); }\n"
13
+ @str << "#{chart}.update();\n"
14
+ build(&block) if block_given?
15
+ @str << "\n};"
16
+ end
17
+
18
+ def build(&block)
19
+ instance_eval(&block)
20
+ self
21
+ end
22
+
23
+ def dataset(value = nil)
24
+ return @dataset || 0 if value.nil?
25
+ @dataset = value
26
+ end
27
+
28
+ def point(type, chart: @chart, dataset: @dataset)
29
+ case type
30
+ when :hit_radius
31
+ base(json: 'pointHitRadius', dataset: dataset, chart: chart)
32
+ when :style
33
+ base(json: 'point_style', dataset: dataset, chart: chart)
34
+ when :border
35
+ color :border, chart: chart, dataset: dataset
36
+ base(json: 'pointBorder', dataset: dataset, chart: chart)
37
+ base(json: 'pointBorderWidth', dataset: dataset, chart: chart)
38
+ when :radius
39
+ base(json: 'pointRadius', dataset: dataset, chart: chart)
40
+ when :hover_radius
41
+ base(json: 'pointHoverRadius', dataset: dataset, chart: chart)
42
+ else
43
+ point :hit_radius, chart: chart, dataset: dataset
44
+ point :style, chart: chart, dataset: dataset
45
+ point :border, chart: chart, dataset: dataset
46
+ point :hover_radius, chart: chart, dataset: dataset
47
+ end
48
+ end
49
+
50
+ def color(type, chart: @chart, dataset: @dataset)
51
+ case type
52
+ when :background
53
+ base(json: 'backgroundColor', dataset: dataset, chart: chart)
54
+ when :border
55
+ base(json: 'borderColor', dataset: dataset, chart: chart)
56
+ when :point
57
+ base(json: 'pointBackgroundColor', dataset: dataset, chart: chart)
58
+ base(json: 'pointBorderColor', dataset: dataset, chart: chart)
59
+ base(json: 'pointHoverBackgroundColor', dataset: dataset, chart: chart)
60
+ base(json: 'pointHoverBorderColor', dataset: dataset, chart: chart)
61
+ base(json: 'pointHoverBorderColor', dataset: dataset, chart: chart)
62
+ base(json: 'pointHoverBorderColor', dataset: dataset, chart: chart)
63
+ else
64
+ color :background, chart: chart, dataset: dataset
65
+ color :border, chart: chart, dataset: dataset
66
+ color :point, chart: chart, dataset: dataset
67
+ end
68
+ end
69
+
70
+ def base(json:, chart:, dataset:, raw: false)
71
+ @str << "if(json.#{json}){ #{chart}.data.datasets[#{dataset}].#{json}.push(json.#{json}); }\n"
72
+ end
73
+
74
+ def to_s
75
+ @str
76
+ end
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,54 @@
1
+ require 'date'
2
+
3
+ module ChartJS
4
+
5
+ module Helpers
6
+
7
+ module Dates
8
+ WORK_DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
9
+ MONDAY_TO_SUNDAY = WORK_DAYS + ['Saturday', 'Sunday']
10
+
11
+ def days_of_the_week(abrv: false)
12
+ days = if abrv
13
+ Date::DAYNAMES
14
+ else
15
+ Date::ABBR_DAYNAMES
16
+ end
17
+ return days unless block_given?
18
+ days.each do |day|
19
+ yield day
20
+ end
21
+ end
22
+
23
+ def work_days
24
+ return WORK_DAYS unless block_given?
25
+ WORK_DAYS.each do |day|
26
+ yield day
27
+ end
28
+ end
29
+
30
+ alias monday_to_friday work_days
31
+
32
+ def monday_to_sunday
33
+ return MONDAY_TO_SUNDAY unless block_given?
34
+ MONDAY_TO_SUNDAY.each do |day|
35
+ yield day
36
+ end
37
+ end
38
+
39
+ def months_of_the_year(abrv: false)
40
+ months = if abrv
41
+ Date::MONTHNAMES.reject(&:nil?)
42
+ else
43
+ Date::ABBR_MONTHNAMES.reject(&:nil?)
44
+ end
45
+ return months unless block_given?
46
+ months.each do |month|
47
+ yield month
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -44,7 +44,7 @@ module ChartJS
44
44
  @opts = Opts.new.build(&block)
45
45
  end
46
46
 
47
- def cdn(version: "2.6.0", min: true)
47
+ def cdn(version: "2.9.3", min: true)
48
48
  if min
49
49
  "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/#{version}/Chart.min.js\"></script>"
50
50
  else
@@ -70,13 +70,13 @@ module ChartJS
70
70
  // var ctx = document.getElementById(\"#{id}\").getContext(\"2d\");
71
71
  // var #{chart_name.gsub("-","_")} = new Chart(ctx, config);
72
72
  //};
73
- </script>"
73
+ </script>"
74
74
  end
75
75
 
76
76
  def to_html(width: "60%", heigth: width, head: true, cdn: head, version: "2.6.0", body: true, id: random_id, script: true, chart_name: "line_chart")
77
77
  str = []
78
78
  if cdn
79
- str << "<head>#{cdn(version: version)}</head>"
79
+ str << "<head>#{cdn(version: version)}</head>"
80
80
  end
81
81
  str << "<body>" if body
82
82
  str << "<div id=\"canvas-holder\" style=\"width:#{width} heigth:#{heigth}\">"
@@ -1,18 +1,25 @@
1
- require_relative "dataset.rb"
2
-
3
1
  module ChartJS
4
2
 
5
- class Options
3
+ class Opts
6
4
 
7
5
  def initialize
8
6
  @container = Hash.new
9
7
  end
10
-
8
+
11
9
  def build(&block)
12
10
  instance_eval(&block)
13
11
  @container
14
12
  end
15
13
 
14
+ def cutout(value = nil)
15
+ return @container['cutoutPercentage'] if value.nil?
16
+ @container['cutoutPercentage'] = value
17
+ end
18
+
19
+ def to_h
20
+ @container
21
+ end
22
+
16
23
  end
17
24
 
18
25
  end
@@ -6,7 +6,7 @@ require_relative "file.rb"
6
6
 
7
7
  module ChartJS
8
8
 
9
- class RadarChart
9
+ class RadarChart
10
10
 
11
11
  def initialize(&block)
12
12
  @type = "radar"
@@ -44,7 +44,7 @@ module ChartJS
44
44
  @opts = Opts.new.build(&block)
45
45
  end
46
46
 
47
- def cdn(version: "2.6.0", min: true)
47
+ def cdn(version: "2.9.3", min: true)
48
48
  if min
49
49
  "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/#{version}/Chart.min.js\"></script>"
50
50
  else
@@ -67,13 +67,13 @@ module ChartJS
67
67
  var ctx = document.getElementById(\"#{id}\").getContext(\"2d\");
68
68
  new Chart(ctx, config);
69
69
  };
70
- </script>"
70
+ </script>"
71
71
  end
72
72
 
73
73
  def to_html(width: "60%", heigth: width, head: true, cdn: head, version: "2.6.0", body: true, id: random_id, script: true)
74
74
  str = []
75
75
  if cdn
76
- str << "<head>#{cdn(version: version)}</head>"
76
+ str << "<head>#{cdn(version: version)}</head>"
77
77
  end
78
78
  str << "<body>" if body
79
79
  str << "<div id=\"canvas-holder\" style=\"width:#{width} heigth:#{heigth}\">"
@@ -1,3 +1,3 @@
1
1
  module ChartJS
2
- VERSION = "1.0.1pre"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chart_js
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1pre
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent 'picat' Gruber
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-01 00:00:00.000000000 Z
11
+ date: 2020-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: '2.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.15'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.12'
55
69
  description:
56
70
  email:
57
71
  - kgruber1@emich.edu
@@ -61,21 +75,26 @@ extra_rdoc_files: []
61
75
  files:
62
76
  - ".gitignore"
63
77
  - ".rspec"
64
- - ".travis.yml"
65
78
  - CODE_OF_CONDUCT.md
66
79
  - Gemfile
67
80
  - LICENSE.txt
68
81
  - README.md
69
82
  - Rakefile
70
- - bin/console
71
- - bin/setup
72
83
  - chart_js.gemspec
73
84
  - examples/bar_chart.rb
85
+ - examples/bar_chart_2.rb
86
+ - examples/bar_chart_event_stream.rb
74
87
  - examples/build.rb
75
88
  - examples/debug.rb
89
+ - examples/doughnut_chart.rb
76
90
  - examples/line_chart.rb
91
+ - examples/line_chart_2.rb
92
+ - examples/line_chart_event_stream.rb
93
+ - examples/pie_chart.rb
77
94
  - examples/radar_chart.rb
95
+ - examples/radar_chart_2.rb
78
96
  - examples/sinatra.rb
97
+ - examples/wifi_signal_chart.rb
79
98
  - lib/chart_js.rb
80
99
  - lib/chart_js/chart/bar_chart/background.rb
81
100
  - lib/chart_js/chart/bar_chart/bar_chart.rb
@@ -95,7 +114,6 @@ files:
95
114
  - lib/chart_js/chart/bar_chart/point_border.rb
96
115
  - lib/chart_js/chart/bar_chart/point_hover.rb
97
116
  - lib/chart_js/chart/chart.rb
98
- - lib/chart_js/chart/charts.rb
99
117
  - lib/chart_js/chart/data.rb
100
118
  - lib/chart_js/chart/dataset.rb
101
119
  - lib/chart_js/chart/dataset/background.rb
@@ -104,7 +122,11 @@ files:
104
122
  - lib/chart_js/chart/dataset/point.rb
105
123
  - lib/chart_js/chart/dataset/point_border.rb
106
124
  - lib/chart_js/chart/dataset/point_hover.rb
125
+ - lib/chart_js/chart/event_stream.rb
126
+ - lib/chart_js/chart/event_streams/event_streams.rb
127
+ - lib/chart_js/chart/event_streams/push.rb
107
128
  - lib/chart_js/chart/file.rb
129
+ - lib/chart_js/chart/helpers/dates.rb
108
130
  - lib/chart_js/chart/line_chart/background.rb
109
131
  - lib/chart_js/chart/line_chart/border.rb
110
132
  - lib/chart_js/chart/line_chart/data.rb
@@ -156,12 +178,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
156
178
  version: '0'
157
179
  required_rubygems_version: !ruby/object:Gem::Requirement
158
180
  requirements:
159
- - - ">"
181
+ - - ">="
160
182
  - !ruby/object:Gem::Version
161
- version: 1.3.1
183
+ version: '0'
162
184
  requirements: []
163
- rubyforge_project:
164
- rubygems_version: 2.6.8
185
+ rubygems_version: 3.0.6
165
186
  signing_key:
166
187
  specification_version: 4
167
188
  summary: A simple ruby DSL to build responive charts for the web using Chart.js
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.0
5
- before_install: gem install bundler -v 1.15.0
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "chart_js"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
@@ -1,22 +0,0 @@
1
- require "json"
2
- require "securerandom"
3
- require_relative "line_chart/line_chart.rb"
4
- require_relative "bar_chart/bar_chart.rb"
5
- require_relative "radar_chart/radar_chart.rb"
6
-
7
- module ChartJS
8
- module Charts
9
- def self.debug(&block)
10
- Chart.new(&block)
11
- end
12
- def self.line(&block)
13
- LineChart.new(&block)
14
- end
15
- def self.bar(&block)
16
- BarChart.new(&block)
17
- end
18
- def self.radar(&block)
19
- RadarChart.new(&block)
20
- end
21
- end
22
- end