Sha256: 78d0f6f0fdcf385aa5b327d4bc4a32f2b307d2ca9ca477e10b791ca2b21e3adf

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

#!/usr/bin/env ruby

require "flex_station_data/services/load_plates"
require "flex_station_data/presenters/plates_csv"

module FlexStationData
  class SampleDataApp
    include Concerns::Service

    OPTION_RE = /\A--(\w+(?:-\w+)*)(?:=(.*))?\z/.freeze

    attr_reader :args, :options

    def initialize(*args)
      @options, @args = args.partition { |arg| arg =~ OPTION_RE }
      @options.map! do |option|
        option.scan(OPTION_RE).first
      end
    end

    def threshold
      name, value = options.reverse.detect { |name, value| name == "threshold" }
      return nil if name.blank?

      Float(value)
    end

    def value_quality_control
      @value_quality_control ||= begin
        value_threshold = threshold
        ->(value) { ValueQuality.call(value, threshold: value_threshold) }
      end
    end

    def sample_quality_control
      ->(sample) { SampleQuality.call(sample, value_quality_control: value_quality_control) }
    end

    def files
      @files ||= args.map { |arg| Pathname(arg) }
    end

    def plates
      @plates ||= files.map do |file|
        [ file, LoadPlates.call(file) ]
      end
    end

    def csv
      plates.flat_map do |file, file_plates|
        Presenters::PlatesCsv.present(file, file_plates) do |plate|
          Presenters::PlateCsv.present(plate) do |times, sample|
            Presenters::SampleCsv.present(times, sample, quality_control: sample_quality_control)
          end
        end
      end
    end

    def call
      CSV do |out|
        csv.each do |row|
          out << row
        end
      end
    end
  end
end

FlexStationData::SampleDataApp.call(*ARGV)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
flex-station-data-0.2.0 bin/flex-station-sample-data