lib/defmastership/export/csv/formatter.rb in defmastership-1.1.1 vs lib/defmastership/export/csv/formatter.rb in defmastership-1.2.0

- old
+ new

@@ -30,10 +30,42 @@ end end private + # Helper functions + module Helper + # @return [Array<Symbol>] the array of methods for columns inclusion + # + # @param column_spec [MethodSpec] the method to include or not with its guard + # @param doc [Document] the Document to export + def self.column_method(column_spec, doc) + column_spec.guard.call(doc) ? [column_spec.column_method] : [] + end + + # 2-uplet with one method to include or not depending of a lambda guard + MethodSpec = Struct.new(:column_method, :guard) + public_constant :MethodSpec + end + private_constant :Helper + + COLUMNS_METHODS_SPECIFICATIONS = + [ + Helper::MethodSpec.new(:type, ->(_) { true }), + Helper::MethodSpec.new(:reference, ->(_) { true }), + Helper::MethodSpec.new(:summary, lambda(&:summaries?)), + Helper::MethodSpec.new(:value, ->(_) { true }), + Helper::MethodSpec.new(:checksum, ->(_) { true }), + Helper::MethodSpec.new(:wrong_explicit_checksum, lambda(&:wrong_explicit_checksum?)), + Helper::MethodSpec.new(:explicit_version, lambda(&:explicit_version?)), + Helper::MethodSpec.new(:labels, ->(doc) { !doc.labels.empty? }), + Helper::MethodSpec.new(:eref, ->(doc) { !doc.eref.empty? }), + Helper::MethodSpec.new(:iref, lambda(&:iref)), + Helper::MethodSpec.new(:attributes, ->(doc) { !doc.attributes.empty? }) + ].freeze + private_constant :COLUMNS_METHODS_SPECIFICATIONS + def export_definitions_in(csv, column_list) @doc.definitions.each { |definition| csv << body(definition, column_list) } end def header(column_list) @@ -47,17 +79,12 @@ body_line = column_list.map { |part| body_formatter.public_send(part) } body_line.flatten end def build_column_list - [ - [:wrong_explicit_checksum, @doc.wrong_explicit_checksum?], - [:explicit_version, @doc.explicit_version?], - [:labels, !@doc.labels.empty?], - [:eref, !@doc.eref.empty?], - [:iref, @doc.iref], - [:attributes, !@doc.attributes.empty?] - ].reduce([:fixed]) { |acc, elem| acc + (elem.fetch(1) ? [elem.first] : []) } + COLUMNS_METHODS_SPECIFICATIONS.reduce([]) do |acc, column| + acc + Helper.column_method(column, @doc) + end end end end end end