renee-core 0.4.0.pre1 → 0.4.0.pre2
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/.gitignore +7 -0
- data/.travis.yml +6 -0
- data/Gemfile +12 -0
- data/MIT-LICENSE.txt +7 -0
- data/README.md +242 -0
- data/Rakefile +24 -0
- data/lib/renee/core/chaining.rb +0 -1
- data/lib/renee/core/rack_interaction.rb +4 -4
- data/lib/renee/core/responding.rb +57 -20
- data/lib/renee/core/routing.rb +68 -41
- data/lib/renee/core/transform.rb +58 -0
- data/lib/renee/core/version.rb +5 -0
- data/lib/renee/core.rb +70 -22
- data/renee-core.gemspec +26 -0
- data/test/{renee-core/chaining_test.rb → chaining_test.rb} +0 -1
- data/test/{renee-core/include_test.rb → include_test.rb} +0 -0
- data/test/{renee-core/request_context_test.rb → request_context_test.rb} +0 -0
- data/test/{renee-core/responding_test.rb → responding_test.rb} +31 -1
- data/test/{renee-core/routing_test.rb → routing_test.rb} +0 -0
- data/test/test_helper.rb +2 -0
- data/test/{renee-core/variable_type_test.rb → variable_type_test.rb} +1 -1
- metadata +35 -35
- data/lib/renee/core/env_accessors.rb +0 -72
- data/lib/renee/core/matcher.rb +0 -61
- data/lib/renee/core/request_context.rb +0 -56
- data/lib/renee/core/response.rb +0 -78
- data/test/renee-core/env_accessors_test.rb +0 -43
- data/test/renee-core/test_helper.rb +0 -4
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renee-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.0.
|
4
|
+
version: 0.4.0.pre2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,33 +11,33 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-
|
14
|
+
date: 2012-03-04 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rack
|
18
|
-
requirement: &
|
18
|
+
requirement: &70163827844980 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
|
-
- -
|
21
|
+
- - ! '>='
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 1.3.0
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *70163827844980
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
|
-
requirement: &
|
29
|
+
requirement: &70163827844260 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 2.
|
34
|
+
version: 2.11.1
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *70163827844260
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: bundler
|
40
|
-
requirement: &
|
40
|
+
requirement: &70163827843620 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
@@ -45,10 +45,10 @@ dependencies:
|
|
45
45
|
version: '0'
|
46
46
|
type: :development
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *
|
48
|
+
version_requirements: *70163827843620
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: rack-test
|
51
|
-
requirement: &
|
51
|
+
requirement: &70163827842000 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
54
|
- - ! '>='
|
@@ -56,10 +56,10 @@ dependencies:
|
|
56
56
|
version: 0.5.0
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
|
-
version_requirements: *
|
59
|
+
version_requirements: *70163827842000
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
61
|
name: rake
|
62
|
-
requirement: &
|
62
|
+
requirement: &70163827841320 !ruby/object:Gem::Requirement
|
63
63
|
none: false
|
64
64
|
requirements:
|
65
65
|
- - ! '>='
|
@@ -67,7 +67,7 @@ dependencies:
|
|
67
67
|
version: '0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
|
-
version_requirements: *
|
70
|
+
version_requirements: *70163827841320
|
71
71
|
description: The super-friendly rack helpers.
|
72
72
|
email:
|
73
73
|
- joshbuddy@gmail.com
|
@@ -77,27 +77,29 @@ executables: []
|
|
77
77
|
extensions: []
|
78
78
|
extra_rdoc_files: []
|
79
79
|
files:
|
80
|
+
- .gitignore
|
81
|
+
- .travis.yml
|
82
|
+
- Gemfile
|
83
|
+
- MIT-LICENSE.txt
|
84
|
+
- README.md
|
85
|
+
- Rakefile
|
80
86
|
- lib/renee/core.rb
|
81
87
|
- lib/renee/core/chaining.rb
|
82
|
-
- lib/renee/core/env_accessors.rb
|
83
88
|
- lib/renee/core/exceptions.rb
|
84
|
-
- lib/renee/core/matcher.rb
|
85
89
|
- lib/renee/core/plugins.rb
|
86
90
|
- lib/renee/core/rack_interaction.rb
|
87
|
-
- lib/renee/core/request_context.rb
|
88
91
|
- lib/renee/core/responding.rb
|
89
|
-
- lib/renee/core/response.rb
|
90
92
|
- lib/renee/core/routing.rb
|
91
93
|
- lib/renee/core/transform.rb
|
92
|
-
-
|
93
|
-
-
|
94
|
-
- test/
|
95
|
-
- test/
|
96
|
-
- test/
|
97
|
-
- test/
|
98
|
-
- test/
|
99
|
-
- test/renee-core/variable_type_test.rb
|
94
|
+
- lib/renee/core/version.rb
|
95
|
+
- renee-core.gemspec
|
96
|
+
- test/chaining_test.rb
|
97
|
+
- test/include_test.rb
|
98
|
+
- test/request_context_test.rb
|
99
|
+
- test/responding_test.rb
|
100
|
+
- test/routing_test.rb
|
100
101
|
- test/test_helper.rb
|
102
|
+
- test/variable_type_test.rb
|
101
103
|
homepage: http://reneerb.com
|
102
104
|
licenses: []
|
103
105
|
post_install_message:
|
@@ -112,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
112
114
|
version: '0'
|
113
115
|
segments:
|
114
116
|
- 0
|
115
|
-
hash:
|
117
|
+
hash: 1919719039432149420
|
116
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
119
|
none: false
|
118
120
|
requirements:
|
@@ -126,13 +128,11 @@ signing_key:
|
|
126
128
|
specification_version: 3
|
127
129
|
summary: The super-friendly rack helpers
|
128
130
|
test_files:
|
129
|
-
- test/
|
130
|
-
- test/
|
131
|
-
- test/
|
132
|
-
- test/
|
133
|
-
- test/
|
134
|
-
- test/renee-core/routing_test.rb
|
135
|
-
- test/renee-core/test_helper.rb
|
136
|
-
- test/renee-core/variable_type_test.rb
|
131
|
+
- test/chaining_test.rb
|
132
|
+
- test/include_test.rb
|
133
|
+
- test/request_context_test.rb
|
134
|
+
- test/responding_test.rb
|
135
|
+
- test/routing_test.rb
|
137
136
|
- test/test_helper.rb
|
137
|
+
- test/variable_type_test.rb
|
138
138
|
has_rdoc:
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module Renee
|
2
|
-
class Core
|
3
|
-
# Defines class-level methods for creating accessors for variables in your environment.
|
4
|
-
module EnvAccessors
|
5
|
-
|
6
|
-
# Exception for attempting to define an env accessor cannot be written as a method name.
|
7
|
-
# @example
|
8
|
-
# env_accessor "current.user" # raises InvalidEnvNameError
|
9
|
-
# env_accessor "current.user" => :current_user # this works
|
10
|
-
InvalidEnvNameError = Class.new(RuntimeError)
|
11
|
-
|
12
|
-
# Class-methods included by this module.
|
13
|
-
module ClassMethods
|
14
|
-
|
15
|
-
# Defines getters and setters for a list of attributes. If the attributes cannot easily be expressed, use the
|
16
|
-
# hash-syntax for defining them.
|
17
|
-
# @example
|
18
|
-
# env_accessor "some_value" # will define methods to read and write env['some_value']
|
19
|
-
# env_accessor "current.user" => :current_user will define methods to read and write env['current.user']
|
20
|
-
def env_accessor(*attrs)
|
21
|
-
env_reader(*attrs)
|
22
|
-
env_writer(*attrs)
|
23
|
-
end
|
24
|
-
|
25
|
-
# Defines getters for a list of attributes.
|
26
|
-
# @see env_accessor
|
27
|
-
def env_reader(*attrs)
|
28
|
-
instance_eval do
|
29
|
-
env_attr_iter(*attrs) do |key, meth|
|
30
|
-
define_method(meth) do
|
31
|
-
env[key]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# Defines setters for a list of attributes.
|
38
|
-
# @see env_accessor
|
39
|
-
def env_writer(*attrs)
|
40
|
-
instance_eval do
|
41
|
-
env_attr_iter(*attrs) do |key, meth|
|
42
|
-
define_method("#{meth}=") do |val|
|
43
|
-
env[key] = val
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
def env_attr_iter(*attrs)
|
51
|
-
attrs.each do |a|
|
52
|
-
case a
|
53
|
-
when Hash
|
54
|
-
a.each do |k, v|
|
55
|
-
yield k, v
|
56
|
-
end
|
57
|
-
else
|
58
|
-
raise InvalidEnvNameError, "Called env attr for #{a.inspect}, to use this, call your env method like this. env_reader #{a.inspect} => #{a.to_s.gsub(/-\./, '_').to_sym.inspect}" if a.to_s[/[-\.]/]
|
59
|
-
yield a, a.to_sym
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
# @private
|
67
|
-
def self.included(o)
|
68
|
-
o.extend(ClassMethods)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/lib/renee/core/matcher.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
module Renee
|
2
|
-
class Core
|
3
|
-
# Class used for variable matching.
|
4
|
-
class Matcher
|
5
|
-
attr_accessor :name
|
6
|
-
|
7
|
-
# @param [Regexp] matcher The regexp matcher to determine what is part of the variable.
|
8
|
-
def initialize(matcher)
|
9
|
-
@matcher = matcher
|
10
|
-
end
|
11
|
-
|
12
|
-
# Used to specific the error handler if the matcher doesn't match anything. By default, there is no error handler.
|
13
|
-
# @yield The block to be executed it fails to match.
|
14
|
-
def on_error(&blk)
|
15
|
-
@error_handler = blk
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
# Used to transform the value matched.
|
20
|
-
# @yield TODO
|
21
|
-
def on_transform(&blk)
|
22
|
-
@transform_handler = blk
|
23
|
-
self
|
24
|
-
end
|
25
|
-
|
26
|
-
# Convienence method to creating halting error handler.
|
27
|
-
# @param [Symbol, Integer] error_code The HTTP code to halt with.
|
28
|
-
# @see #interpret_response
|
29
|
-
def raise_on_error!(error_code = :bad_request)
|
30
|
-
on_error { halt error_code }
|
31
|
-
self
|
32
|
-
end
|
33
|
-
|
34
|
-
# Matcher for string
|
35
|
-
# @param [String] val The value to attempt to match on.
|
36
|
-
# @raise [ClientError] If the match fails to match and there is an error handler defined.
|
37
|
-
def [](val)
|
38
|
-
match = nil
|
39
|
-
case @matcher
|
40
|
-
when Array
|
41
|
-
match = nil
|
42
|
-
@matcher.find { |m| match = m[val] }
|
43
|
-
else
|
44
|
-
if match = /^#{@matcher.to_s}/.match(val)
|
45
|
-
match = [match[0]]
|
46
|
-
match << @transform_handler.call(match.first) if @transform_handler
|
47
|
-
match
|
48
|
-
end
|
49
|
-
end
|
50
|
-
if match
|
51
|
-
match
|
52
|
-
elsif @error_handler
|
53
|
-
raise ClientError.new("There was an error interpreting the value #{val.inspect} for #{name.inspect}", &@error_handler)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Matcher for Integers
|
59
|
-
IntegerMatcher = Matcher.new(/\d+/).on_transform{|v| Integer(v)}
|
60
|
-
end
|
61
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module Renee
|
2
|
-
class Core
|
3
|
-
module ClassMethods
|
4
|
-
def use(mw, *args, &blk)
|
5
|
-
middlewares << [mw, args, blk]
|
6
|
-
end
|
7
|
-
|
8
|
-
def middlewares
|
9
|
-
@middlewares ||= []
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# This module deals with the Rack#call compilance. It defines #call and also defines several critical methods
|
14
|
-
# used by interaction by other application modules.
|
15
|
-
module RequestContext
|
16
|
-
attr_reader :env, :request, :detected_extension
|
17
|
-
|
18
|
-
# Provides a rack interface compliant call method.
|
19
|
-
# @param[Hash] env The rack environment.
|
20
|
-
def call(e)
|
21
|
-
initialize_plugins
|
22
|
-
idx = 0
|
23
|
-
next_app = proc do |env|
|
24
|
-
if idx == self.class.middlewares.size
|
25
|
-
@env, @request = env, Rack::Request.new(env)
|
26
|
-
@detected_extension = env['PATH_INFO'][/\.([^\.\/]+)$/, 1]
|
27
|
-
# TODO clear template cache in development? `template_cache.clear`
|
28
|
-
out = catch(:halt) do
|
29
|
-
begin
|
30
|
-
self.class.before_blocks.each { |b| instance_eval(&b) }
|
31
|
-
instance_eval(&self.class.application_block)
|
32
|
-
rescue ClientError => e
|
33
|
-
e.response ? instance_eval(&e.response) : halt("There was an error with your request", 400)
|
34
|
-
rescue NotMatchedError => e
|
35
|
-
# unmatched, continue on
|
36
|
-
end
|
37
|
-
Renee::Core::Response.new("Not found", 404).finish
|
38
|
-
end
|
39
|
-
self.class.after_blocks.each { |a| out = instance_exec(out, &a) }
|
40
|
-
out
|
41
|
-
else
|
42
|
-
middleware = self.class.middlewares[idx]
|
43
|
-
idx += 1
|
44
|
-
middleware[0].new(next_app, *middleware[1], &middleware[2]).call(env)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
next_app[e]
|
48
|
-
end # call
|
49
|
-
|
50
|
-
def initialize_plugins
|
51
|
-
self.class.init_blocks.each { |init_block| self.class.class_eval(&init_block) }
|
52
|
-
self.class.send(:define_method, :initialize_plugins) { }
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
data/lib/renee/core/response.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
module Renee
|
2
|
-
class Core
|
3
|
-
# The response object for a Renee request. Inherits from the `Rack#Response` object.
|
4
|
-
class Response < Rack::Response
|
5
|
-
# Augment body to allow strings.
|
6
|
-
#
|
7
|
-
# @param [String] The contents for the response.
|
8
|
-
#
|
9
|
-
# @example
|
10
|
-
# res.body = "Hello"
|
11
|
-
#
|
12
|
-
# @api semipublic
|
13
|
-
def body=(value)
|
14
|
-
value = value.body while Rack::Response === value
|
15
|
-
@body = String === value ? [value.to_str] : value
|
16
|
-
end
|
17
|
-
|
18
|
-
# Alias status and body methods to allow redefinition
|
19
|
-
alias :status_attr :status
|
20
|
-
alias :status_attr= :status=
|
21
|
-
alias :body_attr :body
|
22
|
-
alias :body_attr= :body=
|
23
|
-
|
24
|
-
# Get or set the status of the response.
|
25
|
-
#
|
26
|
-
# @param [String] val The status code to return.
|
27
|
-
#
|
28
|
-
# @example
|
29
|
-
# res.status 400
|
30
|
-
# res.status => 400
|
31
|
-
#
|
32
|
-
# @api public
|
33
|
-
def status(val=nil)
|
34
|
-
val ? self.status_attr = val : self.status_attr
|
35
|
-
end
|
36
|
-
|
37
|
-
# Get or set the body of the response.
|
38
|
-
#
|
39
|
-
# @param [String] val The contents to return.
|
40
|
-
#
|
41
|
-
# @example
|
42
|
-
# res.body "hello"
|
43
|
-
# res.body => "hello"
|
44
|
-
#
|
45
|
-
# @api public
|
46
|
-
def body(val=nil)
|
47
|
-
val ? self.body_attr = val : self.body_attr
|
48
|
-
end
|
49
|
-
|
50
|
-
# Get or set the headers of the response.
|
51
|
-
#
|
52
|
-
# @param [Hash] attrs The contents to return.
|
53
|
-
#
|
54
|
-
# @example
|
55
|
-
# res.headers :foo => "bar"
|
56
|
-
# res.headers => { :foo => "bar" }
|
57
|
-
#
|
58
|
-
# @api public
|
59
|
-
def headers(attrs={})
|
60
|
-
attrs ? attrs.each { |k, v| self[k.to_s] = v } : self.header
|
61
|
-
end
|
62
|
-
|
63
|
-
# Finishs the response based on the accumulated options.
|
64
|
-
# Calculates the size of the body content length and removes headers for 1xx status codes.
|
65
|
-
def finish
|
66
|
-
if status.to_i / 100 == 1
|
67
|
-
headers.delete "Content-Length"
|
68
|
-
headers.delete "Content-Type"
|
69
|
-
elsif Array === body and not [204, 304].include?(status.to_i)
|
70
|
-
headers["Content-Length"] = body.inject(0) { |l, p| l + Rack::Utils.bytesize(p) }.to_s
|
71
|
-
end
|
72
|
-
|
73
|
-
status, headers, result = super
|
74
|
-
[status, headers, result]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
require File.expand_path('../test_helper', __FILE__)
|
4
|
-
|
5
|
-
describe Renee::Core::EnvAccessors do
|
6
|
-
it "should allow accessing the env" do
|
7
|
-
@app = Renee.core {
|
8
|
-
self.test = 'hello'
|
9
|
-
path('test').get do
|
10
|
-
halt "test is #{test}"
|
11
|
-
end
|
12
|
-
}.setup {
|
13
|
-
env_accessor :test
|
14
|
-
}
|
15
|
-
get '/test'
|
16
|
-
assert_equal 200, response.status
|
17
|
-
assert_equal 'test is hello', response.body
|
18
|
-
end
|
19
|
-
|
20
|
-
it "should raise when you try to access weird env keys" do
|
21
|
-
assert_raises(Renee::Core::EnvAccessors::InvalidEnvNameError) {
|
22
|
-
@app = Renee.core {
|
23
|
-
self.test_test = 'hello'
|
24
|
-
}.setup {
|
25
|
-
env_accessor "test.test"
|
26
|
-
}
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should allow weird env keys if you map them" do
|
31
|
-
@app = Renee.core {
|
32
|
-
self.test_test = 'hello'
|
33
|
-
path('test').get do
|
34
|
-
halt "test is #{test_test}"
|
35
|
-
end
|
36
|
-
}.setup {
|
37
|
-
env_accessor "test.test" => :test_test
|
38
|
-
}
|
39
|
-
get '/test'
|
40
|
-
assert_equal 200, response.status
|
41
|
-
assert_equal 'test is hello', response.body
|
42
|
-
end
|
43
|
-
end
|