web_pipe 0.13.0 → 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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/CHANGELOG.md +29 -0
  4. data/Gemfile +2 -2
  5. data/README.md +18 -11
  6. data/docs/building_a_rack_application.md +1 -1
  7. data/docs/composing_applications.md +4 -4
  8. data/docs/connection_struct/configuring_the_connection_struct.md +4 -4
  9. data/docs/connection_struct/halting_the_pipe.md +17 -19
  10. data/docs/connection_struct/sharing_data_downstream.md +9 -8
  11. data/docs/connection_struct.md +22 -19
  12. data/docs/design_model.md +10 -9
  13. data/docs/dsl_free_usage.md +85 -14
  14. data/docs/extensions/container.md +9 -10
  15. data/docs/extensions/cookies.md +4 -2
  16. data/docs/extensions/dry_schema.md +5 -4
  17. data/docs/extensions/flash.md +9 -11
  18. data/docs/extensions/{dry_view.md → hanami_view.md} +20 -22
  19. data/docs/extensions/not_found.md +40 -0
  20. data/docs/extensions/params.md +6 -4
  21. data/docs/extensions/rails.md +31 -38
  22. data/docs/extensions/redirect.md +5 -4
  23. data/docs/extensions/router_params.md +5 -5
  24. data/docs/extensions/session.md +4 -4
  25. data/docs/extensions/url.md +6 -6
  26. data/docs/extensions.md +5 -6
  27. data/docs/introduction.md +7 -7
  28. data/docs/plugging_operations/composing_operations.md +3 -3
  29. data/docs/plugging_operations/injecting_operations.md +4 -4
  30. data/docs/plugging_operations/inspecting_operations.md +24 -0
  31. data/docs/plugging_operations/resolving_operations.md +3 -3
  32. data/docs/plugging_operations.md +3 -3
  33. data/docs/plugs/config.md +1 -1
  34. data/docs/plugs/content_type.md +2 -1
  35. data/docs/plugs.md +6 -7
  36. data/docs/recipes/hanami_2_and_dry_rb_integration.md +12 -0
  37. data/docs/recipes/hanami_router_integration.md +3 -1
  38. data/docs/recipes/using_all_restful_methods.md +6 -5
  39. data/docs/testing.md +64 -0
  40. data/docs/using_rack_middlewares/composing_middlewares.md +2 -3
  41. data/docs/using_rack_middlewares/injecting_middlewares.md +6 -6
  42. data/docs/using_rack_middlewares/inspecting_middlewares.md +35 -0
  43. data/docs/using_rack_middlewares.md +6 -6
  44. data/lib/web_pipe/app.rb +22 -25
  45. data/lib/web_pipe/conn.rb +0 -1
  46. data/lib/web_pipe/conn_support/builder.rb +0 -7
  47. data/lib/web_pipe/conn_support/composition.rb +3 -26
  48. data/lib/web_pipe/conn_support/errors.rb +5 -5
  49. data/lib/web_pipe/conn_support/headers.rb +1 -50
  50. data/lib/web_pipe/conn_support/types.rb +3 -3
  51. data/lib/web_pipe/dsl/builder.rb +10 -19
  52. data/lib/web_pipe/dsl/class_context.rb +15 -40
  53. data/lib/web_pipe/dsl/instance_context.rb +53 -0
  54. data/lib/web_pipe/extensions/container/container.rb +2 -15
  55. data/lib/web_pipe/extensions/cookies/cookies.rb +2 -31
  56. data/lib/web_pipe/extensions/dry_schema/dry_schema.rb +2 -56
  57. data/lib/web_pipe/extensions/flash/flash.rb +2 -32
  58. data/lib/web_pipe/extensions/hanami_view/hanami_view.rb +67 -0
  59. data/lib/web_pipe/extensions/not_found/not_found.rb +26 -0
  60. data/lib/web_pipe/extensions/params/params.rb +2 -63
  61. data/lib/web_pipe/extensions/rails/rails.rb +2 -123
  62. data/lib/web_pipe/extensions/redirect/redirect.rb +2 -20
  63. data/lib/web_pipe/extensions/router_params/router_params.rb +1 -39
  64. data/lib/web_pipe/extensions/session/session.rb +2 -25
  65. data/lib/web_pipe/extensions/url/url.rb +2 -5
  66. data/lib/web_pipe/pipe.rb +229 -0
  67. data/lib/web_pipe/plug.rb +31 -65
  68. data/lib/web_pipe/plugs/config.rb +0 -2
  69. data/lib/web_pipe/plugs/content_type.rb +0 -2
  70. data/lib/web_pipe/rack_support/app_with_middlewares.rb +3 -26
  71. data/lib/web_pipe/rack_support/middleware.rb +2 -2
  72. data/lib/web_pipe/rack_support/middleware_specification.rb +19 -48
  73. data/lib/web_pipe/test_support.rb +28 -0
  74. data/lib/web_pipe/types.rb +1 -3
  75. data/lib/web_pipe/version.rb +1 -1
  76. data/lib/web_pipe.rb +77 -17
  77. data/web_pipe.gemspec +1 -2
  78. metadata +16 -9
  79. data/docs/recipes/dry_rb_integration.md +0 -18
  80. data/lib/web_pipe/dsl/dsl_context.rb +0 -85
  81. data/lib/web_pipe/dsl/instance_methods.rb +0 -114
  82. data/lib/web_pipe/extensions/dry_view/dry_view.rb +0 -158
@@ -4,63 +4,9 @@ require 'web_pipe'
4
4
 
5
5
  WebPipe.load_extensions(:params)
6
6
 
7
- #:nodoc:
7
+ # :nodoc:
8
8
  module WebPipe
9
- # Integration with `dry-schema` validation library.
10
- #
11
- # This extension provides a simple integration with `dry-schema`
12
- # library to streamline param sanitization.
13
- #
14
- # On its own, the library just provides with a
15
- # `Conn#sanitized_params` method, which will return what is set into
16
- # config's `:sanitized_params` key.
17
- #
18
- # This key in config is what will be populated by `SanitizeParams` plug. It
19
- # takes as arguments the `dry-schema` schema that will be applied to
20
- # `Conn#params` and an error handler taking `Conn` instance and the validation
21
- # result:
22
- #
23
- # @example
24
- # require 'web_pipe'
25
- #
26
- # WebPipe.load_extensions(:dry_schema)
27
- #
28
- # class App
29
- # include WebPipe
30
- #
31
- # Schema = Dry::Schema.Params do
32
- # required(:name).filled(:string)
33
- # end
34
- #
35
- # plug :sanitize_params, WebPipe::Plugs::SanitizeParams.(
36
- # Schema,
37
- # ->(conn, result) { ... }
38
- # )
39
- # plug(:do_something_with_params) do |conn|
40
- # DB.persist(:entity, conn.sanitized_params)
41
- # end
42
- # end
43
- #
44
- # A common workflow is applying the same handler for all param
45
- # sanitization across your application. This can be achieved configuring
46
- # a `:param_sanitization_handler` in a upstream operation which can
47
- # be composed downstream from any number of pipes. `SanitizeParams`
48
- # will used configured handler if none is injected as
49
- # argument.
50
- #
51
- # @example
52
- # class App
53
- # plug :sanitization_handler, ->(conn, result) { ... }
54
- # end
55
- #
56
- # class Subapp
57
- # Schema = Dry::Schema.Params { ... }
58
- #
59
- # plug :app, App.new
60
- # plug :sanitize_params, WebPipe::Plugs::SanitizeParams.call(Schema)
61
- # end
62
- #
63
- # @see https://dry-rb.org/gems/dry-schema/
9
+ # See the docs for the extension linked from the README.
64
10
  module DrySchema
65
11
  SANITIZED_PARAMS_KEY = :sanitized_params
66
12
 
@@ -3,39 +3,9 @@
3
3
  require 'web_pipe/conn'
4
4
  require 'web_pipe/conn_support/errors'
5
5
 
6
- #:nodoc:
6
+ # :nodoc:
7
7
  module WebPipe
8
- # Provides with a typical flash messages functionality.
9
- #
10
- # @example
11
- # require 'web_pipe'
12
- # require 'rack/session/cookie'
13
- # require 'rack-flash'
14
- #
15
- # WebPipe.load_extensions(:flash)
16
- #
17
- # class MyApp
18
- # include WebPipe
19
- #
20
- # use :session, Rack::Session::Cookie, secret: 'secret'
21
- # use :flash, Rack::Flash
22
- #
23
- # plug :add_to_flash, ->(conn) { conn.add_flash(:notice, 'Hello world') }
24
- # plug :add_to_flash_now, ->(conn) { conn.add_flash_now(:notice_now, 'Hello world now') }
25
- # end
26
- #
27
- # Usually, you will end up making `conn.flash` available to your view system:
28
- #
29
- # @example
30
- # <div class="notice"><%= flash[:notice] %></div>
31
- #
32
- # For this extension to be used, `Rack::Flash` middleware must be
33
- # added to the stack (gem name is `rack-flash3`. This middleware in
34
- # turns depend on `Rack::Session` middleware.
35
- #
36
- # This extension is a very simple wrapper around `Rack::Flash` API.
37
- #
38
- # @see https://github.com/nakajima/rack-flash
8
+ # See the docs for the extension linked from the README.
39
9
  module Flash
40
10
  RACK_FLASH_KEY = 'x-rack.flash'
41
11
 
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'web_pipe/types'
4
+ require 'web_pipe/conn'
5
+ require 'hanami/view'
6
+
7
+ # :nodoc:
8
+ module WebPipe
9
+ # See the docs for the extension linked from the README.
10
+ module DryView
11
+ # Where to find in {#config} request's view context generator.
12
+ VIEW_CONTEXT_KEY = :view_context
13
+
14
+ # Default request's view context
15
+ DEFAULT_VIEW_CONTEXT = ->(_conn) { Types::EMPTY_HASH }
16
+
17
+ # Sets string output of a view as response body.
18
+ #
19
+ # If the view is not a {Hanami::View} instance, it is resolved from
20
+ # the configured container.
21
+ #
22
+ # `kwargs` is used as the input for the view (the arguments that
23
+ # {Hanami::View#call} receives). If they doesn't contain an explicit
24
+ # `context:` key, it can be added through the injection of the
25
+ # result of a lambda present in context's `:view_context`.(see
26
+ # {Hanami::View::Context#with}).
27
+ #
28
+ # @param view_spec [Hanami::View, Any]
29
+ # @param kwargs [Hash] Arguments to pass along to `Hanami::View#call`
30
+ #
31
+ # @return WebPipe::Conn
32
+ def view(view_spec, **kwargs)
33
+ view_instance = view_instance(view_spec)
34
+ view_input = view_input(kwargs, view_instance)
35
+
36
+ set_response_body(
37
+ view_instance.call(
38
+ **view_input
39
+ ).to_str
40
+ )
41
+ end
42
+
43
+ private
44
+
45
+ def view_instance(view_spec)
46
+ return view_spec if view_spec.is_a?(Hanami::View)
47
+
48
+ fetch_config(:container)[view_spec]
49
+ end
50
+
51
+ def view_input(kwargs, view_instance)
52
+ return kwargs if kwargs.key?(:context)
53
+
54
+ context = view_instance
55
+ .config
56
+ .default_context
57
+ .with(
58
+ **fetch_config(
59
+ VIEW_CONTEXT_KEY, DEFAULT_VIEW_CONTEXT
60
+ ).call(self)
61
+ )
62
+ kwargs.merge(context: context)
63
+ end
64
+ end
65
+
66
+ Conn.include(DryView)
67
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module WebPipe
5
+ # See the docs for the extension linked from the README.
6
+ module NotFound
7
+ # @api private
8
+ RESPONSE_BODY_STEP_CONFIG_KEY = :not_found_body_step
9
+
10
+ # Generates the not-found response
11
+ #
12
+ # @return [WebPipe::Conn::Halted]
13
+ # @see NotFound
14
+ def not_found
15
+ set_status(404)
16
+ .then do |conn|
17
+ response_body_step = conn.fetch_config(RESPONSE_BODY_STEP_CONFIG_KEY,
18
+ ->(c) { c.set_response_body('Not found') })
19
+
20
+ response_body_step.call(conn)
21
+ end.halt
22
+ end
23
+
24
+ Conn.include(NotFound)
25
+ end
26
+ end
@@ -3,70 +3,9 @@
3
3
  require 'web_pipe/types'
4
4
  require 'web_pipe/extensions/params/params/transf'
5
5
 
6
- #:nodoc:
6
+ # :nodoc:
7
7
  module WebPipe
8
- # Adds a {Conn#params} method which can perform any number of
9
- # transformations to the request parameters.
10
- #
11
- # When no transformations are given, {#params} just returns request
12
- # parameters (both GET and POST) as a hash:
13
- #
14
- # @example
15
- # # http://www.example.com?foo=bar
16
- # conn.params #=> { 'foo' => 'bar' }
17
- #
18
- # Further processing can be specified thanks to `dry-transformer` gem (you
19
- # need to add it yourself to the Gemfile). All hash transformations
20
- # in `dry-transformer` are available:
21
- #
22
- # @example
23
- # # http://www.example.com?foo=bar
24
- # conn.params([:deep_symbolize_keys]) #=> { foo: 'bar' }
25
- #
26
- # Extra needed arguments can be provided as an array:
27
- #
28
- # @example
29
- # # http://www.example.com?foo=bar&zoo=zoo
30
- # conn.params([:deep_symbolize_keys, [:reject_keys, [:zoo]]) #=> { foo: 'bar' }
31
- #
32
- # Instead of injecting transformations at the moment `#params` is
33
- # called, you can configure them to be automatically used.
34
- #
35
- # @example
36
- # # http://www.example.com?foo=bar
37
- # conn.
38
- # add_config(:param_transformations, [:deep_symbolize_keys]).
39
- # params #=> { foo: 'bar' }
40
- #
41
- # You can register your own transformation functions:
42
- #
43
- # @example
44
- # # http://www.example.com?foo=bar
45
- # fake = ->(_params) { { fake: :params } }
46
- # WebPipe::Params::Transf.register(:fake, fake)
47
- # conn.params([:fake]) #=> { fake: :params }
48
- #
49
- # Your own transformation functions can depend on the {Conn}
50
- # instance at the moment of execution. For that, just place it as the
51
- # last argument of the function and it will be curried automatically:
52
- #
53
- # @example
54
- # # http://www.example.com?foo=bar
55
- # add_name = ->(params, conn) { params.merge(name: conn.fetch(:name)) }
56
- # WebPipe::Params::Transf.register(:add_name, add_name)
57
- # conn.
58
- # add(:name, 'Joe').
59
- # params([:deep_symbolize_keys, :add_name]) #=> { foo: 'bar', name: 'Joe' }
60
- #
61
- # Inline transformations can also be provided:
62
- #
63
- # @example
64
- # # http://www.example.com?foo=bar
65
- # fake = ->(_params) { { fake: :params } }
66
- # conn.
67
- # params(fake) #=> { fake: :params }
68
- #
69
- # @see https://github.com/dry-rb/dry-transformer
8
+ # See the docs for the extension linked from the README.
70
9
  module Params
71
10
  # Key where configured transformations are set
72
11
  PARAM_TRANSFORMATION_KEY = :param_transformations
@@ -2,130 +2,9 @@
2
2
 
3
3
  require 'web_pipe/conn'
4
4
 
5
- #:nodoc:
5
+ # :nodoc:
6
6
  module WebPipe
7
- # Integrates with Rails framework.
8
- #
9
- # The first two things to keep in mind in order to integrate with Rails is
10
- # that {WebPipe} instances are Rack applications and that rails router can
11
- # perfectly dispatch to a rack application. For example:
12
- #
13
- # ```ruby
14
- # # config/routes.rb
15
- # get '/my_route', to: MyRoute.new
16
- #
17
- # # app/controllers/my_route.rb
18
- # class MyRoute
19
- # include WebPipe
20
- #
21
- # plug :set_response_body
22
- #
23
- # private
24
- #
25
- # def set_response_body(conn)
26
- # conn.set_response_body('Hello, World!')
27
- # end
28
- # end
29
- # ```
30
- #
31
- # In order to do something like the previous example you don't need to enable
32
- # this extension. Notice that rails took care of dispatching the request to
33
- # our {WebPipe} rack application, which was then responsible for generating the
34
- # response. In this case, it used a simple call to
35
- # {WebPipe::Conn#set_response_body}.
36
- #
37
- # It's quite possible that you don't need more than that in terms of rails
38
- # integration. Of course, surely you want something more elaborate to generate
39
- # responses. For that, you can use the view or template system you like. One
40
- # option that will play specially well here is `dry-view`, which integrates
41
- # itself easily with Rails. Furthermore, we have a tailored `dry_view`
42
- # extension.
43
- #
44
- # You need to use `:rails` extension if:
45
- #
46
- # - You want to use `action_view` as rendering system.
47
- # - You want to use rails url helpers from your {WebPipe} application.
48
- # - You want to use controller helpers from your {WebPipe} application.
49
- #
50
- # Rails responsibilities for controlling the request/response cycle and the
51
- # rendering process are a little bit tangled. For this reason, even if you
52
- # want to use {WebPipe} applications instead of Rails controller actions you
53
- # still have to use the typical top `ApplicationController` in order to define
54
- # some behaviour for the view layer:
55
- #
56
- # - Which layout is applied to the template.
57
- # - Which helpers will become available to the templates.
58
- #
59
- # By default, the controller in use is `ActionController::Base`, which means
60
- # that no layout is applied and only built-in helpers (for example,
61
- # `number_as_currency`) are available. You can change it via the
62
- # `:rails_controller` configuration option.
63
- #
64
- # The main method that this extension adds to {WebPipe::Conn} is `#render`,
65
- # which just delegates to the Rails implementation as you'd do in a typical
66
- # rails controller. Remember that you can provide template instance variables
67
- # through the keyword `:assigns`.
68
- #
69
- # ```ruby
70
- # # config/routes.rb
71
- # get '/articles', to: ArticlesIndex.new
72
- #
73
- # # app/controllers/application_controller.rb
74
- # class ApplicationController < ActionController::Base
75
- # # By default uses the layout in `layouts/application`
76
- # end
77
- #
78
- # # app/controllers/articles_index.rb
79
- # require 'web_pipe/plugs/config'
80
- #
81
- #
82
- # WebPipe.load_extensions(:rails) # You can put it in an initializer
83
- #
84
- # class ArticlesIndex
85
- # include WebPipe
86
- #
87
- # plug :config, WebPipe::Plugs::Config.(
88
- # rails_controller: ApplicationController
89
- # )
90
- #
91
- # def render(conn)
92
- # conn.render(
93
- # template: 'articles/index',
94
- # assigns: { articles: Article.all }
95
- # )
96
- # end
97
- # end
98
- # ```
99
- #
100
- # Notice that we used the keyword `template:` instead of taking advantage of
101
- # automatic template lookup. We did that way so that we don't have to create
102
- # also an `ArticlesController`, but it's up to you. In the case of having an
103
- # `ArticlesController` we could just do `conn.render(:index, assigns: {
104
- # articles: Article.all })`.
105
- #
106
- # Besides, this extension provides with two other methods:
107
- #
108
- # - `url_helpers` returns Rails router url helpers.
109
- # - `helpers` returns the associated controller helpers.
110
- #
111
- # In all the examples we have supposed that we are putting {WebPipe}
112
- # applications within `app/controllers/` directory. However, remember you can
113
- # put them wherever you like as long as you respect rails `autoload_paths`.
114
- #
115
- # Here you have a link to a very simple and contrived example of a rails
116
- # application integrating `web_pipe`:
117
- #
118
- # https://github.com/waiting-for-dev/rails-web_pipe
119
- #
120
- # @see https://guides.rubyonrails.org/routing.html#routing-to-rack-applications
121
- # @see https://dry-rb.org/gems/dry-view/
122
- # @see https://github.com/dry-rb/dry-view/tree/master/examples/rails
123
- # @see https://waiting-for-dev.github.io/web_pipe/docs/extensions/dry_view.html
124
- # @see https://api.rubyonrails.org/v6.0.1/classes/ActionController/Renderer.html
125
- # @see https://api.rubyonrails.org/v6.0.1/classes/ActionController/Renderer.html
126
- # @see https://api.rubyonrails.org/v6.0.1/classes/ActionView/Helpers/UrlHelper.html
127
- # @see https://api.rubyonrails.org/classes/ActionController/Helpers.html
128
- # @see https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths
7
+ # See the docs for the extension linked from the README.
129
8
  module Rails
130
9
  def render(*args)
131
10
  set_response_body(
@@ -2,27 +2,9 @@
2
2
 
3
3
  require 'web_pipe/types'
4
4
 
5
- #:nodoc:
5
+ # :nodoc:
6
6
  module WebPipe
7
- # Helper method to create redirect responses.
8
- #
9
- # This extensions adds a {#redirect} method to {Conn} which helps
10
- # setting the `Location` header and the status code needed to
11
- # instruct the browser to perform a redirect. By default, `302`
12
- # status code is used.
13
- #
14
- # @example
15
- # require 'web_pipe'
16
- #
17
- # WebPipe.load_extensions(:redirect)
18
- #
19
- # class MyApp
20
- # include WebPipe
21
- #
22
- # plug(:redirect) do |conn|
23
- # conn.redirect('/', 301)
24
- # end
25
- # end
7
+ # See the docs for the extension linked from the README.
26
8
  module Redirect
27
9
  # Location header
28
10
  LOCATION_HEADER = 'Location'
@@ -6,45 +6,7 @@ require 'web_pipe/types'
6
6
  WebPipe.load_extensions(:params)
7
7
 
8
8
  module WebPipe
9
- # Adds a transformation to merge router params into {Conn#params}.
10
- #
11
- # This extension gives an opportunity for rack routers to modify
12
- # {Conn#params} hash. This is useful so that they can provide *route
13
- # parameters*, which are typically rendered as variables in routes
14
- # definitions (e.g.: `/user/:id/edit`).
15
- #
16
- # It adds a `:router_params` transformation that, when used, will
17
- # merged env's `router.params` in {Conn#params} hash. Choosing this
18
- # name automatically integrates with `hanami-router`.
19
- #
20
- # When using this extension, `:params` extension is automatically enabled.
21
- #
22
- # @example
23
- # require 'web_pipe'
24
- #
25
- # WebPipe.load_extensions(:router_params)
26
- #
27
- # class MyApp
28
- # include WebPipe
29
- #
30
- # plug :config
31
- # plug :get_params
32
- #
33
- # private
34
- #
35
- # def config(conn)
36
- # conn.add_config(:param_transformation, [:router_params])
37
- # end
38
- #
39
- # def get_params(conn)
40
- # # http://example.com/users/1/edit
41
- # conn.params #=> { id: 1 }
42
- # conn
43
- # end
44
- # end
45
- #
46
- # @see WebPipe::Params
47
- # @see https://github.com/hanami/router#string-matching-with-variables
9
+ # See the docs for the extension linked from the README.
48
10
  module RouterParams
49
11
  ROUTER_PARAM_KEY = 'router.params'
50
12
 
@@ -4,32 +4,9 @@ require 'web_pipe/conn'
4
4
  require 'web_pipe/types'
5
5
  require 'rack'
6
6
 
7
- #:nodoc:
7
+ # :nodoc:
8
8
  module WebPipe
9
- # Wrapper around Rack::Session middlewares.
10
- #
11
- # This extension provides with helper methods to retrieve rack
12
- # session and work with it while still being able to chain {Conn}
13
- # method calls.
14
- #
15
- # It requires one of `Rack::Session` middlewares to be present.
16
- #
17
- # @example
18
- # require 'web_pipe'
19
- # require 'rack/session'
20
- #
21
- # WebPipe.load_extensions(:session)
22
- #
23
- # class MyApp
24
- # include WebPipe
25
- #
26
- # use Rack::Session::Cookie, secret: 'top_secret'
27
- #
28
- # plug :add_session, ->(conn) { conn.add_session('foo', 'bar') }
29
- # plug :fetch_session, ->(conn) { conn.add(:foo, conn.fetch_session('foo')) }
30
- # plug :delete_session, ->(conn) { conn.delete_session('foo') }
31
- # plug :clear_session, ->(conn) { conn.clear_session }
32
- # end
9
+ # See the docs for the extension linked from the README.
33
10
  module Session
34
11
  # Type for session keys.
35
12
  SESSION_KEY = Types::Strict::String
@@ -1,11 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- #:nodoc:
3
+ # :nodoc:
4
4
  module WebPipe
5
- # Adds helper methods related to the request URL.
6
- #
7
- # This methods are in fact redundant with the information already
8
- # present in {Conn} struct but, of course, they are very useful.
5
+ # See the docs for the extension linked from the README.
9
6
  module Url
10
7
  # Base part of the URL.
11
8
  #