renee-core 0.1.0 → 0.1.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/.yardopts +1 -1
- data/Rakefile +0 -1
- data/lib/renee-core/application/chaining.rb +12 -1
- data/lib/renee-core/application/rack_interaction.rb +6 -1
- data/lib/renee-core/application/routing.rb +6 -2
- data/lib/renee-core/application/transform.rb +4 -0
- data/lib/renee-core/exceptions.rb +5 -1
- data/lib/renee-core/matcher.rb +2 -1
- data/lib/renee-core/settings.rb +8 -2
- data/lib/renee-core/url_generation.rb +1 -2
- data/lib/renee-core/version.rb +2 -1
- data/lib/renee-core.rb +17 -5
- data/renee-core.gemspec +2 -2
- data/test/include_test.rb +14 -0
- metadata +7 -6
- data/ideal.rb +0 -49
data/.yardopts
CHANGED
data/Rakefile
CHANGED
@@ -3,8 +3,18 @@ require 'set'
|
|
3
3
|
class Renee
|
4
4
|
class Core
|
5
5
|
class Application
|
6
|
+
# Module for creating chainable methods. To use this within your own modules, first `include Chaining`, then,
|
7
|
+
# mark methods you want to be available with `chain_method :method_name`.
|
8
|
+
# @example
|
9
|
+
# module MoreRoutingMethods
|
10
|
+
# include Chaining
|
11
|
+
# def other_routing_method
|
12
|
+
# # ..
|
13
|
+
# end
|
14
|
+
# chain_method :other_routing_method
|
15
|
+
#
|
6
16
|
module Chaining
|
7
|
-
private
|
17
|
+
# @private
|
8
18
|
class ChainingProxy
|
9
19
|
def initialize(target, proxy_blk)
|
10
20
|
@target, @proxy_blk, @calls = target, proxy_blk, []
|
@@ -34,6 +44,7 @@ class Renee
|
|
34
44
|
end
|
35
45
|
end
|
36
46
|
|
47
|
+
# @private
|
37
48
|
module ClassMethods
|
38
49
|
def chain_method(*methods)
|
39
50
|
methods.each do |m|
|
@@ -12,6 +12,11 @@ class Renee
|
|
12
12
|
run Rack::Builder.new(&blk).to_app
|
13
13
|
end
|
14
14
|
|
15
|
+
# Creates an ad-hoc Rack application within the context of a Rack::Builder that immediately halts when done.
|
16
|
+
# @see #run!
|
17
|
+
# @example
|
18
|
+
# get { halt build { use Rack::ContentLength; run proc { |env| Rack::Response.new("Hello!").finish } } }
|
19
|
+
#
|
15
20
|
def build!(&blk)
|
16
21
|
run! build(&blk)
|
17
22
|
end
|
@@ -25,7 +30,7 @@ class Renee
|
|
25
30
|
(app || blk).call(env)
|
26
31
|
end
|
27
32
|
|
28
|
-
# Runs a rack application and
|
33
|
+
# Runs a rack application and halts immediately.
|
29
34
|
#
|
30
35
|
# @see #run
|
31
36
|
# @example
|
@@ -54,8 +54,7 @@ class Renee
|
|
54
54
|
|
55
55
|
# Match parts off the path as variables. The parts matcher can conform to either a regular expression, or be an Integer, or
|
56
56
|
# simply a String.
|
57
|
-
# @param[Object] type the type of object to match for. If you supply Integer, this will only match integers in addition to
|
58
|
-
# casting your variable for you.
|
57
|
+
# @param[Object] type the type of object to match for. If you supply Integer, this will only match integers in addition to casting your variable for you.
|
59
58
|
# @param[Object] default the default value to use if your param cannot be successfully matched.
|
60
59
|
#
|
61
60
|
# @example
|
@@ -83,6 +82,9 @@ class Renee
|
|
83
82
|
alias_method :var, :variable
|
84
83
|
chain_method :variable, :var
|
85
84
|
|
85
|
+
# Same as variable except you can match multiple variables with the same type.
|
86
|
+
# @param [Range, Integer] count The number of parameters to capture.
|
87
|
+
# @param [Symbol] type The type to use for match.
|
86
88
|
def multi_variable(count, type = nil, &blk)
|
87
89
|
complex_variable(type, '/', count, &blk)
|
88
90
|
end
|
@@ -90,6 +92,8 @@ class Renee
|
|
90
92
|
alias_method :mvar, :multi_variable
|
91
93
|
chain_method :multi_variable, :multi_var, :mvar
|
92
94
|
|
95
|
+
# Same as variable except it matches indefinitely.
|
96
|
+
# @param [Symbol] type The type to use for match.
|
93
97
|
def repeating_variable(type = nil, &blk)
|
94
98
|
complex_variable(type, '/', nil, &blk)
|
95
99
|
end
|
@@ -2,6 +2,10 @@ class Renee
|
|
2
2
|
class Core
|
3
3
|
class Application
|
4
4
|
module Transform
|
5
|
+
# Transforms a value according to the rules specified by #register_variable_name.
|
6
|
+
# @param [Symbol] name The name of the variable type.
|
7
|
+
# @param [String] value The value to transform.
|
8
|
+
# @return The transformed value or nil.
|
5
9
|
def transform(type, value)
|
6
10
|
if settings.variable_types.key?(type) and m = settings.variable_types[type][value]
|
7
11
|
m.first == value ? m.last : nil
|
@@ -1,8 +1,12 @@
|
|
1
1
|
class Renee
|
2
2
|
class Core
|
3
|
+
# Used to indicate a client-error has occurred (e.g. 4xx)
|
3
4
|
class ClientError < StandardError
|
4
5
|
attr_reader :response
|
5
|
-
|
6
|
+
|
7
|
+
# @param [String] message The message for this exception.
|
8
|
+
# @yield The optional block to instance-eval in the case this error is raised.
|
9
|
+
def initialize(message, &response)
|
6
10
|
super(message)
|
7
11
|
@response = response
|
8
12
|
end
|
data/lib/renee-core/matcher.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
class Renee
|
2
2
|
class Core
|
3
|
+
# @private
|
3
4
|
class Matcher
|
4
5
|
attr_accessor :name
|
5
6
|
|
@@ -42,7 +43,7 @@ class Renee
|
|
42
43
|
if match
|
43
44
|
match
|
44
45
|
elsif @error_handler
|
45
|
-
raise ClientError.new("There was an error interpreting the value #{val.inspect} for #{name.inspect}",
|
46
|
+
raise ClientError.new("There was an error interpreting the value #{val.inspect} for #{name.inspect}", &@error_handler)
|
46
47
|
end
|
47
48
|
end
|
48
49
|
end
|
data/lib/renee-core/settings.rb
CHANGED
@@ -29,10 +29,16 @@ class Renee
|
|
29
29
|
path ? @views_path = path : @views_path
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
# Module(s) to include into the base application.
|
33
|
+
# @param [Module] mods Modules to include.
|
34
|
+
def include(*mods)
|
35
|
+
mods.each { |mod| includes << mod }
|
34
36
|
end
|
35
37
|
|
38
|
+
# Registers a new variable type for use within {Renee::Application::Routing#variable} and others.
|
39
|
+
# @param [Symbol] name The name of the variable.
|
40
|
+
# @param [Regexp] matcher A regexp describing what part of an arbitrary string to capture.
|
41
|
+
# @return [Renee::Core::Matcher] A matcher
|
36
42
|
def register_variable_type(name, matcher)
|
37
43
|
matcher = case matcher
|
38
44
|
when Matcher then matcher
|
@@ -62,7 +62,7 @@ class Renee
|
|
62
62
|
generator = url_generators[name]
|
63
63
|
generator ? generator.url(*args) : raise("Generator for #{name} doesn't exist")
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
private
|
67
67
|
def url_generators
|
68
68
|
@url_generators ||= {}
|
@@ -72,7 +72,6 @@ class Renee
|
|
72
72
|
@generation_defaults && defaults ? @generation_defaults.merge(defaults) : (defaults || @generation_defaults)
|
73
73
|
end
|
74
74
|
|
75
|
-
# Manages generating paths and urls for a given name.
|
76
75
|
# @private
|
77
76
|
class Generator
|
78
77
|
attr_reader :defaults
|
data/lib/renee-core/version.rb
CHANGED
data/lib/renee-core.rb
CHANGED
@@ -7,7 +7,7 @@ require 'renee-core/application'
|
|
7
7
|
require 'renee-core/url_generation'
|
8
8
|
require 'renee-core/exceptions'
|
9
9
|
|
10
|
-
#
|
10
|
+
# Top-level Renee constant
|
11
11
|
class Renee
|
12
12
|
# The top-level class for creating core application.
|
13
13
|
# For convience you can also used a method named #Renee
|
@@ -19,14 +19,18 @@ class Renee
|
|
19
19
|
class Core
|
20
20
|
include URLGeneration
|
21
21
|
|
22
|
-
|
22
|
+
# The application block used to initialize this application.
|
23
|
+
attr_reader :application_block
|
24
|
+
# The {Settings} object used to initialize this application.
|
25
|
+
attr_reader :settings
|
23
26
|
|
24
27
|
# @param [Proc] application_block The block of code that will be executed on each invocation of call #call.
|
25
28
|
# Each time #call is called, a new instance of {Renee::Core::Application} will
|
26
29
|
# be created. The block given will be #instance_eval 'd within
|
27
30
|
# the context of that new instance.
|
28
31
|
#
|
29
|
-
def initialize(&application_block)
|
32
|
+
def initialize(base_application_class = Application, &application_block)
|
33
|
+
@base_application_class = base_application_class
|
30
34
|
@application_block = application_block
|
31
35
|
@settings = Settings.new
|
32
36
|
end
|
@@ -40,9 +44,8 @@ class Renee
|
|
40
44
|
# @see http://rack.rubyforge.org/doc/SPEC.html
|
41
45
|
#
|
42
46
|
def call(env)
|
43
|
-
|
47
|
+
application_class.new(settings, &application_block).call(env)
|
44
48
|
end
|
45
|
-
alias_method :[], :call
|
46
49
|
|
47
50
|
##
|
48
51
|
# Configure settings for your Renee application. Accepts a settings file path
|
@@ -62,5 +65,14 @@ class Renee
|
|
62
65
|
end
|
63
66
|
self
|
64
67
|
end
|
68
|
+
|
69
|
+
private
|
70
|
+
def application_class
|
71
|
+
@application_class ||= begin
|
72
|
+
app_cls = Class.new(@base_application_class)
|
73
|
+
settings.includes.each { |inc| app_cls.send(:include, inc) }
|
74
|
+
app_cls
|
75
|
+
end
|
76
|
+
end
|
65
77
|
end
|
66
78
|
end
|
data/renee-core.gemspec
CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Renee::Core::VERSION
|
8
8
|
s.authors = ["Josh Hull", "Nathan Esquenazi", "Arthur Chiu"]
|
9
9
|
s.email = ["joshbuddy@gmail.com", "nesquena@gmail.com", "mr.arthur.chiu@gmail.com"]
|
10
|
-
s.homepage = ""
|
11
|
-
s.summary = %q{The super-friendly rack helpers
|
10
|
+
s.homepage = "http://reneerb.com"
|
11
|
+
s.summary = %q{The super-friendly rack helpers}
|
12
12
|
s.description = %q{The super-friendly rack helpers.}
|
13
13
|
|
14
14
|
s.rubyforge_project = "renee"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe "Route::Settings#include" do
|
4
|
+
it "should allow the inclusion of arbitrary modules" do
|
5
|
+
type = { 'Content-Type' => 'text/plain' }
|
6
|
+
@app = Renee::Core.new {
|
7
|
+
halt :ok if respond_to?(:hi)
|
8
|
+
}.setup {
|
9
|
+
include Module.new { def hi; end }
|
10
|
+
}
|
11
|
+
get '/'
|
12
|
+
assert_equal 200, response.status
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: renee-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Josh Hull
|
@@ -84,7 +84,6 @@ files:
|
|
84
84
|
- .yardopts
|
85
85
|
- README.md
|
86
86
|
- Rakefile
|
87
|
-
- ideal.rb
|
88
87
|
- lib/renee-core.rb
|
89
88
|
- lib/renee-core/application.rb
|
90
89
|
- lib/renee-core/application/chaining.rb
|
@@ -101,12 +100,13 @@ files:
|
|
101
100
|
- lib/renee-core/version.rb
|
102
101
|
- renee-core.gemspec
|
103
102
|
- test/chaining_test.rb
|
103
|
+
- test/include_test.rb
|
104
104
|
- test/responding_test.rb
|
105
105
|
- test/routing_test.rb
|
106
106
|
- test/test_helper.rb
|
107
107
|
- test/url_generation_test.rb
|
108
108
|
- test/variable_type_test.rb
|
109
|
-
homepage:
|
109
|
+
homepage: http://reneerb.com
|
110
110
|
licenses: []
|
111
111
|
|
112
112
|
post_install_message:
|
@@ -119,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
119
|
requirements:
|
120
120
|
- - ">="
|
121
121
|
- !ruby/object:Gem::Version
|
122
|
-
hash:
|
122
|
+
hash: 4467242971935136938
|
123
123
|
segments:
|
124
124
|
- 0
|
125
125
|
version: "0"
|
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
hash:
|
131
|
+
hash: 4467242971935136938
|
132
132
|
segments:
|
133
133
|
- 0
|
134
134
|
version: "0"
|
@@ -138,9 +138,10 @@ rubyforge_project: renee
|
|
138
138
|
rubygems_version: 1.8.10
|
139
139
|
signing_key:
|
140
140
|
specification_version: 3
|
141
|
-
summary: The super-friendly rack helpers
|
141
|
+
summary: The super-friendly rack helpers
|
142
142
|
test_files:
|
143
143
|
- test/chaining_test.rb
|
144
|
+
- test/include_test.rb
|
144
145
|
- test/responding_test.rb
|
145
146
|
- test/routing_test.rb
|
146
147
|
- test/test_helper.rb
|
data/ideal.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'benchmark'
|
3
|
-
|
4
|
-
$: << 'lib'
|
5
|
-
require 'renee'
|
6
|
-
|
7
|
-
router = Renee::Core.new {
|
8
|
-
path 'test/time' do
|
9
|
-
query_string 'ok' do
|
10
|
-
get { halt "ok" }
|
11
|
-
post { halt [200, {}, ['POSTED!']] }
|
12
|
-
end
|
13
|
-
end
|
14
|
-
variable do |id1, id2|
|
15
|
-
path 'more' do
|
16
|
-
get {
|
17
|
-
halt [200, {}, "this is the id1: #{id1} id2: #{id2}" ]
|
18
|
-
}
|
19
|
-
end
|
20
|
-
end
|
21
|
-
remainder do |rest|
|
22
|
-
halt "the rest is #{rest}"
|
23
|
-
end
|
24
|
-
}.setup {
|
25
|
-
view_path('views')
|
26
|
-
environment(:development)
|
27
|
-
}
|
28
|
-
|
29
|
-
app = Renee do
|
30
|
-
path "add" do
|
31
|
-
variable Integer do |first, second|
|
32
|
-
"#{first} + #{second} = #{first + second}"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
p router.call(Rack::MockRequest.env_for('/add/3/4')) # => "3 + 4 = 7"
|
38
|
-
|
39
|
-
p router.call(Rack::MockRequest.env_for('/test/time?ok'))
|
40
|
-
p router.call(Rack::MockRequest.env_for('/test/josh/more'))
|
41
|
-
p router.call(Rack::MockRequest.env_for('/'))
|
42
|
-
|
43
|
-
|
44
|
-
#puts Benchmark.measure {
|
45
|
-
#50_000.times do
|
46
|
-
# router.call(Rack::MockRequest.env_for('/test/josh/more'))
|
47
|
-
#router.call(Rack::MockRequest.env_for('/test/time?ok', :method => 'POST' ))
|
48
|
-
#end
|
49
|
-
#}
|