123456789_123456789_123456789_123456789_123456789_

Class: ActionDispatch::Journey::Path::Pattern

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Classes:
Inherits: Object
Defined in: actionpack/lib/action_dispatch/journey/path/pattern.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(ast, requirements, separators, anchored) ⇒ Pattern

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 11

def initialize(ast, requirements, separators, anchored)
  @ast          = ast
  @spec         = ast.root
  @requirements = requirements
  @separators   = separators
  @anchored     = anchored

  @names          = ast.names
  @optional_names = nil
  @required_names = nil
  @re             = nil
  @offsets        = nil
end

Instance Attribute Details

#anchored (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 9

attr_reader :ast, :names, :requirements, :anchored, :spec

#ast (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 9

attr_reader :ast, :names, :requirements, :anchored, :spec

#names (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 9

attr_reader :ast, :names, :requirements, :anchored, :spec

#requirements (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 9

attr_reader :ast, :names, :requirements, :anchored, :spec

#requirements_anchored?Boolean (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 36

def requirements_anchored?
  # each required param must not be surrounded by a literal, otherwise it isn't
  # simple to chunk-match the url piecemeal
  terminals = ast.terminals

  terminals.each_with_index { |s, index|
    next if index < 1
    next if s.type == :DOT || s.type == :SLASH

    back = terminals[index - 1]
    fwd = terminals[index + 1]

    # we also don't support this yet, constraints must be regexps
    return false if s.symbol? && s.regexp.is_a?(Array)

    return false if back.literal?
    return false if !fwd.nil? && fwd.literal?
  }

  true
end

#spec (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 9

attr_reader :ast, :names, :requirements, :anchored, :spec

Instance Method Details

#=~(other)

Alias for #match.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 163

alias :=~ :match

#build_formatter

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 25

def build_formatter
  Visitors::FormatBuilder.new.accept(spec)
end

#eager_load!

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 29

def eager_load!
  required_names
  offsets
  to_regexp
  @ast = nil
end

#match(other) Also known as: #=~

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 159

def match(other)
  return unless match = to_regexp.match(other)
  MatchData.new(names, offsets, match)
end

#match?(other) ⇒ Boolean

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 165

def match?(other)
  to_regexp.match?(other)
end

#offsets (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 188

def offsets
  @offsets ||= begin
    offsets = [0]

    spec.find_all(&:symbol?).each do |node|
      node = node.to_sym

      if @requirements.key?(node)
        re = /#{Regexp.union(@requirements[node])}|/
        offsets.push((re.match("").length - 1) + offsets.last)
      else
        offsets << offsets.last
      end
    end

    offsets
  end
end

#optional_names

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 62

def optional_names
  @optional_names ||= spec.find_all(&:group?).flat_map { |group|
    group.find_all(&:symbol?)
  }.map(&:name).uniq
end

#regexp_visitor (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 184

def regexp_visitor
  @anchored ? AnchoredRegexp : UnanchoredRegexp
end

#required_names

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 58

def required_names
  @required_names ||= names - optional_names
end

#requirements_for_missing_keys_check

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 177

def requirements_for_missing_keys_check
  @requirements_for_missing_keys_check ||= requirements.transform_values do |regex|
    /\A#{regex}\Z/
  end
end

#source

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 169

def source
  to_regexp.source
end

#to_regexp

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/journey/path/pattern.rb', line 173

def to_regexp
  @re ||= regexp_visitor.new(@separators, @requirements).accept spec
end