From 300a4be4bf6d1bfecfc67fd4aec7397a1f991098 Mon Sep 17 00:00:00 2001 From: Ulysse Buonomo Date: Wed, 20 Apr 2022 20:18:56 +0200 Subject: [PATCH 1/4] dry-validation only as a runtime dependency --- .ruby-version | 2 +- config.gemspec | 5 +++-- lib/config/dry_validation_requirements.rb | 5 +++++ lib/config/error.rb | 4 ++++ lib/config/validation/error.rb | 4 +++- lib/config/validation/schema.rb | 13 +++++++++++++ 6 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 lib/config/dry_validation_requirements.rb create mode 100644 lib/config/error.rb diff --git a/.ruby-version b/.ruby-version index 7872401a..a603bb50 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -ruby-2.6 +2.7.5 diff --git a/config.gemspec b/config.gemspec index 29a44452..8634d0f4 100644 --- a/config.gemspec +++ b/config.gemspec @@ -1,6 +1,7 @@ -$:.push File.expand_path('../lib', __FILE__) +$:.push File.expand_path('lib', __dir__) require 'config/version' +require 'config/dry_validation_requirements' Gem::Specification.new do |s| s.name = 'config' @@ -27,8 +28,8 @@ Donate: \e[34mhttps://opencollective.com/rubyconfig/donate\e[0m\n" s.required_ruby_version = '>= 2.6.0' s.add_dependency 'deep_merge', '~> 1.2', '>= 1.2.1' - s.add_dependency 'dry-validation', '~> 1.0', '>= 1.0.0' + s.add_development_dependency 'dry-validation', *Config::DRY_VALIDATION_REQUIREMENTS s.add_development_dependency 'rake', '~> 12.0', '>= 12.0.0' # Testing diff --git a/lib/config/dry_validation_requirements.rb b/lib/config/dry_validation_requirements.rb new file mode 100644 index 00000000..b1a1287a --- /dev/null +++ b/lib/config/dry_validation_requirements.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Config + DRY_VALIDATION_REQUIREMENTS = ['~> 1.0', '>= 1.0.0'].freeze +end diff --git a/lib/config/error.rb b/lib/config/error.rb new file mode 100644 index 00000000..88906fe7 --- /dev/null +++ b/lib/config/error.rb @@ -0,0 +1,4 @@ +module Config + class Error < StandardError + end +end diff --git a/lib/config/validation/error.rb b/lib/config/validation/error.rb index 31bac93a..cc523c43 100644 --- a/lib/config/validation/error.rb +++ b/lib/config/validation/error.rb @@ -1,6 +1,8 @@ +require_relative "../error" + module Config module Validation - class Error < StandardError + class Error < ::Config::Error def self.format(v_res) v_res.errors.group_by(&:path).map do |path, messages| diff --git a/lib/config/validation/schema.rb b/lib/config/validation/schema.rb index 841b3df8..4216445a 100644 --- a/lib/config/validation/schema.rb +++ b/lib/config/validation/schema.rb @@ -1,3 +1,6 @@ +require_relative '../dry_validation_requirements' +require_relative '../error' + module Config module Validation module Schema @@ -8,6 +11,16 @@ def schema=(value) def schema(&block) if block_given? + begin + require 'dry/validation/version' + version = Gem::Version.new(Dry::Validation::VERSION) + unless ::Config::DRY_VALIDATION_REQUIREMENTS.all? { |req| Gem::Requirement.new(req).satisfied_by?(version) } + raise LoadError + end + rescue LoadError + raise ::Config::Error, 'Could not find a dry-validation version matching requirements' \ + " (#{::Config::DRY_VALIDATION_REQUIREMENTS.map(&:inspect) * ','})" + end # Delay require until optional schema validation is requested require 'dry-validation' @schema = Dry::Schema.define(&block) From a09c40586cd1f3bd0ea096d0b98ee5ab6f6d91c8 Mon Sep 17 00:00:00 2001 From: Ulysse Buonomo Date: Tue, 26 Apr 2022 16:25:00 +0200 Subject: [PATCH 2/4] Fix config requirement --- lib/config.rb | 2 +- lib/config/compatibility.rb | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 lib/config/compatibility.rb diff --git a/lib/config.rb b/lib/config.rb index 4713f8ba..075c6b43 100644 --- a/lib/config.rb +++ b/lib/config.rb @@ -1,6 +1,6 @@ -require 'config/compatibility' require 'config/options' require 'config/configuration' +require 'config/dry_validation_requirements' require 'config/version' require 'config/sources/yaml_source' require 'config/sources/hash_source' diff --git a/lib/config/compatibility.rb b/lib/config/compatibility.rb deleted file mode 100644 index 57513ebb..00000000 --- a/lib/config/compatibility.rb +++ /dev/null @@ -1,3 +0,0 @@ -if defined?(RbConfig) && defined?(Config) - Object.send :remove_const, :Config -end From 713df223be08426e09708e55519d66396c077012 Mon Sep 17 00:00:00 2001 From: Ulysse Buonomo Date: Tue, 26 Apr 2022 16:25:35 +0200 Subject: [PATCH 3/4] Various fixes --- .gitignore | 1 + .ruby-version | 1 - config.gemspec | 6 ++---- spec/spec_helper.rb | 8 ++++---- 4 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 .ruby-version diff --git a/.gitignore b/.gitignore index c44c98cb..4be21795 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ tmp .keep .rvmrc .rakeTasks +.ruby-version .sass-cache Gemfile.lock *.gem diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index a603bb50..00000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.7.5 diff --git a/config.gemspec b/config.gemspec index 8634d0f4..e091ed76 100644 --- a/config.gemspec +++ b/config.gemspec @@ -1,7 +1,5 @@ -$:.push File.expand_path('lib', __dir__) - -require 'config/version' -require 'config/dry_validation_requirements' +require_relative 'lib/config/version' +require_relative 'lib/config/dry_validation_requirements' Gem::Specification.new do |s| s.name = 'config' diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2f1c7075..aa214221 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,13 +14,13 @@ ## # Load Rspec supporting files # -Dir['./spec/support/**/*.rb'].each { |f| require f } +Dir['./spec/support/**/*.rb'].sort.each { |f| require f } ## # Detect Rails/Sinatra dummy application based on gemfile name substituted by Appraisal # if ENV['APPRAISAL_INITIALIZED'] || ENV['GITHUB_ACTIONS'] - app_name = Pathname.new(ENV['BUNDLE_GEMFILE']).basename.sub('.gemfile', '') + app_name = File.basename(ENV['BUNDLE_GEMFILE'], '.gemfile') else /.*?(?rails.*?)\.gemfile/ =~ Dir["gemfiles/rails*.gemfile"].sort.last end @@ -33,7 +33,7 @@ case app_framework when 'rails' # Load Rails - require File.expand_path("../app/#{app_name}/config/environment", __FILE__) + require_relative "app/#{app_name}/config/environment" APP_RAKEFILE = File.expand_path("../app/#{app_name}/Rakefile", __FILE__) @@ -47,7 +47,7 @@ when 'sinatra' # Load Sinatra - require File.expand_path("../app/#{app_name}/app", __FILE__) + require_relative "app/#{app_name}/app" # Load Rspec require 'rspec' From e914c44a1ad3a723ea6d909a7d61626409b5f1e6 Mon Sep 17 00:00:00 2001 From: Ulysse Buonomo Date: Tue, 4 Apr 2023 22:26:28 -0400 Subject: [PATCH 4/4] rework to satisfy usage of validation_contract --- config.gemspec | 2 +- lib/config/dry_validation_requirements.rb | 24 ++++++++++++++++++++++- lib/config/validation/schema.rb | 12 +----------- lib/config/validation/validate.rb | 4 ++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/config.gemspec b/config.gemspec index e091ed76..cbf83e39 100644 --- a/config.gemspec +++ b/config.gemspec @@ -27,7 +27,7 @@ Donate: \e[34mhttps://opencollective.com/rubyconfig/donate\e[0m\n" s.add_dependency 'deep_merge', '~> 1.2', '>= 1.2.1' - s.add_development_dependency 'dry-validation', *Config::DRY_VALIDATION_REQUIREMENTS + s.add_development_dependency 'dry-validation', *Config::DryValidationRequirements::VERSIONS s.add_development_dependency 'rake', '~> 12.0', '>= 12.0.0' # Testing diff --git a/lib/config/dry_validation_requirements.rb b/lib/config/dry_validation_requirements.rb index b1a1287a..e1ddc5b5 100644 --- a/lib/config/dry_validation_requirements.rb +++ b/lib/config/dry_validation_requirements.rb @@ -1,5 +1,27 @@ # frozen_string_literal: true module Config - DRY_VALIDATION_REQUIREMENTS = ['~> 1.0', '>= 1.0.0'].freeze + module DryValidationRequirements + VERSIONS = ['~> 1.0', '>= 1.0.0'].freeze + + def self.load_dry_validation! + return if defined?(@load_dry_validation) + + begin + require 'dry/validation/version' + version = Gem::Version.new(Dry::Validation::VERSION) + unless VERSIONS.all? { |req| Gem::Requirement.new(req).satisfied_by?(version) } + raise LoadError + end + rescue LoadError + raise ::Config::Error, 'Could not find a dry-validation version' \ + ' matching requirements' \ + " (#{VERSIONS.map(&:inspect) * ','})" + end + + require 'dry/validation' + @load_dry_validation = true + nil + end + end end diff --git a/lib/config/validation/schema.rb b/lib/config/validation/schema.rb index 4216445a..7941759a 100644 --- a/lib/config/validation/schema.rb +++ b/lib/config/validation/schema.rb @@ -11,18 +11,8 @@ def schema=(value) def schema(&block) if block_given? - begin - require 'dry/validation/version' - version = Gem::Version.new(Dry::Validation::VERSION) - unless ::Config::DRY_VALIDATION_REQUIREMENTS.all? { |req| Gem::Requirement.new(req).satisfied_by?(version) } - raise LoadError - end - rescue LoadError - raise ::Config::Error, 'Could not find a dry-validation version matching requirements' \ - " (#{::Config::DRY_VALIDATION_REQUIREMENTS.map(&:inspect) * ','})" - end # Delay require until optional schema validation is requested - require 'dry-validation' + Config::DryValidationRequirements.load_dry_validation! @schema = Dry::Schema.define(&block) else @schema diff --git a/lib/config/validation/validate.rb b/lib/config/validation/validate.rb index 0594b3c5..d0f892be 100644 --- a/lib/config/validation/validate.rb +++ b/lib/config/validation/validate.rb @@ -4,6 +4,10 @@ module Config module Validation module Validate def validate! + return unless Config.validation_contract || Config.schema + + Config::DryValidationRequirements.load_dry_validation! + validate_using!(Config.validation_contract) validate_using!(Config.schema) end