org-converge 0.0.2 → 0.0.3
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.
- data/TODO +9 -4
- data/bin/org-converge +1 -1
- data/examples/fluentd/setup.org +46 -15
- data/lib/org-converge/babel.rb +20 -13
- data/lib/org-converge/babel_output_buffer.rb +10 -4
- data/lib/org-converge/command.rb +45 -7
- data/lib/org-converge/engine.rb +1 -2
- data/lib/org-converge/version.rb +1 -1
- data/spec/converge_examples/basic_run_example/setup.org +2 -0
- data/spec/converge_examples/basic_tangle/setup.org +7 -0
- data/spec/converge_examples/runlist_example/setup.org +15 -0
- data/spec/converge_spec.rb +47 -17
- metadata +10 -8
data/TODO
CHANGED
@@ -2,8 +2,9 @@
|
|
2
2
|
#+TODO: TODO | DONE CANCELED
|
3
3
|
#+startup: showeverything
|
4
4
|
|
5
|
-
* [/] 0.0.4 version
|
5
|
+
* [0/6] 0.0.4 version
|
6
6
|
|
7
|
+
- [ ] Support runlists notifications via =#+NAME:=
|
7
8
|
- [ ] Macros can be loaded and applied to the configuration
|
8
9
|
- [ ] Actually support converging and idempotency
|
9
10
|
+ Do not do an operation unless it is required
|
@@ -12,10 +13,13 @@
|
|
12
13
|
- [ ] Heuristics for determining which binary to use for running the script
|
13
14
|
- [ ] Display how the run would look like without making changes
|
14
15
|
: org-converge setupfile.org --dry-run
|
16
|
+
- [ ] Use :eval for evaling blocks (off by default)
|
17
|
+
- [ ] Can use :dir for running a process relative to that directory
|
15
18
|
|
16
|
-
* [
|
19
|
+
* [2/2] 0.0.3 version
|
17
20
|
|
18
|
-
- [
|
21
|
+
- [X] Support sequential and parallel execution
|
22
|
+
- [X] Can use :mkdirp for 0644 permissions
|
19
23
|
|
20
24
|
* [2/2] 0.0.2 version of org-converge
|
21
25
|
|
@@ -35,7 +39,7 @@ Need some basic functionality of what Org babel offers first.
|
|
35
39
|
- [X] ~--tangle~ flag
|
36
40
|
- [X] Support a root dir for when not running relative to the directory
|
37
41
|
|
38
|
-
* [1/
|
42
|
+
* [1/19] Ideas
|
39
43
|
** CANCELED How to set the permissions from the directory from the file that is being tangled when it does not exists?
|
40
44
|
|
41
45
|
By default, this would be 0644, but we also need to specify the
|
@@ -51,6 +55,7 @@ until I can think of something better.
|
|
51
55
|
|
52
56
|
http://orgmode.org/manual/Specific-header-arguments.html#Specific-header-arguments
|
53
57
|
|
58
|
+
** TODO Use sshkit for running remote processes
|
54
59
|
** TODO We don't need to create the directories in most cases (:mkdirp yes)
|
55
60
|
|
56
61
|
Something like this is not required because the ~:tangle~ blocks
|
data/bin/org-converge
CHANGED
@@ -8,7 +8,7 @@ doc = <<OPTIONS
|
|
8
8
|
org-converge: A light configuration management tool for Org mode
|
9
9
|
|
10
10
|
Usage:
|
11
|
-
org-converge <org_file> [--tangle] [--showfiles] [--log=<logfile>] [--root-dir=<root_dir>]
|
11
|
+
org-converge <org_file> [--tangle] [--showfiles] [--log=<logfile>] [--root-dir=<root_dir>] [--runmode=<runmode>]
|
12
12
|
|
13
13
|
Options:
|
14
14
|
|
data/examples/fluentd/setup.org
CHANGED
@@ -6,21 +6,26 @@
|
|
6
6
|
|
7
7
|
The following will setup and configure ~fluentd~ on a node.
|
8
8
|
|
9
|
-
* Settings
|
10
|
-
|
11
|
-
These can be defined with Org mode macro directives, but thinking on
|
12
|
-
other ways to do it as well.
|
13
|
-
|
14
|
-
#+macro: fluentd_port 4224
|
15
|
-
#+macro: fluentd_filepath here.log
|
16
|
-
|
17
9
|
* Setup :setup:
|
18
10
|
|
19
11
|
Fluentd can be installed either as a package from treasure data or
|
20
12
|
just as a gem. In this example, we only install as a gem:
|
21
13
|
|
22
|
-
|
23
|
-
|
14
|
+
# Fails because of permissions
|
15
|
+
#+begin_src sh :shebang #!/bin/bash
|
16
|
+
gem list | grep fluentd
|
17
|
+
fluentd_installed=$?
|
18
|
+
if [ $fluentd_installed -ne 0 ]; then
|
19
|
+
echo "Installing fluentd...";
|
20
|
+
gem install fluentd
|
21
|
+
fi
|
22
|
+
|
23
|
+
gem list | grep fluent-logger
|
24
|
+
fluentd_logger_installed=$?
|
25
|
+
if [ $fluentd_logger_installed -ne 0 ]; then
|
26
|
+
echo "Installing fluent-logger for Ruby...";
|
27
|
+
gem install fluent-logger
|
28
|
+
fi
|
24
29
|
#+end_src
|
25
30
|
|
26
31
|
* Configuration :config:
|
@@ -28,23 +33,49 @@ gem install fluentd
|
|
28
33
|
Set Fluentd to listen on the ~fluentd_port~ port and to write logs
|
29
34
|
to ~fluentd_filepath~.
|
30
35
|
|
31
|
-
#+begin_src conf :tangle
|
36
|
+
#+begin_src conf :tangle fluentd.conf
|
32
37
|
<source>
|
33
38
|
type forward
|
34
|
-
port
|
39
|
+
port 4224
|
35
40
|
</source>
|
36
41
|
|
37
42
|
<match **>
|
38
43
|
type file
|
39
|
-
path
|
44
|
+
path here.log
|
45
|
+
flush_interval 0s
|
40
46
|
</match>
|
41
47
|
#+end_src
|
42
48
|
|
43
49
|
# A script to daemonize the process could be written here, as well as
|
44
50
|
# any /etc/default/* required settings...
|
45
51
|
|
52
|
+
* Flusher
|
53
|
+
|
54
|
+
Send some logs:
|
55
|
+
|
56
|
+
#+begin_src ruby :shebang #!/usr/local/bin/ruby
|
57
|
+
require 'fluent-logger'
|
58
|
+
|
59
|
+
sleep 2 # Wait for fluentd to start at the beginning
|
60
|
+
|
61
|
+
Fluent::Logger::FluentLogger.open(nil, :host => 'localhost', :port => 4224)
|
62
|
+
|
63
|
+
100.times do |n|
|
64
|
+
Fluent::Logger.post("myapp.access", {"agent"=>"foo - #{n}"})
|
65
|
+
sleep 0.1
|
66
|
+
end
|
67
|
+
#+end_src
|
68
|
+
|
69
|
+
* Tailer
|
70
|
+
|
71
|
+
And yet another process which will be tailing the file that we are sending logs too:
|
72
|
+
|
73
|
+
#+begin_src sh :shebang #!/bin/bash
|
74
|
+
tail -f here.*
|
75
|
+
#+end_src
|
76
|
+
|
46
77
|
* Start which was configured here :start:
|
47
78
|
|
48
|
-
#+begin_src
|
49
|
-
fluentd -c
|
79
|
+
#+begin_src bash :shebang #!/bin/bash
|
80
|
+
fluentd -c fluentd.conf -vvv
|
50
81
|
#+end_src
|
data/lib/org-converge/babel.rb
CHANGED
@@ -16,25 +16,33 @@ module Orgmode
|
|
16
16
|
@root_dir = options[:root_dir]
|
17
17
|
end
|
18
18
|
|
19
|
-
# TODO: should be able to tangle relatively to a dir
|
20
19
|
def tangle!
|
21
20
|
logger.info "Tangling #{ob.tangle.keys.count} files..."
|
22
21
|
|
23
|
-
ob.tangle.each do |tangle_file,
|
22
|
+
ob.tangle.each do |tangle_file, script|
|
24
23
|
file = if @root_dir
|
25
24
|
File.join(@root_dir, tangle_file)
|
26
25
|
else
|
27
26
|
tangle_file
|
28
27
|
end
|
29
28
|
|
30
|
-
logger.info "BEGIN(#{tangle_file}): Tangling #{lines.count} lines at '#{file}'"
|
31
|
-
# TODO: should abort when the directory does not exists
|
32
|
-
# Org mode blocks have :mkdirp true
|
29
|
+
logger.info "BEGIN(#{tangle_file}): Tangling #{script[:lines].split('\n').count} lines at '#{file}'"
|
33
30
|
# TODO: should abort when the directory failed because of permissions
|
34
31
|
# TODO: should apply :tangle-mode for permissions
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
directory = File.expand_path(File.dirname(file))
|
33
|
+
if not Dir.exists?(directory)
|
34
|
+
begin
|
35
|
+
if script[:header][:mkdirp] == 'true'
|
36
|
+
p script
|
37
|
+
logger.info "Create dir for #{file} since it does not exists..."
|
38
|
+
FileUtils.mkdir_p(File.dirname(file), :mode => 0755)
|
39
|
+
else
|
40
|
+
logger.warn "Cannot tangle #{file} because directory does not exists!"
|
41
|
+
end
|
42
|
+
rescue => e
|
43
|
+
p e
|
44
|
+
raise TangleError
|
45
|
+
end
|
38
46
|
end
|
39
47
|
|
40
48
|
if File.exists?(file)
|
@@ -43,7 +51,7 @@ module Orgmode
|
|
43
51
|
|
44
52
|
begin
|
45
53
|
File.open(file, 'w') do |f|
|
46
|
-
lines.
|
54
|
+
script[:lines].each_line do |line|
|
47
55
|
f.puts line
|
48
56
|
end
|
49
57
|
end
|
@@ -64,11 +72,10 @@ module Orgmode
|
|
64
72
|
|
65
73
|
ob.scripts.each_pair do |script_key, script|
|
66
74
|
file = script_key.to_s
|
67
|
-
if File.exists?(file)
|
68
|
-
logger.warn "File already exists at #{file}, it will be overwritten"
|
69
|
-
end
|
75
|
+
logger.warn "File already exists at #{file}, it will be overwritten" if File.exists?(file)
|
70
76
|
|
71
|
-
|
77
|
+
# Files with :shebang are executable by default
|
78
|
+
File.open(File.join(run_dir, file), 'w', 0755) do |f|
|
72
79
|
script[:lines].each_line do |line|
|
73
80
|
f.puts line
|
74
81
|
end
|
@@ -8,7 +8,7 @@ module Orgmode
|
|
8
8
|
|
9
9
|
# ~@tangle~ files are put in the right path
|
10
10
|
# : @tangle['/path'] = [Lines]
|
11
|
-
@tangle = Hash.new {|h,k| h[k] =
|
11
|
+
@tangle = Hash.new {|h,k| h[k] = {:lines => '', :header => {}, :lang => ''}}
|
12
12
|
|
13
13
|
# ~@scripts~ are tangled in order and ran
|
14
14
|
# : @scripts = [text, text, ...]
|
@@ -18,7 +18,7 @@ module Orgmode
|
|
18
18
|
@buffer = ''
|
19
19
|
end
|
20
20
|
|
21
|
-
def push_mode(mode, indent)
|
21
|
+
def push_mode(mode, indent)
|
22
22
|
super(mode, indent)
|
23
23
|
end
|
24
24
|
|
@@ -34,13 +34,19 @@ module Orgmode
|
|
34
34
|
case
|
35
35
|
when line.block_header_arguments[':tangle']
|
36
36
|
@current_tangle = line.block_header_arguments[':tangle']
|
37
|
+
@tangle[@current_tangle][:header] = {
|
38
|
+
:shebang => line.block_header_arguments[':shebang'],
|
39
|
+
:mkdirp => line.block_header_arguments[':mkdirp']
|
40
|
+
}
|
41
|
+
@tangle[@current_tangle][:lang] = line.block_lang
|
37
42
|
when line.block_header_arguments[':shebang']
|
38
43
|
@current_tangle = nil
|
39
44
|
@buffer = ''
|
40
45
|
|
41
46
|
# Need to keep track of the options from a block before running it
|
42
47
|
@scripts[@scripts_counter][:header] = {
|
43
|
-
:shebang => line.block_header_arguments[':shebang']
|
48
|
+
:shebang => line.block_header_arguments[':shebang'],
|
49
|
+
:mkdirp => line.block_header_arguments[':mkdirp']
|
44
50
|
}
|
45
51
|
@scripts[@scripts_counter][:lang] = line.block_lang
|
46
52
|
|
@@ -52,7 +58,7 @@ module Orgmode
|
|
52
58
|
case
|
53
59
|
when (line.assigned_paragraph_type == :code and @current_tangle)
|
54
60
|
# Need to keep track of the current tangle to buffer its lines
|
55
|
-
@tangle[@current_tangle] << line
|
61
|
+
@tangle[@current_tangle][:lines] << line.output_text << "\n"
|
56
62
|
when (line.assigned_paragraph_type == :code)
|
57
63
|
# When a tangle is not going on, it means that the lines would go
|
58
64
|
# into a runnable script
|
data/lib/org-converge/command.rb
CHANGED
@@ -10,7 +10,11 @@ module OrgConverge
|
|
10
10
|
@dotorg = options['<org_file>']
|
11
11
|
@logger = Logger.new(options['--log'] || STDOUT)
|
12
12
|
@root_dir = options['--root-dir']
|
13
|
-
@run_dir =
|
13
|
+
@run_dir = if @root_dir
|
14
|
+
File.expand_path(File.join(@root_dir, 'run'))
|
15
|
+
else
|
16
|
+
File.expand_path('run')
|
17
|
+
end
|
14
18
|
@ob = Orgmode::Parser.new(File.read(dotorg)).babelize
|
15
19
|
@babel = nil
|
16
20
|
end
|
@@ -33,7 +37,16 @@ module OrgConverge
|
|
33
37
|
|
34
38
|
def converge!
|
35
39
|
tangle!
|
36
|
-
|
40
|
+
case @options['--runmode']
|
41
|
+
when 'parallel'
|
42
|
+
run_blocks_in_parallel!
|
43
|
+
when 'sequential'
|
44
|
+
run_blocks_sequentially!
|
45
|
+
when 'runlist'
|
46
|
+
# TODO
|
47
|
+
else
|
48
|
+
run_blocks_in_parallel!
|
49
|
+
end
|
37
50
|
end
|
38
51
|
|
39
52
|
def tangle!
|
@@ -42,9 +55,29 @@ module OrgConverge
|
|
42
55
|
logger.error "Cannot converge because there were errors during tangle step".red
|
43
56
|
end
|
44
57
|
|
58
|
+
def run_blocks_sequentially!
|
59
|
+
@engine = OrgConverge::Engine.new(:logger => @logger, :babel => @babel)
|
60
|
+
babel.tangle_runnable_blocks!(@run_dir)
|
61
|
+
|
62
|
+
runlist_stack = []
|
63
|
+
babel.ob.scripts.each do |key, script|
|
64
|
+
runlist_stack << [key, script]
|
65
|
+
end
|
66
|
+
|
67
|
+
while not runlist_stack.empty?
|
68
|
+
key, script = runlist_stack.shift
|
69
|
+
with_running_engine do |engine|
|
70
|
+
file = File.expand_path("#{@run_dir}/#{key}")
|
71
|
+
cmd = "#{script[:lang]} #{file}"
|
72
|
+
engine.register script[:lang], cmd, { :cwd => @root_dir, :logger => logger }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
logger.info "Run has completed successfully.".green
|
76
|
+
end
|
77
|
+
|
45
78
|
# TODO: Too much foreman has made this running blocks in parallel the default behavior.
|
46
79
|
# We should actually be supporting run lists instead, but liking this experiment so far.
|
47
|
-
def
|
80
|
+
def run_blocks_in_parallel!
|
48
81
|
@engine = OrgConverge::Engine.new(:logger => @logger, :babel => @babel)
|
49
82
|
babel.tangle_runnable_blocks!(@run_dir)
|
50
83
|
babel.ob.scripts.each do |key, script|
|
@@ -54,6 +87,13 @@ module OrgConverge
|
|
54
87
|
end
|
55
88
|
logger.info "Running code blocks now! (#{babel.ob.scripts.count} runnable blocks found in total)"
|
56
89
|
@engine.start
|
90
|
+
logger.info "Run has completed successfully.".green
|
91
|
+
end
|
92
|
+
|
93
|
+
def with_running_engine
|
94
|
+
engine = OrgConverge::Engine.new(:logger => @logger, :babel => @babel)
|
95
|
+
yield engine
|
96
|
+
engine.start
|
57
97
|
end
|
58
98
|
|
59
99
|
def babel
|
@@ -61,11 +101,9 @@ module OrgConverge
|
|
61
101
|
end
|
62
102
|
|
63
103
|
def showfiles
|
64
|
-
ob.tangle.each do |file,
|
104
|
+
ob.tangle.each do |file, block|
|
65
105
|
puts "---------- #{file} --------------".green
|
66
|
-
lines
|
67
|
-
puts line
|
68
|
-
end
|
106
|
+
puts block[:lines]
|
69
107
|
end
|
70
108
|
|
71
109
|
ob.scripts.each do |index, block|
|
data/lib/org-converge/engine.rb
CHANGED
@@ -25,9 +25,8 @@ module OrgConverge
|
|
25
25
|
watch_for_output
|
26
26
|
sleep 0.1
|
27
27
|
begin
|
28
|
-
status = watch_for_termination
|
28
|
+
status = watch_for_termination
|
29
29
|
end while @running.count > 0
|
30
|
-
logger.info "Run has completed successfully.".green
|
31
30
|
end
|
32
31
|
|
33
32
|
# Overriden: we do not consider process formations
|
data/lib/org-converge/version.rb
CHANGED
@@ -6,6 +6,7 @@ with all output being flushed to the screen.
|
|
6
6
|
- Count some numbers with bash
|
7
7
|
|
8
8
|
#+begin_src sh :shebang #!/bin/bash
|
9
|
+
echo '' > out.log
|
9
10
|
for i in `seq 1 5`; do
|
10
11
|
echo "Writing! $i"
|
11
12
|
echo "hello $i" >> out.log
|
@@ -16,6 +17,7 @@ with all output being flushed to the screen.
|
|
16
17
|
- Count some numbers with ruby
|
17
18
|
|
18
19
|
#+begin_src ruby :shebang #!/usr/bin/ruby
|
20
|
+
sleep 0.2
|
19
21
|
10.times do |n|
|
20
22
|
puts "And now writing! #{n}"
|
21
23
|
File.open("out.log", "a") {|f| f.puts "Hello again #{n}" }
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# -*- mode: org; mode: auto-fill; -*-
|
2
|
+
#+TITLE: Runlist example
|
3
|
+
|
4
|
+
In this example, we will have scripts being chained one after another.
|
5
|
+
|
6
|
+
#+begin_src sh :shebang #!/bin/bash
|
7
|
+
sleep 5
|
8
|
+
echo "first" > out.log
|
9
|
+
#+end_src
|
10
|
+
|
11
|
+
The script below will only be called once the one above is run.
|
12
|
+
|
13
|
+
#+begin_src ruby :shebang #!/usr/local/bin/ruby
|
14
|
+
File.open("out.log", 'a') {|f| f.puts "second" }
|
15
|
+
#+end_src
|
data/spec/converge_spec.rb
CHANGED
@@ -1,28 +1,58 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe OrgConverge::Command do
|
4
|
-
context "when converging 'basic_tangle'" do
|
5
|
-
example_dir = File.join(EXAMPLES_DIR, 'basic_tangle')
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
o = OrgConverge::Command.new({
|
10
|
-
'<org_file>' => setup_file,
|
11
|
-
'--root-dir' => example_dir
|
12
|
-
})
|
13
|
-
success = o.execute!
|
14
|
-
success.should == true
|
5
|
+
it "should converge 'basic_tangle'" do
|
6
|
+
example_dir = File.join(EXAMPLES_DIR, 'basic_tangle')
|
15
7
|
|
16
|
-
|
8
|
+
setup_file = File.join(example_dir, 'setup.org')
|
9
|
+
o = OrgConverge::Command.new({
|
10
|
+
'<org_file>' => setup_file,
|
11
|
+
'--root-dir' => example_dir
|
12
|
+
})
|
13
|
+
success = o.execute!
|
14
|
+
success.should == true
|
17
15
|
|
18
|
-
|
19
|
-
|
16
|
+
expected_contents = File.read(File.join(example_dir, 'conf.yml.expected'))
|
17
|
+
resulting_file = File.join(example_dir, 'conf.yml')
|
18
|
+
File.exists?(resulting_file).should == true
|
20
19
|
|
21
|
-
|
20
|
+
result = File.read(resulting_file)
|
21
|
+
result.should == expected_contents
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
resulting_file = File.join(example_dir, 'config/hello.yml')
|
24
|
+
File.exists?(resulting_file).should == true
|
25
25
|
end
|
26
|
-
end
|
27
26
|
|
27
|
+
it "should converge 'basic_run_example'" do
|
28
|
+
example_dir = File.join(EXAMPLES_DIR, 'basic_run_example')
|
29
|
+
setup_file = File.join(example_dir, 'setup.org')
|
30
|
+
o = OrgConverge::Command.new({
|
31
|
+
'<org_file>' => setup_file,
|
32
|
+
'--root-dir' => example_dir
|
33
|
+
})
|
34
|
+
success = o.execute!
|
35
|
+
success.should == true
|
36
|
+
|
37
|
+
expected_contents = File.read(File.join(example_dir, 'out.log'))
|
38
|
+
expected_contents.lines.count.should == 16
|
39
|
+
end
|
28
40
|
|
41
|
+
it "should converge 'runlist_example' sequentially" do
|
42
|
+
example_dir = File.join(EXAMPLES_DIR, 'runlist_example')
|
43
|
+
setup_file = File.join(example_dir, 'setup.org')
|
44
|
+
|
45
|
+
o = OrgConverge::Command.new({
|
46
|
+
'<org_file>' => setup_file,
|
47
|
+
'--root-dir' => example_dir,
|
48
|
+
'--runmode' => 'sequential'
|
49
|
+
})
|
50
|
+
success = o.execute!
|
51
|
+
success.should == true
|
52
|
+
|
53
|
+
File.executable?(File.join(example_dir, 'run/0')).should == true
|
54
|
+
File.executable?(File.join(example_dir, 'run/1')).should == true
|
55
|
+
expected_contents = "first\nsecond\n"
|
56
|
+
File.read(File.join(example_dir, 'out.log')).should == expected_contents
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: org-converge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: docopt
|
16
|
-
requirement: &
|
16
|
+
requirement: &70113563924580 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - =
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.5.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70113563924580
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: org-ruby
|
27
|
-
requirement: &
|
27
|
+
requirement: &70113563923840 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.9.2
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70113563923840
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: foreman
|
38
|
-
requirement: &
|
38
|
+
requirement: &70113563921200 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 0.63.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70113563921200
|
47
47
|
description: A light configuration management tool for Org mode
|
48
48
|
email:
|
49
49
|
- waldemar.quevedo@gmail.com
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- spec/converge_examples/basic_run_example/setup.org
|
76
76
|
- spec/converge_examples/basic_tangle/conf.yml.expected
|
77
77
|
- spec/converge_examples/basic_tangle/setup.org
|
78
|
+
- spec/converge_examples/runlist_example/setup.org
|
78
79
|
- spec/converge_spec.rb
|
79
80
|
- spec/spec_helper.rb
|
80
81
|
homepage: https://github.com/wallyqs/org-converge
|
@@ -106,6 +107,7 @@ test_files:
|
|
106
107
|
- spec/converge_examples/basic_run_example/setup.org
|
107
108
|
- spec/converge_examples/basic_tangle/conf.yml.expected
|
108
109
|
- spec/converge_examples/basic_tangle/setup.org
|
110
|
+
- spec/converge_examples/runlist_example/setup.org
|
109
111
|
- spec/converge_spec.rb
|
110
112
|
- spec/spec_helper.rb
|
111
113
|
has_rdoc:
|