striuct 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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