statinize 0.4.3 → 0.4.5
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/core_ext/deep_dup.rb +53 -0
- data/lib/core_ext/duplicable.rb +42 -0
- data/lib/core_ext.rb +2 -0
- data/lib/statinize/attribute.rb +2 -1
- data/lib/statinize/statinizable.rb +5 -1
- data/lib/statinize/statinizer.rb +1 -1
- data/lib/statinize/validation.rb +1 -1
- data/lib/statinize/validator.rb +4 -3
- data/lib/statinize/validators/type_validator.rb +5 -1
- data/lib/statinize.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd5a1c15473a68cad29248c698c58fb190a37e432bfeb41d8622594904e79060
|
4
|
+
data.tar.gz: 7120d733e7389966c5378b924beb2a638eb2bfc283437020cd5bdf8601608fd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c67c423f48b274dd35b0ca582ea90e7081fb732ecf1252e97e5242ba2dfbbfc2434c93484eb2752d291ab19eeaaaf28b878925e2bd30a082709d2b64449932a5
|
7
|
+
data.tar.gz: af01616f0a9a41c3799c3384285ea741dee5301f88beb5d2b6afc5c762f0219b85d16c5eb5c2a6d0994bd72034db0d0e74ebf8548cec68df08f0fd796b66fad2
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/object/deep_dup.rb
|
2
|
+
|
3
|
+
class Object
|
4
|
+
# Returns a deep copy of object if it's duplicable. If it's
|
5
|
+
# not duplicable, returns +self+.
|
6
|
+
#
|
7
|
+
# object = Object.new
|
8
|
+
# dup = object.deep_dup
|
9
|
+
# dup.instance_variable_set(:@a, 1)
|
10
|
+
#
|
11
|
+
# object.instance_variable_defined?(:@a) # => false
|
12
|
+
# dup.instance_variable_defined?(:@a) # => true
|
13
|
+
def deep_dup
|
14
|
+
duplicable? ? dup : self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Array
|
19
|
+
# Returns a deep copy of array.
|
20
|
+
#
|
21
|
+
# array = [1, [2, 3]]
|
22
|
+
# dup = array.deep_dup
|
23
|
+
# dup[1][2] = 4
|
24
|
+
#
|
25
|
+
# array[1][2] # => nil
|
26
|
+
# dup[1][2] # => 4
|
27
|
+
def deep_dup
|
28
|
+
map(&:deep_dup)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Hash
|
33
|
+
# Returns a deep copy of hash.
|
34
|
+
#
|
35
|
+
# hash = { a: { b: 'b' } }
|
36
|
+
# dup = hash.deep_dup
|
37
|
+
# dup[:a][:c] = 'c'
|
38
|
+
#
|
39
|
+
# hash[:a][:c] # => nil
|
40
|
+
# dup[:a][:c] # => "c"
|
41
|
+
def deep_dup
|
42
|
+
hash = dup
|
43
|
+
each_pair do |key, value|
|
44
|
+
if ::String === key || ::Symbol === key
|
45
|
+
hash[key] = value.deep_dup
|
46
|
+
else
|
47
|
+
hash.delete(key)
|
48
|
+
hash[key.deep_dup] = value.deep_dup
|
49
|
+
end
|
50
|
+
end
|
51
|
+
hash
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/object/duplicable.rb
|
2
|
+
|
3
|
+
class Object
|
4
|
+
# Can you safely dup this object?
|
5
|
+
#
|
6
|
+
# False for method objects;
|
7
|
+
# true otherwise.
|
8
|
+
def duplicable?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Method
|
14
|
+
# Methods are not duplicable:
|
15
|
+
#
|
16
|
+
# method(:puts).duplicable? # => false
|
17
|
+
# method(:puts).dup # => TypeError: allocator undefined for Method
|
18
|
+
def duplicable?
|
19
|
+
false
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class UnboundMethod
|
24
|
+
# Unbound methods are not duplicable:
|
25
|
+
#
|
26
|
+
# method(:puts).unbind.duplicable? # => false
|
27
|
+
# method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
|
28
|
+
def duplicable?
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
require "singleton"
|
34
|
+
|
35
|
+
module Singleton
|
36
|
+
# Singleton instances are not duplicable:
|
37
|
+
#
|
38
|
+
# Class.new.include(Singleton).instance.dup # TypeError (can't dup instance of singleton
|
39
|
+
def duplicable?
|
40
|
+
false
|
41
|
+
end
|
42
|
+
end
|
data/lib/core_ext.rb
ADDED
data/lib/statinize/attribute.rb
CHANGED
@@ -2,7 +2,7 @@ module Statinize
|
|
2
2
|
class Attribute
|
3
3
|
include Comparable
|
4
4
|
|
5
|
-
attr_reader :klass, :name, :default, :arg_name
|
5
|
+
attr_reader :klass, :name, :default, :default_exec, :arg_name
|
6
6
|
attr_accessor :options_collection, :options
|
7
7
|
|
8
8
|
def initialize(klass, name, options)
|
@@ -13,6 +13,7 @@ module Statinize
|
|
13
13
|
@options_collection << options.clone.extend(Options) unless options.empty?
|
14
14
|
|
15
15
|
@default = options[:default] if options.key?(:default)
|
16
|
+
@default_exec = options[:default_exec] if options.key?(:default_exec)
|
16
17
|
@arg_name = name
|
17
18
|
@name = options[:name] || name
|
18
19
|
end
|
@@ -70,7 +70,11 @@ module Statinize
|
|
70
70
|
|
71
71
|
def instantiate_defaults
|
72
72
|
statinizer.attributes.select { |a| a.options.key?(:default) }.each do |attribute|
|
73
|
-
public_send("#{attribute.name}=", attribute.default)
|
73
|
+
public_send("#{attribute.name}=", attribute.default.deep_dup)
|
74
|
+
end
|
75
|
+
|
76
|
+
statinizer.attributes.select { |a| a.options.key?(:default_exec) }.each do |attribute|
|
77
|
+
public_send("#{attribute.name}=", attribute.default_exec.call)
|
74
78
|
end
|
75
79
|
end
|
76
80
|
end
|
data/lib/statinize/statinizer.rb
CHANGED
@@ -50,7 +50,7 @@ module Statinize
|
|
50
50
|
|
51
51
|
def populate(attrs)
|
52
52
|
attrs.each do |attr|
|
53
|
-
attribute attr.arg_name, name: attr.name, default: attr.default
|
53
|
+
attribute attr.arg_name, name: attr.name, default: attr.default, default_exec: attr.default_exec
|
54
54
|
attributes.find { _1.name == attr.name }.tap do |attr_to_populate|
|
55
55
|
attr_to_populate.options_collection = attr.options_collection.clone
|
56
56
|
attr_to_populate.options = attr.options.clone
|
data/lib/statinize/validation.rb
CHANGED
@@ -43,7 +43,7 @@ module Statinize
|
|
43
43
|
attr_value = instance.public_send(attr.name)
|
44
44
|
|
45
45
|
option.validators.each do |validator_class, validator_value|
|
46
|
-
validator_instance = validator_class.new(attr_value, validator_value)
|
46
|
+
validator_instance = validator_class.new(attr_value, validator_value, instance)
|
47
47
|
|
48
48
|
if option[:type] && option.should_cast? && attr_value.nil? && (option[:presence] || option[:nil] == false)
|
49
49
|
cast(attr, option)
|
data/lib/statinize/validator.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Statinize
|
2
2
|
class Validator
|
3
|
-
NOT_VALIDATORS = %i[force cast if unless default name]
|
3
|
+
NOT_VALIDATORS = %i[force cast if unless default default_exec name]
|
4
4
|
|
5
|
-
attr_accessor :attr_value, :validator_value
|
5
|
+
attr_accessor :attr_value, :validator_value, :instance
|
6
6
|
|
7
|
-
def initialize(attr_value, validator_value)
|
7
|
+
def initialize(attr_value, validator_value, instance)
|
8
8
|
@attr_value = attr_value
|
9
9
|
@validator_value = validator_value
|
10
|
+
@instance = instance
|
10
11
|
end
|
11
12
|
|
12
13
|
def valid?
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module Statinize
|
2
2
|
class TypeValidator < Validator
|
3
3
|
def valid?
|
4
|
-
|
4
|
+
if validator_value.is_a? Class
|
5
|
+
attr_value.is_a?(validator_value)
|
6
|
+
elsif validator_value.is_a? Proc
|
7
|
+
attr_value.is_a? instance.instance_exec(&validator_value)
|
8
|
+
end || attr_value.nil?
|
5
9
|
end
|
6
10
|
|
7
11
|
def error
|
data/lib/statinize.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statinize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Barseek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Statinization gem. Allows for creation of attributes for a class with
|
14
14
|
a given type.
|
@@ -17,6 +17,9 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- lib/core_ext.rb
|
21
|
+
- lib/core_ext/deep_dup.rb
|
22
|
+
- lib/core_ext/duplicable.rb
|
20
23
|
- lib/statinize.rb
|
21
24
|
- lib/statinize/attribute.rb
|
22
25
|
- lib/statinize/attribute/options.rb
|