roy 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +3 -0
- data/README.md +10 -9
- data/lib/roy.rb +10 -6
- data/lib/roy/after.rb +10 -0
- data/lib/roy/before.rb +8 -0
- data/lib/roy/plugins.rb +10 -0
- data/lib/roy/render.rb +15 -0
- data/lib/roy/version.rb +1 -1
- data/roy.gemspec +3 -2
- data/test/after_test.rb +31 -0
- data/test/base_test.rb +9 -3
- data/test/before_test.rb +31 -0
- data/test/custom_options_test.rb +20 -0
- data/test/plugins_test.rb +37 -0
- data/test/prefix_test.rb +2 -2
- data/test/render_test.rb +75 -0
- metadata +41 -5
data/Gemfile.lock
CHANGED
@@ -2,6 +2,7 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
roy (0.0.1)
|
5
|
+
rack
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: http://rubygems.org/
|
@@ -10,6 +11,7 @@ GEM
|
|
10
11
|
rack (1.3.4)
|
11
12
|
rack-test (0.6.1)
|
12
13
|
rack (>= 1.0)
|
14
|
+
tilt (1.3.3)
|
13
15
|
|
14
16
|
PLATFORMS
|
15
17
|
ruby
|
@@ -18,3 +20,4 @@ DEPENDENCIES
|
|
18
20
|
minitest
|
19
21
|
rack-test
|
20
22
|
roy!
|
23
|
+
tilt
|
data/README.md
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
Roy
|
2
2
|
===
|
3
3
|
|
4
|
-
Roy is a tiny module that aims to make any Ruby object Rack-friendly and
|
5
|
-
it with a REST-like interface.
|
4
|
+
Roy is a tiny module that aims to make any Ruby object Rack-friendly and
|
5
|
+
provides it with a REST-like interface.
|
6
6
|
|
7
|
-
Roy tries to be as less invasive as possible.
|
7
|
+
Roy tries to be as less invasive as possible. It provides your objects with a
|
8
8
|
`#call` method that takes a Rack environment and dispatchs to a regular method
|
9
9
|
named after the HTTP method you want to catch.
|
10
10
|
|
11
11
|
## Tests
|
12
12
|
|
13
|
-
You can
|
13
|
+
You can execute the tests by running `rake test`. They are written with
|
14
|
+
Minitest.
|
14
15
|
|
15
16
|
## Example
|
16
17
|
|
@@ -44,20 +45,20 @@ end
|
|
44
45
|
|
45
46
|
### Configuration
|
46
47
|
|
47
|
-
The `roy` class method is used to define access control and method
|
48
|
-
following example should be
|
48
|
+
The `roy` class method is mainly used to define access control and method
|
49
|
+
prefix. You can also define your own options. The following example should be
|
50
|
+
self-explanatory enough:
|
49
51
|
|
50
52
|
``` ruby
|
51
53
|
class Example
|
52
54
|
include Roy
|
53
|
-
roy allow: [:get], prefix: :http_
|
55
|
+
roy allow: [:get], prefix: :http_, foo: "bar"
|
54
56
|
|
55
57
|
def http_get(*args)
|
56
|
-
"
|
58
|
+
"foo is #{roy.conf.foo}"
|
57
59
|
end
|
58
60
|
end
|
59
61
|
```
|
60
|
-
|
61
62
|
### Environement
|
62
63
|
|
63
64
|
Inside your handler methods, you have access to a `roy` readable attribute which
|
data/lib/roy.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'set'
|
2
2
|
require 'rack'
|
3
|
+
require 'ostruct'
|
3
4
|
require 'roy/version'
|
4
5
|
|
5
6
|
module Roy
|
@@ -9,10 +10,14 @@ module Roy
|
|
9
10
|
base.send(:extend, ClassMethods)
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
+
def roy
|
14
|
+
@roy ||= Env.new.tap {|e|
|
15
|
+
e.conf = self.class.conf
|
16
|
+
}
|
17
|
+
end
|
13
18
|
|
14
19
|
def call(env)
|
15
|
-
|
20
|
+
roy.tap { |e|
|
16
21
|
e.env = env
|
17
22
|
e.request = Rack::Request.new(env)
|
18
23
|
e.response = Rack::Response.new
|
@@ -21,7 +26,6 @@ module Roy
|
|
21
26
|
e.params.default_proc = proc do |hash, key|
|
22
27
|
hash[key.to_s] if Symbol === key
|
23
28
|
end
|
24
|
-
e.conf = self.class.conf
|
25
29
|
}
|
26
30
|
|
27
31
|
method = roy.env['REQUEST_METHOD'].downcase.to_sym
|
@@ -49,9 +53,7 @@ module Roy
|
|
49
53
|
attr_reader :conf
|
50
54
|
|
51
55
|
def roy(options={})
|
52
|
-
@conf
|
53
|
-
conf.allow ||= Set.new
|
54
|
-
conf.prefix ||= :''
|
56
|
+
@conf ||= OpenStruct.new(allow: Set.new, prefix: :'')
|
55
57
|
|
56
58
|
options.each do |k,v|
|
57
59
|
case k
|
@@ -60,6 +62,8 @@ module Roy
|
|
60
62
|
conf.allow.add(:head) if v.member?(:get)
|
61
63
|
when :prefix
|
62
64
|
conf.prefix = v
|
65
|
+
else
|
66
|
+
conf.send(:"#{k}=", v)
|
63
67
|
end
|
64
68
|
end
|
65
69
|
end
|
data/lib/roy/after.rb
ADDED
data/lib/roy/before.rb
ADDED
data/lib/roy/plugins.rb
ADDED
data/lib/roy/render.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Roy
|
4
|
+
module Render
|
5
|
+
def render(engine, template_or_string, params={}, &block)
|
6
|
+
case template_or_string
|
7
|
+
when Symbol
|
8
|
+
else
|
9
|
+
Tilt[engine].new {
|
10
|
+
template_or_string.to_s
|
11
|
+
}.render(self, params, &block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/roy/version.rb
CHANGED
data/roy.gemspec
CHANGED
@@ -20,8 +20,9 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
|
23
|
-
|
23
|
+
s.add_dependency "rack"
|
24
|
+
|
24
25
|
s.add_development_dependency "minitest"
|
25
26
|
s.add_development_dependency "rack-test"
|
26
|
-
|
27
|
+
s.add_development_dependency "tilt"
|
27
28
|
end
|
data/test/after_test.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'roy/after'
|
3
|
+
|
4
|
+
class AfterTestObject
|
5
|
+
include Roy
|
6
|
+
include Roy::After
|
7
|
+
|
8
|
+
roy allow: [:get],
|
9
|
+
after: lambda { |response|
|
10
|
+
response.header['Content-Type'] = 'text/plain'
|
11
|
+
}
|
12
|
+
|
13
|
+
def get(*args)
|
14
|
+
'success'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class AfterTest < MiniTest::Unit::TestCase
|
19
|
+
include Rack::Test::Methods
|
20
|
+
|
21
|
+
def app
|
22
|
+
AfterTestObject.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_after_filter
|
26
|
+
get '/'
|
27
|
+
ok!
|
28
|
+
assert_equal 'text/plain', last_response.header['Content-Type']
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/test/base_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class BaseTestObject
|
4
4
|
include Roy
|
5
5
|
|
6
6
|
attr_reader :history
|
@@ -27,11 +27,11 @@ class RemoteLog
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
class
|
30
|
+
class BaseTest < MiniTest::Unit::TestCase
|
31
31
|
include Rack::Test::Methods
|
32
32
|
|
33
33
|
def app
|
34
|
-
|
34
|
+
BaseTestObject.new
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_provide_call
|
@@ -42,6 +42,12 @@ class RoyTest < MiniTest::Unit::TestCase
|
|
42
42
|
assert_respond_to app.class, :roy
|
43
43
|
end
|
44
44
|
|
45
|
+
def test_defines_roy_attribute_with_defaults
|
46
|
+
assert_respond_to app, :roy
|
47
|
+
assert_equal :'', app.roy.conf.prefix
|
48
|
+
assert_instance_of Set, app.roy.conf.allow
|
49
|
+
end
|
50
|
+
|
45
51
|
def test_forward_allowed_methods
|
46
52
|
get '/'
|
47
53
|
ok!
|
data/test/before_test.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'roy/before'
|
3
|
+
|
4
|
+
class BeforeTestObject
|
5
|
+
include Roy
|
6
|
+
include Roy::Before
|
7
|
+
|
8
|
+
roy allow: [:get],
|
9
|
+
before: lambda { |env|
|
10
|
+
env['REQUEST_METHOD'] = 'GET'
|
11
|
+
}
|
12
|
+
|
13
|
+
def get(*args)
|
14
|
+
'success'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class BeforeTest < MiniTest::Unit::TestCase
|
19
|
+
include Rack::Test::Methods
|
20
|
+
|
21
|
+
def app
|
22
|
+
BeforeTestObject.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_before_filter
|
26
|
+
post '/'
|
27
|
+
ok!
|
28
|
+
assert_equal 'success', last_response.body
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
require_relative 'helper'
|
3
|
+
|
4
|
+
class CustomOptionsTestObject
|
5
|
+
include Roy
|
6
|
+
|
7
|
+
roy foo: :bar
|
8
|
+
end
|
9
|
+
|
10
|
+
class CustomOptionsTest < MiniTest::Unit::TestCase
|
11
|
+
include Rack::Test::Methods
|
12
|
+
|
13
|
+
def app
|
14
|
+
CustomOptionsTestObject.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_custom_options
|
18
|
+
assert_equal :bar, app.class.conf.foo
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'roy/plugins'
|
3
|
+
require 'roy/before'
|
4
|
+
require 'roy/after'
|
5
|
+
|
6
|
+
class PluginsTestObject
|
7
|
+
include Roy
|
8
|
+
include Roy::Plugins(Before, After)
|
9
|
+
|
10
|
+
roy allow: [:get],
|
11
|
+
before: lambda { |env|
|
12
|
+
env['REQUEST_METHOD'] = 'GET'
|
13
|
+
},
|
14
|
+
after: lambda { |response|
|
15
|
+
response.header['Content-Type'] = 'text/plain'
|
16
|
+
}
|
17
|
+
|
18
|
+
def get(*args)
|
19
|
+
'success'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class PluginsTest < MiniTest::Unit::TestCase
|
24
|
+
include Rack::Test::Methods
|
25
|
+
|
26
|
+
def app
|
27
|
+
PluginsTestObject.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_plugins_are_loaded
|
31
|
+
get '/'
|
32
|
+
ok!
|
33
|
+
assert_equal 'text/plain', last_response.header['Content-Type']
|
34
|
+
assert_equal 'success', last_response.body
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/test/prefix_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class PrefixTestObject
|
4
4
|
include Roy
|
5
5
|
|
6
6
|
roy allow: [:get], prefix: :http_
|
@@ -14,7 +14,7 @@ class PrefixTest < MiniTest::Unit::TestCase
|
|
14
14
|
include Rack::Test::Methods
|
15
15
|
|
16
16
|
def app
|
17
|
-
|
17
|
+
PrefixTestObject.new
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_prefixing
|
data/test/render_test.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'roy/render'
|
3
|
+
|
4
|
+
Templates = {
|
5
|
+
simple: %q(<%= "Hello world!" %>),
|
6
|
+
locals: %q(<%= "Hello #{person}" %>),
|
7
|
+
scope: %q(<%= roy.conf.inspect %>),
|
8
|
+
yield: %q(<%= yield %>)
|
9
|
+
}
|
10
|
+
|
11
|
+
class RenderTestObject
|
12
|
+
include Roy
|
13
|
+
include Roy::Render
|
14
|
+
|
15
|
+
roy allow: [:get]
|
16
|
+
|
17
|
+
def get(*args)
|
18
|
+
case args.first
|
19
|
+
when 'template'
|
20
|
+
halt 403
|
21
|
+
when 'inline'
|
22
|
+
render :erb, Templates[:simple]
|
23
|
+
when 'locals'
|
24
|
+
render :erb, Templates[:locals], person: 'Bob'
|
25
|
+
when 'scope'
|
26
|
+
render :erb, Templates[:scope]
|
27
|
+
when 'yield'
|
28
|
+
render :erb, Templates[:yield] do
|
29
|
+
render :erb, Templates[:simple]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class RenderTest < MiniTest::Unit::TestCase
|
36
|
+
include Rack::Test::Methods
|
37
|
+
|
38
|
+
def app
|
39
|
+
RenderTestObject.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def inline(tid, params={}, &block)
|
43
|
+
Tilt[:erb].new { Templates[tid] }.render(app, params, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_render_file_template
|
47
|
+
get '/template'
|
48
|
+
fail!
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_render_inline_template
|
52
|
+
get '/inline'
|
53
|
+
ok!
|
54
|
+
assert_equal inline(:simple), last_response.body
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_render_inline_template_with_locals
|
58
|
+
get '/locals'
|
59
|
+
ok!
|
60
|
+
assert_equal inline(:locals, person: 'Bob'), last_response.body
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_render_inline_scope
|
64
|
+
get '/scope'
|
65
|
+
ok!
|
66
|
+
assert_equal inline(:scope), last_response.body
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_render_with_block
|
70
|
+
get '/yield'
|
71
|
+
ok!
|
72
|
+
assert_equal inline(:simple), last_response.body
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: roy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0
|
5
|
+
version: 0.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- madx
|
@@ -10,10 +10,10 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-10-
|
13
|
+
date: 2011-10-23 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: rack
|
17
17
|
prerelease: false
|
18
18
|
requirement: &id001 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: "0"
|
24
|
-
type: :
|
24
|
+
type: :runtime
|
25
25
|
version_requirements: *id001
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
|
-
name:
|
27
|
+
name: minitest
|
28
28
|
prerelease: false
|
29
29
|
requirement: &id002 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
@@ -34,6 +34,28 @@ dependencies:
|
|
34
34
|
version: "0"
|
35
35
|
type: :development
|
36
36
|
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rack-test
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: tilt
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
type: :development
|
58
|
+
version_requirements: *id004
|
37
59
|
description: |-
|
38
60
|
roy is a small library which allows every Ruby object to be used
|
39
61
|
as a Rack application.
|
@@ -52,11 +74,20 @@ files:
|
|
52
74
|
- README.md
|
53
75
|
- Rakefile
|
54
76
|
- lib/roy.rb
|
77
|
+
- lib/roy/after.rb
|
78
|
+
- lib/roy/before.rb
|
79
|
+
- lib/roy/plugins.rb
|
80
|
+
- lib/roy/render.rb
|
55
81
|
- lib/roy/version.rb
|
56
82
|
- roy.gemspec
|
83
|
+
- test/after_test.rb
|
57
84
|
- test/base_test.rb
|
85
|
+
- test/before_test.rb
|
86
|
+
- test/custom_options_test.rb
|
58
87
|
- test/helper.rb
|
88
|
+
- test/plugins_test.rb
|
59
89
|
- test/prefix_test.rb
|
90
|
+
- test/render_test.rb
|
60
91
|
homepage: https://github.com/madx/roy
|
61
92
|
licenses: []
|
62
93
|
|
@@ -85,6 +116,11 @@ signing_key:
|
|
85
116
|
specification_version: 3
|
86
117
|
summary: make your objects REST-friendly
|
87
118
|
test_files:
|
119
|
+
- test/after_test.rb
|
88
120
|
- test/base_test.rb
|
121
|
+
- test/before_test.rb
|
122
|
+
- test/custom_options_test.rb
|
89
123
|
- test/helper.rb
|
124
|
+
- test/plugins_test.rb
|
90
125
|
- test/prefix_test.rb
|
126
|
+
- test/render_test.rb
|