roy 0.0.1 → 0.1.0

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/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