loom-core 0.0.6 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +31 -0
  3. data/Gemfile.lock +108 -56
  4. data/Rakefile +2 -0
  5. data/bin/loom +3 -0
  6. data/docs/architecture.jpg +0 -0
  7. data/gentags.sh +2 -0
  8. data/lib/loom/all.rb +1 -1
  9. data/lib/loom/config.rb +2 -2
  10. data/lib/loom/method_signature.rb +1 -1
  11. data/lib/loom/mods/action_proxy.rb +2 -2
  12. data/lib/loom/mods/mod_loader.rb +10 -5
  13. data/lib/loom/mods/module.rb +6 -5
  14. data/lib/loom/pattern/all.rb +1 -0
  15. data/lib/loom/pattern/definition_context.rb +7 -5
  16. data/lib/loom/pattern/dsl.rb +184 -119
  17. data/lib/loom/pattern/expanding_reference.rb +82 -6
  18. data/lib/loom/pattern/loader.rb +2 -18
  19. data/lib/loom/pattern/pattern.rb +52 -0
  20. data/lib/loom/pattern/reference.rb +17 -13
  21. data/lib/loom/pattern/reference_set.rb +71 -50
  22. data/lib/loom/runner/all.rb +2 -0
  23. data/lib/loom/runner/execution_context.rb +9 -0
  24. data/lib/loom/{dsl.rb → runner/sshkit_connector.rb} +5 -7
  25. data/lib/loom/runner.rb +46 -33
  26. data/lib/loom/shell/api.rb +3 -3
  27. data/lib/loom/shell/cmd_wrapper.rb +5 -2
  28. data/lib/loom/shell/core.rb +16 -16
  29. data/lib/loom/shell.rb +4 -2
  30. data/lib/loom/version.rb +1 -1
  31. data/lib/loomext/coremods/exec.rb +1 -0
  32. data/lib/loomext/coremods/systemd/all.rb +1 -0
  33. data/lib/loomext/coremods/systemd/hostname.rb +10 -0
  34. data/loom.TAGS +797 -0
  35. data/loom.gemspec +4 -3
  36. data/spec/.loom/error_handling.loom +1 -0
  37. data/spec/.loom/fail.loom +27 -13
  38. data/spec/.loom/files.loom +1 -0
  39. data/spec/.loom/inventory.yml +3 -0
  40. data/spec/.loom/net.loom +1 -0
  41. data/spec/.loom/pattern_context.loom +1 -0
  42. data/spec/.loom/pkg.loom +1 -0
  43. data/spec/.loom/regression.loom +23 -0
  44. data/spec/.loom/shell.loom +1 -0
  45. data/spec/.loom/test.loom +21 -4
  46. data/spec/.loom/user.loom +1 -0
  47. data/spec/.loom/vms.loom +1 -0
  48. data/spec/loom/host_spec_spec.rb +1 -1
  49. data/spec/loom/pattern/dsl_spec.rb +3 -2
  50. data/spec/shared/loom_internals_helper.rb +1 -1
  51. data/spec/test_loom_spec.rb +102 -42
  52. data/test +15 -0
  53. metadata +40 -17
data/loom.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
16
16
  s.require_paths = %w[lib]
17
17
 
18
- s.add_dependency 'sshkit', '~> 1.11'
18
+ s.add_dependency 'sshkit', '~> 1.23'
19
19
  s.add_dependency 'commander', '~> 4.4'
20
20
 
21
21
  # *** Obsolete, see new issue below ***
@@ -28,17 +28,18 @@ Gem::Specification.new do |s|
28
28
  # I can manually `gem install net-ssh --version 4.0.0.beta3` for now.
29
29
  # s.add_dependency 'net-ssh', '>= 4.0.0.beta3'
30
30
  s.add_dependency 'net-ssh', '>= 5'
31
- s.add_dependency 'rbnacl-libsodium', '1.0.10'
31
+ s.add_dependency 'rbnacl-libsodium', '1.0.16'
32
32
  s.add_dependency 'bcrypt_pbkdf', ">= 1.0", "< 2.0"
33
33
 
34
34
  # New net-ssh requiremetns for ed25519
35
35
  # https://github.com/net-ssh/net-ssh/issues/565
36
36
  s.add_dependency 'ed25519', '>=1.0', '<2.0'
37
37
 
38
- s.add_development_dependency 'bundler', '~> 1.13'
38
+ s.add_development_dependency 'bundler'
39
39
  s.add_development_dependency 'rake', '~> 11.3'
40
40
  s.add_development_dependency 'rspec', '~> 3.5'
41
41
  s.add_development_dependency 'guard-rspec', '~> 4.7'
42
42
  s.add_development_dependency 'pry', '~> 0.10'
43
43
  s.add_development_dependency 'pry-byebug'
44
+ s.add_development_dependency 'rubocop'
44
45
  end
@@ -1,4 +1,5 @@
1
1
  # !!! NOTE: This will reboot the host it runs on!!!
2
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:error_handling.loom
2
3
  module ErrorHandling
3
4
  include Loom::Pattern
4
5
 
data/spec/.loom/fail.loom CHANGED
@@ -1,20 +1,34 @@
1
1
  # All patterns are expected to fail
2
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:fail.loom
3
+ module ExpectedFailures
4
+ include Loom::Pattern
2
5
 
3
- desc "Always fails due to return code."
4
- pattern :fail_soft do |loom, facts|
5
- unless loom << :false
6
- loom.x :echo, "i am false"
6
+ before do
7
+ Loom.log.warn <<EOS
8
+
9
+ !!!
10
+ !!! The next case is expected to fail !!!
11
+ !!!
12
+ EOS
7
13
  end
8
- end
9
14
 
10
- desc "Always fails due to a hard failure"
11
- pattern :fail_hard do |loom, facts|
12
- loom.fail "Fail big or not at all"
13
- end
14
15
 
15
- desc "Expected to fail: Check timeout commands"
16
- pattern :timeout_fail do |loom, facts|
17
- loom.timeout(:timeout => 1) do
18
- loom.x :sleep, 2
16
+ desc "Always fails due to return code."
17
+ pattern :fail_soft do |loom, facts|
18
+ unless loom.x :false
19
+ loom.x :echo, "i fail soft, because ALL examples are expected to succeed"
20
+ end
21
+ end
22
+
23
+ desc "Expect `loom.fail` to throw and error out"
24
+ pattern :fail_hard do |loom, facts|
25
+ loom.fail "`loom.fail`: Fail big or not at all"
26
+ end
27
+
28
+ desc "Expected to fail: Check timeout commands"
29
+ pattern :timeout_fail do |loom, facts|
30
+ loom.timeout(:timeout => 1) do
31
+ loom.x :sleep, 2
32
+ end
19
33
  end
20
34
  end
@@ -1,4 +1,5 @@
1
1
  # Tests for LoomExt::CoreMods::Package
2
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:files.loom
2
3
  module Files
3
4
  include Loom::Pattern
4
5
 
@@ -0,0 +1,3 @@
1
+ ---
2
+ - a.host.to.check
3
+ - my.other.host
data/spec/.loom/net.loom CHANGED
@@ -1,3 +1,4 @@
1
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:net.loom
1
2
  module Net
2
3
  include Loom::Pattern
3
4
 
@@ -1,5 +1,6 @@
1
1
  # Tests patterns nested at deeper module levels with contextual let, before, and
2
2
  # after hooks. Verifies hook order and contexts are set correctly.
3
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:pattern_context.loom
3
4
  module PatternContext
4
5
  module Parent
5
6
  include Loom::Pattern
data/spec/.loom/pkg.loom CHANGED
@@ -1,4 +1,5 @@
1
1
  # Tests for LoomExt::CoreMods::Package
2
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:pkg.loom
2
3
  module Package
3
4
  include Loom::Pattern
4
5
 
@@ -0,0 +1,23 @@
1
+ # Regression tests for issues that I've spent too much time debugging.
2
+ # These must be safe to run on localhost.
3
+ module Regression
4
+ include Loom::Pattern
5
+
6
+ # For some reason, weave glob expansion is more confusing than it should be.
7
+ weave :verify_no_glob_expansion, [
8
+ "regression:dummies:date",
9
+ "regression:dummies:echo",
10
+ ]
11
+
12
+ weave :verify_glob_expansion, [
13
+ "regression:dummies:*",
14
+ ]
15
+
16
+ module Dummies
17
+ include Loom::Pattern
18
+
19
+ pattern(:date) { |l, _| l.x :date }
20
+ pattern(:echo) { |l, _| l.x :echo, :hello }
21
+ pattern(:uptime) { |l, _| l.x :uptime }
22
+ end
23
+ end
@@ -1,3 +1,4 @@
1
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:shell.loom
1
2
  module Shell
2
3
  include Loom::Pattern
3
4
 
data/spec/.loom/test.loom CHANGED
@@ -1,12 +1,28 @@
1
1
  # TODO: add in test verifications that these tests are actually doing what
2
2
  # they're supposed to do.
3
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:test.loom
4
+ weave :smoke, [
5
+ :"test:*",
6
+ :uptime,
7
+ ]
3
8
 
4
- module Smoke
9
+ desc "a pattern with no namespace"
10
+ pattern(:uptime) { |loom, _| loom.x :uptime }
11
+
12
+ module Test
5
13
  include Loom::Pattern
6
14
 
7
- desc "Prints some known facts"
8
- report :three_facts do |loom, facts|
9
- facts
15
+ with_facts { |f| f.merge a_fact: :or_fiction? }
16
+ let(:a_fact_len) { |f| f[:a_fact].size }
17
+
18
+ desc "inspects the facts"
19
+ report :the_facts do |loom, facts|
20
+ loom.fail "this should not happen: #{a_fact_len}" unless a_fact_len == 11
21
+ end
22
+
23
+ desc "expects cli provided :param_facts"
24
+ pattern :param_facts do |loom, facts|
25
+ loom.fail "expected :param_facts" unless facts[:param_facts] == "from args"
10
26
  end
11
27
 
12
28
  desc "Reports `uptime` status"
@@ -28,6 +44,7 @@ module Smoke
28
44
  pattern :wrap_returns do |loom, facts|
29
45
  # using loom.time as a proxy for Shell::Core#wrap here
30
46
  loom.time do
47
+ # TODO: this should be loom.fail
31
48
  raise "wrapped true is not true" unless loom.test :true
32
49
  raise "wrapped false is not false" if loom.test :false
33
50
  end
data/spec/.loom/user.loom CHANGED
@@ -1,4 +1,5 @@
1
1
  # Tests for LoomExt::CoreMods::User
2
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:user.loom
2
3
  module User
3
4
  include Loom::Pattern
4
5
 
data/spec/.loom/vms.loom CHANGED
@@ -1,5 +1,6 @@
1
1
  # Tests for LoomExt::CoreMods::Vbox.
2
2
  # Currently disabled
3
+ # $ bx rspec spec/test_loom_spec.rb -f d -t file:vms.loom
3
4
  module VMs
4
5
  include Loom::Pattern
5
6
 
@@ -85,7 +85,7 @@ describe Loom::HostSpec do
85
85
  end
86
86
 
87
87
  context "ipv6 addresses" do
88
- let(:host_string) { "[2a02:120b:2c28:5920:6257:18ff:febf:13c8:22]" }
88
+ let(:host_string) { "[2a02:120b:2c28:5920:6257:18ff:febf:13c8]:22" }
89
89
 
90
90
  it "parses user@localhost configurations as remote" do
91
91
  expect(subject.is_localhost?).to be false
@@ -3,6 +3,7 @@ require "loom/pattern"
3
3
  require "loom/shell"
4
4
 
5
5
  describe Loom::Pattern::DSL do
6
+ extend LoomSpec::LoomInternalsHelper
6
7
 
7
8
  # Fake API for tests. This object should raise an error on any command
8
9
  # execution.
@@ -18,8 +19,8 @@ describe Loom::Pattern::DSL do
18
19
  config.log_device = @logger_io
19
20
  end
20
21
 
21
- @reference_set = Loom::Pattern::ReferenceSet::Builder
22
- .create(loom_file, ':loom_file')
22
+ @reference_set =
23
+ Loom::Pattern::ReferenceSet.builder(loom_file, ':loom_file').build
23
24
  end
24
25
 
25
26
  let(:pattern_under_test) { @reference_set['pattern_under_test'] }
@@ -15,7 +15,7 @@ module LoomSpec
15
15
 
16
16
  def create_reference_set(loom_file_src=nil, path: 'loom/file/path')
17
17
  loom_file_src ||= File.read(path)
18
- Loom::Pattern::ReferenceSet::Builder.create(loom_file_src, path)
18
+ Loom::Pattern::ReferenceSet::builder(loom_file_src, path).build
19
19
  end
20
20
 
21
21
  def capture_logs_to_io
@@ -15,6 +15,10 @@ describe "spec .loom files" do
15
15
  }
16
16
 
17
17
  EXPECTED_EXIT_CODE = {
18
+ # 100 to indicate failing patterns
19
+ # + 3 failed patterns
20
+ # ---
21
+ # 103 expected exit code
18
22
  "fail.loom" => 103
19
23
  }
20
24
 
@@ -25,53 +29,109 @@ describe "spec .loom files" do
25
29
 
26
30
  let(:host) { "rp0" }
27
31
  let(:patterns) { ref_set.slugs }
28
- let(:command) {[
29
- "bin/loom weave #{patterns.join " "}",
30
- "-t",
31
- "-l #{loom_file}",
32
- "-X log_level=info",
33
- "-H #{host}",
34
- "-V",
35
- "-X sshkit_log_level=warn",
36
- "-X log_device=stderr",
37
- "-X run_failure_strategy=cowboy",
38
- ]}
39
-
40
- # bundle exec rspec --tag smoke
41
- context "test.loom" do
42
- let(:loom_file) { LOOM_FILES.select { |p| p.match?(/test.loom/) }.first }
43
- let(:ref_set) { create_reference_set(path: loom_file) }
44
- let(:patterns) { ref_set.slugs.select { |s| s.match?(/^smoke:/) } }
45
- let(:host) { "localhost" }
46
-
47
- it "should pass a few tests quickly", :smoke => true do
48
- exec = command.join(' ')
49
- output = `#{exec}`
50
- expect($?.exitstatus).to eq 0
32
+ let(:command) { nil }
33
+
34
+ let(:executor) { lambda do |*cmd_parts|
35
+ cmd_exec = cmd_parts.join ' '
36
+ output = `#{cmd_exec} 2>&1`
37
+ OpenStruct.new({
38
+ cmd_exec: cmd_exec,
39
+ stdout: output,
40
+ rc: $?.exitstatus,
41
+ })
42
+ end }
43
+ let(:exec_result) { executor.call(*command) }
44
+
45
+ context "$ loom inventory", smoke: true do
46
+ let(:command) {[
47
+ "bin/loom inventory",
48
+ "-X loom_search_paths=./spec/.loom"
49
+ ]}
50
+
51
+ it "should list all hosts in inventory.yml" do
52
+ result = exec_result
53
+
54
+ ["a.host.to.check", "my.other.host"].each do |h|
55
+ expect(result.stdout).to match(/#{h}/), result.to_yaml
56
+ end
57
+ expect(result.rc).to eql 0
51
58
  end
52
59
  end
53
60
 
54
- # bundle exec rspec --tag integration
55
- LOOM_FILES.each do |loom_file|
56
- context File.basename loom_file do
57
- let(:loom_file) { loom_file }
61
+ context "$ loom pattern", smoke: true do
62
+ let(:command) {[
63
+ "bin/loom patterns",
64
+ "-l #{LOOM_FILES.join ','}"
65
+ ]}
66
+
67
+ it "should list all patterns to stdout" do
68
+ result = exec_result
69
+
70
+ # some expected pattern slug namespaces
71
+ ["pkg", "shell", "expectedfailures", "test"].each do |ns|
72
+ expect(result.stdout).to match(/^\s*#{ns}:.+/), result.to_yaml
73
+ end
74
+ expect(result.rc).to eql 0
75
+ end
76
+ end
77
+
78
+ context "$ loom weave" do
79
+
80
+ # Tests important command line flags
81
+ let(:command) {[
82
+ "bin/loom weave #{patterns.join " "}",
83
+ "-t",
84
+ "-l #{loom_file}",
85
+ "-X log_level=info",
86
+ "-H #{host}",
87
+ "-V",
88
+ "-X sshkit_log_level=warn",
89
+ "-X log_device=stderr",
90
+ "-X run_failure_strategy=cowboy",
91
+ "-F param_facts='from args'"
92
+ ]}
93
+
94
+ # bundle exec rspec --tag smoke
95
+ context "test.loom" do
96
+ let(:loom_file) { LOOM_FILES.select { |p| p.match?(/#{subject}/) }.first }
58
97
  let(:ref_set) { create_reference_set(path: loom_file) }
98
+ let(:patterns) { [:smoke] }
99
+ let(:host) { "localhost" }
100
+
101
+ it "should pass the smoke tests quickly", :smoke => true do
102
+ result = exec_result
103
+ unless result.rc == 0
104
+ puts "loom output:\n#{output}"
105
+ end
106
+ expect(result.rc).to eq(0), result.to_yaml
107
+ end
108
+ end
59
109
 
60
- if XFILE_SET[File.basename(loom_file)]
61
- xit "should pass all the tests",
62
- SPEC_TAGS.merge(:file => File.basename(loom_file)) {}
63
- else
64
- it "should pass all tests",
65
- SPEC_TAGS.merge(:file => File.basename(loom_file)) do
66
- exec = command.join(' ')
67
- puts exec
68
- # TODO pattern match the commands on STDOUT (see comment in
69
- # .loom/test.loom)
70
- output = `#{exec}`
71
-
72
- basename = File.basename(loom_file)
73
- expected_exit_code = EXPECTED_EXIT_CODE[basename] || 0
74
- expect($?.exitstatus).to eq expected_exit_code
110
+ # bundle exec rspec --tag integration
111
+ LOOM_FILES.each do |loom_file|
112
+ context File.basename loom_file do
113
+ let(:loom_file) { loom_file }
114
+ let(:ref_set) { create_reference_set(path: loom_file) }
115
+
116
+ if XFILE_SET[File.basename(loom_file)]
117
+ xit "should pass all the tests",
118
+ SPEC_TAGS.merge(:file => File.basename(loom_file)) {}
119
+ else
120
+ it "should pass all tests",
121
+ SPEC_TAGS.merge(:file => File.basename(loom_file)) do
122
+ exec = command.join(' ')
123
+ puts <<EOS
124
+ executing command:
125
+ $ #{exec}
126
+ EOS
127
+ # TODO pattern match the commands on STDOUT (see comment in
128
+ # .loom/test.loom)
129
+ output = `#{exec}`
130
+
131
+ basename = File.basename(loom_file)
132
+ expected_exit_code = EXPECTED_EXIT_CODE[basename] || 0
133
+ expect($?.exitstatus).to eq expected_exit_code
134
+ end
75
135
  end
76
136
  end
77
137
  end
data/test CHANGED
@@ -1,2 +1,17 @@
1
1
  #!/bin/sh
2
+ echo "running unit and smoke tests"
2
3
  bundle exec rspec --tag ~integration
4
+ rc=$?
5
+ if [ $rc -ne 0 ]; then
6
+ exit $rc
7
+ fi
8
+
9
+ y_or_Y="${1}"
10
+ if [ "${y_or_Y}" == "" ];then
11
+ read -p "run integration tests (y/n)?" y_or_Y
12
+ fi
13
+
14
+ case "$y_or_Y" in
15
+ y|Y ) bundle exec rspec --tag integration;;
16
+ * ) exit $rc;;
17
+ esac
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loom-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erick Johnson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-26 00:00:00.000000000 Z
11
+ date: 2024-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sshkit
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
19
+ version: '1.23'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: '1.23'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: commander
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.0.10
61
+ version: 1.0.16
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.0.10
68
+ version: 1.0.16
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bcrypt_pbkdf
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -110,16 +110,16 @@ dependencies:
110
110
  name: bundler
111
111
  requirement: !ruby/object:Gem::Requirement
112
112
  requirements:
113
- - - "~>"
113
+ - - ">="
114
114
  - !ruby/object:Gem::Version
115
- version: '1.13'
115
+ version: '0'
116
116
  type: :development
117
117
  prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
- - - "~>"
120
+ - - ">="
121
121
  - !ruby/object:Gem::Version
122
- version: '1.13'
122
+ version: '0'
123
123
  - !ruby/object:Gem::Dependency
124
124
  name: rake
125
125
  requirement: !ruby/object:Gem::Requirement
@@ -190,6 +190,20 @@ dependencies:
190
190
  - - ">="
191
191
  - !ruby/object:Gem::Version
192
192
  version: '0'
193
+ - !ruby/object:Gem::Dependency
194
+ name: rubocop
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
193
207
  description: Repeatable management of remote hosts over SSH
194
208
  email: ejohnson82@gmail.com
195
209
  executables:
@@ -199,17 +213,19 @@ extra_rdoc_files: []
199
213
  files:
200
214
  - ".gitignore"
201
215
  - ".rspec"
216
+ - ".rubocop.yml"
202
217
  - Gemfile
203
218
  - Gemfile.lock
204
219
  - Guardfile
205
220
  - Rakefile
206
221
  - bin/loom
222
+ - docs/architecture.jpg
223
+ - gentags.sh
207
224
  - lib/env/development.rb
208
225
  - lib/loom.rb
209
226
  - lib/loom/all.rb
210
227
  - lib/loom/config.rb
211
228
  - lib/loom/core_ext.rb
212
- - lib/loom/dsl.rb
213
229
  - lib/loom/facts.rb
214
230
  - lib/loom/facts/all.rb
215
231
  - lib/loom/facts/fact_file_provider.rb
@@ -231,10 +247,14 @@ files:
231
247
  - lib/loom/pattern/expanding_reference.rb
232
248
  - lib/loom/pattern/hook.rb
233
249
  - lib/loom/pattern/loader.rb
250
+ - lib/loom/pattern/pattern.rb
234
251
  - lib/loom/pattern/reference.rb
235
252
  - lib/loom/pattern/reference_set.rb
236
253
  - lib/loom/pattern/result_reporter.rb
237
254
  - lib/loom/runner.rb
255
+ - lib/loom/runner/all.rb
256
+ - lib/loom/runner/execution_context.rb
257
+ - lib/loom/runner/sshkit_connector.rb
238
258
  - lib/loom/shell.rb
239
259
  - lib/loom/shell/all.rb
240
260
  - lib/loom/shell/api.rb
@@ -262,21 +282,25 @@ files:
262
282
  - lib/loomext/coremods/package/package.rb
263
283
  - lib/loomext/coremods/systemd.rb
264
284
  - lib/loomext/coremods/systemd/all.rb
285
+ - lib/loomext/coremods/systemd/hostname.rb
265
286
  - lib/loomext/coremods/systemd/systemd.rb
266
287
  - lib/loomext/coremods/systemd/systemd_units.rb
267
288
  - lib/loomext/coremods/user.rb
268
289
  - lib/loomext/coremods/vm.rb
269
290
  - lib/loomext/coremods/vm/all.rb
270
291
  - lib/loomext/coremods/vm/vbox.rb
292
+ - loom.TAGS
271
293
  - loom.gemspec
272
294
  - loom/inventory.yml
273
295
  - scripts/harness.sh
274
296
  - spec/.loom/error_handling.loom
275
297
  - spec/.loom/fail.loom
276
298
  - spec/.loom/files.loom
299
+ - spec/.loom/inventory.yml
277
300
  - spec/.loom/net.loom
278
301
  - spec/.loom/pattern_context.loom
279
302
  - spec/.loom/pkg.loom
303
+ - spec/.loom/regression.loom
280
304
  - spec/.loom/shell.loom
281
305
  - spec/.loom/test.loom
282
306
  - spec/.loom/user.loom
@@ -297,11 +321,11 @@ files:
297
321
  - spec/systemd.loom
298
322
  - spec/test_loom_spec.rb
299
323
  - test
300
- homepage:
324
+ homepage:
301
325
  licenses:
302
326
  - MIT
303
327
  metadata: {}
304
- post_install_message:
328
+ post_install_message:
305
329
  rdoc_options: []
306
330
  require_paths:
307
331
  - lib
@@ -316,9 +340,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
316
340
  - !ruby/object:Gem::Version
317
341
  version: '0'
318
342
  requirements: []
319
- rubyforge_project:
320
- rubygems_version: 2.7.7
321
- signing_key:
343
+ rubygems_version: 3.5.22
344
+ signing_key:
322
345
  specification_version: 4
323
346
  summary: Repeatable management of remote hosts over SSH
324
347
  test_files: