web_pipe 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +10 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +91 -0
- data/README.md +279 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/dry/monads/result/extensions/either.rb +42 -0
- data/lib/web_pipe.rb +16 -0
- data/lib/web_pipe/app.rb +106 -0
- data/lib/web_pipe/conn.rb +397 -0
- data/lib/web_pipe/conn_support/builder.rb +36 -0
- data/lib/web_pipe/conn_support/errors.rb +16 -0
- data/lib/web_pipe/conn_support/headers.rb +97 -0
- data/lib/web_pipe/conn_support/types.rb +50 -0
- data/lib/web_pipe/dsl/builder.rb +38 -0
- data/lib/web_pipe/dsl/class_context.rb +62 -0
- data/lib/web_pipe/dsl/dsl_context.rb +53 -0
- data/lib/web_pipe/dsl/instance_methods.rb +60 -0
- data/lib/web_pipe/plug.rb +103 -0
- data/lib/web_pipe/rack/app_with_middlewares.rb +61 -0
- data/lib/web_pipe/rack/middleware.rb +33 -0
- data/lib/web_pipe/types.rb +31 -0
- data/lib/web_pipe/version.rb +3 -0
- data/web_pipe.gemspec +51 -0
- metadata +244 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'dry/initializer'
|
2
|
+
require 'web_pipe/types'
|
3
|
+
require 'web_pipe/rack/middleware'
|
4
|
+
require 'rack'
|
5
|
+
|
6
|
+
module WebPipe
|
7
|
+
module Rack
|
8
|
+
# Helper to build and call a rack application with middlewares.
|
9
|
+
#
|
10
|
+
# @private
|
11
|
+
class AppWithMiddlewares
|
12
|
+
# Type for a rack application.
|
13
|
+
#
|
14
|
+
# It should be something callable accepting a rack env and
|
15
|
+
# returning a rack response.
|
16
|
+
App = Types.Contract(:call)
|
17
|
+
|
18
|
+
# @!attribute [r] rack_middlewares
|
19
|
+
# @return [Array<RackMiddleware>]
|
20
|
+
|
21
|
+
# @!attribute [r] app
|
22
|
+
# @return [App[]]
|
23
|
+
|
24
|
+
|
25
|
+
include Dry::Initializer.define -> do
|
26
|
+
param :rack_middlewares,
|
27
|
+
type: Types.Array(Middleware::Instance)
|
28
|
+
|
29
|
+
param :app, type: App
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Rack::Builder]
|
33
|
+
attr_reader :builder
|
34
|
+
|
35
|
+
def initialize(*args)
|
36
|
+
super
|
37
|
+
@builder = build_rack_app(rack_middlewares, app)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Calls rack application.
|
41
|
+
#
|
42
|
+
# @param env [Hash] Rack env
|
43
|
+
#
|
44
|
+
# @return [Array] Rack resonse
|
45
|
+
def call(env)
|
46
|
+
builder.call(env)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def build_rack_app(rack_middlewares, app)
|
52
|
+
::Rack::Builder.new.tap do |b|
|
53
|
+
rack_middlewares.each do |middleware|
|
54
|
+
b.use(middleware.middleware, *middleware.middleware_options)
|
55
|
+
end
|
56
|
+
b.run(app)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'dry/initializer'
|
2
|
+
require 'web_pipe/types'
|
3
|
+
|
4
|
+
module WebPipe
|
5
|
+
module Rack
|
6
|
+
# Simple data structure to represent a rack middleware class with
|
7
|
+
# its initialization options.
|
8
|
+
class Middleware
|
9
|
+
# Type for an instance of self.
|
10
|
+
Instance = Types.Instance(self)
|
11
|
+
|
12
|
+
# Type for a rack middleware class.
|
13
|
+
MiddlewareClass = Types.Instance(Class)
|
14
|
+
|
15
|
+
# Type for the options to initialize a rack middleware.
|
16
|
+
Options = Types::Strict::Array
|
17
|
+
|
18
|
+
# @!attribute [r] middleware
|
19
|
+
# @return [MiddlewareClass[]] Rack middleware
|
20
|
+
|
21
|
+
# @!attribute [r] options
|
22
|
+
# @return [Options[]]
|
23
|
+
# Options to initialize the rack middleware
|
24
|
+
|
25
|
+
|
26
|
+
include Dry::Initializer.define -> do
|
27
|
+
param :middleware, type: MiddlewareClass
|
28
|
+
|
29
|
+
param :middleware_options, type: Options
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'dry/types'
|
2
|
+
|
3
|
+
module WebPipe
|
4
|
+
# Namespace for generic library types.
|
5
|
+
module Types
|
6
|
+
include Dry.Types()
|
7
|
+
|
8
|
+
# Type constructor which validates value fulfills with expected
|
9
|
+
# methods.
|
10
|
+
#
|
11
|
+
# @param methods [Array<Symbols>]
|
12
|
+
#
|
13
|
+
# @return [Object] on success
|
14
|
+
# @raise Dry::Types::CoercionError when value does not respond
|
15
|
+
# to all the methods.
|
16
|
+
def self.Contract(*methods)
|
17
|
+
Constructor(Nominal::Any) do |value|
|
18
|
+
methods.reduce(value) do |value, method|
|
19
|
+
if value.respond_to?(method)
|
20
|
+
value
|
21
|
+
else
|
22
|
+
raise NoMethodError, "+#{value.inspect}+ does not respond to +#{method}+"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Anything which can resolve from a `#[]` method.
|
29
|
+
Container = Contract(:[])
|
30
|
+
end
|
31
|
+
end
|
data/web_pipe.gemspec
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require "web_pipe/version"
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "web_pipe"
|
9
|
+
spec.version = WebPipe::VERSION
|
10
|
+
spec.authors = ["Marc Busqué"]
|
11
|
+
spec.email = ["marc@lamarciana.com"]
|
12
|
+
|
13
|
+
spec.summary = %q{Rack application builder through a pipe of operations on an immutable struct.}
|
14
|
+
spec.homepage = "https://github.com/waiting-for-dev/web_pipe"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
17
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
20
|
+
|
21
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
22
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
23
|
+
spec.metadata["changelog_uri"] = spec.homepage + '/CHANGELOG.md'
|
24
|
+
else
|
25
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
26
|
+
"public gem pushes."
|
27
|
+
end
|
28
|
+
|
29
|
+
# Specify which files should be added to the gem when it is released.
|
30
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
31
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
32
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
33
|
+
end
|
34
|
+
spec.bindir = "exe"
|
35
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
36
|
+
spec.require_paths = ["lib"]
|
37
|
+
|
38
|
+
spec.add_runtime_dependency "rack", "~> 2.0"
|
39
|
+
spec.add_runtime_dependency "dry-monads", "~> 1.2"
|
40
|
+
spec.add_runtime_dependency "dry-types", "~> 1.0"
|
41
|
+
spec.add_runtime_dependency "dry-struct", "~> 1.0"
|
42
|
+
spec.add_runtime_dependency "dry-initializer", "~> 3.0"
|
43
|
+
|
44
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
45
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
46
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
47
|
+
spec.add_development_dependency "rack-test", "~> 1.1"
|
48
|
+
spec.add_development_dependency "yard", "~> 0.9"
|
49
|
+
spec.add_development_dependency "redcarpet", "~> 3.4"
|
50
|
+
spec.add_development_dependency "pry-byebug"
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,244 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: web_pipe
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Marc Busqué
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-05-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dry-monads
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dry-types
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: dry-struct
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dry-initializer
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bundler
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.17'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.17'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '10.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '10.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '3.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rack-test
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yard
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.9'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.9'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: redcarpet
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '3.4'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '3.4'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: pry-byebug
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
description:
|
182
|
+
email:
|
183
|
+
- marc@lamarciana.com
|
184
|
+
executables: []
|
185
|
+
extensions: []
|
186
|
+
extra_rdoc_files: []
|
187
|
+
files:
|
188
|
+
- ".gitignore"
|
189
|
+
- ".rspec"
|
190
|
+
- ".travis.yml"
|
191
|
+
- ".yardopts"
|
192
|
+
- CHANGELOG.md
|
193
|
+
- Gemfile
|
194
|
+
- Gemfile.lock
|
195
|
+
- README.md
|
196
|
+
- Rakefile
|
197
|
+
- bin/console
|
198
|
+
- bin/setup
|
199
|
+
- lib/dry/monads/result/extensions/either.rb
|
200
|
+
- lib/web_pipe.rb
|
201
|
+
- lib/web_pipe/app.rb
|
202
|
+
- lib/web_pipe/conn.rb
|
203
|
+
- lib/web_pipe/conn_support/builder.rb
|
204
|
+
- lib/web_pipe/conn_support/errors.rb
|
205
|
+
- lib/web_pipe/conn_support/headers.rb
|
206
|
+
- lib/web_pipe/conn_support/types.rb
|
207
|
+
- lib/web_pipe/dsl/builder.rb
|
208
|
+
- lib/web_pipe/dsl/class_context.rb
|
209
|
+
- lib/web_pipe/dsl/dsl_context.rb
|
210
|
+
- lib/web_pipe/dsl/instance_methods.rb
|
211
|
+
- lib/web_pipe/plug.rb
|
212
|
+
- lib/web_pipe/rack/app_with_middlewares.rb
|
213
|
+
- lib/web_pipe/rack/middleware.rb
|
214
|
+
- lib/web_pipe/types.rb
|
215
|
+
- lib/web_pipe/version.rb
|
216
|
+
- web_pipe.gemspec
|
217
|
+
homepage: https://github.com/waiting-for-dev/web_pipe
|
218
|
+
licenses: []
|
219
|
+
metadata:
|
220
|
+
allowed_push_host: https://rubygems.org
|
221
|
+
homepage_uri: https://github.com/waiting-for-dev/web_pipe
|
222
|
+
source_code_uri: https://github.com/waiting-for-dev/web_pipe
|
223
|
+
changelog_uri: https://github.com/waiting-for-dev/web_pipe/CHANGELOG.md
|
224
|
+
post_install_message:
|
225
|
+
rdoc_options: []
|
226
|
+
require_paths:
|
227
|
+
- lib
|
228
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
229
|
+
requirements:
|
230
|
+
- - ">="
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
version: '0'
|
233
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
234
|
+
requirements:
|
235
|
+
- - ">="
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
238
|
+
requirements: []
|
239
|
+
rubyforge_project:
|
240
|
+
rubygems_version: 2.7.8
|
241
|
+
signing_key:
|
242
|
+
specification_version: 4
|
243
|
+
summary: Rack application builder through a pipe of operations on an immutable struct.
|
244
|
+
test_files: []
|