activeentity 0.0.1.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.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +42 -0
  3. data/README.md +145 -0
  4. data/Rakefile +29 -0
  5. data/lib/active_entity.rb +73 -0
  6. data/lib/active_entity/aggregations.rb +276 -0
  7. data/lib/active_entity/associations.rb +146 -0
  8. data/lib/active_entity/associations/embedded/association.rb +134 -0
  9. data/lib/active_entity/associations/embedded/builder/association.rb +100 -0
  10. data/lib/active_entity/associations/embedded/builder/collection_association.rb +69 -0
  11. data/lib/active_entity/associations/embedded/builder/embedded_in.rb +38 -0
  12. data/lib/active_entity/associations/embedded/builder/embeds_many.rb +13 -0
  13. data/lib/active_entity/associations/embedded/builder/embeds_one.rb +16 -0
  14. data/lib/active_entity/associations/embedded/builder/singular_association.rb +28 -0
  15. data/lib/active_entity/associations/embedded/collection_association.rb +188 -0
  16. data/lib/active_entity/associations/embedded/collection_proxy.rb +310 -0
  17. data/lib/active_entity/associations/embedded/embedded_in_association.rb +31 -0
  18. data/lib/active_entity/associations/embedded/embeds_many_association.rb +15 -0
  19. data/lib/active_entity/associations/embedded/embeds_one_association.rb +19 -0
  20. data/lib/active_entity/associations/embedded/singular_association.rb +35 -0
  21. data/lib/active_entity/attribute_assignment.rb +85 -0
  22. data/lib/active_entity/attribute_decorators.rb +90 -0
  23. data/lib/active_entity/attribute_methods.rb +330 -0
  24. data/lib/active_entity/attribute_methods/before_type_cast.rb +78 -0
  25. data/lib/active_entity/attribute_methods/primary_key.rb +98 -0
  26. data/lib/active_entity/attribute_methods/query.rb +35 -0
  27. data/lib/active_entity/attribute_methods/read.rb +47 -0
  28. data/lib/active_entity/attribute_methods/serialization.rb +90 -0
  29. data/lib/active_entity/attribute_methods/time_zone_conversion.rb +91 -0
  30. data/lib/active_entity/attribute_methods/write.rb +63 -0
  31. data/lib/active_entity/attributes.rb +165 -0
  32. data/lib/active_entity/base.rb +303 -0
  33. data/lib/active_entity/coders/json.rb +15 -0
  34. data/lib/active_entity/coders/yaml_column.rb +50 -0
  35. data/lib/active_entity/core.rb +281 -0
  36. data/lib/active_entity/define_callbacks.rb +17 -0
  37. data/lib/active_entity/enum.rb +234 -0
  38. data/lib/active_entity/errors.rb +80 -0
  39. data/lib/active_entity/gem_version.rb +17 -0
  40. data/lib/active_entity/inheritance.rb +278 -0
  41. data/lib/active_entity/integration.rb +78 -0
  42. data/lib/active_entity/locale/en.yml +45 -0
  43. data/lib/active_entity/model_schema.rb +115 -0
  44. data/lib/active_entity/nested_attributes.rb +592 -0
  45. data/lib/active_entity/readonly_attributes.rb +47 -0
  46. data/lib/active_entity/reflection.rb +441 -0
  47. data/lib/active_entity/serialization.rb +25 -0
  48. data/lib/active_entity/store.rb +242 -0
  49. data/lib/active_entity/translation.rb +24 -0
  50. data/lib/active_entity/type.rb +73 -0
  51. data/lib/active_entity/type/date.rb +9 -0
  52. data/lib/active_entity/type/date_time.rb +9 -0
  53. data/lib/active_entity/type/decimal_without_scale.rb +15 -0
  54. data/lib/active_entity/type/hash_lookup_type_map.rb +25 -0
  55. data/lib/active_entity/type/internal/timezone.rb +17 -0
  56. data/lib/active_entity/type/json.rb +30 -0
  57. data/lib/active_entity/type/modifiers/array.rb +72 -0
  58. data/lib/active_entity/type/registry.rb +92 -0
  59. data/lib/active_entity/type/serialized.rb +71 -0
  60. data/lib/active_entity/type/text.rb +11 -0
  61. data/lib/active_entity/type/time.rb +21 -0
  62. data/lib/active_entity/type/type_map.rb +62 -0
  63. data/lib/active_entity/type/unsigned_integer.rb +17 -0
  64. data/lib/active_entity/validate_embedded_association.rb +305 -0
  65. data/lib/active_entity/validations.rb +50 -0
  66. data/lib/active_entity/validations/absence.rb +25 -0
  67. data/lib/active_entity/validations/associated.rb +60 -0
  68. data/lib/active_entity/validations/length.rb +26 -0
  69. data/lib/active_entity/validations/presence.rb +68 -0
  70. data/lib/active_entity/validations/subset.rb +76 -0
  71. data/lib/active_entity/validations/uniqueness_in_embedding.rb +99 -0
  72. data/lib/active_entity/version.rb +10 -0
  73. data/lib/tasks/active_entity_tasks.rake +6 -0
  74. metadata +155 -0
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ # = Active Entity \Validations
5
+ #
6
+ # Active Entity includes the majority of its validations from ActiveModel::Validations
7
+ # all of which accept the <tt>:on</tt> argument to define the context where the
8
+ # validations are active. Active Entity will always supply either the context of
9
+ # <tt>:create</tt> or <tt>:update</tt> dependent on whether the model is a
10
+ # {new_record?}[rdoc-ref:Persistence#new_record?].
11
+ module Validations
12
+ extend ActiveSupport::Concern
13
+ include ActiveModel::Validations
14
+
15
+ # Runs all the validations within the specified context. Returns +true+ if
16
+ # no errors are found, +false+ otherwise.
17
+ #
18
+ # Aliased as #validate.
19
+ #
20
+ # If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if
21
+ # {new_record?}[rdoc-ref:Persistence#new_record?] is +true+, and to <tt>:update</tt> if it is not.
22
+ #
23
+ # \Validations with no <tt>:on</tt> option will run no matter the context. \Validations with
24
+ # some <tt>:on</tt> option will only run in the specified context.
25
+ def valid?(context = nil)
26
+ context ||= default_validation_context
27
+ output = super(context)
28
+ errors.empty? && output
29
+ end
30
+
31
+ alias_method :validate, :valid?
32
+
33
+ private
34
+
35
+ def default_validation_context
36
+ :default
37
+ end
38
+
39
+ def perform_validations(options = {})
40
+ options[:validate] == false || valid?(options[:context])
41
+ end
42
+ end
43
+ end
44
+
45
+ require "active_entity/validations/associated"
46
+ require "active_entity/validations/presence"
47
+ require "active_entity/validations/absence"
48
+ require "active_entity/validations/length"
49
+ require "active_entity/validations/subset"
50
+ require "active_entity/validations/uniqueness_in_embedding"
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ module Validations
5
+ class AbsenceValidator < ActiveModel::Validations::AbsenceValidator # :nodoc:
6
+ def validate_each(record, attribute, association_or_value)
7
+ if record.class._reflect_on_association(attribute)
8
+ association_or_value = Array.wrap(association_or_value).reject(&:marked_for_destruction?)
9
+ end
10
+ super
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+ # Validates that the specified attributes are not present (as defined by
16
+ # Object#present?). If the attribute is an association, the associated object
17
+ # is considered absent if it was marked for destruction.
18
+ #
19
+ # See ActiveModel::Validations::HelperMethods.validates_absence_of for more information.
20
+ def validates_absence_of(*attr_names)
21
+ validates_with AbsenceValidator, _merge_attributes(attr_names)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ module Validations
5
+ class AssociatedValidator < ActiveModel::EachValidator #:nodoc:
6
+ def validate_each(record, attribute, value)
7
+ if Array(value).reject { |r| valid_object?(r) }.any?
8
+ record.errors.add(attribute, :invalid, options.merge(value: value))
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def valid_object?(record)
15
+ (record.respond_to?(:marked_for_destruction?) && record.marked_for_destruction?) || record.valid?
16
+ end
17
+ end
18
+
19
+ module ClassMethods
20
+ # Validates whether the associated object or objects are all valid.
21
+ # Works with any kind of association.
22
+ #
23
+ # class Book < ActiveEntity::Base
24
+ # has_many :pages
25
+ # belongs_to :library
26
+ #
27
+ # validates_associated :pages, :library
28
+ # end
29
+ #
30
+ # WARNING: This validation must not be used on both ends of an association.
31
+ # Doing so will lead to a circular dependency and cause infinite recursion.
32
+ #
33
+ # NOTE: This validation will not fail if the association hasn't been
34
+ # assigned. If you want to ensure that the association is both present and
35
+ # guaranteed to be valid, you also need to use
36
+ # {validates_presence_of}[rdoc-ref:Validations::ClassMethods#validates_presence_of].
37
+ #
38
+ # Configuration options:
39
+ #
40
+ # * <tt>:message</tt> - A custom error message (default is: "is invalid").
41
+ # * <tt>:on</tt> - Specifies the contexts where this validation is active.
42
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
43
+ # or an array of symbols. (e.g. <tt>on: :create</tt> or
44
+ # <tt>on: :custom_validation_context</tt> or
45
+ # <tt>on: [:create, :custom_validation_context]</tt>)
46
+ # * <tt>:if</tt> - Specifies a method, proc or string to call to determine
47
+ # if the validation should occur (e.g. <tt>if: :allow_validation</tt>,
48
+ # or <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method,
49
+ # proc or string should return or evaluate to a +true+ or +false+ value.
50
+ # * <tt>:unless</tt> - Specifies a method, proc or string to call to
51
+ # determine if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
52
+ # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
53
+ # method, proc or string should return or evaluate to a +true+ or +false+
54
+ # value.
55
+ def validates_associated(*attr_names)
56
+ validates_with AssociatedValidator, _merge_attributes(attr_names)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ module Validations
5
+ class LengthValidator < ActiveModel::Validations::LengthValidator # :nodoc:
6
+ def validate_each(record, attribute, association_or_value)
7
+ if association_or_value.respond_to?(:loaded?) && association_or_value.loaded?
8
+ association_or_value = association_or_value.target.reject(&:marked_for_destruction?)
9
+ end
10
+ super
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+ # Validates that the specified attributes match the length restrictions supplied.
16
+ # If the attribute is an association, records that are marked for destruction are not counted.
17
+ #
18
+ # See ActiveModel::Validations::HelperMethods.validates_length_of for more information.
19
+ def validates_length_of(*attr_names)
20
+ validates_with LengthValidator, _merge_attributes(attr_names)
21
+ end
22
+
23
+ alias_method :validates_size_of, :validates_length_of
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ module Validations
5
+ class PresenceValidator < ActiveModel::Validations::PresenceValidator # :nodoc:
6
+ def validate_each(record, attribute, association_or_value)
7
+ if record.class._reflect_on_association(attribute)
8
+ association_or_value = Array.wrap(association_or_value).reject(&:marked_for_destruction?)
9
+ end
10
+ super
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+ # Validates that the specified attributes are not blank (as defined by
16
+ # Object#blank?), and, if the attribute is an association, that the
17
+ # associated object is not marked for destruction. Happens by default
18
+ # on save.
19
+ #
20
+ # class Person < ActiveEntity::Base
21
+ # has_one :face
22
+ # validates_presence_of :face
23
+ # end
24
+ #
25
+ # The face attribute must be in the object and it cannot be blank or marked
26
+ # for destruction.
27
+ #
28
+ # If you want to validate the presence of a boolean field (where the real values
29
+ # are true and false), you will want to use
30
+ # <tt>validates_inclusion_of :field_name, in: [true, false]</tt>.
31
+ #
32
+ # This is due to the way Object#blank? handles boolean values:
33
+ # <tt>false.blank? # => true</tt>.
34
+ #
35
+ # This validator defers to the Active Model validation for presence, adding the
36
+ # check to see that an associated object is not marked for destruction. This
37
+ # prevents the parent object from validating successfully and saving, which then
38
+ # deletes the associated object, thus putting the parent object into an invalid
39
+ # state.
40
+ #
41
+ # NOTE: This validation will not fail while using it with an association
42
+ # if the latter was assigned but not valid. If you want to ensure that
43
+ # it is both present and valid, you also need to use
44
+ # {validates_associated}[rdoc-ref:Validations::ClassMethods#validates_associated].
45
+ #
46
+ # Configuration options:
47
+ # * <tt>:message</tt> - A custom error message (default is: "can't be blank").
48
+ # * <tt>:on</tt> - Specifies the contexts where this validation is active.
49
+ # Runs in all validation contexts by default +nil+. You can pass a symbol
50
+ # or an array of symbols. (e.g. <tt>on: :create</tt> or
51
+ # <tt>on: :custom_validation_context</tt> or
52
+ # <tt>on: [:create, :custom_validation_context]</tt>)
53
+ # * <tt>:if</tt> - Specifies a method, proc or string to call to determine if
54
+ # the validation should occur (e.g. <tt>if: :allow_validation</tt>, or
55
+ # <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method, proc
56
+ # or string should return or evaluate to a +true+ or +false+ value.
57
+ # * <tt>:unless</tt> - Specifies a method, proc or string to call to determine
58
+ # if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
59
+ # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The method,
60
+ # proc or string should return or evaluate to a +true+ or +false+ value.
61
+ # * <tt>:strict</tt> - Specifies whether validation should be strict.
62
+ # See ActiveModel::Validations#validates! for more information.
63
+ def validates_presence_of(*attr_names)
64
+ validates_with PresenceValidator, _merge_attributes(attr_names)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ module Validations
5
+ class SubsetValidator < ActiveModel::EachValidator # :nodoc:
6
+ ERROR_MESSAGE = "An object with the method #include? or a proc, lambda or symbol is required, " \
7
+ "and must be supplied as the :in (or :within) option of the configuration hash"
8
+
9
+ def check_validity!
10
+ unless delimiter.respond_to?(:include?) || delimiter.respond_to?(:call) || delimiter.respond_to?(:to_sym)
11
+ raise ArgumentError, ERROR_MESSAGE
12
+ end
13
+ end
14
+
15
+ def validate_each(record, attribute, value)
16
+ if value && !value.respond_to?(:to_a)
17
+ raise ArgumentError, "#{record} can't respond `to_a`."
18
+ end
19
+
20
+ unless subset?(record, value)
21
+ record.errors.add(attribute, :non_subset, options.except(:in, :within).merge!(value: value))
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def delimiter
28
+ @delimiter ||= options[:in] || options[:within]
29
+ end
30
+
31
+ def subset?(record, value)
32
+ enumerable = value.to_a
33
+ members =
34
+ if delimiter.respond_to?(:call)
35
+ delimiter.call(record)
36
+ elsif delimiter.respond_to?(:to_sym)
37
+ record.send(delimiter)
38
+ else
39
+ delimiter
40
+ end
41
+
42
+ (members & enumerable).size == enumerable.size
43
+ end
44
+ end
45
+
46
+ module ClassMethods
47
+ # Validates whether the value of the specified attribute is available in a
48
+ # particular enumerable object.
49
+ #
50
+ # class Person < ActiveRecord::Base
51
+ # validates :tags, subset: %w( m f )
52
+ # validates_subset_of :tags, in: %w( m f )
53
+ # validates_inclusion_of :tags, in: %w( m f ), message: "tag %{value} is not included in the list"
54
+ # validates_inclusion_of :tags, in: ->(record) { record.available_tags }
55
+ # validates_inclusion_of :tags, in: :available_tags
56
+ # end
57
+ #
58
+ # Configuration options:
59
+ # * <tt>:in</tt> - An enumerable object of available items. This can be
60
+ # supplied as a proc, lambda or symbol which returns an enumerable. If the
61
+ # enumerable is a numerical, time or datetime range the test is performed
62
+ # with <tt>Range#cover?</tt>, otherwise with <tt>include?</tt>. When using
63
+ # a proc or lambda the instance under validation is passed as an argument.
64
+ # * <tt>:within</tt> - A synonym(or alias) for <tt>:in</tt>
65
+ # * <tt>:message</tt> - Specifies a custom error message (default is: "is
66
+ # not included in the list").
67
+ #
68
+ # There is also a list of default options supported by every validator:
69
+ # +:if+, +:unless+, +:on+, +:allow_nil+, +:allow_blank+, and +:strict+.
70
+ # See <tt>ActiveModel::Validations#validates</tt> for more information
71
+ def validates_subset_of(*attr_names)
72
+ validates_with SubsetValidator, _merge_attributes(attr_names)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEntity
4
+ module Validations
5
+ class UniquenessInEmbeddingValidator < ActiveModel::EachValidator # :nodoc:
6
+ ERROR_MESSAGE = "`key` option of the configuration hash must be symbol or array of symbols."
7
+
8
+ def check_validity!
9
+ return if key.is_a?(Symbol) || key.is_a?(Array)
10
+
11
+ raise ArgumentError, ERROR_MESSAGE
12
+ end
13
+
14
+ def validate_each(record, attribute, association_or_value)
15
+ reflection = record.class._reflect_on_association(attribute)
16
+ if reflection
17
+ return unless reflection.is_a?(ActiveEntity::Reflection::EmbeddedAssociationReflection)
18
+ return unless reflection.collection?
19
+ end
20
+
21
+ indexed_attribute =
22
+ if reflection
23
+ reflection.options[:index_errors] || ActiveEntity::Base.index_nested_attribute_errors
24
+ else
25
+ options[:index_errors] || true
26
+ end
27
+
28
+ association_or_value =
29
+ if reflection
30
+ Array.wrap(association_or_value).reject(&:marked_for_destruction?)
31
+ else
32
+ Array.wrap(association_or_value)
33
+ end
34
+
35
+ return if association_or_value.size <= 1
36
+
37
+ duplicate_records =
38
+ if key.is_a? Symbol
39
+ association_or_value.group_by(&key)
40
+ elsif key.is_a? Array
41
+ association_or_value.group_by { |r| key.map { |attr| r.send(attr) } }
42
+ end
43
+ .values
44
+ .select { |v| v.size > 1 }
45
+ .flatten
46
+
47
+ return if duplicate_records.empty?
48
+
49
+ duplicate_records.each do |r|
50
+ if key.is_a? Symbol
51
+ r.errors.add(key, :duplicated, options)
52
+
53
+ # Hack the record
54
+ normalized_attribute = normalize_attribute(attribute, indexed_attribute, association_or_value.index(r), key)
55
+ record.errors[normalized_attribute].concat r.errors.messages[key]
56
+ record.errors[normalized_attribute].uniq!
57
+
58
+ record.errors.details[normalized_attribute.to_sym].concat r.errors.details[key]
59
+ record.errors.details[normalized_attribute.to_sym].uniq!
60
+ elsif key.is_a? Array
61
+ key.each do |attr|
62
+ r.errors.add(attr, :duplicated, options)
63
+
64
+ # Hack the record
65
+ normalized_attribute = normalize_attribute(attribute, indexed_attribute, association_or_value.index(r), attr)
66
+ record.errors[normalized_attribute].concat r.errors.messages[attr]
67
+ record.errors[normalized_attribute].uniq!
68
+
69
+ record.errors.details[normalized_attribute.to_sym].concat r.errors.details[attr]
70
+ record.errors.details[normalized_attribute.to_sym].uniq!
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def key
79
+ @key ||= options[:key]
80
+ end
81
+
82
+ def normalize_attribute(attribute, indexed_attribute, index, nested_attribute)
83
+ if indexed_attribute
84
+ "#{attribute}[#{index}].#{nested_attribute}"
85
+ else
86
+ "#{attribute}.#{nested_attribute}"
87
+ end
88
+ end
89
+ end
90
+
91
+ module ClassMethods
92
+ # Validates whether the value of the specified attributes are unique
93
+ # in the embedded association.
94
+ def validates_uniqueness_in_embedding_of(*attr_names)
95
+ validates_with UniquenessInEmbeddingValidator, _merge_attributes(attr_names)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "gem_version"
4
+
5
+ module ActiveEntity
6
+ # Returns the version of the currently loaded ActiveEntity as a <tt>Gem::Version</tt>
7
+ def self.version
8
+ gem_version
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # desc "Explaining what the task does"
4
+ # task :active_entity do
5
+ # # Task goes here
6
+ # end
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activeentity
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.beta1
5
+ platform: ruby
6
+ authors:
7
+ - jasl
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.0.beta1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 6.0.0.beta1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activemodel
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 6.0.0.beta1
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '7.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 6.0.0.beta1
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '7.0'
53
+ description: Rails virtual model solution based on ActiveModel design for Rails 6+.
54
+ email:
55
+ - jasl9187@hotmail.com
56
+ executables: []
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - MIT-LICENSE
61
+ - README.md
62
+ - Rakefile
63
+ - lib/active_entity.rb
64
+ - lib/active_entity/aggregations.rb
65
+ - lib/active_entity/associations.rb
66
+ - lib/active_entity/associations/embedded/association.rb
67
+ - lib/active_entity/associations/embedded/builder/association.rb
68
+ - lib/active_entity/associations/embedded/builder/collection_association.rb
69
+ - lib/active_entity/associations/embedded/builder/embedded_in.rb
70
+ - lib/active_entity/associations/embedded/builder/embeds_many.rb
71
+ - lib/active_entity/associations/embedded/builder/embeds_one.rb
72
+ - lib/active_entity/associations/embedded/builder/singular_association.rb
73
+ - lib/active_entity/associations/embedded/collection_association.rb
74
+ - lib/active_entity/associations/embedded/collection_proxy.rb
75
+ - lib/active_entity/associations/embedded/embedded_in_association.rb
76
+ - lib/active_entity/associations/embedded/embeds_many_association.rb
77
+ - lib/active_entity/associations/embedded/embeds_one_association.rb
78
+ - lib/active_entity/associations/embedded/singular_association.rb
79
+ - lib/active_entity/attribute_assignment.rb
80
+ - lib/active_entity/attribute_decorators.rb
81
+ - lib/active_entity/attribute_methods.rb
82
+ - lib/active_entity/attribute_methods/before_type_cast.rb
83
+ - lib/active_entity/attribute_methods/primary_key.rb
84
+ - lib/active_entity/attribute_methods/query.rb
85
+ - lib/active_entity/attribute_methods/read.rb
86
+ - lib/active_entity/attribute_methods/serialization.rb
87
+ - lib/active_entity/attribute_methods/time_zone_conversion.rb
88
+ - lib/active_entity/attribute_methods/write.rb
89
+ - lib/active_entity/attributes.rb
90
+ - lib/active_entity/base.rb
91
+ - lib/active_entity/coders/json.rb
92
+ - lib/active_entity/coders/yaml_column.rb
93
+ - lib/active_entity/core.rb
94
+ - lib/active_entity/define_callbacks.rb
95
+ - lib/active_entity/enum.rb
96
+ - lib/active_entity/errors.rb
97
+ - lib/active_entity/gem_version.rb
98
+ - lib/active_entity/inheritance.rb
99
+ - lib/active_entity/integration.rb
100
+ - lib/active_entity/locale/en.yml
101
+ - lib/active_entity/model_schema.rb
102
+ - lib/active_entity/nested_attributes.rb
103
+ - lib/active_entity/readonly_attributes.rb
104
+ - lib/active_entity/reflection.rb
105
+ - lib/active_entity/serialization.rb
106
+ - lib/active_entity/store.rb
107
+ - lib/active_entity/translation.rb
108
+ - lib/active_entity/type.rb
109
+ - lib/active_entity/type/date.rb
110
+ - lib/active_entity/type/date_time.rb
111
+ - lib/active_entity/type/decimal_without_scale.rb
112
+ - lib/active_entity/type/hash_lookup_type_map.rb
113
+ - lib/active_entity/type/internal/timezone.rb
114
+ - lib/active_entity/type/json.rb
115
+ - lib/active_entity/type/modifiers/array.rb
116
+ - lib/active_entity/type/registry.rb
117
+ - lib/active_entity/type/serialized.rb
118
+ - lib/active_entity/type/text.rb
119
+ - lib/active_entity/type/time.rb
120
+ - lib/active_entity/type/type_map.rb
121
+ - lib/active_entity/type/unsigned_integer.rb
122
+ - lib/active_entity/validate_embedded_association.rb
123
+ - lib/active_entity/validations.rb
124
+ - lib/active_entity/validations/absence.rb
125
+ - lib/active_entity/validations/associated.rb
126
+ - lib/active_entity/validations/length.rb
127
+ - lib/active_entity/validations/presence.rb
128
+ - lib/active_entity/validations/subset.rb
129
+ - lib/active_entity/validations/uniqueness_in_embedding.rb
130
+ - lib/active_entity/version.rb
131
+ - lib/tasks/active_entity_tasks.rake
132
+ homepage: https://github.com/jasl/activeentity
133
+ licenses:
134
+ - MIT
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 2.5.0
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">"
148
+ - !ruby/object:Gem::Version
149
+ version: 1.3.1
150
+ requirements: []
151
+ rubygems_version: 3.0.2
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: Rails virtual model solution based on ActiveModel.
155
+ test_files: []