Add a helper for build c3.js chart compatible data
This commit is contained in:
49
app/models/ahoy/data_source.rb
Normal file
49
app/models/ahoy/data_source.rb
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# This class combines multiple collections with shared keys into a
|
||||||
|
# hash of collections compatible with C3.js charts
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
module Ahoy
|
||||||
|
class DataSource
|
||||||
|
|
||||||
|
# Adds a collection with the datasource
|
||||||
|
# Name is the name of the collection and will be showed in the
|
||||||
|
# chart
|
||||||
|
def add(name, collection)
|
||||||
|
collections.push data: collection, name: name
|
||||||
|
collection.each{ |k,v| add_key k }
|
||||||
|
end
|
||||||
|
|
||||||
|
def build
|
||||||
|
data = { x: [] }
|
||||||
|
keys.each do |k|
|
||||||
|
# Add the key with a valid date format
|
||||||
|
data[:x].push k.strftime("%Y-%m-%d")
|
||||||
|
|
||||||
|
# Add the value for each column, or 0 if not present
|
||||||
|
collections.each do |col|
|
||||||
|
data[col[:name]] ||= []
|
||||||
|
count = col[:data][k] || 0
|
||||||
|
data[col[:name]].push count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return data
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def collections
|
||||||
|
@collections ||= []
|
||||||
|
end
|
||||||
|
|
||||||
|
def keys
|
||||||
|
@keys ||= []
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_key(key)
|
||||||
|
keys.push(key) unless keys.include? key
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
36
spec/models/ahoy/data_source_spec.rb
Normal file
36
spec/models/ahoy/data_source_spec.rb
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Ahoy::DataSource do
|
||||||
|
describe '#build' do
|
||||||
|
before :each do
|
||||||
|
time_1 = DateTime.parse("2015-01-01")
|
||||||
|
time_2 = DateTime.parse("2015-01-02")
|
||||||
|
time_3 = DateTime.parse("2015-01-03")
|
||||||
|
|
||||||
|
create :ahoy_event, name: 'foo', time: time_1
|
||||||
|
create :ahoy_event, name: 'foo', time: time_1
|
||||||
|
create :ahoy_event, name: 'foo', time: time_2
|
||||||
|
create :ahoy_event, name: 'bar', time: time_1
|
||||||
|
create :ahoy_event, name: 'bar', time: time_3
|
||||||
|
create :ahoy_event, name: 'bar', time: time_3
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should work without data sources' do
|
||||||
|
ds = Ahoy::DataSource.new
|
||||||
|
expect(ds.build).to eq x: []
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should work with single data sources' do
|
||||||
|
ds = Ahoy::DataSource.new
|
||||||
|
ds.add 'foo', Ahoy::Event.where(name: 'foo').group_by_day(:time).count
|
||||||
|
expect(ds.build).to eq :x=>["2015-01-01", "2015-01-02"], "foo"=>[2, 1]
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should combine data sources' do
|
||||||
|
ds = Ahoy::DataSource.new
|
||||||
|
ds.add 'foo', Ahoy::Event.where(name: 'foo').group_by_day(:time).count
|
||||||
|
ds.add 'bar', Ahoy::Event.where(name: 'bar').group_by_day(:time).count
|
||||||
|
expect(ds.build).to eq :x=>["2015-01-01", "2015-01-02", "2015-01-03"], "foo"=>[2, 1, 0], "bar"=>[1, 0, 2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user