activemodel 4.2.0 → 6.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +49 -37
- data/MIT-LICENSE +1 -1
- data/README.rdoc +16 -22
- data/lib/active_model/attribute/user_provided_default.rb +51 -0
- data/lib/active_model/attribute.rb +248 -0
- data/lib/active_model/attribute_assignment.rb +55 -0
- data/lib/active_model/attribute_methods.rb +150 -73
- data/lib/active_model/attribute_mutation_tracker.rb +181 -0
- data/lib/active_model/attribute_set/builder.rb +191 -0
- data/lib/active_model/attribute_set/yaml_encoder.rb +40 -0
- data/lib/active_model/attribute_set.rb +106 -0
- data/lib/active_model/attributes.rb +132 -0
- data/lib/active_model/callbacks.rb +31 -25
- data/lib/active_model/conversion.rb +20 -9
- data/lib/active_model/dirty.rb +142 -116
- data/lib/active_model/error.rb +207 -0
- data/lib/active_model/errors.rb +436 -202
- data/lib/active_model/forbidden_attributes_protection.rb +6 -3
- data/lib/active_model/gem_version.rb +5 -3
- data/lib/active_model/lint.rb +47 -42
- data/lib/active_model/locale/en.yml +2 -1
- data/lib/active_model/model.rb +7 -7
- data/lib/active_model/naming.rb +36 -18
- data/lib/active_model/nested_error.rb +22 -0
- data/lib/active_model/railtie.rb +8 -0
- data/lib/active_model/secure_password.rb +61 -67
- data/lib/active_model/serialization.rb +48 -17
- data/lib/active_model/serializers/json.rb +22 -13
- data/lib/active_model/translation.rb +5 -4
- data/lib/active_model/type/big_integer.rb +14 -0
- data/lib/active_model/type/binary.rb +52 -0
- data/lib/active_model/type/boolean.rb +46 -0
- data/lib/active_model/type/date.rb +52 -0
- data/lib/active_model/type/date_time.rb +46 -0
- data/lib/active_model/type/decimal.rb +69 -0
- data/lib/active_model/type/float.rb +35 -0
- data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +49 -0
- data/lib/active_model/type/helpers/mutable.rb +20 -0
- data/lib/active_model/type/helpers/numeric.rb +48 -0
- data/lib/active_model/type/helpers/time_value.rb +90 -0
- data/lib/active_model/type/helpers/timezone.rb +19 -0
- data/lib/active_model/type/helpers.rb +7 -0
- data/lib/active_model/type/immutable_string.rb +35 -0
- data/lib/active_model/type/integer.rb +67 -0
- data/lib/active_model/type/registry.rb +70 -0
- data/lib/active_model/type/string.rb +35 -0
- data/lib/active_model/type/time.rb +46 -0
- data/lib/active_model/type/value.rb +133 -0
- data/lib/active_model/type.rb +53 -0
- data/lib/active_model/validations/absence.rb +6 -4
- data/lib/active_model/validations/acceptance.rb +72 -14
- data/lib/active_model/validations/callbacks.rb +23 -19
- data/lib/active_model/validations/clusivity.rb +18 -12
- data/lib/active_model/validations/confirmation.rb +27 -14
- data/lib/active_model/validations/exclusion.rb +7 -4
- data/lib/active_model/validations/format.rb +27 -27
- data/lib/active_model/validations/helper_methods.rb +15 -0
- data/lib/active_model/validations/inclusion.rb +8 -7
- data/lib/active_model/validations/length.rb +35 -32
- data/lib/active_model/validations/numericality.rb +72 -34
- data/lib/active_model/validations/presence.rb +3 -3
- data/lib/active_model/validations/validates.rb +17 -15
- data/lib/active_model/validations/with.rb +6 -12
- data/lib/active_model/validations.rb +58 -23
- data/lib/active_model/validator.rb +23 -17
- data/lib/active_model/version.rb +4 -2
- data/lib/active_model.rb +18 -11
- metadata +44 -25
- data/lib/active_model/serializers/xml.rb +0 -238
- data/lib/active_model/test_case.rb +0 -4
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_support/core_ext/module/anonymous"
|
2
4
|
|
3
5
|
module ActiveModel
|
4
|
-
|
5
6
|
# == Active \Model \Validator
|
6
7
|
#
|
7
8
|
# A simple base class that can be used along with
|
@@ -15,7 +16,7 @@ module ActiveModel
|
|
15
16
|
# class MyValidator < ActiveModel::Validator
|
16
17
|
# def validate(record)
|
17
18
|
# if some_complex_logic
|
18
|
-
# record.errors
|
19
|
+
# record.errors.add(:base, "This record is invalid")
|
19
20
|
# end
|
20
21
|
# end
|
21
22
|
#
|
@@ -83,13 +84,13 @@ module ActiveModel
|
|
83
84
|
# end
|
84
85
|
#
|
85
86
|
# It can be useful to access the class that is using that validator when there are prerequisites such
|
86
|
-
# as an +attr_accessor+ being present. This class is accessible via
|
87
|
-
# To
|
87
|
+
# as an +attr_accessor+ being present. This class is accessible via <tt>options[:class]</tt> in the constructor.
|
88
|
+
# To set up your validator override the constructor.
|
88
89
|
#
|
89
90
|
# class MyValidator < ActiveModel::Validator
|
90
91
|
# def initialize(options={})
|
91
92
|
# super
|
92
|
-
# options[:class].
|
93
|
+
# options[:class].attr_accessor :custom_attribute
|
93
94
|
# end
|
94
95
|
# end
|
95
96
|
class Validator
|
@@ -98,20 +99,20 @@ module ActiveModel
|
|
98
99
|
# Returns the kind of the validator.
|
99
100
|
#
|
100
101
|
# PresenceValidator.kind # => :presence
|
101
|
-
#
|
102
|
+
# AcceptanceValidator.kind # => :acceptance
|
102
103
|
def self.kind
|
103
|
-
@kind ||= name.split(
|
104
|
+
@kind ||= name.split("::").last.underscore.chomp("_validator").to_sym unless anonymous?
|
104
105
|
end
|
105
106
|
|
106
107
|
# Accepts options that will be made available through the +options+ reader.
|
107
108
|
def initialize(options = {})
|
108
|
-
@options
|
109
|
+
@options = options.except(:class).freeze
|
109
110
|
end
|
110
111
|
|
111
112
|
# Returns the kind for this validator.
|
112
113
|
#
|
113
|
-
# PresenceValidator.new.kind
|
114
|
-
#
|
114
|
+
# PresenceValidator.new(attributes: [:username]).kind # => :presence
|
115
|
+
# AcceptanceValidator.new(attributes: [:terms]).kind # => :acceptance
|
115
116
|
def kind
|
116
117
|
self.class.kind
|
117
118
|
end
|
@@ -127,7 +128,7 @@ module ActiveModel
|
|
127
128
|
# in the options hash invoking the <tt>validate_each</tt> method passing in the
|
128
129
|
# record, attribute and value.
|
129
130
|
#
|
130
|
-
# All Active Model validations are built on top of this validator.
|
131
|
+
# All \Active \Model validations are built on top of this validator.
|
131
132
|
class EachValidator < Validator #:nodoc:
|
132
133
|
attr_reader :attributes
|
133
134
|
|
@@ -142,12 +143,13 @@ module ActiveModel
|
|
142
143
|
end
|
143
144
|
|
144
145
|
# Performs validation on the supplied record. By default this will call
|
145
|
-
# +
|
146
|
-
# override +
|
146
|
+
# +validate_each+ to determine validity therefore subclasses should
|
147
|
+
# override +validate_each+ with validation logic.
|
147
148
|
def validate(record)
|
148
149
|
attributes.each do |attribute|
|
149
150
|
value = record.read_attribute_for_validation(attribute)
|
150
151
|
next if (value.nil? && options[:allow_nil]) || (value.blank? && options[:allow_blank])
|
152
|
+
value = prepare_value_for_validation(value, record, attribute)
|
151
153
|
validate_each(record, attribute, value)
|
152
154
|
end
|
153
155
|
end
|
@@ -163,6 +165,11 @@ module ActiveModel
|
|
163
165
|
# +ArgumentError+ when invalid options are supplied.
|
164
166
|
def check_validity!
|
165
167
|
end
|
168
|
+
|
169
|
+
private
|
170
|
+
def prepare_value_for_validation(value, record, attr_name)
|
171
|
+
value
|
172
|
+
end
|
166
173
|
end
|
167
174
|
|
168
175
|
# +BlockValidator+ is a special +EachValidator+ which receives a block on initialization
|
@@ -174,9 +181,8 @@ module ActiveModel
|
|
174
181
|
end
|
175
182
|
|
176
183
|
private
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
184
|
+
def validate_each(record, attribute, value)
|
185
|
+
@block.call(record, attribute, value)
|
186
|
+
end
|
181
187
|
end
|
182
188
|
end
|
data/lib/active_model/version.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "gem_version"
|
2
4
|
|
3
5
|
module ActiveModel
|
4
|
-
# Returns the version of the currently loaded
|
6
|
+
# Returns the version of the currently loaded \Active \Model as a <tt>Gem::Version</tt>
|
5
7
|
def self.version
|
6
8
|
gem_version
|
7
9
|
end
|
data/lib/active_model.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
#--
|
2
|
-
# Copyright (c) 2004-
|
4
|
+
# Copyright (c) 2004-2020 David Heinemeier Hansson
|
3
5
|
#
|
4
6
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
7
|
# a copy of this software and associated documentation files (the
|
@@ -21,34 +23,40 @@
|
|
21
23
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
24
|
#++
|
23
25
|
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
26
|
+
require "active_support"
|
27
|
+
require "active_support/rails"
|
28
|
+
require "active_model/version"
|
27
29
|
|
28
30
|
module ActiveModel
|
29
31
|
extend ActiveSupport::Autoload
|
30
32
|
|
33
|
+
autoload :Attribute
|
34
|
+
autoload :Attributes
|
35
|
+
autoload :AttributeAssignment
|
31
36
|
autoload :AttributeMethods
|
32
|
-
autoload :BlockValidator,
|
37
|
+
autoload :BlockValidator, "active_model/validator"
|
33
38
|
autoload :Callbacks
|
34
39
|
autoload :Conversion
|
35
40
|
autoload :Dirty
|
36
|
-
autoload :EachValidator,
|
41
|
+
autoload :EachValidator, "active_model/validator"
|
37
42
|
autoload :ForbiddenAttributesProtection
|
38
43
|
autoload :Lint
|
39
44
|
autoload :Model
|
40
|
-
autoload :Name,
|
45
|
+
autoload :Name, "active_model/naming"
|
41
46
|
autoload :Naming
|
42
47
|
autoload :SecurePassword
|
43
48
|
autoload :Serialization
|
44
|
-
autoload :TestCase
|
45
49
|
autoload :Translation
|
50
|
+
autoload :Type
|
46
51
|
autoload :Validations
|
47
52
|
autoload :Validator
|
48
53
|
|
49
54
|
eager_autoload do
|
50
55
|
autoload :Errors
|
51
|
-
autoload :
|
56
|
+
autoload :Error
|
57
|
+
autoload :RangeError, "active_model/errors"
|
58
|
+
autoload :StrictValidationFailed, "active_model/errors"
|
59
|
+
autoload :UnknownAttributeError, "active_model/errors"
|
52
60
|
end
|
53
61
|
|
54
62
|
module Serializers
|
@@ -56,7 +64,6 @@ module ActiveModel
|
|
56
64
|
|
57
65
|
eager_autoload do
|
58
66
|
autoload :JSON
|
59
|
-
autoload :Xml
|
60
67
|
end
|
61
68
|
end
|
62
69
|
|
@@ -67,5 +74,5 @@ module ActiveModel
|
|
67
74
|
end
|
68
75
|
|
69
76
|
ActiveSupport.on_load(:i18n) do
|
70
|
-
I18n.load_path << File.
|
77
|
+
I18n.load_path << File.expand_path("active_model/locale/en.yml", __dir__)
|
71
78
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activemodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,28 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 6.1.0
|
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:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: builder
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.1'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '3.1'
|
26
|
+
version: 6.1.0
|
41
27
|
description: A toolkit for building modeling frameworks like Active Record. Rich support
|
42
28
|
for attributes, callbacks, validations, serialization, internationalization, and
|
43
29
|
testing.
|
@@ -50,10 +36,19 @@ files:
|
|
50
36
|
- MIT-LICENSE
|
51
37
|
- README.rdoc
|
52
38
|
- lib/active_model.rb
|
39
|
+
- lib/active_model/attribute.rb
|
40
|
+
- lib/active_model/attribute/user_provided_default.rb
|
41
|
+
- lib/active_model/attribute_assignment.rb
|
53
42
|
- lib/active_model/attribute_methods.rb
|
43
|
+
- lib/active_model/attribute_mutation_tracker.rb
|
44
|
+
- lib/active_model/attribute_set.rb
|
45
|
+
- lib/active_model/attribute_set/builder.rb
|
46
|
+
- lib/active_model/attribute_set/yaml_encoder.rb
|
47
|
+
- lib/active_model/attributes.rb
|
54
48
|
- lib/active_model/callbacks.rb
|
55
49
|
- lib/active_model/conversion.rb
|
56
50
|
- lib/active_model/dirty.rb
|
51
|
+
- lib/active_model/error.rb
|
57
52
|
- lib/active_model/errors.rb
|
58
53
|
- lib/active_model/forbidden_attributes_protection.rb
|
59
54
|
- lib/active_model/gem_version.rb
|
@@ -61,13 +56,32 @@ files:
|
|
61
56
|
- lib/active_model/locale/en.yml
|
62
57
|
- lib/active_model/model.rb
|
63
58
|
- lib/active_model/naming.rb
|
59
|
+
- lib/active_model/nested_error.rb
|
64
60
|
- lib/active_model/railtie.rb
|
65
61
|
- lib/active_model/secure_password.rb
|
66
62
|
- lib/active_model/serialization.rb
|
67
63
|
- lib/active_model/serializers/json.rb
|
68
|
-
- lib/active_model/serializers/xml.rb
|
69
|
-
- lib/active_model/test_case.rb
|
70
64
|
- lib/active_model/translation.rb
|
65
|
+
- lib/active_model/type.rb
|
66
|
+
- lib/active_model/type/big_integer.rb
|
67
|
+
- lib/active_model/type/binary.rb
|
68
|
+
- lib/active_model/type/boolean.rb
|
69
|
+
- lib/active_model/type/date.rb
|
70
|
+
- lib/active_model/type/date_time.rb
|
71
|
+
- lib/active_model/type/decimal.rb
|
72
|
+
- lib/active_model/type/float.rb
|
73
|
+
- lib/active_model/type/helpers.rb
|
74
|
+
- lib/active_model/type/helpers/accepts_multiparameter_time.rb
|
75
|
+
- lib/active_model/type/helpers/mutable.rb
|
76
|
+
- lib/active_model/type/helpers/numeric.rb
|
77
|
+
- lib/active_model/type/helpers/time_value.rb
|
78
|
+
- lib/active_model/type/helpers/timezone.rb
|
79
|
+
- lib/active_model/type/immutable_string.rb
|
80
|
+
- lib/active_model/type/integer.rb
|
81
|
+
- lib/active_model/type/registry.rb
|
82
|
+
- lib/active_model/type/string.rb
|
83
|
+
- lib/active_model/type/time.rb
|
84
|
+
- lib/active_model/type/value.rb
|
71
85
|
- lib/active_model/validations.rb
|
72
86
|
- lib/active_model/validations/absence.rb
|
73
87
|
- lib/active_model/validations/acceptance.rb
|
@@ -76,6 +90,7 @@ files:
|
|
76
90
|
- lib/active_model/validations/confirmation.rb
|
77
91
|
- lib/active_model/validations/exclusion.rb
|
78
92
|
- lib/active_model/validations/format.rb
|
93
|
+
- lib/active_model/validations/helper_methods.rb
|
79
94
|
- lib/active_model/validations/inclusion.rb
|
80
95
|
- lib/active_model/validations/length.rb
|
81
96
|
- lib/active_model/validations/numericality.rb
|
@@ -84,10 +99,15 @@ files:
|
|
84
99
|
- lib/active_model/validations/with.rb
|
85
100
|
- lib/active_model/validator.rb
|
86
101
|
- lib/active_model/version.rb
|
87
|
-
homepage:
|
102
|
+
homepage: https://rubyonrails.org
|
88
103
|
licenses:
|
89
104
|
- MIT
|
90
|
-
metadata:
|
105
|
+
metadata:
|
106
|
+
bug_tracker_uri: https://github.com/rails/rails/issues
|
107
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.1.0/activemodel/CHANGELOG.md
|
108
|
+
documentation_uri: https://api.rubyonrails.org/v6.1.0/
|
109
|
+
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
110
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.1.0/activemodel
|
91
111
|
post_install_message:
|
92
112
|
rdoc_options: []
|
93
113
|
require_paths:
|
@@ -96,15 +116,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
116
|
requirements:
|
97
117
|
- - ">="
|
98
118
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
119
|
+
version: 2.5.0
|
100
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
121
|
requirements:
|
102
122
|
- - ">="
|
103
123
|
- !ruby/object:Gem::Version
|
104
124
|
version: '0'
|
105
125
|
requirements: []
|
106
|
-
|
107
|
-
rubygems_version: 2.2.2
|
126
|
+
rubygems_version: 3.1.4
|
108
127
|
signing_key:
|
109
128
|
specification_version: 4
|
110
129
|
summary: A toolkit for building modeling frameworks (part of Rails).
|
@@ -1,238 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/module/attribute_accessors'
|
2
|
-
require 'active_support/core_ext/array/conversions'
|
3
|
-
require 'active_support/core_ext/hash/conversions'
|
4
|
-
require 'active_support/core_ext/hash/slice'
|
5
|
-
require 'active_support/core_ext/time/acts_like'
|
6
|
-
|
7
|
-
module ActiveModel
|
8
|
-
module Serializers
|
9
|
-
# == Active Model XML Serializer
|
10
|
-
module Xml
|
11
|
-
extend ActiveSupport::Concern
|
12
|
-
include ActiveModel::Serialization
|
13
|
-
|
14
|
-
included do
|
15
|
-
extend ActiveModel::Naming
|
16
|
-
end
|
17
|
-
|
18
|
-
class Serializer #:nodoc:
|
19
|
-
class Attribute #:nodoc:
|
20
|
-
attr_reader :name, :value, :type
|
21
|
-
|
22
|
-
def initialize(name, serializable, value)
|
23
|
-
@name, @serializable = name, serializable
|
24
|
-
|
25
|
-
if value.acts_like?(:time) && value.respond_to?(:in_time_zone)
|
26
|
-
value = value.in_time_zone
|
27
|
-
end
|
28
|
-
|
29
|
-
@value = value
|
30
|
-
@type = compute_type
|
31
|
-
end
|
32
|
-
|
33
|
-
def decorations
|
34
|
-
decorations = {}
|
35
|
-
decorations[:encoding] = 'base64' if type == :binary
|
36
|
-
decorations[:type] = (type == :string) ? nil : type
|
37
|
-
decorations[:nil] = true if value.nil?
|
38
|
-
decorations
|
39
|
-
end
|
40
|
-
|
41
|
-
protected
|
42
|
-
|
43
|
-
def compute_type
|
44
|
-
return if value.nil?
|
45
|
-
type = ActiveSupport::XmlMini::TYPE_NAMES[value.class.name]
|
46
|
-
type ||= :string if value.respond_to?(:to_str)
|
47
|
-
type ||= :yaml
|
48
|
-
type
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
class MethodAttribute < Attribute #:nodoc:
|
53
|
-
end
|
54
|
-
|
55
|
-
attr_reader :options
|
56
|
-
|
57
|
-
def initialize(serializable, options = nil)
|
58
|
-
@serializable = serializable
|
59
|
-
@options = options ? options.dup : {}
|
60
|
-
end
|
61
|
-
|
62
|
-
def serializable_hash
|
63
|
-
@serializable.serializable_hash(@options.except(:include))
|
64
|
-
end
|
65
|
-
|
66
|
-
def serializable_collection
|
67
|
-
methods = Array(options[:methods]).map(&:to_s)
|
68
|
-
serializable_hash.map do |name, value|
|
69
|
-
name = name.to_s
|
70
|
-
if methods.include?(name)
|
71
|
-
self.class::MethodAttribute.new(name, @serializable, value)
|
72
|
-
else
|
73
|
-
self.class::Attribute.new(name, @serializable, value)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def serialize
|
79
|
-
require 'builder' unless defined? ::Builder
|
80
|
-
|
81
|
-
options[:indent] ||= 2
|
82
|
-
options[:builder] ||= ::Builder::XmlMarkup.new(indent: options[:indent])
|
83
|
-
|
84
|
-
@builder = options[:builder]
|
85
|
-
@builder.instruct! unless options[:skip_instruct]
|
86
|
-
|
87
|
-
root = (options[:root] || @serializable.model_name.element).to_s
|
88
|
-
root = ActiveSupport::XmlMini.rename_key(root, options)
|
89
|
-
|
90
|
-
args = [root]
|
91
|
-
args << { xmlns: options[:namespace] } if options[:namespace]
|
92
|
-
args << { type: options[:type] } if options[:type] && !options[:skip_types]
|
93
|
-
|
94
|
-
@builder.tag!(*args) do
|
95
|
-
add_attributes_and_methods
|
96
|
-
add_includes
|
97
|
-
add_extra_behavior
|
98
|
-
add_procs
|
99
|
-
yield @builder if block_given?
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
private
|
104
|
-
|
105
|
-
def add_extra_behavior
|
106
|
-
end
|
107
|
-
|
108
|
-
def add_attributes_and_methods
|
109
|
-
serializable_collection.each do |attribute|
|
110
|
-
key = ActiveSupport::XmlMini.rename_key(attribute.name, options)
|
111
|
-
ActiveSupport::XmlMini.to_tag(key, attribute.value,
|
112
|
-
options.merge(attribute.decorations))
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def add_includes
|
117
|
-
@serializable.send(:serializable_add_includes, options) do |association, records, opts|
|
118
|
-
add_associations(association, records, opts)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
# TODO: This can likely be cleaned up to simple use ActiveSupport::XmlMini.to_tag as well.
|
123
|
-
def add_associations(association, records, opts)
|
124
|
-
merged_options = opts.merge(options.slice(:builder, :indent))
|
125
|
-
merged_options[:skip_instruct] = true
|
126
|
-
|
127
|
-
[:skip_types, :dasherize, :camelize].each do |key|
|
128
|
-
merged_options[key] = options[key] if merged_options[key].nil? && !options[key].nil?
|
129
|
-
end
|
130
|
-
|
131
|
-
if records.respond_to?(:to_ary)
|
132
|
-
records = records.to_ary
|
133
|
-
|
134
|
-
tag = ActiveSupport::XmlMini.rename_key(association.to_s, options)
|
135
|
-
type = options[:skip_types] ? { } : { type: "array" }
|
136
|
-
association_name = association.to_s.singularize
|
137
|
-
merged_options[:root] = association_name
|
138
|
-
|
139
|
-
if records.empty?
|
140
|
-
@builder.tag!(tag, type)
|
141
|
-
else
|
142
|
-
@builder.tag!(tag, type) do
|
143
|
-
records.each do |record|
|
144
|
-
if options[:skip_types]
|
145
|
-
record_type = {}
|
146
|
-
else
|
147
|
-
record_class = (record.class.to_s.underscore == association_name) ? nil : record.class.name
|
148
|
-
record_type = { type: record_class }
|
149
|
-
end
|
150
|
-
|
151
|
-
record.to_xml merged_options.merge(record_type)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
else
|
156
|
-
merged_options[:root] = association.to_s
|
157
|
-
|
158
|
-
unless records.class.to_s.underscore == association.to_s
|
159
|
-
merged_options[:type] = records.class.name
|
160
|
-
end
|
161
|
-
|
162
|
-
records.to_xml merged_options
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def add_procs
|
167
|
-
if procs = options.delete(:procs)
|
168
|
-
Array(procs).each do |proc|
|
169
|
-
if proc.arity == 1
|
170
|
-
proc.call(options)
|
171
|
-
else
|
172
|
-
proc.call(options, @serializable)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
# Returns XML representing the model. Configuration can be
|
180
|
-
# passed through +options+.
|
181
|
-
#
|
182
|
-
# Without any +options+, the returned XML string will include all the
|
183
|
-
# model's attributes.
|
184
|
-
#
|
185
|
-
# user = User.find(1)
|
186
|
-
# user.to_xml
|
187
|
-
#
|
188
|
-
# <?xml version="1.0" encoding="UTF-8"?>
|
189
|
-
# <user>
|
190
|
-
# <id type="integer">1</id>
|
191
|
-
# <name>David</name>
|
192
|
-
# <age type="integer">16</age>
|
193
|
-
# <created-at type="dateTime">2011-01-30T22:29:23Z</created-at>
|
194
|
-
# </user>
|
195
|
-
#
|
196
|
-
# The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the
|
197
|
-
# attributes included, and work similar to the +attributes+ method.
|
198
|
-
#
|
199
|
-
# To include the result of some method calls on the model use <tt>:methods</tt>.
|
200
|
-
#
|
201
|
-
# To include associations use <tt>:include</tt>.
|
202
|
-
#
|
203
|
-
# For further documentation, see <tt>ActiveRecord::Serialization#to_xml</tt>
|
204
|
-
def to_xml(options = {}, &block)
|
205
|
-
Serializer.new(self, options).serialize(&block)
|
206
|
-
end
|
207
|
-
|
208
|
-
# Sets the model +attributes+ from an XML string. Returns +self+.
|
209
|
-
#
|
210
|
-
# class Person
|
211
|
-
# include ActiveModel::Serializers::Xml
|
212
|
-
#
|
213
|
-
# attr_accessor :name, :age, :awesome
|
214
|
-
#
|
215
|
-
# def attributes=(hash)
|
216
|
-
# hash.each do |key, value|
|
217
|
-
# instance_variable_set("@#{key}", value)
|
218
|
-
# end
|
219
|
-
# end
|
220
|
-
#
|
221
|
-
# def attributes
|
222
|
-
# instance_values
|
223
|
-
# end
|
224
|
-
# end
|
225
|
-
#
|
226
|
-
# xml = { name: 'bob', age: 22, awesome:true }.to_xml
|
227
|
-
# person = Person.new
|
228
|
-
# person.from_xml(xml) # => #<Person:0x007fec5e3b3c40 @age=22, @awesome=true, @name="bob">
|
229
|
-
# person.name # => "bob"
|
230
|
-
# person.age # => 22
|
231
|
-
# person.awesome # => true
|
232
|
-
def from_xml(xml)
|
233
|
-
self.attributes = Hash.from_xml(xml).values.first
|
234
|
-
self
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|