usher 0.5.6 → 0.5.7
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/Rakefile +5 -1
- data/VERSION.yml +1 -1
- data/lib/usher.rb +1 -1
- data/lib/usher/interface.rb +37 -31
- data/lib/usher/interface/rack_interface.rb +62 -23
- data/lib/usher/interface/rack_interface/route.rb +9 -2
- data/lib/usher/interface/rails2_2_interface.rb +1 -1
- data/lib/usher/interface/rails2_2_interface/mapper.rb +2 -2
- data/lib/usher/interface/rails2_3_interface.rb +2 -2
- data/lib/usher/route.rb +1 -1
- data/lib/usher/route/util.rb +1 -1
- data/spec/private/email/recognize_spec.rb +3 -2
- data/spec/private/generate_spec.rb +2 -1
- data/spec/private/grapher_spec.rb +3 -3
- data/spec/private/parser_spec.rb +3 -2
- data/spec/private/path_spec.rb +9 -9
- data/spec/private/rack/dispatch_spec.rb +2 -2
- data/spec/private/rack/generate_spec.rb +2 -2
- data/spec/private/rails2_2/compat.rb +2 -1
- data/spec/private/rails2_2/generate_spec.rb +4 -3
- data/spec/private/rails2_2/path_spec.rb +4 -3
- data/spec/private/rails2_2/recognize_spec.rb +4 -3
- data/spec/private/rails2_3/compat.rb +2 -1
- data/spec/private/rails2_3/generate_spec.rb +4 -3
- data/spec/private/rails2_3/path_spec.rb +4 -3
- data/spec/private/rails2_3/recognize_spec.rb +4 -3
- data/spec/private/recognize_spec.rb +10 -1
- data/spec/private/request_method_spec.rb +3 -2
- data/spec/spec_helper.rb +3 -0
- metadata +2 -2
data/Rakefile
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
libdir = File.expand_path("lib")
|
2
|
+
$:.unshift(libdir) unless $:.include?(libdir)
|
3
|
+
|
4
|
+
require 'usher'
|
2
5
|
|
3
6
|
begin
|
4
7
|
require 'jeweler'
|
@@ -12,6 +15,7 @@ begin
|
|
12
15
|
s.add_dependency 'fuzzyhash', '>=0.0.6'
|
13
16
|
s.rubyforge_project = 'joshbuddy-usher'
|
14
17
|
end
|
18
|
+
Jeweler::GemcutterTasks.new
|
15
19
|
Jeweler::RubyforgeTasks.new do |rubyforge|
|
16
20
|
rubyforge.doc_task = "rdoc"
|
17
21
|
rubyforge.remote_doc_path = ''
|
data/VERSION.yml
CHANGED
data/lib/usher.rb
CHANGED
@@ -9,7 +9,7 @@ require File.join(File.dirname(__FILE__), 'usher', 'util')
|
|
9
9
|
class Usher
|
10
10
|
attr_reader :root, :named_routes, :routes, :splitter,
|
11
11
|
:delimiters, :delimiter_chars, :delimiters_regex,
|
12
|
-
:parent_route, :generator
|
12
|
+
:parent_route, :generator, :grapher
|
13
13
|
|
14
14
|
# Returns whether the route set is empty
|
15
15
|
#
|
data/lib/usher/interface.rb
CHANGED
@@ -1,37 +1,43 @@
|
|
1
|
+
# From Extlib
|
2
|
+
module CamelCaseMixin
|
3
|
+
def camel_case
|
4
|
+
return self if self !~ /_/ && self =~ /[A-Z]+.*/
|
5
|
+
split('_').map{|e| e.capitalize}.join
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
# TODO: refactoring: I suggest to use usher/interfaces/rack.rb instead of
|
10
|
+
# usher/interface/rack_interface.rb, it will enable me to simplify this code
|
1
11
|
class Usher
|
2
12
|
module Interface
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
+
# Get root directory of interfaces of path to specified interface
|
14
|
+
def self.interface_directory
|
15
|
+
File.join(File.dirname(__FILE__), "interface")
|
16
|
+
end
|
17
|
+
|
18
|
+
# path to file
|
19
|
+
def self.interface_path(name)
|
20
|
+
File.join(self.interface_directory, "#{name}_interface.rb")
|
21
|
+
end
|
22
|
+
|
23
|
+
# Usher::Interface.for(:rack, &block)
|
24
|
+
def self.for(name, &block)
|
25
|
+
if File.exist?(self.interface_path(name))
|
26
|
+
require self.interface_path(name)
|
27
|
+
snake_cased = "#{name}_interface".extend(CamelCaseMixin)
|
28
|
+
Usher::Interface.const_get(snake_cased.camel_case).new(&block)
|
29
|
+
else
|
30
|
+
raise ArgumentError, "Interface #{name} doesn't exist. Choose one of: #{self.interfaces.inspect}"
|
31
|
+
end
|
13
32
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
when :merb
|
22
|
-
MerbInterface
|
23
|
-
when :rack
|
24
|
-
RackInterface
|
25
|
-
when :email
|
26
|
-
EmailInterface
|
27
|
-
when :rails3
|
28
|
-
Rails3Interface
|
29
|
-
when :text
|
30
|
-
TextInterface
|
33
|
+
|
34
|
+
# Array of symbols
|
35
|
+
# Usher::Interface.interfaces
|
36
|
+
# => [:email_interface, :merb_interface, :rack_interface, :rails2_2_interface, :rails2_3_interface, :rails3_interface, :text_interface]
|
37
|
+
def self.interfaces
|
38
|
+
Dir["#{self.interface_directory}/*.rb"].map do |interface|
|
39
|
+
File.basename(interface).sub("_interface.rb", "").to_sym
|
31
40
|
end
|
32
|
-
|
33
41
|
end
|
34
|
-
|
35
|
-
|
36
42
|
end
|
37
|
-
end
|
43
|
+
end
|
@@ -3,16 +3,7 @@ require 'rack'
|
|
3
3
|
class Usher
|
4
4
|
module Interface
|
5
5
|
class RackInterface
|
6
|
-
|
7
|
-
attr_reader :router
|
8
|
-
attr_accessor :app
|
9
|
-
|
10
|
-
DEFAULT_APPLICATION = lambda do |env|
|
11
|
-
Rack::Response.new("No route found", 404).finish
|
12
|
-
end
|
13
|
-
|
14
6
|
class Builder < Rack::Builder
|
15
|
-
|
16
7
|
def initialize(&block)
|
17
8
|
@usher = Usher::Interface::RackInterface.new
|
18
9
|
super
|
@@ -23,10 +14,28 @@ class Usher
|
|
23
14
|
@ins << @usher unless @ins.last == @usher
|
24
15
|
end
|
25
16
|
|
17
|
+
def get(path, options = nil, &block)
|
18
|
+
self.map(path, options.merge!(:conditions => {:request_method => "GET"}), &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def post(path, options = nil, &block)
|
22
|
+
self.map(path, options.merge!(:conditions => {:request_method => "POST"}), &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def put(path, options = nil, &block)
|
26
|
+
self.map(path, options.merge!(:conditions => {:request_method => "PUT"}), &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete(path, options = nil, &block)
|
30
|
+
self.map(path, options.merge!(:conditions => {:request_method => "DELETE"}), &block)
|
31
|
+
end
|
26
32
|
end
|
27
33
|
|
34
|
+
attr_reader :router
|
35
|
+
attr_accessor :app
|
36
|
+
|
28
37
|
def initialize(app = nil, &blk)
|
29
|
-
@app = app ||
|
38
|
+
@app = app || lambda { |env| Rack::Response.new("No route found", 404).finish }
|
30
39
|
@router = Usher.new(:request_methods => [:request_method, :host, :port, :scheme], :generator => Usher::Util::Generators::URL.new)
|
31
40
|
instance_eval(&blk) if blk
|
32
41
|
end
|
@@ -42,7 +51,36 @@ class Usher
|
|
42
51
|
|
43
52
|
def add(path, options = nil)
|
44
53
|
@router.add_route(path, options)
|
45
|
-
|
54
|
+
end
|
55
|
+
|
56
|
+
# default { |env| ... }
|
57
|
+
# default DefaultApp
|
58
|
+
def default(app = nil, &block)
|
59
|
+
@app = app ? app : block
|
60
|
+
end
|
61
|
+
|
62
|
+
# shortcuts for adding routes for HTTP methods, for example:
|
63
|
+
# add("/url", :conditions => {:request_method => "POST"}})
|
64
|
+
# is the same as:
|
65
|
+
# post("/url")
|
66
|
+
#
|
67
|
+
# if you need more complex setup, use method add directly, for example:
|
68
|
+
# add("/url", :conditions => {:request_method => ["POST", "PUT"]}})
|
69
|
+
def get(path, options = {})
|
70
|
+
self.add(path, options.merge!(:conditions => {:request_method => "GET"}))
|
71
|
+
end
|
72
|
+
|
73
|
+
def post(path, options = {})
|
74
|
+
self.add(path, options.merge!(:conditions => {:request_method => "POST"}))
|
75
|
+
end
|
76
|
+
|
77
|
+
def put(path, options = {})
|
78
|
+
self.add(path, options.merge!(:conditions => {:request_method => "PUT"}))
|
79
|
+
end
|
80
|
+
|
81
|
+
def delete(path, options = {})
|
82
|
+
self.add(path, options.merge!(:conditions => {:request_method => "DELETE"}))
|
83
|
+
end
|
46
84
|
|
47
85
|
def parent_route=(route)
|
48
86
|
@router.parent_route = route
|
@@ -57,8 +95,9 @@ class Usher
|
|
57
95
|
end
|
58
96
|
|
59
97
|
def call(env)
|
60
|
-
|
61
|
-
|
98
|
+
request = Rack::Request.new(env)
|
99
|
+
response = @router.recognize(request, request.path_info)
|
100
|
+
after_match(request, response) if response
|
62
101
|
determine_respondant(response).call(env)
|
63
102
|
end
|
64
103
|
|
@@ -70,18 +109,18 @@ class Usher
|
|
70
109
|
# and calling the application
|
71
110
|
#
|
72
111
|
# @api plugin
|
73
|
-
def after_match(
|
112
|
+
def after_match(request, response)
|
74
113
|
params = response.path.route.default_values ?
|
75
|
-
response.path.route.default_values.merge(Hash[response.params]) :
|
76
|
-
Hash[response.params]
|
114
|
+
response.path.route.default_values.merge(Hash[*response.params.flatten]) :
|
115
|
+
Hash[*response.params.flatten]
|
77
116
|
|
78
|
-
env['usher.params'] ?
|
79
|
-
env['usher.params'].merge!(params) :
|
80
|
-
env['usher.params'] = params
|
117
|
+
request.env['usher.params'] ?
|
118
|
+
request.env['usher.params'].merge!(params) :
|
119
|
+
(request.env['usher.params'] = params)
|
81
120
|
|
82
121
|
# consume the path_info to the script_name
|
83
122
|
# response.remaining_path
|
84
|
-
consume_path!(
|
123
|
+
consume_path!(request, response) if response.partial_match?
|
85
124
|
end
|
86
125
|
|
87
126
|
# Determines which application to respond with.
|
@@ -102,9 +141,9 @@ class Usher
|
|
102
141
|
end
|
103
142
|
|
104
143
|
# Consume the path from path_info to script_name
|
105
|
-
def consume_path!(
|
106
|
-
env["SCRIPT_NAME"] = (env["SCRIPT_NAME"] + response.matched_path) || ""
|
107
|
-
env["PATH_INFO"] = response.remaining_path || ""
|
144
|
+
def consume_path!(request, response)
|
145
|
+
request.env["SCRIPT_NAME"] = (request.env["SCRIPT_NAME"] + response.matched_path) || ""
|
146
|
+
request.env["PATH_INFO"] = response.remaining_path || ""
|
108
147
|
end
|
109
148
|
end
|
110
149
|
end
|
@@ -2,8 +2,15 @@ class Usher
|
|
2
2
|
module Interface
|
3
3
|
class RackInterface
|
4
4
|
module Route
|
5
|
-
|
5
|
+
# add("/index.html").redirect("/")
|
6
|
+
def redirect(path, status = 302)
|
7
|
+
lambda do
|
8
|
+
response = Rack::Response.new
|
9
|
+
response.redirect(path, status)
|
10
|
+
response.finish
|
11
|
+
end
|
12
|
+
end
|
6
13
|
end
|
7
14
|
end
|
8
15
|
end
|
9
|
-
end
|
16
|
+
end
|
data/lib/usher/route.rb
CHANGED
@@ -57,7 +57,7 @@ class Usher
|
|
57
57
|
# route.to(:controller => 'testing', :action => 'index')
|
58
58
|
# set.recognize(Request.new('/test')).first.params => {:controller => 'testing', :action => 'index'}
|
59
59
|
def to(options = nil, &block)
|
60
|
-
raise "cannot set
|
60
|
+
raise "cannot set destination as block and argument" if block_given? && options
|
61
61
|
@destination = if block_given?
|
62
62
|
block
|
63
63
|
else
|
data/lib/usher/route/util.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require "usher"
|
2
3
|
|
3
4
|
def build_email_mock(email)
|
4
5
|
request = mock "Request"
|
@@ -33,4 +34,4 @@ describe "Usher (for email) route recognition" do
|
|
33
34
|
@route_set.act('sub+ect.123-456-sdqwe123ae@mydomain.org')
|
34
35
|
end
|
35
36
|
|
36
|
-
end
|
37
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
require "usher"
|
3
3
|
|
4
4
|
describe "Usher grapher" do
|
5
5
|
|
@@ -37,4 +37,4 @@ describe "Usher grapher" do
|
|
37
37
|
# proc{ route_set.generate_url(nil, {:a => 'A', :b => 'B'})}.should raise_error Usher::ValidationException
|
38
38
|
#end
|
39
39
|
|
40
|
-
end
|
40
|
+
end
|
data/spec/private/parser_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
require "usher"
|
2
3
|
|
3
4
|
describe "Usher route tokenizing" do
|
4
5
|
|
@@ -72,4 +73,4 @@ describe "Usher route tokenizing" do
|
|
72
73
|
parts[1].should == parts[3]
|
73
74
|
end
|
74
75
|
|
75
|
-
end
|
76
|
+
end
|
data/spec/private/path_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
require "usher"
|
2
3
|
|
3
4
|
route_set = Usher.new
|
4
5
|
|
@@ -22,14 +23,13 @@ describe "Usher route adding" do
|
|
22
23
|
it "should add every kind of optional route possible" do
|
23
24
|
route_set.add_route('/a/b(/c)(/d(/e))')
|
24
25
|
route_set.routes.first.paths.collect{|a| a.parts }.should == [
|
25
|
-
[
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[
|
29
|
-
[
|
30
|
-
[
|
26
|
+
["/", "a", "/", "b"],
|
27
|
+
["/", "a", "/", "b", "/", "c"],
|
28
|
+
["/", "a", "/", "b", "/", "d"],
|
29
|
+
["/", "a", "/", "b", "/", "c", "/", "d"],
|
30
|
+
["/", "a", "/", "b", "/", "d", "/", "e"],
|
31
|
+
["/", "a", "/", "b", "/", "c", "/", "d", "/", "e"]
|
31
32
|
]
|
32
|
-
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should allow named routes to be added" do
|
@@ -73,4 +73,4 @@ describe "Usher route adding" do
|
|
73
73
|
|
74
74
|
end
|
75
75
|
|
76
|
-
end
|
76
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require "usher"
|
2
3
|
require 'rack'
|
3
4
|
|
4
|
-
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
5
5
|
route_set = Usher::Interface.for(:rack)
|
6
6
|
route_set.extend(CallWithMockRequestMixin)
|
7
7
|
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require "usher"
|
2
3
|
require 'rack'
|
3
4
|
|
4
|
-
require File.join(File.dirname(__FILE__), "..", "..", "spec_helper")
|
5
5
|
route_set = Usher::Interface.for(:rack)
|
6
6
|
route_set.extend(CallWithMockRequestMixin)
|
7
7
|
|
@@ -1 +1,2 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require 'activesupport'
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require '
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'compat'))
|
3
|
+
require "usher"
|
3
4
|
|
4
5
|
route_set = Usher::Interface.for(:rails2_2)
|
5
6
|
|
@@ -25,4 +26,4 @@ describe "Usher (for rails 2.2) URL generation" do
|
|
25
26
|
route_set.generate({:action => 'thingy'}, {:controller => 'sample', :action => 'index', :id => 123}, :generate).should == '/sample/thingy'
|
26
27
|
end
|
27
28
|
|
28
|
-
end
|
29
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require '
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'compat'))
|
3
|
+
require "usher"
|
3
4
|
|
4
5
|
route_set = Usher::Interface.for(:rails2_2)
|
5
6
|
|
@@ -13,4 +14,4 @@ describe "Usher (for rails 2.2) route adding" do
|
|
13
14
|
proc { route_set.add_route('/bad/route') }.should raise_error
|
14
15
|
end
|
15
16
|
|
16
|
-
end
|
17
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require '
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'compat'))
|
3
|
+
require "usher"
|
3
4
|
require 'action_controller'
|
4
5
|
|
5
6
|
route_set = Usher::Interface.for(:rails2_2)
|
@@ -76,4 +77,4 @@ describe "Usher (for rails 2.2) route recognition" do
|
|
76
77
|
end
|
77
78
|
|
78
79
|
|
79
|
-
end
|
80
|
+
end
|
@@ -1 +1,2 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require 'activesupport'
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require '
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'compat'))
|
3
|
+
require "usher"
|
3
4
|
|
4
5
|
route_set = Usher::Interface.for(:rails2_3)
|
5
6
|
|
@@ -25,4 +26,4 @@ describe "Usher (for rails 2.3) URL generation" do
|
|
25
26
|
route_set.generate({:action => 'thingy'}, {:controller => 'sample', :action => 'index', :id => 123}, :generate).should == '/sample/thingy'
|
26
27
|
end
|
27
28
|
|
28
|
-
end
|
29
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require '
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'compat'))
|
3
|
+
require "usher"
|
3
4
|
|
4
5
|
route_set = Usher::Interface.for(:rails2_3)
|
5
6
|
|
@@ -13,4 +14,4 @@ describe "Usher (for rails 2.3) route adding" do
|
|
13
14
|
proc { route_set.add_route('/bad/route') }.should raise_error
|
14
15
|
end
|
15
16
|
|
16
|
-
end
|
17
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
require '
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'compat'))
|
3
|
+
require "usher"
|
3
4
|
require 'action_controller'
|
4
5
|
|
5
6
|
route_set = Usher::Interface.for(:rails2_3)
|
@@ -76,4 +77,4 @@ describe "Usher (for rails 2.3) route recognition" do
|
|
76
77
|
end
|
77
78
|
|
78
79
|
|
79
|
-
end
|
80
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_helper"))
|
2
|
+
require "usher"
|
2
3
|
|
3
4
|
route_set = Usher.new
|
4
5
|
|
@@ -208,6 +209,14 @@ describe "Usher route recognition" do
|
|
208
209
|
proc {route_set.recognize(build_request({:method => 'get', :path => '/products/show/qweasd', :domain => 'admin.host.com'}))}.should raise_error
|
209
210
|
end
|
210
211
|
|
212
|
+
it "should recognize multiple optional parts" do
|
213
|
+
target_route = route_set.add_route('/test(/this)(/too)')
|
214
|
+
route_set.recognize_path('/test').path.route.should == target_route
|
215
|
+
route_set.recognize_path('/test/this').path.route.should == target_route
|
216
|
+
route_set.recognize_path('/test/too').path.route.should == target_route
|
217
|
+
route_set.recognize_path('/test/this/too').path.route.should == target_route
|
218
|
+
end
|
219
|
+
|
211
220
|
describe "partial recognition" do
|
212
221
|
it "should partially match a route" do
|
213
222
|
route = route_set.add_route("/foo")
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Hull
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-25 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|