web_pipe 0.15.1 → 0.16.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.
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
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'web_pipe/types'
4
- require 'web_pipe/conn'
5
- require 'web_pipe/app'
6
- require 'web_pipe/plug'
7
- require 'web_pipe/rack_support/app_with_middlewares'
8
- require 'web_pipe/rack_support/middleware_specification'
9
- require 'web_pipe/conn_support/composition'
10
-
11
- module WebPipe
12
- module DSL
13
- # Instance methods for the pipe.
14
- #
15
- # It is from here that you get the rack application you can route
16
- # to. The initialization phase gives you the chance to inject any
17
- # of the plugs or middlewares, while the instance you get has the
18
- # `#call` method expected by rack.
19
- #
20
- # The pipe state can be accessed through the pipe class, which
21
- # has been configured through {ClassContext}.
22
- #
23
- # @api private
24
- module InstanceMethods
25
- # No injections at all.
26
- EMPTY_INJECTIONS = {
27
- plugs: Types::EMPTY_HASH,
28
- middlewares: Types::EMPTY_HASH
29
- }.freeze
30
-
31
- # Type for how plugs and middlewares should be injected.
32
- Injections = Types::Strict::Hash.schema(
33
- plugs: Plug::Injections,
34
- middlewares: RackSupport::MiddlewareSpecification::Injections
35
- )
36
-
37
- # @!attribute [r] injections [Injections[]]
38
- # Injected plugs and middlewares that allow overriding what
39
- # has been configured.
40
- attr_reader :injections
41
-
42
- # @return [RackSupport::AppWithMiddlewares[]]
43
- attr_reader :rack_app
44
-
45
- # @return [Hash<Plug::Name[], ConnSupport::Composition::Operation[]>]
46
- attr_reader :operations
47
-
48
- # @return [Hash<RackSupport::MiddlewareSpecification::Name[], Array<RackSupport::Middlewares>]
49
- attr_reader :middlewares
50
-
51
- # rubocop:disable Metrics/AbcSize
52
- def initialize(injects = EMPTY_INJECTIONS)
53
- @injections = Injections[injects]
54
- container = self.class.container
55
- @middlewares = RackSupport::MiddlewareSpecification.inject_and_resolve(
56
- self.class.middleware_specifications, injections[:middlewares]
57
- )
58
- @operations = Plug.inject_and_resolve(
59
- self.class.plugs, injections[:plugs], container, self
60
- )
61
- app = App.new(operations.values)
62
- @rack_app = RackSupport::AppWithMiddlewares.new(middlewares.values.flatten, app)
63
- end
64
- # rubocop:enable Metrics/AbcSize
65
-
66
- # Expected interface for rack.
67
- #
68
- # @param env [Hash] Rack env
69
- #
70
- # @return [Array] Rack response
71
- def call(env)
72
- rack_app.call(env)
73
- end
74
-
75
- # Proc for the composition of all operations.
76
- #
77
- # This can be used to plug a {WebPipe} itself as an operation.
78
- #
79
- # @example
80
- # class HtmlApp
81
- # include WebPipe
82
- #
83
- # plug :html
84
- #
85
- # private
86
- #
87
- # def html(conn)
88
- # conn.add_response_header('Content-Type', 'text/html')
89
- # end
90
- # end
91
- #
92
- # class App
93
- # include WebPipe
94
- #
95
- # plug :html, &HtmlApp.new
96
- # plug :body
97
- #
98
- # private
99
- #
100
- # def body(conn)
101
- # conn.set_response_body('Hello, world!')
102
- # end
103
- # end
104
- #
105
- # @see ConnSupport::Composition
106
- def to_proc
107
- ConnSupport::Composition
108
- .new(operations.values)
109
- .method(:call)
110
- .to_proc
111
- end
112
- end
113
- end
114
- end