diff --git a/lib/open_food_network/reports/report.rb b/lib/open_food_network/reports/report.rb index 86495627fc..ad7c09ae7c 100644 --- a/lib/open_food_network/reports/report.rb +++ b/lib/open_food_network/reports/report.rb @@ -1,4 +1,5 @@ require 'open_food_network/reports/row' +require 'open_food_network/reports/rule' module OpenFoodNetwork::Reports class Report @@ -21,5 +22,10 @@ module OpenFoodNetwork::Reports @@columns = Row.new @@columns.instance_eval(&block) end + + def self.organise(&block) + @@rules_head = Rule.new + @@rules_head.instance_eval(&block) + end end end diff --git a/lib/open_food_network/reports/rule.rb b/lib/open_food_network/reports/rule.rb new file mode 100644 index 0000000000..d65206766f --- /dev/null +++ b/lib/open_food_network/reports/rule.rb @@ -0,0 +1,16 @@ +module OpenFoodNetwork::Reports + class Rule + def group(&block) + @group = block + end + + def sort(&block) + @sort = block + end + + def to_h + {group_by: @group, sort_by: @sort} + 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 4ee1e08a63..bbb5ad3dc3 100644 --- a/spec/lib/open_food_network/reports/report_spec.rb +++ b/spec/lib/open_food_network/reports/report_spec.rb @@ -9,10 +9,16 @@ module OpenFoodNetwork::Reports column { |o| o[:two] } column { |o| o[:three] } end + + organise do + group { |o| o[:one] } + sort { |o| o[:two] } + end end describe Report do let(:report) { TestReport.new } + let(:rules_head) { TestReport.class_variable_get(:@@rules_head) } let(:data) { {one: 1, two: 2, three: 3} } it "returns the header" do @@ -24,5 +30,15 @@ module OpenFoodNetwork::Reports report.columns[1].call(data).should == 2 report.columns[2].call(data).should == 3 end + + describe "rules" do + let(:group_by) { rules_head.to_h[:group_by] } + let(:sort_by) { rules_head.to_h[:sort_by] } + + it "constructs a linked list of rules" do + group_by.call(data).should == 1 + sort_by.call(data).should == 2 + end + end end end diff --git a/spec/lib/open_food_network/reports/rule_spec.rb b/spec/lib/open_food_network/reports/rule_spec.rb new file mode 100644 index 0000000000..d775d5ed48 --- /dev/null +++ b/spec/lib/open_food_network/reports/rule_spec.rb @@ -0,0 +1,18 @@ +require 'open_food_network/reports/rule' + +module OpenFoodNetwork::Reports + describe Rule do + let(:rule) { Rule.new } + let(:proc) { Proc.new {} } + + it "can define a group proc and return it in a hash" do + rule.group &proc + rule.to_h.should == {group_by: proc, sort_by: nil} + end + + it "can define a sort proc and return it in a hash" do + rule.sort &proc + rule.to_h.should == {group_by: nil, sort_by: proc} + end + end +end