sanger/sequencescape

View on GitHub
app/models/request/library_manufacture.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true
# Any request involved in building a library should include this module that defines some of the
# most common behaviour, namely the library type and insert size information.
module Request::LibraryManufacture
  def self.included(base) # rubocop:todo Metrics/MethodLength
    base::Metadata.class_eval do
      custom_attribute(:fragment_size_required_from, required: true, integer: true, on: :create, minimum: 1)
      custom_attribute(:fragment_size_required_to, required: true, integer: true, on: :create, minimum: 1)
      custom_attribute(:library_type, required: true, validator: true, selection: true, on: :create)
    end

    base.class_eval { extend ClassMethods }

    base.const_set(
      :RequestOptionsValidator,
      Class.new(DelegateValidation::Validator) do
        delegate_attribute :fragment_size_required_from, :fragment_size_required_to, to: :target, type_cast: :to_i
        validates :fragment_size_required_from, numericality: { integer_only: true, greater_than: 0 }
        validates :fragment_size_required_to, numericality: { integer_only: true, greater_than: 0 }
      end
    )
  end

  module ClassMethods
    def delegate_validator
      self::RequestOptionsValidator
    end
  end

  def insert_size
    Aliquot::InsertSize.new(request_metadata.fragment_size_required_from, request_metadata.fragment_size_required_to)
  end

  delegate :library_type, to: :request_metadata
end