pakyow-core 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/pakyow-core/{CHANGES → CHANGELOG.md} +37 -10
 - data/pakyow-core/{MIT-LICENSE → LICENSE} +2 -2
 - data/pakyow-core/README.md +34 -0
 - data/pakyow-core/lib/core/app.rb +50 -39
 - data/pakyow-core/lib/core/base.rb +6 -2
 - data/pakyow-core/lib/core/config/app.rb +8 -4
 - data/pakyow-core/lib/core/config.rb +8 -5
 - data/pakyow-core/lib/core/helpers.rb +5 -5
 - data/pakyow-core/lib/core/middleware/logger.rb +3 -55
 - data/pakyow-core/lib/core/request.rb +5 -1
 - data/pakyow-core/lib/core/response.rb +115 -0
 - data/pakyow-core/lib/core/route_eval.rb +33 -263
 - data/pakyow-core/lib/core/route_expansion_eval.rb +115 -0
 - data/pakyow-core/lib/core/route_lookup.rb +1 -8
 - data/pakyow-core/lib/core/route_template_defaults.rb +12 -2
 - data/pakyow-core/lib/core/route_template_eval.rb +72 -0
 - data/pakyow-core/lib/core/router.rb +8 -2
 - data/pakyow-core/lib/pakyow-core.rb +1 -3
 - data/pakyow-core/lib/views/errors/404.html +13 -77
 - data/pakyow-core/lib/views/errors/500.html +12 -53
 - metadata +32 -17
 - data/pakyow-core/README +0 -1
 
| 
         @@ -17,23 +17,24 @@ module Pakyow 
     | 
|
| 
       17 
17 
     | 
    
         
             
                    return instance
         
     | 
| 
       18 
18 
     | 
    
         
             
                  end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                  def from_scope(route_eval,  
     | 
| 
       21 
     | 
    
         
            -
            				 
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
                  def from_scope(route_eval, args = {})
         
     | 
| 
      
 21 
     | 
    
         
            +
            				[:path, :fns, :hooks, :templates, :group].each do |arg|
         
     | 
| 
      
 22 
     | 
    
         
            +
                      next unless value = route_eval.instance_variable_get(:"@#{arg}")
         
     | 
| 
      
 23 
     | 
    
         
            +
                      args[arg] ||= value.dup
         
     | 
| 
       23 
24 
     | 
    
         
             
            				end
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
                     
     | 
| 
      
 26 
     | 
    
         
            +
                    self.new(args)
         
     | 
| 
       26 
27 
     | 
    
         
             
                  end
         
     | 
| 
       27 
28 
     | 
    
         
             
                end
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                def initialize(path  
     | 
| 
      
 30 
     | 
    
         
            +
                def initialize(path: '/', fns: {}, hooks: { before: [], after: [] }, templates: {}, group: nil)
         
     | 
| 
       30 
31 
     | 
    
         
             
                  @path      = path
         
     | 
| 
       31 
     | 
    
         
            -
                  @fns       = fns 
     | 
| 
       32 
     | 
    
         
            -
                  @ 
     | 
| 
       33 
     | 
    
         
            -
                  @ 
     | 
| 
       34 
     | 
    
         
            -
                  @templates = templates || {}
         
     | 
| 
      
 32 
     | 
    
         
            +
                  @fns       = fns
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @hooks     = hooks
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @templates = templates
         
     | 
| 
       35 
35 
     | 
    
         
             
                  @group     = group
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
      
 37 
     | 
    
         
            +
                  @routes    = HTTP_METHODS.inject({}) { |acc, m| acc[m] = []; acc }
         
     | 
| 
       37 
38 
     | 
    
         
             
                  @lookup    = { routes: {}, grouped: {} }
         
     | 
| 
       38 
39 
     | 
    
         
             
                  @handlers  = []
         
     | 
| 
       39 
40 
     | 
    
         
             
                end
         
     | 
| 
         @@ -52,7 +53,7 @@ module Pakyow 
     | 
|
| 
       52 
53 
     | 
    
         
             
                  instance_exec(&block)
         
     | 
| 
       53 
54 
     | 
    
         
             
                end
         
     | 
| 
       54 
55 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                # Creates or retreives a named route function. 
     | 
| 
      
 56 
     | 
    
         
            +
                # Creates or retreives a named route function.
         
     | 
| 
       56 
57 
     | 
    
         
             
                #
         
     | 
| 
       57 
58 
     | 
    
         
             
                def fn(name, &block)
         
     | 
| 
       58 
59 
     | 
    
         
             
                  if block_given?
         
     | 
| 
         @@ -65,15 +66,18 @@ module Pakyow 
     | 
|
| 
       65 
66 
     | 
    
         
             
                # Creates a handler.
         
     | 
| 
       66 
67 
     | 
    
         
             
                #
         
     | 
| 
       67 
68 
     | 
    
         
             
                def handler(*args, &block)
         
     | 
| 
       68 
     | 
    
         
            -
                  name, code,  
     | 
| 
       69 
     | 
    
         
            -
                   
     | 
| 
      
 69 
     | 
    
         
            +
                  args = Aargv.normalize(args, name: Symbol, code: Integer, fn: Proc, hooks: Hash)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  
         
     | 
| 
      
 71 
     | 
    
         
            +
                  fns = []
         
     | 
| 
      
 72 
     | 
    
         
            +
                  # add the passed proc
         
     | 
| 
      
 73 
     | 
    
         
            +
                  fns << args[:fn] unless args[:fn].nil?
         
     | 
| 
       70 
74 
     | 
    
         
             
                  # add passed block to fns
         
     | 
| 
       71 
75 
     | 
    
         
             
                  fns << block if block_given?
         
     | 
| 
       72 
76 
     | 
    
         | 
| 
       73 
77 
     | 
    
         
             
                  # build the final list of fns
         
     | 
| 
       74 
     | 
    
         
            -
                  fns = build_fns(fns, hooks)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  fns = build_fns(fns, args[:hooks])
         
     | 
| 
       75 
79 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                  @handlers.unshift([name, code, fns])
         
     | 
| 
      
 80 
     | 
    
         
            +
                  @handlers.unshift([args[:name], args[:code], fns])
         
     | 
| 
       77 
81 
     | 
    
         
             
                end
         
     | 
| 
       78 
82 
     | 
    
         | 
| 
       79 
83 
     | 
    
         
             
                def group(*args, &block)
         
     | 
| 
         @@ -95,22 +99,21 @@ module Pakyow 
     | 
|
| 
       95 
99 
     | 
    
         
             
                end
         
     | 
| 
       96 
100 
     | 
    
         | 
| 
       97 
101 
     | 
    
         
             
                def template(*args, &block)
         
     | 
| 
       98 
     | 
    
         
            -
                   
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
                  @templates[name] = [hooks, block]
         
     | 
| 
      
 102 
     | 
    
         
            +
                  args = Aargv.normalize(args, name: Symbol, hooks: Hash)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  @templates[args[:name]] = [args[:hooks], block]
         
     | 
| 
       101 
104 
     | 
    
         
             
                end
         
     | 
| 
       102 
105 
     | 
    
         | 
| 
       103 
106 
     | 
    
         
             
                def expand(t_name, g_name = nil, *args, &block)
         
     | 
| 
       104 
     | 
    
         
            -
                   
     | 
| 
       105 
     | 
    
         
            -
                  path  
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
      
 107 
     | 
    
         
            +
                  args = Aargv.normalize(args, path: [String, ''], hooks: Hash)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  path = args[:path]
         
     | 
| 
      
 109 
     | 
    
         
            +
                  hooks = args[:hooks]
         
     | 
| 
       107 
110 
     | 
    
         
             
                  template = @templates[t_name]
         
     | 
| 
       108 
111 
     | 
    
         | 
| 
       109 
112 
     | 
    
         
             
                  evaluator = RouteExpansionEval.from_scope(self, path: File.join(descendent_path, path), group: g_name, hooks: hooks)
         
     | 
| 
       110 
113 
     | 
    
         
             
            			evaluator.direct_path = path
         
     | 
| 
       111 
114 
     | 
    
         
             
                  evaluator.set_template(g_name, template)
         
     | 
| 
       112 
115 
     | 
    
         
             
                  evaluator.eval(&block)
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
      
 116 
     | 
    
         
            +
                        
         
     | 
| 
       114 
117 
     | 
    
         
             
                  merge(evaluator)
         
     | 
| 
       115 
118 
     | 
    
         
             
                end
         
     | 
| 
       116 
119 
     | 
    
         | 
| 
         @@ -130,7 +133,6 @@ module Pakyow 
     | 
|
| 
       130 
133 
     | 
    
         
             
                    expand(method, *args, &block)
         
     | 
| 
       131 
134 
     | 
    
         
             
                  else
         
     | 
| 
       132 
135 
     | 
    
         
             
                    super
         
     | 
| 
       133 
     | 
    
         
            -
                    # action(method, *args, &block)
         
     | 
| 
       134 
136 
     | 
    
         
             
                  end
         
     | 
| 
       135 
137 
     | 
    
         
             
                end
         
     | 
| 
       136 
138 
     | 
    
         | 
| 
         @@ -141,14 +143,19 @@ module Pakyow 
     | 
|
| 
       141 
143 
     | 
    
         
             
                protected
         
     | 
| 
       142 
144 
     | 
    
         | 
| 
       143 
145 
     | 
    
         
             
            		def build_route(method, *args, &block)
         
     | 
| 
       144 
     | 
    
         
            -
                  path, name, fns, hooks  
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
                   
     | 
| 
      
 146 
     | 
    
         
            +
                  args = Aargv.normalize(args, path: String, regex_path: Regexp, name: Symbol, fn: Proc, fns: Array, hooks: Hash)
         
     | 
| 
      
 147 
     | 
    
         
            +
                  
         
     | 
| 
      
 148 
     | 
    
         
            +
                  path = args[:path] || args[:regex_path]
         
     | 
| 
      
 149 
     | 
    
         
            +
                  name = args[:name]
         
     | 
| 
      
 150 
     | 
    
         
            +
                  
         
     | 
| 
      
 151 
     | 
    
         
            +
                  fns = args[:fns] || []
         
     | 
| 
      
 152 
     | 
    
         
            +
                  # add passed fn
         
     | 
| 
      
 153 
     | 
    
         
            +
                  fns << args[:fn] unless args[:fn].nil?
         
     | 
| 
       147 
154 
     | 
    
         
             
                  # add passed block to fns
         
     | 
| 
       148 
155 
     | 
    
         
             
                  fns << block if block_given?
         
     | 
| 
       149 
156 
     | 
    
         | 
| 
       150 
157 
     | 
    
         
             
                  # merge route hooks with scoped hooks
         
     | 
| 
       151 
     | 
    
         
            -
                  hooks = merge_hooks(hooks || {} 
     | 
| 
      
 158 
     | 
    
         
            +
                  hooks = merge_hooks(@hooks, args[:hooks] || {})
         
     | 
| 
       152 
159 
     | 
    
         | 
| 
       153 
160 
     | 
    
         
             
                  # build the final list of fns
         
     | 
| 
       154 
161 
     | 
    
         
             
                  fns = build_fns(fns, hooks)
         
     | 
| 
         @@ -217,24 +224,6 @@ module Pakyow 
     | 
|
| 
       217 
224 
     | 
    
         
             
                end
         
     | 
| 
       218 
225 
     | 
    
         | 
| 
       219 
226 
     | 
    
         
             
                class << self
         
     | 
| 
       220 
     | 
    
         
            -
                  def parse_route_args(args)
         
     | 
| 
       221 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       222 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       223 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       224 
     | 
    
         
            -
                        ret[3] = arg
         
     | 
| 
       225 
     | 
    
         
            -
                      elsif arg.is_a?(Array) # we have fns
         
     | 
| 
       226 
     | 
    
         
            -
                        ret[2] = arg
         
     | 
| 
       227 
     | 
    
         
            -
                      elsif arg.is_a?(Proc) # we have a fn
         
     | 
| 
       228 
     | 
    
         
            -
                        ret[2] = [arg]
         
     | 
| 
       229 
     | 
    
         
            -
                      elsif arg.is_a?(Symbol) # we have a name
         
     | 
| 
       230 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       231 
     | 
    
         
            -
                      elsif !arg.nil? # we have a path
         
     | 
| 
       232 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       233 
     | 
    
         
            -
                      end
         
     | 
| 
       234 
     | 
    
         
            -
                    }
         
     | 
| 
       235 
     | 
    
         
            -
                    ret
         
     | 
| 
       236 
     | 
    
         
            -
                  end
         
     | 
| 
       237 
     | 
    
         
            -
             
     | 
| 
       238 
227 
     | 
    
         
             
                  def parse_namespace_args(args)
         
     | 
| 
       239 
228 
     | 
    
         
             
                    ret = []
         
     | 
| 
       240 
229 
     | 
    
         
             
                    args.each { |arg|
         
     | 
| 
         @@ -260,225 +249,6 @@ module Pakyow 
     | 
|
| 
       260 
249 
     | 
    
         
             
                    }
         
     | 
| 
       261 
250 
     | 
    
         
             
                    ret
         
     | 
| 
       262 
251 
     | 
    
         
             
                  end
         
     | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
       264 
     | 
    
         
            -
                  def parse_handler_args(args)
         
     | 
| 
       265 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       266 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       267 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       268 
     | 
    
         
            -
                        ret[3] = arg
         
     | 
| 
       269 
     | 
    
         
            -
                      elsif arg.is_a?(Proc) # we have a fn
         
     | 
| 
       270 
     | 
    
         
            -
                        ret[2] = [arg]
         
     | 
| 
       271 
     | 
    
         
            -
                      elsif arg.is_a?(Integer) # we have a code
         
     | 
| 
       272 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       273 
     | 
    
         
            -
                      elsif !arg.nil? # we have a name
         
     | 
| 
       274 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       275 
     | 
    
         
            -
                      end
         
     | 
| 
       276 
     | 
    
         
            -
                    }
         
     | 
| 
       277 
     | 
    
         
            -
                    ret
         
     | 
| 
       278 
     | 
    
         
            -
                  end
         
     | 
| 
       279 
     | 
    
         
            -
             
     | 
| 
       280 
     | 
    
         
            -
                  def parse_template_args(args)
         
     | 
| 
       281 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       282 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       283 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       284 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       285 
     | 
    
         
            -
                      elsif !arg.nil? # we have a name
         
     | 
| 
       286 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       287 
     | 
    
         
            -
                      end
         
     | 
| 
       288 
     | 
    
         
            -
                    }
         
     | 
| 
       289 
     | 
    
         
            -
                    ret
         
     | 
| 
       290 
     | 
    
         
            -
                  end
         
     | 
| 
       291 
     | 
    
         
            -
             
     | 
| 
       292 
     | 
    
         
            -
                  def parse_expansion_args(args)
         
     | 
| 
       293 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       294 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       295 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       296 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       297 
     | 
    
         
            -
                      elsif !arg.nil? # we have a path
         
     | 
| 
       298 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       299 
     | 
    
         
            -
                      end
         
     | 
| 
       300 
     | 
    
         
            -
                    }
         
     | 
| 
       301 
     | 
    
         
            -
                    ret
         
     | 
| 
       302 
     | 
    
         
            -
                  end
         
     | 
| 
       303 
252 
     | 
    
         
             
                end
         
     | 
| 
       304 
253 
     | 
    
         
             
              end
         
     | 
| 
       305 
     | 
    
         
            -
             
     | 
| 
       306 
     | 
    
         
            -
              class RouteExpansionEval < RouteEval
         
     | 
| 
       307 
     | 
    
         
            -
                attr_writer :direct_path
         
     | 
| 
       308 
     | 
    
         
            -
             
     | 
| 
       309 
     | 
    
         
            -
                def eval(&block)
         
     | 
| 
       310 
     | 
    
         
            -
                  @template_eval = RouteTemplateEval.from_scope(self, path: path, group: @group, hooks: @hooks)
         
     | 
| 
       311 
     | 
    
         
            -
            			@template_eval.direct_path = @direct_path
         
     | 
| 
       312 
     | 
    
         
            -
            			@template_eval.eval(&@template_block)
         
     | 
| 
       313 
     | 
    
         
            -
             
     | 
| 
       314 
     | 
    
         
            -
            			@path = @template_eval.routes_path
         
     | 
| 
       315 
     | 
    
         
            -
             
     | 
| 
       316 
     | 
    
         
            -
                  super
         
     | 
| 
       317 
     | 
    
         
            -
                end
         
     | 
| 
       318 
     | 
    
         
            -
             
     | 
| 
       319 
     | 
    
         
            -
                def set_template(expansion_name, template)
         
     | 
| 
       320 
     | 
    
         
            -
                  @expansion_name = expansion_name
         
     | 
| 
       321 
     | 
    
         
            -
                  @template_block = template[1]
         
     | 
| 
       322 
     | 
    
         
            -
             
     | 
| 
       323 
     | 
    
         
            -
                  @hooks = merge_hooks(@hooks, template[0])
         
     | 
| 
       324 
     | 
    
         
            -
                end
         
     | 
| 
       325 
     | 
    
         
            -
             
     | 
| 
       326 
     | 
    
         
            -
                def action(method, *args, &block)
         
     | 
| 
       327 
     | 
    
         
            -
                  fn, hooks = self.class.parse_action_args(args)
         
     | 
| 
       328 
     | 
    
         
            -
            			fn = block if block_given?
         
     | 
| 
       329 
     | 
    
         
            -
             
     | 
| 
       330 
     | 
    
         
            -
            			# get route info from template
         
     | 
| 
       331 
     | 
    
         
            -
            			route = @template_eval.route_for_action(method)
         
     | 
| 
       332 
     | 
    
         
            -
             
     | 
| 
       333 
     | 
    
         
            -
            			all_fns = route[3]
         
     | 
| 
       334 
     | 
    
         
            -
            			all_fns[:fns].unshift(fn) if fn
         
     | 
| 
       335 
     | 
    
         
            -
             
     | 
| 
       336 
     | 
    
         
            -
            			hooks = merge_hooks(hooks, all_fns[:hooks])
         
     | 
| 
       337 
     | 
    
         
            -
            			route[3] = build_fns(all_fns[:fns], hooks)
         
     | 
| 
       338 
     | 
    
         
            -
             
     | 
| 
       339 
     | 
    
         
            -
            			register_route(route)
         
     | 
| 
       340 
     | 
    
         
            -
                end
         
     | 
| 
       341 
     | 
    
         
            -
             
     | 
| 
       342 
     | 
    
         
            -
            		def action_group(*args, &block)
         
     | 
| 
       343 
     | 
    
         
            -
                  name, hooks = self.class.parse_action_group_args(args)
         
     | 
| 
       344 
     | 
    
         
            -
            			group = @template_eval.group_named(name)
         
     | 
| 
       345 
     | 
    
         
            -
             
     | 
| 
       346 
     | 
    
         
            -
            			hooks = merge_hooks(hooks, group[0])
         
     | 
| 
       347 
     | 
    
         
            -
            			group(@expansion_name, hooks, &block)
         
     | 
| 
       348 
     | 
    
         
            -
            		end
         
     | 
| 
       349 
     | 
    
         
            -
             
     | 
| 
       350 
     | 
    
         
            -
            		def action_namespace(*args, &block)
         
     | 
| 
       351 
     | 
    
         
            -
                  name, hooks = self.class.parse_action_namespace_args(args)
         
     | 
| 
       352 
     | 
    
         
            -
            			namespace = @template_eval.namespace_named(name)
         
     | 
| 
       353 
     | 
    
         
            -
             
     | 
| 
       354 
     | 
    
         
            -
            			hooks = merge_hooks(hooks, namespace[1])
         
     | 
| 
       355 
     | 
    
         
            -
            			namespace(@expansion_name, namespace[0], hooks, &block)
         
     | 
| 
       356 
     | 
    
         
            -
            		end
         
     | 
| 
       357 
     | 
    
         
            -
             
     | 
| 
       358 
     | 
    
         
            -
                def method_missing(method, *args, &block)
         
     | 
| 
       359 
     | 
    
         
            -
            			if @template_eval.has_action?(method)
         
     | 
| 
       360 
     | 
    
         
            -
            				action(method, *args, &block)
         
     | 
| 
       361 
     | 
    
         
            -
            			elsif @template_eval.has_namespace?(method)
         
     | 
| 
       362 
     | 
    
         
            -
            				action_namespace(method, *args, &block)
         
     | 
| 
       363 
     | 
    
         
            -
            			elsif @template_eval.has_group?(method)
         
     | 
| 
       364 
     | 
    
         
            -
            				action_group(method, *args, &block)
         
     | 
| 
       365 
     | 
    
         
            -
            			else
         
     | 
| 
       366 
     | 
    
         
            -
            				super
         
     | 
| 
       367 
     | 
    
         
            -
            			end
         
     | 
| 
       368 
     | 
    
         
            -
            		rescue NoMethodError
         
     | 
| 
       369 
     | 
    
         
            -
            			raise UnknownTemplatePart, "No action, namespace, or group named '#{method}'"
         
     | 
| 
       370 
     | 
    
         
            -
                end
         
     | 
| 
       371 
     | 
    
         
            -
             
     | 
| 
       372 
     | 
    
         
            -
            		def expand(*args, &block)
         
     | 
| 
       373 
     | 
    
         
            -
            			args[2] = File.join(@template_eval.nested_path.gsub(@path, ''), args[2])
         
     | 
| 
       374 
     | 
    
         
            -
            			super(*args, &block)
         
     | 
| 
       375 
     | 
    
         
            -
            		end
         
     | 
| 
       376 
     | 
    
         
            -
             
     | 
| 
       377 
     | 
    
         
            -
            		private
         
     | 
| 
       378 
     | 
    
         
            -
             
     | 
| 
       379 
     | 
    
         
            -
            		class << self
         
     | 
| 
       380 
     | 
    
         
            -
                  def parse_action_args(args)
         
     | 
| 
       381 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       382 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       383 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       384 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       385 
     | 
    
         
            -
                      elsif arg.is_a?(Proc) # we have a fn
         
     | 
| 
       386 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       387 
     | 
    
         
            -
                      end
         
     | 
| 
       388 
     | 
    
         
            -
                    }
         
     | 
| 
       389 
     | 
    
         
            -
                    ret
         
     | 
| 
       390 
     | 
    
         
            -
                  end
         
     | 
| 
       391 
     | 
    
         
            -
             
     | 
| 
       392 
     | 
    
         
            -
                  def parse_action_namespace_args(args)
         
     | 
| 
       393 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       394 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       395 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       396 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       397 
     | 
    
         
            -
                      elsif arg.is_a?(Symbol) # we have a name
         
     | 
| 
       398 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       399 
     | 
    
         
            -
                      end
         
     | 
| 
       400 
     | 
    
         
            -
                    }
         
     | 
| 
       401 
     | 
    
         
            -
                    ret
         
     | 
| 
       402 
     | 
    
         
            -
                  end
         
     | 
| 
       403 
     | 
    
         
            -
             
     | 
| 
       404 
     | 
    
         
            -
                  def parse_action_group_args(args)
         
     | 
| 
       405 
     | 
    
         
            -
                    ret = []
         
     | 
| 
       406 
     | 
    
         
            -
                    args.each { |arg|
         
     | 
| 
       407 
     | 
    
         
            -
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
       408 
     | 
    
         
            -
                        ret[1] = arg
         
     | 
| 
       409 
     | 
    
         
            -
                      elsif !arg.nil? # we have a name
         
     | 
| 
       410 
     | 
    
         
            -
                        ret[0] = arg
         
     | 
| 
       411 
     | 
    
         
            -
                      end
         
     | 
| 
       412 
     | 
    
         
            -
                    }
         
     | 
| 
       413 
     | 
    
         
            -
                    ret
         
     | 
| 
       414 
     | 
    
         
            -
                  end
         
     | 
| 
       415 
     | 
    
         
            -
            		end
         
     | 
| 
       416 
     | 
    
         
            -
              end
         
     | 
| 
       417 
     | 
    
         
            -
             
     | 
| 
       418 
     | 
    
         
            -
              class RouteTemplateEval < RouteEval
         
     | 
| 
       419 
     | 
    
         
            -
            		attr_accessor :direct_path
         
     | 
| 
       420 
     | 
    
         
            -
             
     | 
| 
       421 
     | 
    
         
            -
            		def initialize(*args)
         
     | 
| 
       422 
     | 
    
         
            -
            			super
         
     | 
| 
       423 
     | 
    
         
            -
             
     | 
| 
       424 
     | 
    
         
            -
            			@groups = {}
         
     | 
| 
       425 
     | 
    
         
            -
            			@namespaces = {}
         
     | 
| 
       426 
     | 
    
         
            -
             
     | 
| 
       427 
     | 
    
         
            -
            			@routes_path = path
         
     | 
| 
       428 
     | 
    
         
            -
            			@nested_path = path
         
     | 
| 
       429 
     | 
    
         
            -
            		end
         
     | 
| 
       430 
     | 
    
         
            -
             
     | 
| 
       431 
     | 
    
         
            -
            		def has_action?(name)
         
     | 
| 
       432 
     | 
    
         
            -
            		 	!route_for_action(name).nil?
         
     | 
| 
       433 
     | 
    
         
            -
            		end
         
     | 
| 
       434 
     | 
    
         
            -
             
     | 
| 
       435 
     | 
    
         
            -
            		def has_group?(name)
         
     | 
| 
       436 
     | 
    
         
            -
            			!group_named(name).nil?
         
     | 
| 
       437 
     | 
    
         
            -
            		end
         
     | 
| 
       438 
     | 
    
         
            -
             
     | 
| 
       439 
     | 
    
         
            -
            		def has_namespace?(name)
         
     | 
| 
       440 
     | 
    
         
            -
            			!namespace_named(name).nil?
         
     | 
| 
       441 
     | 
    
         
            -
            		end
         
     | 
| 
       442 
     | 
    
         
            -
             
     | 
| 
       443 
     | 
    
         
            -
            		def route_for_action(name)
         
     | 
| 
       444 
     | 
    
         
            -
            			lookup.fetch(:grouped, {}).fetch(@group, {})[name]
         
     | 
| 
       445 
     | 
    
         
            -
            		end
         
     | 
| 
       446 
     | 
    
         
            -
             
     | 
| 
       447 
     | 
    
         
            -
            		def namespace_named(name)
         
     | 
| 
       448 
     | 
    
         
            -
            			@namespaces[name]
         
     | 
| 
       449 
     | 
    
         
            -
            		end
         
     | 
| 
       450 
     | 
    
         
            -
             
     | 
| 
       451 
     | 
    
         
            -
            		def group_named(name)
         
     | 
| 
       452 
     | 
    
         
            -
            			@groups[name]
         
     | 
| 
       453 
     | 
    
         
            -
            		end
         
     | 
| 
       454 
     | 
    
         
            -
             
     | 
| 
       455 
     | 
    
         
            -
            		def build_fns(fns, hooks)
         
     | 
| 
       456 
     | 
    
         
            -
            			{
         
     | 
| 
       457 
     | 
    
         
            -
            				fns: fns,
         
     | 
| 
       458 
     | 
    
         
            -
            				hooks: hooks,
         
     | 
| 
       459 
     | 
    
         
            -
            			}
         
     | 
| 
       460 
     | 
    
         
            -
            		end
         
     | 
| 
       461 
     | 
    
         
            -
             
     | 
| 
       462 
     | 
    
         
            -
            		def namespace(*args)
         
     | 
| 
       463 
     | 
    
         
            -
                  path, name, hooks = self.class.parse_namespace_args(args)
         
     | 
| 
       464 
     | 
    
         
            -
            			@namespaces[name] = [path, hooks]
         
     | 
| 
       465 
     | 
    
         
            -
            		end
         
     | 
| 
       466 
     | 
    
         
            -
             
     | 
| 
       467 
     | 
    
         
            -
            		def group(*args)
         
     | 
| 
       468 
     | 
    
         
            -
                  name, hooks = self.class.parse_group_args(args)
         
     | 
| 
       469 
     | 
    
         
            -
            			@groups[name] = [hooks]
         
     | 
| 
       470 
     | 
    
         
            -
            		end
         
     | 
| 
       471 
     | 
    
         
            -
             
     | 
| 
       472 
     | 
    
         
            -
            		def routes_path(&block)
         
     | 
| 
       473 
     | 
    
         
            -
            			return @routes_path unless block_given?
         
     | 
| 
       474 
     | 
    
         
            -
            			@routes_path = yield(@routes_path)
         
     | 
| 
       475 
     | 
    
         
            -
            			@path = @routes_path
         
     | 
| 
       476 
     | 
    
         
            -
            		end
         
     | 
| 
       477 
     | 
    
         
            -
             
     | 
| 
       478 
     | 
    
         
            -
            		def nested_path(&block)
         
     | 
| 
       479 
     | 
    
         
            -
            			return @nested_path unless block_given?
         
     | 
| 
       480 
     | 
    
         
            -
            			@nested_path = yield(@nested_path)
         
     | 
| 
       481 
     | 
    
         
            -
            		end
         
     | 
| 
       482 
     | 
    
         
            -
              end
         
     | 
| 
       483 
254 
     | 
    
         
             
            end
         
     | 
| 
       484 
     | 
    
         
            -
             
     | 
| 
         @@ -0,0 +1,115 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Pakyow
         
     | 
| 
      
 2 
     | 
    
         
            +
              class RouteExpansionEval < RouteEval
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_writer :direct_path
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def eval(&block)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  @template_eval = RouteTemplateEval.from_scope(self, path: path, group: @group, hooks: @hooks)
         
     | 
| 
      
 7 
     | 
    
         
            +
              		@template_eval.direct_path = @direct_path
         
     | 
| 
      
 8 
     | 
    
         
            +
              		@template_eval.eval(&@template_block)
         
     | 
| 
      
 9 
     | 
    
         
            +
                
         
     | 
| 
      
 10 
     | 
    
         
            +
              		@path = @template_eval.routes_path
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  super
         
     | 
| 
      
 13 
     | 
    
         
            +
                  
         
     | 
| 
      
 14 
     | 
    
         
            +
                  instance_exec(&@template_eval.post_process) if @template_eval.post_process
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def set_template(expansion_name, template)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @expansion_name = expansion_name
         
     | 
| 
      
 19 
     | 
    
         
            +
                  @template_block = template[1]
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  @hooks = merge_hooks(@hooks, template[0])
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def action(method, *args, &block)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  fn, hooks = self.class.parse_action_args(args)
         
     | 
| 
      
 26 
     | 
    
         
            +
              		fn = block if block_given?
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              		# get route info from template
         
     | 
| 
      
 29 
     | 
    
         
            +
              		route = @template_eval.route_for_action(method)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              		all_fns = route[3]
         
     | 
| 
      
 32 
     | 
    
         
            +
              		all_fns[:fns].unshift(fn) if fn
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              		hooks = merge_hooks(hooks, all_fns[:hooks])
         
     | 
| 
      
 35 
     | 
    
         
            +
              		route[3] = build_fns(all_fns[:fns], hooks)
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              		register_route(route)
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              	def action_group(*args, &block)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  name, hooks = self.class.parse_action_group_args(args)
         
     | 
| 
      
 42 
     | 
    
         
            +
              		group = @template_eval.group_named(name)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              		hooks = merge_hooks(hooks, group[0])
         
     | 
| 
      
 45 
     | 
    
         
            +
              		group(@expansion_name, hooks, &block)
         
     | 
| 
      
 46 
     | 
    
         
            +
              	end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              	def action_namespace(*args, &block)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  name, hooks = self.class.parse_action_namespace_args(args)
         
     | 
| 
      
 50 
     | 
    
         
            +
              		namespace = @template_eval.namespace_named(name)
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
              		hooks = merge_hooks(hooks, namespace[1])
         
     | 
| 
      
 53 
     | 
    
         
            +
              		namespace(@expansion_name, namespace[0], hooks, &block)
         
     | 
| 
      
 54 
     | 
    
         
            +
              	end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                def method_missing(method, *args, &block)
         
     | 
| 
      
 57 
     | 
    
         
            +
              		if @template_eval.has_action?(method)
         
     | 
| 
      
 58 
     | 
    
         
            +
              			action(method, *args, &block)
         
     | 
| 
      
 59 
     | 
    
         
            +
              		elsif @template_eval.has_namespace?(method)
         
     | 
| 
      
 60 
     | 
    
         
            +
              			action_namespace(method, *args, &block)
         
     | 
| 
      
 61 
     | 
    
         
            +
              		elsif @template_eval.has_group?(method)
         
     | 
| 
      
 62 
     | 
    
         
            +
              			action_group(method, *args, &block)
         
     | 
| 
      
 63 
     | 
    
         
            +
              		else
         
     | 
| 
      
 64 
     | 
    
         
            +
              			super
         
     | 
| 
      
 65 
     | 
    
         
            +
              		end
         
     | 
| 
      
 66 
     | 
    
         
            +
              	rescue NoMethodError
         
     | 
| 
      
 67 
     | 
    
         
            +
              		raise UnknownTemplatePart, "No action, namespace, or group named '#{method}'"
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
              	def expand(*args, &block)
         
     | 
| 
      
 71 
     | 
    
         
            +
              		args[2] = File.join(@template_eval.nested_path.gsub(@path, ''), args[2])
         
     | 
| 
      
 72 
     | 
    
         
            +
              		super(*args, &block)
         
     | 
| 
      
 73 
     | 
    
         
            +
              	end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
              	private
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
              	class << self
         
     | 
| 
      
 78 
     | 
    
         
            +
                  def parse_action_args(args)
         
     | 
| 
      
 79 
     | 
    
         
            +
                    ret = []
         
     | 
| 
      
 80 
     | 
    
         
            +
                    args.each { |arg|
         
     | 
| 
      
 81 
     | 
    
         
            +
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
      
 82 
     | 
    
         
            +
                        ret[1] = arg
         
     | 
| 
      
 83 
     | 
    
         
            +
                      elsif arg.is_a?(Proc) # we have a fn
         
     | 
| 
      
 84 
     | 
    
         
            +
                        ret[0] = arg
         
     | 
| 
      
 85 
     | 
    
         
            +
                      end
         
     | 
| 
      
 86 
     | 
    
         
            +
                    }
         
     | 
| 
      
 87 
     | 
    
         
            +
                    ret
         
     | 
| 
      
 88 
     | 
    
         
            +
                  end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                  def parse_action_namespace_args(args)
         
     | 
| 
      
 91 
     | 
    
         
            +
                    ret = []
         
     | 
| 
      
 92 
     | 
    
         
            +
                    args.each { |arg|
         
     | 
| 
      
 93 
     | 
    
         
            +
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
      
 94 
     | 
    
         
            +
                        ret[1] = arg
         
     | 
| 
      
 95 
     | 
    
         
            +
                      elsif arg.is_a?(Symbol) # we have a name
         
     | 
| 
      
 96 
     | 
    
         
            +
                        ret[0] = arg
         
     | 
| 
      
 97 
     | 
    
         
            +
                      end
         
     | 
| 
      
 98 
     | 
    
         
            +
                    }
         
     | 
| 
      
 99 
     | 
    
         
            +
                    ret
         
     | 
| 
      
 100 
     | 
    
         
            +
                  end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                  def parse_action_group_args(args)
         
     | 
| 
      
 103 
     | 
    
         
            +
                    ret = []
         
     | 
| 
      
 104 
     | 
    
         
            +
                    args.each { |arg|
         
     | 
| 
      
 105 
     | 
    
         
            +
                      if arg.is_a?(Hash) # we have hooks
         
     | 
| 
      
 106 
     | 
    
         
            +
                        ret[1] = arg
         
     | 
| 
      
 107 
     | 
    
         
            +
                      elsif !arg.nil? # we have a name
         
     | 
| 
      
 108 
     | 
    
         
            +
                        ret[0] = arg
         
     | 
| 
      
 109 
     | 
    
         
            +
                      end
         
     | 
| 
      
 110 
     | 
    
         
            +
                    }
         
     | 
| 
      
 111 
     | 
    
         
            +
                    ret
         
     | 
| 
      
 112 
     | 
    
         
            +
                  end
         
     | 
| 
      
 113 
     | 
    
         
            +
              	end
         
     | 
| 
      
 114 
     | 
    
         
            +
              end
         
     | 
| 
      
 115 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -35,14 +35,7 @@ module Pakyow 
     | 
|
| 
       35 
35 
     | 
    
         
             
                    split_path[v[:url_position]] = data.delete(v[:var])
         
     | 
| 
       36 
36 
     | 
    
         
             
                  }
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                   
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                  # add remaining data to query string
         
     | 
| 
       41 
     | 
    
         
            -
                  unless data.empty?
         
     | 
| 
       42 
     | 
    
         
            -
                    populated << '/?' + data.map { |k,v| "#{k}=#{v}" }.join('&')
         
     | 
| 
       43 
     | 
    
         
            -
                  end
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                  return populated
         
     | 
| 
      
 38 
     | 
    
         
            +
                  File.join('/', split_path.join('/'))
         
     | 
| 
       46 
39 
     | 
    
         
             
                end
         
     | 
| 
       47 
40 
     | 
    
         
             
              end
         
     | 
| 
       48 
41 
     | 
    
         
             
            end
         
     | 
| 
         @@ -7,10 +7,13 @@ module Pakyow 
     | 
|
| 
       7 
7 
     | 
    
         
             
                    resource_id = ":#{@group}_id"
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                    nested_path { |path| File.join(path, resource_id) }
         
     | 
| 
       10 
     | 
    
         
            -
                    view_path =  
     | 
| 
      
 10 
     | 
    
         
            +
                    view_path = nested_path.gsub(/:[^\/]+/, '').split('/').reject { |p| p.empty? }.join('/')
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                    fn :reset_view_path do
         
     | 
| 
       13 
     | 
    
         
            -
                       
     | 
| 
      
 13 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 14 
     | 
    
         
            +
                        presenter.path = File.join(view_path, 'show') if @presenter
         
     | 
| 
      
 15 
     | 
    
         
            +
                      rescue Presenter::MissingView
         
     | 
| 
      
 16 
     | 
    
         
            +
                      end
         
     | 
| 
       14 
17 
     | 
    
         
             
                    end
         
     | 
| 
       15 
18 
     | 
    
         | 
| 
       16 
19 
     | 
    
         
             
                    get :list, '/'
         
     | 
| 
         @@ -26,6 +29,13 @@ module Pakyow 
     | 
|
| 
       26 
29 
     | 
    
         | 
| 
       27 
30 
     | 
    
         
             
                    group :collection
         
     | 
| 
       28 
31 
     | 
    
         
             
                    namespace :member, resource_id
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    post_process do
         
     | 
| 
      
 34 
     | 
    
         
            +
                      # the show route is weird; move it to the end of get routes to avoid conflicts
         
     | 
| 
      
 35 
     | 
    
         
            +
                      if show_index = @routes[:get].find_index { |route| route[2] == :show }
         
     | 
| 
      
 36 
     | 
    
         
            +
                        @routes[:get] << @routes[:get].delete_at(show_index)
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
      
 38 
     | 
    
         
            +
                    end
         
     | 
| 
       29 
39 
     | 
    
         
             
                  end
         
     | 
| 
       30 
40 
     | 
    
         | 
| 
       31 
41 
     | 
    
         
             
                end
         
     | 
| 
         @@ -0,0 +1,72 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Pakyow
         
     | 
| 
      
 2 
     | 
    
         
            +
              class RouteTemplateEval < RouteEval
         
     | 
| 
      
 3 
     | 
    
         
            +
            		attr_accessor :direct_path
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            		def initialize(*args)
         
     | 
| 
      
 6 
     | 
    
         
            +
            			super
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            			@groups = {}
         
     | 
| 
      
 9 
     | 
    
         
            +
            			@namespaces = {}
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            			@routes_path = path
         
     | 
| 
      
 12 
     | 
    
         
            +
            			@nested_path = path
         
     | 
| 
      
 13 
     | 
    
         
            +
            		end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            		def has_action?(name)
         
     | 
| 
      
 16 
     | 
    
         
            +
            		 	!route_for_action(name).nil?
         
     | 
| 
      
 17 
     | 
    
         
            +
            		end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            		def has_group?(name)
         
     | 
| 
      
 20 
     | 
    
         
            +
            			!group_named(name).nil?
         
     | 
| 
      
 21 
     | 
    
         
            +
            		end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            		def has_namespace?(name)
         
     | 
| 
      
 24 
     | 
    
         
            +
            			!namespace_named(name).nil?
         
     | 
| 
      
 25 
     | 
    
         
            +
            		end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            		def route_for_action(name)
         
     | 
| 
      
 28 
     | 
    
         
            +
            			lookup.fetch(:grouped, {}).fetch(@group, {})[name]
         
     | 
| 
      
 29 
     | 
    
         
            +
            		end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            		def namespace_named(name)
         
     | 
| 
      
 32 
     | 
    
         
            +
            			@namespaces[name]
         
     | 
| 
      
 33 
     | 
    
         
            +
            		end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            		def group_named(name)
         
     | 
| 
      
 36 
     | 
    
         
            +
            			@groups[name]
         
     | 
| 
      
 37 
     | 
    
         
            +
            		end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            		def build_fns(fns, hooks)
         
     | 
| 
      
 40 
     | 
    
         
            +
            			{
         
     | 
| 
      
 41 
     | 
    
         
            +
            				fns: fns,
         
     | 
| 
      
 42 
     | 
    
         
            +
            				hooks: hooks,
         
     | 
| 
      
 43 
     | 
    
         
            +
            			}
         
     | 
| 
      
 44 
     | 
    
         
            +
            		end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            		def namespace(*args)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  path, name, hooks = self.class.parse_namespace_args(args)
         
     | 
| 
      
 48 
     | 
    
         
            +
            			@namespaces[name] = [path, hooks]
         
     | 
| 
      
 49 
     | 
    
         
            +
            		end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            		def group(*args)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  name, hooks = self.class.parse_group_args(args)
         
     | 
| 
      
 53 
     | 
    
         
            +
            			@groups[name] = [hooks]
         
     | 
| 
      
 54 
     | 
    
         
            +
            		end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            		def routes_path(&block)
         
     | 
| 
      
 57 
     | 
    
         
            +
            			return @routes_path unless block_given?
         
     | 
| 
      
 58 
     | 
    
         
            +
            			@routes_path = yield(@routes_path)
         
     | 
| 
      
 59 
     | 
    
         
            +
            			@path = @routes_path
         
     | 
| 
      
 60 
     | 
    
         
            +
            		end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            		def nested_path(&block)
         
     | 
| 
      
 63 
     | 
    
         
            +
            			return @nested_path unless block_given?
         
     | 
| 
      
 64 
     | 
    
         
            +
            			@nested_path = yield(@nested_path)
         
     | 
| 
      
 65 
     | 
    
         
            +
            		end
         
     | 
| 
      
 66 
     | 
    
         
            +
                
         
     | 
| 
      
 67 
     | 
    
         
            +
                def post_process(&block)
         
     | 
| 
      
 68 
     | 
    
         
            +
                  return @post_process unless block_given?
         
     | 
| 
      
 69 
     | 
    
         
            +
                  @post_process = block
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -68,8 +68,14 @@ module Pakyow 
     | 
|
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                # Looks up and populates a path with data
         
     | 
| 
       70 
70 
     | 
    
         
             
                #
         
     | 
| 
       71 
     | 
    
         
            -
                def path( 
     | 
| 
       72 
     | 
    
         
            -
                   
     | 
| 
      
 71 
     | 
    
         
            +
                def path(name_or_path, data = nil)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  if name_or_path.is_a?(String)
         
     | 
| 
      
 73 
     | 
    
         
            +
                    return name_or_path
         
     | 
| 
      
 74 
     | 
    
         
            +
                  elsif name_or_path.is_a?(Hash)
         
     | 
| 
      
 75 
     | 
    
         
            +
                    RouteLookup.new.group(name_or_path.keys[0]).path(name_or_path.values[0], data)
         
     | 
| 
      
 76 
     | 
    
         
            +
                  else
         
     | 
| 
      
 77 
     | 
    
         
            +
                    RouteLookup.new.path(name_or_path, data)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  end
         
     | 
| 
       73 
79 
     | 
    
         
             
                end
         
     | 
| 
       74 
80 
     | 
    
         | 
| 
       75 
81 
     | 
    
         
             
                # Looks up a route grouping
         
     | 
| 
         @@ -1,13 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            libdir = File.dirname(__FILE__)
         
     | 
| 
       2 
2 
     | 
    
         
             
            $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
            # Gems 
     | 
| 
      
 4 
     | 
    
         
            +
            # Gems
         
     | 
| 
       5 
5 
     | 
    
         
             
            require 'find'
         
     | 
| 
       6 
6 
     | 
    
         
             
            require 'rack'
         
     | 
| 
       7 
7 
     | 
    
         
             
            require 'rack/file'
         
     | 
| 
       8 
8 
     | 
    
         
             
            require 'logger'
         
     | 
| 
       9 
9 
     | 
    
         
             
            require 'cgi'
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
            # Base
         
     | 
| 
       12 
11 
     | 
    
         
             
            require 'core/base'
         
     | 
| 
       13 
     | 
    
         
            -
            include Pakyow
         
     |