hanami-model 1.1.0.beta3 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c64dfcdd1616b645a080b12ce2e763be46e5a92
4
- data.tar.gz: a9b0a57fd07dcddba9643c2a7cf88f76c30aee7a
3
+ metadata.gz: ac1d93bb8d958c05f22b8a5f14e0072c0c7df823
4
+ data.tar.gz: 369794a0d62a1e06d55181564bc15693e4b0ab46
5
5
  SHA512:
6
- metadata.gz: e43cca5364df05068b20b79f0771bf9212ddd06e0a8a1870d8424bb734e09970ab829c17486807104e896c47e065becff02ae0776c6e35188c262167974f7d10
7
- data.tar.gz: e7f9e4fb375d026d86d26f678717eab426574e3f45e667c7034128af2bd065e43bbebd44116720f5991b6f34052d6f1c12220a55986b65adb434905ba6e7d179
6
+ metadata.gz: e01d7c581d03cecc7eeee81cef39abd574581e015d677ce623ddf0339a336b98f434995583b6008a9fabd275fe41a764ea4c872309c66b2148ff6aef134a102e
7
+ data.tar.gz: '08df89ae8621493379cd07cd7c5f78d7ac380319b7312d33d8f26d57eaa5065549773ed6bf5cbbb965838235fc93c2d9b41cac96c98124e9fbd74ad1157c6815'
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Hanami::Model
2
2
  A persistence layer for Hanami
3
3
 
4
+ ## v1.1.0.rc1 - 2017-10-16
5
+ ### Added
6
+ - [Marcello Rocha] Added support for associations aliasing via `:as` option (`has_many :users, through: :comments, as: :authors`)
7
+ - [Luca Guidi] Allow entities to be used as type in entities manual schema (`attribute :owner, Types::Entity(User)`)
8
+
4
9
  ## v1.1.0.beta3 - 2017-10-04
5
10
 
6
11
  ## v1.1.0.beta2 - 2017-10-03
@@ -21,6 +26,16 @@ A persistence layer for Hanami
21
26
  ### Fixed
22
27
  - [Sean Collins] Enhanced error message for Postgres `db create` and `db drop` when `createdb` and `dropdb` aren't in `PATH`
23
28
 
29
+ ## v1.0.4 - 2017-10-14
30
+ ### Fixed
31
+ - [Nikita Shilnikov] Keep the dependency on `dry-sql` at `~> 1.3`, which is compatible with `dry-types` `~> 0.11.0`
32
+ - [Nikita Shilnikov] Ensure to write Postgres JSON (`PGJSON`) type for nested associated records
33
+ - [Nikita Shilnikov] Ensure `Repository#select` to work with `Hanami::Model::MappedRelation`
34
+
35
+ ## v1.0.3 - 2017-10-11
36
+ ### Fixed
37
+ - [Luca Guidi] Keep the dependency on `dry-types` at `~> 0.11.0`
38
+
24
39
  ## v1.0.2 - 2017-08-04
25
40
  ### Fixed
26
41
  - [Maurizio De Magnis] URI escape for Postgres password
data/hanami-model.gemspec CHANGED
@@ -18,10 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ['lib']
19
19
  spec.required_ruby_version = '>= 2.3.0'
20
20
 
21
- spec.add_runtime_dependency 'hanami-utils', '1.1.0.beta3'
22
- spec.add_runtime_dependency 'rom-sql', '~> 1.3'
21
+ spec.add_runtime_dependency 'hanami-utils', '1.1.0.rc1'
22
+ spec.add_runtime_dependency 'rom', '~> 3.3', '>= 3.3.2'
23
+ spec.add_runtime_dependency 'rom-sql', '~> 1.3', '>= 1.3.5'
23
24
  spec.add_runtime_dependency 'rom-repository', '~> 1.4'
24
- spec.add_runtime_dependency 'dry-types', '~> 0.11'
25
+ spec.add_runtime_dependency 'dry-types', '~> 0.11.0'
25
26
  spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
26
27
 
27
28
  spec.add_development_dependency 'bundler'
@@ -82,15 +82,22 @@ module Hanami
82
82
  # @since 1.1.0
83
83
  # @api private
84
84
  def association_keys
85
- relation(source)
86
- .associations[target]
85
+ association
87
86
  .__send__(:join_key_map, container.relations)
88
87
  end
89
88
 
89
+ # Return the ROM::Associations for the source relation
90
+ #
91
+ # @since 1.1.9
92
+ # @api private
93
+ def association
94
+ relation(source).associations[target]
95
+ end
96
+
90
97
  # @since 1.1.0
91
98
  # @api private
92
99
  def _build_scope
93
- result = relation(target)
100
+ result = relation(association.target.to_sym)
94
101
  result = result.where(foreign_key => subject.fetch(primary_key)) unless subject.nil?
95
102
  result.as(Model::MappedRelation.mapper_name)
96
103
  end
@@ -7,7 +7,7 @@ module Hanami
7
7
  #
8
8
  # @since 0.7.0
9
9
  # @api private
10
- class HasMany
10
+ class HasMany # rubocop:disable Metrics/ClassLength
11
11
  # @since 0.7.0
12
12
  # @api private
13
13
  def self.schema_type(entity)
@@ -177,15 +177,22 @@ module Hanami
177
177
  # @since 0.7.0
178
178
  # @api private
179
179
  def association_keys
180
- relation(source)
181
- .associations[target]
180
+ target_association
182
181
  .__send__(:join_key_map, container.relations)
183
182
  end
184
183
 
184
+ # Returns the targeted association for a given source
185
+ #
186
+ # @since 0.7.0
187
+ # @api private
188
+ def target_association
189
+ relation(source).associations[target]
190
+ end
191
+
185
192
  # @since 0.7.0
186
193
  # @api private
187
194
  def _build_scope
188
- result = relation(target)
195
+ result = relation(target_association.target.to_sym)
189
196
  result = result.where(foreign_key => subject.fetch(primary_key)) unless subject.nil?
190
197
  result.as(Model::MappedRelation.mapper_name)
191
198
  end
@@ -158,11 +158,20 @@ module Hanami
158
158
  association_keys[1].last
159
159
  end
160
160
 
161
+ # Return the ROM::Associations for the source relation
162
+ #
161
163
  # @since 1.1.0
162
164
  # @api private
165
+ def association
166
+ relation(source).associations[target]
167
+ end
168
+
169
+ # @since 1.1.0
170
+ #
171
+ # @api private
163
172
  # rubocop:disable Metrics/AbcSize
164
173
  def _build_scope
165
- result = relation(target).qualified
174
+ result = relation(association.target.to_sym).qualified
166
175
  unless subject.nil?
167
176
  result = result
168
177
  .join(through, target_foreign_key => target_primary_key)
@@ -23,7 +23,7 @@ module Hanami
23
23
  # @since 0.7.0
24
24
  # @api private
25
25
  def [](value)
26
- @mapping.process(@input[value])
26
+ @input[@mapping.process(value)]
27
27
  end
28
28
  end
29
29
 
@@ -31,7 +31,7 @@ module Hanami
31
31
  # @since 0.7.0
32
32
  # @api private
33
33
  def [](value)
34
- return value unless timestamps?
34
+ return @input[value] unless timestamps?
35
35
  _touch(@input[value], Time.now)
36
36
  end
37
37
 
@@ -122,7 +122,7 @@ module Hanami
122
122
  # @api private
123
123
  def build_associations(registry, associations)
124
124
  associations.each_with_object({}) do |(name, association), result|
125
- target = registry.fetch(name)
125
+ target = registry.fetch(association.target.to_sym)
126
126
  result[name] = Association.lookup(association).schema_type(target)
127
127
  end
128
128
  end
@@ -82,11 +82,21 @@ module Hanami
82
82
  end
83
83
  end
84
84
 
85
+ # @since 1.0.4
86
+ # @api private
87
+ def self.pg_json_pristines
88
+ @pg_json_pristines ||= ::Hash.new do |hash, type|
89
+ hash[type] = if defined?(ROM::SQL::Types::PG)
90
+ ROM::SQL::Types::PG.const_get(type).pristine
91
+ end
92
+ end
93
+ end
94
+
85
95
  # @since 1.0.2
86
96
  # @api private
87
97
  def self.pg_json?(pristine)
88
- (defined?(ROM::SQL::Types::PG::JSONB) && pristine == ROM::SQL::Types::PG::JSONB) ||
89
- (defined?(ROM::SQL::Types::PG::JSON) && pristine == ROM::SQL::Types::PG::JSON)
98
+ pristine == pg_json_pristines['JSONB'.freeze] ||
99
+ pristine == pg_json_pristines['JSON'.freeze]
90
100
  end
91
101
 
92
102
  private_class_method :pg_json?
@@ -17,15 +17,67 @@ module Hanami
17
17
  # Class level interface
18
18
  #
19
19
  # @since 0.7.0
20
+ # rubocop:disable Naming/MethodName
20
21
  module ClassMethods
22
+ # Define an entity of the given type
23
+ #
24
+ # @param type [Hanami::Entity] an entity
25
+ #
26
+ # @since 1.1.0
27
+ #
28
+ # @example
29
+ # require "hanami/model"
30
+ #
31
+ # class Account < Hanami::Entity
32
+ # attributes do
33
+ # # ...
34
+ # attribute :owner, Types::Entity(User)
35
+ # end
36
+ # end
37
+ #
38
+ # account = Account.new(owner: User.new(name: "Luca"))
39
+ # account.owner.class # => User
40
+ # account.owner.name # => "Luca"
41
+ #
42
+ # account = Account.new(owner: { name: "MG" })
43
+ # account.owner.class # => User
44
+ # account.owner.name # => "MG"
45
+ def Entity(type)
46
+ type = Schema::CoercibleType.new(type) unless type.is_a?(Dry::Types::Definition)
47
+ type
48
+ end
49
+
21
50
  # Define an array of given type
22
51
  #
52
+ # @param type [Object] an object
53
+ #
23
54
  # @since 0.7.0
24
- def Collection(type) # rubocop:disable Naming/MethodName
55
+ #
56
+ # @example
57
+ # require "hanami/model"
58
+ #
59
+ # class Account < Hanami::Entity
60
+ # attributes do
61
+ # # ...
62
+ # attribute :users, Types::Collection(User)
63
+ # end
64
+ # end
65
+ #
66
+ # account = Account.new(users: [User.new(name: "Luca")])
67
+ # user = account.users.first
68
+ # user.class # => User
69
+ # user.name # => "Luca"
70
+ #
71
+ # account = Account.new(users: [{ name: "MG" }])
72
+ # user = account.users.first
73
+ # user.class # => User
74
+ # user.name # => "MG"
75
+ def Collection(type)
25
76
  type = Schema::CoercibleType.new(type) unless type.is_a?(Dry::Types::Definition)
26
77
  Types::Array.member(type)
27
78
  end
28
79
  end
80
+ # rubocop:enable Naming/MethodName
29
81
 
30
82
  # Types for schema definitions
31
83
  #
@@ -3,6 +3,6 @@ module Hanami
3
3
  # Defines the version
4
4
  #
5
5
  # @since 0.1.0
6
- VERSION = '1.1.0.beta3'.freeze
6
+ VERSION = '1.1.0.rc1'.freeze
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.beta3
4
+ version: 1.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-04 00:00:00.000000000 Z
11
+ date: 2017-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hanami-utils
@@ -16,14 +16,34 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.0.beta3
19
+ version: 1.1.0.rc1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 1.1.0.beta3
26
+ version: 1.1.0.rc1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rom
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.3'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 3.3.2
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '3.3'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 3.3.2
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: rom-sql
29
49
  requirement: !ruby/object:Gem::Requirement
@@ -31,6 +51,9 @@ dependencies:
31
51
  - - "~>"
32
52
  - !ruby/object:Gem::Version
33
53
  version: '1.3'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 1.3.5
34
57
  type: :runtime
35
58
  prerelease: false
36
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +61,9 @@ dependencies:
38
61
  - - "~>"
39
62
  - !ruby/object:Gem::Version
40
63
  version: '1.3'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 1.3.5
41
67
  - !ruby/object:Gem::Dependency
42
68
  name: rom-repository
43
69
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +84,14 @@ dependencies:
58
84
  requirements:
59
85
  - - "~>"
60
86
  - !ruby/object:Gem::Version
61
- version: '0.11'
87
+ version: 0.11.0
62
88
  type: :runtime
63
89
  prerelease: false
64
90
  version_requirements: !ruby/object:Gem::Requirement
65
91
  requirements:
66
92
  - - "~>"
67
93
  - !ruby/object:Gem::Version
68
- version: '0.11'
94
+ version: 0.11.0
69
95
  - !ruby/object:Gem::Dependency
70
96
  name: concurrent-ruby
71
97
  requirement: !ruby/object:Gem::Requirement