web_pipe 0.15.1 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +10 -0
  4. data/README.md +13 -10
  5. data/docs/building_a_rack_application.md +1 -1
  6. data/docs/composing_applications.md +4 -4
  7. data/docs/connection_struct/configuring_the_connection_struct.md +4 -4
  8. data/docs/connection_struct/halting_the_pipe.md +17 -19
  9. data/docs/connection_struct/sharing_data_downstream.md +9 -8
  10. data/docs/connection_struct.md +22 -19
  11. data/docs/design_model.md +10 -9
  12. data/docs/dsl_free_usage.md +85 -14
  13. data/docs/extensions/container.md +9 -10
  14. data/docs/extensions/cookies.md +4 -2
  15. data/docs/extensions/dry_schema.md +5 -4
  16. data/docs/extensions/flash.md +9 -11
  17. data/docs/extensions/hanami_view.md +10 -14
  18. data/docs/extensions/params.md +6 -4
  19. data/docs/extensions/rails.md +28 -34
  20. data/docs/extensions/redirect.md +5 -4
  21. data/docs/extensions/router_params.md +5 -5
  22. data/docs/extensions/session.md +4 -4
  23. data/docs/extensions/url.md +6 -6
  24. data/docs/extensions.md +5 -6
  25. data/docs/introduction.md +7 -7
  26. data/docs/plugging_operations/composing_operations.md +3 -3
  27. data/docs/plugging_operations/injecting_operations.md +4 -4
  28. data/docs/plugging_operations/inspecting_operations.md +1 -2
  29. data/docs/plugging_operations/resolving_operations.md +3 -3
  30. data/docs/plugging_operations.md +3 -3
  31. data/docs/plugs/config.md +1 -1
  32. data/docs/plugs/content_type.md +2 -1
  33. data/docs/plugs.md +6 -7
  34. data/docs/recipes/hanami_2_and_dry_rb_integration.md +12 -0
  35. data/docs/recipes/hanami_router_integration.md +3 -1
  36. data/docs/recipes/using_all_restful_methods.md +6 -5
  37. data/docs/using_rack_middlewares/composing_middlewares.md +2 -3
  38. data/docs/using_rack_middlewares/injecting_middlewares.md +6 -6
  39. data/docs/using_rack_middlewares/inspecting_middlewares.md +7 -6
  40. data/docs/using_rack_middlewares.md +6 -6
  41. data/lib/web_pipe/app.rb +22 -25
  42. data/lib/web_pipe/conn.rb +0 -1
  43. data/lib/web_pipe/conn_support/builder.rb +0 -7
  44. data/lib/web_pipe/conn_support/composition.rb +3 -26
  45. data/lib/web_pipe/conn_support/errors.rb +5 -5
  46. data/lib/web_pipe/conn_support/headers.rb +1 -50
  47. data/lib/web_pipe/conn_support/types.rb +3 -3
  48. data/lib/web_pipe/dsl/builder.rb +10 -19
  49. data/lib/web_pipe/dsl/class_context.rb +15 -40
  50. data/lib/web_pipe/dsl/instance_context.rb +53 -0
  51. data/lib/web_pipe/extensions/container/container.rb +2 -15
  52. data/lib/web_pipe/extensions/cookies/cookies.rb +2 -31
  53. data/lib/web_pipe/extensions/dry_schema/dry_schema.rb +2 -56
  54. data/lib/web_pipe/extensions/flash/flash.rb +2 -32
  55. data/lib/web_pipe/extensions/hanami_view/hanami_view.rb +2 -93
  56. data/lib/web_pipe/extensions/not_found/not_found.rb +2 -40
  57. data/lib/web_pipe/extensions/params/params.rb +2 -63
  58. data/lib/web_pipe/extensions/rails/rails.rb +2 -119
  59. data/lib/web_pipe/extensions/redirect/redirect.rb +2 -20
  60. data/lib/web_pipe/extensions/router_params/router_params.rb +1 -39
  61. data/lib/web_pipe/extensions/session/session.rb +2 -25
  62. data/lib/web_pipe/extensions/url/url.rb +2 -5
  63. data/lib/web_pipe/pipe.rb +229 -0
  64. data/lib/web_pipe/plug.rb +30 -75
  65. data/lib/web_pipe/plugs/config.rb +0 -2
  66. data/lib/web_pipe/plugs/content_type.rb +0 -2
  67. data/lib/web_pipe/rack_support/app_with_middlewares.rb +3 -26
  68. data/lib/web_pipe/rack_support/middleware.rb +2 -2
  69. data/lib/web_pipe/rack_support/middleware_specification.rb +17 -55
  70. data/lib/web_pipe/types.rb +1 -3
  71. data/lib/web_pipe/version.rb +1 -1
  72. data/lib/web_pipe.rb +77 -21
  73. data/web_pipe.gemspec +1 -0
  74. metadata +7 -6
  75. data/docs/recipes/dry_rb_integration.md +0 -17
  76. data/lib/web_pipe/dsl/dsl_context.rb +0 -85
  77. data/lib/web_pipe/dsl/instance_methods.rb +0 -114
data/lib/web_pipe/plug.rb CHANGED
@@ -5,118 +5,73 @@ require 'web_pipe/types'
5
5
  require 'web_pipe/conn_support/composition'
6
6
 
7
7
  module WebPipe
8
- # A plug is a specification to resolve a callable object.
9
- #
10
- # It is initialized with a {Name} and a {Spec} and, on resolution
11
- # time, is called with a {Types::Container} and an {Object} to act
12
- # in the following fashion:
13
- #
14
- # - When the spec responds to `#call`, it is returned itself as the
15
- # callable object.
16
- # - When the spec is `nil`, then a {Proc} wrapping a method with the
17
- # plug name in `object` is returned.
18
- # - Otherwise, spec is taken as the key to resolve the operation
19
- # from the `container`.
20
- #
21
8
  # @api private
22
9
  class Plug < Dry::Struct
23
- # Error raised when no operation can be resolved from a {Spec}.
10
+ # Raised when the specification for an operation is invalid.
24
11
  class InvalidPlugError < ArgumentError
25
- # @param name [Any] Name for the plug that can't be resolved
26
12
  def initialize(name)
27
13
  super(
28
14
  <<~MSG
29
- Plug with name +#{name}+ is invalid. It must be something
30
- callable, an instance method when no operation is given,
31
- or something callable registered in the container."
15
+ Plug with name +#{name}+ can't be resolved. You must provide
16
+ something responding to `#call` or `#to_proc`, or a key for
17
+ something registered in the container obeying those exact
18
+ constraints. If nothing is given, it's expected to be a method
19
+ defined in the context object.
32
20
  MSG
33
21
  )
34
22
  end
35
23
  end
36
-
37
- # Type for the name of a plug.
38
24
  Name = Types::Strict::Symbol.constructor(&:to_sym)
39
25
 
40
- # Type for the spec to resolve and
41
- # {ConnSupport::Composition::Operation} on a {Conn} used by
42
- # {Plug}.
43
- Spec = ConnSupport::Composition::Operation |
26
+ Spec = Types.Interface(:call) |
27
+ Types.Interface(:to_proc) |
44
28
  Types.Constant(nil) |
45
29
  Types::Strict::String |
46
30
  Types::Strict::Symbol
47
31
 
48
- # Type for an instance of self.
49
- Instance = Types.Instance(self)
50
-
51
- # Schema expected to inject plugs.
52
- #
53
- # @see #inject_and_resolve
54
32
  Injections = Types::Strict::Hash.map(
55
- Plug::Name, Plug::Spec
33
+ Name, Spec
56
34
  ).default(Types::EMPTY_HASH)
57
35
 
58
- # @!attribute [r] name
59
- # @return [Name[]]
60
36
  attribute :name, Name
61
37
 
62
- # @!attribute [r] spec
63
- # @return [Spec[]]
64
38
  attribute :spec, Spec
65
39
 
66
- # Creates a new instance with given `spec` but keeping `name`.
67
- #
68
- # @param new_spec [Spec[]]
69
- # @return [self]
70
40
  def with(new_spec)
71
41
  new(spec: new_spec)
72
42
  end
73
43
 
74
- # Resolves the operation.
75
- #
76
- # @param container [Types::Container[]]
77
- # @param object [Object]
78
- #
79
- # @return [ConnSupport::Composition::Operation[]]
80
- # @raise [InvalidPlugError] When nothing callable is resolved.
81
- def call(container, pipe)
82
- if spec.respond_to?(:call)
44
+ # rubocop:disable Metrics/MethodLength
45
+ # rubocop:disable Metrics/AbcSize
46
+ def call(container, context)
47
+ if spec.respond_to?(:to_proc) && !spec.is_a?(Symbol)
48
+ spec.to_proc
49
+ elsif spec.respond_to?(:call)
83
50
  spec
84
51
  elsif spec.nil?
85
- pipe.method(name)
86
- elsif container[spec].respond_to?(:call)
87
- container[spec]
52
+ context.method(name)
53
+ elsif container[spec]
54
+ with(container[spec]).call(container, context)
88
55
  else
89
56
  raise InvalidPlugError, name
90
57
  end
91
58
  end
59
+ # rubocop:enable Metrics/MethodLength
60
+ # rubocop:enable Metrics/AbcSize
92
61
 
93
- # Change `plugs` spec's present in `injections` and resolves.
94
- #
95
- # @param plugs [Array<Plug>]
96
- # @param injections [InstanceMethods::PlugInjections[]]
97
- # @container container [Types::Container[]]
98
- # @object [Object]
99
- #
100
- # @return [Hash<Name[], ConnSupport::Composition::Operation[]>]
101
- def self.inject_and_resolve(plugs, injections, container, object)
102
- Hash[
103
- plugs.map do |plug|
104
- inject_and_resolve_plug(plug, injections, container, object)
105
- end
106
- ]
62
+ def self.inject(plugs, injections)
63
+ plugs.map do |plug|
64
+ inject_plug(plug, injections)
65
+ end
107
66
  end
108
67
 
109
- def self.inject_and_resolve_plug(plug, injections, container, object)
68
+ def self.inject_plug(plug, injections)
110
69
  name = plug.name
111
- [
112
- name,
113
- if injections.key?(name)
114
- plug.with(injections[name])
115
- else
116
- plug
117
- end.call(container, object)
118
- ]
70
+ if injections.key?(name)
71
+ plug.with(injections[name])
72
+ else
73
+ plug
74
+ end
119
75
  end
120
- private_class_method :inject_and_resolve_plug
121
76
  end
122
77
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'web_pipe/types'
4
-
5
3
  module WebPipe
6
4
  module Plugs
7
5
  # Adds given pairs to {Conn#config}.
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'web_pipe/types'
4
-
5
3
  module WebPipe
6
4
  module Plugs
7
5
  # Sets `Content-Type` response header.
@@ -1,43 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'web_pipe/types'
4
3
  require 'web_pipe/rack_support/middleware'
5
4
  require 'rack'
6
5
 
7
6
  module WebPipe
8
7
  module RackSupport
9
- # Helper to build and call a rack application with middlewares.
10
- #
11
8
  # @api private
12
9
  class AppWithMiddlewares
13
- # Type for a rack application.
14
- #
15
- # It should be something callable accepting a rack env and
16
- # returning a rack response.
17
- App = Types.Interface(:call)
18
-
19
- # @!attribute [r] rack_middlewares
20
- # @return [Array<RackMiddleware>]
21
- attr_reader :rack_middlewares
22
-
23
- # @!attribute [r] app
24
- # @return [App[]]
25
- attr_reader :app
26
-
27
- # @return [Rack::Builder]
28
- attr_reader :builder
10
+ attr_reader :rack_middlewares, :app, :builder
29
11
 
30
12
  def initialize(rack_middlewares, app)
31
- @rack_middlewares = Types.Array(Middleware)[rack_middlewares]
32
- @app = App[app]
13
+ @rack_middlewares = rack_middlewares
14
+ @app = app
33
15
  @builder = build_rack_app(rack_middlewares, app)
34
16
  end
35
17
 
36
- # Calls rack application.
37
- #
38
- # @param env [Hash] Rack env
39
- #
40
- # @return [Array] Rack resonse
41
18
  def call(env)
42
19
  builder.call(env)
43
20
  end
@@ -5,10 +5,10 @@ require 'dry/struct'
5
5
 
6
6
  module WebPipe
7
7
  module RackSupport
8
+ # Wrapper for a rack middleware.
9
+ #
8
10
  # Simple data structure to represent a rack middleware class with
9
11
  # its initialization options.
10
- #
11
- # @api private
12
12
  class Middleware < Dry::Struct
13
13
  # Type for a rack middleware class.
14
14
  MiddlewareClass = Types.Instance(Class)
@@ -6,83 +6,45 @@ require 'web_pipe/types'
6
6
 
7
7
  module WebPipe
8
8
  module RackSupport
9
- # Specification on how to resolve {Rack::Middleware}'s.
10
- #
11
- # Rack middlewares can be specified in two ways:
12
- #
13
- # - As an array where fist element is a rack middleware class
14
- # while the rest of elements are its initialization options.
15
- # - A single element array where it is an instance of a class
16
- # including {WebPipe}. This specifies all {RackSupport::Middlewares} for
17
- # that {WebPipe}.
9
+ # @api private
18
10
  class MiddlewareSpecification < Dry::Struct
19
- # Type for the name given to a middleware.
20
11
  Name = Types::Strict::Symbol.constructor(&:to_sym)
21
12
 
22
- # Poor type for the specification to resolve a rack middleware.
23
13
  Spec = Types::Strict::Array
24
14
 
25
- # Schema expected to inject middleware specifications.
26
- #
27
- # @see #inject_and_resolve
28
15
  Injections = Types::Strict::Hash.map(
29
- RackSupport::MiddlewareSpecification::Name, RackSupport::MiddlewareSpecification::Spec
16
+ Name, Spec
30
17
  ).default(Types::EMPTY_HASH)
31
18
 
32
- # @!attribute [r] name
33
- # @return [Name[]]
34
19
  attribute :name, Name
35
20
 
36
- # @!attribute [r] spec
37
- # @return [Spec[]]
38
21
  attribute :spec, Spec
39
22
 
40
- # Change spec's present in `injections` and resolves.
41
- #
42
- # @param middleware_specifications [Array<MiddlewareSpecification>]
43
- # @param injections [Injections[]]
44
- #
45
- # @return [Hash<Name[], Array<RackSupport::Middleware>]
46
- def self.inject_and_resolve(middleware_specifications, injections)
47
- Hash[
48
- middleware_specifications.map do |middleware_spec|
49
- inject_and_resolve_middleware(middleware_spec, injections)
50
- end
51
- ]
23
+ def self.inject(middleware_specifications, injections)
24
+ middleware_specifications.map do |middleware_spec|
25
+ inject_middleware(middleware_spec, injections)
26
+ end
52
27
  end
53
28
 
54
- def self.inject_and_resolve_middleware(middleware_spec, injections)
29
+ def self.inject_middleware(middleware_spec, injections)
55
30
  name = middleware_spec.name
56
- [
57
- name,
58
- if injections.key?(name)
59
- middleware_spec.with(injections[name])
60
- else
61
- middleware_spec
62
- end.call
63
- ]
31
+ if injections.key?(name)
32
+ middleware_spec.with(injections[name])
33
+ else
34
+ middleware_spec
35
+ end
64
36
  end
65
- private_class_method :inject_and_resolve_middleware
66
37
 
67
- # Resolves {RackSupport::Middlewares} from given specification.
68
- #
69
- # @return [Array<RackSupport::Middleware>]
70
38
  def call
71
- klass = spec[0]
39
+ klass_or_pipe = spec[0]
72
40
  options = spec[1..] || Types::EMPTY_ARRAY
73
- case klass
74
- when WebPipe
75
- klass.middlewares.values
76
- when Class
77
- [Middleware.new(middleware: klass, options: options)]
41
+ if klass_or_pipe.respond_to?(:to_middlewares)
42
+ klass_or_pipe.to_middlewares
43
+ elsif klass_or_pipe.is_a?(Class)
44
+ [Middleware.new(middleware: klass_or_pipe, options: options)]
78
45
  end
79
46
  end
80
47
 
81
- # Returns new instance with {#spec} replaced.
82
- #
83
- # @param new_spec [Spec[]]
84
- #
85
- # @return [MiddlewareSpecification]
86
48
  def with(new_spec)
87
49
  new(spec: new_spec)
88
50
  end
@@ -4,11 +4,9 @@ require 'dry/types'
4
4
  require 'dry/core/constants'
5
5
 
6
6
  module WebPipe
7
- # Namespace for generic library types.
7
+ # Namespace for generic types.
8
8
  module Types
9
9
  include Dry.Types()
10
10
  include Dry::Core::Constants
11
-
12
- Container = Interface(:[])
13
11
  end
14
12
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WebPipe
4
- VERSION = '0.15.1'
4
+ VERSION = '0.16.0'
5
5
  end
data/lib/web_pipe.rb CHANGED
@@ -1,23 +1,83 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'dry/core/extensions'
3
4
  require 'web_pipe/dsl/builder'
4
5
 
5
- # See [the
6
- # README](https://github.com/waiting-for-dev/web_pipe/blob/master/README.md)
7
- # for a general overview of this library.
6
+ # Entry-point for the DSL layer.
7
+ #
8
+ # Including this module into your class adds to it a DSL layer which makes it
9
+ # convenient to interact with an instance of {WebPipe::Pipe} transparently. It
10
+ # means that the DSL is actually an optional layer, and you can achieve
11
+ # everything by using {WebPipe::Pipe} instances.
12
+ #
13
+ # Your class gets access to {WebPipe::DSL::ClassContext::DSL_METHODS} at the
14
+ # class level, while {WebPipe::DSL::InstanceContext::PIPE_METHODS} are available
15
+ # for every instance of it. Both groups of methods are delegating to
16
+ # {WebPipe::Pipe}, so you can look there for documentation.
17
+ #
18
+ # @example
19
+ # class HelloWorld
20
+ # include WebPipe
21
+ #
22
+ # use :runtime, Rack::Runtime
23
+ #
24
+ # plug :content_type do |conn|
25
+ # conn.add_response_header('Content-Type', 'plain/text')
26
+ # end
27
+ #
28
+ # plug :render do |conn|
29
+ # conn.set_response_body('Hello, World!')
30
+ # end
31
+ # end
32
+ #
33
+ # The instance of your class is itself the final rack application. When you
34
+ # initialize it, you have the chance to inject different plugs or middlewares
35
+ # from those defined at the class level.
36
+ #
37
+ # @example
38
+ # HelloWorld.new(
39
+ # middlewares: {
40
+ # runtime: [Class.new do
41
+ # def initialize(app)
42
+ # @app = app
43
+ # end
44
+ #
45
+ # def call(env)
46
+ # status, headers, body = @app.call(env)
47
+ # [status, headers.merge('Injected' => '1'), body]
48
+ # end
49
+ # end]
50
+ # },
51
+ # plugs: {
52
+ # render: ->(conn) { conn.set_response_body('Injected!') }
53
+ # }
54
+ # )
8
55
  module WebPipe
9
56
  extend Dry::Core::Extensions
10
57
 
11
- # Including just delegates to an instance of `Builder`, so
12
- # `Builder#included` is finally called.
58
+ # Called via {Module#include}, makes available web_pipe's DSL.
59
+ #
60
+ # Includes an instance of `Builder`. That means that `Builder#included` is
61
+ # eventually called.
13
62
  def self.included(klass)
14
63
  klass.include(call)
15
64
  end
16
65
 
66
+ # Chained to {Module#include} to make the DSL available and provide options.
67
+ #
68
+ # @param container [#[]] Container from where resolve operations. See
69
+ # {WebPipe::Plug}.
70
+ #
71
+ # @example
72
+ # include WebPipe.call(container: Container)
17
73
  def self.call(**opts)
18
74
  DSL::Builder.new(**opts)
19
75
  end
20
76
 
77
+ register_extension :container do
78
+ require 'web_pipe/extensions/container/container'
79
+ end
80
+
21
81
  register_extension :cookies do
22
82
  require 'web_pipe/extensions/cookies/cookies'
23
83
  end
@@ -27,24 +87,16 @@ module WebPipe
27
87
  require 'web_pipe/extensions/dry_schema/plugs/sanitize_params'
28
88
  end
29
89
 
30
- register_extension :hanami_view do
31
- require 'web_pipe/extensions/hanami_view/hanami_view'
32
- end
33
-
34
- register_extension :container do
35
- require 'web_pipe/extensions/container/container'
36
- end
37
-
38
90
  register_extension :flash do
39
91
  require 'web_pipe/extensions/flash/flash'
40
92
  end
41
93
 
42
- register_extension :router_params do
43
- require 'web_pipe/extensions/router_params/router_params'
94
+ register_extension :hanami_view do
95
+ require 'web_pipe/extensions/hanami_view/hanami_view'
44
96
  end
45
97
 
46
- register_extension :redirect do
47
- require 'web_pipe/extensions/redirect/redirect'
98
+ register_extension :not_found do
99
+ require 'web_pipe/extensions/not_found/not_found'
48
100
  end
49
101
 
50
102
  register_extension :params do
@@ -55,6 +107,14 @@ module WebPipe
55
107
  require 'web_pipe/extensions/rails/rails'
56
108
  end
57
109
 
110
+ register_extension :redirect do
111
+ require 'web_pipe/extensions/redirect/redirect'
112
+ end
113
+
114
+ register_extension :router_params do
115
+ require 'web_pipe/extensions/router_params/router_params'
116
+ end
117
+
58
118
  register_extension :session do
59
119
  require 'web_pipe/extensions/session/session'
60
120
  end
@@ -62,8 +122,4 @@ module WebPipe
62
122
  register_extension :url do
63
123
  require 'web_pipe/extensions/url/url'
64
124
  end
65
-
66
- register_extension :not_found do
67
- require 'web_pipe/extensions/not_found/not_found'
68
- end
69
125
  end
data/web_pipe.gemspec CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.summary = 'Rack application builder through a pipe of operations on an immutable struct.'
14
14
  spec.homepage = 'https://github.com/waiting-for-dev/web_pipe'
15
+ spec.licenses = ['MIT']
15
16
 
16
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
18
  # to allow pushing to a single host or delete this section to allow pushing to any host.
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.15.1
4
+ version: 0.16.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: 2021-09-19 00:00:00.000000000 Z
11
+ date: 2021-11-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-monads
@@ -295,7 +295,7 @@ files:
295
295
  - docs/plugs.md
296
296
  - docs/plugs/config.md
297
297
  - docs/plugs/content_type.md
298
- - docs/recipes/dry_rb_integration.md
298
+ - docs/recipes/hanami_2_and_dry_rb_integration.md
299
299
  - docs/recipes/hanami_router_integration.md
300
300
  - docs/recipes/using_all_restful_methods.md
301
301
  - docs/testing.md
@@ -313,8 +313,7 @@ files:
313
313
  - lib/web_pipe/conn_support/types.rb
314
314
  - lib/web_pipe/dsl/builder.rb
315
315
  - lib/web_pipe/dsl/class_context.rb
316
- - lib/web_pipe/dsl/dsl_context.rb
317
- - lib/web_pipe/dsl/instance_methods.rb
316
+ - lib/web_pipe/dsl/instance_context.rb
318
317
  - lib/web_pipe/extensions/container/container.rb
319
318
  - lib/web_pipe/extensions/cookies/cookies.rb
320
319
  - lib/web_pipe/extensions/dry_schema/dry_schema.rb
@@ -329,6 +328,7 @@ files:
329
328
  - lib/web_pipe/extensions/router_params/router_params.rb
330
329
  - lib/web_pipe/extensions/session/session.rb
331
330
  - lib/web_pipe/extensions/url/url.rb
331
+ - lib/web_pipe/pipe.rb
332
332
  - lib/web_pipe/plug.rb
333
333
  - lib/web_pipe/plugs.rb
334
334
  - lib/web_pipe/plugs/config.rb
@@ -341,7 +341,8 @@ files:
341
341
  - lib/web_pipe/version.rb
342
342
  - web_pipe.gemspec
343
343
  homepage: https://github.com/waiting-for-dev/web_pipe
344
- licenses: []
344
+ licenses:
345
+ - MIT
345
346
  metadata:
346
347
  allowed_push_host: https://rubygems.org
347
348
  homepage_uri: https://github.com/waiting-for-dev/web_pipe
@@ -1,17 +0,0 @@
1
- # dry-rb integration
2
-
3
- `web_pipe` has been designed to integrate smoothly with
4
- [dry-rb](https://dry-rb.org/) ecosystem. It shares same design
5
- principles and it ships with some extensions which even make this
6
- integration tighter (like [`:dry-schema`](../extensions/dry_schema.md)
7
- extension).
8
-
9
- If you want to use `web_pipe` with the rest of dry-rb libraries,
10
- your best bet is to use
11
- [`dry-web-web_pipe`](https://github.com/waiting-for-dev/dry-web-web_pipe)
12
- skeleton generator. It is a fork of
13
- [`dry-web-roda`](https://github.com/dry-rb/dry-web-roda) with
14
- `roda` dependency switched to a combination of `web_pipe` and
15
- [`hanami-router`](https://github.com/hanami/router).
16
-
17
- Look at `dry-web-web_pipe` README for more details.
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'web_pipe'
4
- require 'web_pipe/types'
5
- require 'web_pipe/plug'
6
- require 'web_pipe/rack_support/middleware_specification'
7
-
8
- module WebPipe
9
- module DSL
10
- # Defines the DSL for the pipe class and keeps it state.
11
- #
12
- # This allows adding rack middlewares and plugs at the class
13
- # definition level.
14
- #
15
- # @api private
16
- class DSLContext
17
- # @!attribute middleware_specifications
18
- # @return [Array<RackSupport::MiddlewareSpecifications>]
19
- attr_reader :middleware_specifications
20
-
21
- # @!attribute plugs
22
- # @return [Array<Plug>]
23
- attr_reader :plugs
24
-
25
- def initialize(middleware_specifications, plugs)
26
- @middleware_specifications = Types.Array(
27
- RackSupport::MiddlewareSpecification
28
- )[middleware_specifications]
29
- @plugs = Types.Array(Plug::Instance)[plugs]
30
- end
31
-
32
- # Creates and add rack middleware specifications to the stack.
33
- #
34
- # The spec can be given in two forms:
35
- #
36
- # - As one or two arguments, first one being a
37
- # rack middleware class and second one optionally its
38
- # initialization options.
39
- # - As a {WebPipe} class instance, in which case all its rack
40
- # middlewares will be considered.
41
- #
42
- # @param name [RackSupport::MiddlewareSpecification::Name[]]
43
- # @param spec [RackSupport::MiddlewareSpecification::Spec[]]
44
- #
45
- # @return [Array<RackSupport::Middleware>]
46
- def use(name, *spec)
47
- middleware_specifications << RackSupport::MiddlewareSpecification.new(name: name, spec: spec)
48
- end
49
-
50
- # Creates and adds a plug to the stack.
51
- #
52
- # The spec can be given as a {Plug::Spec}, as a block (which
53
- # is captured into a {Proc}, one of the options for a
54
- # {Plug::Spec} or as a {WebPipe} (in which case all its plugs
55
- # will be composed).
56
- #
57
- # @param name [Plug::Name[]]
58
- # @param spec [Plug::Spec[], WebPipe]
59
- # @param block_spec [Proc]
60
- #
61
- # @return [Array<Plug>]
62
- def plug(name, spec = nil, &block_spec)
63
- plug_spec = if spec.is_a?(WebPipe)
64
- spec.to_proc
65
- elsif spec
66
- spec
67
- else
68
- block_spec
69
- end
70
-
71
- plugs << Plug.new(name: name, spec: plug_spec)
72
- end
73
-
74
- # Adds middlewares and plugs from a WebPipe to respective
75
- # stacks.
76
- #
77
- # @param name [Plug::Name[], Middleware::Name[]]
78
- # @param spec [WebPipe]
79
- def compose(name, spec)
80
- use(name, spec)
81
- plug(name, spec)
82
- end
83
- end
84
- end
85
- end