Skip to content

Instantly share code, notes, and snippets.

@zverok
Created March 13, 2014 11:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zverok/9526450 to your computer and use it in GitHub Desktop.
Save zverok/9526450 to your computer and use it in GitHub Desktop.
=begin
Воспользовавшись таким классом, ты можешь разделить функционал следующим образом:
MnemosyneClient просто делает
GraphTable.from_json_ld(get '...graph.jsonld', params)
SummaryTable.from_json(get '...summary.json', params)
WordsTable.from_json(get url, params)
....
GraphTable преобразует данные, и хранит их раздельно (отдельно колонки, отдельно метки, отдельно цифры), что удобно для спек;
а при необходимости сводит это всё в таблицу.
=end
class DataTable
def table
[
[title, *column_labels],
*row_labels.zip(data).map(&:flatten)
]
end
end
class GraphTable < DataTable
def initialize(json_ld_data, step)
@json_ld_data, @step = json_ld_data, step.downcase.to_sym
end
attr_reader :json_ld_data, :step
# уровень логики мнемозины
def series
json_ld_data.
detect{|r| r['type'] == 'series'}
end
def dates
@json_ld_data.
select{|r| r['type'] == 'datapoint']}.
map{|r| r['label']}
end
def data
@json_ld_data.
select{|r| r['type'] == 'datapoint']}.
map{|r| r['data']}
end
# уровень табличной логики
def title
case step
when :hour; "Час"
when :day; "День"
when :week; "Неделя"
when :month; "Месяц"
end
end
def column_labels
series.map{|s| s['title']}
end
def row_labels
dates.map{|d| make_date_label(*d)}
end
private
def make_date_label(b, e)
case step
# ....
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment