rory 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -40,13 +40,13 @@ module Rory
40
40
  end
41
41
  end
42
42
 
43
- def autoload_paths
44
- @autoload_paths ||= %w(models controllers helpers)
43
+ def auto_require_paths
44
+ @auto_require_paths ||= %w(models controllers helpers)
45
45
  end
46
46
 
47
- def autoload_all_files
48
- autoload_paths.each do |path|
49
- Rory::Support.autoload_all_files_in_directory root_path.join(path)
47
+ def require_all_files
48
+ auto_require_paths.each do |path|
49
+ Rory::Support.require_all_files_in_directory root_path.join(path)
50
50
  end
51
51
  end
52
52
 
@@ -5,46 +5,21 @@ module Rory
5
5
  attr_reader :request
6
6
  def initialize(rack_request, context = nil)
7
7
  @request = rack_request
8
- @request[:route] ||= nil
9
- @request[:dispatcher] = self
10
8
  @context = context
11
9
  end
12
10
 
13
- def route_map
14
- @context ? @context.routes : []
15
- end
16
-
17
- def get_route
18
- match = nil
19
- route = route_map.detect do |route_hash|
20
- path_name = @request.path_info[1..-1] || ''
21
- match = route_hash[:regex].match(path_name)
22
- methods = route_hash[:methods] || []
23
- match && (methods.empty? || methods.include?(method.to_sym))
24
- end
25
- if route
26
- symbolized_param_names = match.names.map { |name| name.to_sym }
27
- @request.params.merge! Hash[symbolized_param_names.zip(match.captures)]
28
- end
29
- route
11
+ def route
12
+ @request[:route] ||= get_route
30
13
  end
31
14
 
32
15
  def dispatch
33
- route = set_route_if_empty
34
-
35
- if route
36
- controller_name = Rory::Support.camelize("#{route[:controller]}_controller")
37
- controller_class = Object.const_get(controller_name)
38
- controller_class.new(@request, @context).present
16
+ if controller
17
+ controller.present
39
18
  else
40
19
  render_not_found
41
20
  end
42
21
  end
43
22
 
44
- def set_route_if_empty
45
- @request[:route] ||= get_route
46
- end
47
-
48
23
  def method
49
24
  override_method = @request.params.delete('_method')
50
25
  method = if override_method && ['put', 'patch', 'delete'].include?(override_method.downcase)
@@ -66,8 +41,43 @@ module Rory
66
41
  return [ 404, {'Content-type' => 'text/html' }, ['Four, oh, four.'] ]
67
42
  end
68
43
 
69
- def inspect
70
- @request.inspect # fixes issue for rspec and pretty_print
44
+ private
45
+
46
+ def controller
47
+ if klass = controller_class
48
+ klass.new(@request.merge(:dispatcher => self), @context)
49
+ end
50
+ end
51
+
52
+ def controller_class
53
+ if route
54
+ controller_name = Rory::Support.camelize("#{route[:controller]}_controller")
55
+ const_scope = if route[:module]
56
+ Object.const_get(Rory::Support.camelize("#{route[:module]}"))
57
+ else
58
+ Object
59
+ end
60
+ const_scope.const_get(controller_name)
61
+ end
62
+ end
63
+
64
+ def get_route
65
+ match = nil
66
+ mapped_route = route_map.detect do |route_hash|
67
+ path_name = @request.path_info[1..-1] || ''
68
+ match = route_hash[:regex].match(path_name)
69
+ methods = route_hash[:methods] || []
70
+ match && (methods.empty? || methods.include?(method.to_sym))
71
+ end
72
+ if mapped_route
73
+ symbolized_param_names = match.names.map { |name| name.to_sym }
74
+ @request.params.merge! Hash[symbolized_param_names.zip(match.captures)]
75
+ end
76
+ mapped_route
77
+ end
78
+
79
+ def route_map
80
+ @context ? @context.routes : []
71
81
  end
72
82
  end
73
83
  end
@@ -12,13 +12,22 @@ module Rory
12
12
 
13
13
  def initialize
14
14
  @routes = []
15
+ @scope_options = {}
15
16
  end
16
17
 
17
18
  def routing_map
18
19
  @routes
19
20
  end
20
21
 
22
+ def scope(options = {}, &block)
23
+ previous_options, @scope_options =
24
+ @scope_options, @scope_options.merge(options)
25
+ yield
26
+ @scope_options = previous_options
27
+ end
28
+
21
29
  def match(mask, options = {})
30
+ options.merge!(@scope_options)
22
31
  options[:to] ||= mask.split('/').first
23
32
  mask.gsub!(/^\//, '')
24
33
  regex = /^#{mask.gsub(/:([\w_]+)/, "(?<\\1>\[\^\\\/\]+)")}$/
@@ -28,6 +37,7 @@ module Rory
28
37
  :action => action,
29
38
  :regex => regex
30
39
  }
40
+ route[:module] = options[:module] if options[:module]
31
41
  route[:methods] = options[:methods] if options[:methods]
32
42
  @routes << route
33
43
  end
data/lib/rory/support.rb CHANGED
@@ -9,20 +9,9 @@ module Rory
9
9
  string = string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
10
10
  end
11
11
 
12
- def extract_class_name_from_path(path)
13
- name = File.basename(path).sub(/(.*)\.rb$/, '\1')
14
- name = camelize(name)
15
- end
16
-
17
- def autoload_file(path)
18
- path = File.expand_path(path)
19
- name = extract_class_name_from_path(path)
20
- Object.autoload name.to_sym, path
21
- end
22
-
23
- def autoload_all_files_in_directory(path)
12
+ def require_all_files_in_directory(path)
24
13
  Dir[Pathname.new(path).join('**', '*.rb')].each do |file|
25
- Rory::Support.autoload_file file
14
+ require file
26
15
  end
27
16
  end
28
17
  end
data/lib/rory/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rory
2
- VERSION = '0.3.5'
2
+ VERSION = '0.3.6'
3
3
  end
data/rory.gemspec CHANGED
@@ -36,6 +36,7 @@ EOF
36
36
  s.add_development_dependency 'rspec'
37
37
  s.add_development_dependency 'yard'
38
38
  s.add_development_dependency 'reek'
39
+ s.add_development_dependency 'simplecov'
39
40
  s.add_development_dependency 'bundler', '~> 1.0'
40
41
  end
41
42
 
@@ -76,6 +76,7 @@ describe Rory::Application do
76
76
  { :controller => 'foo', :action => 'bar', :regex => /^foo\/(?<id>[^\/]+)\/bar$/, :methods => [:get, :post] },
77
77
  { :controller => 'monkeys', :action => nil, :regex => /^foo$/, :methods => [:put] },
78
78
  { :controller => 'awesome', :action => 'rad', :regex => /^this\/(?<path>[^\/]+)\/is\/(?<very_awesome>[^\/]+)$/},
79
+ { :controller => 'lumpies', :action => 'show', :regex => /^lumpies\/(?<lump>[^\/]+)$/, :module => 'goose', :methods => [:get] },
79
80
  { :controller => 'root', :action => 'vegetable', :regex => /^$/, :methods => [:get] }
80
81
  ].inspect
81
82
  end
@@ -90,27 +91,27 @@ describe Rory::Application do
90
91
 
91
92
  describe '.autoload_paths' do
92
93
  after(:each) do
93
- Fixture::Application.instance.instance_variable_set(:@autoload_paths, nil)
94
+ Fixture::Application.instance.instance_variable_set(:@auto_require_paths, nil)
94
95
  end
95
96
 
96
97
  it 'includes models, controllers, and helpers by default' do
97
- Fixture::Application.autoload_paths.should == ['models', 'controllers', 'helpers']
98
+ Fixture::Application.auto_require_paths.should == ['models', 'controllers', 'helpers']
98
99
  end
99
100
 
100
101
  it 'accepts new paths' do
101
- Fixture::Application.autoload_paths << 'chocolates'
102
- Fixture::Application.autoload_paths.should == ['models', 'controllers', 'helpers', 'chocolates']
102
+ Fixture::Application.auto_require_paths << 'chocolates'
103
+ Fixture::Application.auto_require_paths.should == ['models', 'controllers', 'helpers', 'chocolates']
103
104
  end
104
105
  end
105
106
 
106
- describe '.autoload_all_files' do
107
- it 'autoloads all files in autoload_paths' do
108
- Fixture::Application.any_instance.stub(:autoload_paths).and_return(['goats', 'rhubarbs'])
107
+ describe '.require_all_files' do
108
+ it 'requires all files in auto_require_paths' do
109
+ Fixture::Application.any_instance.stub(:auto_require_paths).and_return(['goats', 'rhubarbs'])
109
110
  [:goats, :rhubarbs].each do |folder|
110
- Rory::Support.should_receive(:autoload_all_files_in_directory).
111
+ Rory::Support.should_receive(:require_all_files_in_directory).
111
112
  with(Pathname.new(Fixture::Application.root).join("#{folder}"))
112
113
  end
113
- Fixture::Application.autoload_all_files
114
+ Fixture::Application.require_all_files
114
115
  end
115
116
  end
116
117
  end
@@ -22,52 +22,54 @@ describe Rory::Dispatcher do
22
22
  end
23
23
 
24
24
  describe "#dispatch" do
25
+ let(:dispatcher) { Rory::Dispatcher.new(request, Fixture::Application) }
26
+ let(:request) {
27
+ request = { :whatever => :yay }
28
+ request.stub(:path_info => '/', :request_method => 'GET', :params => {})
29
+ request
30
+ }
31
+
25
32
  it "renders a 404 if the requested path is invalid" do
26
- @request = {}
27
- @request.stub(:path_info => nil, :request_method => 'GET', :params => {})
28
- @dispatcher = Rory::Dispatcher.new(@request, Fixture::Application)
29
- @dispatcher.stub(:get_route).and_return(nil)
30
- @dispatcher.dispatch[0..1].should == [404, {"Content-type"=>"text/html"}]
33
+ dispatcher.stub(:get_route).and_return(nil)
34
+ dispatcher.dispatch[0..1].should == [404, {"Content-type"=>"text/html"}]
31
35
  end
32
36
 
33
37
  it "instantiates a controller with the parsed request and calls present" do
34
- @request = {:whatever => :yay}
35
- @request.stub(:path_info => '/', :request_method => 'GET', :params => {})
36
- @dispatcher = Rory::Dispatcher.new(@request, Fixture::Application)
37
- route = { :controller => 'stub' }
38
- @dispatcher.stub(:get_route).and_return(route)
39
- @dispatcher.dispatch.should == {
38
+ request[:route] = { :controller => 'stub' }
39
+ dispatcher.dispatch.should == {
40
40
  :whatever => :yay,
41
- :route => route,
42
- :dispatcher => @dispatcher,
41
+ :route => request[:route],
42
+ :dispatcher => dispatcher,
43
43
  :present_called => true # see StubController in /spec/fixture_app
44
44
  }
45
45
  end
46
46
 
47
- it "uses existing route if given in request" do
48
- @request = {:whatever => :yay, :route => { :controller => 'stub' } }
49
- @request.stub(:path_info => '/', :request_method => 'GET', :params => {})
50
- @dispatcher = Rory::Dispatcher.new(@request, Fixture::Application)
51
- @dispatcher.should_receive(:get_route).never
52
- @dispatcher.dispatch.should == {
47
+ it "dispatches properly to a scoped controller" do
48
+ request[:route] = { :controller => 'lumpies', :module => 'goose' }
49
+ dispatcher.dispatch.should == {
53
50
  :whatever => :yay,
54
- :route => { :controller => 'stub' },
55
- :dispatcher => @dispatcher,
56
- :present_called => true # see StubController in /spec/fixture_app
51
+ :route => request[:route],
52
+ :dispatcher => dispatcher,
53
+ :in_scoped_controller => true # see Goose::LumpiesController in /spec/fixture_app
57
54
  }
58
55
  end
59
56
  end
60
57
 
61
- describe "#get_route" do
58
+ describe "#route" do
62
59
  before(:each) do
63
60
  @request = {}
64
61
  @request.stub(:params => {})
65
62
  @dispatcher = Rory::Dispatcher.new(@request, Fixture::Application)
66
63
  end
67
64
 
65
+ it "returns route from request if already set" do
66
+ @request[:route] = 'snaky pigeons'
67
+ @dispatcher.route.should == 'snaky pigeons'
68
+ end
69
+
68
70
  it "matches the path from the request to the routes table" do
69
71
  @request.stub(:path_info => '/foo', :request_method => 'PUT')
70
- @dispatcher.get_route.should == {
72
+ @dispatcher.route.should == {
71
73
  :controller => 'monkeys',
72
74
  :action => nil,
73
75
  :regex => /^foo$/,
@@ -77,7 +79,7 @@ describe Rory::Dispatcher do
77
79
 
78
80
  it "works with empty path" do
79
81
  @request.stub(:path_info => '', :request_method => 'GET')
80
- @dispatcher.get_route.should == {
82
+ @dispatcher.route.should == {
81
83
  :controller => 'root',
82
84
  :action => 'vegetable',
83
85
  :regex => /^$/,
@@ -87,7 +89,7 @@ describe Rory::Dispatcher do
87
89
 
88
90
  it "works with root url represented by slash" do
89
91
  @request.stub(:path_info => '/', :request_method => 'GET')
90
- @dispatcher.get_route.should == {
92
+ @dispatcher.route.should == {
91
93
  :controller => 'root',
92
94
  :action => 'vegetable',
93
95
  :regex => /^$/,
@@ -97,22 +99,22 @@ describe Rory::Dispatcher do
97
99
 
98
100
  it "returns nil if no route found" do
99
101
  @request.stub(:path_info => '/umbrellas', :request_method => 'GET')
100
- @dispatcher.get_route.should be_nil
102
+ @dispatcher.route.should be_nil
101
103
  end
102
104
 
103
105
  it "returns nil if no context" do
104
106
  @dispatcher = Rory::Dispatcher.new(@request)
105
- @dispatcher.get_route.should be_nil
107
+ @dispatcher.route.should be_nil
106
108
  end
107
109
 
108
110
  it "returns nil if route found but method is not allowed" do
109
111
  @request.stub(:path_info => '/foo', :request_method => 'GET')
110
- @dispatcher.get_route.should be_nil
112
+ @dispatcher.route.should be_nil
111
113
  end
112
114
 
113
115
  it "assigns named matches to params hash" do
114
116
  @request.stub(:path_info => '/this/some-thing_or-other/is/wicked', :request_method => 'GET')
115
- @dispatcher.get_route.inspect.should == {
117
+ @dispatcher.route.inspect.should == {
116
118
  :controller => 'awesome',
117
119
  :action => 'rad',
118
120
  :regex => /^this\/(?<path>[^\/]+)\/is\/(?<very_awesome>[^\/]+)$/,
@@ -2,5 +2,8 @@ Fixture::Application.set_routes do
2
2
  match 'foo/:id/bar', :to => 'foo#bar', :methods => [:get, :post]
3
3
  match '/foo', :to => 'monkeys', :methods => [:put]
4
4
  match 'this/:path/is/:very_awesome', :to => 'awesome#rad'
5
+ scope :module => 'goose' do
6
+ match 'lumpies/:lump', :to => 'lumpies#show', :methods => [:get]
7
+ end
5
8
  match '/', :to => 'root#vegetable', :methods => [:get]
6
9
  end
@@ -0,0 +1,12 @@
1
+ module Goose
2
+ class LumpiesController
3
+ def initialize(args, context)
4
+ @args = args
5
+ end
6
+
7
+ def present
8
+ @args[:in_scoped_controller] = true
9
+ @args
10
+ end
11
+ end
12
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
1
4
  ENV['RORY_STAGE'] = 'test'
2
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -12,7 +15,7 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
12
15
  require_relative 'fixture_app/config/application'
13
16
  Fixture::Application.root = File.join(File.dirname(__FILE__), 'fixture_app')
14
17
 
15
- Fixture::Application.autoload_all_files
18
+ Fixture::Application.require_all_files
16
19
 
17
20
  RSpec.configure do |config|
18
21
 
data/spec/support_spec.rb CHANGED
@@ -7,21 +7,13 @@ describe Rory::Support do
7
7
  end
8
8
  end
9
9
 
10
- describe '.autoload_file' do
11
- it 'adds basename of given path to autoload list by default' do
12
- path = '/fake_root/gas/is/cheap/in/good_old_america.rb'
13
- Object.should_receive(:autoload).with(:GoodOldAmerica, path)
14
- Rory::Support.autoload_file(path)
15
- end
16
- end
17
-
18
- describe '.autoload_all_files_in_directory' do
19
- it 'autoloads all files from given path' do
10
+ describe '.require_all_files_in_directory' do
11
+ it 'requires all files from given path' do
20
12
  Dir.stub(:[]).with(Pathname.new('spinach').join('**', '*.rb')).
21
13
  and_return(["pumpkins", "some_guy_dressed_as_liberace"])
22
- Rory::Support.should_receive(:autoload_file).with("pumpkins")
23
- Rory::Support.should_receive(:autoload_file).with("some_guy_dressed_as_liberace")
24
- Rory::Support.autoload_all_files_in_directory('spinach')
14
+ Rory::Support.should_receive(:require).with("pumpkins")
15
+ Rory::Support.should_receive(:require).with("some_guy_dressed_as_liberace")
16
+ Rory::Support.require_all_files_in_directory('spinach')
25
17
  end
26
18
  end
27
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
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: 2014-02-19 00:00:00.000000000 Z
12
+ date: 2014-03-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -123,6 +123,22 @@ dependencies:
123
123
  - - ! '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
126
142
  - !ruby/object:Gem::Dependency
127
143
  name: bundler
128
144
  requirement: !ruby/object:Gem::Requirement
@@ -172,6 +188,7 @@ files:
172
188
  - spec/dispatcher_spec.rb
173
189
  - spec/fixture_app/config/application.rb
174
190
  - spec/fixture_app/config/routes.rb
191
+ - spec/fixture_app/controllers/goose/lumpies_controller.rb
175
192
  - spec/fixture_app/controllers/stub_controller.rb
176
193
  - spec/fixture_app/views/layouts/surround.html.erb
177
194
  - spec/fixture_app/views/test/dynamic.html.erb