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 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 provite
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. In provides your objects with a
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 run the tests by running `rake test`. They are written with Minitest.
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 prefix. The
48
- following example should be self-explanatory enough:
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
- "get"
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
- attr_reader :roy
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
- @roy = Env.new.tap { |e|
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 ||= Struct.new(:allow, :prefix).new
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
@@ -0,0 +1,10 @@
1
+ module Roy
2
+ module After
3
+ def call(env)
4
+ status, header, body = super
5
+ resp = Rack::Response.new(body, status, header)
6
+ (roy.conf.after || lambda {|x| x }).(resp)
7
+ resp.finish
8
+ end
9
+ end
10
+ end
data/lib/roy/before.rb ADDED
@@ -0,0 +1,8 @@
1
+ module Roy
2
+ module Before
3
+ def call(env)
4
+ (roy.conf.before || lambda {|x| x }).(env)
5
+ super
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Roy
2
+ def self.Plugins(*names)
3
+ return Module.new.tap do |mod|
4
+ names.each do |name|
5
+ mod.send(:include, name)
6
+ end
7
+ end
8
+ end
9
+ end
10
+
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
@@ -1,3 +1,3 @@
1
1
  module Roy
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
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
- # specify any dependencies here; for example:
23
+ s.add_dependency "rack"
24
+
24
25
  s.add_development_dependency "minitest"
25
26
  s.add_development_dependency "rack-test"
26
- # s.add_runtime_dependency "rest-client"
27
+ s.add_development_dependency "tilt"
27
28
  end
@@ -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 RemoteLog
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 RoyTest < MiniTest::Unit::TestCase
30
+ class BaseTest < MiniTest::Unit::TestCase
31
31
  include Rack::Test::Methods
32
32
 
33
33
  def app
34
- RemoteLog.new
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!
@@ -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 TestObject
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
- TestObject.new
17
+ PrefixTestObject.new
18
18
  end
19
19
 
20
20
  def test_prefixing
@@ -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.1
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-19 00:00:00 Z
13
+ date: 2011-10-23 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: minitest
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: :development
24
+ type: :runtime
25
25
  version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
27
- name: rack-test
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