Sha256: 36df11b6859479d465588dfad4def8b0ec2d9bab9c8583c79cbb49d1159b8528

Contents?: true

Size: 1.56 KB

Versions: 13

Compression:

Stored size: 1.56 KB

Contents

# frozen_string_literal: true

require 'eac_ruby_utils/core_ext'
require 'eac_ruby_utils/yaml'
require 'ehbrs_ruby_utils/cooking_book/recipe/ingredient'

module EhbrsRubyUtils
  module CookingBook
    class Recipe
      class Measure
        FLOAT_PATTERN = /\d+(?:\.\d+)?/.freeze
        FRACTION_PATTERN = %r{(#{FLOAT_PATTERN})(?:\s*/\s*(#{FLOAT_PATTERN}))?}.freeze
        QUANTITY_UNIT_PATTERN = /\A#{FRACTION_PATTERN}(?:\s*(\S+))?\z/.freeze
        VARIABLE_PATTERN = /\A~\z/.freeze
        VARIABLE_TEXT = 'a gosto'

        class << self
          def build(value)
            value = value.to_s.strip
            build_from_variable(value) || build_from_pattern(value) || build_unknown(value)
          end

          private

          def build_from_variable(value)
            VARIABLE_PATTERN.if_match(value, false) do
              new(nil, nil, nil)
            end
          end

          def build_from_pattern(value)
            QUANTITY_UNIT_PATTERN.if_match(value, false) do |m|
              new(m[1].if_present(&:to_f), m[2].if_present(&:to_f), m[3])
            end
          end

          def build_unknown(value)
            new(nil, nil, "unknown format: |#{value}|")
          end
        end

        common_constructor :numerator, :denominator, :unit

        def to_s
          return VARIABLE_TEXT if variable?

          "#{quantity_to_s} #{unit}"
        end

        def quantity_to_s
          numerator.to_s + (denominator.if_present('') { |v| "/ #{v}" })
        end

        def variable?
          numerator.blank?
        end
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
ehbrs_ruby_utils-0.44.3 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.44.2 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.44.1 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.44.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.41.1 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.41.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.40.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.39.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.38.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.37.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.36.1 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.36.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb
ehbrs_ruby_utils-0.35.0 lib/ehbrs_ruby_utils/cooking_book/recipe/measure.rb