Sha256: 658930aeb2b4c9c2bce66ea538d4c85e32355644d8c1fdaf8596a17ab9a0de56

Contents?: true

Size: 1.81 KB

Versions: 24

Compression:

Stored size: 1.81 KB

Contents

# frozen_string_literal: true

module Nanoc::Int
  # @api private
  class Pattern
    include Nanoc::Int::ContractsSupport

    contract C::Any => self
    def self.from(obj)
      case obj
      when Nanoc::Int::StringPattern, Nanoc::Int::RegexpPattern
        obj
      when String
        Nanoc::Int::StringPattern.new(obj)
      when Regexp
        Nanoc::Int::RegexpPattern.new(obj)
      when Symbol
        Nanoc::Int::StringPattern.new(obj.to_s)
      else
        raise ArgumentError, "Do not know how to convert `#{obj.inspect}` into a Nanoc::Pattern"
      end
    end

    def initialize(_obj)
      raise NotImplementedError
    end

    def match?(_identifier)
      raise NotImplementedError
    end

    def captures(_identifier)
      raise NotImplementedError
    end
  end

  # @api private
  class StringPattern < Pattern
    MATCH_OPTS = File::FNM_PATHNAME | File::FNM_EXTGLOB

    contract String => C::Any
    def initialize(string)
      @string = string
    end

    contract C::Or[Nanoc::Identifier, String] => C::Bool
    def match?(identifier)
      File.fnmatch(@string, identifier.to_s, MATCH_OPTS)
    end

    contract C::Or[Nanoc::Identifier, String] => nil
    def captures(_identifier)
      nil
    end

    contract C::None => String
    def to_s
      @string
    end
  end

  # @api private
  class RegexpPattern < Pattern
    contract Regexp => C::Any
    def initialize(regexp)
      @regexp = regexp
    end

    contract C::Or[Nanoc::Identifier, String] => C::Bool
    def match?(identifier)
      (identifier.to_s =~ @regexp) != nil
    end

    contract C::Or[Nanoc::Identifier, String] => C::Maybe[C::ArrayOf[String]]
    def captures(identifier)
      matches = @regexp.match(identifier.to_s)
      matches&.captures
    end

    contract C::None => String
    def to_s
      @regexp.to_s
    end
  end
end

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
nanoc-4.11.0 lib/nanoc/base/entities/pattern.rb
nanoc-4.10.4 lib/nanoc/base/entities/pattern.rb
nanoc-4.10.3 lib/nanoc/base/entities/pattern.rb
nanoc-4.10.2 lib/nanoc/base/entities/pattern.rb
nanoc-4.10.1 lib/nanoc/base/entities/pattern.rb
nanoc-4.10.0 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.9 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.8 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.7 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.6 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.5 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.4 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.3 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.2 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.1 lib/nanoc/base/entities/pattern.rb
nanoc-4.9.0 lib/nanoc/base/entities/pattern.rb
nanoc-4.8.19 lib/nanoc/base/entities/pattern.rb
nanoc-4.8.18 lib/nanoc/base/entities/pattern.rb
nanoc-4.8.17 lib/nanoc/base/entities/pattern.rb
nanoc-4.8.16 lib/nanoc/base/entities/pattern.rb