Sha256: d969b6fea3f691f6b332e685a5a71bca2717cec132869ccf6f420fafefe712e0

Contents?: true

Size: 1.79 KB

Versions: 17

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true
require 'mustermann/ast/translator'

module Mustermann
  module FileUtils
    # AST Translator to turn Mustermann patterns into glob patterns.
    # @!visibility private
    class GlobPattern < Mustermann::AST::Translator
      # Character that need to be escaped in glob patterns.
      # @!visibility private
      ESCAPE = %w([ ] { } * ** \\)

      # Turn a Mustermann pattern into glob pattern.
      # @param [#to_glob, #to_ast, Object] pattern the object to turn into a glob pattern.
      # @return [String] the glob pattern
      # @!visibility private
      def self.generate(pattern)
        return pattern.to_glob               if pattern.respond_to? :to_glob
        return new.translate(pattern.to_ast) if pattern.respond_to? :to_ast
        return "**/*" unless pattern.is_a? Mustermann::Composite
        "{#{pattern.patterns.map { |p| generate(p) }.join(',')}}"
      end

      translate(:root, :group, :expression) { t(payload) || ""                           }
      translate(:separator, :char)          { t.escape(payload)                          }
      translate(:capture)                   { constraint ? "**/*" : "*"                  }
      translate(:optional)                  { "{#{t(payload)},}"                         }
      translate(:named_splat, :splat)       { "**/*"                                     }
      translate(:with_look_ahead)           { t(head) + t(payload)                       }
      translate(:union)                     { "{#{payload.map { |e| t(e) }.join(',')}}"  }
      translate(Array)                      { map { |e| t(e) }.join                      }

      # Escape with a slash rather than URI escaping.
      # @!visibility private
      def escape(char)
        ESCAPE.include?(char) ? "\\#{char}" : char
      end
    end
  end
end

Version data entries

17 entries across 17 versions & 2 rubygems

Version Path
mustermann-contrib-3.0.3 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-3.0.2 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-3.0.1 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-3.0.0 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-2.0.2 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-2.0.1 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-2.0.0 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.1.2 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.1.1 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.1.0 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.0.3 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.0.2 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.0.2.rc2 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.0.2.rc1 lib/mustermann/file_utils/glob_pattern.rb
mustermann-1.0.2.rc1 mustermann-contrib/lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.0.1 lib/mustermann/file_utils/glob_pattern.rb
mustermann-contrib-1.0.0 lib/mustermann/file_utils/glob_pattern.rb