Skip to content

Nested config validation and configure not raises error #121

@bigforcegun

Description

@bigforcegun

Summary

If we use methods like validate_with and configure with nested deep setting structure and custom validation methods, validation methods gets old settings payload and always returns true

Code

class FlatConfig < Qonfig::DataSet
  expose_yaml Rails.root.join('tmp/flat_config.yml'), via: :env_key, env: :default

  validate by: :some_validation_method

  def some_validation_method
    puts "try to validate settings.some_key = #{settings.some_key}"
    settings.some_key != 'bad'
  end
end

class NestedDeepConfig < Qonfig::DataSet
  expose_yaml Rails.root.join('tmp/deep_config.yml'), via: :env_key, env: :default

  validate by: :some_validation_method

  def some_validation_method
    puts "try to validate settings.some_key.some_key2 = #{settings.some_key.some_key2}"
    settings.some_key.some_key2 != 'bad' # HERE we have settings.some_key.some_key2 = good
  end
end
end

example 1 (flat)

    config = FlatConfig.new
    invalid_payload = {
      some_key: 'bad',
    }

    puts "valid_with? = #{config.valid_with?(invalid_payload)}"
    begin
      puts 'config.configure(invalid_payload)'
      config.configure(invalid_payload)
      puts 'Hello invalid config =('
      puts config.settings.some_key.to_s
    rescue StandardError => error
      puts error
    end

example 2 (nested)

    config = NestedDeepConfig.new
    invalid_payload = {
      some_key: {
        some_key2: 'bad',
      },
    }
    puts "valid_with? = #{config.valid_with?(invalid_payload)}"
    begin
      puts 'config.configure(invalid_payload)'
      config.configure(invalid_payload)
      puts 'Hello invalid config =('
      puts config.settings.some_key.some_key2.to_s
    rescue StandardError => error
      puts error
    end

tmp/flat_config.yml

default:
  some_key: 'good'

tmp/deep_config.yml

default:
  some_key:
    some_key2: 'good'

Expected behavior

  • example 1 (flat)
    • valid_with? = false
    • configure(invalid_payload) - raises error
  • example 2 (nested)
    • valid_with? = false
    • configure(invalid_payload) - raises error

Current behavior

  • example 1 (flat)
    • valid_with? = false
    • configure(invalid_payload) - raises error
  • example 2 (nested)
    • valid_with? = true
    • configure(invalid_payload) - no error raises =(

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions