trax_model 0.0.98 → 0.0.99
Sign up to get free protection for your applications and to get access to all the features.
- 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
|