striuct 0.6.1 → 0.7.0
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/MIT-LICENSE.txt +21 -0
- data/README.md +19 -39
- data/lib/striuct.rb +3 -3
- data/lib/striuct/classmethods/README.md +2 -2
- data/lib/striuct/classmethods/adjustment.rb +15 -13
- data/lib/striuct/classmethods/attributes.rb +94 -92
- data/lib/striuct/classmethods/conflict_management.rb +109 -106
- data/lib/striuct/classmethods/constructor.rb +47 -54
- data/lib/striuct/classmethods/copy.rb +45 -43
- data/lib/striuct/classmethods/default.rb +23 -21
- data/lib/striuct/classmethods/enum.rb +46 -44
- data/lib/striuct/classmethods/fix.rb +23 -21
- data/lib/striuct/classmethods/hashdeepdupulicatable.rb +15 -15
- data/lib/striuct/classmethods/inner.rb +57 -55
- data/lib/striuct/classmethods/length.rb +12 -10
- data/lib/striuct/classmethods/macro.rb +110 -106
- data/lib/striuct/classmethods/names.rb +69 -65
- data/lib/striuct/classmethods/predicate.rb +131 -129
- data/lib/striuct/classmethods/requirements.rb +3 -1
- data/lib/striuct/classmethods/to_struct.rb +21 -18
- data/lib/striuct/classmethods/validation.rb +15 -13
- data/lib/striuct/instancemethods/README.md +2 -2
- data/lib/striuct/instancemethods/assign.rb +29 -27
- data/lib/striuct/instancemethods/cast.rb +28 -26
- data/lib/striuct/instancemethods/compare.rb +26 -24
- data/lib/striuct/instancemethods/default.rb +31 -29
- data/lib/striuct/instancemethods/delegate_class_methods.rb +35 -33
- data/lib/striuct/instancemethods/enum.rb +86 -84
- data/lib/striuct/instancemethods/getter.rb +39 -37
- data/lib/striuct/instancemethods/hashy.rb +99 -97
- data/lib/striuct/instancemethods/keyvalidatable.rb +8 -6
- data/lib/striuct/instancemethods/lock.rb +46 -44
- data/lib/striuct/instancemethods/object.rb +50 -48
- data/lib/striuct/instancemethods/requirements.rb +11 -9
- data/lib/striuct/instancemethods/safety.rb +11 -9
- data/lib/striuct/instancemethods/setter.rb +46 -45
- data/lib/striuct/instancemethods/to_s.rb +39 -37
- data/lib/striuct/instancemethods/validation.rb +31 -29
- data/lib/striuct/instancemethods/values.rb +50 -48
- data/lib/striuct/requirements.rb +3 -1
- data/lib/striuct/singleton_class.rb +12 -17
- data/lib/striuct/structs.rb +3 -3
- metadata +33 -178
- data/.gitignore +0 -35
- data/.travis.yml +0 -17
- data/.yardopts +0 -1
- data/Gemfile +0 -11
- data/MIT-LICENSE +0 -22
- data/Rakefile +0 -11
- data/benchmark/basics.rb +0 -56
- data/example/README.rb +0 -50
- data/example/example1.rb +0 -195
- data/example/example2.rb +0 -20
- data/example/see_trace.rb +0 -32
- data/striuct.gemspec +0 -45
- data/test/helper.rb +0 -3
- data/test/test_sglc-constructor.rb +0 -36
- data/test/test_subc-c-add_members.rb +0 -13
- data/test/test_subc-c-close_member.rb +0 -36
- data/test/test_subc-c-constructor.rb +0 -92
- data/test/test_subc-c-copy.rb +0 -71
- data/test/test_subc-c-freeze.rb +0 -36
- data/test/test_subc-c-inheritable.rb +0 -58
- data/test/test_subc-c-safety_naming.rb +0 -73
- data/test/test_subc-f-alias_member.rb +0 -54
- data/test/test_subc-f-enum.rb +0 -159
- data/test/test_subc-f-predicate.rb +0 -647
- data/test/test_subc-f-to_struct.rb +0 -61
- data/test/test_subc-f-validation_util.rb +0 -59
- data/test/test_subc-f_debug.rb +0 -39
- data/test/test_subc-f_name.rb +0 -525
- data/test/test_subc-i-accessor.rb +0 -138
- data/test/test_subc-i-adjuster.rb +0 -95
- data/test/test_subc-i-assign.rb +0 -53
- data/test/test_subc-i-basic.rb +0 -43
- data/test/test_subc-i-cast.rb +0 -27
- data/test/test_subc-i-compare.rb +0 -52
- data/test/test_subc-i-copy.rb +0 -23
- data/test/test_subc-i-default_value.rb +0 -129
- data/test/test_subc-i-freeze.rb +0 -19
- data/test/test_subc-i-hashlike.rb +0 -144
- data/test/test_subc-i-keyvalidatable.rb +0 -25
- data/test/test_subc-i-lock.rb +0 -40
- data/test/test_subc-i-must.rb +0 -30
- data/test/test_subc-i-to_s_family.rb +0 -26
- data/test/test_subc-i-validation_specific_conditions.rb +0 -297
- data/test/test_subc-i-validation_with_getter.rb +0 -33
- data/test/test_version.rb +0 -13
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'forwardable'
|
2
4
|
require 'keyvalidatable'
|
3
5
|
|
4
|
-
class Striuct
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
# hide Forwardable's public/protected class_macro
|
9
|
-
private_class_method(*Forwardable.instance_methods)
|
6
|
+
class Striuct
|
7
|
+
module InstanceMethods
|
8
|
+
extend Forwardable
|
10
9
|
|
11
|
-
|
10
|
+
# hide Forwardable's public/protected class_macro
|
11
|
+
private_class_method(*Forwardable.instance_methods)
|
12
12
|
|
13
|
-
|
13
|
+
include KeyValidatable
|
14
|
+
end
|
15
|
+
end
|
14
16
|
|
15
17
|
require_relative 'delegate_class_methods'
|
16
18
|
require_relative 'keyvalidatable'
|
@@ -27,4 +29,4 @@ require_relative 'setter'
|
|
27
29
|
require_relative 'assign'
|
28
30
|
require_relative 'lock'
|
29
31
|
require_relative 'validation'
|
30
|
-
require_relative 'safety'
|
32
|
+
require_relative 'safety'
|
@@ -1,12 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def secure?
|
7
|
-
(frozen? || all_locked?) && self.class.closed? && strict?
|
8
|
-
end
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Safety
|
9
6
|
|
10
|
-
|
7
|
+
# freezed, fixed familiar members, all members passed any condition
|
8
|
+
def secure?
|
9
|
+
(frozen? || all_locked?) && self.class.closed? && strict?
|
10
|
+
end
|
11
11
|
|
12
|
-
|
12
|
+
# @endgroup
|
13
|
+
end
|
14
|
+
end
|
@@ -1,54 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
$!.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Setter
|
6
|
+
|
7
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
8
|
+
# @return value
|
9
|
+
def []=(key, value)
|
10
|
+
autonym = autonym_for_key(key)
|
11
|
+
_set(autonym, value)
|
12
|
+
rescue Validation::InvalidWritingError
|
13
|
+
$!.set_backtrace(
|
14
|
+
["#{$!.backtrace[-1].sub(/[^:]+\z/) { '' }}in `[#{key.inspect}(#{autonym})]=': #{$!.message}", $!.backtrace[-1]]
|
15
|
+
)
|
16
|
+
|
17
|
+
raise
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
+
alias_method :assign, :[]=
|
20
21
|
|
21
|
-
|
22
|
+
private
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
# @param [Symbol] autonym - MUST already converted to native autonym
|
25
|
+
# @return value
|
26
|
+
def _set(autonym, value)
|
27
|
+
_check_frozen
|
28
|
+
_check_locked(autonym)
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
if with_adjuster?(autonym)
|
31
|
+
begin
|
32
|
+
value = instance_exec(value, &adjuster_for(autonym))
|
33
|
+
rescue Exception
|
34
|
+
raise ::Validation::InvalidAdjustingError
|
35
|
+
end
|
34
36
|
end
|
35
|
-
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
if with_safety_setter?(autonym) && !accept?(autonym, value)
|
39
|
+
raise ::Validation::InvalidWritingError,
|
40
|
+
"#{value.inspect} is deficient for #{autonym} in #{self.class}"
|
41
|
+
end
|
41
42
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
raise
|
50
|
-
end
|
43
|
+
@db[autonym] = value
|
44
|
+
rescue ::Validation::InvalidError
|
45
|
+
unless /in \[\]=/.match?(caller(2..2).first.slice(/([^:]+)\z/))
|
46
|
+
$!.backtrace.delete_if { |s| /#{Regexp.escape(File.dirname(__FILE__))}/ =~ s }
|
47
|
+
$!.backtrace.first.sub!(/([^:]+)\z/) { "in `#{autonym}='" }
|
48
|
+
end
|
51
49
|
|
52
|
-
|
50
|
+
raise
|
51
|
+
end
|
53
52
|
|
54
|
-
|
53
|
+
# @endgroup
|
54
|
+
end
|
55
|
+
end
|
@@ -1,43 +1,45 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def inspect
|
7
|
-
"#<struct' #{self.class}".tap {|s|
|
8
|
-
each_pair do |autonym, value|
|
9
|
-
suffix = (with_default?(autonym) && default?(autonym)) ? '/default' : nil
|
10
|
-
label_valid = valid?(autonym) ? nil : :invalid
|
11
|
-
label_lock = locked?(autonym) ? :locked : nil
|
12
|
-
label_must = must?(autonym) ? :must : nil
|
13
|
-
labels = [label_valid, label_lock, label_must].select{|_|_}
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group To Strings
|
14
6
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
7
|
+
# @return [String]
|
8
|
+
def inspect
|
9
|
+
(+"#<struct' #{self.class}").tap { |s|
|
10
|
+
each_pair do |autonym, value|
|
11
|
+
suffix = (with_default?(autonym) && default?(autonym)) ? '/default' : nil
|
12
|
+
label_valid = valid?(autonym) ? nil : :invalid
|
13
|
+
label_lock = locked?(autonym) ? :locked : nil
|
14
|
+
label_must = must?(autonym) ? :must : nil
|
15
|
+
labels = [label_valid, label_lock, label_must].select { |elm| elm }
|
16
|
+
|
17
|
+
s << " #{autonym}=#{value.inspect}#{suffix}"
|
18
|
+
unless labels.empty?
|
19
|
+
s << '('
|
20
|
+
s << labels.join(', ')
|
21
|
+
s << ')'
|
22
|
+
end
|
23
|
+
s << ','
|
20
24
|
end
|
21
|
-
s << ','
|
22
|
-
end
|
23
|
-
|
24
|
-
s.chop!
|
25
|
-
s << '>'
|
26
|
-
}
|
27
|
-
end
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
s << " #{autonym}=#{value.inspect},"
|
34
|
-
end
|
35
|
-
|
36
|
-
s.chop!
|
37
|
-
s << '>'
|
38
|
-
}
|
39
|
-
end
|
26
|
+
s.chop!
|
27
|
+
s << '>'
|
28
|
+
}
|
29
|
+
end
|
40
30
|
|
41
|
-
|
31
|
+
# @return [String]
|
32
|
+
def to_s
|
33
|
+
(+"#<struct' #{self.class}").tap { |s|
|
34
|
+
each_pair do |autonym, value|
|
35
|
+
s << " #{autonym}=#{value.inspect},"
|
36
|
+
end
|
37
|
+
|
38
|
+
s.chop!
|
39
|
+
s << '>'
|
40
|
+
}
|
41
|
+
end
|
42
42
|
|
43
|
-
|
43
|
+
# @endgroup
|
44
|
+
end
|
45
|
+
end
|
@@ -1,35 +1,37 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
# @param value
|
7
|
-
# true if passed under any condition
|
8
|
-
def accept?(key, value)
|
9
|
-
autonym = autonym_for_key key
|
10
|
-
return true unless restrict? autonym
|
11
|
-
|
12
|
-
begin
|
13
|
-
_valid? condition_for(autonym), value
|
14
|
-
rescue Exception
|
15
|
-
false
|
16
|
-
end
|
17
|
-
end
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Validation
|
18
6
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
7
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
8
|
+
# @param value
|
9
|
+
# true if passed under any condition
|
10
|
+
def accept?(key, value)
|
11
|
+
autonym = autonym_for_key(key)
|
12
|
+
return true unless restrict?(autonym)
|
25
13
|
|
26
|
-
|
14
|
+
begin
|
15
|
+
_valid?(condition_for(autonym), value)
|
16
|
+
rescue Exception
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
27
20
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
22
|
+
# @param value - if no argument and use current assigned value
|
23
|
+
# true if passed under any condition
|
24
|
+
def sufficient?(key, value=self[key])
|
25
|
+
accept?(key, value)
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :valid?, :sufficient?
|
32
29
|
|
33
|
-
|
30
|
+
# all members passed under any condition
|
31
|
+
def strict?
|
32
|
+
each_pair.all? { |autonym, value| sufficient?(autonym, value) }
|
33
|
+
end
|
34
34
|
|
35
|
-
|
35
|
+
# @endgroup
|
36
|
+
end
|
37
|
+
end
|
@@ -1,58 +1,60 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
[]
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Behavior under Values
|
6
|
+
|
7
|
+
# @param [Integer, #to_int, Range] keys
|
8
|
+
# @return [Array]
|
9
|
+
def values_at(*keys)
|
10
|
+
[].tap { |r|
|
11
|
+
keys.each do |key|
|
12
|
+
case key
|
13
|
+
when ->v { v.respond_to?(:to_int) }
|
14
|
+
r << fetch_by_index(key)
|
15
|
+
when Range
|
16
|
+
key.each do |idx|
|
17
|
+
raise TypeError unless idx.respond_to?(:to_int)
|
18
|
+
|
19
|
+
r << fetch_by_index(idx)
|
20
|
+
end
|
21
|
+
else
|
22
|
+
raise TypeError
|
18
23
|
end
|
19
|
-
else
|
20
|
-
raise TypeError
|
21
24
|
end
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
+
}
|
26
|
+
end
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
else
|
34
|
-
if block_given?
|
35
|
-
block.call
|
28
|
+
# @return [Array]
|
29
|
+
# @raise [ArgumentError] if the keys contains an unmatched
|
30
|
+
# key and no block is given
|
31
|
+
def fetch_values(*keys, &block)
|
32
|
+
keys.map { |key|
|
33
|
+
if key?(key)
|
34
|
+
fetch_by_key(key)
|
36
35
|
else
|
37
|
-
|
36
|
+
if block
|
37
|
+
yield
|
38
|
+
else
|
39
|
+
raise ArgumentError, "`#{key}' is not matched"
|
40
|
+
end
|
38
41
|
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [self]
|
46
|
+
def replace_values(*values)
|
47
|
+
unless values.size <= size
|
48
|
+
raise ArgumentError, "struct size differs (max: #{size})"
|
39
49
|
end
|
40
|
-
}
|
41
|
-
end
|
42
50
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
raise ArgumentError, "struct size differs (max: #{size})"
|
47
|
-
end
|
51
|
+
values.each_with_index do |value, index|
|
52
|
+
_set(autonym_for_index(index), value)
|
53
|
+
end
|
48
54
|
|
49
|
-
|
50
|
-
_set autonym_for_index(index), value
|
55
|
+
self
|
51
56
|
end
|
52
|
-
|
53
|
-
self
|
54
|
-
end
|
55
|
-
|
56
|
-
# @endgroup
|
57
57
|
|
58
|
-
|
58
|
+
# @endgroup
|
59
|
+
end
|
60
|
+
end
|
data/lib/striuct/requirements.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'validation'
|
2
4
|
|
3
5
|
class Striuct
|
4
|
-
|
5
6
|
class << self
|
6
|
-
|
7
7
|
alias_method :new_instance, :new
|
8
8
|
private :new_instance
|
9
|
-
|
10
|
-
# @group Constructors for Subclassies
|
11
9
|
|
12
10
|
# @param [Symbol, String] autonyms
|
13
11
|
# @yieldreturn [Class]
|
@@ -15,8 +13,8 @@ class Striuct
|
|
15
13
|
def new(*autonyms, &block)
|
16
14
|
# warning for Ruby's Struct.new user
|
17
15
|
first = autonyms.first
|
18
|
-
if first.instance_of?(String)
|
19
|
-
warn
|
16
|
+
if first.instance_of?(String) && /\A[A-Z]/ =~ first
|
17
|
+
warn("no define constant first-arg(#{first}), the Struct behavior is not supported in Striuct")
|
20
18
|
end
|
21
19
|
|
22
20
|
Class.new(self) {
|
@@ -24,42 +22,39 @@ class Striuct
|
|
24
22
|
add_member autonym
|
25
23
|
end
|
26
24
|
|
27
|
-
class_eval(&block) if
|
25
|
+
class_eval(&block) if block
|
28
26
|
}
|
29
27
|
end
|
30
28
|
|
31
29
|
# @yieldreturn [Class] (see Striuct.new) - reject floating class
|
32
30
|
# @return [void]
|
33
31
|
def define(&block)
|
34
|
-
raise ArgumentError, 'block not supplied' unless
|
32
|
+
raise ArgumentError, 'block not supplied' unless block
|
35
33
|
|
36
|
-
new(&block).tap {|subclass|
|
34
|
+
new(&block).tap { |subclass|
|
37
35
|
subclass.class_eval {
|
38
36
|
raise 'not yet finished' if @autonyms.empty?
|
37
|
+
|
39
38
|
close
|
40
39
|
}
|
41
40
|
}
|
42
41
|
end
|
43
42
|
|
44
|
-
# @groupend
|
45
|
-
|
46
43
|
private
|
47
|
-
|
44
|
+
|
48
45
|
def inherited(subclass)
|
49
|
-
ret = super
|
46
|
+
ret = super(subclass)
|
50
47
|
|
51
48
|
subclass.class_eval {
|
52
49
|
extend ClassMethods
|
53
50
|
include Enumerable
|
54
51
|
include Validation
|
55
52
|
include InstanceMethods
|
56
|
-
|
53
|
+
|
57
54
|
_init
|
58
55
|
}
|
59
56
|
|
60
57
|
ret
|
61
58
|
end
|
62
|
-
|
63
59
|
end
|
64
|
-
|
65
|
-
end
|
60
|
+
end
|