attributor 5.0.1 → 5.0.2
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/CHANGELOG.md +7 -0
 - data/lib/attributor.rb +2 -0
 - data/lib/attributor/dumpable.rb +11 -0
 - data/lib/attributor/hash_dsl_compiler.rb +9 -8
 - data/lib/attributor/types/collection.rb +1 -0
 - data/lib/attributor/types/hash.rb +17 -10
 - data/lib/attributor/types/model.rb +13 -6
 - data/lib/attributor/version.rb +1 -1
 - data/spec/dumpable_spec.rb +30 -0
 - data/spec/hash_dsl_compiler_spec.rb +6 -6
 - data/spec/types/bigdecimal_spec.rb +7 -3
 - data/spec/types/boolean_spec.rb +4 -0
 - data/spec/types/class_spec.rb +4 -0
 - data/spec/types/collection_spec.rb +4 -0
 - data/spec/types/date_spec.rb +9 -5
 - data/spec/types/date_time_spec.rb +9 -5
 - data/spec/types/float_spec.rb +4 -0
 - data/spec/types/hash_spec.rb +4 -0
 - data/spec/types/integer_spec.rb +4 -0
 - data/spec/types/regexp_spec.rb +4 -0
 - data/spec/types/string_spec.rb +4 -0
 - data/spec/types/time_spec.rb +9 -5
 - data/spec/types/uri_spec.rb +4 -0
 - metadata +6 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 1b19e77ce8b1772454840886e1a1bda5bc248c63
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 32f9bca389ef6c112a7d8edf81cf8adc001ca2fd
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: dc0fadeddc769124b2b60e717c48d435d88caf15cb6779b0784840c0bdcbbb4efce092fe4648dc8fd14a7b18958c0142dc8e6b52318b44f0b80b0c6f516e4a92
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6bfe838ad696d85db73ee1893a1d4f7739958180cb4f0f1a35ca5e8ff5ebb1a11bdde7bd10c23645623390cde56a6b95e72321ec819579068bac7b56037281c6
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -2,6 +2,13 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            ## next
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
            ## 5.0.2
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            * Introduce the `Dumpable` (empty) module as an interface to indicate that instances of types that include it
         
     | 
| 
      
 8 
     | 
    
         
            +
            will respond to the `.dump` method, as a way to convert their internal substructure to primitive Ruby objects.    * Currently the only two directly dumpable types are Collection and Hash (with the caveat that there are several others that derive from them..i.e., CSV, Model, etc...)
         
     | 
| 
      
 9 
     | 
    
         
            +
              * The rest of types have `native_types` that are already Ruby primitive Objects.
         
     | 
| 
      
 10 
     | 
    
         
            +
            * Fixed Hash and Model requirements to treat nil values as missing keys (to be compatible with the `required: true` option on an attribute).
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       5 
12 
     | 
    
         
             
            ## 5.0.1
         
     | 
| 
       6 
13 
     | 
    
         | 
| 
       7 
14 
     | 
    
         
             
            * Fix bug that made Struct/Models skip validation of requirements using the `requires` DSL
         
     | 
    
        data/lib/attributor.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,11 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Attributor
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Dumpable
         
     | 
| 
      
 3 
     | 
    
         
            +
                # Interface denoting that instances of such type respond to .dump as a way to properly
         
     | 
| 
      
 4 
     | 
    
         
            +
                # serialize its contents into primitive ruby objects.
         
     | 
| 
      
 5 
     | 
    
         
            +
                # This typically corresponds to non-trivial types that have some sort of substructure
         
     | 
| 
      
 6 
     | 
    
         
            +
                def dump
         
     | 
| 
      
 7 
     | 
    
         
            +
                  raise NotImplementedError, 'Dumpable requires the implementation of #dump'
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -25,40 +25,41 @@ module Attributor 
     | 
|
| 
       25 
25 
     | 
    
         
             
                      @number = spec[type]
         
     | 
| 
       26 
26 
     | 
    
         
             
                    end
         
     | 
| 
       27 
27 
     | 
    
         
             
                  end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  def of(*args)
         
     | 
| 
       29 
30 
     | 
    
         
             
                    @attr_names = args
         
     | 
| 
       30 
31 
     | 
    
         
             
                    self
         
     | 
| 
       31 
32 
     | 
    
         
             
                  end
         
     | 
| 
       32 
33 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                  def validate( 
     | 
| 
      
 34 
     | 
    
         
            +
                  def validate(keys,context=Attributor::DEFAULT_ROOT_CONTEXT,_attribute=nil)
         
     | 
| 
       34 
35 
     | 
    
         
             
                    result = []
         
     | 
| 
       35 
36 
     | 
    
         
             
                    case type
         
     | 
| 
       36 
37 
     | 
    
         
             
                    when :all
         
     | 
| 
       37 
     | 
    
         
            -
                      rest = attr_names -  
     | 
| 
      
 38 
     | 
    
         
            +
                      rest = attr_names - keys
         
     | 
| 
       38 
39 
     | 
    
         
             
                      unless rest.empty?
         
     | 
| 
       39 
40 
     | 
    
         
             
                        rest.each do |attr|
         
     | 
| 
       40 
41 
     | 
    
         
             
                          result.push "Key #{attr} is required for #{Attributor.humanize_context(context)}."
         
     | 
| 
       41 
42 
     | 
    
         
             
                        end
         
     | 
| 
       42 
43 
     | 
    
         
             
                      end
         
     | 
| 
       43 
44 
     | 
    
         
             
                    when :exactly
         
     | 
| 
       44 
     | 
    
         
            -
                      included = attr_names &  
     | 
| 
      
 45 
     | 
    
         
            +
                      included = attr_names & keys
         
     | 
| 
       45 
46 
     | 
    
         
             
                      unless included.size ==  number
         
     | 
| 
       46 
47 
     | 
    
         
             
                        result.push "Exactly #{number} of the following keys #{attr_names} are required for #{Attributor.humanize_context(context)}. Found #{included.size} instead: #{included.inspect}"
         
     | 
| 
       47 
48 
     | 
    
         
             
                      end
         
     | 
| 
       48 
49 
     | 
    
         
             
                    when :at_most
         
     | 
| 
       49 
     | 
    
         
            -
                      rest = attr_names &  
     | 
| 
      
 50 
     | 
    
         
            +
                      rest = attr_names & keys
         
     | 
| 
       50 
51 
     | 
    
         
             
                      if rest.size > number
         
     | 
| 
       51 
52 
     | 
    
         
             
                        found = rest.empty? ? "none" : rest.inspect
         
     | 
| 
       52 
53 
     | 
    
         
             
                        result.push "At most #{number} keys out of #{attr_names} can be passed in for #{Attributor.humanize_context(context)}. Found #{found}"
         
     | 
| 
       53 
54 
     | 
    
         
             
                      end
         
     | 
| 
       54 
55 
     | 
    
         
             
                    when :at_least
         
     | 
| 
       55 
     | 
    
         
            -
                      rest = attr_names &  
     | 
| 
      
 56 
     | 
    
         
            +
                      rest = attr_names & keys
         
     | 
| 
       56 
57 
     | 
    
         
             
                      if rest.size < number
         
     | 
| 
       57 
58 
     | 
    
         
             
                        found = rest.empty? ? "none" : rest.inspect
         
     | 
| 
       58 
59 
     | 
    
         
             
                        result.push "At least #{number} keys out of #{attr_names} are required to be passed in for #{Attributor.humanize_context(context)}. Found #{found}"
         
     | 
| 
       59 
60 
     | 
    
         
             
                      end
         
     | 
| 
       60 
61 
     | 
    
         
             
                    when :exclusive
         
     | 
| 
       61 
     | 
    
         
            -
                      intersection = attr_names &  
     | 
| 
      
 62 
     | 
    
         
            +
                      intersection = attr_names & keys
         
     | 
| 
       62 
63 
     | 
    
         
             
                      if intersection.size > 1
         
     | 
| 
       63 
64 
     | 
    
         
             
                        result.push "keys #{intersection.inspect} are mutually exclusive for #{Attributor.humanize_context(context)}."
         
     | 
| 
       64 
65 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -138,4 +139,4 @@ module Attributor 
     | 
|
| 
       138 
139 
     | 
    
         | 
| 
       139 
140 
     | 
    
         | 
| 
       140 
141 
     | 
    
         
             
              end
         
     | 
| 
       141 
     | 
    
         
            -
            end
         
     | 
| 
      
 142 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -22,6 +22,7 @@ module Attributor 
     | 
|
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                include Container
         
     | 
| 
       24 
24 
     | 
    
         
             
                include Enumerable
         
     | 
| 
      
 25 
     | 
    
         
            +
                include Dumpable
         
     | 
| 
       25 
26 
     | 
    
         | 
| 
       26 
27 
     | 
    
         
             
                class << self
         
     | 
| 
       27 
28 
     | 
    
         
             
                  attr_reader :key_type, :value_type, :options
         
     | 
| 
         @@ -556,6 +557,7 @@ module Attributor 
     | 
|
| 
       556 
557 
     | 
    
         | 
| 
       557 
558 
     | 
    
         
             
                def validate(context=Attributor::DEFAULT_ROOT_CONTEXT)
         
     | 
| 
       558 
559 
     | 
    
         
             
                  context = [context] if context.is_a? ::String
         
     | 
| 
      
 560 
     | 
    
         
            +
                  errors = []
         
     | 
| 
       559 
561 
     | 
    
         | 
| 
       560 
562 
     | 
    
         
             
                  if self.class.keys.any?
         
     | 
| 
       561 
563 
     | 
    
         
             
                    extra_keys = @contents.keys - self.class.keys.keys
         
     | 
| 
         @@ -565,36 +567,41 @@ module Attributor 
     | 
|
| 
       565 
567 
     | 
    
         
             
                      end
         
     | 
| 
       566 
568 
     | 
    
         
             
                    end
         
     | 
| 
       567 
569 
     | 
    
         | 
| 
       568 
     | 
    
         
            -
                     
     | 
| 
      
 570 
     | 
    
         
            +
                    keys_with_values = Array.new
         
     | 
| 
      
 571 
     | 
    
         
            +
             
     | 
| 
      
 572 
     | 
    
         
            +
                    self.class.keys.each do |key, attribute|
         
     | 
| 
       569 
573 
     | 
    
         
             
                      sub_context = self.class.generate_subcontext(context,key)
         
     | 
| 
       570 
574 
     | 
    
         | 
| 
       571 
575 
     | 
    
         
             
                      value = @contents[key]
         
     | 
| 
      
 576 
     | 
    
         
            +
                      unless value.nil?
         
     | 
| 
      
 577 
     | 
    
         
            +
                        keys_with_values << key
         
     | 
| 
      
 578 
     | 
    
         
            +
                      end
         
     | 
| 
       572 
579 
     | 
    
         | 
| 
       573 
580 
     | 
    
         
             
                      if value.respond_to?(:validating) # really, it's a thing with sub-attributes
         
     | 
| 
       574 
581 
     | 
    
         
             
                        next if value.validating
         
     | 
| 
       575 
582 
     | 
    
         
             
                      end
         
     | 
| 
       576 
583 
     | 
    
         | 
| 
       577 
     | 
    
         
            -
                      errors.push 
     | 
| 
      
 584 
     | 
    
         
            +
                      errors.push(*attribute.validate(value, sub_context))
         
     | 
| 
      
 585 
     | 
    
         
            +
                    end
         
     | 
| 
      
 586 
     | 
    
         
            +
                    self.class.requirements.each do |req|
         
     | 
| 
      
 587 
     | 
    
         
            +
                      validation_errors = req.validate(keys_with_values, context)
         
     | 
| 
      
 588 
     | 
    
         
            +
                      errors.push(*validation_errors) unless validation_errors.empty?
         
     | 
| 
       578 
589 
     | 
    
         
             
                    end
         
     | 
| 
       579 
590 
     | 
    
         
             
                  else
         
     | 
| 
       580 
     | 
    
         
            -
                     
     | 
| 
      
 591 
     | 
    
         
            +
                    @contents.each do |key, value|
         
     | 
| 
       581 
592 
     | 
    
         
             
                      # FIXME: the sub contexts and error messages don't really make sense here
         
     | 
| 
       582 
593 
     | 
    
         
             
                      unless key_type == Attributor::Object
         
     | 
| 
       583 
594 
     | 
    
         
             
                        sub_context = context + ["key(#{key.inspect})"]
         
     | 
| 
       584 
     | 
    
         
            -
                        errors.push 
     | 
| 
      
 595 
     | 
    
         
            +
                        errors.push(*key_attribute.validate(key, sub_context))
         
     | 
| 
       585 
596 
     | 
    
         
             
                      end
         
     | 
| 
       586 
597 
     | 
    
         | 
| 
       587 
598 
     | 
    
         
             
                      unless value_type == Attributor::Object
         
     | 
| 
       588 
599 
     | 
    
         
             
                        sub_context = context + ["value(#{value.inspect})"]
         
     | 
| 
       589 
     | 
    
         
            -
                        errors.push 
     | 
| 
      
 600 
     | 
    
         
            +
                        errors.push(*value_attribute.validate(value, sub_context))
         
     | 
| 
       590 
601 
     | 
    
         
             
                      end
         
     | 
| 
       591 
602 
     | 
    
         
             
                    end
         
     | 
| 
       592 
603 
     | 
    
         
             
                  end
         
     | 
| 
       593 
     | 
    
         
            -
                   
     | 
| 
       594 
     | 
    
         
            -
                    validation_errors = req.validate( @contents , context)
         
     | 
| 
       595 
     | 
    
         
            -
                    errors.push *validation_errors unless validation_errors.empty?
         
     | 
| 
       596 
     | 
    
         
            -
                  end
         
     | 
| 
       597 
     | 
    
         
            -
                  ret
         
     | 
| 
      
 604 
     | 
    
         
            +
                  errors
         
     | 
| 
       598 
605 
     | 
    
         
             
                end
         
     | 
| 
       599 
606 
     | 
    
         | 
| 
       600 
607 
     | 
    
         | 
| 
         @@ -130,22 +130,29 @@ module Attributor 
     | 
|
| 
       130 
130 
     | 
    
         
             
                  @validating = true
         
     | 
| 
       131 
131 
     | 
    
         | 
| 
       132 
132 
     | 
    
         
             
                  context = [context] if context.is_a? ::String
         
     | 
| 
      
 133 
     | 
    
         
            +
                  keys_with_values = []
         
     | 
| 
      
 134 
     | 
    
         
            +
                  errors = []
         
     | 
| 
       133 
135 
     | 
    
         | 
| 
       134 
     | 
    
         
            -
                   
     | 
| 
      
 136 
     | 
    
         
            +
                  self.class.attributes.each do |sub_attribute_name, sub_attribute|
         
     | 
| 
       135 
137 
     | 
    
         
             
                    sub_context = self.class.generate_subcontext(context,sub_attribute_name)
         
     | 
| 
       136 
138 
     | 
    
         | 
| 
       137 
139 
     | 
    
         
             
                    value = self.__send__(sub_attribute_name)
         
     | 
| 
      
 140 
     | 
    
         
            +
                    unless value.nil?
         
     | 
| 
      
 141 
     | 
    
         
            +
                      keys_with_values << sub_attribute_name
         
     | 
| 
      
 142 
     | 
    
         
            +
                    end
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
       138 
144 
     | 
    
         
             
                    if value.respond_to?(:validating) # really, it's a thing with sub-attributes
         
     | 
| 
       139 
145 
     | 
    
         
             
                      next if value.validating
         
     | 
| 
       140 
146 
     | 
    
         
             
                    end
         
     | 
| 
       141 
147 
     | 
    
         | 
| 
       142 
     | 
    
         
            -
                    errors.push 
     | 
| 
      
 148 
     | 
    
         
            +
                    errors.push(*sub_attribute.validate(value, sub_context))
         
     | 
| 
       143 
149 
     | 
    
         
             
                  end
         
     | 
| 
       144 
     | 
    
         
            -
                  self.class.requirements. 
     | 
| 
       145 
     | 
    
         
            -
                    validation_errors = req.validate( 
     | 
| 
       146 
     | 
    
         
            -
                    errors.push 
     | 
| 
      
 150 
     | 
    
         
            +
                  self.class.requirements.each do |req|
         
     | 
| 
      
 151 
     | 
    
         
            +
                    validation_errors = req.validate(keys_with_values, context)
         
     | 
| 
      
 152 
     | 
    
         
            +
                    errors.push(*validation_errors) unless validation_errors.empty?
         
     | 
| 
       147 
153 
     | 
    
         
             
                  end
         
     | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
                  errors
         
     | 
| 
       149 
156 
     | 
    
         
             
                ensure
         
     | 
| 
       150 
157 
     | 
    
         
             
                  @validating = false
         
     | 
| 
       151 
158 
     | 
    
         
             
                end
         
     | 
    
        data/lib/attributor/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.join(File.dirname(__FILE__), 'spec_helper.rb')
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe 'Dumpable' do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              context 'for classes forgetting to implement #dump' do
         
     | 
| 
      
 6 
     | 
    
         
            +
                let(:type) {
         
     | 
| 
      
 7 
     | 
    
         
            +
                  Class.new do
         
     | 
| 
      
 8 
     | 
    
         
            +
                    include Attributor::Dumpable
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
                 }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                it 'gets an exception' do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  expect{ type.new.dump }.to raise_exception(NotImplementedError)
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              context 'for classes properly implementing #dump' do
         
     | 
| 
      
 18 
     | 
    
         
            +
                let(:type) {
         
     | 
| 
      
 19 
     | 
    
         
            +
                  Class.new do
         
     | 
| 
      
 20 
     | 
    
         
            +
                    include Attributor::Dumpable
         
     | 
| 
      
 21 
     | 
    
         
            +
                    def dump
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                 }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                it 'do not get the base exception' do
         
     | 
| 
      
 27 
     | 
    
         
            +
                  expect{ type.new.dump }.to_not raise_exception
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -116,31 +116,31 @@ describe Attributor::HashDSLCompiler do 
     | 
|
| 
       116 
116 
     | 
    
         | 
| 
       117 
117 
     | 
    
         
             
                  context 'for :all' do
         
     | 
| 
       118 
118 
     | 
    
         
             
                    let(:arguments){ { all: [:one, :two, :three] } }
         
     | 
| 
       119 
     | 
    
         
            -
                    let(:value){  
     | 
| 
      
 119 
     | 
    
         
            +
                    let(:value){ [:one] }
         
     | 
| 
       120 
120 
     | 
    
         
             
                    let(:validation_error){ ["Key two is required for $.", "Key three is required for $."] }
         
     | 
| 
       121 
121 
     | 
    
         
             
                    it { subject.should include(*validation_error) }
         
     | 
| 
       122 
122 
     | 
    
         
             
                  end
         
     | 
| 
       123 
123 
     | 
    
         
             
                  context 'for :exactly' do
         
     | 
| 
       124 
124 
     | 
    
         
             
                    let(:requirement) { req_class.new(exactly: 1).of(:one,:two) }
         
     | 
| 
       125 
     | 
    
         
            -
                    let(:value){  
     | 
| 
      
 125 
     | 
    
         
            +
                    let(:value){ [:one, :two] }
         
     | 
| 
       126 
126 
     | 
    
         
             
                    let(:validation_error){ "Exactly 1 of the following keys [:one, :two] are required for $. Found 2 instead: [:one, :two]" }
         
     | 
| 
       127 
127 
     | 
    
         
             
                    it { subject.should include(validation_error) }
         
     | 
| 
       128 
128 
     | 
    
         
             
                  end
         
     | 
| 
       129 
129 
     | 
    
         
             
                  context 'for :at_least' do
         
     | 
| 
       130 
130 
     | 
    
         
             
                    let(:requirement) { req_class.new(at_least: 2).of(:one,:two,:three) }
         
     | 
| 
       131 
     | 
    
         
            -
                    let(:value){  
     | 
| 
      
 131 
     | 
    
         
            +
                    let(:value){ [:one] }
         
     | 
| 
       132 
132 
     | 
    
         
             
                    let(:validation_error){ "At least 2 keys out of [:one, :two, :three] are required to be passed in for $. Found [:one]" }
         
     | 
| 
       133 
133 
     | 
    
         
             
                    it { subject.should include(validation_error) }
         
     | 
| 
       134 
134 
     | 
    
         
             
                  end
         
     | 
| 
       135 
135 
     | 
    
         
             
                  context 'for :at_most' do
         
     | 
| 
       136 
136 
     | 
    
         
             
                    let(:requirement) { req_class.new(at_most: 1).of(:one,:two,:three) }
         
     | 
| 
       137 
     | 
    
         
            -
                    let(:value){  
     | 
| 
      
 137 
     | 
    
         
            +
                    let(:value){ [:one, :two] }
         
     | 
| 
       138 
138 
     | 
    
         
             
                    let(:validation_error){ "At most 1 keys out of [:one, :two, :three] can be passed in for $. Found [:one, :two]" }
         
     | 
| 
       139 
139 
     | 
    
         
             
                    it { subject.should include(validation_error) }
         
     | 
| 
       140 
140 
     | 
    
         
             
                  end
         
     | 
| 
       141 
141 
     | 
    
         
             
                  context 'for :exclusive' do
         
     | 
| 
       142 
142 
     | 
    
         
             
                    let(:arguments){ { exclusive: [:one, :two] } }
         
     | 
| 
       143 
     | 
    
         
            -
                    let(:value){  
     | 
| 
      
 143 
     | 
    
         
            +
                    let(:value){ [:one, :two] }
         
     | 
| 
       144 
144 
     | 
    
         
             
                    let(:validation_error){ "keys [:one, :two] are mutually exclusive for $." }
         
     | 
| 
       145 
145 
     | 
    
         
             
                    it { subject.should include(validation_error) }
         
     | 
| 
       146 
146 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -174,4 +174,4 @@ describe Attributor::HashDSLCompiler do 
     | 
|
| 
       174 
174 
     | 
    
         
             
                  end
         
     | 
| 
       175 
175 
     | 
    
         
             
                end
         
     | 
| 
       176 
176 
     | 
    
         
             
              end
         
     | 
| 
       177 
     | 
    
         
            -
            end
         
     | 
| 
      
 177 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -3,13 +3,17 @@ require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb') 
     | 
|
| 
       3 
3 
     | 
    
         
             
            describe Attributor::BigDecimal do
         
     | 
| 
       4 
4 
     | 
    
         
             
              subject(:type) { Attributor::BigDecimal }
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
      
 6 
     | 
    
         
            +
              it 'it is not Dumpable' do
         
     | 
| 
      
 7 
     | 
    
         
            +
                type.new.is_a?(Attributor::Dumpable).should_not be(true)
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       6 
10 
     | 
    
         
             
              context '.native_type' do
         
     | 
| 
       7 
11 
     | 
    
         
             
                its(:native_type) { should be(::BigDecimal) }
         
     | 
| 
       8 
12 
     | 
    
         
             
              end
         
     | 
| 
       9 
13 
     | 
    
         | 
| 
       10 
14 
     | 
    
         
             
              context '.example' do
         
     | 
| 
       11 
15 
     | 
    
         
             
                its(:example) { should be_a(::BigDecimal) }
         
     | 
| 
       12 
     | 
    
         
            -
                it do 
     | 
| 
      
 16 
     | 
    
         
            +
                it do
         
     | 
| 
       13 
17 
     | 
    
         
             
                  ex = type.example
         
     | 
| 
       14 
18 
     | 
    
         
             
                end
         
     | 
| 
       15 
19 
     | 
    
         
             
              end
         
     | 
| 
         @@ -19,7 +23,7 @@ describe Attributor::BigDecimal do 
     | 
|
| 
       19 
23 
     | 
    
         
             
                it 'returns nil for nil' do
         
     | 
| 
       20 
24 
     | 
    
         
             
                  type.load(nil).should be(nil)
         
     | 
| 
       21 
25 
     | 
    
         
             
                end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
       23 
27 
     | 
    
         
             
                context 'for incoming Float values' do
         
     | 
| 
       24 
28 
     | 
    
         
             
                 it 'returns the incoming value' do
         
     | 
| 
       25 
29 
     | 
    
         
             
                   [0.0, -1.0, 1.0, 1e-10, 0.25135].each do |value|
         
     | 
| 
         @@ -36,7 +40,7 @@ describe Attributor::BigDecimal do 
     | 
|
| 
       36 
40 
     | 
    
         
             
                  end
         
     | 
| 
       37 
41 
     | 
    
         
             
                end
         
     | 
| 
       38 
42 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
                context 'for incoming String values' do 
     | 
| 
      
 43 
     | 
    
         
            +
                context 'for incoming String values' do
         
     | 
| 
       40 
44 
     | 
    
         
             
                  it 'should equal the value' do
         
     | 
| 
       41 
45 
     | 
    
         
             
                    type.load('0').should eq(0)
         
     | 
| 
       42 
46 
     | 
    
         
             
                    type.load('100').should eq(100)
         
     | 
    
        data/spec/types/boolean_spec.rb
    CHANGED
    
    
    
        data/spec/types/class_spec.rb
    CHANGED
    
    
| 
         @@ -341,6 +341,10 @@ describe Attributor::Collection do 
     | 
|
| 
       341 
341 
     | 
    
         
             
              context 'dumping' do
         
     | 
| 
       342 
342 
     | 
    
         
             
                let(:type) { Attributor::Collection.of(Cormorant) }
         
     | 
| 
       343 
343 
     | 
    
         | 
| 
      
 344 
     | 
    
         
            +
                it 'it is Dumpable' do
         
     | 
| 
      
 345 
     | 
    
         
            +
                  type.new.is_a?(Attributor::Dumpable).should be(true)
         
     | 
| 
      
 346 
     | 
    
         
            +
                end
         
     | 
| 
      
 347 
     | 
    
         
            +
             
     | 
| 
       344 
348 
     | 
    
         
             
                subject(:example) { type.example }
         
     | 
| 
       345 
349 
     | 
    
         
             
                it 'dumps' do
         
     | 
| 
       346 
350 
     | 
    
         
             
                  expect {
         
     | 
    
        data/spec/types/date_spec.rb
    CHANGED
    
    | 
         @@ -4,6 +4,10 @@ describe Attributor::Date do 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              subject(:type) { Attributor::Date }
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
              it 'it is not Dumpable' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                type.new.is_a?(Attributor::Dumpable).should_not be(true)
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       7 
11 
     | 
    
         
             
              context '.native_type' do
         
     | 
| 
       8 
12 
     | 
    
         
             
                its(:native_type) { should be(::Date) }
         
     | 
| 
       9 
13 
     | 
    
         
             
              end
         
     | 
| 
         @@ -20,7 +24,7 @@ describe Attributor::Date do 
     | 
|
| 
       20 
24 
     | 
    
         
             
                end
         
     | 
| 
       21 
25 
     | 
    
         
             
                context 'nil values' do
         
     | 
| 
       22 
26 
     | 
    
         
             
                  it 'should be nil' do
         
     | 
| 
       23 
     | 
    
         
            -
                    type.dump(nil).should be_nil 
     | 
| 
      
 27 
     | 
    
         
            +
                    type.dump(nil).should be_nil
         
     | 
| 
       24 
28 
     | 
    
         
             
                  end
         
     | 
| 
       25 
29 
     | 
    
         
             
                end
         
     | 
| 
       26 
30 
     | 
    
         
             
              end
         
     | 
| 
         @@ -33,14 +37,14 @@ describe Attributor::Date do 
     | 
|
| 
       33 
37 
     | 
    
         
             
                end
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
                context 'for incoming objects' do
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       37 
41 
     | 
    
         
             
                  it "returns correct Date for Time objects" do
         
     | 
| 
       38 
42 
     | 
    
         
             
                    object = Time.now
         
     | 
| 
       39 
43 
     | 
    
         
             
                    loaded = type.load(object)
         
     | 
| 
       40 
44 
     | 
    
         
             
                    loaded.should be_a(::Date)
         
     | 
| 
       41 
45 
     | 
    
         
             
                    loaded.to_date.should == object.to_date
         
     | 
| 
       42 
46 
     | 
    
         
             
                  end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       44 
48 
     | 
    
         
             
                  it "returns correct Date for DateTime objects" do
         
     | 
| 
       45 
49 
     | 
    
         
             
                    object = DateTime.now
         
     | 
| 
       46 
50 
     | 
    
         
             
                    loaded = type.load(object)
         
     | 
| 
         @@ -48,8 +52,8 @@ describe Attributor::Date do 
     | 
|
| 
       48 
52 
     | 
    
         
             
                    loaded.should be(object)
         
     | 
| 
       49 
53 
     | 
    
         
             
                  end
         
     | 
| 
       50 
54 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                end 
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       53 
57 
     | 
    
         
             
                context 'for incoming strings' do
         
     | 
| 
       54 
58 
     | 
    
         | 
| 
       55 
59 
     | 
    
         
             
                  [
         
     | 
| 
         @@ -4,6 +4,10 @@ describe Attributor::DateTime do 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              subject(:type) { Attributor::DateTime }
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
              it 'it is not Dumpable' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                type.new.is_a?(Attributor::Dumpable).should_not be(true)
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       7 
11 
     | 
    
         
             
              context '.native_type' do
         
     | 
| 
       8 
12 
     | 
    
         
             
                its(:native_type) { should be(::DateTime) }
         
     | 
| 
       9 
13 
     | 
    
         
             
              end
         
     | 
| 
         @@ -20,7 +24,7 @@ describe Attributor::DateTime do 
     | 
|
| 
       20 
24 
     | 
    
         
             
                end
         
     | 
| 
       21 
25 
     | 
    
         
             
                context 'nil values' do
         
     | 
| 
       22 
26 
     | 
    
         
             
                  it 'should be nil' do
         
     | 
| 
       23 
     | 
    
         
            -
                    type.dump(nil).should be_nil 
     | 
| 
      
 27 
     | 
    
         
            +
                    type.dump(nil).should be_nil
         
     | 
| 
       24 
28 
     | 
    
         
             
                  end
         
     | 
| 
       25 
29 
     | 
    
         
             
                end
         
     | 
| 
       26 
30 
     | 
    
         
             
              end
         
     | 
| 
         @@ -33,14 +37,14 @@ describe Attributor::DateTime do 
     | 
|
| 
       33 
37 
     | 
    
         
             
                end
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
                context 'for incoming objects' do
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       37 
41 
     | 
    
         
             
                  it "returns correct DateTime for Time objects" do
         
     | 
| 
       38 
42 
     | 
    
         
             
                    object = Time.now
         
     | 
| 
       39 
43 
     | 
    
         
             
                    loaded = type.load(object)
         
     | 
| 
       40 
44 
     | 
    
         
             
                    loaded.should be_a(::DateTime)
         
     | 
| 
       41 
45 
     | 
    
         
             
                    loaded.to_time.should == object
         
     | 
| 
       42 
46 
     | 
    
         
             
                  end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       44 
48 
     | 
    
         
             
                  it "returns correct DateTime for DateTime objects" do
         
     | 
| 
       45 
49 
     | 
    
         
             
                    object = DateTime.now
         
     | 
| 
       46 
50 
     | 
    
         
             
                    loaded = type.load(object)
         
     | 
| 
         @@ -48,8 +52,8 @@ describe Attributor::DateTime do 
     | 
|
| 
       48 
52 
     | 
    
         
             
                    loaded.should be( object )
         
     | 
| 
       49 
53 
     | 
    
         
             
                  end
         
     | 
| 
       50 
54 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                end 
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       53 
57 
     | 
    
         
             
                context 'for incoming strings' do
         
     | 
| 
       54 
58 
     | 
    
         | 
| 
       55 
59 
     | 
    
         
             
                  [
         
     | 
    
        data/spec/types/float_spec.rb
    CHANGED
    
    
    
        data/spec/types/hash_spec.rb
    CHANGED
    
    | 
         @@ -439,6 +439,10 @@ describe Attributor::Hash do 
     | 
|
| 
       439 
439 
     | 
    
         
             
                let(:value) { {one: 1, two: 2} }
         
     | 
| 
       440 
440 
     | 
    
         
             
                let(:opts) { {} }
         
     | 
| 
       441 
441 
     | 
    
         | 
| 
      
 442 
     | 
    
         
            +
                it 'it is Dumpable' do
         
     | 
| 
      
 443 
     | 
    
         
            +
                  type.new.is_a?(Attributor::Dumpable).should be(true)
         
     | 
| 
      
 444 
     | 
    
         
            +
                end
         
     | 
| 
      
 445 
     | 
    
         
            +
             
     | 
| 
       442 
446 
     | 
    
         
             
                context 'for a simple (untyped) hash' do
         
     | 
| 
       443 
447 
     | 
    
         
             
                  it 'returns the untouched hash value' do
         
     | 
| 
       444 
448 
     | 
    
         
             
                    type.dump(value, opts).should eq(value)
         
     | 
    
        data/spec/types/integer_spec.rb
    CHANGED
    
    
    
        data/spec/types/regexp_spec.rb
    CHANGED
    
    | 
         @@ -4,6 +4,10 @@ describe Attributor::Regexp do 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              subject(:type) { Attributor::Regexp }
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
              it 'it is not Dumpable' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                type.new.is_a?(Attributor::Dumpable).should_not be(true)
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       7 
11 
     | 
    
         
             
              its(:native_type) { should be(::Regexp) }
         
     | 
| 
       8 
12 
     | 
    
         
             
              its(:example) { should be_a(::String) }
         
     | 
| 
       9 
13 
     | 
    
         
             
              its(:family) { should == 'string' }
         
     | 
    
        data/spec/types/string_spec.rb
    CHANGED
    
    | 
         @@ -4,6 +4,10 @@ describe Attributor::String do 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              subject(:type) { Attributor::String }
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
              it 'it is not Dumpable' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                type.new.is_a?(Attributor::Dumpable).should_not be(true)
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       7 
11 
     | 
    
         
             
              context '.native_type' do
         
     | 
| 
       8 
12 
     | 
    
         
             
                it "returns String" do
         
     | 
| 
       9 
13 
     | 
    
         
             
                  type.native_type.should be(::String)
         
     | 
    
        data/spec/types/time_spec.rb
    CHANGED
    
    | 
         @@ -4,6 +4,10 @@ describe Attributor::Time do 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              subject(:type) { Attributor::Time }
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
              it 'it is not Dumpable' do
         
     | 
| 
      
 8 
     | 
    
         
            +
                type.new.is_a?(Attributor::Dumpable).should_not be(true)
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       7 
11 
     | 
    
         
             
              context '.native_type' do
         
     | 
| 
       8 
12 
     | 
    
         
             
                its(:native_type) { should be(::Time) }
         
     | 
| 
       9 
13 
     | 
    
         
             
              end
         
     | 
| 
         @@ -20,7 +24,7 @@ describe Attributor::Time do 
     | 
|
| 
       20 
24 
     | 
    
         
             
                end
         
     | 
| 
       21 
25 
     | 
    
         
             
                context 'nil values' do
         
     | 
| 
       22 
26 
     | 
    
         
             
                  it 'should be nil' do
         
     | 
| 
       23 
     | 
    
         
            -
                    type.dump(nil).should be_nil 
     | 
| 
      
 27 
     | 
    
         
            +
                    type.dump(nil).should be_nil
         
     | 
| 
       24 
28 
     | 
    
         
             
                  end
         
     | 
| 
       25 
29 
     | 
    
         
             
                end
         
     | 
| 
       26 
30 
     | 
    
         
             
              end
         
     | 
| 
         @@ -33,14 +37,14 @@ describe Attributor::Time do 
     | 
|
| 
       33 
37 
     | 
    
         
             
                end
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
                context 'for incoming objects' do
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       37 
41 
     | 
    
         
             
                  it "returns correct Time for DateTime objects" do
         
     | 
| 
       38 
42 
     | 
    
         
             
                    object = Time.now
         
     | 
| 
       39 
43 
     | 
    
         
             
                    loaded = type.load(object)
         
     | 
| 
       40 
44 
     | 
    
         
             
                    loaded.should be_a(::Time)
         
     | 
| 
       41 
45 
     | 
    
         
             
                    loaded.to_time.should == object
         
     | 
| 
       42 
46 
     | 
    
         
             
                  end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       44 
48 
     | 
    
         
             
                  it "returns correct Time for DateTime objects" do
         
     | 
| 
       45 
49 
     | 
    
         
             
                    object = DateTime.now
         
     | 
| 
       46 
50 
     | 
    
         
             
                    loaded = type.load(object)
         
     | 
| 
         @@ -48,8 +52,8 @@ describe Attributor::Time do 
     | 
|
| 
       48 
52 
     | 
    
         
             
                    loaded.should eq(object.to_time)
         
     | 
| 
       49 
53 
     | 
    
         
             
                  end
         
     | 
| 
       50 
54 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                end 
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
       53 
57 
     | 
    
         
             
                context 'for incoming strings' do
         
     | 
| 
       54 
58 
     | 
    
         | 
| 
       55 
59 
     | 
    
         
             
                  [
         
     | 
    
        data/spec/types/uri_spec.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: attributor
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 5.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 5.0.2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Josep M. Blanquer
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date:  
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2016-02-18 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: hashie
         
     | 
| 
         @@ -285,6 +285,7 @@ files: 
     | 
|
| 
       285 
285 
     | 
    
         
             
            - lib/attributor/attribute.rb
         
     | 
| 
       286 
286 
     | 
    
         
             
            - lib/attributor/attribute_resolver.rb
         
     | 
| 
       287 
287 
     | 
    
         
             
            - lib/attributor/dsl_compiler.rb
         
     | 
| 
      
 288 
     | 
    
         
            +
            - lib/attributor/dumpable.rb
         
     | 
| 
       288 
289 
     | 
    
         
             
            - lib/attributor/example_mixin.rb
         
     | 
| 
       289 
290 
     | 
    
         
             
            - lib/attributor/exceptions.rb
         
     | 
| 
       290 
291 
     | 
    
         
             
            - lib/attributor/extensions/randexp.rb
         
     | 
| 
         @@ -322,6 +323,7 @@ files: 
     | 
|
| 
       322 
323 
     | 
    
         
             
            - spec/attribute_spec.rb
         
     | 
| 
       323 
324 
     | 
    
         
             
            - spec/attributor_spec.rb
         
     | 
| 
       324 
325 
     | 
    
         
             
            - spec/dsl_compiler_spec.rb
         
     | 
| 
      
 326 
     | 
    
         
            +
            - spec/dumpable_spec.rb
         
     | 
| 
       325 
327 
     | 
    
         
             
            - spec/extras/field_selector/field_selector_spec.rb
         
     | 
| 
       326 
328 
     | 
    
         
             
            - spec/families_spec.rb
         
     | 
| 
       327 
329 
     | 
    
         
             
            - spec/hash_dsl_compiler_spec.rb
         
     | 
| 
         @@ -369,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       369 
371 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       370 
372 
     | 
    
         
             
            requirements: []
         
     | 
| 
       371 
373 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       372 
     | 
    
         
            -
            rubygems_version: 2.4.5 
     | 
| 
      
 374 
     | 
    
         
            +
            rubygems_version: 2.4.5
         
     | 
| 
       373 
375 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       374 
376 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       375 
377 
     | 
    
         
             
            summary: A powerful attribute and type management library for Ruby
         
     | 
| 
         @@ -378,6 +380,7 @@ test_files: 
     | 
|
| 
       378 
380 
     | 
    
         
             
            - spec/attribute_spec.rb
         
     | 
| 
       379 
381 
     | 
    
         
             
            - spec/attributor_spec.rb
         
     | 
| 
       380 
382 
     | 
    
         
             
            - spec/dsl_compiler_spec.rb
         
     | 
| 
      
 383 
     | 
    
         
            +
            - spec/dumpable_spec.rb
         
     | 
| 
       381 
384 
     | 
    
         
             
            - spec/extras/field_selector/field_selector_spec.rb
         
     | 
| 
       382 
385 
     | 
    
         
             
            - spec/families_spec.rb
         
     | 
| 
       383 
386 
     | 
    
         
             
            - spec/hash_dsl_compiler_spec.rb
         
     |