pakada 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,272 @@
1
+ require "spec_helper"
2
+
3
+ describe Pakada do
4
+ subject { Pakada.instance }
5
+
6
+ it "is a hooking container" do
7
+ Pakada.should respond_to(:hookable)
8
+ Pakada.should respond_to(:hook)
9
+ Pakada.instance.should respond_to(:hooked=)
10
+ end
11
+
12
+ it "forwards all messages to the Singleton instance" do
13
+ Pakada.instance.should_receive(:message)
14
+ Pakada.message
15
+
16
+ proc { Pakada.other_message }.should raise_error(NoMethodError, /`other_message'/)
17
+ end
18
+
19
+ it "forwards .respond_to? to the Singleton instance" do
20
+ Pakada.instance.should_receive(:respond_to?).with(:message) { true }
21
+ Pakada.respond_to?(:message).should be_true
22
+
23
+ Pakada.instance.should_not_receive(:respond_to?).with(:instance)
24
+ Pakada.respond_to?(:instance)
25
+ end
26
+
27
+ describe "::DEFAULT_APP" do
28
+ it "prints a tender welcome greeting" do
29
+ Pakada::DEFAULT_APP.call({})[2].to_a.to_s.should =~ /Pakada #{Pakada::VERSION}/
30
+ end
31
+ end
32
+
33
+ describe ".instance" do
34
+ it "creates a new Singleton instance and returns it" do
35
+ Pakada.stub(:new) { double "a Pakada instance" }
36
+ Pakada.instance.should == Pakada.instance
37
+ end
38
+ end
39
+
40
+ describe ".reset_instance" do
41
+ it "unsets the Singleton instance" do
42
+ instance = Pakada.instance
43
+ Pakada.reset_instance
44
+ Pakada.instance.should_not == instance
45
+ end
46
+ end
47
+
48
+ describe ".boot" do
49
+ def stub_load_methods
50
+ subject.stub :load_env
51
+ subject.stub :load_modules
52
+ subject.stub :load_hooks
53
+ subject.stub(:hooks) { double "hooks", :invoke => 123 }
54
+ end
55
+
56
+ it "calls .load_env" do
57
+ stub_load_methods
58
+ subject.should_receive :load_env
59
+ subject.boot
60
+ end
61
+
62
+ it "calls .load_modules" do
63
+ stub_load_methods
64
+ subject.should_receive :load_modules
65
+ subject.boot
66
+ end
67
+
68
+ it "calls .load_hooks" do
69
+ stub_load_methods
70
+ subject.should_receive :load_hooks
71
+ subject.boot
72
+ end
73
+
74
+ it "invokes the :boot hookable" do
75
+ stub_load_methods
76
+ obj = Object.new
77
+ subject.stub(:hooks) { obj }
78
+ subject.hooks.should_receive(:invoke).with(:boot)
79
+ subject.boot
80
+ end
81
+
82
+ it "doesn't invoke the :boot hookable in testing environment" do
83
+ stub_load_methods
84
+ subject.stub(:env) { :testing }
85
+ obj = Object.new
86
+ subject.stub(:hooks) { obj }
87
+ subject.hooks.should_not_receive(:invoke).with(:boot)
88
+ subject.boot
89
+ end
90
+ end
91
+
92
+ describe ".hookable(:boot)" do
93
+ it "does nothing" do; end
94
+ end
95
+
96
+ describe ".load_env" do
97
+ before :each do
98
+ @env = ENV["RACK_ENV"]
99
+ end
100
+
101
+ after :each do
102
+ ENV["RACK_ENV"] = @env
103
+ end
104
+
105
+ it "uses RACK_ENV to determine the runtime environment" do
106
+ ENV["RACK_ENV"] = "something"
107
+ subject.load_env
108
+ subject.env.should == :something
109
+ end
110
+
111
+ it "is uses 'development' as the default environment" do
112
+ ENV.delete "RACK_ENV"
113
+ subject.load_env
114
+ subject.env.should == :development
115
+ end
116
+ end
117
+
118
+ describe ".load_modules!" do
119
+ it "loads the modules" do
120
+ mod = double "module"
121
+ modcls = double "module class", :module_name => :foo
122
+ modcls.should_receive(:new) { mod }
123
+ Pakada::Module.stub(:descendants) { {:foo => modcls} }
124
+
125
+ subject.load_modules
126
+ subject.modules[:foo].should == mod
127
+ end
128
+ end
129
+
130
+ describe ".load_hooks" do
131
+ it "initializes the hooking controller" do
132
+ subject.stub(:modules) { {} }
133
+ subject.load_hooks
134
+ subject.hooks.should respond_to(:invoke)
135
+ end
136
+
137
+ it "adds itself to the hooking controller" do
138
+ subject.stub(:modules) { {} }
139
+ subject.load_hooks
140
+ subject.hooks.should have(1).containers
141
+ subject.hooks.containers[0].should == subject
142
+ end
143
+
144
+ it "adds the modules to the hooking controller" do
145
+ modcls = double "module klass", :hookables => [], :hooks => {}
146
+ mod = double "module", :hooked= => nil, :class => modcls
147
+ subject.stub(:modules) { {:foo => mod} }
148
+ subject.load_hooks
149
+ subject.hooks.should have(2).containers
150
+ subject.hooks.containers[1].should == mod
151
+ end
152
+
153
+ it "fails if the modules have not been loaded" do
154
+ subject.stub(:modules) { nil }
155
+ proc { subject.load_hooks }.should raise_error(RuntimeError, "modules have not been loaded")
156
+ end
157
+ end
158
+
159
+ describe ".development?" do
160
+ it "is a shortcut for .env == :development" do
161
+ subject.stub(:env) { :development }
162
+ subject.development?.should be_true
163
+
164
+ subject.stub(:env) { :something }
165
+ subject.development?.should be_false
166
+ end
167
+ end
168
+
169
+ describe ".testing?" do
170
+ it "is a shortcut for .env == :testing" do
171
+ subject.stub(:env) { :testing }
172
+ subject.testing?.should be_true
173
+
174
+ subject.stub(:env) { :something }
175
+ subject.testing?.should be_false
176
+ end
177
+ end
178
+
179
+ describe ".production?" do
180
+ it "is a shortcut for .env == :production" do
181
+ subject.stub(:env) { :production }
182
+ subject.production?.should be_true
183
+
184
+ subject.stub(:env) { :something }
185
+ subject.production?.should be_false
186
+ end
187
+ end
188
+
189
+ describe ".middleware" do
190
+ it "is a simple Array" do
191
+ Array.should === subject.middleware
192
+ end
193
+
194
+ it "is empty initially" do
195
+ subject.middleware.should be_empty
196
+ end
197
+ end
198
+
199
+ describe ".to_app" do
200
+ it "builds a Rack endpoint with .middleware and .handle_request" do
201
+ @builder = Rack::Builder.new
202
+ Rack::Builder.stub(:new) { @builder }
203
+
204
+ mw1 = Class.new do
205
+ attr_reader :app
206
+ def initialize(app); @app = app; end
207
+ end
208
+ mw2 = mw1.clone
209
+ subject.middleware << mw1 << mw2
210
+
211
+ prc = nil
212
+ @builder.should_receive(:use).with(mw1).once
213
+ @builder.should_receive(:use).with(mw2).once
214
+ @builder.should_receive(:run).with(duck_type(:call)).once {|p| prc = p }
215
+ subject.to_app
216
+
217
+ req_env = {"key" => "value"}
218
+ res = [200, {}, ""]
219
+ subject.should_receive(:handle_request).with(req_env) {|r_e| res }
220
+ prc.call(req_env).should == res
221
+ end
222
+ end
223
+
224
+ describe ".call" do
225
+ it "forwards to .to_app.call" do
226
+ req = {"key" => "value"}
227
+ resp = Rack::Response.new("hello!").finish
228
+ app = double "app"
229
+ subject.should_receive(:to_app) { app }
230
+ app.should_receive(:call).with(req) { resp }
231
+ subject.call(req).should == resp
232
+ end
233
+ end
234
+
235
+ describe ".handle_request" do
236
+ it "invokes the :request hookable" do
237
+ req = Rack::Request.new "key" => "value"
238
+ Rack::Request.stub(:new).with(req.env) { req }
239
+ res = Rack::Response.new
240
+ subject.boot
241
+ subject.hooks.should_receive(:invoke).with(:request, req) {|r_e| res }
242
+ subject.handle_request(req.env).should == res.finish
243
+ end
244
+ end
245
+
246
+ describe ".hookable(:request)" do
247
+ before :each do
248
+ subject.boot
249
+ @req = Rack::Request.new "key" => "value"
250
+ @resp = Rack::Response.new("foo!", 201)
251
+ end
252
+
253
+ it "calls .app's return value with the request environment" do
254
+ subject.app = stub "app"
255
+ subject.app.should_receive(:call).with(@req.env) { @resp.finish }
256
+ subject.hooks.invoke(:request, @req)
257
+ end
258
+
259
+ it "calls DEFAULT_APP if .app isn't set" do
260
+ Pakada::DEFAULT_APP.should_receive(:call).with(@req.env) { @resp.finish }
261
+ subject.hooks.invoke(:request, @req)
262
+ end
263
+
264
+ it "returns a Rack-compliant response" do
265
+ Pakada.app = stub "app", :call => @resp.finish
266
+ resp = subject.hooks.invoke(:request, @req)
267
+ resp.status.should == @resp.status
268
+ resp.headers.should == @resp.headers
269
+ resp.body.to_s.should == @resp.body.to_s
270
+ end
271
+ end
272
+ end
@@ -0,0 +1,15 @@
1
+ require "bundler"
2
+ Bundler.setup :default, :development
3
+
4
+ require "pakada"
5
+
6
+ require "fakefs/safe"
7
+ require "fakefs/require"
8
+
9
+ begin
10
+ require "awesome_print"
11
+ rescue LoadError; end
12
+
13
+ RSpec.configure do |config|
14
+ config.before(:each) { Pakada.reset_instance }
15
+ end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pakada
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 0
9
- - 0
10
- version: 0.0.0
8
+ - 1
9
+ version: 0.0.1
11
10
  platform: ruby
12
11
  authors:
13
12
  - Lars Gierth
@@ -15,96 +14,101 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-12-19 00:00:00 +01:00
17
+ date: 2010-12-28 00:00:00 +01:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- name: bundler
23
- prerelease: false
21
+ name: rack
24
22
  requirement: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
27
- - - ">="
25
+ - - ~>
28
26
  - !ruby/object:Gem::Version
29
- hash: 3
30
27
  segments:
31
- - 0
32
- version: "0"
28
+ - 1
29
+ - 2
30
+ - 1
31
+ version: 1.2.1
33
32
  type: :runtime
33
+ prerelease: false
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: extlib
37
- prerelease: false
36
+ name: hooked
38
37
  requirement: &id002 !ruby/object:Gem::Requirement
39
38
  none: false
40
39
  requirements:
41
- - - ">="
40
+ - - ~>
42
41
  - !ruby/object:Gem::Version
43
- hash: 3
44
42
  segments:
45
43
  - 0
46
- version: "0"
44
+ - 1
45
+ - 0
46
+ version: 0.1.0
47
47
  type: :runtime
48
+ prerelease: false
48
49
  version_requirements: *id002
49
50
  - !ruby/object:Gem::Dependency
50
- name: rack
51
- prerelease: false
51
+ name: rspec
52
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
- - - ">="
55
+ - - ~>
56
56
  - !ruby/object:Gem::Version
57
- hash: 3
58
57
  segments:
59
- - 0
60
- version: "0"
61
- type: :runtime
58
+ - 2
59
+ - 3
60
+ version: "2.3"
61
+ type: :development
62
+ prerelease: false
62
63
  version_requirements: *id003
63
64
  - !ruby/object:Gem::Dependency
64
65
  name: mocha
65
- prerelease: false
66
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
67
  none: false
68
68
  requirements:
69
- - - ">="
69
+ - - ~>
70
70
  - !ruby/object:Gem::Version
71
- hash: 3
72
71
  segments:
73
72
  - 0
74
- version: "0"
73
+ - 9
74
+ - 10
75
+ version: 0.9.10
75
76
  type: :development
77
+ prerelease: false
76
78
  version_requirements: *id004
77
79
  - !ruby/object:Gem::Dependency
78
80
  name: fakefs
79
- prerelease: false
80
81
  requirement: &id005 !ruby/object:Gem::Requirement
81
82
  none: false
82
83
  requirements:
83
- - - ">="
84
+ - - ~>
84
85
  - !ruby/object:Gem::Version
85
- hash: 3
86
86
  segments:
87
87
  - 0
88
- version: "0"
88
+ - 3
89
+ - 1
90
+ version: 0.3.1
89
91
  type: :development
92
+ prerelease: false
90
93
  version_requirements: *id005
91
94
  - !ruby/object:Gem::Dependency
92
95
  name: fakefs-require
93
- prerelease: false
94
96
  requirement: &id006 !ruby/object:Gem::Requirement
95
97
  none: false
96
98
  requirements:
97
- - - ">="
99
+ - - ~>
98
100
  - !ruby/object:Gem::Version
99
- hash: 3
100
101
  segments:
101
102
  - 0
102
- version: "0"
103
+ - 2
104
+ - 1
105
+ version: 0.2.1
103
106
  type: :development
107
+ prerelease: false
104
108
  version_requirements: *id006
105
109
  description:
106
110
  email:
107
- - lgierth@entwickler.com
111
+ - lars.gierth@gmail.com
108
112
  executables: []
109
113
 
110
114
  extensions: []
@@ -112,29 +116,19 @@ extensions: []
112
116
  extra_rdoc_files: []
113
117
 
114
118
  files:
115
- - lib/pakada/version.rb
116
- - lib/pakada/support.rb
117
- - lib/pakada/boot.rb
118
- - lib/pakada/tasks.rb
119
- - lib/pakada/test.rb
120
- - lib/pakada/test_case.rb
121
- - lib/pakada/application.rb
122
- - lib/pakada/module.rb
123
- - lib/pakada/support/aliasing.rb
124
- - lib/pakada/support/instance_exec.rb
125
- - lib/pakada/support/inflection.rb
126
- - lib/pakada.rb
127
- - tasks/test.rb
128
- - test/pakada_test.rb
129
- - test/files.rb
130
- - test/module_test.rb
131
- - test/helper.rb
119
+ - .rspec
132
120
  - Gemfile
133
121
  - LICENSE
134
122
  - Rakefile
135
- - README.rdoc
123
+ - lib/pakada.rb
124
+ - lib/pakada/module.rb
125
+ - lib/pakada/version.rb
126
+ - pakada.gemspec
127
+ - spec/module_spec.rb
128
+ - spec/pakada_spec.rb
129
+ - spec/spec_helper.rb
136
130
  has_rdoc: true
137
- homepage: http://github.com/lgierth/pakada
131
+ homepage: http://rubygems.org/gems/pakada
138
132
  licenses: []
139
133
 
140
134
  post_install_message:
@@ -147,7 +141,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
141
  requirements:
148
142
  - - ">="
149
143
  - !ruby/object:Gem::Version
150
- hash: 3
144
+ hash: -431018637
151
145
  segments:
152
146
  - 0
153
147
  version: "0"
@@ -156,18 +150,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
150
  requirements:
157
151
  - - ">="
158
152
  - !ruby/object:Gem::Version
159
- hash: 23
153
+ hash: -431018637
160
154
  segments:
161
- - 1
162
- - 3
163
- - 6
164
- version: 1.3.6
155
+ - 0
156
+ version: "0"
165
157
  requirements: []
166
158
 
167
159
  rubyforge_project:
168
160
  rubygems_version: 1.3.7
169
161
  signing_key:
170
162
  specification_version: 3
171
- summary: Drupal-like awesomeness on Ruby
163
+ summary: Very Extensible HTTP Container For Ruby
172
164
  test_files: []
173
165
 
data/README.rdoc DELETED
@@ -1 +0,0 @@
1
- = Drupal-like awesomeness on Ruby
@@ -1,23 +0,0 @@
1
- class Pakada
2
- class Application
3
- class << self
4
- attr_reader :request, :response
5
-
6
- def call(request_env)
7
- Pakada.hook(:reset)
8
-
9
- request = Rack::Request.new(request_env)
10
- response = Rack::Response.new
11
-
12
- @request, @response = request, response
13
- Pakada.hook(:request)
14
-
15
- response.write("Hi, I'm Pakada!") if response.length == 0
16
-
17
- Pakada.hook(:response)
18
- @request, @response = nil, nil
19
- return response.finish
20
- end
21
- end
22
- end
23
- end
data/lib/pakada/boot.rb DELETED
@@ -1,7 +0,0 @@
1
- require "pakada"
2
-
3
- env = (ENV["RACK_ENV"] ||= "development").to_sym
4
- Bundler.setup(:modules, :default, env)
5
-
6
- require "config/boot" if File.exist?("config/boot.rb")
7
- Pakada.boot(env)
@@ -1,8 +0,0 @@
1
- class Module
2
-
3
- def alias_method_chain(target, feature)
4
- alias_method("#{target}_without_#{feature}", target)
5
- alias_method(target, "#{target}_with_#{feature}")
6
- end
7
-
8
- end
@@ -1,35 +0,0 @@
1
- class String
2
-
3
- def classify()
4
- Extlib::Inflection.classify(self)
5
- end
6
-
7
- def camelize()
8
- Extlib::Inflection.camelize(self)
9
- end
10
-
11
- def underscore()
12
- Extlib::Inflection.underscore(self)
13
- end
14
-
15
- def humanize()
16
- Extlib::Inflection.humanize(self)
17
- end
18
-
19
- def demodulize()
20
- Extlib::Inflection.demodulize(self)
21
- end
22
-
23
- def tableize()
24
- Extlib::Inflection.tableize(self)
25
- end
26
-
27
- def foreign_key()
28
- Extlib::Inflection.foreign_key(self)
29
- end
30
-
31
- def constantize()
32
- Extlib::Inflection.constantize(self)
33
- end
34
-
35
- end
@@ -1,27 +0,0 @@
1
- class Object
2
-
3
- module InstanceExecHelper
4
- end
5
-
6
- include InstanceExecHelper
7
-
8
- # this leaks memory
9
- # see http://eigenclass.org/hiki/bounded+space+instance_exec
10
- def instance_exec(*args, &block)
11
- begin
12
- old_critical, Thread.critical = Thread.critical, true
13
- n = 0
14
- n += 1 while respond_to?(mname = "__instance_exec#{n}")
15
- InstanceExecHelper.module_eval { define_method(mname, &block) }
16
- ensure
17
- Thread.critical = old_critical
18
- end
19
- begin
20
- ret = send(mname, *args)
21
- ensure
22
- InstanceExecHelper.module_eval{ remove_method(mname) } rescue nil
23
- end
24
- return ret
25
- end
26
-
27
- end
@@ -1,9 +0,0 @@
1
- require "yaml"
2
-
3
- require "extlib/dictionary"
4
- require "extlib/inflection"
5
- require "extlib/string"
6
-
7
- require "pakada/support/aliasing"
8
- require "pakada/support/inflection"
9
- require "pakada/support/instance_exec" if RUBY_VERSION < "1.9"
data/lib/pakada/tasks.rb DELETED
@@ -1,22 +0,0 @@
1
- require "pakada"
2
-
3
- dirs = []
4
-
5
- # core's tasks
6
- dirs << Gem.loaded_specs["pakada"].full_gem_path
7
-
8
- # modules' tasks
9
- ENV["RACK_ENV"] ||= "development"
10
- Bundler.setup(:modules, :default, ENV["RACK_ENV"].to_sym)
11
- Pakada::Module.load
12
- Pakada::Module.descendants.each do |name, mod|
13
- dirs << mod[:gemspec].full_gem_path
14
- end
15
-
16
- # project's tasks
17
- dirs << Dir.pwd
18
-
19
- # load the tasks
20
- dirs.uniq.each do |dir|
21
- Dir["#{dir}/tasks/*"].each {|f| require(f) }
22
- end
data/lib/pakada/test.rb DELETED
@@ -1,14 +0,0 @@
1
- ENV["RACK_ENV"] = "testing"
2
- require "bundler"
3
- Bundler.setup(:pakada, :modules, :default, ENV["RACK_ENV"].to_sym)
4
-
5
- require "pakada"
6
-
7
- require "test/unit"
8
- require "pakada/test_case"
9
- Test::Unit::TestCase.class_eval { include(Pakada::TestCase) }
10
-
11
- require "mocha"
12
- require "fakefs/safe"
13
- require "fakefs/require"
14
- require "rack"