class Graffable::App

Private Instance Methods

assert_group(group_name) click to toggle source
# File lib/graffable/app.rb, line 217
def assert_group(group_name)
  group = @groups.detect { |g| group_name == g[:name] }
  halt 404, "Report group not found: #{group_name}" unless group
  group
end
assert_report(group, report_name) click to toggle source
# File lib/graffable/app.rb, line 223
def assert_report(group, report_name)
  reports = @db[:reports].where( group_id: group[:id] ).all 
  report  = reports.detect { |r| report_name == r[:name] }
  halt 404, "Report not found: #{report_name}" unless report
  report
end
redirect_with_warning(path, message) click to toggle source
# File lib/graffable/app.rb, line 230
def redirect_with_warning(path, message)
  flash[:warning] = message
  redirect to(path)
end
return_csv( dataset, params = {} ) click to toggle source
# File lib/graffable/app.rb, line 235
def return_csv( dataset, params = {} )
  defaults = { max: -1 }
  opts     = defaults.merge params

  data   = [ %w( date label value ).to_csv ]
  values = {}
  dataset.each do |row|
    date   = %i( year month day hour ).collect { |k| row[k] }.compact.join('-')
    label  = row[:label] || ''
    value  = row[:value].to_i

    values[date]        ||= {}
    values[date][label]   = value
  end

  values = values.sort.reverse.slice( 0 .. opts[:max] - 1 ).reverse if opts[:max] > - 1
  values.each do |tuple|
    date  = tuple.first
    pairs = tuple.last
    pairs.each_pair do |label, value|
      data << [ date, label, value ].to_csv
    end
  end

  content_type :text
  return data.join
end
return_json( dataset, params = {} ) click to toggle source
# File lib/graffable/app.rb, line 263
def return_json( dataset, params = {} )
  defaults = { max: -1 }
  opts     = defaults.merge params

  data         = {}
  date_mapping = {}
  values       = {}
  dataset.each do |row|
    date  = %i( year month day hour ).collect { |k| row[k] }.compact.join('-')
    label = row[:label] || ''
    value = row[:value].to_i
  
    date_mapping[date] = opts[:date_formatter].call row[:year], row[:month], row[:day], row[:hour] unless date_mapping.key?(date)

    values[date]        ||= {}
    values[date][label]   = value
  end

  values = values.sort.reverse.slice( 0 .. opts[:max] - 1 ).reverse if opts[:max] > - 1
  values.each do |tuple|
    date  = date_mapping[ tuple.first ]
    pairs = tuple.last
    pairs.each_pair do |label, value|
      unless data.key?(label)
        data[label]         = { data: [], total: 0 }
        data[label][:label] = label unless label.empty?
      end
      data[label][:data].push [ date, value ]
      data[label][:total] = data[label][:total] + value
      data[label][:label] = "#{label} (#{ data[label][:total] })" unless label.empty?
    end
  end

  content_type :json
  return { data: data.values }.to_json
end