granite 0.14.2 → 0.15.0
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/lib/granite/action/subject.rb +1 -1
- data/lib/granite/action/transaction_manager.rb +1 -1
- data/lib/granite/action.rb +3 -3
- data/lib/granite/base.rb +10 -10
- data/lib/granite/represents/attribute.rb +17 -12
- data/lib/granite/represents/reflection.rb +1 -1
- data/lib/granite/typecasters.rb +3 -3
- data/lib/granite/version.rb +1 -1
- data/lib/granite.rb +1 -1
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cf5813f23b963898bbdd4f55d35b2f0699428c657413ee6f18d56713ffcf659
|
4
|
+
data.tar.gz: 48a04a7a60bf1819222728acf33c8bf0a73149d9b9d83b2ea04bc70a2182ec04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b182f94aa37d25756606fe9384a5ea98963279f8a58f84a66a7660fd21a3076b46f6965d56e26d5bc75357431f9bec2dfabb639bd198b0d00529d2567dd21628
|
7
|
+
data.tar.gz: 814dbec1866a2845d869489d82051feb017e4c850460fef1af69f13d31cf6c40fb66dbddec52529e84dfd292acce8bf73bb4479f9f8e2fca42c586c9dd12b2a2
|
@@ -66,7 +66,7 @@ module Granite
|
|
66
66
|
|
67
67
|
self.subject = args.first unless args.empty?
|
68
68
|
fail SubjectNotFoundError, self.class unless subject
|
69
|
-
rescue
|
69
|
+
rescue Granite::Form::AssociationTypeMismatch
|
70
70
|
raise SubjectTypeMismatchError.new(self.class, args.first.class.name, reflection.klass)
|
71
71
|
end
|
72
72
|
|
@@ -75,7 +75,7 @@ module Granite
|
|
75
75
|
|
76
76
|
def log_errors(errors)
|
77
77
|
errors.each do |error|
|
78
|
-
|
78
|
+
Granite::Form.config.logger.error "Unhandled error in callback: #{error.inspect}\n#{error.backtrace.join("\n")}"
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
data/lib/granite/action.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'granite/form'
|
2
2
|
require 'active_record/errors'
|
3
3
|
require 'active_record/validations'
|
4
4
|
require 'active_support/callbacks'
|
@@ -27,7 +27,7 @@ module Granite
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# We are using a lot of stacked additional logic for `assign_attributes`
|
30
|
-
# At least, represented and nested attributes modules in
|
30
|
+
# At least, represented and nested attributes modules in Granite::Form
|
31
31
|
# are having such a method redefiniions. Both are prepended to the
|
32
32
|
# Granite action, so we have to prepend our patch as well in order
|
33
33
|
# to put it above all other, so it will handle the attributes first.
|
@@ -55,7 +55,7 @@ module Granite
|
|
55
55
|
merge_errors(e.record.errors)
|
56
56
|
end
|
57
57
|
|
58
|
-
handle_exception
|
58
|
+
handle_exception Granite::Form::ValidationError do |e|
|
59
59
|
merge_errors(e.model.errors)
|
60
60
|
end
|
61
61
|
|
data/lib/granite/base.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
1
|
+
require 'granite/form/model'
|
2
|
+
require 'granite/form/model/primary'
|
3
|
+
require 'granite/form/model/lifecycle'
|
4
|
+
require 'granite/form/model/associations'
|
5
5
|
|
6
6
|
require 'granite/translations'
|
7
7
|
require 'granite/represents'
|
8
8
|
require 'granite/assign_data'
|
9
9
|
|
10
10
|
module Granite
|
11
|
-
# Base included in Granite::Action, but also used by
|
11
|
+
# Base included in Granite::Action, but also used by Granite::Form when building data objects (e.g. when using
|
12
12
|
# embeds_many)
|
13
13
|
module Base
|
14
14
|
extend ActiveSupport::Concern
|
15
15
|
|
16
16
|
include ActiveSupport::Callbacks
|
17
|
-
include
|
18
|
-
include
|
19
|
-
include
|
20
|
-
include
|
21
|
-
include
|
17
|
+
include Granite::Form::Model
|
18
|
+
include Granite::Form::Model::Representation
|
19
|
+
include Granite::Form::Model::Dirty
|
20
|
+
include Granite::Form::Model::Associations
|
21
|
+
include Granite::Form::Model::Primary
|
22
22
|
include ActiveModel::Validations::Callbacks
|
23
23
|
|
24
24
|
include Granite::Util
|
@@ -1,10 +1,9 @@
|
|
1
1
|
module Granite
|
2
2
|
module Represents
|
3
|
-
class Attribute <
|
3
|
+
class Attribute < Granite::Form::Model::Attributes::Attribute
|
4
4
|
types = {}
|
5
5
|
types[ActiveRecord::Enum::EnumType] = String if defined?(ActiveRecord)
|
6
6
|
TYPES = types.freeze
|
7
|
-
|
8
7
|
delegate :writer, :reader, :reader_before_type_cast, to: :reflection
|
9
8
|
|
10
9
|
def initialize(*_args)
|
@@ -27,13 +26,13 @@ module Granite
|
|
27
26
|
def type
|
28
27
|
return reflection.options[:type] if reflection.options[:type].present?
|
29
28
|
|
30
|
-
|
29
|
+
granite_form_type || type_from_type_for_attribute || super
|
31
30
|
end
|
32
31
|
|
33
32
|
def typecaster
|
34
33
|
@typecaster ||= begin
|
35
34
|
type_class = type.instance_of?(Class) ? type : type.class
|
36
|
-
@typecaster =
|
35
|
+
@typecaster = Granite::Form.typecaster(type_class.ancestors.grep(Class))
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
@@ -67,26 +66,26 @@ module Granite
|
|
67
66
|
end
|
68
67
|
end
|
69
68
|
|
70
|
-
def
|
71
|
-
return nil unless reference.is_a?(
|
69
|
+
def granite_form_type
|
70
|
+
return nil unless reference.is_a?(Granite::Form::Model)
|
72
71
|
|
73
72
|
reference_attribute = reference.attribute(name)
|
74
73
|
|
75
74
|
return nil if reference_attribute.nil?
|
76
75
|
|
77
76
|
return Granite::Action::Types::Collection.new(reference_attribute.type) if [
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
Granite::Form::Model::Attributes::ReferenceMany,
|
78
|
+
Granite::Form::Model::Attributes::Collection,
|
79
|
+
Granite::Form::Model::Attributes::Dictionary
|
81
80
|
].any? { |klass| reference_attribute.is_a? klass }
|
82
81
|
|
83
|
-
reference_attribute.type # TODO: create `type_for_attribute` method inside of
|
82
|
+
reference_attribute.type # TODO: create `type_for_attribute` method inside of Granite::Form
|
84
83
|
end
|
85
84
|
|
86
85
|
def type_from_type_for_attribute
|
87
86
|
return nil unless reference.respond_to?(:type_for_attribute)
|
88
87
|
|
89
|
-
attribute_type = reference.type_for_attribute(
|
88
|
+
attribute_type = reference.type_for_attribute(attribute_name.to_s)
|
90
89
|
|
91
90
|
return TYPES[attribute_type.class] if TYPES.key?(attribute_type.class)
|
92
91
|
return Granite::Action::Types::Collection.new(convert_type_to_value_class(attribute_type.subtype)) if attribute_type.respond_to?(:subtype)
|
@@ -94,10 +93,16 @@ module Granite
|
|
94
93
|
convert_type_to_value_class(attribute_type)
|
95
94
|
end
|
96
95
|
|
96
|
+
def attribute_name
|
97
|
+
return name if ActiveModel.version >= Gem::Version.new('6.1.0')
|
98
|
+
|
99
|
+
reference.class.attribute_aliases[name.to_s] || name
|
100
|
+
end
|
101
|
+
|
97
102
|
def convert_type_to_value_class(attribute_type)
|
98
103
|
return attribute_type.value_class if attribute_type.respond_to?(:value_class)
|
99
104
|
|
100
|
-
|
105
|
+
Granite::Form::Model::Associations::PersistenceAdapters::ActiveRecord::TYPES[attribute_type.type&.to_sym]
|
101
106
|
end
|
102
107
|
end
|
103
108
|
end
|
@@ -2,7 +2,7 @@ require 'granite/represents/attribute'
|
|
2
2
|
|
3
3
|
module Granite
|
4
4
|
module Represents
|
5
|
-
class Reflection <
|
5
|
+
class Reflection < Granite::Form::Model::Attributes::Reflections::Represents
|
6
6
|
class << self
|
7
7
|
def build(target, generated_methods, name, *args, &block)
|
8
8
|
options = args.last
|
data/lib/granite/typecasters.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'granite/form'
|
2
2
|
|
3
|
-
|
4
|
-
typecaster =
|
3
|
+
Granite::Form.typecaster('Granite::Action::Types::Collection') do |value, attribute|
|
4
|
+
typecaster = Granite::Form.typecaster(attribute.type.subtype)
|
5
5
|
if value.respond_to? :transform_values
|
6
6
|
value.transform_values { |v| typecaster.call(v, attribute) }
|
7
7
|
elsif value.respond_to?(:map)
|
data/lib/granite/version.rb
CHANGED
data/lib/granite.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: granite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toptal Engineering
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -31,19 +31,19 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '7.1'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: granite-form
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: '0'
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - ">="
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: '0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: activesupport
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -316,8 +316,8 @@ dependencies:
|
|
316
316
|
- - "~>"
|
317
317
|
- !ruby/object:Gem::Version
|
318
318
|
version: '0.15'
|
319
|
-
description:
|
320
|
-
email:
|
319
|
+
description:
|
320
|
+
email:
|
321
321
|
executables: []
|
322
322
|
extensions: []
|
323
323
|
extra_rdoc_files: []
|
@@ -400,7 +400,7 @@ homepage: https://github.com/toptal/granite
|
|
400
400
|
licenses:
|
401
401
|
- MIT
|
402
402
|
metadata: {}
|
403
|
-
post_install_message:
|
403
|
+
post_install_message:
|
404
404
|
rdoc_options: []
|
405
405
|
require_paths:
|
406
406
|
- lib
|
@@ -416,7 +416,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
416
416
|
version: '0'
|
417
417
|
requirements: []
|
418
418
|
rubygems_version: 3.2.33
|
419
|
-
signing_key:
|
419
|
+
signing_key:
|
420
420
|
specification_version: 4
|
421
421
|
summary: Another business actions architecture for Rails apps
|
422
422
|
test_files: []
|