diff --git a/Gemfile.lock b/Gemfile.lock index 54324a7..6331a43 100755 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -20,6 +20,7 @@ GEM mocha (1.0.0) metaclass (~> 0.0.1) rake (10.2.2) + subprocess (1.0.0) PLATFORMS ruby @@ -30,3 +31,4 @@ DEPENDENCIES minitest (>= 5.2.3) mocha rake + subprocess diff --git a/configatron.gemspec b/configatron.gemspec index 097dfe1..2fca462 100755 --- a/configatron.gemspec +++ b/configatron.gemspec @@ -20,5 +20,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency "rake" gem.add_development_dependency "mocha" + gem.add_development_dependency "subprocess" gem.add_development_dependency "minitest", '>=5.2.3' end diff --git a/lib/configatron.rb b/lib/configatron.rb index 5788eb9..3bfa807 100755 --- a/lib/configatron.rb +++ b/lib/configatron.rb @@ -3,7 +3,7 @@ require 'configatron/deep_clone' require 'configatron/errors' -require 'configatron/kernel' +require 'configatron/kernel_store' require 'configatron/store' # Proc *must* load before dynamic/delayed, or else Configatron::Proc @@ -14,3 +14,11 @@ class Configatron end + +# NO_EXT gets defined when you require "configatron/core", which +# signals that you don't want any extensions. It'd be nice to have a +# better internal signaling mechanism (could use environment +# variables, but then they become part of the public interface). +unless defined?(Configatron::NO_EXT) + require 'configatron/ext/kernel' +end diff --git a/lib/configatron/core.rb b/lib/configatron/core.rb index 67dcf2e..e6ebbb0 100644 --- a/lib/configatron/core.rb +++ b/lib/configatron/core.rb @@ -1,2 +1,6 @@ -$stderr.puts "Warning: Loading 'configatron/core' has been deprecated. Please just load 'configatron directly." +class Configatron + # Signals that we should not load the extensions. + NO_EXT = true +end + require 'configatron' diff --git a/lib/configatron/ext/kernel.rb b/lib/configatron/ext/kernel.rb new file mode 100644 index 0000000..b878873 --- /dev/null +++ b/lib/configatron/ext/kernel.rb @@ -0,0 +1,5 @@ +module Kernel + def configatron + Configatron::KernelStore.instance + end +end diff --git a/lib/configatron/kernel.rb b/lib/configatron/kernel_store.rb similarity index 91% rename from lib/configatron/kernel.rb rename to lib/configatron/kernel_store.rb index 3ce215b..bb604b0 100644 --- a/lib/configatron/kernel.rb +++ b/lib/configatron/kernel_store.rb @@ -50,9 +50,3 @@ def unlock! @locked = false end end - -module Kernel - def configatron - Configatron::KernelStore.instance - end -end diff --git a/test/functional/_lib/scripts/core.rb b/test/functional/_lib/scripts/core.rb new file mode 100755 index 0000000..2c5178d --- /dev/null +++ b/test/functional/_lib/scripts/core.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby + +if defined?(configatron) + raise "`configatron` method was defined at load-time!" +end + +require 'configatron/core' + +if defined?(configatron) + raise "Loaded configatron/core but `configatron` was defined!" +end diff --git a/test/functional/loading.rb b/test/functional/loading.rb new file mode 100644 index 0000000..5b2e16a --- /dev/null +++ b/test/functional/loading.rb @@ -0,0 +1,10 @@ +require_relative '_lib' +require 'subprocess' + +class Critic::Functional::ConfigatronTest < Critic::Functional::Test + describe 'loading' do + it 'does not define top-level configatron method if loading configatron/core' do + Subprocess.check_call([File.expand_path('../_lib/scripts/core.rb', __FILE__)]) + end + end +end diff --git a/test/unit/configatron/kernel.rb b/test/unit/configatron/kernel_store.rb similarity index 100% rename from test/unit/configatron/kernel.rb rename to test/unit/configatron/kernel_store.rb