Sha256: 5a815af291c3cce7baca635b5522c44115469d5aae28418f8dad554f1a319878

Contents?: true

Size: 1.34 KB

Versions: 6

Compression:

Stored size: 1.34 KB

Contents

# frozen_string_literal: true

module Expire
  # How backups are expired
  class Rules
    def self.from_options(options)
      known_rules = RuleList.name_symbols

      rule_options = options.select { |opt, _| known_rules.include?(opt) }

      new(rule_options)
    end

    def self.from_yaml(file_name)
      pathname = Pathname.new(file_name)
      yaml_text = pathname.read
      yaml_rules = YAML.safe_load(yaml_text, symbolize_names: true)
      new(yaml_rules)
    end

    def initialize(given = {})
      @rules = given.map do |rule_name, value|
        if value.respond_to? :rank
          value
        else
          rule_class = rule_class_for(rule_name)
          rule_class.from_value(value)
        end
      end
    end

    attr_reader :rules

    def any?
      rules.any?
    end

    def apply(backups, reference_time)
      rules.sort.each { |rule| rule.apply(backups, reference_time) }

      backups
    end

    def count
      @rules.length
    end

    def merge(prior_rules)
      self.class.new(to_h.merge(prior_rules.to_h))
    end

    def to_h
      rules.map { |rule| [rule.name.to_sym, rule] }.to_h
    end

    private

    def rule_class_for(key)
      rule_class_name_for(key).safe_constantize || raise(UnknownRuleError, key)
    end

    def rule_class_name_for(key)
      "::Expire::#{key.to_s.camelize}Rule"
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
expire-0.2.6 lib/expire/rules.rb
expire-0.2.5 lib/expire/rules.rb
expire-0.2.4 lib/expire/rules.rb
expire-0.2.3 lib/expire/rules.rb
expire-0.2.2 lib/expire/rules.rb
expire-0.2.1 lib/expire/rules.rb