hanami 2.0.0.alpha5 → 2.0.0.alpha7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +141 -0
- data/README.md +2 -6
- data/hanami.gemspec +5 -4
- data/lib/hanami/application/container/{boot → providers}/inflector.rb +1 -1
- data/lib/hanami/application/container/{boot → providers}/logger.rb +1 -1
- data/lib/hanami/application/container/providers/rack_logger.rb +15 -0
- data/lib/hanami/application/container/{boot → providers}/rack_monitor.rb +2 -2
- data/lib/hanami/application/container/{boot → providers}/routes_helper.rb +1 -1
- data/lib/hanami/application/container/{boot → providers}/settings.rb +1 -1
- data/lib/hanami/application/routing/router.rb +1 -1
- data/lib/hanami/application/slice_registrar.rb +106 -0
- data/lib/hanami/application.rb +75 -142
- data/lib/hanami/cli/application/cli.rb +1 -1
- data/lib/hanami/configuration/actions.rb +90 -0
- data/lib/hanami/configuration.rb +4 -23
- data/lib/hanami/constants.rb +23 -0
- data/lib/hanami/errors.rb +12 -0
- data/lib/hanami/{init.rb → prepare.rb} +1 -1
- data/lib/hanami/slice.rb +192 -128
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami/web/rack_logger.rb +27 -51
- data/lib/hanami.rb +15 -7
- metadata +20 -16
- data/lib/hanami/application/autoloader/inflector_adapter.rb +0 -22
- data/lib/hanami/application/container/boot/rack_logger.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8db2d523a265dd089048a2a944ccf8b1d5d46a36d496be5638f4807fe3c451ad
|
4
|
+
data.tar.gz: fe510075e1e4d362e6c6419aab0d0b001eb8bf80329d51f7546f9955abf08cf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1af19f64f99af6997e772e25d49a5e835ea9e8ebac64aaab637fe56a0c91ea1b87d4a13d04b26145b58573d12478bd435183873e4cf7378e2b2046866e9a0fa4
|
7
|
+
data.tar.gz: d7be6b435ac445a23ceb616180493c863715dca8a039a81e2ab3af0aa49d60f73806625909dbee05aad4b1bab77b7b77fc6c94600f937cbe7e5af206f67efa82
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,147 @@
|
|
1
1
|
# Hanami
|
2
2
|
The web, with simplicity.
|
3
3
|
|
4
|
+
## v2.0.0.alpha7.1 - 2020-03-09
|
5
|
+
|
6
|
+
## Fixed
|
7
|
+
- [Tim Riley] Fixed error creating slice classes when the enclosing module did not already exist
|
8
|
+
|
9
|
+
## v2.0.0.alpha7 - 2020-03-08
|
10
|
+
|
11
|
+
## Added
|
12
|
+
- [Tim Riley] Introduced `Hanami::ApplicationLoadError` and `Hanami::SliceLoadError` exceptions to represent errors encountered during application and slice loading.
|
13
|
+
- [Tim Riley] `Hanami::Slice.shutdown` can be used to stop all the providers in a slice
|
14
|
+
|
15
|
+
## Changed
|
16
|
+
- [Tim Riley] Slices are now represented as concrete classes (such as `Main::Slice`) inheriting from `Hanami::Slice`, as opposed to _instances_ of `Hanami::Slice`. You may create your own definitions for these slices in `config/slices/[slice_name].rb`, which you can then use for customising per-slice config and behavior, e.g.
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
# config/slices/main.rb:
|
20
|
+
|
21
|
+
module Main
|
22
|
+
class Slice < Hanami::Slice
|
23
|
+
# slice config here
|
24
|
+
end
|
25
|
+
end
|
26
|
+
```
|
27
|
+
- [Tim Riley] Application-level `config.slice(slice_name, &block)` setting has been removed in favour of slice configuration within concrete slice class definitions
|
28
|
+
- [Tim Riley] You can configure your slice imports inside your slice classes, e.g.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
# config/slices/main.rb:
|
32
|
+
|
33
|
+
module Main
|
34
|
+
class Slice < Hanami::Slice
|
35
|
+
# Import all exported components from "search" slice
|
36
|
+
import from: :search
|
37
|
+
end
|
38
|
+
end
|
39
|
+
```
|
40
|
+
- [Tim Riley] You can configure your slice exports inside your slice classes, e.g.
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
# config/slices/search.rb:
|
44
|
+
|
45
|
+
module Search
|
46
|
+
class Slice < Hanami::Slice
|
47
|
+
# Export the "index_entity" component only
|
48
|
+
export ["index_entity"]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
```
|
52
|
+
- [Tim Riley] For advanced cases, you can configure your slice's container via a `prepare_container` block:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
# config/slices/search.rb:
|
56
|
+
|
57
|
+
module Search
|
58
|
+
class Slice < Hanami::Slice
|
59
|
+
prepare_container do |container|
|
60
|
+
# `container` object is available here, with
|
61
|
+
# slice-specific configuration already applied
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
```
|
66
|
+
- [Tim Riley] `Hanami::Application.shutdown` will now also shutdown all registered slices
|
67
|
+
|
68
|
+
## v2.0.0.alpha6 - 2022-02-10
|
69
|
+
### Added
|
70
|
+
- [Luca Guidi] Official support for Ruby: MRI 3.1
|
71
|
+
- [Tim Riley] Introduce partial Slice imports and exports. It allows to selectively export a functionality from a slice and import into another.
|
72
|
+
|
73
|
+
Import from `search` slice, uses `search` as the imported key namespace:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
# config/application.rb
|
77
|
+
|
78
|
+
module MyApp
|
79
|
+
class Application < Hanami::Application
|
80
|
+
config.slice(:admin) do
|
81
|
+
import(from: :search)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
```
|
86
|
+
|
87
|
+
Import from `search` slice with custom namespace:
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
# config/application.rb
|
91
|
+
|
92
|
+
module MyApp
|
93
|
+
class Application < Hanami::Application
|
94
|
+
config.slice(:admin) do
|
95
|
+
import(from: :search, as: :search_engine)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
```
|
100
|
+
|
101
|
+
Import specific keys from `search` slice
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
# config/application.rb
|
105
|
+
|
106
|
+
module MyApp
|
107
|
+
class Application < Hanami::Application
|
108
|
+
config.slice(:admin) do
|
109
|
+
import(keys: ["run_query"], from: :search)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
```
|
114
|
+
|
115
|
+
Export only specific keys from `search` slice, and import them in `admin`
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
# config/application.rb
|
119
|
+
|
120
|
+
module MyApp
|
121
|
+
class Application < Hanami::Application
|
122
|
+
config.slice(:admin) do
|
123
|
+
import(from: :search)
|
124
|
+
end
|
125
|
+
|
126
|
+
config.slice(:search) do
|
127
|
+
container.config.exports = %w[run_query index_item]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
133
|
+
### Fixed
|
134
|
+
- [Luca Guidi] Ensure request logger to respect logger formatter option.
|
135
|
+
|
136
|
+
### Changed
|
137
|
+
- [Luca Guidi] Drop support for Ruby: MRI 2.6 and 2.7.
|
138
|
+
- [Tim Riley] `Hanami.init` => `Hanami.prepare` and `hanami/init` => `hanami/prepare`
|
139
|
+
- [Tim Riley] `Hanami.register_bootable` => `Hanami.register_provider`
|
140
|
+
- [Tim Riley] `Hanami.start_bootable` => `Hanami.start`
|
141
|
+
- [Tim Riley] `Hanami::Slice#init` => `Hanami::Slice#prepare`
|
142
|
+
- [Tim Riley] `Hanami::Slice#register_bootable` => `Hanami::Slice#register_provider`
|
143
|
+
- [Tim Riley] `Hanami::Slice#start_bootable` => `Hanami::Slice#start`
|
144
|
+
|
4
145
|
## v2.0.0.alpha5 - 2022-01-12
|
5
146
|
### Changed
|
6
147
|
- [Luca Guidi] Sensible default configuration for application logger, with per-environment defaults:
|
data/README.md
CHANGED
@@ -36,7 +36,7 @@ These components are designed to be used independently or together in a Hanami a
|
|
36
36
|
|
37
37
|
## Installation
|
38
38
|
|
39
|
-
__Hanami__ supports Ruby (MRI)
|
39
|
+
__Hanami__ supports Ruby (MRI) 3.0+
|
40
40
|
|
41
41
|
```shell
|
42
42
|
gem install hanami
|
@@ -136,8 +136,4 @@ __Hanami__ uses [Semantic Versioning 2.0.0](http://semver.org)
|
|
136
136
|
|
137
137
|
## Copyright
|
138
138
|
|
139
|
-
Released under MIT License.
|
140
|
-
|
141
|
-
This project was formerly known as Lotus (`lotusrb`).
|
142
|
-
|
143
|
-
Copyright © 2014-2021 Luca Guidi.
|
139
|
+
Copyright © 2014-2022 Hanami Team – Released under MIT License.
|
data/hanami.gemspec
CHANGED
@@ -4,7 +4,7 @@ lib = File.expand_path("../lib", __FILE__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
require "hanami/version"
|
6
6
|
|
7
|
-
Gem::Specification.new do |spec|
|
7
|
+
Gem::Specification.new do |spec|
|
8
8
|
spec.name = "hanami"
|
9
9
|
spec.version = Hanami::VERSION
|
10
10
|
spec.authors = ["Luca Guidi"]
|
@@ -14,10 +14,11 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
|
|
14
14
|
spec.homepage = "http://hanamirb.org"
|
15
15
|
spec.license = "MIT"
|
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.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") # rubocop:disable Layout/LineLength
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
|
-
spec.
|
20
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
21
|
+
spec.required_ruby_version = ">= 3.0"
|
21
22
|
|
22
23
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
23
24
|
|
@@ -26,7 +27,7 @@ Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
|
|
26
27
|
spec.add_dependency "dry-core", "~> 0.4"
|
27
28
|
spec.add_dependency "dry-inflector", "~> 0.2", ">= 0.2.1"
|
28
29
|
spec.add_dependency "dry-monitor"
|
29
|
-
spec.add_dependency "dry-system", "~> 0.
|
30
|
+
spec.add_dependency "dry-system", "~> 0.23", ">= 0.23.0"
|
30
31
|
spec.add_dependency "hanami-cli", "~> 2.0.alpha"
|
31
32
|
spec.add_dependency "hanami-utils", "~> 2.0.alpha"
|
32
33
|
spec.add_dependency "zeitwerk", "~> 2.4"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Hanami.application.register_provider :rack_logger do
|
4
|
+
start do
|
5
|
+
require "hanami/web/rack_logger"
|
6
|
+
|
7
|
+
target.start :logger
|
8
|
+
target.start :rack_monitor
|
9
|
+
|
10
|
+
rack_logger = Hanami::Web::RackLogger.new(target[:logger])
|
11
|
+
rack_logger.attach target[:rack_monitor]
|
12
|
+
|
13
|
+
register :rack_logger, rack_logger
|
14
|
+
end
|
15
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
Hanami.application.
|
3
|
+
Hanami.application.register_provider :rack_monitor do
|
4
4
|
start do
|
5
5
|
require "dry/monitor"
|
6
6
|
require "dry/monitor/rack/middleware"
|
7
7
|
|
8
|
-
middleware = Dry::Monitor::Rack::Middleware.new(
|
8
|
+
middleware = Dry::Monitor::Rack::Middleware.new(target[:notifications])
|
9
9
|
|
10
10
|
register :rack_monitor, middleware
|
11
11
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../constants"
|
4
|
+
require_relative "../slice"
|
5
|
+
|
6
|
+
module Hanami
|
7
|
+
class Application
|
8
|
+
# @api private
|
9
|
+
class SliceRegistrar
|
10
|
+
attr_reader :application, :slices
|
11
|
+
private :application, :slices
|
12
|
+
|
13
|
+
def initialize(application)
|
14
|
+
@application = application
|
15
|
+
@slices = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def register(name, slice_class = nil, &block)
|
19
|
+
if slices.key?(name.to_sym)
|
20
|
+
raise SliceLoadError, "Slice '#{name}' is already registered"
|
21
|
+
end
|
22
|
+
|
23
|
+
# TODO: raise error unless name meets format (i.e. single level depth only)
|
24
|
+
|
25
|
+
slices[name.to_sym] = slice_class || build_slice(name, &block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](name)
|
29
|
+
slices.fetch(name) do
|
30
|
+
raise SliceLoadError, "Slice '#{name}' not found"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def freeze
|
35
|
+
slices.freeze
|
36
|
+
super
|
37
|
+
end
|
38
|
+
|
39
|
+
def load_slices
|
40
|
+
slice_configs = Dir[root.join(CONFIG_DIR, "slices", "*#{RB_EXT}")]
|
41
|
+
.map { |file| File.basename(file, RB_EXT) }
|
42
|
+
|
43
|
+
slice_dirs = Dir[File.join(root, SLICES_DIR, "*")]
|
44
|
+
.select { |path| File.directory?(path) }
|
45
|
+
.map { |path| File.basename(path) }
|
46
|
+
|
47
|
+
(slice_dirs + slice_configs).uniq.sort.each do |slice_name|
|
48
|
+
load_slice(slice_name)
|
49
|
+
end
|
50
|
+
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
def each(&block)
|
55
|
+
slices.each_value(&block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_a
|
59
|
+
slices.values
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Attempts to load a slice class defined in `config/slices/[slice_name].rb`, then
|
65
|
+
# registers the slice with the matching class, if found.
|
66
|
+
def load_slice(slice_name)
|
67
|
+
slice_const_name = inflector.camelize(slice_name)
|
68
|
+
slice_require_path = root.join("config", "slices", slice_name).to_s
|
69
|
+
|
70
|
+
begin
|
71
|
+
require(slice_require_path)
|
72
|
+
rescue LoadError => e
|
73
|
+
raise e unless e.path == slice_require_path
|
74
|
+
end
|
75
|
+
|
76
|
+
slice_class =
|
77
|
+
begin
|
78
|
+
inflector.constantize("#{slice_const_name}::Slice")
|
79
|
+
rescue NameError # rubocop:disable Lint/SuppressedException
|
80
|
+
end
|
81
|
+
|
82
|
+
register(slice_name, slice_class)
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_slice(slice_name, &block)
|
86
|
+
slice_module =
|
87
|
+
begin
|
88
|
+
slice_module_name = inflector.camelize(slice_name.to_s)
|
89
|
+
inflector.constantize(slice_module_name)
|
90
|
+
rescue NameError
|
91
|
+
Object.const_set(inflector.camelize(slice_module_name), Module.new)
|
92
|
+
end
|
93
|
+
|
94
|
+
slice_module.const_set(:Slice, Class.new(Hanami::Slice, &block))
|
95
|
+
end
|
96
|
+
|
97
|
+
def root
|
98
|
+
application.root
|
99
|
+
end
|
100
|
+
|
101
|
+
def inflector
|
102
|
+
application.inflector
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|