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(positional_by = nil, by: :member) ⇒ Object
- #as_summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
- #detail(positional_by = nil, by: :member) ⇒ Object
- #find(name) ⇒ Object
-
#inspect ⇒ Object
The members are the substance, so they are what is rendered.
- #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(positional_by = nil, by: :member) ⇒ Object
53 54 55 56 57 58 59 |
# File 'lib/Namo/Collection.rb', line 53 def as_detail(positional_by = nil, by: :member) by = positional_by || by view = detail(by) @data = view.data @formulae = @formulae.merge(view.formulae) self end |
#as_summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
48 49 50 51 |
# File 'lib/Namo/Collection.rb', line 48 def as_summary(dimension = nil, by: :member, reducer: :sum, &block) @data = summary(dimension, by: by, reducer: reducer, &block).data self end |
#detail(positional_by = nil, by: :member) ⇒ Object
38 39 40 41 42 43 44 45 46 |
# File 'lib/Namo/Collection.rb', line 38 def detail(positional_by = nil, by: :member) by = positional_by || by rows = ( @members.flat_map do |member| member.data.map{|row| row.key?(by) ? row : row.merge(by => member.name)} end ) Namo.new(rows, formulae: member_formulae) 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 |
#inspect ⇒ Object
The members are the substance, so they are what is rendered. A list of names and a row count described the derived view and called it the object, and the list was unbounded besides: 2,641 members emitted 22,704 characters on one line, which is the failure INSPECTED_ROWS was introduced to end.
That budget is now spread across the members shown rather than spent on one member's rows: one member renders ten of its rows, ten members render one apiece, five render two.
69 70 71 |
# File 'lib/Namo/Collection.rb', line 69 def inspect "#<#{self.class}#{inspected_name} #{inspected_members} #{@data.length} rows#{inspected_derived}>" end |
#summary(dimension = nil, by: :member, reducer: :sum, &block) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 |
# 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 |