hanami-model 1.3.2 → 1.3.3
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 +5 -0
- data/LICENSE.md +1 -1
- data/README.md +6 -3
- data/hanami-model.gemspec +25 -21
- data/lib/hanami-model.rb +3 -1
- data/lib/hanami/entity.rb +5 -3
- data/lib/hanami/entity/schema.rb +9 -7
- data/lib/hanami/model.rb +14 -12
- data/lib/hanami/model/association.rb +7 -7
- data/lib/hanami/model/associations/belongs_to.rb +3 -1
- data/lib/hanami/model/associations/dsl.rb +2 -2
- data/lib/hanami/model/associations/has_many.rb +10 -8
- data/lib/hanami/model/associations/has_one.rb +9 -7
- data/lib/hanami/model/associations/many_to_many.rb +9 -11
- data/lib/hanami/model/configuration.rb +15 -13
- data/lib/hanami/model/configurator.rb +5 -3
- data/lib/hanami/model/entity_name.rb +3 -1
- data/lib/hanami/model/error.rb +9 -7
- data/lib/hanami/model/mapped_relation.rb +4 -2
- data/lib/hanami/model/mapping.rb +3 -1
- data/lib/hanami/model/migration.rb +2 -0
- data/lib/hanami/model/migrator.rb +7 -5
- data/lib/hanami/model/migrator/adapter.rb +13 -11
- data/lib/hanami/model/migrator/connection.rb +10 -8
- data/lib/hanami/model/migrator/logger.rb +3 -1
- data/lib/hanami/model/migrator/mysql_adapter.rb +23 -13
- data/lib/hanami/model/migrator/postgres_adapter.rb +30 -28
- data/lib/hanami/model/migrator/sqlite_adapter.rb +7 -9
- data/lib/hanami/model/plugins.rb +5 -3
- data/lib/hanami/model/plugins/mapping.rb +2 -0
- data/lib/hanami/model/plugins/schema.rb +2 -0
- data/lib/hanami/model/plugins/timestamps.rb +2 -0
- data/lib/hanami/model/relation_name.rb +4 -2
- data/lib/hanami/model/sql.rb +9 -7
- data/lib/hanami/model/sql/console.rb +10 -8
- data/lib/hanami/model/sql/consoles/abstract.rb +3 -1
- data/lib/hanami/model/sql/consoles/mysql.rb +4 -2
- data/lib/hanami/model/sql/consoles/postgresql.rb +10 -8
- data/lib/hanami/model/sql/consoles/sqlite.rb +6 -4
- data/lib/hanami/model/sql/entity/schema.rb +6 -4
- data/lib/hanami/model/sql/types.rb +7 -5
- data/lib/hanami/model/sql/types/schema/coercions.rb +5 -4
- data/lib/hanami/model/types.rb +4 -4
- data/lib/hanami/model/version.rb +3 -1
- data/lib/hanami/repository.rb +20 -31
- metadata +34 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e39e89062478fa891ec0904add24b1ec30bb93435b178f229cc4328995de9acb
|
4
|
+
data.tar.gz: 0c3190667360fa53e56797c14bac30fdb9fe3ca4266ce4f33dc2a1b941142efb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3420b442c9015651d7e0f6bd55861252919604c02784601d3177f28c959c986cd35308fa73db94e452624cec4a85a443fa9472354eafe8c8b5fb78dea46162c9
|
7
|
+
data.tar.gz: 99c9779f14b14484f33bd4789105bb96c83ce6165d1048eb9e0db0a7cc573ead79308ca00f7e135e743f22c506231c4a6f8b348da4c4596da4f23f00784a3121
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Hanami::Model
|
2
2
|
A persistence layer for Hanami
|
3
3
|
|
4
|
+
## v1.3.3 - 2021-05-22
|
5
|
+
### Fixed
|
6
|
+
- [Sean Collins] Specify dependency on BigDecimal v1.4
|
7
|
+
- [Adam Daniels] Use environment variables for PostgreSQL CLI tools
|
8
|
+
|
4
9
|
## v1.3.2 - 2019-01-31
|
5
10
|
### Fixed
|
6
11
|
- [Luca Guidi] Depend on `dry-logic` `~> 0.4.2`, `< 0.5`
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -15,8 +15,7 @@ Like all the other Hanami components, it can be used as a standalone framework o
|
|
15
15
|
## Status
|
16
16
|
|
17
17
|
[](https://badge.fury.io/rb/hanami-model)
|
18
|
-
[](https://circleci.com/gh/hanami/model/tree/master)
|
18
|
+
[](https://github.com/hanami/model/actions?query=workflow%3Aci+branch%3Amaster)
|
20
19
|
[](https://codecov.io/gh/hanami/model)
|
21
20
|
[](https://depfu.com/github/hanami/model?project=Bundler)
|
22
21
|
[](http://inch-ci.org/github/hanami/model)
|
@@ -56,6 +55,7 @@ This class provides a DSL to configure the connection.
|
|
56
55
|
|
57
56
|
```ruby
|
58
57
|
require 'hanami/model'
|
58
|
+
require 'hanami/model/sql'
|
59
59
|
|
60
60
|
class User < Hanami::Entity
|
61
61
|
end
|
@@ -192,6 +192,8 @@ This is a **huge improvement**, because:
|
|
192
192
|
|
193
193
|
Hanami::Model can **_automap_** columns from relations and entities attributes.
|
194
194
|
|
195
|
+
When using a `sql` adapter, you must require `hanami/model/sql` before `Hanami::Model.load!` is called so the relations are loaded correctly.
|
196
|
+
|
195
197
|
However, there are cases where columns and attribute names do not match (mainly **legacy databases**).
|
196
198
|
|
197
199
|
```ruby
|
@@ -234,6 +236,7 @@ If an entity has the following accessors: `:created_at` and `:updated_at`, they
|
|
234
236
|
|
235
237
|
```ruby
|
236
238
|
require 'hanami/model'
|
239
|
+
require 'hanami/model/sql'
|
237
240
|
|
238
241
|
class User < Hanami::Entity
|
239
242
|
end
|
@@ -291,6 +294,6 @@ __Hanami::Model__ uses [Semantic Versioning 2.0.0](http://semver.org)
|
|
291
294
|
|
292
295
|
## Copyright
|
293
296
|
|
294
|
-
Copyright © 2014-
|
297
|
+
Copyright © 2014-2021 Luca Guidi – Released under MIT License
|
295
298
|
|
296
299
|
This project was formerly known as Lotus (`lotus-model`).
|
data/hanami-model.gemspec
CHANGED
@@ -1,32 +1,36 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require
|
5
|
+
require "hanami/model/version"
|
4
6
|
|
5
7
|
Gem::Specification.new do |spec|
|
6
|
-
spec.name =
|
8
|
+
spec.name = "hanami-model"
|
7
9
|
spec.version = Hanami::Model::VERSION
|
8
|
-
spec.authors = [
|
9
|
-
spec.email = [
|
10
|
-
spec.summary =
|
11
|
-
spec.description =
|
12
|
-
spec.homepage =
|
13
|
-
spec.license =
|
10
|
+
spec.authors = ["Luca Guidi"]
|
11
|
+
spec.email = ["me@lucaguidi.com"]
|
12
|
+
spec.summary = "A persistence layer for Hanami"
|
13
|
+
spec.description = "A persistence framework with entities and repositories"
|
14
|
+
spec.homepage = "http://hanamirb.org"
|
15
|
+
spec.license = "MIT"
|
14
16
|
|
15
17
|
spec.files = `git ls-files -z -- lib/* CHANGELOG.md EXAMPLE.md LICENSE.md README.md hanami-model.gemspec`.split("\x0")
|
16
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = [
|
19
|
-
spec.required_ruby_version =
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
spec.required_ruby_version = ">= 2.3.0", "< 3"
|
20
22
|
|
21
|
-
spec.add_runtime_dependency
|
22
|
-
spec.add_runtime_dependency
|
23
|
-
spec.add_runtime_dependency
|
24
|
-
spec.add_runtime_dependency
|
25
|
-
spec.add_runtime_dependency
|
26
|
-
spec.add_runtime_dependency
|
27
|
-
spec.add_runtime_dependency
|
23
|
+
spec.add_runtime_dependency "hanami-utils", "~> 1.3"
|
24
|
+
spec.add_runtime_dependency "rom", "~> 3.3", ">= 3.3.3"
|
25
|
+
spec.add_runtime_dependency "rom-sql", "~> 1.3", ">= 1.3.5"
|
26
|
+
spec.add_runtime_dependency "rom-repository", "~> 1.4"
|
27
|
+
spec.add_runtime_dependency "dry-types", "~> 0.11.0"
|
28
|
+
spec.add_runtime_dependency "dry-logic", "~> 0.4.2", "< 0.5"
|
29
|
+
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
|
30
|
+
spec.add_runtime_dependency "bigdecimal", "~> 1.4"
|
28
31
|
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
+
spec.add_development_dependency "bundler", ">= 1.6", "< 3"
|
33
|
+
spec.add_development_dependency "rake", "~> 12"
|
34
|
+
spec.add_development_dependency "rspec", "~> 3.7"
|
35
|
+
spec.add_development_dependency "rubocop", "0.81" # rubocop 0.81+ removed support for Ruby 2.3
|
32
36
|
end
|
data/lib/hanami-model.rb
CHANGED
data/lib/hanami/entity.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/model/types"
|
2
4
|
|
3
5
|
module Hanami
|
4
6
|
# An object that is defined by its identity.
|
@@ -50,7 +52,7 @@ module Hanami
|
|
50
52
|
#
|
51
53
|
# @see Hanami::Repository
|
52
54
|
class Entity
|
53
|
-
require
|
55
|
+
require "hanami/entity/schema"
|
54
56
|
|
55
57
|
# Syntactic shortcut to reference types in custom schema DSL
|
56
58
|
#
|
@@ -188,7 +190,7 @@ module Hanami
|
|
188
190
|
end
|
189
191
|
|
190
192
|
# @since 0.7.0
|
191
|
-
|
193
|
+
alias_method :to_hash, :to_h
|
192
194
|
|
193
195
|
protected
|
194
196
|
|
data/lib/hanami/entity/schema.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/model/types"
|
4
|
+
require "hanami/utils/hash"
|
3
5
|
|
4
6
|
module Hanami
|
5
7
|
class Entity
|
@@ -182,10 +184,10 @@ module Hanami
|
|
182
184
|
# @api private
|
183
185
|
def call(attributes)
|
184
186
|
schema.call(attributes)
|
185
|
-
rescue Dry::Types::SchemaError =>
|
186
|
-
raise TypeError.new(
|
187
|
-
rescue Dry::Types::MissingKeyError, Dry::Types::UnknownKeysError =>
|
188
|
-
raise ArgumentError.new(
|
187
|
+
rescue Dry::Types::SchemaError => exception
|
188
|
+
raise TypeError.new(exception.message)
|
189
|
+
rescue Dry::Types::MissingKeyError, Dry::Types::UnknownKeysError => exception
|
190
|
+
raise ArgumentError.new(exception.message)
|
189
191
|
end
|
190
192
|
|
191
193
|
# Check if the attribute is known
|
@@ -243,7 +245,7 @@ module Hanami
|
|
243
245
|
|
244
246
|
# @since 0.7.0
|
245
247
|
# @api private
|
246
|
-
|
248
|
+
alias_method :[], :call
|
247
249
|
|
248
250
|
# Check if the attribute is known
|
249
251
|
#
|
data/lib/hanami/model.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rom"
|
4
|
+
require "concurrent"
|
5
|
+
require "hanami/entity"
|
6
|
+
require "hanami/repository"
|
5
7
|
|
6
8
|
# Hanami
|
7
9
|
#
|
@@ -11,12 +13,12 @@ module Hanami
|
|
11
13
|
#
|
12
14
|
# @since 0.1.0
|
13
15
|
module Model
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
16
|
+
require "hanami/model/version"
|
17
|
+
require "hanami/model/error"
|
18
|
+
require "hanami/model/configuration"
|
19
|
+
require "hanami/model/configurator"
|
20
|
+
require "hanami/model/mapping"
|
21
|
+
require "hanami/model/plugins"
|
20
22
|
|
21
23
|
# @api private
|
22
24
|
# @since 0.7.0
|
@@ -33,7 +35,7 @@ module Hanami
|
|
33
35
|
|
34
36
|
# @since 0.7.0
|
35
37
|
# @api private
|
36
|
-
|
38
|
+
alias_method :loaded?, :loaded
|
37
39
|
end
|
38
40
|
|
39
41
|
# Configure the framework
|
@@ -70,7 +72,7 @@ module Hanami
|
|
70
72
|
# @since 0.7.0
|
71
73
|
# @api private
|
72
74
|
def self.container
|
73
|
-
raise
|
75
|
+
raise "Not loaded" unless loaded?
|
74
76
|
|
75
77
|
@container
|
76
78
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rom-sql"
|
4
|
+
require "hanami/model/associations/belongs_to"
|
5
|
+
require "hanami/model/associations/has_many"
|
6
|
+
require "hanami/model/associations/has_one"
|
7
|
+
require "hanami/model/associations/many_to_many"
|
6
8
|
|
7
9
|
module Hanami
|
8
10
|
module Model
|
@@ -24,7 +26,6 @@ module Hanami
|
|
24
26
|
#
|
25
27
|
# @since 0.7.0
|
26
28
|
# @api private
|
27
|
-
# rubocop:disable Metrics/MethodLength
|
28
29
|
def self.lookup(association)
|
29
30
|
case association
|
30
31
|
when ROM::SQL::Association::ManyToMany
|
@@ -39,7 +40,6 @@ module Hanami
|
|
39
40
|
raise "Unsupported association: #{association}"
|
40
41
|
end
|
41
42
|
end
|
42
|
-
# rubocop:enable Metrics/MethodLength
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hanami
|
2
4
|
module Model
|
3
5
|
module Associations
|
@@ -6,7 +8,6 @@ module Hanami
|
|
6
8
|
# @since 0.7.0
|
7
9
|
# @api private
|
8
10
|
#
|
9
|
-
# rubocop:disable Naming/PredicateName
|
10
11
|
class Dsl
|
11
12
|
# @since 0.7.0
|
12
13
|
# @api private
|
@@ -34,7 +35,6 @@ module Hanami
|
|
34
35
|
@repository.__send__(:relations, Hanami::Utils::String.pluralize(relation).to_sym)
|
35
36
|
end
|
36
37
|
end
|
37
|
-
# rubocop:enable Naming/PredicateName
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/model/types"
|
2
4
|
|
3
5
|
module Hanami
|
4
6
|
module Model
|
@@ -7,7 +9,7 @@ module Hanami
|
|
7
9
|
#
|
8
10
|
# @since 0.7.0
|
9
11
|
# @api private
|
10
|
-
class HasMany
|
12
|
+
class HasMany
|
11
13
|
# @since 0.7.0
|
12
14
|
# @api private
|
13
15
|
def self.schema_type(entity)
|
@@ -51,8 +53,8 @@ module Hanami
|
|
51
53
|
def create(data)
|
52
54
|
entity.new(command(:create, aggregate(target), mapper: nil, use: [:timestamps])
|
53
55
|
.call(serialize(data)))
|
54
|
-
rescue =>
|
55
|
-
raise Hanami::Model::Error.for(
|
56
|
+
rescue => exception
|
57
|
+
raise Hanami::Model::Error.for(exception)
|
56
58
|
end
|
57
59
|
|
58
60
|
# @since 0.7.0
|
@@ -60,8 +62,8 @@ module Hanami
|
|
60
62
|
def add(data)
|
61
63
|
command(:create, relation(target), use: [:timestamps])
|
62
64
|
.call(associate(serialize(data)))
|
63
|
-
rescue =>
|
64
|
-
raise Hanami::Model::Error.for(
|
65
|
+
rescue => exception
|
66
|
+
raise Hanami::Model::Error.for(exception)
|
65
67
|
end
|
66
68
|
|
67
69
|
# @since 0.7.0
|
@@ -113,7 +115,7 @@ module Hanami
|
|
113
115
|
# @since 0.7.0
|
114
116
|
# @api private
|
115
117
|
def command(target, relation, options = {})
|
116
|
-
repository.command(target
|
118
|
+
repository.command(target, relation, options)
|
117
119
|
end
|
118
120
|
|
119
121
|
# @since 0.7.0
|
@@ -151,7 +153,7 @@ module Hanami
|
|
151
153
|
# @since 0.7.0
|
152
154
|
# @api private
|
153
155
|
def unassociate
|
154
|
-
{
|
156
|
+
{foreign_key => nil}
|
155
157
|
end
|
156
158
|
|
157
159
|
# @since 0.7.0
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "hanami/utils/hash"
|
2
4
|
|
3
5
|
module Hanami
|
@@ -53,14 +55,14 @@ module Hanami
|
|
53
55
|
entity.new(
|
54
56
|
command(:create, aggregate(target), mapper: nil).call(serialize(data))
|
55
57
|
)
|
56
|
-
rescue =>
|
57
|
-
raise Hanami::Model::Error.for(
|
58
|
+
rescue => exception
|
59
|
+
raise Hanami::Model::Error.for(exception)
|
58
60
|
end
|
59
61
|
|
60
62
|
def add(data)
|
61
63
|
command(:create, relation(target), mapper: nil).call(associate(serialize(data)))
|
62
|
-
rescue =>
|
63
|
-
raise Hanami::Model::Error.for(
|
64
|
+
rescue => exception
|
65
|
+
raise Hanami::Model::Error.for(exception)
|
64
66
|
end
|
65
67
|
|
66
68
|
def update(data)
|
@@ -68,14 +70,14 @@ module Hanami
|
|
68
70
|
.by_pk(
|
69
71
|
one.public_send(relation(target).primary_key)
|
70
72
|
).call(serialize(data))
|
71
|
-
rescue =>
|
72
|
-
raise Hanami::Model::Error.for(
|
73
|
+
rescue => exception
|
74
|
+
raise Hanami::Model::Error.for(exception)
|
73
75
|
end
|
74
76
|
|
75
77
|
def delete
|
76
78
|
scope.delete
|
77
79
|
end
|
78
|
-
|
80
|
+
alias_method :remove, :delete
|
79
81
|
|
80
82
|
def replace(data)
|
81
83
|
repository.transaction do
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "hanami/utils/hash"
|
2
4
|
|
3
5
|
module Hanami
|
@@ -7,7 +9,7 @@ module Hanami
|
|
7
9
|
#
|
8
10
|
# @since 0.7.0
|
9
11
|
# @api private
|
10
|
-
class ManyToMany
|
12
|
+
class ManyToMany
|
11
13
|
# @since 0.7.0
|
12
14
|
# @api private
|
13
15
|
def self.schema_type(entity)
|
@@ -76,8 +78,8 @@ module Hanami
|
|
76
78
|
def add(*data)
|
77
79
|
command(:create, relation(through), use: [:timestamps])
|
78
80
|
.call(associate(serialize(data)))
|
79
|
-
rescue =>
|
80
|
-
raise Hanami::Model::Error.for(
|
81
|
+
rescue => exception
|
82
|
+
raise Hanami::Model::Error.for(exception)
|
81
83
|
end
|
82
84
|
|
83
85
|
# @since 1.1.0
|
@@ -88,18 +90,16 @@ module Hanami
|
|
88
90
|
|
89
91
|
# @since 1.1.0
|
90
92
|
# @api private
|
91
|
-
# rubocop:disable Metrics/AbcSize
|
92
93
|
def remove(target_id)
|
93
94
|
association_record = relation(through)
|
94
|
-
|
95
|
-
|
95
|
+
.where(target_foreign_key => target_id, source_foreign_key => subject.fetch(source_primary_key))
|
96
|
+
.one
|
96
97
|
|
97
98
|
return if association_record.nil?
|
98
99
|
|
99
100
|
ar_id = association_record.public_send relation(through).primary_key
|
100
101
|
command(:delete, relation(through)).by_pk(ar_id).call
|
101
102
|
end
|
102
|
-
# rubocop:enable Metrics/AbcSize
|
103
103
|
|
104
104
|
private
|
105
105
|
|
@@ -172,17 +172,15 @@ module Hanami
|
|
172
172
|
# @since 1.1.0
|
173
173
|
#
|
174
174
|
# @api private
|
175
|
-
# rubocop:disable Metrics/AbcSize
|
176
175
|
def _build_scope
|
177
176
|
result = relation(association.target.to_sym).qualified
|
178
177
|
unless subject.nil?
|
179
178
|
result = result
|
180
|
-
|
181
|
-
|
179
|
+
.join(through, target_foreign_key => target_primary_key)
|
180
|
+
.where(source_foreign_key => subject.fetch(source_primary_key))
|
182
181
|
end
|
183
182
|
result.as(Model::MappedRelation.mapper_name)
|
184
183
|
end
|
185
|
-
# rubocop:enable Metrics/AbcSize
|
186
184
|
|
187
185
|
# @since 1.1.0
|
188
186
|
# @api private
|