hanami 2.1.1 → 2.2.0.beta1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +7 -7
- data/hanami.gemspec +6 -6
- data/lib/hanami/app.rb +5 -1
- data/lib/hanami/config/db.rb +33 -0
- data/lib/hanami/config.rb +36 -9
- data/lib/hanami/extensions/db/repo.rb +103 -0
- data/lib/hanami/extensions.rb +4 -0
- data/lib/hanami/helpers/form_helper/form_builder.rb +2 -4
- data/lib/hanami/provider_registrar.rb +26 -0
- data/lib/hanami/providers/assets.rb +2 -20
- data/lib/hanami/providers/db/adapter.rb +68 -0
- data/lib/hanami/providers/db/adapters.rb +44 -0
- data/lib/hanami/providers/db/config.rb +66 -0
- data/lib/hanami/providers/db/sql_adapter.rb +80 -0
- data/lib/hanami/providers/db.rb +203 -0
- data/lib/hanami/providers/db_logging.rb +22 -0
- data/lib/hanami/providers/rack.rb +1 -1
- data/lib/hanami/providers/relations.rb +31 -0
- data/lib/hanami/providers/routes.rb +1 -13
- data/lib/hanami/rake_tasks.rb +8 -7
- data/lib/hanami/slice.rb +84 -4
- data/lib/hanami/version.rb +1 -1
- data/lib/hanami.rb +3 -0
- data/spec/integration/container/provider_environment_spec.rb +52 -0
- data/spec/integration/db/auto_registration_spec.rb +39 -0
- data/spec/integration/db/db_inflector_spec.rb +57 -0
- data/spec/integration/db/db_slices_spec.rb +327 -0
- data/spec/integration/db/db_spec.rb +220 -0
- data/spec/integration/db/logging_spec.rb +238 -0
- data/spec/integration/db/provider_config_spec.rb +88 -0
- data/spec/integration/db/provider_spec.rb +35 -0
- data/spec/integration/db/repo_spec.rb +215 -0
- data/spec/integration/db/slices_importing_from_parent.rb +130 -0
- data/spec/integration/slices/slice_configuration_spec.rb +4 -4
- data/spec/support/app_integration.rb +3 -0
- data/spec/unit/hanami/config/db_spec.rb +38 -0
- data/spec/unit/hanami/config/router_spec.rb +1 -1
- data/spec/unit/hanami/helpers/form_helper_spec.rb +31 -0
- data/spec/unit/hanami/providers/db/config/default_config_spec.rb +107 -0
- data/spec/unit/hanami/providers/db/config_spec.rb +206 -0
- data/spec/unit/hanami/slice_spec.rb +32 -0
- data/spec/unit/hanami/version_spec.rb +1 -1
- metadata +61 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ada7b19a9d5205199e825e57d41758bbc67c350f3d565b01cd4720b9ed8f3ad4
|
4
|
+
data.tar.gz: 2af8c539547dcbc78dde70db5e31fc72bafa9578dcf391178ec342b618ea6467
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed3735c73b897db477ba35cd3d2f0aee79c98940eb4cba651590e5bedf74f34d3969a8dc8200fcae2cfda1a1f7345e873b9bcd075a3f3a627d81eef0ac36ac94
|
7
|
+
data.tar.gz: 65aebf467d397b29148dda81262550c528469adbd75759615415e89293cefd0cdb1444bd7fc1513c07d46da290ac2092f31752c4d3adeb856f709c04d540497f
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,25 @@
|
|
2
2
|
|
3
3
|
The web, with simplicity.
|
4
4
|
|
5
|
+
## v2.2.0.beta1 - 2024-07-16
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- [Tim Riley, Adam Lassek] Introduce database layer
|
10
|
+
- [Adam Lassek] Add `Hanami::Slice.app?`, returning false for slices and true for the app (#1399)
|
11
|
+
- [Tim Riley] Add `Slice#registered?`, an additional method delegating to the internal container. Returns true only if a component is already registered for the given, without triggering lazy loading (#1382)
|
12
|
+
|
13
|
+
### Changed
|
14
|
+
|
15
|
+
- [Tim Riley] `target` inside providers is now the slice itself, instead of the slice's internal container (#1382)
|
16
|
+
- Drop support for Ruby 3.0
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
|
20
|
+
- [Damian C. Rossney] Allow form `label` helper to receive a symbol (#1423)
|
21
|
+
- [Damian C. Rossney] Fix invalid input names generated when using form `fields_for_collection` helper (#1421)
|
22
|
+
- [Tim Riley] Fix dry-logger compatibility check for versions of dry-logger >= 1.0.4 (#1384)
|
23
|
+
|
5
24
|
## v2.1.1 - 2024-05-12
|
6
25
|
|
7
26
|
### Fixed
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@ The web, with simplicity.
|
|
4
4
|
|
5
5
|
## Version
|
6
6
|
|
7
|
-
**This branch contains the code for `hanami
|
7
|
+
**This branch contains the code for `hanami`: 2.2**
|
8
8
|
|
9
9
|
## Frameworks
|
10
10
|
|
@@ -14,9 +14,8 @@ This repository is for the full-stack framework, which provides the glue that ti
|
|
14
14
|
|
15
15
|
* [**Hanami::Router**](https://github.com/hanami/router) - Rack compatible HTTP router for Ruby
|
16
16
|
* [**Hanami::Controller**](https://github.com/hanami/controller) - Full featured, fast and testable actions for Rack
|
17
|
+
* [**Hanami::Validations**](https://github.com/hanami/validations) - Parameter validations & coercion for actions
|
17
18
|
* [**Hanami::View**](https://github.com/hanami/view) - Presentation with a separation between views and templates
|
18
|
-
* [**Hanami::Helpers**](https://github.com/hanami/helpers) - View helpers for Ruby applications
|
19
|
-
* [**Hanami::Mailer**](https://github.com/hanami/mailer) - Mail for Ruby applications
|
20
19
|
* [**Hanami::Assets**](https://github.com/hanami/assets) - Assets management for Ruby
|
21
20
|
|
22
21
|
These components are designed to be used independently or together in a Hanami application.
|
@@ -24,12 +23,13 @@ These components are designed to be used independently or together in a Hanami a
|
|
24
23
|
## Status
|
25
24
|
|
26
25
|
[](https://badge.fury.io/rb/hanami)
|
27
|
-
[](https://github.com/hanami/hanami/actions?query=workflow%3Aci+branch%3Amain)
|
27
|
+
[](https://codecov.io/gh/hanami/hanami)
|
28
28
|
[](https://depfu.com/github/hanami/hanami?project=Bundler)
|
29
29
|
|
30
30
|
## Installation
|
31
31
|
|
32
|
-
__Hanami__ supports Ruby (MRI) 3.
|
32
|
+
__Hanami__ supports Ruby (MRI) 3.1+.
|
33
33
|
|
34
34
|
```shell
|
35
35
|
gem install hanami
|
@@ -110,7 +110,7 @@ $ bundle exec rspec path/to/spec.rb
|
|
110
110
|
|
111
111
|
### Development Requirements
|
112
112
|
|
113
|
-
* Ruby >= 3.
|
113
|
+
* Ruby >= 3.1
|
114
114
|
* Bundler
|
115
115
|
* Node.js (MacOS)
|
116
116
|
|
@@ -120,4 +120,4 @@ __Hanami__ uses [Semantic Versioning 2.0.0](http://semver.org)
|
|
120
120
|
|
121
121
|
## Copyright
|
122
122
|
|
123
|
-
Copyright © 2014 Hanami Team – Released under MIT License.
|
123
|
+
Copyright © 2014–2024 Hanami Team – Released under MIT License.
|
data/hanami.gemspec
CHANGED
@@ -27,19 +27,19 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.test_files = Dir["spec/**/*"]
|
28
28
|
spec.require_paths = ["lib"]
|
29
29
|
spec.metadata["rubygems_mfa_required"] = "true"
|
30
|
-
spec.required_ruby_version = ">= 3.
|
30
|
+
spec.required_ruby_version = ">= 3.1"
|
31
31
|
|
32
32
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
33
33
|
|
34
34
|
spec.add_dependency "bundler", ">= 1.16", "< 3"
|
35
|
-
spec.add_dependency "dry-configurable", "~> 1.0", "< 2"
|
35
|
+
spec.add_dependency "dry-configurable", "~> 1.0", ">= 1.2.0", "< 2"
|
36
36
|
spec.add_dependency "dry-core", "~> 1.0", "< 2"
|
37
|
-
spec.add_dependency "dry-inflector", "~> 1.0", "< 2"
|
37
|
+
spec.add_dependency "dry-inflector", "~> 1.0", ">= 1.1.0", "< 2"
|
38
38
|
spec.add_dependency "dry-monitor", "~> 1.0", ">= 1.0.1", "< 2"
|
39
|
-
spec.add_dependency "dry-system", "
|
39
|
+
spec.add_dependency "dry-system", "= 1.1.0.beta1"
|
40
40
|
spec.add_dependency "dry-logger", "~> 1.0", "< 2"
|
41
|
-
spec.add_dependency "hanami-cli", "
|
42
|
-
spec.add_dependency "hanami-utils", "~> 2.
|
41
|
+
spec.add_dependency "hanami-cli", "= 2.2.0.beta1"
|
42
|
+
spec.add_dependency "hanami-utils", "~> 2.2.beta"
|
43
43
|
spec.add_dependency "zeitwerk", "~> 2.6"
|
44
44
|
|
45
45
|
spec.add_development_dependency "rspec", "~> 3.8"
|
data/lib/hanami/app.rb
CHANGED
@@ -152,7 +152,7 @@ module Hanami
|
|
152
152
|
register_provider(:inflector, source: Hanami::Providers::Inflector)
|
153
153
|
|
154
154
|
# Allow logger to be replaced by users with a manual provider, for advanced cases
|
155
|
-
unless container.providers
|
155
|
+
unless container.providers[:logger]
|
156
156
|
require_relative "providers/logger"
|
157
157
|
register_provider(:logger, source: Hanami::Providers::Logger)
|
158
158
|
end
|
@@ -161,6 +161,10 @@ module Hanami
|
|
161
161
|
require_relative "providers/rack"
|
162
162
|
register_provider(:rack, source: Hanami::Providers::Rack, namespace: true)
|
163
163
|
end
|
164
|
+
|
165
|
+
if Hanami.bundled?("hanami-db")
|
166
|
+
register_provider(:db_logging, source: Hanami::Providers::DBLogging)
|
167
|
+
end
|
164
168
|
end
|
165
169
|
|
166
170
|
def prepare_autoloader
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/configurable"
|
4
|
+
|
5
|
+
module Hanami
|
6
|
+
class Config
|
7
|
+
# Hanami DB config
|
8
|
+
#
|
9
|
+
# @since 2.2.0
|
10
|
+
# @api public
|
11
|
+
class DB
|
12
|
+
include Dry::Configurable
|
13
|
+
|
14
|
+
setting :configure_from_parent, default: true
|
15
|
+
|
16
|
+
setting :import_from_parent, default: false
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def method_missing(name, *args, &block)
|
21
|
+
if config.respond_to?(name)
|
22
|
+
config.public_send(name, *args, &block)
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def respond_to_missing?(name, _include_all = false)
|
29
|
+
config.respond_to?(name) || super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/hanami/config.rb
CHANGED
@@ -110,7 +110,12 @@ module Hanami
|
|
110
110
|
#
|
111
111
|
# @api public
|
112
112
|
# @since 2.0.0
|
113
|
-
setting :no_auto_register_paths, default:
|
113
|
+
setting :no_auto_register_paths, default: [
|
114
|
+
"db",
|
115
|
+
"entities",
|
116
|
+
"relations",
|
117
|
+
"structs"
|
118
|
+
]
|
114
119
|
|
115
120
|
# @!attribute [rw] base_url
|
116
121
|
# Sets the base URL for app's web server.
|
@@ -216,6 +221,20 @@ module Hanami
|
|
216
221
|
# @since 2.0.0
|
217
222
|
attr_reader :actions
|
218
223
|
|
224
|
+
# Returns the app's db config, or a null config if hanami-db is not bundled.
|
225
|
+
#
|
226
|
+
# @example When hanami-db is bundled
|
227
|
+
# config.db.import_from_parent # => false
|
228
|
+
#
|
229
|
+
# @example When hanami-db is not bundle
|
230
|
+
# config.db.import_from_parent # => NoMethodError
|
231
|
+
#
|
232
|
+
# @return [Hanami::Config::DB, Hanami::Config::NullConfig]
|
233
|
+
#
|
234
|
+
# @api public
|
235
|
+
# @since 2.2.0
|
236
|
+
attr_reader :db
|
237
|
+
|
219
238
|
# Returns the app's middleware stack, or nil if hanami-router is not bundled.
|
220
239
|
#
|
221
240
|
# Use this to configure middleware that should apply to all routes.
|
@@ -288,16 +307,27 @@ module Hanami
|
|
288
307
|
self.render_detailed_errors = (env == :development)
|
289
308
|
load_from_env
|
290
309
|
|
291
|
-
@logger = Config::Logger.new(env: env, app_name: app_name)
|
292
310
|
|
293
311
|
@actions = load_dependent_config("hanami-controller") {
|
294
312
|
require_relative "config/actions"
|
295
313
|
Actions.new
|
296
314
|
}
|
297
315
|
|
316
|
+
@assets = load_dependent_config("hanami-assets") {
|
317
|
+
require_relative "config/assets"
|
318
|
+
Hanami::Config::Assets.new
|
319
|
+
}
|
320
|
+
|
321
|
+
@db = load_dependent_config("hanami-db") { DB.new }
|
322
|
+
|
323
|
+
@logger = Config::Logger.new(env: env, app_name: app_name)
|
324
|
+
|
325
|
+
@middleware = load_dependent_config("hanami-router") {
|
326
|
+
Slice::Routing::Middleware::Stack.new
|
327
|
+
}
|
328
|
+
|
298
329
|
@router = load_dependent_config("hanami-router") {
|
299
330
|
require_relative "config/router"
|
300
|
-
@middleware = Slice::Routing::Middleware::Stack.new
|
301
331
|
Router.new(self)
|
302
332
|
}
|
303
333
|
|
@@ -306,11 +336,6 @@ module Hanami
|
|
306
336
|
Views.new
|
307
337
|
}
|
308
338
|
|
309
|
-
@assets = load_dependent_config("hanami-assets") {
|
310
|
-
require_relative "config/assets"
|
311
|
-
Hanami::Config::Assets.new
|
312
|
-
}
|
313
|
-
|
314
339
|
yield self if block_given?
|
315
340
|
end
|
316
341
|
# rubocop:enable Metrics/AbcSize
|
@@ -321,8 +346,10 @@ module Hanami
|
|
321
346
|
|
322
347
|
@app_name = app_name.dup
|
323
348
|
|
324
|
-
@assets = source.assets.dup
|
325
349
|
@actions = source.actions.dup
|
350
|
+
@assets = source.assets.dup
|
351
|
+
@db = source.db.dup
|
352
|
+
@logger = source.logger.dup
|
326
353
|
@middleware = source.middleware.dup
|
327
354
|
@router = source.router.dup.tap do |router|
|
328
355
|
router.instance_variable_set(:@base_config, self)
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/db"
|
4
|
+
|
5
|
+
module Hanami
|
6
|
+
module Extensions
|
7
|
+
# @api private
|
8
|
+
# @since 2.2.0
|
9
|
+
module DB
|
10
|
+
# @api private
|
11
|
+
# @since 2.2.0
|
12
|
+
module Repo
|
13
|
+
def self.included(repo_class)
|
14
|
+
super
|
15
|
+
|
16
|
+
repo_class.extend(Hanami::SliceConfigurable)
|
17
|
+
repo_class.extend(ClassMethods)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @api private
|
21
|
+
# @since 2.2.0
|
22
|
+
module ClassMethods
|
23
|
+
def configure_for_slice(slice)
|
24
|
+
extend SliceConfiguredRepo.new(slice)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
# @since 2.2.0
|
31
|
+
class SliceConfiguredRepo < Module
|
32
|
+
attr_reader :slice
|
33
|
+
|
34
|
+
def initialize(slice)
|
35
|
+
super()
|
36
|
+
@slice = slice
|
37
|
+
end
|
38
|
+
|
39
|
+
def extended(repo_class)
|
40
|
+
define_inherited
|
41
|
+
configure_repo(repo_class)
|
42
|
+
define_new
|
43
|
+
end
|
44
|
+
|
45
|
+
def inspect
|
46
|
+
"#<#{self.class.name}[#{slice.name}]>"
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def define_inherited
|
52
|
+
root_for_repo_class = method(:root_for_repo_class)
|
53
|
+
|
54
|
+
define_method(:inherited) do |subclass|
|
55
|
+
super(subclass)
|
56
|
+
|
57
|
+
unless subclass.root
|
58
|
+
root = root_for_repo_class.(subclass)
|
59
|
+
subclass.root root if root
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def configure_repo(repo_class)
|
65
|
+
repo_class.struct_namespace struct_namespace
|
66
|
+
end
|
67
|
+
|
68
|
+
def define_new
|
69
|
+
resolve_rom = method(:resolve_rom)
|
70
|
+
|
71
|
+
define_method(:new) do |**kwargs|
|
72
|
+
super(container: kwargs.fetch(:container) { resolve_rom.() })
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def resolve_rom
|
77
|
+
slice["db.rom"]
|
78
|
+
end
|
79
|
+
|
80
|
+
def root_for_repo_class(repo_class)
|
81
|
+
return unless repo_class.to_s.end_with?("Repo")
|
82
|
+
|
83
|
+
slice.inflector.demodulize(repo_class)
|
84
|
+
.then { slice.inflector.underscore(_1) }
|
85
|
+
.then { _1.gsub(/_repo$/, "") }
|
86
|
+
.then { slice.inflector.pluralize(_1) }
|
87
|
+
.then { _1.to_sym }
|
88
|
+
end
|
89
|
+
|
90
|
+
def struct_namespace
|
91
|
+
@struct_namespace ||=
|
92
|
+
if slice.namespace.const_defined?(:Structs)
|
93
|
+
slice.namespace.const_get(:Structs)
|
94
|
+
else
|
95
|
+
slice.namespace.const_set(:Structs, Module.new)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
Hanami::DB::Repo.include(Hanami::Extensions::DB::Repo)
|
data/lib/hanami/extensions.rb
CHANGED
@@ -226,10 +226,8 @@ module Hanami
|
|
226
226
|
# @api public
|
227
227
|
# @since 2.1.0
|
228
228
|
def fields_for_collection(name, &block)
|
229
|
-
collection_base_name = [base_name, name.to_s].compact.join(INPUT_NAME_SEPARATOR)
|
230
|
-
|
231
229
|
_value(name).each_with_index do |value, index|
|
232
|
-
fields_for("#{
|
230
|
+
fields_for("#{name}.#{index}", index, value, &block)
|
233
231
|
end
|
234
232
|
end
|
235
233
|
|
@@ -295,7 +293,7 @@ module Hanami
|
|
295
293
|
attributes[:for] = _input_id(attributes[:for] || content)
|
296
294
|
|
297
295
|
if content && !for_attribute_given
|
298
|
-
content = inflector.humanize(content.split(INPUT_NAME_SEPARATOR).last)
|
296
|
+
content = inflector.humanize(content.to_s.split(INPUT_NAME_SEPARATOR).last)
|
299
297
|
end
|
300
298
|
|
301
299
|
tag.label(content, **attributes, &block)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 2.2.0
|
5
|
+
module Hanami
|
6
|
+
class ProviderRegistrar < Dry::System::ProviderRegistrar
|
7
|
+
def self.for_slice(slice)
|
8
|
+
Class.new(self) do
|
9
|
+
define_singleton_method(:new) do |container|
|
10
|
+
super(container, slice)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :slice
|
16
|
+
|
17
|
+
def initialize(container, slice)
|
18
|
+
super(container)
|
19
|
+
@slice = slice
|
20
|
+
end
|
21
|
+
|
22
|
+
def target_container
|
23
|
+
slice
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -10,18 +10,6 @@ module Hanami
|
|
10
10
|
# @api private
|
11
11
|
# @since 2.0.0
|
12
12
|
class Assets < Dry::System::Provider::Source
|
13
|
-
# @api private
|
14
|
-
def self.for_slice(slice)
|
15
|
-
Class.new(self) do |klass|
|
16
|
-
klass.instance_variable_set(:@slice, slice)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# @api private
|
21
|
-
def self.slice
|
22
|
-
@slice || Hanami.app
|
23
|
-
end
|
24
|
-
|
25
13
|
# @api private
|
26
14
|
def prepare
|
27
15
|
require "hanami/assets"
|
@@ -29,18 +17,12 @@ module Hanami
|
|
29
17
|
|
30
18
|
# @api private
|
31
19
|
def start
|
32
|
-
root =
|
20
|
+
root = target.app.root.join("public", "assets", Hanami::Assets.public_assets_dir(target).to_s)
|
33
21
|
|
34
|
-
assets = Hanami::Assets.new(config:
|
22
|
+
assets = Hanami::Assets.new(config: target.config.assets, root: root)
|
35
23
|
|
36
24
|
register(:assets, assets)
|
37
25
|
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def slice
|
42
|
-
self.class.slice
|
43
|
-
end
|
44
26
|
end
|
45
27
|
end
|
46
28
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/configurable"
|
4
|
+
|
5
|
+
module Hanami
|
6
|
+
module Providers
|
7
|
+
class DB < Dry::System::Provider::Source
|
8
|
+
# @api public
|
9
|
+
# @since 2.2.0
|
10
|
+
class Adapter
|
11
|
+
include Dry::Configurable
|
12
|
+
|
13
|
+
# @api public
|
14
|
+
# @since 2.2.0
|
15
|
+
setting :plugins, mutable: true
|
16
|
+
|
17
|
+
# @api private
|
18
|
+
def initialize(...)
|
19
|
+
@skip_defaults = Hash.new(false)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @api public
|
23
|
+
# @since 2.2.0
|
24
|
+
def skip_defaults(setting_name = nil)
|
25
|
+
@skip_defaults[setting_name] = true
|
26
|
+
end
|
27
|
+
|
28
|
+
# @api private
|
29
|
+
private def skip_defaults?(setting_name = nil)
|
30
|
+
@skip_defaults[setting_name]
|
31
|
+
end
|
32
|
+
|
33
|
+
# @api private
|
34
|
+
def configure_for_database(database_url)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @api public
|
38
|
+
# @since 2.2.0
|
39
|
+
def plugin(**plugin_spec, &config_block)
|
40
|
+
plugins << [plugin_spec, config_block]
|
41
|
+
end
|
42
|
+
|
43
|
+
# @api public
|
44
|
+
# @since 2.2.0
|
45
|
+
def plugins
|
46
|
+
config.plugins ||= []
|
47
|
+
end
|
48
|
+
|
49
|
+
# @api private
|
50
|
+
def gateway_cache_keys
|
51
|
+
gateway_options
|
52
|
+
end
|
53
|
+
|
54
|
+
# @api private
|
55
|
+
def gateway_options
|
56
|
+
{}
|
57
|
+
end
|
58
|
+
|
59
|
+
# @api public
|
60
|
+
# @since 2.2.0
|
61
|
+
def clear
|
62
|
+
config.plugins = nil
|
63
|
+
self
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanami
|
4
|
+
module Providers
|
5
|
+
class DB < Dry::System::Provider::Source
|
6
|
+
# @api public
|
7
|
+
# @since 2.2.0
|
8
|
+
class Adapters
|
9
|
+
# @api private
|
10
|
+
# @since 2.2.0
|
11
|
+
ADAPTER_CLASSES = Hash.new(Adapter).update(
|
12
|
+
sql: SQLAdapter
|
13
|
+
).freeze
|
14
|
+
private_constant :ADAPTER_CLASSES
|
15
|
+
|
16
|
+
extend Forwardable
|
17
|
+
|
18
|
+
def_delegators :adapters, :[], :[]=, :each, :to_h
|
19
|
+
|
20
|
+
# @api private
|
21
|
+
# @since 2.2.0
|
22
|
+
attr_reader :adapters
|
23
|
+
|
24
|
+
# @api private
|
25
|
+
# @since 2.2.0
|
26
|
+
def initialize
|
27
|
+
@adapters = Hash.new do |hsh, key|
|
28
|
+
hsh[key] = ADAPTER_CLASSES[key].new
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @api private
|
33
|
+
# @since 2.2.0
|
34
|
+
def initialize_copy(source)
|
35
|
+
@adapters = source.adapters.dup
|
36
|
+
|
37
|
+
source.adapters.each do |key, val|
|
38
|
+
@adapters[key] = val.dup
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/core"
|
4
|
+
|
5
|
+
module Hanami
|
6
|
+
module Providers
|
7
|
+
class DB < Dry::System::Provider::Source
|
8
|
+
# @api public
|
9
|
+
# @since 2.2.0
|
10
|
+
class Config < Dry::Configurable::Config
|
11
|
+
include Dry::Core::Constants
|
12
|
+
|
13
|
+
# @api public
|
14
|
+
# @since 2.2.0
|
15
|
+
def adapter_name
|
16
|
+
self[:adapter]
|
17
|
+
end
|
18
|
+
|
19
|
+
# @api public
|
20
|
+
# @since 2.2.0
|
21
|
+
def adapter(name = Undefined)
|
22
|
+
return adapter_name if name.eql?(Undefined)
|
23
|
+
|
24
|
+
adapter = (adapters[name] ||= Adapter.new)
|
25
|
+
yield adapter if block_given?
|
26
|
+
adapter
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api public
|
30
|
+
# @since 2.2.0
|
31
|
+
def any_adapter
|
32
|
+
adapter = (adapters[nil] ||= Adapter.new)
|
33
|
+
yield adapter if block_given?
|
34
|
+
adapter
|
35
|
+
end
|
36
|
+
|
37
|
+
# @api private
|
38
|
+
# @since 2.2.0
|
39
|
+
def gateway_cache_keys
|
40
|
+
adapters[adapter_name].gateway_cache_keys
|
41
|
+
end
|
42
|
+
|
43
|
+
# @api private
|
44
|
+
# @since 2.2.0
|
45
|
+
def gateway_options
|
46
|
+
adapters[adapter_name].gateway_options
|
47
|
+
end
|
48
|
+
|
49
|
+
# @api public
|
50
|
+
# @since 2.2.0
|
51
|
+
def each_plugin
|
52
|
+
universal_plugins = adapters[nil].plugins
|
53
|
+
adapter_plugins = adapters[adapter_name].plugins
|
54
|
+
|
55
|
+
plugins = universal_plugins + adapter_plugins
|
56
|
+
|
57
|
+
return to_enum(__method__) unless block_given?
|
58
|
+
|
59
|
+
plugins.each do |plugin_spec, config_block|
|
60
|
+
yield plugin_spec, config_block
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|