meddler 0.0.1

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/README.rdoc ADDED
@@ -0,0 +1,22 @@
1
+ = Meddler
2
+
3
+ == Hey, someone meddled with my middleware!
4
+
5
+ This lets you have on_request and on_response wrappers around a builder, and optionally skip them in either case.
6
+
7
+ == Usage
8
+
9
+ In your rackup file, do this:
10
+
11
+ require 'meddler'
12
+ use Meddler::Builder, :on_request => proc{|req| req.post?} do
13
+ use MungePostMiddleware
14
+ end
15
+
16
+ Or, on response
17
+
18
+ require 'meddler'
19
+ use Meddler::Builder, :on_response => proc{|resp| resp.status == 200} do
20
+ use MiddlewareThatLikesOkThings
21
+ end
22
+
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |s|
6
+ s.name = "meddler"
7
+ s.description = s.summary = "Hey, someone meddled with my middleware!"
8
+ s.email = "joshbuddy@gmail.com"
9
+ s.homepage = "http://github.com/joshbuddy/meddler"
10
+ s.authors = ["Joshua Hull"].sort
11
+ s.files = FileList["[A-Z]*", "{lib}/**/*"]
12
+ end
13
+ Jeweler::GemcutterTasks.new
14
+ rescue LoadError
15
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
16
+ end
17
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,15 @@
1
+ class Meddler
2
+ class Builder
3
+
4
+ def initialize(app, rules = nil, &block)
5
+ @app = app
6
+ @target = Rack::Builder.new(&block)
7
+ @meddler = Meddler.new(@app, rules && rules[:on_request], rules && rules[:on_response], @target)
8
+ end
9
+
10
+ def call(env)
11
+ @meddler.call(env)
12
+ end
13
+
14
+ end
15
+ end
data/lib/meddler.rb ADDED
@@ -0,0 +1,52 @@
1
+ require 'rack'
2
+
3
+ $: << File.dirname(__FILE__)
4
+ require 'meddler/builder'
5
+
6
+ class Meddler
7
+
8
+ def initialize(app, before_rule, after_rule, wrapped_app)
9
+ wrapped_app.run(PostInterceptor.new(app, after_rule))
10
+ @app = PreInterceptor.new(wrapped_app.to_app, app, before_rule)
11
+ end
12
+
13
+ def call(env)
14
+ response = catch(:skipped_middleware) do
15
+ @app.call(env)
16
+ end
17
+ response
18
+ end
19
+
20
+
21
+ class PostInterceptor
22
+ def initialize(app, rule = nil)
23
+ @app = app
24
+ @rule = rule
25
+ end
26
+
27
+ def call(env)
28
+ response = @app.call(env)
29
+ if @rule.nil? || @rule.call(Rack::Response.new(response))
30
+ response
31
+ else
32
+ throw :skipped_middleware, response
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ class PreInterceptor
39
+ attr_accessor :skip_app
40
+
41
+ def initialize(app, skip_app, rule = nil)
42
+ @app = app
43
+ @skip_app = skip_app
44
+ @rule = rule
45
+ end
46
+
47
+ def call(env)
48
+ response = @rule.nil? || @rule.call(Rack::Request.new(env)) ? @app.call(env) : @skip_app.call(env)
49
+ end
50
+ end
51
+
52
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meddler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Joshua Hull
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-30 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Hey, someone meddled with my middleware!
17
+ email: joshbuddy@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - README.rdoc
26
+ - Rakefile
27
+ - VERSION
28
+ - lib/meddler.rb
29
+ - lib/meddler/builder.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/joshbuddy/meddler
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options:
36
+ - --charset=UTF-8
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
51
+ requirements: []
52
+
53
+ rubyforge_project:
54
+ rubygems_version: 1.3.5
55
+ signing_key:
56
+ specification_version: 3
57
+ summary: Hey, someone meddled with my middleware!
58
+ test_files: []
59
+