rom-rb/rom-csv

View on GitHub
lib/rom/csv/dataset.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'rom/memory/dataset'

module ROM
  module CSV
    # CSV in-memory dataset used by CSV gateways
    #
    # @api public
    class Dataset < ROM::Memory::Dataset
      option :path, reader: true
      option :file_options, reader: true

      # Data-row transformation proc
      #
      # @api public
      def self.row_proc
        ->(row) { Transforms[:symbolize_keys].call(row) }
      end

      # Synchronization dataset with file content
      #
      # @api public
      def sync!
        write_data && reload!
      end

      private

      # Write current dataset to file
      #
      # @api private
      def write_data
        ::CSV.open(path, 'wb', file_options) do |csv|
          csv << headers
          data.each do |tuple|
            csv << ordered_data(tuple)
          end
        end
      end

      # Load data to datase
      #
      # @api private
      def reload!
        @data = Gateway.load_file(path, file_options)
      end

      def headers
        data[0].keys
      end

      def ordered_data(tuple)
        headers.map { |header| tuple[header] }
      end
    end

    # @api private
    class Transforms
      extend Transproc::Registry
      import Transproc::HashTransformations
    end
  end
end