trax_model 0.0.98 → 0.0.99
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/Gemfile +4 -0
- data/lib/trax/model.rb +6 -16
- data/lib/trax/model/attributes.rb +1 -1
- data/lib/trax/model/attributes/definitions.rb +4 -0
- data/lib/trax/model/attributes/{mixin.rb → dsl.rb} +2 -12
- data/lib/trax/model/attributes/types/boolean.rb +1 -2
- data/lib/trax/model/attributes/types/enum.rb +0 -2
- data/lib/trax/model/attributes/types/integer.rb +2 -2
- data/lib/trax/model/attributes/types/set.rb +67 -0
- data/lib/trax/model/attributes/types/string.rb +3 -3
- data/lib/trax/model/attributes/types/struct.rb +5 -3
- data/lib/trax/model/attributes/types/uuid_array.rb +0 -2
- data/lib/trax/model/{sti.rb → core_extensions.rb} +2 -2
- data/lib/trax/model/core_extensions/string.rb +17 -0
- data/lib/trax/model/extensions_for.rb +18 -0
- data/lib/trax/model/extensions_for/base.rb +31 -0
- data/lib/trax/model/extensions_for/boolean.rb +29 -0
- data/lib/trax/model/extensions_for/enumerable.rb +18 -0
- data/lib/trax/model/extensions_for/integer.rb +10 -0
- data/lib/trax/model/extensions_for/numeric.rb +46 -0
- data/lib/trax/model/extensions_for/set.rb +10 -0
- data/lib/trax/model/extensions_for/string.rb +30 -0
- data/lib/trax/model/extensions_for/struct.rb +191 -0
- data/lib/trax/model/extensions_for/struct_fields.rb +21 -0
- data/lib/trax/model/extensions_for/struct_fields/boolean.rb +32 -0
- data/lib/trax/model/extensions_for/struct_fields/enum.rb +20 -0
- data/lib/trax/model/extensions_for/struct_fields/float.rb +12 -0
- data/lib/trax/model/extensions_for/struct_fields/integer.rb +12 -0
- data/lib/trax/model/extensions_for/struct_fields/numeric.rb +52 -0
- data/lib/trax/model/extensions_for/struct_fields/string.rb +29 -0
- data/lib/trax/model/extensions_for/struct_fields/time.rb +54 -0
- data/lib/trax/model/matchable.rb +3 -10
- data/lib/trax/model/mixins.rb +3 -0
- data/lib/trax/model/mixins/freezable.rb +31 -0
- data/lib/trax/model/mixins/restorable.rb +63 -0
- data/lib/trax/model/mixins/sti_enum.rb +4 -5
- data/lib/trax/model/mixins/unique_id.rb +85 -0
- data/lib/trax/model/railtie.rb +4 -2
- data/lib/trax/validators/json_attribute_validator.rb +1 -0
- data/lib/trax_model/version.rb +1 -1
- data/spec/db/schema/default_tables.rb +1 -17
- data/spec/db/schema/pg_tables.rb +15 -0
- data/spec/support/models.rb +11 -16
- data/spec/support/pg/models.rb +31 -6
- data/spec/trax/model/attributes/types/set_spec.rb +68 -0
- data/spec/trax/model/attributes/types/struct_spec.rb +6 -0
- data/spec/trax/model/extensions_for/boolean_spec.rb +26 -0
- data/spec/trax/model/extensions_for/numeric_spec.rb +53 -0
- data/spec/trax/model/extensions_for/string_spec.rb +25 -0
- data/spec/trax/model/extensions_for/struct_spec.rb +223 -0
- data/spec/trax/model/extensions_for_spec.rb +0 -0
- data/spec/trax/model/{freezable_spec.rb → mixins/freezable_spec.rb} +1 -1
- data/spec/trax/model/{restorable_spec.rb → mixins/restorable_spec.rb} +1 -1
- data/spec/trax/model/{unique_id_spec.rb → mixins/unique_id_spec.rb} +1 -1
- data/trax_model.gemspec +4 -5
- metadata +49 -59
- data/lib/trax/model/enum.rb +0 -64
- data/lib/trax/model/freezable.rb +0 -29
- data/lib/trax/model/mti.rb +0 -11
- data/lib/trax/model/mti/abstract.rb +0 -65
- data/lib/trax/model/mti/entity.rb +0 -62
- data/lib/trax/model/mti/namespace.rb +0 -21
- data/lib/trax/model/restorable.rb +0 -61
- data/lib/trax/model/scopes.rb +0 -16
- data/lib/trax/model/sti/attributes.rb +0 -94
- data/lib/trax/model/string_extensions.rb +0 -11
- data/lib/trax/model/struct_extensions.rb +0 -185
- data/lib/trax/model/unique_id.rb +0 -83
- data/spec/trax/model/sti/attributes_spec.rb +0 -15
- data/spec/trax/model/struct_extensions_spec.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aff3b6b4389df830349e17d6b8ed2a378effd6af
|
4
|
+
data.tar.gz: c2e220e45e53c87812eabf18c772db0067bd9f90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c808f53684e7ed77a9509597cd2d8c4b11d52313f6e7246de544aa54db24d83695a7780331afa6626c32f8552e6c8a786132e0e7226347b56c43247d70c5341
|
7
|
+
data.tar.gz: 91bcf1d6bf4f70155ac262f58f82b38fc15aff0dca066cccc901d93028c1b24cb739c0f582e6575354e264d21afecb10c92eb4368ae90c9382d0cf70a7b47fb8
|
data/Gemfile
CHANGED
data/lib/trax/model.rb
CHANGED
@@ -4,7 +4,6 @@ require 'hashie/dash'
|
|
4
4
|
require 'hashie/mash'
|
5
5
|
require 'hashie/trash'
|
6
6
|
require 'hashie/extensions/dash/indifferent_access'
|
7
|
-
require 'simple_enum'
|
8
7
|
require_relative './validators/boolean_validator'
|
9
8
|
require_relative './validators/email_validator'
|
10
9
|
require_relative './validators/frozen_validator'
|
@@ -24,23 +23,16 @@ module Trax
|
|
24
23
|
|
25
24
|
autoload :Attributes
|
26
25
|
autoload :Config
|
27
|
-
autoload :
|
26
|
+
autoload :CoreExtensions
|
27
|
+
autoload :ExtensionsFor
|
28
28
|
autoload :Errors
|
29
|
-
autoload :Freezable
|
30
29
|
autoload :Registry
|
31
30
|
autoload :UUID
|
32
31
|
autoload :UUIDPrefix
|
33
|
-
autoload :UniqueId
|
34
32
|
autoload :Matchable
|
35
33
|
autoload :Mixin
|
36
34
|
autoload :Mixins
|
37
|
-
autoload :MTI
|
38
|
-
autoload :Restorable
|
39
35
|
autoload :Railtie
|
40
|
-
autoload :STI
|
41
|
-
autoload :StringExtensions
|
42
|
-
autoload :Struct
|
43
|
-
autoload :StructExtensions
|
44
36
|
autoload :Validators
|
45
37
|
|
46
38
|
include ::Trax::Model::Matchable
|
@@ -77,15 +69,13 @@ module Trax
|
|
77
69
|
end
|
78
70
|
|
79
71
|
def self.eager_autoload_mixins!
|
80
|
-
::Trax::Model::Attributes::Mixin
|
81
|
-
::Trax::Model::Enum
|
82
|
-
::Trax::Model::Freezable
|
83
|
-
::Trax::Model::Restorable
|
84
|
-
::Trax::Model::UniqueId
|
85
72
|
::Trax::Model::Mixins::FieldScopes
|
73
|
+
::Trax::Model::Mixins::Freezable
|
86
74
|
::Trax::Model::Mixins::IdScopes
|
75
|
+
::Trax::Model::Mixins::Restorable
|
87
76
|
::Trax::Model::Mixins::SortByScopes
|
88
77
|
::Trax::Model::Mixins::StiEnum
|
78
|
+
::Trax::Model::Mixins::UniqueId
|
89
79
|
end
|
90
80
|
|
91
81
|
eager_autoload_mixins!
|
@@ -157,7 +147,7 @@ module Trax
|
|
157
147
|
end
|
158
148
|
end
|
159
149
|
|
160
|
-
::String.include(::Trax::Model::
|
150
|
+
::String.include(::Trax::Model::CoreExtensions::String)
|
161
151
|
|
162
152
|
::ActiveSupport.run_load_hooks(:trax_model, self)
|
163
153
|
end
|
@@ -26,6 +26,10 @@ module Trax
|
|
26
26
|
attribute(*args, type: :integer, **options, &block)
|
27
27
|
end
|
28
28
|
|
29
|
+
def set(*args, **options, &block)
|
30
|
+
attribute(*args, :type => :set, **options, &block)
|
31
|
+
end
|
32
|
+
|
29
33
|
def string(*args, **options, &block)
|
30
34
|
attribute(*args, :type => :string, **options, &block)
|
31
35
|
end
|
@@ -1,15 +1,9 @@
|
|
1
1
|
module Trax
|
2
2
|
module Model
|
3
3
|
module Attributes
|
4
|
-
module
|
4
|
+
module Dsl
|
5
5
|
extend ::Trax::Core::Concern
|
6
6
|
|
7
|
-
included do
|
8
|
-
::Trax::Model::Attributes.config.attribute_types.each_pair do |key, mod|
|
9
|
-
include mod::Mixin if mod.const_defined?("Mixin")
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
7
|
after_included do
|
14
8
|
evaluate_attribute_definitions_blocks
|
15
9
|
end
|
@@ -45,11 +39,7 @@ module Trax
|
|
45
39
|
def trax_attribute(name, type:, **options, &block)
|
46
40
|
raise ::Trax::Model::Attributes::Errors::UnknownAttributeType.new(type: type) unless ::Trax::Model::Attributes.key?(type)
|
47
41
|
|
48
|
-
if ::Trax::Model::Attributes[type].
|
49
|
-
attribute_type_definition_method = ::Trax::Model::Attributes[type]::Mixin::ClassMethods.instance_methods.first
|
50
|
-
self.send(attribute_type_definition_method, name, **options, &block)
|
51
|
-
self.validates(name, options[:validates]) if options.key?(:validates)
|
52
|
-
elsif ::Trax::Model::Attributes[type].respond_to?(:define_attribute)
|
42
|
+
if ::Trax::Model::Attributes[type].respond_to?(:define_attribute)
|
53
43
|
::Trax::Model::Attributes[type].define_attribute(self, name, **options, &block)
|
54
44
|
self.validates(name, options[:validates]) if options.key?(:validates)
|
55
45
|
else
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'hashie/extensions/ignore_undeclared'
|
2
|
-
|
3
1
|
module Trax
|
4
2
|
module Model
|
5
3
|
module Attributes
|
@@ -20,6 +18,7 @@ module Trax
|
|
20
18
|
end
|
21
19
|
|
22
20
|
class Attribute < ::Trax::Model::Attributes::Attribute
|
21
|
+
include ::Trax::Model::ExtensionsFor::Boolean
|
23
22
|
self.type = :boolean
|
24
23
|
|
25
24
|
def self.to_schema
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'hashie/extensions/ignore_undeclared'
|
2
|
-
|
3
1
|
module Trax
|
4
2
|
module Model
|
5
3
|
module Attributes
|
@@ -18,6 +16,8 @@ module Trax
|
|
18
16
|
end
|
19
17
|
|
20
18
|
class Value < ::Trax::Model::Attributes::Value
|
19
|
+
include ::Trax::Model::ExtensionsFor::Integer
|
20
|
+
|
21
21
|
def self.type; :integer end;
|
22
22
|
end
|
23
23
|
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Trax
|
2
|
+
module Model
|
3
|
+
module Attributes
|
4
|
+
module Types
|
5
|
+
class Set < ::Trax::Model::Attributes::Type
|
6
|
+
def self.define_attribute(klass, attribute_name, **options, &block)
|
7
|
+
klass_name = "#{klass.fields_module.name.underscore}/#{attribute_name}".camelize
|
8
|
+
attribute_klass = if options.key?(:extend)
|
9
|
+
_klass_prototype = options[:extend].is_a?(::String) ? options[:extend].safe_constantize : options[:extend]
|
10
|
+
_klass = ::Trax::Core::NamedClass.new(klass_name, _klass_prototype, :parent_definition => klass, &block)
|
11
|
+
_klass
|
12
|
+
else
|
13
|
+
::Trax::Core::NamedClass.new(klass_name, Value, :parent_definition => klass, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
klass.attribute(attribute_name, typecaster_klass.new(target_klass: attribute_klass))
|
17
|
+
klass.default_value_for(attribute_name) { attribute_klass.new }
|
18
|
+
end
|
19
|
+
|
20
|
+
class Value < ::Trax::Model::Attributes::Value
|
21
|
+
include ::Trax::Model::ExtensionsFor::Set
|
22
|
+
|
23
|
+
def initialize(*args)
|
24
|
+
@value = ::Set.new(*args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class TypeCaster < ActiveRecord::Type::Value
|
29
|
+
include ::ActiveRecord::Type::Mutable
|
30
|
+
|
31
|
+
def initialize(*args, target_klass:)
|
32
|
+
super(*args)
|
33
|
+
|
34
|
+
@target_klass = target_klass
|
35
|
+
end
|
36
|
+
|
37
|
+
def type
|
38
|
+
:set
|
39
|
+
end
|
40
|
+
|
41
|
+
def type_cast_from_user(value)
|
42
|
+
case value.class.name
|
43
|
+
when "Array", "Set"
|
44
|
+
@target_klass.new(value)
|
45
|
+
when @target_klass.name
|
46
|
+
@target_klass
|
47
|
+
else
|
48
|
+
@target_klass.new
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def type_cast_from_database(value)
|
53
|
+
value.present? ? @target_klass.new(::JSON.parse(value)) : value
|
54
|
+
end
|
55
|
+
|
56
|
+
def type_cast_for_database(value)
|
57
|
+
value.try(:to_json)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
self.value_klass = ::Trax::Model::Attributes::Types::Set::Value
|
62
|
+
self.typecaster_klass = ::Trax::Model::Attributes::Types::Set::TypeCaster
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'hashie/extensions/ignore_undeclared'
|
2
|
-
|
3
1
|
module Trax
|
4
2
|
module Model
|
5
3
|
module Attributes
|
@@ -18,6 +16,8 @@ module Trax
|
|
18
16
|
end
|
19
17
|
|
20
18
|
class Value < ::Trax::Model::Attributes::Value
|
19
|
+
include ::Trax::Model::ExtensionsFor::String
|
20
|
+
|
21
21
|
def self.type; :string end;
|
22
22
|
end
|
23
23
|
|
@@ -29,7 +29,7 @@ module Trax
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def type_cast_from_user(value)
|
32
|
-
value.is_a?(@target_klass) ? @target_klass : @target_klass.new(value
|
32
|
+
value.is_a?(@target_klass) ? @target_klass : @target_klass.new(value)
|
33
33
|
end
|
34
34
|
|
35
35
|
def type_cast_from_database(value)
|
@@ -10,7 +10,7 @@ module Trax
|
|
10
10
|
attribute_klass = if options.key?(:extend)
|
11
11
|
_klass_prototype = options[:extend].is_a?(::String) ? options[:extend].safe_constantize : options[:extend]
|
12
12
|
_klass = ::Trax::Core::NamedClass.new(klass_name, _klass_prototype, :parent_definition => klass, &block)
|
13
|
-
_klass.include(::Trax::Model::
|
13
|
+
_klass.include(::Trax::Model::ExtensionsFor::Struct)
|
14
14
|
_klass
|
15
15
|
else
|
16
16
|
::Trax::Core::NamedClass.new(klass_name, Value, :parent_definition => klass, &block)
|
@@ -23,7 +23,7 @@ module Trax
|
|
23
23
|
end
|
24
24
|
|
25
25
|
class Value < ::Trax::Core::Types::Struct
|
26
|
-
include ::Trax::Model::
|
26
|
+
include ::Trax::Model::ExtensionsFor::Struct
|
27
27
|
end
|
28
28
|
|
29
29
|
class TypeCaster < ActiveRecord::Type::Value
|
@@ -48,7 +48,7 @@ module Trax
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def type_cast_for_database(value)
|
51
|
-
value.present? ? value.to_serializable_hash.to_json :
|
51
|
+
value.present? ? value.to_serializable_hash.to_json : {}.to_json
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -82,6 +82,8 @@ module Trax
|
|
82
82
|
end
|
83
83
|
|
84
84
|
model.delegate(getter_method, :to => attribute_name)
|
85
|
+
|
86
|
+
model.attribute_names << _property.to_s unless model.attribute_names.include?(_property.to_s)
|
85
87
|
end
|
86
88
|
end
|
87
89
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Trax
|
2
|
+
module Model
|
3
|
+
module CoreExtensions
|
4
|
+
module String
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
def to_matchable
|
8
|
+
"%#{self.strip}%"
|
9
|
+
end
|
10
|
+
|
11
|
+
def uuid
|
12
|
+
::Trax::Model::UUID === self ? ::Trax::Model::UUID.new(self) : nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#trax model attribute dsl/trax core type extensions
|
2
|
+
module Trax
|
3
|
+
module Model
|
4
|
+
module ExtensionsFor
|
5
|
+
extend ::ActiveSupport::Autoload
|
6
|
+
|
7
|
+
autoload :Base
|
8
|
+
autoload :Boolean
|
9
|
+
autoload :Enumerable
|
10
|
+
autoload :Integer
|
11
|
+
autoload :Numeric
|
12
|
+
autoload :Set
|
13
|
+
autoload :Struct
|
14
|
+
autoload :StructFields
|
15
|
+
autoload :String
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Trax
|
2
|
+
module Model
|
3
|
+
module ExtensionsFor
|
4
|
+
module Base
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def field_name
|
9
|
+
name.demodulize.underscore
|
10
|
+
end
|
11
|
+
|
12
|
+
def model_class
|
13
|
+
@model_class ||= begin
|
14
|
+
model_class_for_property(self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def model_class_for_property(property_klass)
|
19
|
+
result = if property_klass.parent_definition.ancestors.include?(::ActiveRecord::Base)
|
20
|
+
property_klass.parent_definition
|
21
|
+
else
|
22
|
+
model_class_for_property(property_klass.parent_definition)
|
23
|
+
end
|
24
|
+
|
25
|
+
result
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Trax
|
2
|
+
module Model
|
3
|
+
module ExtensionsFor
|
4
|
+
module Boolean
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
include ::Trax::Model::ExtensionsFor::Base
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def eq(*_scope_values)
|
10
|
+
_scope_values.flat_compact_uniq!
|
11
|
+
model_class.where({field_name => _scope_values})
|
12
|
+
end
|
13
|
+
|
14
|
+
def is_nil
|
15
|
+
eq(nil)
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_false
|
19
|
+
eq(false)
|
20
|
+
end
|
21
|
+
|
22
|
+
def is_true
|
23
|
+
eq(true)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Trax
|
2
|
+
module Model
|
3
|
+
module ExtensionsFor
|
4
|
+
module Enumerable
|
5
|
+
extend ::ActiveSupport::Concern
|
6
|
+
|
7
|
+
include ::Trax::Model::ExtensionsFor::Base
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def contains(*_values)
|
11
|
+
_values.flat_compact_uniq!
|
12
|
+
model_class.where("#{field_name} ?| array[:values]", :values => _values)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|