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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE.txt +21 -0
  3. data/README.md +19 -39
  4. data/lib/striuct.rb +3 -3
  5. data/lib/striuct/classmethods/README.md +2 -2
  6. data/lib/striuct/classmethods/adjustment.rb +15 -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 +47 -54
  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 +110 -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 +3 -1
  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/keyvalidatable.rb +8 -6
  33. data/lib/striuct/instancemethods/lock.rb +46 -44
  34. data/lib/striuct/instancemethods/object.rb +50 -48
  35. data/lib/striuct/instancemethods/requirements.rb +11 -9
  36. data/lib/striuct/instancemethods/safety.rb +11 -9
  37. data/lib/striuct/instancemethods/setter.rb +46 -45
  38. data/lib/striuct/instancemethods/to_s.rb +39 -37
  39. data/lib/striuct/instancemethods/validation.rb +31 -29
  40. data/lib/striuct/instancemethods/values.rb +50 -48
  41. data/lib/striuct/requirements.rb +3 -1
  42. data/lib/striuct/singleton_class.rb +12 -17
  43. data/lib/striuct/structs.rb +3 -3
  44. metadata +33 -178
  45. data/.gitignore +0 -35
  46. data/.travis.yml +0 -17
  47. data/.yardopts +0 -1
  48. data/Gemfile +0 -11
  49. data/MIT-LICENSE +0 -22
  50. data/Rakefile +0 -11
  51. data/benchmark/basics.rb +0 -56
  52. data/example/README.rb +0 -50
  53. data/example/example1.rb +0 -195
  54. data/example/example2.rb +0 -20
  55. data/example/see_trace.rb +0 -32
  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,16 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
  require 'keyvalidatable'
3
5
 
4
- class Striuct; module InstanceMethods
5
-
6
- extend Forwardable
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
- include KeyValidatable
10
+ # hide Forwardable's public/protected class_macro
11
+ private_class_method(*Forwardable.instance_methods)
12
12
 
13
- end; end
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
- 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 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
- 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 ::Validation::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 ::Validation::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 ::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
- # @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,37 @@
1
- class Striuct; module InstanceMethods
1
+ # frozen_string_literal: true
2
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
16
- end
17
- end
3
+ class Striuct
4
+ module InstanceMethods
5
+ # @group Validation
18
6
 
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
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
- alias_method :valid?, :sufficient?
14
+ begin
15
+ _valid?(condition_for(autonym), value)
16
+ rescue Exception
17
+ false
18
+ end
19
+ end
27
20
 
28
- # all members passed under any condition
29
- def strict?
30
- each_pair.all?{|autonym, value|sufficient? autonym, value}
31
- end
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
- # @endgroup
30
+ # all members passed under any condition
31
+ def strict?
32
+ each_pair.all? { |autonym, value| sufficient?(autonym, value) }
33
+ end
34
34
 
35
- end; end
35
+ # @endgroup
36
+ end
37
+ 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,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'validation'
2
4
  require_relative 'structs'
3
5
  require_relative 'classmethods/requirements'
4
6
  require_relative 'instancemethods/requirements'
5
- require_relative 'singleton_class'
7
+ require_relative 'singleton_class'
@@ -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) and /\A[A-Z]/ =~ first
19
- warn "no define constant first-arg(#{first}), the Struct behavior is not supported in Striuct"
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 block_given?
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 block_given?
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 subclass
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