# File lib/rack/mount/generatable_regexp.rb, line 72 72: def captures 73: segments.flatten.find_all { |s| s.is_a?(DynamicSegment) } 74: end
# File lib/rack/mount/generatable_regexp.rb, line 42 42: def defaults 43: @defaults ||= {} 44: end
# File lib/rack/mount/generatable_regexp.rb, line 35 35: def defaults=(defaults) 36: @required_captures = nil 37: @required_params = nil 38: @required_defaults = nil 39: @defaults = defaults 40: end
# File lib/rack/mount/generatable_regexp.rb, line 96 96: def freeze 97: segments 98: captures 99: required_captures 100: required_params 101: required_defaults 102: super 103: end
# File lib/rack/mount/generatable_regexp.rb, line 46 46: def generatable? 47: segments.any? 48: end
# File lib/rack/mount/generatable_regexp.rb, line 50 50: def generate(params = {}, recall = {}, options = {}) 51: return nil unless generatable? 52: 53: merged = recall.merge(params) 54: return nil unless required_params.all? { |p| merged.include?(p) } 55: return nil unless required_defaults.all? { |k, v| merged[k] == v } 56: 57: generate_from_segments(segments, params, merged, options) 58: end
# File lib/rack/mount/generatable_regexp.rb, line 76 76: def required_captures 77: @required_captures ||= segments.find_all { |s| 78: s.is_a?(DynamicSegment) && !@defaults.include?(s.name) 79: }.freeze 80: end
# File lib/rack/mount/generatable_regexp.rb, line 86 86: def required_defaults 87: @required_defaults ||= begin 88: required_defaults = @defaults.dup 89: captures.inject({}) { |h, s| h.merge!(s.to_hash) }.keys.each { |name| 90: required_defaults.delete(name) 91: } 92: required_defaults 93: end 94: end
# File lib/rack/mount/generatable_regexp.rb, line 138 138: def generate_from_segments(segments, params, merged, options, optional = false) 139: if optional 140: return EMPTY_STRING if segments.all? { |s| s.is_a?(String) } 141: return EMPTY_STRING unless segments.flatten.any? { |s| 142: params.has_key?(s.name) if s.is_a?(DynamicSegment) 143: } 144: return EMPTY_STRING if segments.any? { |segment| 145: if segment.is_a?(DynamicSegment) 146: value = merged[segment.name] || @defaults[segment.name] 147: value = parameterize(segment.name, value, options) 148: 149: merged_value = parameterize(segment.name, merged[segment.name], options) 150: default_value = parameterize(segment.name, @defaults[segment.name], options) 151: 152: if value.nil? || segment !~ value 153: true 154: elsif merged_value == default_value 155: # Nasty control flow 156: return :clear_remaining_segments 157: else 158: false 159: end 160: end 161: } 162: end 163: 164: generated = segments.map do |segment| 165: case segment 166: when String 167: segment 168: when DynamicSegment 169: value = params[segment.name] || merged[segment.name] || @defaults[segment.name] 170: value = parameterize(segment.name, value, options) 171: if value && segment =~ value.to_s 172: value 173: else 174: return 175: end 176: when Array 177: value = generate_from_segments(segment, params, merged, options, true) 178: if value == :clear_remaining_segments 179: segment.each { |s| params.delete(s.name) if s.is_a?(DynamicSegment) } 180: EMPTY_STRING 181: elsif value.nil? 182: EMPTY_STRING 183: else 184: value 185: end 186: end 187: end 188: 189: # Delete any used items from the params 190: segments.each { |s| params.delete(s.name) if s.is_a?(DynamicSegment) } 191: 192: generated.join 193: end
# File lib/rack/mount/generatable_regexp.rb, line 195 195: def parameterize(name, value, options) 196: if block = options[:parameterize] 197: block.call(name, value) 198: else 199: value 200: end 201: end
# File lib/rack/mount/generatable_regexp.rb, line 106 106: def parse_segments(segments) 107: s = [] 108: segments.each_with_index do |part, index| 109: case part 110: when Regin::Anchor 111: # ignore 112: when Regin::Character 113: throw :halt unless part.literal? 114: 115: if s.last.is_a?(String) 116: s.last << part.value.dup 117: else 118: s << part.value.dup 119: end 120: when Regin::Group 121: if part.name 122: s << DynamicSegment.new(part.name, part.expression.to_regexp(true)) 123: else 124: s << parse_segments(part.expression) 125: end 126: when Regin::Expression 127: return parse_segments(part) 128: else 129: throw :halt 130: end 131: end 132: 133: s 134: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.