rschema 3.0.3 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0004e8f7543e3268f043077e5de29acb277b54c2
         | 
| 4 | 
            +
              data.tar.gz: b63f12965664d76c537e8abfff9ec51b83eac396
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9796286f10fa653137a59fda54d062a0812cc7d87c1fc4caa77aceedc70ef72470a553e03e7756ae8712eef3dafe98c394d7c059fa53d4958af3b6e8be37f569
         | 
| 7 | 
            +
              data.tar.gz: 027dd033a77d5200dfe5069c7e5b3f4acc7d3019c079d76c0724f38d4b82542544cd81a27ad68eebfcbd3c3314998acc28a53e8c9862b571b47f5c4ce5f0aa1f
         | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            require 'set'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RSchema
         | 
| 4 | 
            +
            module Coercers
         | 
| 5 | 
            +
            module FixedHash
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              # The HTTP standard says that when a form is submitted, all unchecked
         | 
| 8 | 
            +
              # check boxes will _not_ be sent to the server. That is, they will not
         | 
| 9 | 
            +
              # be present at all in the params hash.
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # This class coerces these missing values into an empty array, where an array
         | 
| 12 | 
            +
              # is expected.
         | 
| 13 | 
            +
              class DefaultArraysToEmpty
         | 
| 14 | 
            +
                attr_reader :hash_attributes
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def self.build(schema)
         | 
| 17 | 
            +
                  new(schema)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def initialize(fixed_hash_schema)
         | 
| 21 | 
            +
                  #TODO: make fixed hash attributes frozen, and eliminate dup
         | 
| 22 | 
            +
                  @hash_attributes = fixed_hash_schema.attributes.map(&:dup)
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def call(value)
         | 
| 26 | 
            +
                  Result.success(default_arrays_to_empty(value))
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                private
         | 
| 30 | 
            +
                  def default_arrays_to_empty(hash)
         | 
| 31 | 
            +
                    missing_keys = keys_for_array_defaulting - hash.keys
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    if missing_keys.any?
         | 
| 34 | 
            +
                      defaults = missing_keys.map{ |k| [k, []] }.to_h
         | 
| 35 | 
            +
                      hash.merge(defaults)
         | 
| 36 | 
            +
                    else
         | 
| 37 | 
            +
                      hash # no coercion necessary
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def keys_for_array_defaulting
         | 
| 42 | 
            +
                    @keys_for_array_defaulting ||= Set.new(
         | 
| 43 | 
            +
                      hash_attributes
         | 
| 44 | 
            +
                        .reject(&:optional)
         | 
| 45 | 
            +
                        .select { |attr| is_array_schema?(attr.value_schema) }
         | 
| 46 | 
            +
                        .map(&:key)
         | 
| 47 | 
            +
                    )
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def is_array_schema?(schema)
         | 
| 51 | 
            +
                    # dig through all the coercers
         | 
| 52 | 
            +
                    non_coercer = schema
         | 
| 53 | 
            +
                    while non_coercer.is_a?(Schemas::Coercer)
         | 
| 54 | 
            +
                      non_coercer = non_coercer.subschema
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    non_coercer.is_a?(Schemas::VariableLengthArray)
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            end
         | 
| 62 | 
            +
            end
         | 
| 63 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module RSchema
         | 
| 2 | 
            +
            module Coercers
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              module NilEmptyStrings
         | 
| 5 | 
            +
                extend self
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def build(schema)
         | 
| 8 | 
            +
                  self
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def call(value)
         | 
| 12 | 
            +
                  if value.is_a?(String) && value.empty?
         | 
| 13 | 
            +
                    Result.success(nil)
         | 
| 14 | 
            +
                  else
         | 
| 15 | 
            +
                    Result.success(value)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            end
         | 
| 21 | 
            +
            end
         | 
| @@ -8,11 +8,13 @@ class CoercionWrapper | |
| 8 8 | 
             
                coerce_type Time, with: Coercers::Time
         | 
| 9 9 | 
             
                coerce_type Date, with: Coercers::Date
         | 
| 10 10 |  | 
| 11 | 
            +
                coerce Schemas::Maybe, with: Coercers::NilEmptyStrings
         | 
| 11 12 | 
             
                coerce Schemas::Boolean, with: Coercers::Boolean
         | 
| 12 13 | 
             
                coerce Schemas::FixedHash, with: Coercers::Chain[
         | 
| 13 14 | 
             
                  Coercers::FixedHash::SymbolizeKeys,
         | 
| 14 15 | 
             
                  Coercers::FixedHash::RemoveExtraneousAttributes,
         | 
| 15 16 | 
             
                  Coercers::FixedHash::DefaultBooleansToFalse,
         | 
| 17 | 
            +
                  Coercers::FixedHash::DefaultArraysToEmpty,
         | 
| 16 18 | 
             
                ]
         | 
| 17 19 | 
             
              end
         | 
| 18 20 |  | 
    
        data/lib/rschema/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rschema
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.0 | 
| 4 | 
            +
              version: 3.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Tom Dalling
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017-05- | 
| 11 | 
            +
            date: 2017-05-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: docile
         | 
| @@ -125,11 +125,13 @@ files: | |
| 125 125 | 
             
            - lib/rschema/coercers/boolean.rb
         | 
| 126 126 | 
             
            - lib/rschema/coercers/chain.rb
         | 
| 127 127 | 
             
            - lib/rschema/coercers/date.rb
         | 
| 128 | 
            +
            - lib/rschema/coercers/fixed_hash/default_arrays_to_empty.rb
         | 
| 128 129 | 
             
            - lib/rschema/coercers/fixed_hash/default_booleans_to_false.rb
         | 
| 129 130 | 
             
            - lib/rschema/coercers/fixed_hash/remove_extraneous_attributes.rb
         | 
| 130 131 | 
             
            - lib/rschema/coercers/fixed_hash/symbolize_keys.rb
         | 
| 131 132 | 
             
            - lib/rschema/coercers/float.rb
         | 
| 132 133 | 
             
            - lib/rschema/coercers/integer.rb
         | 
| 134 | 
            +
            - lib/rschema/coercers/nil_empty_strings.rb
         | 
| 133 135 | 
             
            - lib/rschema/coercers/symbol.rb
         | 
| 134 136 | 
             
            - lib/rschema/coercers/time.rb
         | 
| 135 137 | 
             
            - lib/rschema/coercion_wrapper.rb
         |