From c7a1ca29f47ce2a02e717ea3402310cecf6f2b5e Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Thu, 23 Jul 2015 09:52:59 +1000 Subject: [PATCH] Report can define and retrieve columns --- lib/open_food_network/reports/report.rb | 11 +++++++++++ lib/open_food_network/reports/row.rb | 16 ++++++++++++++++ .../lib/open_food_network/reports/report_spec.rb | 13 +++++++++++++ spec/lib/open_food_network/reports/row_spec.rb | 16 ++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 lib/open_food_network/reports/row.rb create mode 100644 spec/lib/open_food_network/reports/row_spec.rb diff --git a/lib/open_food_network/reports/report.rb b/lib/open_food_network/reports/report.rb index f92e268765..86495627fc 100644 --- a/lib/open_food_network/reports/report.rb +++ b/lib/open_food_network/reports/report.rb @@ -1,3 +1,5 @@ +require 'open_food_network/reports/row' + module OpenFoodNetwork::Reports class Report # -- API @@ -5,10 +7,19 @@ module OpenFoodNetwork::Reports @@header end + def columns + @@columns.to_a + end + # -- DSL def self.header(*columns) @@header = columns end + + def self.columns(&block) + @@columns = Row.new + @@columns.instance_eval(&block) + end end end diff --git a/lib/open_food_network/reports/row.rb b/lib/open_food_network/reports/row.rb new file mode 100644 index 0000000000..141564de94 --- /dev/null +++ b/lib/open_food_network/reports/row.rb @@ -0,0 +1,16 @@ +module OpenFoodNetwork::Reports + class Row + def initialize + @columns = [] + end + + + def column(&block) + @columns << block + end + + def to_a + @columns + end + end +end diff --git a/spec/lib/open_food_network/reports/report_spec.rb b/spec/lib/open_food_network/reports/report_spec.rb index 4b64ea0f23..4ee1e08a63 100644 --- a/spec/lib/open_food_network/reports/report_spec.rb +++ b/spec/lib/open_food_network/reports/report_spec.rb @@ -3,13 +3,26 @@ require 'open_food_network/reports/report' module OpenFoodNetwork::Reports class TestReport < Report header 'One', 'Two', 'Three' + + columns do + column { |o| o[:one] } + column { |o| o[:two] } + column { |o| o[:three] } + end end describe Report do let(:report) { TestReport.new } + let(:data) { {one: 1, two: 2, three: 3} } it "returns the header" do report.header.should == %w(One Two Three) end + + it "returns columns as an array of procs" do + report.columns[0].call(data).should == 1 + report.columns[1].call(data).should == 2 + report.columns[2].call(data).should == 3 + end end end diff --git a/spec/lib/open_food_network/reports/row_spec.rb b/spec/lib/open_food_network/reports/row_spec.rb new file mode 100644 index 0000000000..deaa84e491 --- /dev/null +++ b/spec/lib/open_food_network/reports/row_spec.rb @@ -0,0 +1,16 @@ +require 'open_food_network/reports/row' + +module OpenFoodNetwork::Reports + describe Row do + let(:row) { Row.new } + let(:proc) { Proc.new {} } + + it "can define a number of columns and return them as an array" do + row.column &proc + row.column &proc + row.column &proc + + row.to_a.should == [proc, proc, proc] + end + end +end