diff options
| -rw-r--r-- | lib/dsl.rb | 4 | ||||
| -rw-r--r-- | lib/dslkeywords/file.rb | 3 | ||||
| -rw-r--r-- | lib/dslkeywords/given.rb (renamed from lib/dslkeywords/only_when.rb) | 8 | ||||
| -rw-r--r-- | lib/dslkeywords/keyword.rb | 6 | ||||
| -rw-r--r-- | lib/dslkeywords/notify.rb | 3 | ||||
| -rw-r--r-- | lib/dslkeywords/resource.rb | 8 | ||||
| -rw-r--r-- | playground/Rakefile | 4 | ||||
| -rw-r--r-- | test/lib/dslkeywords/dependency_test.rb | 68 | ||||
| -rw-r--r-- | test/lib/dslkeywords/file_test.rb | 24 | ||||
| -rw-r--r-- | test/lib/dslkeywords/given_test.rb (renamed from test/lib/dslkeywords/only_when_test.rb) | 4 | ||||
| -rw-r--r-- | test/lib/dslkeywords/requires_test.rb | 66 |
11 files changed, 102 insertions, 96 deletions
@@ -1,9 +1,10 @@ require_relative 'config' require_relative 'options' require_relative 'log' +require_relative 'chained' require_relative 'dslkeywords/file' -require_relative 'dslkeywords/only_when' +require_relative 'dslkeywords/given' require_relative 'dslkeywords/notify' # Ruby Configiration Management system @@ -22,6 +23,7 @@ module RCM include Config include Options include Log + include Chained class DuplicateResource < StandardError; end diff --git a/lib/dslkeywords/file.rb b/lib/dslkeywords/file.rb index eeff82f..40daecb 100644 --- a/lib/dslkeywords/file.rb +++ b/lib/dslkeywords/file.rb @@ -3,6 +3,7 @@ require 'erb' require 'fileutils' require_relative 'resource' +require_relative '../chained' module RCM # Backup the file on change @@ -23,6 +24,7 @@ module RCM # Managing files class File < Resource include FileBackup + include Chained class UnsupportedOperation < StandardError; end @@ -46,6 +48,7 @@ module RCM def without(what) = @without_backup = validate_op(__method__, what, backup) == backup def from(what) = @from = validate_op(__method__, what, sourcefile, template) + # TODO: Delete this, as should not be required anymore due to Chained module def method_missing(method_name, *args) if %i[present absent directory backup sourcefile template].include?(method_name) method_name diff --git a/lib/dslkeywords/only_when.rb b/lib/dslkeywords/given.rb index f23c33e..fa14e68 100644 --- a/lib/dslkeywords/only_when.rb +++ b/lib/dslkeywords/given.rb @@ -3,8 +3,8 @@ require 'socket' require_relative 'keyword' module RCM - # OnlyWhen (e.g. run on host foo) - class OnlyWhen < Keyword + # Given (e.g. run on host foo) + class Given < Keyword def initialize(dsl_id) super(dsl_id) @conds = {} @@ -23,8 +23,8 @@ module RCM # Add 'only_when' to DSL class DSL - def only_when(&block) - conds = OnlyWhen.new(id) + def given(&block) + conds = Given.new(id) conds.instance_eval(&block) @conds_met = conds.met? end diff --git a/lib/dslkeywords/keyword.rb b/lib/dslkeywords/keyword.rb index ee3cfba..1cbda9f 100644 --- a/lib/dslkeywords/keyword.rb +++ b/lib/dslkeywords/keyword.rb @@ -15,11 +15,5 @@ module RCM def to_s = @id class KeywordError < StandardError; end - - def method_missing(method_name, *args) - raise KeywordError, "No such method: #{method_name}" - end - - def respond_to_missing? = true end end diff --git a/lib/dslkeywords/notify.rb b/lib/dslkeywords/notify.rb index e1d8a3d..6616cb0 100644 --- a/lib/dslkeywords/notify.rb +++ b/lib/dslkeywords/notify.rb @@ -2,10 +2,13 @@ require 'erb' require 'fileutils' require_relative 'resource' +require_relative '../chained' module RCM # Only to print out something class Notify < Resource + include Chained + def initialize(message) super(message) @message = message diff --git a/lib/dslkeywords/resource.rb b/lib/dslkeywords/resource.rb index 3aff069..2358ff5 100644 --- a/lib/dslkeywords/resource.rb +++ b/lib/dslkeywords/resource.rb @@ -26,6 +26,12 @@ module RCM return @requires if others.empty? others.flatten.each do |other| + unless other.include?('(') + # Convert "notify foo" to "notify('foo')" + resource, rest = other.split(' ', 2) + other = "#{resource}('#{rest}')" + end + info "Registered dependency on #{other}" @requires << other end @@ -74,7 +80,7 @@ module RCM def self.find(id) return @@resource_find_cache[id] if @@resource_find_cache.key?(id) - klass = Object.const_get("RCM::#{id.split('(').first.capitalize}") + klass = Object.const_get("RCM::#{id.split(/[( ]/).first.capitalize}") resource = ObjectSpace.each_object(klass).find { _1.id == id } raise NoSuchResourceObject, "Unable to find resource #{id}" if resource.nil? diff --git a/playground/Rakefile b/playground/Rakefile index ed08f26..63961ed 100644 --- a/playground/Rakefile +++ b/playground/Rakefile @@ -5,7 +5,7 @@ task :wireguard do configure do # p option :verbose # dump_config - only_when { hostname is :earth } + given { hostname is :earth } file '/tmp/test/wg/wg0.conf' do manage directory @@ -26,7 +26,7 @@ end desc 'Set up the /etc/hosts file' task :hosts do configure do - only_when { hostname is :earth } + given { hostname is :earth } file '/etc/hosts.test' do line '192.168.1.101 foo' diff --git a/test/lib/dslkeywords/dependency_test.rb b/test/lib/dslkeywords/dependency_test.rb deleted file mode 100644 index aa1be78..0000000 --- a/test/lib/dslkeywords/dependency_test.rb +++ /dev/null @@ -1,68 +0,0 @@ -require 'minitest/autorun' -require 'fileutils' - -require_relative '../../../lib/dsl' - -class RCMDependencyTest < Minitest::Test - def test_requires - foo = nil - bar = nil - baz = nil - - configure_from_scratch do - foo = notify 'foo' do - requires notify 'bar', 'baz' - :foo_message - end - - bar = notify 'bar' - - baz = notify 'baz' do - requires notify 'bar' - :baz_message - end - end - - assert_equal 2, foo.requires.count - assert foo.requires?("notify('bar')", "notify('baz')") - - assert_equal 0, bar.requires.count - refute bar.requires?('foo') - - assert_equal 1, baz.requires.count - assert baz.requires?("notify('bar')") - end - - def test_requires_invalid_resource - assert_raises(RCM::Keyword::KeywordError) do - configure_from_scratch do - notify { requires invalid('baz') } - end - end - end - - def test_requires_non_existant_dependency - assert_raises(RCM::Resource::NoSuchResourceObject) do - configure_from_scratch do - notify { requires notify('nonexistant') } - end - end - end - - def test_dependency_loop - assert_raises(RCM::DependencyEvaluator::DependencyLoop) do - configure_from_scratch do - notify('loop') { requires notify('loop') } - end - end - end - - def test_dependency_loop_indirect - assert_raises(RCM::DependencyEvaluator::DependencyLoop) do - configure_from_scratch do - notify('loop') { requires notify('pool') } - notify('pool') { requires notify('loop') } - end - end - end -end diff --git a/test/lib/dslkeywords/file_test.rb b/test/lib/dslkeywords/file_test.rb index 4353471..150440c 100644 --- a/test/lib/dslkeywords/file_test.rb +++ b/test/lib/dslkeywords/file_test.rb @@ -26,13 +26,13 @@ class RCMFileTest < Minitest::Test def test_file_absent configure_from_scratch do - file :create_file do + file create do path FILE_PATH is present - :text + the text end - file :delete_file do + file delete do path FILE_PATH is absent end @@ -45,17 +45,17 @@ class RCMFileTest < Minitest::Test file_path = "#{DIR_PATH}/test_file_absent_with_empty_directory/bar/baz/foo.txt" configure_from_scratch do - file :create_file_empty_directory_test do + file create File empty directory do path file_path manage directory - :text + the text end - file :delete_file_empty_directory_test do + file delete File empty directory do path file_path is absent manage directory - requires file :create_file_empty_directory_test + requires file create File empty directory end end @@ -99,7 +99,7 @@ class RCMFileTest < Minitest::Test def test_line_absent File.write(FILE_PATH, "Hey there\nWhats up?") configure_from_scratch do - file(FILE_PATH) do + file FILE_PATH do line 'Whats up?' is absent end @@ -108,7 +108,7 @@ class RCMFileTest < Minitest::Test File.write(FILE_PATH, "Hey there\nWhats up?") configure_from_scratch do - file(FILE_PATH) do + file FILE_PATH do line 'Hey there' is absent end @@ -135,16 +135,16 @@ class RCMFileTest < Minitest::Test backup_path = "#{DIR_PATH}/foo/.rcm/backup-me.txt.d4c3af73588ce06c32ed04d1b79801286109ea265712a2bd3fdc3ed01c82bb86" configure_from_scratch do - file :original do + file original do path file_path manage directory original_content end - file :new do + file new do path file_path manage directory - requires file(:original) + requires file original :new_content end end diff --git a/test/lib/dslkeywords/only_when_test.rb b/test/lib/dslkeywords/given_test.rb index 94ebe79..d27baca 100644 --- a/test/lib/dslkeywords/only_when_test.rb +++ b/test/lib/dslkeywords/given_test.rb @@ -6,14 +6,14 @@ require_relative '../../../lib/dsl' class RCMOnlyWhenTest < Minitest::Test def test_hostname rcm = configure_from_scratch do - only_when { hostname Socket.gethostname } + given { hostname Socket.gethostname } end assert rcm.conds_met end def test_hostname_negative rcm = configure_from_scratch do - only_when { hostname "#{Socket.gethostname}.invalid" } + given { hostname "#{Socket.gethostname}.invalid" } end refute rcm.conds_met end diff --git a/test/lib/dslkeywords/requires_test.rb b/test/lib/dslkeywords/requires_test.rb new file mode 100644 index 0000000..f06a3ec --- /dev/null +++ b/test/lib/dslkeywords/requires_test.rb @@ -0,0 +1,66 @@ +require 'minitest/autorun' +require 'fileutils' + +require_relative '../../../lib/dsl' + +class RCMRequiresTest < Minitest::Test + def test_requires + foo_notify = bar_notify = baz_notify = nil + + configure_from_scratch do + foo_notify = notify foo do + requires notify bar and requires notify baz + foo_message + end + + bar_notify = notify bar + + baz_notify = notify baz do + requires notify bar + baz_message + end + end + + assert_equal 2, foo_notify.requires.count + assert foo_notify.requires?("notify('bar')", "notify('baz')") + + assert_equal 0, bar_notify.requires.count + refute bar_notify.requires?('foo') + + assert_equal 1, baz_notify.requires.count + assert baz_notify.requires?("notify('bar')") + end + + def test_requires_invalid_resource + assert_raises(NameError) do + configure_from_scratch do + notify { requires invalid('baz') } + end + end + end + + def test_requires_non_existant_dependency + assert_raises(RCM::Resource::NoSuchResourceObject) do + configure_from_scratch do + notify { requires notify nonexistant } + end + end + end + + def test_dependency_loop + assert_raises(RCM::DependencyEvaluator::DependencyLoop) do + configure_from_scratch do + notify(looper) { requires notify looper } + end + end + end + + def test_dependency_loop_indirect + assert_raises(RCM::DependencyEvaluator::DependencyLoop) do + configure_from_scratch do + notify(looper) { requires notify pooler } + notify(pooler) { requires notify looper } + end + end + end +end |
