striuct 0.6.1 → 0.9.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 +44 -60
- data/lib/striuct/{requirements.rb → bootstrap.rb} +6 -2
- data/lib/striuct/classmethods/README.md +2 -2
- data/lib/striuct/classmethods/adjustment.rb +77 -13
- data/lib/striuct/classmethods/attributes.rb +94 -92
- data/lib/striuct/classmethods/conflict_management.rb +109 -106
- data/lib/striuct/classmethods/constructor.rb +55 -65
- 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 +99 -106
- data/lib/striuct/classmethods/names.rb +69 -65
- data/lib/striuct/classmethods/predicate.rb +131 -129
- data/lib/striuct/classmethods/requirements.rb +2 -2
- 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/lock.rb +46 -44
- data/lib/striuct/instancemethods/object.rb +50 -48
- data/lib/striuct/instancemethods/requirements.rb +9 -13
- 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 +46 -29
- data/lib/striuct/instancemethods/values.rb +50 -48
- data/lib/striuct/singleton_class.rb +25 -18
- data/lib/striuct/structs.rb +3 -3
- data/lib/striuct.rb +7 -3
- metadata +18 -209
- 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/lib/striuct/instancemethods/keyvalidatable.rb +0 -9
- 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,66 +1,68 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Basic Methods for Ruby's Object
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
# @return [self]
|
8
|
+
def freeze
|
9
|
+
@db.freeze; @locks.freeze
|
10
|
+
super
|
11
|
+
end
|
10
12
|
|
11
|
-
|
13
|
+
private
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
+
def initialize(*values)
|
16
|
+
_initialize_database
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
replace_values(*values)
|
19
|
+
excess_autonyms = _autonyms.last(size - values.size)
|
20
|
+
_set_defaults(*excess_autonyms)
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
each_autonym do |autonym|
|
23
|
+
_check_must(autonym)
|
24
|
+
end
|
22
25
|
end
|
23
|
-
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
excess_autonyms = _autonyms.dup
|
29
|
-
pairs.each_pair do |key, value|
|
30
|
-
autonym = autonym_for_key key
|
31
|
-
self[autonym] = value
|
32
|
-
excess_autonyms.delete autonym
|
33
|
-
end
|
27
|
+
def initialize_for_pairs(pairs)
|
28
|
+
_initialize_database
|
34
29
|
|
35
|
-
|
30
|
+
excess_autonyms = _autonyms.dup
|
31
|
+
pairs.each_pair do |key, value|
|
32
|
+
autonym = autonym_for_key(key)
|
33
|
+
self[autonym] = value
|
34
|
+
excess_autonyms.delete(autonym)
|
35
|
+
end
|
36
36
|
|
37
|
-
|
38
|
-
|
37
|
+
_set_defaults(*excess_autonyms)
|
38
|
+
|
39
|
+
excess_autonyms.each do |autonym|
|
40
|
+
_check_must(autonym)
|
41
|
+
end
|
39
42
|
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def initialize_copy(original)
|
43
|
-
@db, @locks = @db.dup, {}
|
44
|
-
end
|
45
43
|
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
def initialize_copy(original)
|
45
|
+
@db, @locks = @db.dup, {}
|
46
|
+
end
|
49
47
|
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
def _initialize_database
|
49
|
+
@db, @locks = {}, {}
|
50
|
+
end
|
53
51
|
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
def _check_frozen
|
53
|
+
raise "can't modify frozen #{self.class}" if frozen?
|
54
|
+
end
|
57
55
|
|
58
|
-
|
59
|
-
|
60
|
-
raise InvalidOperationError, "`#{key}` require a value under `must` option"
|
56
|
+
def _check_locked(key)
|
57
|
+
raise "can't modify locked member `#{key}`" if locked?(key)
|
61
58
|
end
|
62
|
-
end
|
63
59
|
|
64
|
-
|
60
|
+
def _check_must(key)
|
61
|
+
if must?(key) && !assigned?(key)
|
62
|
+
raise InvalidOperationError, "`#{key}` require a value under `must` option"
|
63
|
+
end
|
64
|
+
end
|
65
65
|
|
66
|
-
|
66
|
+
# @endgroup
|
67
|
+
end
|
68
|
+
end
|
@@ -1,19 +1,15 @@
|
|
1
|
-
|
2
|
-
require 'keyvalidatable'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
class Striuct
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
extend Forwardable
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
include KeyValidatable
|
12
|
-
|
13
|
-
end; end
|
7
|
+
# hide Forwardable's public/protected class_macro
|
8
|
+
private_class_method(*Forwardable.instance_methods)
|
9
|
+
end
|
10
|
+
end
|
14
11
|
|
15
12
|
require_relative 'delegate_class_methods'
|
16
|
-
require_relative 'keyvalidatable'
|
17
13
|
require_relative 'object'
|
18
14
|
require_relative 'compare'
|
19
15
|
require_relative 'to_s'
|
@@ -27,4 +23,4 @@ require_relative 'setter'
|
|
27
23
|
require_relative 'assign'
|
28
24
|
require_relative 'lock'
|
29
25
|
require_relative 'validation'
|
30
|
-
require_relative 'safety'
|
26
|
+
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 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 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 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 InvalidValueError
|
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,52 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Striuct
|
4
|
+
module InstanceMethods
|
5
|
+
# @group Validation
|
6
|
+
|
7
|
+
# @param [Proc, Method, #===] pattern
|
8
|
+
# @param [Object] value
|
9
|
+
def _valid?(pattern, value)
|
10
|
+
!!(
|
11
|
+
case pattern
|
12
|
+
when Proc
|
13
|
+
instance_exec(value, &pattern)
|
14
|
+
when Method
|
15
|
+
pattern.call(value)
|
16
|
+
else
|
17
|
+
pattern === value
|
18
|
+
end
|
19
|
+
)
|
16
20
|
end
|
17
|
-
end
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
23
|
+
# @param value
|
24
|
+
# true if passed under any condition
|
25
|
+
def accept?(key, value)
|
26
|
+
autonym = autonym_for_key(key)
|
27
|
+
return true unless restrict?(autonym)
|
28
|
+
|
29
|
+
begin
|
30
|
+
_valid?(condition_for(autonym), value)
|
31
|
+
rescue Exception
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
25
35
|
|
26
|
-
|
36
|
+
# @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
|
37
|
+
# @param value - if no argument and use current assigned value
|
38
|
+
# true if passed under any condition
|
39
|
+
def sufficient?(key, value=self[key])
|
40
|
+
accept?(key, value)
|
41
|
+
end
|
27
42
|
|
28
|
-
|
29
|
-
def strict?
|
30
|
-
each_pair.all?{|autonym, value|sufficient? autonym, value}
|
31
|
-
end
|
43
|
+
alias_method :valid?, :sufficient?
|
32
44
|
|
33
|
-
|
45
|
+
# all members passed under any condition
|
46
|
+
def strict?
|
47
|
+
each_pair.all? { |autonym, value| sufficient?(autonym, value) }
|
48
|
+
end
|
34
49
|
|
35
|
-
|
50
|
+
# @endgroup
|
51
|
+
end
|
52
|
+
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
|
@@ -1,13 +1,9 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Striuct
|
4
|
-
|
5
4
|
class << self
|
6
|
-
|
7
5
|
alias_method :new_instance, :new
|
8
6
|
private :new_instance
|
9
|
-
|
10
|
-
# @group Constructors for Subclassies
|
11
7
|
|
12
8
|
# @param [Symbol, String] autonyms
|
13
9
|
# @yieldreturn [Class]
|
@@ -15,8 +11,8 @@ class Striuct
|
|
15
11
|
def new(*autonyms, &block)
|
16
12
|
# warning for Ruby's Struct.new user
|
17
13
|
first = autonyms.first
|
18
|
-
if first.instance_of?(String)
|
19
|
-
warn
|
14
|
+
if first.instance_of?(String) && /\A[A-Z]/ =~ first
|
15
|
+
warn("no define constant first-arg(#{first}), the Struct behavior is not supported in Striuct")
|
20
16
|
end
|
21
17
|
|
22
18
|
Class.new(self) {
|
@@ -24,42 +20,53 @@ class Striuct
|
|
24
20
|
add_member autonym
|
25
21
|
end
|
26
22
|
|
27
|
-
class_eval(&block) if
|
23
|
+
class_eval(&block) if block
|
28
24
|
}
|
29
25
|
end
|
30
26
|
|
31
27
|
# @yieldreturn [Class] (see Striuct.new) - reject floating class
|
32
28
|
# @return [void]
|
33
29
|
def define(&block)
|
34
|
-
raise ArgumentError, 'block not supplied' unless
|
30
|
+
raise ArgumentError, 'block not supplied' unless block
|
35
31
|
|
36
|
-
new(&block).tap {|subclass|
|
32
|
+
new(&block).tap { |subclass|
|
37
33
|
subclass.class_eval {
|
38
34
|
raise 'not yet finished' if @autonyms.empty?
|
35
|
+
|
39
36
|
close
|
40
37
|
}
|
41
38
|
}
|
42
39
|
end
|
43
40
|
|
44
|
-
#
|
41
|
+
# Return `true` if given object is sufficient as an adjuster role
|
42
|
+
def adjustable?(object)
|
43
|
+
case object
|
44
|
+
when Proc
|
45
|
+
object.arity == 1
|
46
|
+
else
|
47
|
+
if object.respond_to?(:to_proc)
|
48
|
+
object.to_proc.arity == 1
|
49
|
+
else
|
50
|
+
false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
45
54
|
|
46
55
|
private
|
47
|
-
|
56
|
+
|
48
57
|
def inherited(subclass)
|
49
|
-
ret = super
|
58
|
+
ret = super(subclass)
|
50
59
|
|
51
60
|
subclass.class_eval {
|
52
61
|
extend ClassMethods
|
53
62
|
include Enumerable
|
54
|
-
|
63
|
+
extend Eqq::Buildable
|
55
64
|
include InstanceMethods
|
56
|
-
|
65
|
+
|
57
66
|
_init
|
58
67
|
}
|
59
68
|
|
60
69
|
ret
|
61
70
|
end
|
62
|
-
|
63
71
|
end
|
64
|
-
|
65
|
-
end
|
72
|
+
end
|
data/lib/striuct/structs.rb
CHANGED
data/lib/striuct.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# striuct - Struct++
|
2
4
|
# Copyright (c) 2011-2012 Kenichi Kamiya
|
3
5
|
|
4
6
|
# @abstract
|
5
7
|
class Striuct
|
6
|
-
|
7
8
|
class Error < StandardError; end
|
8
9
|
class InvalidOperationError < Error; end
|
9
|
-
|
10
|
+
class InvalidValueError < Error; end
|
11
|
+
class InvalidWritingError < InvalidValueError; end
|
12
|
+
class InvalidReadingError < InvalidValueError; end
|
13
|
+
class InvalidAdjustingError < InvalidValueError; end
|
10
14
|
end
|
11
15
|
|
12
|
-
require_relative 'striuct/
|
16
|
+
require_relative 'striuct/bootstrap'
|