web_pipe 0.1.0 → 0.2.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 +4 -4
- data/CHANGELOG.md +10 -1
- data/Gemfile.lock +15 -7
- data/README.md +20 -0
- data/lib/web_pipe.rb +6 -0
- data/lib/web_pipe/app.rb +1 -1
- data/lib/web_pipe/conn.rb +6 -3
- data/lib/web_pipe/conn_support/builder.rb +1 -1
- data/lib/web_pipe/conn_support/errors.rb +1 -1
- data/lib/web_pipe/conn_support/headers.rb +1 -1
- data/lib/web_pipe/conn_support/types.rb +2 -4
- data/lib/web_pipe/dsl/builder.rb +3 -2
- data/lib/web_pipe/dsl/class_context.rb +1 -1
- data/lib/web_pipe/dsl/dsl_context.rb +1 -1
- data/lib/web_pipe/dsl/instance_methods.rb +2 -2
- data/lib/web_pipe/extensions/dry_view/dry_view.rb +156 -0
- data/lib/web_pipe/extensions/dry_view/plugs/view_context.rb +38 -0
- data/lib/web_pipe/plug.rb +1 -1
- data/lib/web_pipe/plugs.rb +5 -0
- data/lib/web_pipe/plugs/container.rb +31 -0
- data/lib/web_pipe/plugs/content_type.rb +24 -0
- data/lib/web_pipe/rack/app_with_middlewares.rb +2 -2
- data/lib/web_pipe/types.rb +3 -22
- data/lib/web_pipe/version.rb +1 -1
- data/web_pipe.gemspec +3 -2
- metadata +29 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d89f930070f399bae4f6949b4f62b61d2fcb6f8716e9527baa350cf673daa4a6
|
4
|
+
data.tar.gz: a7942d96afa3110e68dd55591a56b780d39a61c6e5b22cff5087a628b5997a6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a5b905649927d6bbba53540583f9429ef862aa0ee764087f037f3b490e32c87d3d24cbd30980267d7a7bd89735d23c9a3965c21938fa50d326f7a794eab6c6b
|
7
|
+
data.tar.gz: 19c1b7ec4247cfe48cde66b0c74eee6978f905759f943b77d0b93d315e2cc603759a4ae5afc7282945255093d4fd746e4101e62834067b10853aaa9f69e3d254
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
-
## [0.0
|
7
|
+
## [0.2.0] - 2019-07-05
|
8
|
+
### Added
|
9
|
+
- dry-view integration ([#1](https://github.com/waiting-for-dev/web_pipe/pull/1), [#3](https://github.com/waiting-for-dev/web_pipe/pull/3), [#4](https://github.com/waiting-for-dev/web_pipe/pull/4), [#5](https://github.com/waiting-for-dev/web_pipe/pull/5) and [#6](https://github.com/waiting-for-dev/web_pipe/pull/6))
|
10
|
+
- Configuring a container in `WebPipe::Conn` ([#2](https://github.com/waiting-for-dev/web_pipe/pull/2) and [#5](https://github.com/waiting-for-dev/web_pipe/pull/5))
|
11
|
+
- Plug to set `Content-Type` response header ([#7](https://github.com/waiting-for-dev/web_pipe/pull/7))
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
- Fix key interpolation in `KeyNotFoundInBagError` ([#8](https://github.com/waiting-for-dev/web_pipe/pull/8))
|
15
|
+
|
16
|
+
## [0.1.0] - 2019-05-07
|
8
17
|
### Added
|
9
18
|
- Initial release.
|
data/Gemfile.lock
CHANGED
@@ -5,7 +5,7 @@ PATH
|
|
5
5
|
dry-initializer (~> 3.0)
|
6
6
|
dry-monads (~> 1.2)
|
7
7
|
dry-struct (~> 1.0)
|
8
|
-
dry-types (~> 1.
|
8
|
+
dry-types (~> 1.1)
|
9
9
|
rack (~> 2.0)
|
10
10
|
|
11
11
|
GEM
|
@@ -18,7 +18,7 @@ GEM
|
|
18
18
|
dry-configurable (0.8.2)
|
19
19
|
concurrent-ruby (~> 1.0)
|
20
20
|
dry-core (~> 0.4, >= 0.4.7)
|
21
|
-
dry-container (0.7.
|
21
|
+
dry-container (0.7.1)
|
22
22
|
concurrent-ruby (~> 1.0)
|
23
23
|
dry-configurable (~> 0.1, >= 0.1.3)
|
24
24
|
dry-core (0.4.7)
|
@@ -26,7 +26,7 @@ GEM
|
|
26
26
|
dry-equalizer (0.2.2)
|
27
27
|
dry-inflector (0.1.2)
|
28
28
|
dry-initializer (3.0.1)
|
29
|
-
dry-logic (1.0.
|
29
|
+
dry-logic (1.0.2)
|
30
30
|
concurrent-ruby (~> 1.0)
|
31
31
|
dry-core (~> 0.2)
|
32
32
|
dry-equalizer (~> 0.2)
|
@@ -39,13 +39,19 @@ GEM
|
|
39
39
|
dry-equalizer (~> 0.2)
|
40
40
|
dry-types (~> 1.0)
|
41
41
|
ice_nine (~> 0.11)
|
42
|
-
dry-types (1.
|
42
|
+
dry-types (1.1.0)
|
43
43
|
concurrent-ruby (~> 1.0)
|
44
44
|
dry-container (~> 0.3)
|
45
45
|
dry-core (~> 0.4, >= 0.4.4)
|
46
46
|
dry-equalizer (~> 0.2, >= 0.2.2)
|
47
47
|
dry-inflector (~> 0.1, >= 0.1.2)
|
48
|
-
dry-logic (~> 1.0)
|
48
|
+
dry-logic (~> 1.0, >= 1.0.2)
|
49
|
+
dry-view (0.7.0)
|
50
|
+
dry-configurable (~> 0.1)
|
51
|
+
dry-core (~> 0.2)
|
52
|
+
dry-equalizer (~> 0.2)
|
53
|
+
dry-inflector (~> 0.1)
|
54
|
+
tilt (~> 2.0, >= 2.0.6)
|
49
55
|
ice_nine (0.11.2)
|
50
56
|
method_source (0.9.2)
|
51
57
|
pry (0.12.2)
|
@@ -72,20 +78,22 @@ GEM
|
|
72
78
|
diff-lcs (>= 1.2.0, < 2.0)
|
73
79
|
rspec-support (~> 3.8.0)
|
74
80
|
rspec-support (3.8.0)
|
75
|
-
|
81
|
+
tilt (2.0.9)
|
82
|
+
yard (0.9.20)
|
76
83
|
|
77
84
|
PLATFORMS
|
78
85
|
ruby
|
79
86
|
|
80
87
|
DEPENDENCIES
|
81
88
|
bundler (~> 1.17)
|
89
|
+
dry-view (~> 0.7)
|
82
90
|
pry-byebug
|
83
91
|
rack-test (~> 1.1)
|
84
92
|
rake (~> 10.0)
|
85
93
|
redcarpet (~> 3.4)
|
86
94
|
rspec (~> 3.0)
|
87
95
|
web_pipe!
|
88
|
-
yard (~> 0.9)
|
96
|
+
yard (~> 0.9, >= 0.9.20)
|
89
97
|
|
90
98
|
BUNDLED WITH
|
91
99
|
1.17.2
|
data/README.md
CHANGED
@@ -262,6 +262,26 @@ op_2 = ->(conn) { conn.set_response_body('Hello') }
|
|
262
262
|
WebPipe::App.new([op_1, op_2])
|
263
263
|
```
|
264
264
|
|
265
|
+
## Plugs
|
266
|
+
|
267
|
+
`web_pipe` ships with a series of common operations you can take
|
268
|
+
advantage in order to build your application:
|
269
|
+
|
270
|
+
- [container](lib/web_pipe/plugs/container.rb): Allows
|
271
|
+
configuring a container to resolve dependencies.
|
272
|
+
- [content_type](lib/web_pipe/plugs/content_type.rb): Sets
|
273
|
+
`Content-Type` response header.
|
274
|
+
|
275
|
+
## Extensions
|
276
|
+
|
277
|
+
By default, `web_pipe` behavior is the very minimal you need to build
|
278
|
+
a web application. However, you can extend it with the following
|
279
|
+
extensions (click on each name for details on the usage):
|
280
|
+
|
281
|
+
- [dry-view](lib/web_pipe/extensions/dry_view/dry_view.rb):
|
282
|
+
Integration with [`dry-view`](https://dry-rb.org/gems/dry-view/)
|
283
|
+
rendering system.
|
284
|
+
|
265
285
|
## Current status
|
266
286
|
|
267
287
|
`web_pipe` is in active development. The very basic features to build
|
data/lib/web_pipe.rb
CHANGED
@@ -4,6 +4,8 @@ require 'web_pipe/dsl/builder'
|
|
4
4
|
# README](https://github.com/waiting-for-dev/web_pipe/blob/master/README.md)
|
5
5
|
# for a general overview of this library.
|
6
6
|
module WebPipe
|
7
|
+
extend Dry::Core::Extensions
|
8
|
+
|
7
9
|
# Including just delegates to an instance of `Builder`, so
|
8
10
|
# `Builder#included` is finally called.
|
9
11
|
def self.included(klass)
|
@@ -13,4 +15,8 @@ module WebPipe
|
|
13
15
|
def self.call(*args)
|
14
16
|
DSL::Builder.new(*args)
|
15
17
|
end
|
18
|
+
|
19
|
+
register_extension :dry_view do
|
20
|
+
require 'web_pipe/extensions/dry_view/dry_view'
|
21
|
+
end
|
16
22
|
end
|
data/lib/web_pipe/app.rb
CHANGED
data/lib/web_pipe/conn.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dry/struct'
|
2
|
+
require 'web_pipe/types'
|
2
3
|
require 'web_pipe/conn_support/types'
|
3
4
|
require 'web_pipe/conn_support/errors'
|
4
5
|
require 'web_pipe/conn_support/headers'
|
@@ -23,7 +24,7 @@ module WebPipe
|
|
23
24
|
# instance is detected.
|
24
25
|
#
|
25
26
|
# @example
|
26
|
-
# WebPipe::
|
27
|
+
# WebPipe::ConnSupport::Builder.call(env).
|
27
28
|
# set_status(404).
|
28
29
|
# add_response_header('Content-Type', 'text/plain').
|
29
30
|
# set_response_body('Not found').
|
@@ -341,7 +342,9 @@ module WebPipe
|
|
341
342
|
#
|
342
343
|
# @raise ConnSupport::KeyNotFoundInBagError when key is not
|
343
344
|
# registered in the bag.
|
344
|
-
def fetch(key)
|
345
|
+
def fetch(key, default = Types::Undefined)
|
346
|
+
return bag.fetch(key, default) unless default == Types::Undefined
|
347
|
+
|
345
348
|
bag.fetch(key) { raise ConnSupport::KeyNotFoundInBagError.new(key) }
|
346
349
|
end
|
347
350
|
|
@@ -369,7 +372,7 @@ module WebPipe
|
|
369
372
|
# @return
|
370
373
|
# [Array<StatusCode, Headers, ResponseBody>]
|
371
374
|
#
|
372
|
-
# @private
|
375
|
+
# @api private
|
373
376
|
def rack_response
|
374
377
|
[
|
375
378
|
status,
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'dry/types'
|
2
2
|
require 'rack/request'
|
3
|
-
require 'web_pipe/types'
|
4
3
|
|
5
4
|
module WebPipe
|
6
5
|
module ConnSupport
|
@@ -24,7 +23,7 @@ module WebPipe
|
|
24
23
|
ScriptName = Strict::String
|
25
24
|
PathInfo = Strict::String
|
26
25
|
QueryString = Strict::String
|
27
|
-
RequestBody =
|
26
|
+
RequestBody = Interface(:gets, :each, :read, :rewind)
|
28
27
|
|
29
28
|
BaseUrl = Strict::String
|
30
29
|
Path = Strict::String
|
@@ -35,8 +34,7 @@ module WebPipe
|
|
35
34
|
Status = Strict::Integer.
|
36
35
|
default(200).
|
37
36
|
constrained(gteq: 100, lteq: 599)
|
38
|
-
ResponseBody =
|
39
|
-
default([''].freeze)
|
37
|
+
ResponseBody = Interface(:each).default([''].freeze)
|
40
38
|
|
41
39
|
Headers = Strict::Hash.
|
42
40
|
map(Strict::String, Strict::String).
|
data/lib/web_pipe/dsl/builder.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dry/initializer'
|
2
|
+
require 'web_pipe/types'
|
2
3
|
require 'web_pipe/dsl/class_context'
|
3
4
|
require 'web_pipe/dsl/instance_methods'
|
4
5
|
|
@@ -8,10 +9,10 @@ module WebPipe
|
|
8
9
|
# extends a {ClassContext} instance and includes
|
9
10
|
# {InstanceMethods}.
|
10
11
|
#
|
11
|
-
# @private
|
12
|
+
# @api private
|
12
13
|
class Builder < Module
|
13
14
|
# Container with nothing registered.
|
14
|
-
EMPTY_CONTAINER =
|
15
|
+
EMPTY_CONTAINER = Types::EMPTY_HASH
|
15
16
|
|
16
17
|
# @!attribute [r] container
|
17
18
|
# @return [Types::Container[]]
|
@@ -15,7 +15,7 @@ module WebPipe
|
|
15
15
|
# that are meant to be class methods in the pipe are defined as
|
16
16
|
# singleton methods of the instance.
|
17
17
|
#
|
18
|
-
# @private
|
18
|
+
# @api private
|
19
19
|
class ClassContext < Module
|
20
20
|
# Methods to be imported from the {DSLContext}.
|
21
21
|
DSL_METHODS = %i[middlewares use plugs plug].freeze
|
@@ -17,10 +17,10 @@ module WebPipe
|
|
17
17
|
# The pipe state can be accessed through the pipe class, which
|
18
18
|
# has been configured through {ClassContext}.
|
19
19
|
#
|
20
|
-
# @private
|
20
|
+
# @api private
|
21
21
|
module InstanceMethods
|
22
22
|
# No injections at all.
|
23
|
-
EMPTY_INJECTIONS =
|
23
|
+
EMPTY_INJECTIONS = Types::EMPTY_HASH
|
24
24
|
|
25
25
|
# Type for how plugs should be injected.
|
26
26
|
Injections = Types::Strict::Hash.map(Plug::Name, Plug::Spec)
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require 'web_pipe/types'
|
2
|
+
require 'web_pipe/conn'
|
3
|
+
require 'dry/view'
|
4
|
+
|
5
|
+
module WebPipe
|
6
|
+
# Integration with `dry-view` rendering system.
|
7
|
+
#
|
8
|
+
# This extensions adds a {#view} method to {WebPipe::Conn} which
|
9
|
+
# sets the string output of a `dry-view` view as response body.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# WebPipe.load_extensions(:dry_view)
|
13
|
+
#
|
14
|
+
# class SayHelloView < Dry::View
|
15
|
+
# config.paths = [File.join(__dir__, '..', 'templates')]
|
16
|
+
# config.template = 'say_hello'
|
17
|
+
#
|
18
|
+
# expose :name
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# class App
|
22
|
+
# include WebPipe
|
23
|
+
#
|
24
|
+
# plug :render
|
25
|
+
#
|
26
|
+
# def render(conn)
|
27
|
+
# conn.view(SayHello.new, name: 'Joe')
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# If {WebPipe::Conn#bag} has a `:container` key, the view instance
|
32
|
+
# can be resolved from it. {WebPipe::Plugs::Container} can be used
|
33
|
+
# to streamline this integration.
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
# class App
|
37
|
+
# include WebPipe
|
38
|
+
#
|
39
|
+
# Container = { 'views.say_hello' => SayHelloView.new }.freeze
|
40
|
+
#
|
41
|
+
# plug :container, with: WebPipe::Plugs::Container[Container]
|
42
|
+
# plug :render
|
43
|
+
#
|
44
|
+
# def render(conn)
|
45
|
+
# conn.view('views.say_hello', name: 'Joe')
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# Context ({Dry::View::Context}) for the view can be set explicetly
|
50
|
+
# through the `context:` argument, as in a standard call to
|
51
|
+
# {Dry::View#call}. However, it is possible to leverage configured
|
52
|
+
# default context while still being able to inject request specific
|
53
|
+
# context. For that to work, a key `:view_context` should be present
|
54
|
+
# in {WebPipe::Conn#bag}. It must be equal to a hash which will be
|
55
|
+
# passed to {Dry::View::Context#with} to create the final context:
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# class MyContext < Dry::View::Context
|
59
|
+
# attr_reader :current_path
|
60
|
+
#
|
61
|
+
# def initialize(current_path: nil, **options)
|
62
|
+
# @current_path = current_path
|
63
|
+
# super
|
64
|
+
# end
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# class SayHelloView < Dry::View
|
68
|
+
# config.paths = [File.join(__dir__, '..', 'templates')]
|
69
|
+
# config.template = 'say_hello'
|
70
|
+
# config.default_context = MyContext.new
|
71
|
+
#
|
72
|
+
# expose :name
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# class App
|
76
|
+
# include WebPipe
|
77
|
+
#
|
78
|
+
# plug :set_view_context
|
79
|
+
# plug :render
|
80
|
+
#
|
81
|
+
# def set_view_context(conn)
|
82
|
+
# conn.put(:view_context, { current_path: conn.full_path })
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# def render(conn)
|
86
|
+
# conn.view(SayHelloView.new, name: 'Joe') # `current_path`
|
87
|
+
# # will be available in the view scope
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# It can be streamline using {WebPipe::Plugs::ViewContext} plug,
|
92
|
+
# which accepts a callable object which should return the request
|
93
|
+
# context from given {WebPipe::Conn}:
|
94
|
+
#
|
95
|
+
# @example
|
96
|
+
# # ...
|
97
|
+
# plug :set_view_context, WebPipe::Plugs::ViewContext[
|
98
|
+
# ->(conn) { { current_path: conn.full_path } }
|
99
|
+
# ]
|
100
|
+
# # ...
|
101
|
+
#
|
102
|
+
# @see https://dry-rb.org/gems/dry-view/
|
103
|
+
class Conn < Dry::Struct
|
104
|
+
# Where to find in {#bag} request's view context
|
105
|
+
VIEW_CONTEXT_KEY = :view_context
|
106
|
+
|
107
|
+
# Default request's view context
|
108
|
+
DEFAULT_VIEW_CONTEXT = Types::EMPTY_HASH
|
109
|
+
|
110
|
+
# Sets string output of a view as response body.
|
111
|
+
#
|
112
|
+
# If the view is not a {Dry::View} instance, it is resolved from
|
113
|
+
# the configured container.
|
114
|
+
#
|
115
|
+
# `kwargs` is used as the input for the view (the arguments that
|
116
|
+
# {Dry::View#call} receives). If they doesn't contain an explicit
|
117
|
+
# `context:` key, it can be added through the injection injection
|
118
|
+
# of what is present in bag's `:view_context`.(see
|
119
|
+
# {Dry::View::Context#with}).
|
120
|
+
#
|
121
|
+
# @param view_spec [Dry::View, Any]
|
122
|
+
# @param kwargs [Hash] Arguments to pass along to `Dry::View#call`
|
123
|
+
#
|
124
|
+
# @return WebPipe::Conn
|
125
|
+
def view(view_spec, **kwargs)
|
126
|
+
view_instance = view_instance(view_spec)
|
127
|
+
view_input = view_input(kwargs, view_instance)
|
128
|
+
|
129
|
+
set_response_body(
|
130
|
+
view_instance.call(
|
131
|
+
view_input
|
132
|
+
).to_str
|
133
|
+
)
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
def view_instance(view_spec)
|
139
|
+
return view_spec if view_spec.is_a?(Dry::View)
|
140
|
+
|
141
|
+
fetch(:container)[view_spec]
|
142
|
+
end
|
143
|
+
|
144
|
+
def view_input(kwargs, view_instance)
|
145
|
+
return kwargs if kwargs.key?(:context)
|
146
|
+
|
147
|
+
context = view_instance.
|
148
|
+
config.
|
149
|
+
default_context.
|
150
|
+
with(
|
151
|
+
fetch(VIEW_CONTEXT_KEY, DEFAULT_VIEW_CONTEXT)
|
152
|
+
)
|
153
|
+
kwargs.merge(context: context)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'web_pipe/types'
|
2
|
+
require 'web_pipe/extensions/dry_view/dry_view'
|
3
|
+
|
4
|
+
module WebPipe
|
5
|
+
module Plugs
|
6
|
+
# Calls object with conn and puts the result into bag's `:view_context`.
|
7
|
+
#
|
8
|
+
# This is meant to contain a Proc which will be called with the same
|
9
|
+
# {WebPipe::Conn} instance of the operation. It must return
|
10
|
+
# request specific view context as a hash. Ultimately, this will
|
11
|
+
# be provided to {Dry::View::Context#with} before passing the
|
12
|
+
# result along to the view instance.
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
# class App
|
16
|
+
# include WebPipe
|
17
|
+
#
|
18
|
+
# ViewContext = (conn) -> { { current_path: conn.full_path } }
|
19
|
+
#
|
20
|
+
# plug :view_context, with: WebPipe::Plugs::ViewContext[ViewContext]
|
21
|
+
# plug :render
|
22
|
+
#
|
23
|
+
# def render
|
24
|
+
# view(MyView.new)
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# @see WebPipe::Conn#view
|
29
|
+
module ViewContext
|
30
|
+
def self.[](view_context_proc)
|
31
|
+
Types.Interface(:call)[view_context_proc]
|
32
|
+
lambda do |conn|
|
33
|
+
conn.put(Conn::VIEW_CONTEXT_KEY, view_context_proc.(conn))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/web_pipe/plug.rb
CHANGED
@@ -16,7 +16,7 @@ module WebPipe
|
|
16
16
|
# - Otherwise, spec is taken as the key to resolve the operation
|
17
17
|
# from the `container`.
|
18
18
|
#
|
19
|
-
# @private
|
19
|
+
# @api private
|
20
20
|
class Plug
|
21
21
|
# Error raised when no operation can be resolved from a {Spec}.
|
22
22
|
class InvalidPlugError < ArgumentError
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'web_pipe/types'
|
2
|
+
|
3
|
+
module WebPipe
|
4
|
+
module Plugs
|
5
|
+
# Sets a container into bag's `:container` key.
|
6
|
+
#
|
7
|
+
# Given container is check to respond to `#[]` method, which is
|
8
|
+
# meant to be used to resolve dependencies.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# class App
|
12
|
+
# include WebPipe
|
13
|
+
#
|
14
|
+
# Cont = { name: SomeDependency.new }.freeze
|
15
|
+
#
|
16
|
+
# plug :container, with: WebPipe::Plugs::Container[Cont]
|
17
|
+
# plug :resolve
|
18
|
+
#
|
19
|
+
# private
|
20
|
+
#
|
21
|
+
# def resolve(conn)
|
22
|
+
# conn.put(:dependency, conn.fetch(:container)[:name])
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
module Container
|
26
|
+
def self.[](container)
|
27
|
+
->(conn) { conn.put(:container, Types::Container[container]) }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'web_pipe/types'
|
4
|
+
|
5
|
+
module WebPipe
|
6
|
+
module Plugs
|
7
|
+
# Sets `Content-Type` response header.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# class App
|
11
|
+
# include WebPipe
|
12
|
+
#
|
13
|
+
# plug :html, with: WebPipe::Plugs::ContentType['text/html']
|
14
|
+
# end
|
15
|
+
module ContentType
|
16
|
+
# Content-Type header
|
17
|
+
HEADER = 'Content-Type'
|
18
|
+
|
19
|
+
def self.[](content_type)
|
20
|
+
->(conn) { conn.add_response_header(HEADER, content_type) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -7,13 +7,13 @@ module WebPipe
|
|
7
7
|
module Rack
|
8
8
|
# Helper to build and call a rack application with middlewares.
|
9
9
|
#
|
10
|
-
# @private
|
10
|
+
# @api private
|
11
11
|
class AppWithMiddlewares
|
12
12
|
# Type for a rack application.
|
13
13
|
#
|
14
14
|
# It should be something callable accepting a rack env and
|
15
15
|
# returning a rack response.
|
16
|
-
App = Types.
|
16
|
+
App = Types.Interface(:call)
|
17
17
|
|
18
18
|
# @!attribute [r] rack_middlewares
|
19
19
|
# @return [Array<RackMiddleware>]
|
data/lib/web_pipe/types.rb
CHANGED
@@ -1,31 +1,12 @@
|
|
1
1
|
require 'dry/types'
|
2
|
+
require 'dry/core/constants'
|
2
3
|
|
3
4
|
module WebPipe
|
4
5
|
# Namespace for generic library types.
|
5
6
|
module Types
|
6
7
|
include Dry.Types()
|
8
|
+
include Dry::Core::Constants
|
7
9
|
|
8
|
-
|
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(:[])
|
10
|
+
Container = Interface(:[])
|
30
11
|
end
|
31
12
|
end
|
data/lib/web_pipe/version.rb
CHANGED
data/web_pipe.gemspec
CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
|
38
38
|
spec.add_runtime_dependency "rack", "~> 2.0"
|
39
39
|
spec.add_runtime_dependency "dry-monads", "~> 1.2"
|
40
|
-
spec.add_runtime_dependency "dry-types", "~> 1.
|
40
|
+
spec.add_runtime_dependency "dry-types", "~> 1.1"
|
41
41
|
spec.add_runtime_dependency "dry-struct", "~> 1.0"
|
42
42
|
spec.add_runtime_dependency "dry-initializer", "~> 3.0"
|
43
43
|
|
@@ -45,7 +45,8 @@ Gem::Specification.new do |spec|
|
|
45
45
|
spec.add_development_dependency "rake", "~> 10.0"
|
46
46
|
spec.add_development_dependency "rspec", "~> 3.0"
|
47
47
|
spec.add_development_dependency "rack-test", "~> 1.1"
|
48
|
-
spec.add_development_dependency "yard", "~> 0.9"
|
48
|
+
spec.add_development_dependency "yard", "~> 0.9", ">= 0.9.20"
|
49
49
|
spec.add_development_dependency "redcarpet", "~> 3.4"
|
50
50
|
spec.add_development_dependency "pry-byebug"
|
51
|
+
spec.add_development_dependency "dry-view", "~> 0.7"
|
51
52
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web_pipe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Busqué
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05
|
11
|
+
date: 2019-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.1'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
54
|
+
version: '1.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: dry-struct
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,6 +143,9 @@ dependencies:
|
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0.9'
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: 0.9.20
|
146
149
|
type: :development
|
147
150
|
prerelease: false
|
148
151
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -150,6 +153,9 @@ dependencies:
|
|
150
153
|
- - "~>"
|
151
154
|
- !ruby/object:Gem::Version
|
152
155
|
version: '0.9'
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 0.9.20
|
153
159
|
- !ruby/object:Gem::Dependency
|
154
160
|
name: redcarpet
|
155
161
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,6 +184,20 @@ dependencies:
|
|
178
184
|
- - ">="
|
179
185
|
- !ruby/object:Gem::Version
|
180
186
|
version: '0'
|
187
|
+
- !ruby/object:Gem::Dependency
|
188
|
+
name: dry-view
|
189
|
+
requirement: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - "~>"
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0.7'
|
194
|
+
type: :development
|
195
|
+
prerelease: false
|
196
|
+
version_requirements: !ruby/object:Gem::Requirement
|
197
|
+
requirements:
|
198
|
+
- - "~>"
|
199
|
+
- !ruby/object:Gem::Version
|
200
|
+
version: '0.7'
|
181
201
|
description:
|
182
202
|
email:
|
183
203
|
- marc@lamarciana.com
|
@@ -208,7 +228,12 @@ files:
|
|
208
228
|
- lib/web_pipe/dsl/class_context.rb
|
209
229
|
- lib/web_pipe/dsl/dsl_context.rb
|
210
230
|
- lib/web_pipe/dsl/instance_methods.rb
|
231
|
+
- lib/web_pipe/extensions/dry_view/dry_view.rb
|
232
|
+
- lib/web_pipe/extensions/dry_view/plugs/view_context.rb
|
211
233
|
- lib/web_pipe/plug.rb
|
234
|
+
- lib/web_pipe/plugs.rb
|
235
|
+
- lib/web_pipe/plugs/container.rb
|
236
|
+
- lib/web_pipe/plugs/content_type.rb
|
212
237
|
- lib/web_pipe/rack/app_with_middlewares.rb
|
213
238
|
- lib/web_pipe/rack/middleware.rb
|
214
239
|
- lib/web_pipe/types.rb
|