sinatra-extension 0.4.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/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ copyright (c) 2010 Konstantin Haase. All rights reserved.
2
+
3
+ Developed by: Konstantin Haase
4
+ http://github.com/rkh/big_band
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to
8
+ deal with the Software without restriction, including without limitation the
9
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ sell copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+ 1. Redistributions of source code must retain the above copyright notice,
13
+ this list of conditions and the following disclaimers.
14
+ 2. Redistributions in binary form must reproduce the above copyright
15
+ notice, this list of conditions and the following disclaimers in the
16
+ documentation and/or other materials provided with the distribution.
17
+ 3. Neither the name of Konstantin Haase, nor the names of other contributors
18
+ may be used to endorse or promote products derived from this Software without
19
+ specific prior written permission.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
27
+ WITH THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ Sinatra::Extension
2
+ ==================
3
+
4
+ Mixin to ease [Sinatra](http://sinatrarb.com) extension development.
5
+
6
+ BigBand
7
+ -------
8
+
9
+ Sinatra::Extension is part of the [BigBand](http://github.com/rkh/big_band) stack.
10
+ Check it out if you are looking for other fancy Sinatra extensions.
11
+
12
+ Installation
13
+ ------------
14
+
15
+ gem install sinatra-extension
16
+
17
+ Example
18
+ -------
19
+
20
+ module MyFancyExtension
21
+ extend Sinatra::Extension
22
+
23
+ enable :session
24
+
25
+ get '/foo' do
26
+ "bar"
27
+ end
28
+
29
+ enabled :fancy_mode do
30
+ use VeryFancyMiddleware
31
+ get '/fancy' do
32
+ "fancy!"
33
+ end
34
+ end
35
+ end
36
+
37
+ class MyApp < Sinatra::Base
38
+ register MyFancyExtension
39
+ enable :fancy_mode
40
+ end
@@ -0,0 +1,77 @@
1
+ require 'sinatra/base'
2
+ require 'sinatra/sugar'
3
+ require 'monkey-lib'
4
+
5
+ module Sinatra
6
+ module Delegator
7
+ def self.delegate(*methods)
8
+ methods.each do |method_name|
9
+ eval <<-RUBY, binding, '(__DELEGATE__)', 1
10
+ def #{method_name}(*args, &b) sinatra_application.send(#{method_name.inspect}, *args, &b) end
11
+ private #{method_name.inspect}
12
+ RUBY
13
+ end
14
+ end
15
+
16
+ delegate(*private_instance_methods(false))
17
+
18
+ def sinatra_application
19
+ ::Sinatra::Application
20
+ end
21
+ end
22
+
23
+ module Extension
24
+ BasicObject = Object unless defined? BasicObject
25
+ class MethodRecorder < BasicObject
26
+ def initialize(list) @calls = list end
27
+ def method_missing(*a, &b) @calls << [a, b] end
28
+ end
29
+
30
+ include Delegator
31
+
32
+ def method_calls
33
+ @method_calls ||= []
34
+ end
35
+
36
+ def register_hooks
37
+ @register_hooks ||= []
38
+ end
39
+
40
+ def on_register(&block)
41
+ register_hooks << block
42
+ end
43
+
44
+ def enabled(option, &block)
45
+ mod = Module.new
46
+ mod.extend Sinatra::Extension
47
+ define_method(option) { nil }
48
+ define_method("#{option}?") { false }
49
+ define_method("#{option}=") do |value|
50
+ metadef(option) { value }
51
+ return value unless value
52
+ metadef("#{option}?") { true }
53
+ instance_yield block
54
+ end
55
+ end
56
+
57
+ def register(*extensions)
58
+ on_register { register(*extensions) }
59
+ end
60
+
61
+ def configure(*args, &block)
62
+ on_register do
63
+ configure(*args) { |klass| klass.instance_yield block }
64
+ end
65
+ end
66
+
67
+ def registered(klass)
68
+ register Sinatra::Sugar
69
+ method_calls.each { |a,b| klass.__send__(*a, &b) }
70
+ register_hooks.each { |hook| klass.instance_yield hook }
71
+ end
72
+
73
+ def sinatra_application
74
+ @sinatra_application ||= MethodRecorder.new method_calls
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path("../../spec_helper", __FILE__)
2
+
3
+ module Sinatra
4
+ module OtherExtension
5
+ end
6
+
7
+ module ExampleExtension
8
+ extend Sinatra::Extension
9
+ register OtherExtension
10
+
11
+ %w[get put post delete].each { |verb| __send__(verb, '/foo') { 'bar' } }
12
+
13
+ configure(:test) { set :foo, 42 }
14
+ configure(:development) { set :foo, 'oh no' }
15
+
16
+ on_register do
17
+ set :bar,:blah
18
+ end
19
+
20
+ helpers do
21
+ def foo(value) value end
22
+ end
23
+
24
+ enabled :special_foo do
25
+ helpers do
26
+ def foo(value) 42 end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ describe Sinatra::Extension do
33
+ before { app :ExampleExtension }
34
+ it_should_behave_like 'sinatra'
35
+
36
+ it 'should forward register correctly' do
37
+ app.should be_a(Sinatra::OtherExtension)
38
+ end
39
+
40
+ %w[head get put post delete].each do |verb|
41
+ it "should forward #{verb} correctly" do
42
+ browse_route(verb, '/foo').should be_ok
43
+ last_response.body.should == 'bar' unless verb == 'head'
44
+ end
45
+ end
46
+
47
+ it "should forward configure correctly" do
48
+ app.should be_test # just to be sure
49
+ app.foo.should == 42
50
+ end
51
+
52
+ it "should trigger on_register" do
53
+ app.bar.should == :blah
54
+ end
55
+
56
+ it "should forward helpers correctly" do
57
+ app.new.foo(10).should == 10
58
+ end
59
+
60
+ it "should apply enabled blocks only if given option has been enabled" do
61
+ app.should_not be_special_foo
62
+ app.special_foo.should be_nil
63
+ app.new.foo(10).should == 10
64
+ app.enable :special_foo
65
+ app.should be_special_foo
66
+ app.new.foo(10).should == 42
67
+ end
68
+ end
@@ -0,0 +1,2 @@
1
+ require "sinatra/rspec/shared"
2
+ require "sinatra/extension"
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra-extension
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
+ platform: ruby
12
+ authors:
13
+ - Konstantin Haase
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-06-07 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: monkey-lib
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 15
30
+ segments:
31
+ - 0
32
+ - 4
33
+ - 0
34
+ version: 0.4.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: sinatra-sugar
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 15
46
+ segments:
47
+ - 0
48
+ - 4
49
+ - 0
50
+ version: 0.4.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: sinatra-test-helper
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 15
62
+ segments:
63
+ - 0
64
+ - 4
65
+ - 0
66
+ version: 0.4.0
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: sinatra
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ hash: 15
78
+ segments:
79
+ - 1
80
+ - 0
81
+ version: "1.0"
82
+ type: :runtime
83
+ version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 27
93
+ segments:
94
+ - 1
95
+ - 3
96
+ - 0
97
+ version: 1.3.0
98
+ type: :development
99
+ version_requirements: *id005
100
+ description: Mixin to ease Sinatra extension development (part of BigBand).
101
+ email: konstantin.mailinglists@googlemail.com
102
+ executables: []
103
+
104
+ extensions: []
105
+
106
+ extra_rdoc_files: []
107
+
108
+ files:
109
+ - lib/sinatra/extension.rb
110
+ - spec/sinatra/extension_spec.rb
111
+ - spec/spec_helper.rb
112
+ - README.md
113
+ - LICENSE
114
+ has_rdoc: yard
115
+ homepage: http://github.com/rkh/sinatra-extension
116
+ licenses: []
117
+
118
+ post_install_message:
119
+ rdoc_options: []
120
+
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ hash: 3
138
+ segments:
139
+ - 0
140
+ version: "0"
141
+ requirements: []
142
+
143
+ rubyforge_project:
144
+ rubygems_version: 1.3.7
145
+ signing_key:
146
+ specification_version: 3
147
+ summary: Mixin to ease Sinatra extension development (part of BigBand).
148
+ test_files: []
149
+