summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dsl.rb4
-rw-r--r--lib/dslkeywords/file.rb3
-rw-r--r--lib/dslkeywords/given.rb (renamed from lib/dslkeywords/only_when.rb)8
-rw-r--r--lib/dslkeywords/keyword.rb6
-rw-r--r--lib/dslkeywords/notify.rb3
-rw-r--r--lib/dslkeywords/resource.rb8
-rw-r--r--playground/Rakefile4
-rw-r--r--test/lib/dslkeywords/dependency_test.rb68
-rw-r--r--test/lib/dslkeywords/file_test.rb24
-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.rb66
11 files changed, 102 insertions, 96 deletions
diff --git a/lib/dsl.rb b/lib/dsl.rb
index 353bb15..4a2c4ad 100644
--- a/lib/dsl.rb
+++ b/lib/dsl.rb
@@ -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