ustack 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.md +8 -6
  2. data/lib/ustack.rb +149 -5
  3. data/lib/ustack/version.rb +1 -1
  4. metadata +36 -3
data/README.md CHANGED
@@ -9,7 +9,7 @@ Micro middleware stack for general purpose.
9
9
  gem 'ustack'
10
10
  ```
11
11
 
12
- ## Usage
12
+ ## Basic usage
13
13
 
14
14
  ```ruby
15
15
  class M1 < Struct.new(:app)
@@ -34,13 +34,15 @@ app = Ustack.new do
34
34
  end
35
35
 
36
36
  puts app.run
37
- # => M1
38
- # => M2
39
- # => xxx
40
- # => M1
41
- # => zzz
37
+ # => M1
38
+ # => M2
39
+ # => xxx
40
+ # => M1
41
+ # => zzz
42
42
  ```
43
43
 
44
+ You can also `swap`, `insert_before` and `insert_after` middleware. See documentation for details.
45
+
44
46
  ## Contributing
45
47
 
46
48
  1. Fork it
@@ -1,19 +1,163 @@
1
1
  require 'ustack/version'
2
2
 
3
+ # Micro middleware stack for general purpose.
4
+ #
5
+ # @example
6
+ # class M1 < Struct.new(:app)
7
+ # def call(env)
8
+ # puts self
9
+ # puts app.call(env)
10
+ # puts self
11
+ # 'zzz'
12
+ # end
13
+ # end
14
+ #
15
+ # class M2 < Struct.new(:app, :options)
16
+ # def call(env)
17
+ # puts self
18
+ # options[:return]
19
+ # end
20
+ # end
21
+ #
22
+ # app = Ustack.new do
23
+ # use M1
24
+ # use M2, return: 'xxx'
25
+ # end
26
+ #
27
+ # puts app.run
28
+ # # => M1
29
+ # # => M2
30
+ # # => xxx
31
+ # # => M1
32
+ # # => zzz
33
+ #
34
+ # @api public
3
35
  class Ustack
36
+ # Initializes new middleware stack.
37
+ #
38
+ # @example
39
+ # app1 = Ustack.new
40
+ # app2 = Ustack.new do
41
+ # use M1
42
+ # use M2, my_option: 'xxx'
43
+ # end
44
+ #
45
+ # @return [Ustack] Initialized middleware stack.
46
+ # @api public
4
47
  def initialize(&block)
5
48
  instance_eval(&block) if block_given?
6
49
  end
7
50
 
51
+ # Tells the stack to use given middleware.
52
+ #
53
+ # @param [Class] klass Middleware class to be used.
54
+ # @param [Hash] options Hash of orbitrary options for new middlware.
55
+ #
56
+ # @example
57
+ # app = Ustack.new do
58
+ # use M1
59
+ # end
60
+ # app.use M2
61
+ # app.use M2, my_option: 'xxx'
62
+ #
63
+ # @api public
8
64
  def use(klass, options=nil)
9
- @stack ||= []
10
- @stack << [klass, options]
65
+ @ustack ||= []
66
+ @ustack << [klass, options]
11
67
  end
12
68
 
69
+ # Swaps two middlewares.
70
+ #
71
+ # @param [Class] old_klass Middleware class to be replaced.
72
+ # @param [Class] new_klass New middleware class.
73
+ # @param [Hash] options Hash of orbitrary options for new middlware.
74
+ #
75
+ # @example
76
+ # app = Ustack.new do
77
+ # use M1
78
+ # end
79
+ # app.use M2
80
+ # app.use M2, my_option: 'xxx'
81
+ #
82
+ # @api public
83
+ def swap(old_klass, new_klass, options=nil)
84
+ @ustack[index(old_klass)] = [new_klass, options]
85
+ end
86
+
87
+ # Insert a middleware before another middleware.
88
+ #
89
+ # @param [Class] klass Existing middleware.
90
+ # @param [Class] new_klass Middleware to be inserted.
91
+ # @param [Hash] options Hash of orbitrary options for new middlware.
92
+ #
93
+ # @example
94
+ # app = Ustack.new do
95
+ # use M1
96
+ # end
97
+ # app.insert_before M1, M0, my_option: 'xxx'
98
+ #
99
+ # @api public
100
+ def insert_before(klass, new_klass, options=nil)
101
+ @ustack.insert(index(klass), [new_klass, options])
102
+ end
103
+
104
+ # Insert a middleware after another middleware.
105
+ #
106
+ # @param [Class] klass Existing middleware.
107
+ # @param [Class] new_klass Middleware to be inserted.
108
+ # @param [Hash] options Hash of orbitrary options for new middlware.
109
+ #
110
+ # @example
111
+ # app = Ustack.new do
112
+ # use M1
113
+ # end
114
+ # app.insert_before M1, M2, my_option: 'xxx'
115
+ #
116
+ # @api public
117
+ def insert_after(klass, new_klass, options=nil)
118
+ @ustack.insert(index(klass) + 1, [new_klass, options])
119
+ end
120
+
121
+ # Runs the middlware stack.
122
+ #
123
+ # @param [Hash] env Initial environment.
124
+ #
125
+ # @example
126
+ # class M1 < Struct.new(:app)
127
+ # def call(env)
128
+ # app.call(env)
129
+ # 'zzz'
130
+ # end
131
+ # end
132
+ #
133
+ # class M2 < Struct.new(:app)
134
+ # def call(env)
135
+ # puts env[:my_env_key]
136
+ # end
137
+ # end
138
+ #
139
+ # app = Ustack do
140
+ # use M1
141
+ # use m2
142
+ # end
143
+ #
144
+ # puts app.run(my_env_key: 'xxx')
145
+ # # => 'xxx'
146
+ # # => 'zzz'
147
+ #
148
+ # @return [Object] Value returned by the most outer middleware.
149
+ # @api public
13
150
  def run(env={})
14
- @stack.reverse.each do |(klass, options)|
15
- @app = options ? klass.new(@app, options) : klass.new(@app)
151
+ app = nil
152
+ @ustack.reverse.each do |(klass, options)|
153
+ app = options ? klass.new(app, options) : klass.new(app)
16
154
  end
17
- @app.call(env)
155
+ app.call(env)
156
+ end
157
+
158
+ private
159
+
160
+ def index(klass, &block)
161
+ @ustack.each_with_index { |(k, _), i| return i if k == klass }
18
162
  end
19
163
  end
@@ -1,3 +1,3 @@
1
1
  class Ustack
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ustack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,6 +11,22 @@ bindir: bin
11
11
  cert_chain: []
12
12
  date: 2013-05-13 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: pry
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: rake
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -43,6 +59,22 @@ dependencies:
43
59
  - - ! '>='
44
60
  - !ruby/object:Gem::Version
45
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: yard
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
46
78
  description: Micro middleware stack for general purpose
47
79
  email:
48
80
  - kostiantyn.kahanskyi@googlemail.com
@@ -68,7 +100,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
100
  version: '0'
69
101
  segments:
70
102
  - 0
71
- hash: -62502703547411652
103
+ hash: -2009942153785192305
72
104
  required_rubygems_version: !ruby/object:Gem::Requirement
73
105
  none: false
74
106
  requirements:
@@ -77,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
109
  version: '0'
78
110
  segments:
79
111
  - 0
80
- hash: -62502703547411652
112
+ hash: -2009942153785192305
81
113
  requirements: []
82
114
  rubyforge_project:
83
115
  rubygems_version: 1.8.25
@@ -85,3 +117,4 @@ signing_key:
85
117
  specification_version: 3
86
118
  summary: Micro middleware stack for general purpose
87
119
  test_files: []
120
+ has_rdoc: