Class: Namo::Collection
- Inherits:
-
Namo
- Object
- Namo
- Namo::Collection
- Defined in:
- lib/Namo/Collection.rb
Instance Attribute Summary collapse
-
#members ⇒ Object
readonly
Returns the value of attribute members.
Instance Method Summary collapse
- #<<(*constituents) ⇒ Object
- #as_detail(by = :member) ⇒ Object
- #as_summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
- #detail(by: :member) ⇒ Object
- #find(name) ⇒ Object
- #summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
Instance Attribute Details
#members ⇒ Object (readonly)
Returns the value of attribute members.
6 7 8 |
# File 'lib/Namo/Collection.rb', line 6 def members @members end |
Instance Method Details
#<<(*constituents) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/Namo/Collection.rb', line 8 def <<(*constituents) constituents.flatten.each do |constituent| case constituent when Namo then add_member(constituent) when Module then attach(constituent) when Hash, Row raise ArgumentError, "a Collection's rows come from its members; add a member (a named Namo), not a loose row" else raise TypeError, "can't append #{constituent.class} to a Collection" end end @data = detail.data self end |
#as_detail(by = :member) ⇒ Object
49 50 51 52 |
# File 'lib/Namo/Collection.rb', line 49 def as_detail(by = :member) @data = detail(by: by).data self end |
#as_summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
44 45 46 47 |
# File 'lib/Namo/Collection.rb', line 44 def as_summary(dimension = nil, by: :member, reducer: :sum, &block) @data = summary(dimension, by: by, reducer: reducer, &block).data self end |
#detail(by: :member) ⇒ Object
37 38 39 40 41 42 |
# File 'lib/Namo/Collection.rb', line 37 def detail(by: :member) rows = @members.flat_map do |member| member.data.map{|row| row.key?(by) ? row : row.merge(by => member.name)} end Namo.new(rows) end |
#find(name) ⇒ Object
22 23 24 |
# File 'lib/Namo/Collection.rb', line 22 def find(name) @members.find{|member| member.name == name} unless name.nil? end |
#summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
26 27 28 29 30 31 32 33 34 35 |
# File 'lib/Namo/Collection.rb', line 26 def summary(dimension = nil, by: :member, reducer: :sum, &block) raise ArgumentError, "summary needs a dimension or a block" unless dimension || block rows = if block @members.map{|member| block.call(member).merge(by => member.name)} else @members.map{|member| {by => member.name, dimension => member.values(dimension).send(reducer)}} end Namo.new(rows) end |