Sha256: cdcee620b8aa30eb6f094e370ede8be74acd12b2b96f9ea7a3a9cd77e0554fa8

Contents?: true

Size: 1.91 KB

Versions: 3

Compression:

Stored size: 1.91 KB

Contents

# frozen_string_literal: true

module Expire
  # Base class for rules with an adjective in their name
  class KeepAdjectiveRuleBase < RuleBase
    using RefineAllAndNone

    NOUN_FOR = {
      'hourly' => 'hour',
      'daily' => 'day',
      'weekly' => 'week',
      'monthly' => 'month',
      'yearly' => 'year'
    }.freeze

    PRIMARY_RANK = 20
    SECONDARY_RANK_FOR = {
      'hourly' => 1,
      'daily' => 2,
      'weekly' => 3,
      'monthly' => 4,
      'yearly' => 5
    }.freeze

    def self.from_value(value)
      value = -1 if value.all?
      value = 0 if value.none?

      integer_value = Integer(value)
      raise ArgumentError, 'must be at least -1' if integer_value < -1

      new(amount: integer_value)
    end

    def self.primary_rank
      PRIMARY_RANK
    end

    def self.rank
      primary_rank + secondary_rank
    end

    def self.secondary_rank
      match = name.downcase.match(/(hourly|daily|weekly|monthly|yearly)/)
      return unless match

      SECONDARY_RANK_FOR[match[1]]
    end

    def adjective
      @adjective ||= infer_adjective
    end

    def apply(backups, _)
      per_spacing = backups.one_per(spacing)
      kept = amount == -1 ? per_spacing : per_spacing.most_recent(amount)
      kept.each { |backup| backup.add_reason_to_keep(reason_to_keep) }
    end

    def rank
      @rank ||= primary_rank + secondary_rank
    end

    def primary_rank
      self.class.primary_rank
    end

    def secondary_rank
      self.class.secondary_rank
    end

    def spacing
      NOUN_FOR[adjective]
    end

    private

    def class_name
      self.class.to_s
    end

    def infer_adjective
      match = class_name.downcase.match(/(hourly|daily|weekly|monthly|yearly)/)
      return unless match

      match[1]
    end

    def reason_to_keep
      "keep #{pretty_amount} #{adjective} #{numerus_backup}"
    end

    def pretty_amount
      amount == -1 ? 'all' : amount.to_s
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
expire-0.2.2 lib/expire/keep_adjective_rule_base.rb
expire-0.2.1 lib/expire/keep_adjective_rule_base.rb
expire-0.2.0 lib/expire/keep_adjective_rule_base.rb