striuct 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +32 -0
  2. data/.travis.yml +6 -0
  3. data/Gemfile +12 -0
  4. data/History.rdoc +5 -0
  5. data/Manifest.txt +53 -25
  6. data/README.md +97 -0
  7. data/Rakefile +7 -21
  8. data/examples/README.rb +25 -0
  9. data/{example → examples}/example1.rb +1 -1
  10. data/{example → examples}/example2.rb +1 -1
  11. data/{example → examples}/see_trace.rb +4 -0
  12. data/lib/striuct/{containable/eigen → classmethods}/basic.rb +13 -5
  13. data/lib/striuct/classmethods/constants.rb +23 -0
  14. data/lib/striuct/{containable/eigen → classmethods}/constructor.rb +20 -14
  15. data/lib/striuct/{containable/eigen → classmethods}/handy.rb +19 -20
  16. data/lib/striuct/{containable/eigen → classmethods}/inner.rb +10 -32
  17. data/lib/striuct/{containable/eigen → classmethods}/macro.rb +37 -7
  18. data/lib/striuct/classmethods/requiremnets.rb +7 -0
  19. data/lib/striuct/{containable/eigen → classmethods}/safety.rb +6 -6
  20. data/lib/striuct/classmethods.rb +1 -0
  21. data/lib/striuct/{containable → instancemethods}/basic.rb +6 -6
  22. data/lib/striuct/{containable → instancemethods}/handy.rb +3 -3
  23. data/lib/striuct/{containable → instancemethods}/hashlike.rb +12 -6
  24. data/lib/striuct/{containable → instancemethods}/inner.rb +9 -8
  25. data/lib/striuct/instancemethods/requirements.rb +6 -0
  26. data/lib/striuct/{containable → instancemethods}/safety.rb +2 -2
  27. data/lib/striuct/instancemethods/singleton_class.rb +19 -0
  28. data/lib/striuct/instancemethods.rb +1 -0
  29. data/lib/striuct/requirements.rb +6 -0
  30. data/lib/striuct/singleton_class.rb +93 -0
  31. data/lib/striuct/specificcontainer.rb +17 -0
  32. data/lib/striuct/structs.rb +7 -0
  33. data/lib/striuct/version.rb +3 -2
  34. data/lib/striuct.rb +4 -9
  35. data/striuct.gemspec +24 -0
  36. data/test/{test_helper.rb → helper.rb} +3 -0
  37. data/test/test_striuct.rb +23 -1409
  38. data/test/test_striuct_define.rb +19 -0
  39. data/test/test_striuct_subclass_adjuster.rb +95 -0
  40. data/test/test_striuct_subclass_alias_member.rb +54 -0
  41. data/test/test_striuct_subclass_assign.rb +30 -0
  42. data/test/test_striuct_subclass_classlock.rb +36 -0
  43. data/test/test_striuct_subclass_classmethods.rb +87 -0
  44. data/test/test_striuct_subclass_cloning.rb +36 -0
  45. data/test/test_striuct_subclass_default_value.rb +129 -0
  46. data/test/test_striuct_subclass_for_pairs.rb +13 -0
  47. data/test/test_striuct_subclass_freeze.rb +19 -0
  48. data/test/test_striuct_subclass_functional_condition.rb +51 -0
  49. data/test/test_striuct_subclass_getter_validation.rb +33 -0
  50. data/test/test_striuct_subclass_hashlike.rb +153 -0
  51. data/test/test_striuct_subclass_inference.rb +51 -0
  52. data/test/test_striuct_subclass_inheritable.rb +58 -0
  53. data/test/test_striuct_subclass_instance.rb +289 -0
  54. data/test/test_striuct_subclass_lock.rb +40 -0
  55. data/test/test_striuct_subclass_safetynaming.rb +72 -0
  56. data/test/test_striuct_subclass_specific_conditions.rb +247 -0
  57. data/test/test_striuct_subclass_to_struct.rb +25 -0
  58. data/test/test_striuct_version.rb +9 -0
  59. metadata +106 -68
  60. data/.gemtest +0 -0
  61. data/README.rdoc +0 -63
  62. data/example/example.rb +0 -17
  63. data/lib/striuct/abstract.rb +0 -74
  64. data/lib/striuct/containable/classutil.rb +0 -22
  65. data/lib/striuct/containable/eigen.rb +0 -29
  66. data/lib/striuct/containable.rb +0 -38
  67. /data/{example/benchmarks.rb → benchmarks/basics.rb} +0 -0
  68. /data/{example → examples}/example.old.rdoc +0 -0
@@ -1,4 +1,6 @@
1
- class Striuct; module Containable; module Eigen
1
+ require 'keyvalidatable'
2
+
3
+ class Striuct; module ClassMethods
2
4
  # @group Macro for Definition
3
5
 
4
6
  private
@@ -14,6 +16,8 @@ class Striuct; module Containable; module Eigen
14
16
  end
15
17
 
16
18
  VALID_MEMBER_OPTIONS = [
19
+ :default,
20
+ :default_proc,
17
21
  :inference,
18
22
  :reader_validation,
19
23
  :getter_validation,
@@ -28,11 +32,22 @@ class Striuct; module Containable; module Eigen
28
32
  # @param [Symbol, String] name
29
33
  # @param [#===, Proc, Method, ANYTHING] condition
30
34
  # @param [Hash] options
35
+ # @option options [BasicObject] :default
36
+ # @option options [Proc] :default_proc
37
+ # @option options [Boolean] :inference
38
+ # @option options [Boolean] :reader_validation
39
+ # @option options [Boolean] :getter_validation
40
+ # @option options [Boolean] :writer_validation
41
+ # @option options [Boolean] :setter_validation
31
42
  # @return [nil]
32
43
  def add_member(name, condition=Validation::Condition::ANYTHING, options=DEFAULT_MEMBER_OPTIONS, &flavor)
33
44
  raise "already closed to add member in #{self}" if closed?
34
- options = DEFAULT_MEMBER_OPTIONS.merge options
35
- raise ArgumentError, 'invalid option parameter is' unless (options.keys - VALID_MEMBER_OPTIONS).empty?
45
+ options = DEFAULT_MEMBER_OPTIONS.merge(options).extend(KeyValidatable)
46
+ options.validate_keys let: VALID_MEMBER_OPTIONS
47
+ if options.has_key?(:default) and options.has_key?(:default_proc)
48
+ raise ArgumentError, 'It is not able to choose "default" with "default_proc" in options'
49
+ end
50
+
36
51
  name = keyable_for name
37
52
  raise ArgumentError, %Q!already exist name "#{name}"! if member? name
38
53
  _check_safety_naming name
@@ -43,6 +58,15 @@ class Striuct; module Containable; module Eigen
43
58
  @names << name
44
59
  __getter__! name
45
60
  __setter__! name, condition, &flavor
61
+
62
+ if options.has_key?(:default)
63
+ set_default_value name, options.fetch(:default)
64
+ end
65
+
66
+ if options.has_key?(:default_proc)
67
+ set_default_value name, &options.fetch(:default_proc)
68
+ end
69
+
46
70
  nil
47
71
  end
48
72
 
@@ -79,16 +103,18 @@ class Striuct; module Containable; module Eigen
79
103
  # @return [nil]
80
104
  def set_default_value(name, value=nil, &block)
81
105
  raise "already closed to modify member attributes in #{self}" if closed?
82
- name = originalkey_for(keyable_for name)
106
+ name = autonym_for(name)
83
107
  raise "already settled default value for #{name}" if has_default? name
84
108
 
85
109
  value = (
86
110
  if block_given?
87
111
  if value.nil?
88
- if (arity = block.arity) <= 2
112
+ arity = block.arity
113
+
114
+ if valid_default_proc? block
89
115
  SpecificContainer.new block
90
116
  else
91
- raise ArgumentError, "wrong number of block parameter #{arity} for 2"
117
+ raise ArgumentError, "wrong number of block parameter #{arity} for 0..2"
92
118
  end
93
119
  else
94
120
  raise ArgumentError, 'can not use value and block arguments'
@@ -104,6 +130,10 @@ class Striuct; module Containable; module Eigen
104
130
 
105
131
  alias_method :default, :set_default_value
106
132
 
133
+ def valid_default_proc?(_proc)
134
+ _proc.arity <= 2
135
+ end
136
+
107
137
  # @return [self]
108
138
  def close_member
109
139
  [@names, @flavors, @defaults, @aliases].each(&:freeze)
@@ -114,4 +144,4 @@ class Striuct; module Containable; module Eigen
114
144
  alias_method :close, :close_member
115
145
 
116
146
  # @endgroup
117
- end; end; end
147
+ end; end
@@ -0,0 +1,7 @@
1
+ require_relative 'constants'
2
+ require_relative 'inner'
3
+ require_relative 'basic'
4
+ require_relative 'constructor'
5
+ require_relative 'handy'
6
+ require_relative 'macro'
7
+ require_relative 'safety'
@@ -1,17 +1,17 @@
1
- class Striuct; module Containable; module Eigen
1
+ class Striuct; module ClassMethods
2
2
  # @group Struct+ Safety
3
3
 
4
4
  # @param [Symbol, String] name
5
5
  # inference checker is waiting yet
6
6
  def inference?(name)
7
- name = originalkey_for(keyable_for name)
7
+ name = autonym_for name
8
8
 
9
9
  @inferences.has_key? name
10
10
  end
11
11
 
12
12
  # @param [Symbol, String] name
13
13
  def has_condition?(name)
14
- name = originalkey_for(keyable_for name)
14
+ name = autonym_for name
15
15
 
16
16
  @conditions.has_key?(name)
17
17
  end
@@ -20,7 +20,7 @@ class Striuct; module Containable; module Eigen
20
20
 
21
21
  # @param [Symbol, String] name
22
22
  def safety_getter?(name)
23
- name = originalkey_for(keyable_for name)
23
+ name = autonym_for name
24
24
 
25
25
  @getter_validations.has_key?(name)
26
26
  end
@@ -29,7 +29,7 @@ class Striuct; module Containable; module Eigen
29
29
 
30
30
  # @param [Symbol, String] name
31
31
  def safety_setter?(name)
32
- name = originalkey_for(keyable_for name)
32
+ name = autonym_for name
33
33
 
34
34
  @setter_validations.has_key?(name)
35
35
  end
@@ -49,4 +49,4 @@ class Striuct; module Containable; module Eigen
49
49
  end
50
50
 
51
51
  # @endgroup
52
- end; end; end
52
+ end; end
@@ -0,0 +1 @@
1
+ require_relative 'classmethods/requiremnets'
@@ -1,4 +1,4 @@
1
- class Striuct; module Containable
1
+ class Striuct; module InstanceMethods
2
2
  # @group Basic
3
3
 
4
4
  def initialize(*values)
@@ -8,7 +8,7 @@ class Striuct; module Containable
8
8
 
9
9
  # see self.class.*args
10
10
  delegate_class_methods(
11
- :members, :keys, :names,
11
+ :members, :keys, :names, :autonyms, :all_members, :aliases,
12
12
  :has_member?, :member?, :has_key?, :key?,
13
13
  :length, :size
14
14
  )
@@ -64,10 +64,10 @@ class Striuct; module Containable
64
64
  true_name = nil
65
65
  __subscript__(key){|name|true_name = name; __set__ name, value}
66
66
  rescue Validation::InvalidWritingError
67
- $@ = [
68
- "#{$@[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{true_name})]=': #{$!.message}",
69
- $@[-1]
70
- ]
67
+ $!.set_backtrace([
68
+ "#{$!.backtrace[-1].sub(/[^:]+\z/){''}}in `[#{key.inspect}(#{true_name})]=': #{$!.message}",
69
+ $!.backtrace[-1]
70
+ ])
71
71
 
72
72
  raise
73
73
  end
@@ -1,4 +1,4 @@
1
- class Striuct; module Containable
1
+ class Striuct; module InstanceMethods
2
2
  # @group Struct + Handy
3
3
 
4
4
  # see self.class.*args
@@ -57,7 +57,7 @@ class Striuct; module Containable
57
57
 
58
58
  # @param [Symbol, String] name
59
59
  def assign?(name)
60
- name = originalkey_for(keyable_for name)
60
+ name = autonym_for name
61
61
 
62
62
  @db.has_key? name
63
63
  end
@@ -72,7 +72,7 @@ class Striuct; module Containable
72
72
 
73
73
  # @param [Symbol, String] name
74
74
  def default?(name)
75
- name = originalkey_for(keyable_for name)
75
+ name = autonym_for name
76
76
 
77
77
  default_for(name) == self[name]
78
78
  end
@@ -1,4 +1,4 @@
1
- class Striuct; module Containable
1
+ class Striuct; module InstanceMethods
2
2
  # @group HashLike
3
3
 
4
4
  # @return [Hash]
@@ -31,8 +31,9 @@ class Striuct; module Containable
31
31
 
32
32
  alias_method :value?, :has_value?
33
33
 
34
- # @yield [name, value]
35
34
  # keep truthy only (unassign falsy member)
35
+ # @yield [name, value]
36
+ # @yieldparam [Symbol] name
36
37
  # @see #each_pair
37
38
  # @return [Enumerator]
38
39
  # @yieldreturn [self]
@@ -54,6 +55,7 @@ class Striuct; module Containable
54
55
 
55
56
  # @see #select!
56
57
  # @yield [name, value]
58
+ # @yieldparam [Symbol] name
57
59
  # @return [Enumerator]
58
60
  def keep_if(&block)
59
61
  raise "can't modify frozen #{self.class}" if frozen?
@@ -65,6 +67,7 @@ class Striuct; module Containable
65
67
  # @see #select!
66
68
  # keep falsy only (unassign truthy member)
67
69
  # @yield [name, value]
70
+ # @yieldparam [Symbol] name
68
71
  # @return [Enumerator]
69
72
  def reject!
70
73
  raise "can't modify frozen #{self.class}" if frozen?
@@ -83,6 +86,7 @@ class Striuct; module Containable
83
86
 
84
87
  # @see #reject!
85
88
  # @yield [name, value]
89
+ # @yieldparam [Symbol] name
86
90
  # @return [Enumerator]
87
91
  def delete_if(&block)
88
92
  raise "can't modify frozen #{self.class}" if frozen?
@@ -93,9 +97,9 @@ class Striuct; module Containable
93
97
  end
94
98
 
95
99
  # @param [Symbol, String] name
96
- # @return [Array] [name, value]
100
+ # @return [Array] e.g [name, value]
97
101
  def assoc(name)
98
- name = originalkey_for(keyable_for name)
102
+ name = autonym_for name
99
103
 
100
104
  [name, self[name]]
101
105
  end
@@ -113,7 +117,8 @@ class Striuct; module Containable
113
117
 
114
118
  # @see #select!
115
119
  # @yield [name, value]
116
- # @return [Subclass]
120
+ # @yieldparam [Symbol] name
121
+ # @return [Striuct]
117
122
  def select(&block)
118
123
  return to_enum(__method__) unless block_given?
119
124
 
@@ -122,7 +127,8 @@ class Striuct; module Containable
122
127
 
123
128
  # @see #reject!
124
129
  # @yield [name, value]
125
- # @return [Subclass]
130
+ # @yieldparam [Symbol] name
131
+ # @return [Striuct]
126
132
  def reject(&block)
127
133
  return to_enum(__method__) unless block_given?
128
134
 
@@ -1,11 +1,12 @@
1
- class Striuct; module Containable
1
+ class Striuct; module InstanceMethods
2
+
2
3
  private
3
4
 
4
5
  # @group Use Only Inner
5
6
 
6
7
  # see self.class.*args
7
8
  delegate_class_methods(
8
- :keyable_for, :flavor_for, :condition_for, :originalkey_for
9
+ :keyable_for, :flavor_for, :condition_for, :autonym_for
9
10
  )
10
11
 
11
12
  def initialize_copy(original)
@@ -13,7 +14,7 @@ class Striuct; module Containable
13
14
  end
14
15
 
15
16
  def __get__(name)
16
- name = originalkey_for(keyable_for name)
17
+ name = autonym_for name
17
18
  value = @db[name]
18
19
 
19
20
  if safety_getter?(name) and !accept?(name, value)
@@ -26,7 +27,7 @@ class Striuct; module Containable
26
27
 
27
28
  def __set__(name, value)
28
29
  raise "can't modify frozen #{self.class}" if frozen?
29
- name = originalkey_for(keyable_for name)
30
+ name = autonym_for name
30
31
  raise "can't modify locked member #{name}" if lock? name
31
32
 
32
33
  if has_flavor? name
@@ -49,9 +50,8 @@ class Striuct; module Containable
49
50
  @db[name] = value
50
51
  rescue ::Validation::InvalidError
51
52
  unless /in \[\]=/ =~ caller[1].slice(/([^:]+)\z/)
52
- $@.delete_if{|s|/#{Regexp.escape(File.dirname __FILE__)}/ =~ s}
53
- $@.first.sub!(/([^:]+)\z/){"in `#{name}='"}
54
- $@ << $@.last
53
+ $!.backtrace.delete_if{|s|/#{Regexp.escape(File.dirname __FILE__)}/ =~ s}
54
+ $!.backtrace.first.sub!(/([^:]+)\z/){"in `#{name}='"}
55
55
  end
56
56
 
57
57
  raise
@@ -62,7 +62,7 @@ class Striuct; module Containable
62
62
  when Symbol, String
63
63
  name = keyable_for key
64
64
  if member? name
65
- yield originalkey_for(name)
65
+ yield autonym_for(name)
66
66
  else
67
67
  raise NameError
68
68
  end
@@ -117,4 +117,5 @@ class Striuct; module Containable
117
117
  end
118
118
 
119
119
  # @endgroup
120
+
120
121
  end; end
@@ -0,0 +1,6 @@
1
+ require_relative 'singleton_class'
2
+ require_relative 'inner'
3
+ require_relative 'basic'
4
+ require_relative 'handy'
5
+ require_relative 'hashlike'
6
+ require_relative 'safety'
@@ -1,4 +1,4 @@
1
- class Striuct; module Containable
1
+ class Striuct; module InstanceMethods
2
2
  # @group Struct+ Safety
3
3
 
4
4
  # see self.class.*args
@@ -9,7 +9,7 @@ class Striuct; module Containable
9
9
  # @param [Object] value - no argument and use own
10
10
  # passed under any condition
11
11
  def sufficient?(name, value=self[name])
12
- name = originalkey_for(keyable_for name)
12
+ name = autonym_for name
13
13
  return true unless restrict? name
14
14
 
15
15
  _valid? condition_for(name), value
@@ -0,0 +1,19 @@
1
+ class Striuct; module InstanceMethods
2
+
3
+ class << self
4
+
5
+ private
6
+
7
+ def delegate_class_method(name)
8
+ define_method name do |*args, &block|
9
+ self.class.__send__ name, *args, &block
10
+ end
11
+ end
12
+
13
+ def delegate_class_methods(name, *names)
14
+ [name, *names].each{|_name|delegate_class_method _name}
15
+ end
16
+
17
+ end
18
+
19
+ end; end
@@ -0,0 +1 @@
1
+ require_relative 'instancemethods/requirements'
@@ -0,0 +1,6 @@
1
+ require_relative 'version'
2
+ require_relative 'structs'
3
+ require_relative 'specificcontainer'
4
+ require_relative 'classmethods'
5
+ require_relative 'instancemethods'
6
+ require_relative 'singleton_class'
@@ -0,0 +1,93 @@
1
+ require_relative 'instancemethods'
2
+
3
+ class Striuct
4
+
5
+ class << self
6
+
7
+ # @group Constructor
8
+
9
+ alias_method :new_instance, :new
10
+ private :new_instance
11
+
12
+ # @param [Symbol, String] *names
13
+ # @return [Class]
14
+ def new(*names, &block)
15
+ # warning for Ruby's Struct.new user
16
+ first = names.first
17
+ if first.instance_of?(String) and /\A[A-Z]/ =~ first
18
+ warn "no define constant #{first}"
19
+ end
20
+
21
+ Class.new self do
22
+ names.each do |name|
23
+ member name
24
+ end
25
+
26
+ class_eval(&block) if block_given?
27
+ end
28
+ end
29
+
30
+ # @yieldreturn [Class] (see Striuct.new) - reject floating class
31
+ # @return [void]
32
+ def define(&block)
33
+ raise ArgumentError, 'must with block' unless block_given?
34
+
35
+ new(&block).tap do |subclass|
36
+ subclass.instance_eval do
37
+ raise 'not yet finished' if members.empty?
38
+ close
39
+ end
40
+ end
41
+ end
42
+
43
+ # @groupend
44
+
45
+ private
46
+
47
+ alias_method :original_inherited, :inherited
48
+
49
+ def inherited(subclass)
50
+ attributes = (
51
+ if equal? ::Striuct
52
+ [[], {}, {}, {}, {}, {}, {}, {}, :prevent]
53
+ else
54
+ [
55
+ *[
56
+ @names, @conditions, @flavors, @defaults,
57
+ @inferences, @aliases, @setter_validations,
58
+ @getter_validations
59
+ ].map(&:dup), @protect_level
60
+ ]
61
+ end
62
+ )
63
+
64
+ eigen = self
65
+
66
+ subclass.class_eval do
67
+ original_inherited subclass
68
+
69
+ if ::Striuct.equal? eigen
70
+ extend ClassMethods
71
+ include Enumerable
72
+ include InstanceMethods
73
+ end
74
+
75
+ @names, @conditions, @flavors, @defaults,
76
+ @inferences, @aliases, @setter_validations,
77
+ @getter_validations, @protect_level = *attributes
78
+
79
+ singleton_class.instance_eval do
80
+ define_method :initialize_copy do |original|
81
+ @names, @flavors, @defaults, @aliases,
82
+ @setter_validations, @getter_validations =
83
+ *[@names, @flavors, @defaults, @aliases,
84
+ @setter_validations, @getter_validations].map(&:dup)
85
+ @conditions, @inferences = @conditions.dup, @inferences.dup
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -0,0 +1,17 @@
1
+ class Striuct
2
+
3
+ class SpecificContainer
4
+
5
+ attr_reader :value
6
+
7
+ def initialize(value)
8
+ @value = value
9
+ end
10
+
11
+ end
12
+
13
+ if respond_to? :private_constant
14
+ private_constant :SpecificContainer
15
+ end
16
+
17
+ end
@@ -0,0 +1,7 @@
1
+ class Striuct
2
+
3
+ # namespace for .to_struct_class, #to_struct
4
+ module Structs
5
+ end
6
+
7
+ end
@@ -1,4 +1,5 @@
1
1
  class Striuct
2
- VERSION = '0.3.0'.freeze
3
- Version = VERSION
2
+
3
+ VERSION = '0.3.1'.freeze
4
+
4
5
  end
data/lib/striuct.rb CHANGED
@@ -1,18 +1,13 @@
1
- # Copyright (C) 2011 Kenichi Kamiya
2
- # Striuct
3
- # Provides a Struct++ class.
1
+ # striuct - Provides a Struct++ class.
2
+ # Copyright (c) 2011 Kenichi Kamiya
4
3
 
5
4
  require 'validation'
6
5
 
7
- # @author Kenichi Kamiya
8
6
  # @abstract
9
7
  class Striuct
8
+
10
9
  include Validation
11
10
 
12
- # namespace for .to_struct_class, #to_struct
13
- module Structs
14
- end
15
11
  end
16
12
 
17
- require_relative 'striuct/version'
18
- require_relative 'striuct/abstract'
13
+ require_relative 'striuct/requirements'
data/striuct.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # I don't know why dose occur errors below.
2
+ # require_relative 'lib/striuct/version'
3
+ require File.expand_path('../lib/striuct/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.authors = ['Kenichi Kamiya']
7
+ gem.email = ['kachick1+ruby@gmail.com']
8
+ gem.summary = %q{Struct++}
9
+ gem.description = %q{validatable, inheritable, And more Struct++ features :)}
10
+ gem.homepage = 'https://github.com/kachick/striuct'
11
+
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = 'striuct'
16
+ gem.require_paths = ['lib']
17
+ gem.version = Striuct::VERSION.dup # dup for https://github.com/rubygems/rubygems/commit/48f1d869510dcd325d6566df7d0147a086905380#-P0
18
+
19
+ gem.required_ruby_version = '>=1.9.2'
20
+ gem.add_runtime_dependency 'validation', '~>0.0.3.1'
21
+ gem.add_runtime_dependency 'keyvalidatable', '~>0.0.2'
22
+ gem.add_development_dependency 'yard', '>=0.8.2.1'
23
+ end
24
+
@@ -1,2 +1,5 @@
1
1
  require 'test/unit'
2
+
3
+ $VERBOSE = true
4
+
2
5
  require_relative '../lib/striuct'