ustack 0.0.1 → 0.0.2

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.
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: