named-routes 0.1.2 → 0.2.1

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/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :gemcutter
2
+
3
+ gem "extlib", "0.9.15"
4
+ gem "diff-lcs", "1.1.2"
5
+ gem "jeweler", "1.5.2"
6
+ gem "rr", "1.0.2"
7
+ gem "rspec", "2.3.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,30 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.2)
5
+ extlib (0.9.15)
6
+ git (1.2.5)
7
+ jeweler (1.5.2)
8
+ bundler (~> 1.0.0)
9
+ git (>= 1.2.5)
10
+ rake
11
+ rake (0.8.7)
12
+ rr (1.0.2)
13
+ rspec (2.3.0)
14
+ rspec-core (~> 2.3.0)
15
+ rspec-expectations (~> 2.3.0)
16
+ rspec-mocks (~> 2.3.0)
17
+ rspec-core (2.3.1)
18
+ rspec-expectations (2.3.0)
19
+ diff-lcs (~> 1.1.2)
20
+ rspec-mocks (2.3.0)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ diff-lcs (= 1.1.2)
27
+ extlib (= 0.9.15)
28
+ jeweler (= 1.5.2)
29
+ rr (= 1.0.2)
30
+ rspec (= 2.3.0)
data/README.md CHANGED
@@ -58,7 +58,7 @@ You can access the routes by doing the following.
58
58
  path(:user, "/users/:user_id")
59
59
  paths.user(:user_id => 42) # => "/users/42"
60
60
  paths.http.user(:user_id => 42) # => "http://example.com/users/42"
61
- paths.https.user(:user_id => 42) # => "http://example.com/users/42"
61
+ paths.https.user(:user_id => 42) # => "https://example.com/users/42"
62
62
 
63
63
  It also works with prefixes:
64
64
 
@@ -68,7 +68,7 @@ It also works with prefixes:
68
68
  path(:user, "/users/:user_id")
69
69
  paths.user(:user_id => 42) # => "/users/42"
70
70
  paths.http.user(:user_id => 42) # => "http://example.com/admin/users/42"
71
- paths.https.user(:user_id => 42) # => "http://example.com/admin/users/42"
71
+ paths.https.user(:user_id => 42) # => "https://example.com/admin/users/42"
72
72
 
73
73
  And with query params:
74
74
 
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ begin
22
22
  s.has_rdoc = true
23
23
  s.extra_rdoc_files = [ "README.md", "CHANGES" ]
24
24
  s.rdoc_options = ["--main", "README.md", "--inline-source", "--line-numbers"]
25
- s.add_dependency "activesupport", ">= 2.3"
25
+ s.add_dependency "extlib", ">= 0.9.15"
26
26
  end
27
27
  rescue LoadError
28
28
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.1
@@ -1,32 +1,46 @@
1
1
  module NamedRoutes
2
2
  class Routes
3
3
  class_inheritable_accessor :host, :prefix
4
-
4
+
5
5
  extend(Module.new do
6
6
  def instance
7
7
  @instance ||= new
8
8
  end
9
9
 
10
10
  def http
11
- Uri.new(self, "http")
11
+ SchemedUri.new(self, "http")
12
12
  end
13
13
 
14
14
  def https
15
- Uri.new(self, "https")
15
+ SchemedUri.new(self, "https")
16
16
  end
17
17
 
18
- def path(name, definition, include_prefix=true)
18
+ def route(name, definition, include_prefix=true)
19
19
  full_definition = (include_prefix && prefix) ? File.join("", prefix, definition) : definition
20
+ _defined_routes[name.to_s] = full_definition
20
21
  define_method name do |*args|
21
22
  self.class.eval(full_definition, [args.first].compact.first || {})
22
23
  end
23
24
  yield full_definition if block_given?
24
25
  full_definition
25
26
  end
27
+ alias_method :path, :route
28
+ alias_method :uri, :route
29
+
30
+ def defined_routes
31
+ (ancestors.reverse + [self]).inject({}) do |memo, klass|
32
+ memo.merge!(klass._defined_routes) if klass.respond_to?(:_defined_routes)
33
+ memo
34
+ end
35
+ end
36
+
37
+ def _defined_routes
38
+ @_defined_routes ||= {}
39
+ end
26
40
 
27
41
  def eval(definition, params_arg={})
28
42
  params = Mash.new(params_arg)
29
- path_string = if params.empty?
43
+ uri_string = if params.empty?
30
44
  definition
31
45
  else
32
46
  definition.split("/").map do |segment|
@@ -42,28 +56,29 @@ module NamedRoutes
42
56
  end.join("/")
43
57
  end
44
58
  unless params.empty?
45
- path_string << "?#{escape_params(params).to_params.gsub("%20", "+")}"
59
+ uri_string << "?#{escape_params(params).to_params.gsub("%20", "+")}"
46
60
  end
47
- path_string
61
+ uri_string
48
62
  end
49
63
 
50
64
  # TODO: Create eval_without_prefix
51
65
 
52
66
  def escape_params(params={})
53
67
  params.inject({}) do |memo, kv|
54
- memo[URI.escape(kv[0])] = if kv[1].is_a?(Hash)
55
- escape_params(kv[1])
56
- elsif kv[1].is_a?(Array)
57
- kv[1].map { |v| URI.escape(v.to_s) }
68
+ key, value = kv
69
+ memo[URI.escape(key)] = if value.is_a?(Hash)
70
+ escape_params(value)
71
+ elsif value.is_a?(Array)
72
+ value.map { |v| URI.escape(v.to_s) }
58
73
  else
59
- URI.escape(kv[1].to_s)
74
+ URI.escape(value.to_s)
60
75
  end
61
76
  memo
62
77
  end
63
78
  end
64
79
 
65
- def normalize(path)
66
- path.gsub(Regexp.new("^#{File.join("", prefix.to_s)}"), "/").gsub("//", "/")
80
+ def normalize(uri)
81
+ uri.gsub(Regexp.new("^#{File.join("", prefix.to_s)}"), "/").gsub("//", "/")
67
82
  end
68
83
 
69
84
  def method_missing(method_name, *args, &block)
@@ -74,5 +89,9 @@ module NamedRoutes
74
89
  end
75
90
  end
76
91
  end)
92
+
93
+ def as_json(*args)
94
+ self.class.defined_routes
95
+ end
77
96
  end
78
97
  end
@@ -1,5 +1,5 @@
1
1
  module NamedRoutes
2
- class Uri
2
+ class SchemedUri
3
3
  attr_reader :routes, :scheme
4
4
 
5
5
  def initialize(routes, scheme)
data/lib/named-routes.rb CHANGED
@@ -2,18 +2,23 @@ require "extlib"
2
2
  require "uri"
3
3
 
4
4
  module NamedRoutes
5
- def path(*args, &block)
6
- routes.path(*args, &block)
5
+ def named_route(*args, &block)
6
+ named_routes.uri(*args, &block)
7
7
  end
8
+ alias_method :path, :named_route
9
+ alias_method :route, :named_route
10
+ alias_method :uri, :named_route
8
11
 
9
- def paths
12
+ def named_routes
10
13
  ::NamedRoutes::Routes
11
14
  end
12
- alias_method :routes, :paths
15
+ alias_method :paths, :named_routes
16
+ alias_method :routes, :named_routes
17
+ alias_method :uris, :named_routes
13
18
 
14
19
  extend self
15
20
  end
16
21
 
17
22
  dir = File.dirname(__FILE__)
18
23
  require "#{dir}/named-routes/routes"
19
- require "#{dir}/named-routes/uri"
24
+ require "#{dir}/named-routes/schemed_uri"
@@ -8,17 +8,17 @@ module NamedRoutes
8
8
 
9
9
  def routes
10
10
  @routes ||= begin
11
- paths_class = Class.new(NamedRoutes::Routes)
12
- paths_class.path(:root, "/")
13
- paths_class.path(:current_user_category_top_choices, "/current-user/:category/top-choices")
14
- paths_class.path(:decision_stream, "/decision-streams/:stream_id")
15
- paths_class
11
+ routes_class = Class.new(NamedRoutes::Routes)
12
+ routes_class.route(:root, "/")
13
+ routes_class.route(:current_user_category_top_choices, "/current-user/:category/top-choices")
14
+ routes_class.route(:decision_stream, "/decision-streams/:stream_id")
15
+ routes_class
16
16
  end
17
17
  end
18
18
 
19
- describe "path definition" do
19
+ describe "uri definition" do
20
20
  context "when params hash is not given" do
21
- it "returns the definition", :focus => true do
21
+ it "returns the definition" do
22
22
  routes.root.should == "/"
23
23
  routes.current_user_category_top_choices.should == "/current-user/:category/top-choices"
24
24
  routes.decision_stream.should == "/decision-streams/:stream_id"
@@ -26,10 +26,10 @@ module NamedRoutes
26
26
  end
27
27
 
28
28
  context "when params hash is given" do
29
- it "returns the path with the param replaced with the given param value with additional params added as url params" do
30
- uri_1 = routes.current_user_category_top_choices(:category => "cars", :foo => "bar", :baz => {"one" => "two three"})
29
+ it "returns the uri with the param replaced with the given param value with additional params added as url params" do
30
+ schemed_uri_1 = routes.current_user_category_top_choices(:category => "cars", :foo => "bar", :baz => {"one" => "two three"})
31
31
 
32
- path, query = uri_1.split("?")
32
+ path, query = schemed_uri_1.split("?")
33
33
  path.should == "/current-user/cars/top-choices"
34
34
  query.should include("foo=bar")
35
35
  query.should include("baz[one]=two+three")
@@ -40,17 +40,17 @@ module NamedRoutes
40
40
  context "when a prefix is given" do
41
41
  def routes
42
42
  @routes ||= begin
43
- paths_class = Class.new(NamedRoutes::Routes)
44
- paths_class.prefix = "general"
45
- paths_class.path(:root, "/")
46
- paths_class.path(:current_user_category_top_choices, "/current-user/:category/top-choices")
47
- paths_class.path(:decision_stream, "/decision-streams/:stream_id")
48
- paths_class
43
+ routes_class = Class.new(NamedRoutes::Routes)
44
+ routes_class.prefix = "general"
45
+ routes_class.route(:root, "/")
46
+ routes_class.route(:current_user_category_top_choices, "/current-user/:category/top-choices")
47
+ routes_class.route(:decision_stream, "/decision-streams/:stream_id")
48
+ routes_class
49
49
  end
50
50
  end
51
51
 
52
52
  context "when default and include_prefix argument is true" do
53
- it "appends the prefix to the returned paths" do
53
+ it "appends the prefix to the returned uris" do
54
54
  routes.root.should == "/general/"
55
55
  routes.current_user_category_top_choices.should == "/general/current-user/:category/top-choices"
56
56
  routes.decision_stream.should == "/general/decision-streams/:stream_id"
@@ -59,9 +59,9 @@ module NamedRoutes
59
59
  end
60
60
  end
61
61
 
62
- context "when include_prefix argument is false in the path definition" do
63
- it "does not append the prefix to the returned paths" do
64
- routes.path(:raw_path, "/raw/path", false).should == "/raw/path"
62
+ context "when include_prefix argument is false in the uri definition" do
63
+ it "does not append the prefix to the returned uris" do
64
+ routes.uri(:raw_path, "/raw/path", false).should == "/raw/path"
65
65
  routes.raw_path.should == "/raw/path"
66
66
  end
67
67
  end
@@ -76,10 +76,10 @@ module NamedRoutes
76
76
  end
77
77
 
78
78
  context "when params hash is given" do
79
- it "returns the path with the param replaced with the given param value with additional params added as url params" do
80
- uri_1 = routes.current_user_category_top_choices(:category => "cars", :foo => "bar", :baz => {"one" => "two three"})
79
+ it "returns the uri with the param replaced with the given param value with additional params added as url params" do
80
+ schemed_uri_1 = routes.current_user_category_top_choices(:category => "cars", :foo => "bar", :baz => {"one" => "two three"})
81
81
 
82
- path, query = uri_1.split("?")
82
+ path, query = schemed_uri_1.split("?")
83
83
  path.should == "/current-user/cars/top-choices"
84
84
  query.should include("foo=bar")
85
85
  query.should include("baz[one]=two+three")
@@ -88,11 +88,23 @@ module NamedRoutes
88
88
  end
89
89
  end
90
90
 
91
+ describe ".http" do
92
+ it "returns a full http schemed_uri (with ::NamedRoutes.host) for the given named route" do
93
+ routes.http.decision_stream(:stream_id => "11").should == "http://example.com/decision-streams/11"
94
+ end
95
+ end
96
+
97
+ describe ".https" do
98
+ it "returns a full https schemed_uri (with ::NamedRoutes.host) for the given named route" do
99
+ routes.https.decision_stream(:stream_id => "11").should == "https://example.com/decision-streams/11"
100
+ end
101
+ end
102
+
91
103
  describe "#normalize" do
92
104
  def routes
93
105
  @routes ||= begin
94
- path_class = Class.new(NamedRoutes::Routes)
95
- path_class
106
+ route_class = Class.new(NamedRoutes::Routes)
107
+ route_class
96
108
  end
97
109
  end
98
110
 
@@ -101,7 +113,7 @@ module NamedRoutes
101
113
  routes.prefix.should == nil
102
114
  end
103
115
 
104
- it "returns the given path" do
116
+ it "returns the given uri" do
105
117
  routes.normalize("/prefix/foo/bar").should == "/prefix/foo/bar"
106
118
  end
107
119
  end
@@ -131,15 +143,13 @@ module NamedRoutes
131
143
  end
132
144
  end
133
145
 
134
- describe ".http" do
135
- it "returns a full http uri (with ::NamedRoutes.host) for the given named route" do
136
- routes.http.decision_stream(:stream_id => "11").should == "http://example.com/decision-streams/11"
137
- end
138
- end
139
-
140
- describe ".https" do
141
- it "returns a full https uri (with ::NamedRoutes.host) for the given named route" do
142
- routes.https.decision_stream(:stream_id => "11").should == "https://example.com/decision-streams/11"
146
+ describe "#as_json" do
147
+ it "returns a hash of all of the route methods as keys and the definions as values" do
148
+ routes.as_json.should == {
149
+ "root" => "/",
150
+ "current_user_category_top_choices" => "/current-user/:category/top-choices",
151
+ "decision_stream" => "/decision-streams/:stream_id"
152
+ }
143
153
  end
144
154
  end
145
155
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require "rubygems"
2
+ require "bundler"
3
+ Bundler.setup
2
4
 
3
5
  $LOAD_PATH.unshift(File.expand_path("#{File.dirname(__FILE__)}/../lib"))
4
6
  require "named-routes"
@@ -13,5 +15,6 @@ require 'rr'
13
15
 
14
16
  RSpec.configure do |c|
15
17
  c.mock_with :rr
16
- # c.filter_run :focus => true
18
+ c.filter_run :focus => true
19
+ c.run_all_when_everything_filtered = true
17
20
  end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: named-routes
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 1
9
7
  - 2
10
- version: 0.1.2
8
+ - 1
9
+ version: 0.2.1
11
10
  platform: ruby
12
11
  authors:
13
12
  - Brian Takita
@@ -15,24 +14,99 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-10-20 00:00:00 -07:00
17
+ date: 2010-12-28 00:00:00 -08:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- name: activesupport
21
+ name: extlib
23
22
  prerelease: false
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
25
  requirements:
27
- - - ">="
26
+ - - "="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 9
31
+ - 15
32
+ version: 0.9.15
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: diff-lcs
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 1
45
+ - 1
46
+ - 2
47
+ version: 1.1.2
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: jeweler
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - "="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 1
60
+ - 5
61
+ - 2
62
+ version: 1.5.2
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rr
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - "="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 1
75
+ - 0
76
+ - 2
77
+ version: 1.0.2
78
+ type: :runtime
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: rspec
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - "="
28
87
  - !ruby/object:Gem::Version
29
- hash: 5
30
88
  segments:
31
89
  - 2
32
90
  - 3
33
- version: "2.3"
91
+ - 0
92
+ version: 2.3.0
34
93
  type: :runtime
35
- version_requirements: *id001
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: extlib
97
+ prerelease: false
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ segments:
104
+ - 0
105
+ - 9
106
+ - 15
107
+ version: 0.9.15
108
+ type: :runtime
109
+ version_requirements: *id006
36
110
  description:
37
111
  email: brian.takita@gmail.com
38
112
  executables: []
@@ -44,13 +118,15 @@ extra_rdoc_files:
44
118
  - README.md
45
119
  files:
46
120
  - CHANGES
121
+ - Gemfile
122
+ - Gemfile.lock
47
123
  - MIT.LICENSE
48
124
  - README.md
49
125
  - Rakefile
50
126
  - VERSION
51
127
  - lib/named-routes.rb
52
128
  - lib/named-routes/routes.rb
53
- - lib/named-routes/uri.rb
129
+ - lib/named-routes/schemed_uri.rb
54
130
  - spec/named-routes/routes_spec.rb
55
131
  - spec/spec_helper.rb
56
132
  has_rdoc: true
@@ -70,7 +146,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
70
146
  requirements:
71
147
  - - ">="
72
148
  - !ruby/object:Gem::Version
73
- hash: 3
74
149
  segments:
75
150
  - 0
76
151
  version: "0"
@@ -79,7 +154,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
154
  requirements:
80
155
  - - ">="
81
156
  - !ruby/object:Gem::Version
82
- hash: 3
83
157
  segments:
84
158
  - 0
85
159
  version: "0"