Sha256: ecad36c140fefab0d82997ba405840d0e37c0bd2271a52564c2c3aaeed4d7056

Contents?: true

Size: 1.61 KB

Versions: 15

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

require "csv"

module Decidim
  module Exporters
    # Exports any serialized object (Hash) into a readable CSV. It transforms
    # the columns using slashes in a way that can be afterwards reconstructed
    # into the original nested hash.
    #
    # For example, `{ name: { ca: "Hola", en: "Hello" } }` would result into
    # the columns: `name/ca` and `name/es`.
    class CSV < Exporter
      # Public: Exports a CSV serialized version of the collection using the
      # provided serializer and following the previously described strategy.
      #
      # Returns an ExportData instance.
      def export
        data = ::CSV.generate(headers: headers, write_headers: true, col_sep: ";") do |csv|
          processed_collection.each do |resource|
            csv << headers.map { |header| resource[header] }
          end
        end
        ExportData.new(data, "csv")
      end

      private

      def headers
        return [] if processed_collection.empty?
        processed_collection.first.keys
      end

      def processed_collection
        @processed_collection ||= collection.map do |resource|
          flatten(@serializer.new(resource).serialize)
        end
      end

      def flatten(object, key = nil)
        if object.is_a? Hash
          object.inject({}) do |result, (subkey, value)|
            new_key = key ? "#{key}/#{subkey}" : subkey.to_s
            result.merge(flatten(value, new_key))
          end
        elsif object.is_a?(Array)
          { key.to_s => object.map(&:to_s).join(", ") }
        else
          { key.to_s => object }
        end
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
decidim-core-0.17.2 lib/decidim/exporters/csv.rb
decidim-core-0.17.1 lib/decidim/exporters/csv.rb
decidim-core-0.16.1 lib/decidim/exporters/csv.rb
decidim-core-0.17.0 lib/decidim/exporters/csv.rb
decidim-core-0.16.0 lib/decidim/exporters/csv.rb
decidim-core-0.15.2 lib/decidim/exporters/csv.rb
decidim-core-0.15.1 lib/decidim/exporters/csv.rb
decidim-core-0.15.0 lib/decidim/exporters/csv.rb
decidim-core-0.14.4 lib/decidim/exporters/csv.rb
decidim-core-0.14.3 lib/decidim/exporters/csv.rb
decidim-core-0.14.2 lib/decidim/exporters/csv.rb
decidim-core-0.14.1 lib/decidim/exporters/csv.rb
decidim-core-0.13.1 lib/decidim/exporters/csv.rb
decidim-core-0.13.0 lib/decidim/exporters/csv.rb
decidim-core-0.13.0.pre1 lib/decidim/exporters/csv.rb