innate 2012.12 → 2013.02
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.
- data/.travis.yml +4 -3
- data/AUTHORS +2 -2
- data/CHANGELOG +94 -0
- data/innate.gemspec +2 -2
- data/lib/innate.rb +3 -3
- data/lib/innate/helper/aspect.rb +5 -1
- data/lib/innate/helper/link.rb +3 -3
- data/lib/innate/helper/render.rb +5 -2
- data/lib/innate/lru_hash.rb +3 -26
- data/lib/innate/node.rb +48 -5
- data/lib/innate/version.rb +1 -1
- data/spec/innate/helper/aspect.rb +26 -0
- data/spec/innate/helper/link.rb +4 -0
- metadata +2 -2
data/.travis.yml
CHANGED
data/AUTHORS
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Following persons have contributed to innate.
|
2
2
|
(Sorted by number of submitted patches, then alphabetically)
|
3
3
|
|
4
|
-
|
4
|
+
819 Michael Fellinger <m.fellinger@gmail.com>
|
5
5
|
31 Tadahiko Uehara <kikofx@gmail.com>
|
6
|
-
|
6
|
+
21 Yorick Peterse <yorickpeterse@gmail.com>
|
7
7
|
9 Lee Jarvis <injekt.me@gmail.com>
|
8
8
|
8 Pistos <gitsomegrace.5.pistos@geoshell.com>
|
9
9
|
5 injekt <injekt.me@gmail.com>
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,97 @@
|
|
1
|
+
[1a2ee39 | 2013-02-07 00:10:01 UTC] Michael Fellinger <m.fellinger@gmail.com>
|
2
|
+
|
3
|
+
* Version 2013.02
|
4
|
+
|
5
|
+
[64ca67a | 2013-01-29 23:34:26 UTC] Michael Fellinger <m.fellinger@gmail.com>
|
6
|
+
|
7
|
+
* don't do CI for REE, it's not supported anymore, add rbx and jruby 1.9
|
8
|
+
|
9
|
+
[079975c | 2013-01-29 21:57:39 UTC] Yorick Peterse <yorickpeterse@gmail.com>
|
10
|
+
|
11
|
+
* Preserve values when calling render_full.
|
12
|
+
|
13
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
14
|
+
|
15
|
+
[a90d3f9 | 2013-01-29 21:53:16 UTC] Yorick Peterse <yorickpeterse@gmail.com>
|
16
|
+
|
17
|
+
* Fix for generting URLs using anchor().
|
18
|
+
|
19
|
+
Instead of always appending "?" to the URL the anchor() method should only do
|
20
|
+
so when there actually is a query string.
|
21
|
+
|
22
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
23
|
+
|
24
|
+
[d2aeb7f | 2013-01-29 21:17:08 UTC] Yorick Peterse <yorickpeterse@gmail.com>
|
25
|
+
|
26
|
+
* Caching of provides and method arities.
|
27
|
+
|
28
|
+
Caching of a controller's provide handlers as well as the method arities can
|
29
|
+
lead to a nice performance boost of around 300 transactions/second using the
|
30
|
+
following benchmark:
|
31
|
+
|
32
|
+
require 'innate'
|
33
|
+
|
34
|
+
Innate.middleware :live do
|
35
|
+
run Innate.core
|
36
|
+
end
|
37
|
+
|
38
|
+
Innate::Log.level = Logger::ERROR
|
39
|
+
Innate.options.mode = :live
|
40
|
+
ENV['RACK_ENV'] = 'none'
|
41
|
+
|
42
|
+
class MainController
|
43
|
+
Innate.node('/', self)
|
44
|
+
|
45
|
+
def index
|
46
|
+
return 'index'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
[:fast_mappings, :cache_provides, :cache_method_arities].each do |key|
|
51
|
+
MainController.ancestral_trait[key] = true
|
52
|
+
end
|
53
|
+
|
54
|
+
Innate.start(:adapter => :thin)
|
55
|
+
|
56
|
+
Benchmarking this was done by running `siege -c 10 -t 5s -b HOST` and would
|
57
|
+
initially result in around 1700 trans/sec. When using this commit this sits
|
58
|
+
between 2000/2100 trans/sec.
|
59
|
+
|
60
|
+
To prevent any potential issues the caching of provides and method aritites is
|
61
|
+
disabled by default.
|
62
|
+
|
63
|
+
See Github issue #7 for more information.
|
64
|
+
|
65
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
66
|
+
|
67
|
+
[06dd4c5 | 2013-01-29 18:25:49 UTC] Yorick Peterse <yorickpeterse@gmail.com>
|
68
|
+
|
69
|
+
* Revert action caching.
|
70
|
+
|
71
|
+
Instead of caching the entire action instance (which is modified further down
|
72
|
+
the chain) various parts that make up this process will be cached instead
|
73
|
+
(where possible).
|
74
|
+
|
75
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
76
|
+
|
77
|
+
[32440b0 | 2013-01-15 18:38:41 UTC] Michael Fellinger <m.fellinger@gmail.com>
|
78
|
+
|
79
|
+
* prevent memory leak from action caching
|
80
|
+
|
81
|
+
[040d084 | 2013-01-15 18:37:19 UTC] Michael Fellinger <m.fellinger@gmail.com>
|
82
|
+
|
83
|
+
* clean up LRUHash a bit
|
84
|
+
|
85
|
+
[a136a72 | 2013-01-14 20:06:22 UTC] Michael Fellinger <m.fellinger@gmail.com>
|
86
|
+
|
87
|
+
* build middleware only once
|
88
|
+
|
89
|
+
[8aea7cb | 2013-01-14 18:31:37 UTC] Yorick Peterse <yorickpeterse@gmail.com>
|
90
|
+
|
91
|
+
* Only compile middleware for the current mode.
|
92
|
+
|
93
|
+
Signed-off-by: Yorick Peterse <yorickpeterse@gmail.com>
|
94
|
+
|
1
95
|
[1da947d | 2012-12-07 21:25:01 UTC] Michael Fellinger <m.fellinger@gmail.com>
|
2
96
|
|
3
97
|
* Version 2012.12
|
data/innate.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "innate"
|
5
|
-
s.version = "
|
5
|
+
s.version = "2013.02"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.1") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Michael 'manveru' Fellinger"]
|
9
|
-
s.date = "
|
9
|
+
s.date = "2013-02-07"
|
10
10
|
s.description = "Simple, straight-forward base for web-frameworks."
|
11
11
|
s.email = "m.fellinger@gmail.com"
|
12
12
|
s.files = [".gems", ".gitignore", ".load_gemset", ".rvmrc", ".travis.yml", "AUTHORS", "CHANGELOG", "COPYING", "MANIFEST", "README.md", "Rakefile", "example/app/retro_games.rb", "example/app/todo/layout/default.xhtml", "example/app/todo/spec/todo.rb", "example/app/todo/start.rb", "example/app/todo/view/index.xhtml", "example/app/whywiki_erb/layout/wiki.html.erb", "example/app/whywiki_erb/spec/wiki.rb", "example/app/whywiki_erb/start.rb", "example/app/whywiki_erb/view/edit.erb", "example/app/whywiki_erb/view/index.erb", "example/custom_middleware.rb", "example/hello.rb", "example/howto_spec.rb", "example/link.rb", "example/provides.rb", "example/session.rb", "innate.gemspec", "lib/innate.rb", "lib/innate/action.rb", "lib/innate/adapter.rb", "lib/innate/cache.rb", "lib/innate/cache/api.rb", "lib/innate/cache/drb.rb", "lib/innate/cache/file_based.rb", "lib/innate/cache/marshal.rb", "lib/innate/cache/memory.rb", "lib/innate/cache/yaml.rb", "lib/innate/current.rb", "lib/innate/default_middleware.rb", "lib/innate/dynamap.rb", "lib/innate/helper.rb", "lib/innate/helper/aspect.rb", "lib/innate/helper/cgi.rb", "lib/innate/helper/flash.rb", "lib/innate/helper/link.rb", "lib/innate/helper/redirect.rb", "lib/innate/helper/render.rb", "lib/innate/log.rb", "lib/innate/log/color_formatter.rb", "lib/innate/log/hub.rb", "lib/innate/lru_hash.rb", "lib/innate/mock.rb", "lib/innate/node.rb", "lib/innate/options.rb", "lib/innate/options/dsl.rb", "lib/innate/options/stub.rb", "lib/innate/request.rb", "lib/innate/response.rb", "lib/innate/route.rb", "lib/innate/session.rb", "lib/innate/session/flash.rb", "lib/innate/spec.rb", "lib/innate/spec/bacon.rb", "lib/innate/state.rb", "lib/innate/state/accessor.rb", "lib/innate/traited.rb", "lib/innate/trinity.rb", "lib/innate/version.rb", "lib/innate/view.rb", "lib/innate/view/erb.rb", "lib/innate/view/etanni.rb", "lib/innate/view/none.rb", "spec/example/app/retro_games.rb", "spec/example/hello.rb", "spec/example/link.rb", "spec/example/provides.rb", "spec/example/session.rb", "spec/helper.rb", "spec/innate/action/layout.rb", "spec/innate/action/layout/file_layout.xhtml", "spec/innate/cache/common.rb", "spec/innate/cache/marshal.rb", "spec/innate/cache/memory.rb", "spec/innate/cache/yaml.rb", "spec/innate/dynamap.rb", "spec/innate/etanni.rb", "spec/innate/helper.rb", "spec/innate/helper/aspect.rb", "spec/innate/helper/cgi.rb", "spec/innate/helper/flash.rb", "spec/innate/helper/link.rb", "spec/innate/helper/redirect.rb", "spec/innate/helper/render.rb", "spec/innate/helper/view/aspect_hello.xhtml", "spec/innate/helper/view/locals.xhtml", "spec/innate/helper/view/loop.xhtml", "spec/innate/helper/view/num.xhtml", "spec/innate/helper/view/partial.xhtml", "spec/innate/helper/view/recursive.xhtml", "spec/innate/mock.rb", "spec/innate/modes.rb", "spec/innate/node/mapping.rb", "spec/innate/node/node.rb", "spec/innate/node/resolve.rb", "spec/innate/node/view/another_layout/another_layout.xhtml", "spec/innate/node/view/bar.xhtml", "spec/innate/node/view/cat2/cat22.xhtml", "spec/innate/node/view/cat3/cat33.xhtml", "spec/innate/node/view/foo.html.xhtml", "spec/innate/node/view/only_view.xhtml", "spec/innate/node/view/sub/baz.xhtml", "spec/innate/node/view/sub/foo/baz.xhtml", "spec/innate/node/view/with_layout.xhtml", "spec/innate/node/wrap_action_call.rb", "spec/innate/options.rb", "spec/innate/parameter.rb", "spec/innate/provides.rb", "spec/innate/provides/list.html.xhtml", "spec/innate/provides/list.txt.xhtml", "spec/innate/request.rb", "spec/innate/response.rb", "spec/innate/route.rb", "spec/innate/session.rb", "spec/innate/traited.rb", "tasks/authors.rake", "tasks/bacon.rake", "tasks/changelog.rake", "tasks/gem.rake", "tasks/gem_setup.rake", "tasks/grancher.rake", "tasks/manifest.rake", "tasks/rcov.rake", "tasks/release.rake", "tasks/reversion.rake", "tasks/setup.rake", "tasks/ycov.rake"]
|
data/lib/innate.rb
CHANGED
@@ -194,8 +194,8 @@ module Innate
|
|
194
194
|
def recompile_middleware(mode = options[:mode])
|
195
195
|
mode = mode.to_sym
|
196
196
|
|
197
|
-
if MIDDLEWARE[mode]
|
198
|
-
Innate.app = Rack::Builder.new(&MIDDLEWARE[mode])
|
197
|
+
if MIDDLEWARE[mode] and options[:mode] == mode
|
198
|
+
Innate.app = Rack::Builder.new(&MIDDLEWARE[mode]).to_app
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
@@ -238,7 +238,7 @@ module Innate
|
|
238
238
|
def middleware(mode, &block)
|
239
239
|
MIDDLEWARE[mode.to_sym] = block
|
240
240
|
|
241
|
-
recompile_middleware
|
241
|
+
recompile_middleware(mode)
|
242
242
|
end
|
243
243
|
|
244
244
|
# @example Innate can be started by:
|
data/lib/innate/helper/aspect.rb
CHANGED
@@ -48,7 +48,11 @@ module Innate
|
|
48
48
|
# Consider objects that have Aspect included
|
49
49
|
def self.ancestral_aop(from)
|
50
50
|
aop = {}
|
51
|
-
|
51
|
+
|
52
|
+
from.ancestors.reverse.each do |anc|
|
53
|
+
aop.merge!(AOP[anc]) if anc < Aspect
|
54
|
+
end
|
55
|
+
|
52
56
|
aop
|
53
57
|
end
|
54
58
|
|
data/lib/innate/helper/link.rb
CHANGED
@@ -80,9 +80,9 @@ module Innate
|
|
80
80
|
when URI
|
81
81
|
href = first.to_s
|
82
82
|
when /^\w+:\/\//
|
83
|
-
uri
|
84
|
-
uri.query = Rack::Utils.escape_html(uri.query)
|
85
|
-
href
|
83
|
+
uri = URI(first)
|
84
|
+
uri.query = Rack::Utils.escape_html(uri.query) if uri.query
|
85
|
+
href = uri.to_s
|
86
86
|
else
|
87
87
|
href = args.empty? ? r(text) : r(*args)
|
88
88
|
end
|
data/lib/innate/helper/render.rb
CHANGED
@@ -31,8 +31,9 @@ module Innate
|
|
31
31
|
# @see Mock.session
|
32
32
|
# @author manveru
|
33
33
|
def render_full(path, query = {})
|
34
|
-
uri
|
34
|
+
uri = URI(path.to_s)
|
35
35
|
uri.query = Rack::Utils.build_query(query)
|
36
|
+
saved = request, response, session, actions
|
36
37
|
|
37
38
|
if cookie = request.env['HTTP_COOKIE']
|
38
39
|
Mock.session do |mock|
|
@@ -42,6 +43,8 @@ module Innate
|
|
42
43
|
else
|
43
44
|
Mock.get(uri.to_s).body
|
44
45
|
end
|
46
|
+
ensure
|
47
|
+
self.request, self.response, self.session, self.actions = saved
|
45
48
|
end
|
46
49
|
|
47
50
|
# Renders an action without any layout.
|
@@ -76,7 +79,7 @@ module Innate
|
|
76
79
|
end
|
77
80
|
|
78
81
|
# Renders an action view and does not execute any methods.
|
79
|
-
# The rendered view will not be wrapped in a layout and instead
|
82
|
+
# The rendered view will not be wrapped in a layout and instead
|
80
83
|
# will use the layout of the current action.
|
81
84
|
# You can further tweak the action to be rendered by passing a block.
|
82
85
|
#
|
data/lib/innate/lru_hash.rb
CHANGED
@@ -15,8 +15,7 @@ module Innate
|
|
15
15
|
# Copyright (c) 2009 Michael Fellinger <manveru@rubyists.com>
|
16
16
|
#
|
17
17
|
# You may redistribute it and/or modify it under the same terms as Ruby.
|
18
|
-
class LRUHash < Struct.new(:max_count, :expiration,
|
19
|
-
:hook, :objs, :list, :hits, :misses)
|
18
|
+
class LRUHash < Struct.new(:max_count, :expiration, :hook, :objs, :list)
|
20
19
|
CacheObject = Struct.new(:content, :size, :atime)
|
21
20
|
|
22
21
|
# On 1.8 we raise IndexError, on 1.9 we raise KeyError
|
@@ -25,17 +24,11 @@ module Innate
|
|
25
24
|
include Enumerable
|
26
25
|
|
27
26
|
def initialize(options = {}, &hook)
|
28
|
-
self.max_count
|
27
|
+
self.max_count = options[:max_count]
|
29
28
|
self.expiration = options[:expiration]
|
30
|
-
|
31
|
-
avoid_insane_options
|
32
|
-
|
33
29
|
self.hook = hook
|
34
|
-
|
35
30
|
self.objs = {}
|
36
31
|
self.list = []
|
37
|
-
|
38
|
-
self.hits = self.misses = 0
|
39
32
|
end
|
40
33
|
|
41
34
|
def delete(key)
|
@@ -70,10 +63,7 @@ module Innate
|
|
70
63
|
def [](key)
|
71
64
|
expire
|
72
65
|
|
73
|
-
unless objs.key?(key)
|
74
|
-
self.misses += 1
|
75
|
-
return
|
76
|
-
end
|
66
|
+
return unless objs.key?(key)
|
77
67
|
|
78
68
|
obj = objs[key]
|
79
69
|
obj.atime = Time.now.to_i
|
@@ -81,7 +71,6 @@ module Innate
|
|
81
71
|
list.delete_if{|list_key| key == list_key }
|
82
72
|
list << key
|
83
73
|
|
84
|
-
self.hits += 1
|
85
74
|
obj.content
|
86
75
|
end
|
87
76
|
|
@@ -97,17 +86,5 @@ module Innate
|
|
97
86
|
|
98
87
|
obj
|
99
88
|
end
|
100
|
-
|
101
|
-
private
|
102
|
-
|
103
|
-
# Sanity checks.
|
104
|
-
def avoid_insane_options
|
105
|
-
if max_count && max_count <= 0
|
106
|
-
raise ArgumentError, "invalid max_count `#{max_count}'"
|
107
|
-
end
|
108
|
-
if expiration && expiration <= 0
|
109
|
-
raise ArgumentError, "invalid expiration `#{expiration}'"
|
110
|
-
end
|
111
|
-
end
|
112
89
|
end
|
113
90
|
end
|
data/lib/innate/node.rb
CHANGED
@@ -49,8 +49,14 @@ module Innate
|
|
49
49
|
trait :provide => {}
|
50
50
|
trait :fast_mappings => false
|
51
51
|
|
52
|
+
# Caching related traits.
|
53
|
+
trait :cache_provides => false
|
54
|
+
trait :provides_cache => LRUHash.new(:max_count => 100)
|
55
|
+
|
56
|
+
trait :cache_method_arities => false
|
57
|
+
trait :method_arity_cache => LRUHash.new(:max_count => 100)
|
58
|
+
|
52
59
|
# @see wrap_action_call
|
53
|
-
trait :action_cache => LRUHash.new
|
54
60
|
trait :wrap => SortedSet.new
|
55
61
|
trait :provide_set => false
|
56
62
|
trait :needs_method => false
|
@@ -235,8 +241,26 @@ module Innate
|
|
235
241
|
trait("#{format}_content_type" => content_type) if content_type
|
236
242
|
end
|
237
243
|
|
244
|
+
##
|
245
|
+
# Returns the list of provide handlers. This list is cached after the first
|
246
|
+
# call to this method.
|
247
|
+
#
|
248
|
+
# @return [Hash]
|
249
|
+
#
|
238
250
|
def provides
|
239
|
-
ancestral_trait
|
251
|
+
if ancestral_trait[:cache_provides]
|
252
|
+
return ancestral_trait[:provides_cache][self] ||= provide_handlers
|
253
|
+
else
|
254
|
+
return provide_handlers
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
##
|
259
|
+
# @see Innate::Node#provides
|
260
|
+
# @return [Hash]
|
261
|
+
#
|
262
|
+
def provide_handlers
|
263
|
+
ancestral_trait.reject { |key, value| key !~ /_handler$/ }
|
240
264
|
end
|
241
265
|
|
242
266
|
# This makes the Node a valid application for Rack.
|
@@ -285,7 +309,7 @@ module Innate
|
|
285
309
|
# @see Node#resolve Node#action_found Node#action_missing
|
286
310
|
# @author manveru
|
287
311
|
def try_resolve(path)
|
288
|
-
action =
|
312
|
+
action = resolve(path)
|
289
313
|
action ? action_found(action) : action_missing(path)
|
290
314
|
end
|
291
315
|
|
@@ -372,8 +396,18 @@ module Innate
|
|
372
396
|
def resolve(path, options = {})
|
373
397
|
name, wish, engine = find_provide(path)
|
374
398
|
node = (respond_to?(:ancestors) && respond_to?(:new)) ? self : self.class
|
375
|
-
|
376
|
-
action
|
399
|
+
|
400
|
+
action = Action.create(
|
401
|
+
:node => node,
|
402
|
+
:wish => wish,
|
403
|
+
:engine => engine,
|
404
|
+
:path => path,
|
405
|
+
:options => options
|
406
|
+
)
|
407
|
+
|
408
|
+
if !action.options.key?(:needs_method)
|
409
|
+
action.options[:needs_method] = node.needs_method?
|
410
|
+
end
|
377
411
|
|
378
412
|
if content_type = node.ancestral_trait["#{wish}_content_type"]
|
379
413
|
action.options[:content_type] = content_type
|
@@ -531,6 +565,11 @@ module Innate
|
|
531
565
|
# @see Node#resolve
|
532
566
|
# @return [Hash] mapping the name of the methods to their arity
|
533
567
|
def update_method_arities
|
568
|
+
if ancestral_trait[:cache_method_arities] \
|
569
|
+
and ancestral_trait[:method_arity_cache][self]
|
570
|
+
return ancestral_trait[:method_arity_cache][self]
|
571
|
+
end
|
572
|
+
|
534
573
|
@method_arities = {}
|
535
574
|
|
536
575
|
exposed = ancestors & Helper::EXPOSE.to_a
|
@@ -542,6 +581,10 @@ module Innate
|
|
542
581
|
end
|
543
582
|
end
|
544
583
|
|
584
|
+
if ancestral_trait[:cache_method_arities]
|
585
|
+
ancestral_trait[:method_arity_cache][self] = @method_arities
|
586
|
+
end
|
587
|
+
|
545
588
|
@method_arities
|
546
589
|
end
|
547
590
|
|
data/lib/innate/version.rb
CHANGED
@@ -37,6 +37,25 @@ class AspectDerivedWithLayout < AspectAllSpec
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
class AspectBeforeAllCache
|
41
|
+
Innate.node('/cached', self)
|
42
|
+
layout :layout
|
43
|
+
|
44
|
+
def self.numbers
|
45
|
+
@numbers ||= []
|
46
|
+
end
|
47
|
+
|
48
|
+
before_all do
|
49
|
+
self.class.numbers << 10
|
50
|
+
end
|
51
|
+
|
52
|
+
def index; end
|
53
|
+
|
54
|
+
def layout
|
55
|
+
return '#{@content}'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
40
59
|
class AspecNoMethodSpec
|
41
60
|
Innate.node('/without_method', self)
|
42
61
|
include Innate::Node
|
@@ -96,4 +115,11 @@ describe Innate::Helper::Aspect do
|
|
96
115
|
$aspect_spec_before_all.should == 84
|
97
116
|
$aspect_spec_after_all.should == 80
|
98
117
|
end
|
118
|
+
|
119
|
+
it 'should not cache aspect blocks' do
|
120
|
+
get('/cached')
|
121
|
+
get('/cached')
|
122
|
+
|
123
|
+
AspectBeforeAllCache.numbers.should == [10, 10]
|
124
|
+
end
|
99
125
|
end
|
data/spec/innate/helper/link.rb
CHANGED
@@ -110,6 +110,10 @@ describe Innate::Helper::Link do
|
|
110
110
|
One.anchor('<blink> & <a>', :foo).
|
111
111
|
should == '<a href="/foo"><blink> & <a></a>'
|
112
112
|
end
|
113
|
+
|
114
|
+
should 'not append a ? when there is no query string' do
|
115
|
+
One.anchor('http://google.com').include?('?').should == false
|
116
|
+
end
|
113
117
|
end
|
114
118
|
|
115
119
|
describe 'combining #anchor and #route' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: innate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '2013.02'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|