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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +44 -60
  4. data/lib/striuct/{requirements.rb → bootstrap.rb} +6 -2
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +77 -13
  7. data/lib/striuct/classmethods/attributes.rb +94 -92
  8. data/lib/striuct/classmethods/conflict_management.rb +109 -106
  9. data/lib/striuct/classmethods/constructor.rb +55 -65
  10. data/lib/striuct/classmethods/copy.rb +45 -43
  11. data/lib/striuct/classmethods/default.rb +23 -21
  12. data/lib/striuct/classmethods/enum.rb +46 -44
  13. data/lib/striuct/classmethods/fix.rb +23 -21
  14. data/lib/striuct/classmethods/hashdeepdupulicatable.rb +15 -15
  15. data/lib/striuct/classmethods/inner.rb +57 -55
  16. data/lib/striuct/classmethods/length.rb +12 -10
  17. data/lib/striuct/classmethods/macro.rb +99 -106
  18. data/lib/striuct/classmethods/names.rb +69 -65
  19. data/lib/striuct/classmethods/predicate.rb +131 -129
  20. data/lib/striuct/classmethods/requirements.rb +2 -2
  21. data/lib/striuct/classmethods/to_struct.rb +21 -18
  22. data/lib/striuct/classmethods/validation.rb +15 -13
  23. data/lib/striuct/instancemethods/README.md +2 -2
  24. data/lib/striuct/instancemethods/assign.rb +29 -27
  25. data/lib/striuct/instancemethods/cast.rb +28 -26
  26. data/lib/striuct/instancemethods/compare.rb +26 -24
  27. data/lib/striuct/instancemethods/default.rb +31 -29
  28. data/lib/striuct/instancemethods/delegate_class_methods.rb +35 -33
  29. data/lib/striuct/instancemethods/enum.rb +86 -84
  30. data/lib/striuct/instancemethods/getter.rb +39 -37
  31. data/lib/striuct/instancemethods/hashy.rb +99 -97
  32. data/lib/striuct/instancemethods/lock.rb +46 -44
  33. data/lib/striuct/instancemethods/object.rb +50 -48
  34. data/lib/striuct/instancemethods/requirements.rb +9 -13
  35. data/lib/striuct/instancemethods/safety.rb +11 -9
  36. data/lib/striuct/instancemethods/setter.rb +46 -45
  37. data/lib/striuct/instancemethods/to_s.rb +39 -37
  38. data/lib/striuct/instancemethods/validation.rb +46 -29
  39. data/lib/striuct/instancemethods/values.rb +50 -48
  40. data/lib/striuct/singleton_class.rb +25 -18
  41. data/lib/striuct/structs.rb +3 -3
  42. data/lib/striuct.rb +7 -3
  43. metadata +18 -209
  44. data/.gitignore +0 -35
  45. data/.travis.yml +0 -17
  46. data/.yardopts +0 -1
  47. data/Gemfile +0 -11
  48. data/MIT-LICENSE +0 -22
  49. data/Rakefile +0 -11
  50. data/benchmark/basics.rb +0 -56
  51. data/example/README.rb +0 -50
  52. data/example/example1.rb +0 -195
  53. data/example/example2.rb +0 -20
  54. data/example/see_trace.rb +0 -32
  55. data/lib/striuct/instancemethods/keyvalidatable.rb +0 -9
  56. data/striuct.gemspec +0 -45
  57. data/test/helper.rb +0 -3
  58. data/test/test_sglc-constructor.rb +0 -36
  59. data/test/test_subc-c-add_members.rb +0 -13
  60. data/test/test_subc-c-close_member.rb +0 -36
  61. data/test/test_subc-c-constructor.rb +0 -92
  62. data/test/test_subc-c-copy.rb +0 -71
  63. data/test/test_subc-c-freeze.rb +0 -36
  64. data/test/test_subc-c-inheritable.rb +0 -58
  65. data/test/test_subc-c-safety_naming.rb +0 -73
  66. data/test/test_subc-f-alias_member.rb +0 -54
  67. data/test/test_subc-f-enum.rb +0 -159
  68. data/test/test_subc-f-predicate.rb +0 -647
  69. data/test/test_subc-f-to_struct.rb +0 -61
  70. data/test/test_subc-f-validation_util.rb +0 -59
  71. data/test/test_subc-f_debug.rb +0 -39
  72. data/test/test_subc-f_name.rb +0 -525
  73. data/test/test_subc-i-accessor.rb +0 -138
  74. data/test/test_subc-i-adjuster.rb +0 -95
  75. data/test/test_subc-i-assign.rb +0 -53
  76. data/test/test_subc-i-basic.rb +0 -43
  77. data/test/test_subc-i-cast.rb +0 -27
  78. data/test/test_subc-i-compare.rb +0 -52
  79. data/test/test_subc-i-copy.rb +0 -23
  80. data/test/test_subc-i-default_value.rb +0 -129
  81. data/test/test_subc-i-freeze.rb +0 -19
  82. data/test/test_subc-i-hashlike.rb +0 -144
  83. data/test/test_subc-i-keyvalidatable.rb +0 -25
  84. data/test/test_subc-i-lock.rb +0 -40
  85. data/test/test_subc-i-must.rb +0 -30
  86. data/test/test_subc-i-to_s_family.rb +0 -26
  87. data/test/test_subc-i-validation_specific_conditions.rb +0 -297
  88. data/test/test_subc-i-validation_with_getter.rb +0 -33
  89. data/test/test_version.rb +0 -13
@@ -1,66 +1,68 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Basic Methods for Ruby's Object
3
+ class Striuct
4
+ module InstanceMethods
5
+ # @group Basic Methods for Ruby's Object
4
6
 
5
- # @return [self]
6
- def freeze
7
- @db.freeze; @locks.freeze
8
- super
9
- end
7
+ # @return [self]
8
+ def freeze
9
+ @db.freeze; @locks.freeze
10
+ super
11
+ end
10
12
 
11
- private
13
+ private
12
14
 
13
- def initialize(*values)
14
- _initialize_database
15
+ def initialize(*values)
16
+ _initialize_database
15
17
 
16
- replace_values(*values)
17
- excess_autonyms = _autonyms.last(size - values.size)
18
- _set_defaults(*excess_autonyms)
18
+ replace_values(*values)
19
+ excess_autonyms = _autonyms.last(size - values.size)
20
+ _set_defaults(*excess_autonyms)
19
21
 
20
- each_autonym do |autonym|
21
- _check_must autonym
22
+ each_autonym do |autonym|
23
+ _check_must(autonym)
24
+ end
22
25
  end
23
- end
24
26
 
25
- def initialize_for_pairs(pairs)
26
- _initialize_database
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
- _set_defaults(*excess_autonyms)
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
- excess_autonyms.each do |autonym|
38
- _check_must autonym
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
- def _initialize_database
47
- @db, @locks = {}, {}
48
- end
44
+ def initialize_copy(original)
45
+ @db, @locks = @db.dup, {}
46
+ end
49
47
 
50
- def _check_frozen
51
- raise "can't modify frozen #{self.class}" if frozen?
52
- end
48
+ def _initialize_database
49
+ @db, @locks = {}, {}
50
+ end
53
51
 
54
- def _check_locked(key)
55
- raise "can't modify locked member `#{key}`" if locked? key
56
- end
52
+ def _check_frozen
53
+ raise "can't modify frozen #{self.class}" if frozen?
54
+ end
57
55
 
58
- def _check_must(key)
59
- if must?(key) && !assigned?(key)
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
- # @endgroup
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
- end; end
66
+ # @endgroup
67
+ end
68
+ end
@@ -1,19 +1,15 @@
1
- require 'forwardable'
2
- require 'keyvalidatable'
1
+ # frozen_string_literal: true
3
2
 
4
- class Striuct; module InstanceMethods
3
+ class Striuct
4
+ module InstanceMethods
5
+ extend Forwardable
5
6
 
6
- extend Forwardable
7
-
8
- # hide Forwardable's public/protected class_macro
9
- private_class_method(*Forwardable.instance_methods)
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
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group Safety
4
-
5
- # freezed, fixed familar members, all members passed any condition
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
- # @endgroup
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
- end; end
12
+ # @endgroup
13
+ end
14
+ end
@@ -1,54 +1,55 @@
1
- class Striuct; module InstanceMethods
2
-
3
- # @group Setter
4
-
5
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
6
- # @return value
7
- def []=(key, value)
8
- autonym = autonym_for_key key
9
- _set autonym, value
10
- rescue Validation::InvalidWritingError
11
- $!.set_backtrace([
12
- "#{$!.backtrace[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{autonym})]=': #{$!.message}",
13
- $!.backtrace[-1]
14
- ])
15
-
16
- raise
17
- end
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
- alias_method :assign, :[]=
20
+ alias_method :assign, :[]=
20
21
 
21
- private
22
+ private
22
23
 
23
- # @param [Symbol] autonym - MUST already converted to native autonym
24
- # @return value
25
- def _set(autonym, value)
26
- _check_frozen
27
- _check_locked autonym
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
- if with_adjuster? autonym
30
- begin
31
- value = instance_exec value, &adjuster_for(autonym)
32
- rescue Exception
33
- raise ::Validation::UnmanagebleError
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
- if with_safety_setter?(autonym) and !accept?(autonym, value)
38
- raise ::Validation::InvalidWritingError,
39
- "#{value.inspect} is deficient for #{autonym} in #{self.class}"
40
- end
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
- @db[autonym] = value
43
- rescue ::Validation::InvalidError
44
- unless /in \[\]=/ =~ caller[1].slice(/([^:]+)\z/)
45
- $!.backtrace.delete_if{|s|/#{Regexp.escape(File.dirname __FILE__)}/ =~ s}
46
- $!.backtrace.first.sub!(/([^:]+)\z/){"in `#{autonym}='"}
47
- end
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
- # @endgroup
50
+ raise
51
+ end
53
52
 
54
- end; end
53
+ # @endgroup
54
+ end
55
+ end
@@ -1,43 +1,45 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
2
 
3
- # @group To Strings
4
-
5
- # @return [String]
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
- s << " #{autonym}=#{value.inspect}#{suffix}"
16
- unless labels.empty?
17
- s << '('
18
- s << labels.join(', ')
19
- s << ')'
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
- # @return [String]
30
- def to_s
31
- "#<struct' #{self.class}".tap {|s|
32
- each_pair do |autonym, value|
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
- # @endgroup
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
- end; end
43
+ # @endgroup
44
+ end
45
+ end
@@ -1,35 +1,52 @@
1
- class Striuct; module InstanceMethods
2
-
3
- # @group Validation
4
-
5
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
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
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
- # @param [Symbol, String, #to_sym, Integer, #to_int] key - name / index
20
- # @param value - if no argument and use current assigned value
21
- # true if passed under any condition
22
- def sufficient?(key, value=self[key])
23
- accept? key, value
24
- end
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
- alias_method :valid?, :sufficient?
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
- # all members passed under any condition
29
- def strict?
30
- each_pair.all?{|autonym, value|sufficient? autonym, value}
31
- end
43
+ alias_method :valid?, :sufficient?
32
44
 
33
- # @endgroup
45
+ # all members passed under any condition
46
+ def strict?
47
+ each_pair.all? { |autonym, value| sufficient?(autonym, value) }
48
+ end
34
49
 
35
- end; end
50
+ # @endgroup
51
+ end
52
+ end
@@ -1,58 +1,60 @@
1
- class Striuct; module InstanceMethods
2
-
3
- # @group Behavior under Values
4
-
5
- # @param [Integer, #to_int, Range] _keys
6
- # @return [Array]
7
- def values_at(*_keys)
8
- [].tap {|r|
9
- _keys.each do |key|
10
- case key
11
- when ->v{v.respond_to? :to_int}
12
- r << fetch_by_index(key)
13
- when Range
14
- key.each do |idx|
15
- raise TypeError unless idx.respond_to? :to_int
16
-
17
- r << fetch_by_index(idx)
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
- end
23
- }
24
- end
25
+ }
26
+ end
25
27
 
26
- # @return [Array]
27
- # @raise [ArgumentError] if the keys contains an unmacthed
28
- # key and no block is given
29
- def fetch_values(*_keys, &block)
30
- _keys.map {|key|
31
- if has_key? key
32
- fetch_by_key(key)
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
- raise ArgumentError, "`#{key}' is not matched"
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
- # @return [self]
44
- def replace_values(*values)
45
- unless values.size <= size
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
- values.each_with_index do |value, index|
50
- _set autonym_for_index(index), value
55
+ self
51
56
  end
52
-
53
- self
54
- end
55
-
56
- # @endgroup
57
57
 
58
- end; end
58
+ # @endgroup
59
+ end
60
+ end
@@ -1,13 +1,9 @@
1
- require 'validation'
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) and /\A[A-Z]/ =~ first
19
- warn "no define constant first-arg(#{first}), the Struct behavior is not supported in Striuct"
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 block_given?
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 block_given?
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
- # @groupend
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 subclass
58
+ ret = super(subclass)
50
59
 
51
60
  subclass.class_eval {
52
61
  extend ClassMethods
53
62
  include Enumerable
54
- include Validation
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
@@ -1,7 +1,7 @@
1
- class Striuct
1
+ # frozen_string_literal: true
2
2
 
3
+ class Striuct
3
4
  # namespace for .to_struct_class, #to_struct
4
5
  module Structs
5
6
  end
6
-
7
- end
7
+ end
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/requirements'
16
+ require_relative 'striuct/bootstrap'