hanami 1.3.4 → 2.0.0.alpha3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +130 -0
  3. data/FEATURES.md +2 -0
  4. data/README.md +7 -3
  5. data/hanami.gemspec +27 -30
  6. data/lib/hanami/application/autoloader/inflector_adapter.rb +22 -0
  7. data/lib/hanami/application/container/boot/inflector.rb +7 -0
  8. data/lib/hanami/application/container/boot/logger.rb +7 -0
  9. data/lib/hanami/application/container/boot/rack_logger.rb +19 -0
  10. data/lib/hanami/application/container/boot/rack_monitor.rb +12 -0
  11. data/lib/hanami/application/container/boot/settings.rb +7 -0
  12. data/lib/hanami/application/router.rb +59 -0
  13. data/lib/hanami/application/routes.rb +54 -0
  14. data/lib/hanami/application/routing/middleware/stack.rb +89 -0
  15. data/lib/hanami/application/routing/resolver/node.rb +50 -0
  16. data/lib/hanami/application/routing/resolver/trie.rb +59 -0
  17. data/lib/hanami/application/routing/resolver.rb +82 -0
  18. data/lib/hanami/application/settings/dotenv_store.rb +60 -0
  19. data/lib/hanami/application/settings.rb +93 -0
  20. data/lib/hanami/application.rb +344 -175
  21. data/lib/hanami/boot.rb +5 -0
  22. data/lib/hanami/cli/application/cli.rb +40 -0
  23. data/lib/hanami/cli/application/command.rb +47 -0
  24. data/lib/hanami/cli/application/commands/console.rb +81 -0
  25. data/lib/hanami/cli/application/commands.rb +16 -0
  26. data/lib/hanami/cli/base_command.rb +48 -0
  27. data/lib/hanami/cli/commands/command.rb +23 -31
  28. data/lib/hanami/cli/commands/server.rb +63 -14
  29. data/lib/hanami/cli/commands.rb +5 -41
  30. data/lib/hanami/configuration/logger.rb +40 -0
  31. data/lib/hanami/configuration/middleware.rb +9 -29
  32. data/lib/hanami/configuration/null_configuration.rb +14 -0
  33. data/lib/hanami/configuration/router.rb +52 -0
  34. data/lib/hanami/configuration/sessions.rb +50 -0
  35. data/lib/hanami/configuration.rb +141 -185
  36. data/lib/hanami/init.rb +5 -0
  37. data/lib/hanami/server.rb +5 -69
  38. data/lib/hanami/setup.rb +8 -2
  39. data/lib/hanami/slice.rb +167 -0
  40. data/lib/hanami/version.rb +3 -1
  41. data/lib/hanami/web/rack_logger.rb +96 -0
  42. data/lib/hanami.rb +42 -241
  43. metadata +86 -215
  44. data/bin/hanami +0 -6
  45. data/lib/hanami/action/csrf_protection.rb +0 -211
  46. data/lib/hanami/action/routing_helpers.rb +0 -40
  47. data/lib/hanami/app.rb +0 -96
  48. data/lib/hanami/application_configuration.rb +0 -1495
  49. data/lib/hanami/application_name.rb +0 -108
  50. data/lib/hanami/application_namespace.rb +0 -14
  51. data/lib/hanami/assets/asset.rb +0 -72
  52. data/lib/hanami/assets/static.rb +0 -102
  53. data/lib/hanami/cli/commands/assets/precompile.rb +0 -42
  54. data/lib/hanami/cli/commands/assets.rb +0 -16
  55. data/lib/hanami/cli/commands/console.rb +0 -95
  56. data/lib/hanami/cli/commands/db/apply.rb +0 -32
  57. data/lib/hanami/cli/commands/db/console.rb +0 -44
  58. data/lib/hanami/cli/commands/db/create.rb +0 -32
  59. data/lib/hanami/cli/commands/db/drop.rb +0 -32
  60. data/lib/hanami/cli/commands/db/migrate.rb +0 -39
  61. data/lib/hanami/cli/commands/db/prepare.rb +0 -32
  62. data/lib/hanami/cli/commands/db/rollback.rb +0 -59
  63. data/lib/hanami/cli/commands/db/version.rb +0 -32
  64. data/lib/hanami/cli/commands/db.rb +0 -32
  65. data/lib/hanami/cli/commands/destroy/action.rb +0 -137
  66. data/lib/hanami/cli/commands/destroy/app.rb +0 -159
  67. data/lib/hanami/cli/commands/destroy/mailer.rb +0 -74
  68. data/lib/hanami/cli/commands/destroy/migration.rb +0 -51
  69. data/lib/hanami/cli/commands/destroy/model.rb +0 -84
  70. data/lib/hanami/cli/commands/destroy.rb +0 -26
  71. data/lib/hanami/cli/commands/generate/action/action.erb +0 -7
  72. data/lib/hanami/cli/commands/generate/action/action_spec.minitest.erb +0 -11
  73. data/lib/hanami/cli/commands/generate/action/action_spec.rspec.erb +0 -9
  74. data/lib/hanami/cli/commands/generate/action/action_without_view.erb +0 -7
  75. data/lib/hanami/cli/commands/generate/action/view.erb +0 -7
  76. data/lib/hanami/cli/commands/generate/action/view_spec.minitest.erb +0 -12
  77. data/lib/hanami/cli/commands/generate/action/view_spec.rspec.erb +0 -10
  78. data/lib/hanami/cli/commands/generate/action.rb +0 -321
  79. data/lib/hanami/cli/commands/generate/app/application.erb +0 -313
  80. data/lib/hanami/cli/commands/generate/app/favicon.ico +0 -0
  81. data/lib/hanami/cli/commands/generate/app/gitkeep.erb +0 -0
  82. data/lib/hanami/cli/commands/generate/app/layout.erb +0 -7
  83. data/lib/hanami/cli/commands/generate/app/layout_spec.minitest.erb +0 -10
  84. data/lib/hanami/cli/commands/generate/app/layout_spec.rspec.erb +0 -10
  85. data/lib/hanami/cli/commands/generate/app/routes.erb +0 -5
  86. data/lib/hanami/cli/commands/generate/app/template.erb.erb +0 -10
  87. data/lib/hanami/cli/commands/generate/app/template.haml.erb +0 -7
  88. data/lib/hanami/cli/commands/generate/app/template.slim.erb +0 -8
  89. data/lib/hanami/cli/commands/generate/app.rb +0 -243
  90. data/lib/hanami/cli/commands/generate/mailer/mailer.erb +0 -9
  91. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.minitest.erb +0 -7
  92. data/lib/hanami/cli/commands/generate/mailer/mailer_spec.rspec.erb +0 -5
  93. data/lib/hanami/cli/commands/generate/mailer.rb +0 -104
  94. data/lib/hanami/cli/commands/generate/migration/migration.erb +0 -4
  95. data/lib/hanami/cli/commands/generate/migration.rb +0 -41
  96. data/lib/hanami/cli/commands/generate/model/entity.erb +0 -2
  97. data/lib/hanami/cli/commands/generate/model/entity_spec.minitest.erb +0 -5
  98. data/lib/hanami/cli/commands/generate/model/entity_spec.rspec.erb +0 -3
  99. data/lib/hanami/cli/commands/generate/model/migration.erb +0 -10
  100. data/lib/hanami/cli/commands/generate/model/repository.erb +0 -5
  101. data/lib/hanami/cli/commands/generate/model/repository_spec.minitest.erb +0 -5
  102. data/lib/hanami/cli/commands/generate/model/repository_spec.rspec.erb +0 -3
  103. data/lib/hanami/cli/commands/generate/model.rb +0 -125
  104. data/lib/hanami/cli/commands/generate/secret.rb +0 -48
  105. data/lib/hanami/cli/commands/generate.rb +0 -28
  106. data/lib/hanami/cli/commands/new/.env.development.erb +0 -3
  107. data/lib/hanami/cli/commands/new/.env.test.erb +0 -3
  108. data/lib/hanami/cli/commands/new/.gitkeep.erb +0 -0
  109. data/lib/hanami/cli/commands/new/Gemfile.erb +0 -57
  110. data/lib/hanami/cli/commands/new/README.md.erb +0 -33
  111. data/lib/hanami/cli/commands/new/config/boot.erb +0 -2
  112. data/lib/hanami/cli/commands/new/config/environment.erb +0 -49
  113. data/lib/hanami/cli/commands/new/config.ru.erb +0 -3
  114. data/lib/hanami/cli/commands/new/gitignore.erb +0 -4
  115. data/lib/hanami/cli/commands/new/gitignore_with_sqlite.erb +0 -5
  116. data/lib/hanami/cli/commands/new/hanamirc.erb +0 -3
  117. data/lib/hanami/cli/commands/new/lib/project.erb +0 -2
  118. data/lib/hanami/cli/commands/new/minitest/Rakefile.erb +0 -12
  119. data/lib/hanami/cli/commands/new/minitest/features_helper.erb +0 -11
  120. data/lib/hanami/cli/commands/new/minitest/spec_helper.erb +0 -7
  121. data/lib/hanami/cli/commands/new/rspec/Rakefile.erb +0 -9
  122. data/lib/hanami/cli/commands/new/rspec/capybara.erb +0 -8
  123. data/lib/hanami/cli/commands/new/rspec/features_helper.erb +0 -12
  124. data/lib/hanami/cli/commands/new/rspec/rspec.erb +0 -2
  125. data/lib/hanami/cli/commands/new/rspec/spec_helper.erb +0 -103
  126. data/lib/hanami/cli/commands/new/schema.sql.erb +0 -0
  127. data/lib/hanami/cli/commands/new.rb +0 -578
  128. data/lib/hanami/cli/commands/project.rb +0 -421
  129. data/lib/hanami/cli/commands/routes.rb +0 -21
  130. data/lib/hanami/cli/commands/templates.rb +0 -31
  131. data/lib/hanami/cli/commands/version.rb +0 -19
  132. data/lib/hanami/common_logger.rb +0 -109
  133. data/lib/hanami/components/app/assets.rb +0 -59
  134. data/lib/hanami/components/app/controller.rb +0 -74
  135. data/lib/hanami/components/app/routes.rb +0 -59
  136. data/lib/hanami/components/app/view.rb +0 -44
  137. data/lib/hanami/components/component.rb +0 -182
  138. data/lib/hanami/components/components.rb +0 -479
  139. data/lib/hanami/components/routes_inspector.rb +0 -72
  140. data/lib/hanami/components.rb +0 -156
  141. data/lib/hanami/config/cookies.rb +0 -69
  142. data/lib/hanami/config/framework_configuration.rb +0 -43
  143. data/lib/hanami/config/load_paths.rb +0 -46
  144. data/lib/hanami/config/mapper.rb +0 -47
  145. data/lib/hanami/config/routes.rb +0 -20
  146. data/lib/hanami/config/security.rb +0 -110
  147. data/lib/hanami/config/sessions.rb +0 -103
  148. data/lib/hanami/configuration/app.rb +0 -21
  149. data/lib/hanami/early_hints.rb +0 -129
  150. data/lib/hanami/env.rb +0 -69
  151. data/lib/hanami/environment.rb +0 -541
  152. data/lib/hanami/environment_application_configurations.rb +0 -37
  153. data/lib/hanami/frameworks.rb +0 -22
  154. data/lib/hanami/hanamirc.rb +0 -169
  155. data/lib/hanami/mailer/glue.rb +0 -27
  156. data/lib/hanami/middleware_stack.rb +0 -172
  157. data/lib/hanami/rake_helper.rb +0 -78
  158. data/lib/hanami/rake_tasks.rb +0 -3
  159. data/lib/hanami/rendering_policy.rb +0 -95
  160. data/lib/hanami/routes.rb +0 -219
  161. data/lib/hanami/routing/default.rb +0 -32
  162. data/lib/hanami/static.rb +0 -63
  163. data/lib/hanami/templates/default.html.erb +0 -30
  164. data/lib/hanami/templates/welcome.html.erb +0 -52
  165. data/lib/hanami/views/default.rb +0 -37
  166. data/lib/hanami/views/default_template_finder.rb +0 -22
  167. data/lib/hanami/views/null_view.rb +0 -15
  168. data/lib/hanami/welcome.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97ed1063935d45a4613fd2361498251b968a462f4b01df368fbea563903958b7
4
- data.tar.gz: 475fbab907b3f7f09988ac0872da11341133be9606796d8f9cb99ea6a8cea9fe
3
+ metadata.gz: f322cd4a751d83369d2d20f0f209bfb1dca92a78f6a3dd7c4027ea672df84e36
4
+ data.tar.gz: 801be572c3df6e61bfaee8b72f0a164dcbe83216f33c72972c67334f9b2619cf
5
5
  SHA512:
6
- metadata.gz: edeec9fbca157fe6b6a368d7be2a71d622071e5aa0aee19fb23b4180f344c1aaccad5cdf00c488d0cd7fcff04e661338272a19ee9d5a0358893510e3ac0bfa57
7
- data.tar.gz: c52ec459e71ed05d2624a8007a9c7252ab397cf4f496a5b72cd2c4c56d66b88f4d9e33129681a2c9d3876c0ff4bca74be1de2dc63aa5aa25e0966cba1323ab3b
6
+ metadata.gz: 244ab662705c248857bc4d4e3f42b1de6dc92003fb3c8fe6d3cd006194be272d1aac36f570baa319a971dfcdd6f24eb691c270fa57b852fdbc4da863bc1908d1
7
+ data.tar.gz: 3d6b72d227de112fbedefb7f8f6fbcb1e010fb37bf3d97e5826b6fe134dc0facd2a36bba0ad5e2118f731ee2bb1d18ae4f7307377c0fd31e5b81a3e307c56ae0
data/CHANGELOG.md CHANGED
@@ -1,6 +1,136 @@
1
1
  # Hanami
2
2
  The web, with simplicity.
3
3
 
4
+ ## v2.0.0.alpha3 - 2021-11-09
5
+ ### Added
6
+ - [Luca Guidi] Added `Hanami.shutdown` to stop all bootable components in the application container
7
+ - [Tim Riley] Added `component_dir_paths` application setting to allow for components to be loaded from additional directories inside each slice directory. To begin with, this defaults to `%w[actions repositories views]`. Components inside these directories are expected to be namespaced to match the directory name; e.g. given a `main` slice, `slices/main/actions/home.rb` is expected to define `Main::Actions::Home`, and will be registered in the slice container as `"actions.home"`.
8
+
9
+ ### Changed
10
+ - [Tim Riley] A slice's classes can now be defined directly inside `slices/[slice_name]/lib/`; e.g. given a `main` slice, `slices/main/lib/example.rb` is expected to define `Main::Example`, and will be registered in the slice container as `"example"`
11
+ - [Tim Riley] The root `lib/` directory is no longer configured as a component dir, and classes inside `lib/[app_namespace]/` will no longer be auto-registered into the container. If you need to share components, create them in their own slices as appropriate, and import those slices into the other slices that require them.
12
+ - [Tim Riley] `lib/[app_namespace]/` is configured for autoloading, and `lib/` is added to `$LOAD_PATH` to support explicit requires for source files outside `lib/[app_namespace]/`.
13
+ - [Tim Riley] (Internal) Ported `Hanami::Configuration` and related classes to use dry-configurable
14
+ - [Tim Riley] Application inflector can be entirely replaced, if required, via `Hanami::Configuration#inflector=`. Custom inflection rules can still be provided to the default inflector via `Hanami::Configuration#inflections`.
15
+ - [Marc Busqué] App settings are defined within a concrete class rather than an anonymous block, to allow for users to leverage the typical behavior of Ruby classes, such as for defining their own types module to use for coercing setting values. This class also relies on dry-configurable for its settings implementation, so the standard dry-configurable `setting` API is available, such as the `constructor:` and `default:` options.
16
+ ```ruby
17
+ # frozen_string_literal: true
18
+
19
+ require "dry/types"
20
+ require "hanami/application/settings"
21
+
22
+ module TestApp
23
+ class Settings < Hanami::Application::Settings
24
+ # Example usage of a types module (previously not possible inside the anonymous block)
25
+ Types = Dry.Types()
26
+
27
+ setting :session_secret, constructor: Types::String.constrained(min_size: 20)
28
+
29
+ setting :some_bool, constructor: Types::Params::Bool, default: false
30
+ end
31
+ end
32
+ ```
33
+ - [Marc Busqué] Application `settings_loader` and `settings_loader_options` have been replaced with `settings_store`, which is an updated abstraction for providing setting values to work with the new `Hanami::Application::Settings` implementation noted above (see `Application::Settings::DotenvStore` for the default store, which provides the same behavior as previously)
34
+ - [Marc Busqué] Routes are defined within a concrete class rather than an anonymous block, to provide consistency with the settings (noted above), as well a place for additional behavior (in future releases):
35
+ ```ruby
36
+ # frozen_string_literal: true
37
+
38
+ require "hanami/application/routes"
39
+
40
+ module MyApp
41
+ class Routes < Hanami::Application::Routes
42
+ define do
43
+ slice :main, at: "/" do
44
+ root to: "home.show"
45
+ end
46
+ end
47
+ end
48
+ end
49
+ ```
50
+
51
+ ## v2.0.0.alpha2 - 2021-05-04
52
+ ### Added
53
+ - [Luca Guidi] Official support for Ruby: MRI 3.0
54
+ - [Tim Riley] Code autoloading via Zeitwerk
55
+ - [Tim Riley] `Hanami::Application` subclasses generate and configure a `Dry::System::Container`, accessible via `.container` and `AppNamespace::Container`, with several common container methods available directly via the application subclass (e.g. `Bookshelf::Application["foo"]` or `Hanami.application["foo"]`)
56
+ - [Tim Riley] Introduced `Hanami::Application.register_bootable` to register custom components
57
+ - [Tim Riley] Introduced `Hanami::Application.keys` to get the list of resolved components
58
+ - [Tim Riley] Dynamically create an auto-injection mixin (e.g. `Bookshelf::Deps`)
59
+ ```ruby
60
+ # frozen_string_literal: true
61
+
62
+ module Bookshelf
63
+ class CreateThing
64
+ include Deps[service_client: "some_service.client"]
65
+
66
+ def call(attrs)
67
+ # Validate attrs, etc.
68
+ service_client.create(attrs)
69
+ end
70
+ end
71
+ end
72
+ ```
73
+ - [Tim Riley] Introduced application settings. They are accessible via `Hanami.application.settings` in `config/settings.rb`
74
+ - [Tim Riley] Introduced application slices to organise high-level application concerns. Slices are generated based on subdirectories of `slices/`, and map onto corresponding ruby module namespaces, e.g. `slices/main` -> `Main`, with the slice instance itself being `Main::Slice` (as well as being accessible via `Hanami.application.slices[:main]`)
75
+ - [Tim Riley] Each slice generates and configures has its own `Dry::System::Container`, accessible via the slice instance (e.g. `Main::Slice.container`) as well as via its own constant (e.g. `Main::Container`)
76
+ - [Tim Riley] Slice containers automatically import the application container, under the `"application"` namespace
77
+ - [Tim Riley] Allow slice containers to be imported by other slice containers
78
+
79
+ ### Changed
80
+ - [Luca Guidi] Drop support for Ruby: MRI 2.5
81
+ - [Tim Riley] Removed `config.cookies` in favor of `config.actions.cookies`
82
+ - [Tim Riley] Removed `config.sessions` in favor of `config.actions.sessions`
83
+ - [Tim Riley] Removed `config.security` settings
84
+
85
+ ## v2.0.0.alpha1 - 2019-01-30
86
+ ### Added
87
+ - [Luca Guidi] Implemented from scratch `hanami version`
88
+ - [Luca Guidi] Implemented from scratch `hanami server`
89
+ - [Luca Guidi] Main configuration is opinionated: when a setting is not specified in generated code, it uses a framework default.
90
+ - [Luca Guidi] Main configuration setting `environment`: to yield env based settings (e.g. `config.environment(:production) { |c| c.logger = {...} }`)
91
+ - [Luca Guidi] Main configuration setting `base_url`: to set the base URL of the app (e.g. `config.base_url = "https://example.com"`)
92
+ - [Luca Guidi] Main configuration setting `logger`: to set the logger options (e.g. `config.logger = { level: :info, format: :json }`)
93
+ - [Luca Guidi] Main configuration setting `routes`: to set the path to routes file (e.g. `config.routes = "path/to/routes"`)
94
+ - [Luca Guidi] Main configuration setting `cookies`: to set cookies options (e.g. `config.cookies = { max_age: 300 }`)
95
+ - [Luca Guidi] Main configuration setting `sessions`: to set session options (e.g. `config.sessions = :cookie, { secret: "abc" }`)
96
+ - [Luca Guidi] Main configuration setting `default_request_format`: to set the fallback for request format (aka MIME Type) (e.g. `config.default_request_format = :json`)
97
+ - [Luca Guidi] Main configuration setting `default_response_format`: to set the default response format (aka MIME Type) (e.g. `config.default_response_format = :json`)
98
+ - [Luca Guidi] Main configuration setting `middleware` to mount Rack middleware (e.g. `config.middleware.use MyMiddleware, "argument"`)
99
+ - [Luca Guidi] Main configuration setting `security` to set security settings (see below)
100
+ - [Luca Guidi] Main configuration setting `inflections` to configure inflections (e.g. `config.inflections { |i| i.plural "virus", "viruses" }`)
101
+ - [Luca Guidi] Main configuration security setting `x_frame_options`: defaults to `"deny"` (e.g. `config.security.x_frame_options = "sameorigin"`)
102
+ - [Luca Guidi] Main configuration security setting `x_content_type_options`: defaults to `"nosniff"` (e.g. `config.security.x_content_type_options = nil`)
103
+ - [Luca Guidi] Main configuration security setting `x_xss_protection`: defaults to `"1; mode=block"` (e.g. `config.security.x_xss_protection = "1"`)
104
+ - [Luca Guidi] Main configuration security setting `content_security_policy`: defaults to `"form-action 'self'; frame-ancestors 'self'; base-uri 'self'; default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self' https: data:; style-src 'self' 'unsafe-inline' https:; font-src 'self'; object-src 'none'; plugin-types application/pdf; child-src 'self'; frame-src 'self'; media-src 'self'"`
105
+ (e.g. `config.security.content_security_policy[:style_src] += " https://my.cdn.example"` to add another source)
106
+ (e.g. `config.security.content_security_policy[:plugin_types] = nil` to override the settings)
107
+
108
+ ### Changed
109
+ - [Luca Guidi] Drop support for Ruby: MRI 2.3, and 2.4.
110
+ - [Luca Guidi] `Hanami::Application` must be used as superclass for main application under `config/application.rb` (e.g. `Bookshelf::Application`)
111
+ - [Luca Guidi] Main configuration is available at `config/application.rb` instead of `config/enviroment.rb`
112
+ - [Luca Guidi] Removed `Hanami.configure` in favor of main application configuration (e.g. `Bookshelf::Application.config`)
113
+ - [Luca Guidi] Removed DSL syntax for main configuration (from `cookies max_age: 600` to `config.cookies = { max_age: 600 }`)
114
+ - [Luca Guidi] Per enviroment settings must be wrapped in a block (e.g. `config.enviroment(:production) { |c| c.logger = {} }`)
115
+ - [Luca Guidi] Concrete applications are no longer supported (e.g. `Web::Application` in `apps/web/application.rb`)
116
+ - [Luca Guidi] Main routes must be configured at `config/routes.rb`:
117
+ ```ruby
118
+ # frozen_string_literal: true
119
+
120
+ Hanami.application.routes do
121
+ mount :web, at: "/" do
122
+ root to: "home#index"
123
+ end
124
+
125
+ mount :admin, at: "/admin" do
126
+ root to: "home#index"
127
+ end
128
+ end
129
+ ```
130
+ - [Luca Guidi] Per application routes are no longer supported (e.g. `apps/web/config/routes.rb`)
131
+ - [Luca Guidi] Removed `shotgun` and code reloading from the core. Code reloading is implemented by `hanami-reloader` gem.
132
+ - [Luca Guidi] Removed support for `.hanamirc`
133
+
4
134
  ## v1.3.4 - 2021-05-02
5
135
  ### Fixed
6
136
  - [Slava Kardakov] Fix generated `config.ru` `require_relative` statement
data/FEATURES.md CHANGED
@@ -3,6 +3,8 @@
3
3
 
4
4
  ## Features
5
5
 
6
+ ## v2.0.0.alpha1 - 2019-01-30
7
+
6
8
  ## v1.3.3 - 2019-09-20
7
9
 
8
10
  - Standardize file loading for `.env` files (see: https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use)
data/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  The web, with simplicity.
4
4
 
5
+ ## Version
6
+
7
+ **This branch contains the code for `hanami` 2.0.x.**
8
+
5
9
  ## Frameworks
6
10
 
7
11
  Hanami is a **full-stack** Ruby web framework.
@@ -25,14 +29,14 @@ These components are designed to be used independently or together in a Hanami a
25
29
  ## Status
26
30
 
27
31
  [![Gem Version](https://badge.fury.io/rb/hanami.svg)](https://badge.fury.io/rb/hanami)
28
- [![CI](https://github.com/hanami/hanami/workflows/ci/badge.svg?branch=master)](https://github.com/hanami/hanami/actions?query=workflow%3Aci+branch%3Amaster)
29
- [![Test Coverage](https://codecov.io/gh/hanami/hanami/branch/master/graph/badge.svg)](https://codecov.io/gh/hanami/hanami)
32
+ [![CI](https://github.com/hanami/hanami/workflows/ci/badge.svg?branch=main)](https://github.com/hanami/hanami/actions?query=workflow%3Aci+branch%3Amain)
33
+ [![Test Coverage](https://codecov.io/gh/hanami/hanami/branch/main/graph/badge.svg)](https://codecov.io/gh/hanami/hanami)
30
34
  [![Depfu](https://badges.depfu.com/badges/ba000e0f69e6ef1c44cd3038caaa1841/overview.svg)](https://depfu.com/github/hanami/hanami?project=Bundler)
31
35
  [![Inline Docs](http://inch-ci.org/github/hanami/hanami.svg)](http://inch-ci.org/github/hanami/hanami)
32
36
 
33
37
  ## Installation
34
38
 
35
- __Hanami__ supports Ruby (MRI) 2.3+
39
+ __Hanami__ supports Ruby (MRI) 2.6+
36
40
 
37
41
  ```shell
38
42
  gem install hanami
data/hanami.gemspec CHANGED
@@ -1,40 +1,37 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'hanami/version'
5
+ require "hanami/version"
5
6
 
6
- Gem::Specification.new do |spec|
7
- spec.name = 'hanami'
7
+ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
8
+ spec.name = "hanami"
8
9
  spec.version = Hanami::VERSION
9
- spec.authors = ['Luca Guidi']
10
- spec.email = ['me@lucaguidi.com']
11
- spec.summary = 'The web, with simplicity'
12
- spec.description = 'Hanami is a web framework for Ruby'
13
- spec.homepage = 'http://hanamirb.org'
14
- spec.license = 'MIT'
10
+ spec.authors = ["Luca Guidi"]
11
+ spec.email = ["me@lucaguidi.com"]
12
+ spec.summary = "The web, with simplicity"
13
+ spec.description = "Hanami is a web framework for Ruby"
14
+ spec.homepage = "http://hanamirb.org"
15
+ spec.license = "MIT"
15
16
 
16
17
  spec.files = `git ls-files -c -o --exclude-standard -z -- lib/* bin/* LICENSE.md README.md CODE_OF_CONDUCT.md CHANGELOG.md FEATURES.md hanami.gemspec`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test)/})
19
- spec.require_paths = ['lib']
20
- spec.required_ruby_version = '>= 2.3.0'
19
+ spec.require_paths = ["lib"]
20
+ spec.required_ruby_version = ">= 2.6.0"
21
21
 
22
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
22
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
23
23
 
24
- spec.add_dependency 'hanami-utils', '~> 1.3'
25
- spec.add_dependency 'hanami-validations', '>= 1.3', '< 3'
26
- spec.add_dependency 'hanami-router', '~> 1.3'
27
- spec.add_dependency 'hanami-controller', '~> 1.3'
28
- spec.add_dependency 'hanami-view', '~> 1.3'
29
- spec.add_dependency 'hanami-helpers', '~> 1.3'
30
- spec.add_dependency 'hanami-mailer', '~> 1.3'
31
- spec.add_dependency 'hanami-assets', '~> 1.3'
32
- spec.add_dependency 'dry-cli', '~> 0.5'
33
- spec.add_dependency 'concurrent-ruby', '~> 1.0'
34
- spec.add_dependency 'bundler', '>= 1.6', '< 3'
24
+ spec.add_dependency "bundler", ">= 1.16", "< 3"
25
+ spec.add_dependency "dry-configurable", "~> 0.12", ">= 0.12.1"
26
+ spec.add_dependency "dry-core", "~> 0.4"
27
+ spec.add_dependency "dry-inflector", "~> 0.2", ">= 0.2.1"
28
+ spec.add_dependency "dry-monitor"
29
+ spec.add_dependency "dry-system", "~> 0.19", ">= 0.21.0"
30
+ spec.add_dependency "hanami-cli", "~> 2.0.alpha"
31
+ spec.add_dependency "hanami-utils", "~> 2.0.alpha"
32
+ spec.add_dependency "zeitwerk", "~> 2.4"
35
33
 
36
- spec.add_development_dependency 'rspec', '~> 3.7'
37
- spec.add_development_dependency 'rack-test', '~> 1.1'
38
- spec.add_development_dependency 'aruba', '~> 0.14'
39
- spec.add_development_dependency 'rake', '~> 13.0'
34
+ spec.add_development_dependency "rspec", "~> 3.8"
35
+ spec.add_development_dependency "rack-test", "~> 1.1"
36
+ spec.add_development_dependency "rake", "~> 13.0"
40
37
  end
@@ -0,0 +1,22 @@
1
+ module Hanami
2
+ class Application
3
+ module Autoloader
4
+ # Allows the Hanami standard inflector (from dry-inflector) to be used with Zeitwerk
5
+ class InflectorAdapter
6
+ def initialize(inflector)
7
+ @inflector = inflector
8
+ end
9
+
10
+ def camelize(basename, _abspath)
11
+ # Discard unused `_abspath` argument before calling our own inflector's
12
+ # `#camelize` (which takes only one argument)
13
+ inflector.camelize(basename)
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :inflector
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ Hanami.application.register_bootable :inflector do
4
+ start do
5
+ register :inflector, Hanami.application.inflector
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ Hanami.application.register_bootable :logger do
4
+ start do
5
+ register :logger, Hanami.application.configuration.logger_instance
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ Hanami.application.register_bootable :rack_logger do |container|
4
+ start do
5
+ require "hanami/web/rack_logger"
6
+
7
+ use :logger
8
+ use :rack_monitor
9
+
10
+ rack_logger = Hanami::Web::RackLogger.new(
11
+ container[:logger],
12
+ filter_params: Hanami.application.configuration.logger.filter_params
13
+ )
14
+
15
+ rack_logger.attach container[:rack_monitor]
16
+
17
+ register :rack_logger, rack_logger
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ Hanami.application.register_bootable :rack_monitor do |container|
4
+ start do
5
+ require "dry/monitor"
6
+ require "dry/monitor/rack/middleware"
7
+
8
+ middleware = Dry::Monitor::Rack::Middleware.new(container[:notifications])
9
+
10
+ register :rack_monitor, middleware
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ Hanami.application.register_bootable :settings do
4
+ start do
5
+ register :settings, Hanami.application.settings
6
+ end
7
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/router"
4
+ require "hanami/application/routing/middleware/stack"
5
+
6
+ module Hanami
7
+ class Application
8
+ # Hanami application router
9
+ # @since 2.0.0
10
+ class Router < ::Hanami::Router
11
+ # @since 2.0.0
12
+ # @api private
13
+ def initialize(routes:, stack: Routing::Middleware::Stack.new, **kwargs, &blk)
14
+ @stack = stack
15
+ instance_eval(&blk)
16
+ super(**kwargs, &routes)
17
+ end
18
+
19
+ # @since 2.0.0
20
+ # @api private
21
+ def freeze
22
+ return self if frozen?
23
+
24
+ remove_instance_variable(:@stack)
25
+ super
26
+ end
27
+
28
+ # @since 2.0.0
29
+ # @api private
30
+ def use(middleware, *args, &blk)
31
+ @stack.use(middleware, *args, &blk)
32
+ end
33
+
34
+ # @since 2.0.0
35
+ # @api private
36
+ def scope(*args, &blk)
37
+ @stack.with(args.first) do
38
+ super
39
+ end
40
+ end
41
+
42
+ # @since 2.0.0
43
+ def slice(name, at:, &blk)
44
+ path = prefixed_path(at)
45
+ @resolver.register_slice_at_path(name, path)
46
+
47
+ scope(path, &blk)
48
+ end
49
+
50
+ # @since 2.0.0
51
+ # @api private
52
+ def to_rack_app
53
+ return self if @stack.empty?
54
+
55
+ @stack.to_rack_app(self)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ class Application
5
+ # Application routes
6
+ #
7
+ # Users are expected to inherit from this class to define their application
8
+ # routes.
9
+ #
10
+ # @example
11
+ # # config/routes.rb
12
+ # # frozen_string_literal: true
13
+ #
14
+ # require "hanami/application/routes"
15
+ #
16
+ # module MyApp
17
+ # class Routes < Hanami::Application::Routes
18
+ # define do
19
+ # slice :main, at: "/" do
20
+ # root to: "home.show"
21
+ # end
22
+ # end
23
+ # end
24
+ # end
25
+ #
26
+ # See {Hanami::Application::Router} for the syntax allowed within the
27
+ # `define` block.
28
+ #
29
+ # @see Hanami::Application::Router
30
+ # @since 2.0.0
31
+ class Routes
32
+ # Defines application routes
33
+ #
34
+ # @yield DSL syntax to define application routes executed in the context
35
+ # of {Hanami::Application::Router}
36
+ # @returns [Proc]
37
+ def self.define(&block)
38
+ @_routes = block
39
+ end
40
+
41
+ # @api private
42
+ def self.routes
43
+ @_routes || raise(<<~MSG)
44
+ Routes need to be defined before being able to fetch them. E.g.,
45
+ define do
46
+ slice :main, at: "/" do
47
+ root to: "home.show"
48
+ end
49
+ end
50
+ MSG
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rack/builder"
4
+
5
+ module Hanami
6
+ class Application
7
+ module Routing
8
+ # Hanami::Applicatione::Router middleware stack
9
+ #
10
+ # @since 2.0.0
11
+ # @api private
12
+ module Middleware
13
+ # Middleware stack
14
+ #
15
+ # @since 2.0.0
16
+ # @api private
17
+ class Stack
18
+ # @since 2.0.0
19
+ # @api private
20
+ ROOT_PREFIX = "/"
21
+ private_constant :ROOT_PREFIX
22
+
23
+ # @since 2.0.0
24
+ # @api private
25
+ def initialize
26
+ @prefix = ROOT_PREFIX
27
+ @stack = Hash.new { |hash, key| hash[key] = [] }
28
+ end
29
+
30
+ # @since 2.0.0
31
+ # @api private
32
+ def use(middleware, *args, &blk)
33
+ @stack[@prefix].push([middleware, args, blk])
34
+ end
35
+
36
+ # @since 2.0.0
37
+ # @api private
38
+ def with(path)
39
+ prefix = @prefix
40
+ @prefix = path
41
+ yield
42
+ ensure
43
+ @prefix = prefix
44
+ end
45
+
46
+ # @since 2.0.0
47
+ # @api private
48
+ def to_rack_app(app) # rubocop:disable Metrics/MethodLength
49
+ s = self
50
+
51
+ Rack::Builder.new do
52
+ s.each do |prefix, stack|
53
+ s.mapped(self, prefix) do
54
+ stack.each do |middleware, args, blk|
55
+ use(middleware, *args, &blk)
56
+ end
57
+ end
58
+
59
+ run app
60
+ end
61
+ end.to_app
62
+ end
63
+
64
+ # @since 2.0.0
65
+ # @api private
66
+ def empty?
67
+ @stack.empty?
68
+ end
69
+
70
+ # @since 2.0.0
71
+ # @api private
72
+ def each(&blk)
73
+ @stack.each(&blk)
74
+ end
75
+
76
+ # @since 2.0.0
77
+ # @api private
78
+ def mapped(builder, prefix, &blk)
79
+ if prefix == ROOT_PREFIX
80
+ builder.instance_eval(&blk)
81
+ else
82
+ builder.map(prefix, &blk)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ class Application
5
+ module Routing
6
+ class Resolver
7
+ # Endpoint resolver node to register slices in a tree
8
+ #
9
+ # @api private
10
+ # @since 2.0.0
11
+ class Node
12
+ # @api private
13
+ # @since 2.0.0
14
+ attr_reader :slice
15
+
16
+ # @api private
17
+ # @since 2.0.0
18
+ def initialize
19
+ @slice = nil
20
+ @children = {}
21
+ end
22
+
23
+ # @api private
24
+ # @since 2.0.0
25
+ def put(segment)
26
+ @children[segment] ||= self.class.new
27
+ end
28
+
29
+ # @api private
30
+ # @since 2.0.0
31
+ def get(segment)
32
+ @children.fetch(segment) { self if leaf? }
33
+ end
34
+
35
+ # @api private
36
+ # @since 2.0.0
37
+ def leaf!(slice)
38
+ @slice = slice
39
+ end
40
+
41
+ # @api private
42
+ # @since 2.0.0
43
+ def leaf?
44
+ @slice
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/application/routing/resolver/node"
4
+
5
+ module Hanami
6
+ class Application
7
+ module Routing
8
+ class Resolver
9
+ # Endpoint resolver trie to register slices
10
+ #
11
+ # @api private
12
+ # @since 2.0.0
13
+ class Trie
14
+ # @api private
15
+ # @since 2.0.0
16
+ def initialize
17
+ @root = Node.new
18
+ end
19
+
20
+ # @api private
21
+ # @since 2.0.0
22
+ def add(path, name)
23
+ node = @root
24
+ for_each_segment(path) do |segment|
25
+ node = node.put(segment)
26
+ end
27
+
28
+ node.leaf!(name)
29
+ end
30
+
31
+ # @api private
32
+ # @since 2.0.0
33
+ def find(path)
34
+ node = @root
35
+
36
+ for_each_segment(path) do |segment|
37
+ break unless node
38
+
39
+ node = node.get(segment)
40
+ end
41
+
42
+ return node.slice if node&.leaf?
43
+
44
+ nil
45
+ end
46
+
47
+ private
48
+
49
+ # @api private
50
+ # @since 2.0.0
51
+ def for_each_segment(path, &blk)
52
+ _, *segments = path.split(/\//)
53
+ segments.each(&blk)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end