merb-core 0.9.9 → 0.9.10
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/README +31 -3
- data/Rakefile +2 -2
- data/lib/merb-core.rb +18 -2
- data/lib/merb-core/bootloader.rb +80 -46
- data/lib/merb-core/config.rb +2 -2
- data/lib/merb-core/constants.rb +35 -5
- data/lib/merb-core/controller/abstract_controller.rb +4 -4
- data/lib/merb-core/controller/exceptions.rb +2 -2
- data/lib/merb-core/controller/merb_controller.rb +1 -1
- data/lib/merb-core/dispatch/dispatcher.rb +1 -1
- data/lib/merb-core/dispatch/request.rb +191 -184
- data/lib/merb-core/dispatch/router.rb +62 -27
- data/lib/merb-core/dispatch/router/resources.rb +10 -7
- data/lib/merb-core/dispatch/router/route.rb +2 -0
- data/lib/merb-core/dispatch/session.rb +2 -2
- data/lib/merb-core/rack/adapter/abstract.rb +1 -1
- data/lib/merb-core/tasks/gem_management.rb +15 -3
- data/lib/merb-core/test/helpers/request_helper.rb +4 -0
- data/lib/merb-core/test/tasks/spectasks.rb +10 -0
- data/lib/merb-core/test/test_ext/rspec.rb +0 -5
- data/lib/merb-core/version.rb +1 -1
- metadata +4 -4
@@ -35,8 +35,53 @@ module Merb
|
|
35
35
|
class NotCompiledError < StandardError; end;
|
36
36
|
|
37
37
|
class << self
|
38
|
-
#
|
39
|
-
|
38
|
+
# An array containing all the application routes in order of
|
39
|
+
# priority.
|
40
|
+
# ---
|
41
|
+
# @api private
|
42
|
+
attr_accessor :routes
|
43
|
+
|
44
|
+
# A hash containing all the named application routes. The names
|
45
|
+
# are absolute (as in, all routes named in a namespace will
|
46
|
+
# contain the name of the namespace).
|
47
|
+
# ---
|
48
|
+
# @api private
|
49
|
+
attr_accessor :named_routes
|
50
|
+
|
51
|
+
# A hash of all the application resource routes. The key of the hash
|
52
|
+
# is an array with each element containing the "path" for the resource
|
53
|
+
# for example, given the following resource routes:
|
54
|
+
#
|
55
|
+
# resources :users do
|
56
|
+
# resources :comments
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# The show comment route will have a key of ["User", "Comment"]
|
60
|
+
# ---
|
61
|
+
# @api private
|
62
|
+
attr_accessor :resource_routes
|
63
|
+
|
64
|
+
# The starting point for route definition. Any route defined in a
|
65
|
+
# Merb::Router.prepare block will defined in context of this
|
66
|
+
# behavior.
|
67
|
+
#
|
68
|
+
# ==== Examples
|
69
|
+
#
|
70
|
+
# Merb::Router.root_behavior = Merb::Router.root_bavior.match("/hello")
|
71
|
+
#
|
72
|
+
# In the previous example, all routes will have the path prefix /hello.
|
73
|
+
# It is important to note that this attribute must be set before any
|
74
|
+
# routes are defined in order for the behavior to be applied to the
|
75
|
+
# routes.
|
76
|
+
# ---
|
77
|
+
# @api plugin
|
78
|
+
attr_accessor :root_behavior
|
79
|
+
|
80
|
+
# A block that will be run around route matching. This block must yield
|
81
|
+
# in order for the actual matching to happen.
|
82
|
+
# ---
|
83
|
+
# @api plugin
|
84
|
+
attr_accessor :around_match
|
40
85
|
|
41
86
|
# Creates a route building context and evaluates the block in it. A
|
42
87
|
# copy of +root_behavior+ (and instance of Behavior) is copied as
|
@@ -53,7 +98,7 @@ module Merb
|
|
53
98
|
# ==== Returns
|
54
99
|
# Merb::Router::
|
55
100
|
# Returns self to allow chaining of methods.
|
56
|
-
#
|
101
|
+
# ---
|
57
102
|
# @api public
|
58
103
|
def prepare(first = [], last = [], &block)
|
59
104
|
@routes = []
|
@@ -63,20 +108,6 @@ module Merb
|
|
63
108
|
self
|
64
109
|
end
|
65
110
|
|
66
|
-
# Appends route in the block to routing table.
|
67
|
-
#
|
68
|
-
# @api public
|
69
|
-
def append(&block)
|
70
|
-
prepare(routes, [], &block)
|
71
|
-
end
|
72
|
-
|
73
|
-
# Prepends routes in the block to routing table.
|
74
|
-
#
|
75
|
-
# @api public
|
76
|
-
def prepend(&block)
|
77
|
-
prepare([], routes, &block)
|
78
|
-
end
|
79
|
-
|
80
111
|
# Clears the routing table. Route generation and request matching
|
81
112
|
# won't work anymore until a new routing table is built.
|
82
113
|
#
|
@@ -85,7 +116,7 @@ module Merb
|
|
85
116
|
class << self
|
86
117
|
alias_method :match, :match_before_compilation
|
87
118
|
end
|
88
|
-
self.routes, self.named_routes = [], {}
|
119
|
+
self.routes, self.named_routes, self.resource_routes = [], {}, {}
|
89
120
|
end
|
90
121
|
|
91
122
|
# Finds route matching URI of the request and returns a tuple of
|
@@ -101,8 +132,12 @@ module Merb
|
|
101
132
|
# are :controller, :action and all the named segments of the route.
|
102
133
|
#
|
103
134
|
# @api private
|
104
|
-
def route_for(request)
|
105
|
-
index, params =
|
135
|
+
def route_for(request)
|
136
|
+
index, params = if @around_match
|
137
|
+
send(@around_match, request) { match(request) }
|
138
|
+
else
|
139
|
+
match(request)
|
140
|
+
end
|
106
141
|
route = routes[index] if index
|
107
142
|
if !route
|
108
143
|
raise ControllerExceptions::NotFound,
|
@@ -181,8 +216,8 @@ module Merb
|
|
181
216
|
# end
|
182
217
|
#
|
183
218
|
# url(:articles, 2008, 10, "test_article")
|
184
|
-
#
|
185
|
-
# @api
|
219
|
+
# ---
|
220
|
+
# @api plugin
|
186
221
|
def url(name, *args)
|
187
222
|
unless name.is_a?(Symbol)
|
188
223
|
args.unshift(name)
|
@@ -211,8 +246,8 @@ module Merb
|
|
211
246
|
#
|
212
247
|
# ==== Returns
|
213
248
|
# String:: The generated URL
|
214
|
-
#
|
215
|
-
# @api
|
249
|
+
# ---
|
250
|
+
# @api plugin
|
216
251
|
def resource(*args)
|
217
252
|
defaults = args.pop
|
218
253
|
options = extract_options_from_args!(args) || {}
|
@@ -266,7 +301,7 @@ module Merb
|
|
266
301
|
# # ... routes come here ...
|
267
302
|
# end
|
268
303
|
# end
|
269
|
-
#
|
304
|
+
# ---
|
270
305
|
# @api public
|
271
306
|
def extensions(&block)
|
272
307
|
Router::Behavior.class_eval(&block)
|
@@ -275,7 +310,7 @@ module Merb
|
|
275
310
|
private
|
276
311
|
|
277
312
|
# Compiles the routes and creates the +match+ method.
|
278
|
-
#
|
313
|
+
# ---
|
279
314
|
# @api private
|
280
315
|
def compile
|
281
316
|
if routes.any?
|
@@ -287,7 +322,7 @@ module Merb
|
|
287
322
|
|
288
323
|
# Generates the method for evaluation defining a +match+ method to match
|
289
324
|
# a request with the defined routes.
|
290
|
-
#
|
325
|
+
# ---
|
291
326
|
# @api private
|
292
327
|
def compiled_statement
|
293
328
|
@compiler_mutex.synchronize do
|
@@ -73,19 +73,22 @@ module Merb
|
|
73
73
|
match_opts = options.except(*resource_options)
|
74
74
|
options = options.only(*resource_options)
|
75
75
|
singular = options[:singular] ? options[:singular].to_s : Extlib::Inflection.singularize(name)
|
76
|
-
klass_name = args.first ? args.first.to_s :
|
77
|
-
klass = Object.full_const_get(klass_name) rescue nil
|
76
|
+
klass_name = args.first ? args.first.to_s : singular.to_const_string
|
78
77
|
keys = options.delete(:keys) || options.delete(:key)
|
79
78
|
params = { :controller => options.delete(:controller) || name }
|
80
79
|
collection = options.delete(:collection) || {}
|
81
80
|
member = { :edit => :get, :delete => :get }.merge(options.delete(:member) || {})
|
82
81
|
|
83
82
|
# Use the identifier for the class as a default
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
83
|
+
begin
|
84
|
+
if klass = Object.full_const_get(klass_name)
|
85
|
+
keys ||= options[:identify]
|
86
|
+
keys ||= @identifiers[klass]
|
87
|
+
elsif options[:identify]
|
88
|
+
raise Error, "The constant #{klass_name} does not exist, please specify the constant for this resource"
|
89
|
+
end
|
90
|
+
rescue NameError => e
|
91
|
+
Merb.logger.debug!("Could not find resource model #{klass_name}")
|
89
92
|
end
|
90
93
|
|
91
94
|
keys = [ keys || :id ].flatten
|
@@ -19,7 +19,7 @@ module Merb
|
|
19
19
|
end # Config
|
20
20
|
|
21
21
|
# The Merb::Session module gets mixed into Merb::SessionContainer to allow
|
22
|
-
# app-level functionality (usually found in
|
22
|
+
# app-level functionality (usually found in ./merb/session/session.rb) for
|
23
23
|
# session.
|
24
24
|
#
|
25
25
|
# You can use this module to implement additional methods to simplify
|
@@ -38,7 +38,7 @@ module Merb
|
|
38
38
|
# session data; min. 16 chars
|
39
39
|
#
|
40
40
|
# :default_cookie_domain The default domain to write cookies for.
|
41
|
-
module Session
|
41
|
+
module Session
|
42
42
|
end
|
43
43
|
|
44
44
|
# This is mixed into Merb::Controller on framework boot.
|
@@ -189,7 +189,7 @@ module GemManagement
|
|
189
189
|
options[:version] = Gem::Requirement.new ["= #{options[:version]}"]
|
190
190
|
end
|
191
191
|
update_source_index(options[:install_dir]) if options[:install_dir]
|
192
|
-
Gem::Uninstaller.new(gem, options).uninstall
|
192
|
+
Gem::Uninstaller.new(gem, options).uninstall rescue nil
|
193
193
|
end
|
194
194
|
|
195
195
|
def clobber(source_dir)
|
@@ -251,7 +251,7 @@ module GemManagement
|
|
251
251
|
gemspecs = ::Gem.source_index.search(dep)
|
252
252
|
local = gemspecs.reverse.find { |s| s.loaded_from.index(gem_dir) == 0 }
|
253
253
|
if local
|
254
|
-
local_specs
|
254
|
+
local_specs << local
|
255
255
|
elsif gemspecs.last
|
256
256
|
system_specs << gemspecs.last
|
257
257
|
else
|
@@ -259,6 +259,15 @@ module GemManagement
|
|
259
259
|
end
|
260
260
|
end
|
261
261
|
::Gem.clear_paths
|
262
|
+
else
|
263
|
+
dependencies.each do |dep|
|
264
|
+
gemspecs = ::Gem.source_index.search(dep)
|
265
|
+
if gemspecs.last
|
266
|
+
system_specs << gemspecs.last
|
267
|
+
else
|
268
|
+
missing_deps << dep
|
269
|
+
end
|
270
|
+
end
|
262
271
|
end
|
263
272
|
[system_specs, local_specs, missing_deps]
|
264
273
|
end
|
@@ -307,9 +316,12 @@ end
|
|
307
316
|
if File.directory?(gems_dir = File.join(Dir.pwd, 'gems')) ||
|
308
317
|
File.directory?(gems_dir = File.join(File.dirname(__FILE__), '..', 'gems'))
|
309
318
|
$BUNDLE = true; Gem.clear_paths; Gem.path.unshift(gems_dir)
|
319
|
+
if (local_gem = Dir[File.join(gems_dir, "specifications", "#{spec.name}-*.gemspec")].last)
|
320
|
+
version = File.basename(local_gem)[/-([\\.\\d]+)\\.gemspec$/, 1]
|
321
|
+
end
|
310
322
|
end
|
311
323
|
|
312
|
-
version
|
324
|
+
version ||= "#{Gem::Requirement.default}"
|
313
325
|
|
314
326
|
if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
|
315
327
|
version = $1
|
@@ -28,6 +28,16 @@ namespace :spec do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
desc "Run all request specs, run a spec for a specific Request with REQUEST=MyRequest"
|
32
|
+
Spec::Rake::SpecTask.new('request') do |t|
|
33
|
+
t.spec_opts = SPEC_OPTS
|
34
|
+
if(ENV['REQUEST'])
|
35
|
+
t.spec_files = Dir["spec/requests/**/#{ENV['REQUEST']}_spec.rb"].sort
|
36
|
+
else
|
37
|
+
t.spec_files = Dir['spec/requests/**/*_spec.rb'].sort
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
31
41
|
desc "Run all controller specs, run a spec for a specific Controller with CONTROLLER=MyController"
|
32
42
|
Spec::Rake::SpecTask.new('controller') do |t|
|
33
43
|
t.spec_opts = SPEC_OPTS
|
@@ -42,11 +42,6 @@ module Merb
|
|
42
42
|
include ::Merb::Test::RouteHelper
|
43
43
|
include ::Merb::Test::ControllerHelper
|
44
44
|
|
45
|
-
def initialize(defined_description, &implementation)
|
46
|
-
@_defined_description = defined_description
|
47
|
-
@_implementation = implementation
|
48
|
-
end
|
49
|
-
|
50
45
|
class << self
|
51
46
|
# This is a copy of the method in rspec, so we can have
|
52
47
|
# describe "...", :when => "logged in", and the like
|
data/lib/merb-core/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezra Zygmuntowicz
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-10-
|
12
|
+
date: 2008-10-21 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.6.2
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: rake
|
@@ -255,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
255
|
requirements:
|
256
256
|
- install the json gem to get faster json parsing
|
257
257
|
rubyforge_project:
|
258
|
-
rubygems_version: 1.
|
258
|
+
rubygems_version: 1.3.0
|
259
259
|
signing_key:
|
260
260
|
specification_version: 2
|
261
261
|
summary: Merb. Pocket rocket web framework.
|