0exp / qonfig

Powerful configuration Ruby-framework with a support for many commonly used config formats with a multi-functional API, developer-friendly DSL and object-oriented behavior.
MIT License
23 stars 8 forks source link

Nested config validation and configure not raises error #121

Open bigforcegun opened 3 years ago

bigforcegun commented 3 years ago

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

Current behavior

0exp commented 3 years ago

Hi! Thx for issue! I will check it as soon as possible.