bow 0.5.0 → 0.5.2
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.
- checksums.yaml +4 -4
- data/README.md +80 -61
- data/bow.gemspec +7 -7
- data/lib/bow/command.rb +0 -2
- data/lib/bow/commands/apply.rb +4 -4
- data/lib/bow/commands/exec.rb +0 -3
- data/lib/bow/commands/prepare.rb +4 -3
- data/lib/bow/config.rb +1 -1
- data/lib/bow/inventory_example.rb +6 -2
- data/lib/bow/locker.rb +4 -4
- data/lib/bow/memorable.rb +0 -4
- data/lib/bow/options.rb +1 -1
- data/lib/bow/rake.rb +6 -3
- data/lib/bow/response_formatter.rb +6 -0
- data/lib/bow/ssh/rsync.rb +4 -4
- data/lib/bow/ssh/scp.rb +8 -3
- data/lib/bow/ssh_helper.rb +12 -4
- data/lib/bow/version.rb +1 -1
- data/src/{preprovision.sh → provision.sh} +8 -3
- metadata +21 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a81e49b3e892737818ee914200b4ebbf04283c4d
|
4
|
+
data.tar.gz: b4f833f16d08c74f0c336af66ed8f3184c2182e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03dfe12d59d54390c2d6267d82a0deb9d18c7cb589400a9365f0425c33fb59b0404320016e0dbd8570835771899525a7532a724b158e51f489da7ab3591b3ada
|
7
|
+
data.tar.gz: d4a5c7e31dbbae4bf6d504e869f26ba0ccd688b610bff0564d09245c7cd898d41ce073d30a1d84e35994edb01c5cbdadc4d8b4ea2d1e10bb1a97577ac68175c4
|
data/README.md
CHANGED
@@ -4,57 +4,54 @@
|
|
4
4
|
|
5
5
|
[](https://travis-ci.org/zinovyev/bow)
|
6
6
|
|
7
|
-
|
7
|
+
[](https://badge.fury.io/rb/bow)
|
8
8
|
|
9
|
-
Bow is a system that allows you to write Rake tasks and execute them remotely
|
10
|
-
to provision and configure you servers.
|
11
9
|
|
12
|
-
##
|
10
|
+
## About
|
13
11
|
|
14
|
-
|
12
|
+
Bow doesn't bring its own DSL to live, rather it uses regular Rake tasks
|
13
|
+
instead.
|
15
14
|
|
16
|
-
|
17
|
-
And I actually like a couple of them too.
|
15
|
+
It can be handy for you if:
|
18
16
|
|
19
|
-
|
20
|
-
really want to create a complex infrastructure (I don't want to create any
|
21
|
-
infrastructure to be honest) for it and I like to do it in Ruby (well, maybe
|
22
|
-
in Bash and Ruby).
|
17
|
+
* you need to configure a pure system of 2-5 VPSs;
|
23
18
|
|
24
|
-
|
25
|
-
in Ruby. And it's called Rake.
|
19
|
+
* you don't want to build a complex infrastructure;
|
26
20
|
|
27
|
-
|
28
|
-
uses Rake instead.
|
21
|
+
* you are already familiar with Rake and don't want to to learn Python;
|
29
22
|
|
30
|
-
## Usage
|
31
23
|
|
32
|
-
|
24
|
+
## Installation
|
33
25
|
|
34
|
-
|
26
|
+
Download and install bow with the following.
|
35
27
|
|
36
28
|
```bash
|
37
29
|
|
38
|
-
gem install bow
|
30
|
+
gem install bow
|
39
31
|
|
40
|
-
```
|
32
|
+
```
|
41
33
|
|
42
|
-
3. Create an empty folder and init a basic structure there:
|
43
34
|
|
44
|
-
|
35
|
+
## Usage
|
45
36
|
|
46
|
-
|
37
|
+
First of all. If you're not familiar with Rake and Rake tasks, take a look at
|
38
|
+
this pages: [Rake docs](https://ruby.github.io/rake/) and [Rake home](https://github.com/ruby/rake). It can be a good place to start from.
|
47
39
|
|
48
|
-
cd ~/bow-test
|
49
40
|
|
50
|
-
|
41
|
+
### Project structure
|
51
42
|
|
52
|
-
|
43
|
+
The basic bow project consists of two files: `Rakefile` and `targets.json`.
|
44
|
+
|
45
|
+
Run `bow init` which will generate an example project structure to give you a
|
46
|
+
basic understanding of how to write your own configuration.
|
47
|
+
|
48
|
+
Sometimes it can be convinient to put tasks to separate files into the
|
49
|
+
[rakelib](https://ruby.github.io/rake/doc/rakefile_rdoc.html#label-Multiple+Rake+Files)
|
50
|
+
folder. So Rake will automatically autoload them.
|
53
51
|
|
54
|
-
4. The command `bow init` called above created a bare structure wich consits
|
55
|
-
of a `Rakefile` and a list of targets (managed servers) in `targets.json` file.
|
56
52
|
|
57
|
-
|
53
|
+
**targets.json** contains a list of hosts grouped in categories:
|
54
|
+
|
58
55
|
|
59
56
|
```json
|
60
57
|
|
@@ -71,11 +68,13 @@ The example targets file contains 4 IPs combined in two managed groups:
|
|
71
68
|
|
72
69
|
```
|
73
70
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
71
|
+
|
72
|
+
**Rakefile** is actually an ordinary Rakefile) which contains several tasks
|
73
|
+
for provisioning packed in namespaces which are called by the name of the server
|
74
|
+
groups from the `targets.json` file.
|
75
|
+
|
76
|
+
The main task of the group MUST always be called **provision** and can be bound
|
77
|
+
to any number of additional tasks.
|
79
78
|
|
80
79
|
|
81
80
|
```ruby
|
@@ -100,7 +99,8 @@ namespace :example_group2 do
|
|
100
99
|
task provision: :print_hello do
|
101
100
|
end
|
102
101
|
|
103
|
-
|
102
|
+
# Change enabled value to "false" to run the reverting task (:print_goodbye)
|
103
|
+
flow enabled: true, revert_task: :print_goodbye
|
104
104
|
task :print_hello do
|
105
105
|
sh 'echo "Hello from example group #2 server!"'
|
106
106
|
end
|
@@ -112,45 +112,64 @@ end
|
|
112
112
|
|
113
113
|
```
|
114
114
|
|
115
|
-
5. Now run `bow apply` and your provisioning tasks will be executed on servers
|
116
|
-
listed in `targets.json` file;
|
117
115
|
|
118
|
-
|
116
|
+
###Commands
|
119
117
|
|
120
|
-
## Task flow
|
121
118
|
|
122
|
-
|
123
|
-
client server too. So you will be able to use a little Rake DSL enhancement
|
124
|
-
wich bring a better controll of the flow of your tasks.
|
119
|
+
To **check the availability** of all configured hosts run:
|
125
120
|
|
126
|
-
The only thing you will be needed to do afterwards to enable the feature is to
|
127
|
-
require it by putting `require bow/rake` to the top of your `Rakefile`.
|
128
121
|
|
129
|
-
|
122
|
+
```bash
|
130
123
|
|
131
|
-
|
124
|
+
bow ping
|
132
125
|
|
133
|
-
|
134
|
-
task :simple_task do
|
135
|
-
# some code here ...
|
136
|
-
end
|
126
|
+
```
|
137
127
|
|
138
|
-
|
139
|
-
|
140
|
-
|
128
|
+
To **prepare soft on client** needed for bow to run
|
129
|
+
(Ruby and 2 gems: rake and bow) execute
|
130
|
+
|
131
|
+
```bash
|
132
|
+
|
133
|
+
bow prepare
|
141
134
|
|
142
135
|
```
|
143
136
|
|
144
|
-
|
137
|
+
To **apply configured provision** run:
|
138
|
+
|
139
|
+
```bash
|
140
|
+
|
141
|
+
bow apply
|
142
|
+
|
143
|
+
```
|
144
|
+
|
145
|
+
To explore more options and commands run:
|
146
|
+
|
147
|
+
```bash
|
148
|
+
|
149
|
+
bow -h
|
150
|
+
|
151
|
+
```
|
152
|
+
|
153
|
+
|
154
|
+
### Flow
|
155
|
+
|
156
|
+
Command **flow** from the upper example is a little extension added by the bow
|
157
|
+
gem which allows you to controll the flow of the task. It consists of 3 options:
|
158
|
+
|
159
|
+
* `run: :once` or `run: :always` sets the condition on how many times to run
|
160
|
+
the task;
|
145
161
|
|
146
|
-
* `
|
147
|
-
be
|
162
|
+
* `enabled: true` or `enabled: false` wich takes a boolean value allows you to
|
163
|
+
disable the task so it can be ommited or reverted (if a reverting task
|
164
|
+
is given);
|
148
165
|
|
149
|
-
* `
|
150
|
-
|
166
|
+
* `revert: task_name` wich defines a task that can revert changes done
|
167
|
+
by the original task when the original task is disabled (by `enabled: false`
|
168
|
+
option). Actually it's something similar to the down migration when dealing
|
169
|
+
with ActiveRecord;
|
151
170
|
|
152
|
-
* `revert` wich defines a task that can revert changes done by the original
|
153
|
-
task when the original task is disabled (by `enabled: false` option). Actually
|
154
|
-
it's something similar to the down migration when dealing with databases;
|
155
171
|
|
172
|
+
### Run the example
|
156
173
|
|
174
|
+
To run the example locally this [Vagrantfile](doc/Vagrantfile) can be used to create a
|
175
|
+
testing environment.
|
data/bow.gemspec
CHANGED
@@ -6,8 +6,9 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = 'bow'
|
7
7
|
s.version = Bow::VERSION
|
8
8
|
s.date = Time.now.strftime('%Y-%m-%d')
|
9
|
-
s.summary =
|
10
|
-
|
9
|
+
s.summary = "Automate your infrastructure provisioning \\
|
10
|
+
and configuration with Rake."
|
11
|
+
s.description = s.summary
|
11
12
|
s.authors = ['Zinovyev Ivan']
|
12
13
|
s.email = 'zinovyev.id@gmail.com'
|
13
14
|
s.files = `git ls-files -z`.split("\x0").reject do |f|
|
@@ -16,9 +17,8 @@ Gem::Specification.new do |s|
|
|
16
17
|
s.executables << 'bow'
|
17
18
|
s.homepage = 'https://github.com/zinovyev/bow'
|
18
19
|
s.license = 'MIT'
|
19
|
-
s.add_runtime_dependency 'rake'
|
20
|
-
s.add_development_dependency 'pry'
|
21
|
-
s.add_development_dependency 'rspec'
|
22
|
-
s.add_development_dependency '
|
23
|
-
s.add_development_dependency 'rubocop'
|
20
|
+
s.add_runtime_dependency 'rake', '~> 12.1'
|
21
|
+
s.add_development_dependency 'pry', '~> 0.10.3'
|
22
|
+
s.add_development_dependency 'rspec', '~> 3.6'
|
23
|
+
s.add_development_dependency 'rubocop', '~> 0.50.0'
|
24
24
|
end
|
data/lib/bow/command.rb
CHANGED
data/lib/bow/commands/apply.rb
CHANGED
@@ -10,11 +10,11 @@ module Bow
|
|
10
10
|
def run
|
11
11
|
ThreadPool.new do |t|
|
12
12
|
t.from_enumerable targets do |host|
|
13
|
-
|
14
|
-
ResponseFormatter.
|
13
|
+
results = app.ssh_helper(host).prepare_provision
|
14
|
+
ResponseFormatter.multi_print(host, results)
|
15
15
|
|
16
|
-
cmd = "
|
17
|
-
result = app.ssh_helper(host).execute(cmd)
|
16
|
+
cmd = "rake #{host.group}:provision"
|
17
|
+
result = app.ssh_helper(host).execute(cmd, true)
|
18
18
|
ResponseFormatter.pretty_print(host, result)
|
19
19
|
end
|
20
20
|
end
|
data/lib/bow/commands/exec.rb
CHANGED
data/lib/bow/commands/prepare.rb
CHANGED
@@ -10,10 +10,11 @@ module Bow
|
|
10
10
|
def run
|
11
11
|
ThreadPool.new do |t|
|
12
12
|
t.from_enumerable targets do |host|
|
13
|
-
|
14
|
-
ResponseFormatter.
|
13
|
+
results = app.ssh_helper(host).prepare_provision
|
14
|
+
ResponseFormatter.multi_print(host, results)
|
15
15
|
|
16
|
-
provision_cmd = "
|
16
|
+
provision_cmd = "BOW_VERSION=\"#{Bow::VERSION}\" \
|
17
|
+
bash #{@app.config.guest_from_host[:pre_script]}"
|
17
18
|
result = app.ssh_helper(host).execute(provision_cmd)
|
18
19
|
ResponseFormatter.pretty_print(host, result)
|
19
20
|
end
|
data/lib/bow/config.rb
CHANGED
@@ -25,6 +25,7 @@ module Bow
|
|
25
25
|
task provision: :print_hello do
|
26
26
|
end
|
27
27
|
|
28
|
+
# The task :print_hello from the :example_group1 will run only once
|
28
29
|
flow run: :once
|
29
30
|
task :print_hello do
|
30
31
|
sh 'echo "Hello from example group #1 server!"'
|
@@ -35,13 +36,16 @@ module Bow
|
|
35
36
|
task provision: :print_hello do
|
36
37
|
end
|
37
38
|
|
38
|
-
|
39
|
+
# The task :pring_hello from the example_group2 will run everytime
|
40
|
+
# until it is disabled.
|
41
|
+
# Change enabled value to "false" to run the reverting task (:print_goodbye)
|
42
|
+
flow enabled: true, revert: :print_goodbye
|
39
43
|
task :print_hello do
|
40
44
|
sh 'echo "Hello from example group #2 server!"'
|
41
45
|
end
|
42
46
|
|
43
47
|
task :print_goodbye do
|
44
|
-
sh 'echo "Goodbye! The task at example group #2 is
|
48
|
+
sh 'echo "Goodbye! The task at example group #2 is reverted!"'
|
45
49
|
end
|
46
50
|
end
|
47
51
|
RAKEFILE
|
data/lib/bow/locker.rb
CHANGED
@@ -30,6 +30,7 @@ module Bow
|
|
30
30
|
@runtime_cache = {}
|
31
31
|
end
|
32
32
|
|
33
|
+
# rubocop:disable Style/SafeNavigation
|
33
34
|
def applied?(task)
|
34
35
|
record = parse(find(task))
|
35
36
|
!!(record && record[1])
|
@@ -39,6 +40,7 @@ module Bow
|
|
39
40
|
record = parse(find(task))
|
40
41
|
!!(record && record[2])
|
41
42
|
end
|
43
|
+
# rubocop:enable Style/SafeNavigation
|
42
44
|
|
43
45
|
def apply(task)
|
44
46
|
return if applied?(task)
|
@@ -101,10 +103,8 @@ module Bow
|
|
101
103
|
file.each_char.with_index do |c, idx|
|
102
104
|
if c == LINE_SEP
|
103
105
|
current_line =~ /^([^\s]+)#{SEPARATOR}/
|
104
|
-
to_cache(
|
105
|
-
if task == $1
|
106
|
-
return { record: current_line, first_c: first_c, last_c: last_c }
|
107
|
-
end
|
106
|
+
to_cache($1, record: current_line, first_c: first_c, last_c: last_c)
|
107
|
+
from_cache(task) if task == $1
|
108
108
|
current_line = ''
|
109
109
|
first_c = idx + 1
|
110
110
|
last_c = first_c
|
data/lib/bow/memorable.rb
CHANGED
data/lib/bow/options.rb
CHANGED
data/lib/bow/rake.rb
CHANGED
@@ -55,10 +55,13 @@ module Rake
|
|
55
55
|
alias orig__invoke_with_call_chain invoke_with_call_chain
|
56
56
|
|
57
57
|
def invoke_with_call_chain(task_args, invocation_chain) # :nodoc:
|
58
|
-
|
58
|
+
if disabled?
|
59
|
+
return unless applied?
|
60
|
+
return apply_revert_task
|
61
|
+
end
|
59
62
|
return if run_once? && applied?
|
60
63
|
result = orig__invoke_with_call_chain(task_args, invocation_chain)
|
61
|
-
apply
|
64
|
+
apply
|
62
65
|
flush_history
|
63
66
|
result
|
64
67
|
end
|
@@ -101,7 +104,7 @@ module Rake
|
|
101
104
|
|
102
105
|
def find_revert_task
|
103
106
|
return unless flow[:revert]
|
104
|
-
application.lookup(flow[:revert])
|
107
|
+
application.lookup(flow[:revert], @scope)
|
105
108
|
end
|
106
109
|
|
107
110
|
# Add flow to the task.
|
@@ -12,6 +12,12 @@ module Bow
|
|
12
12
|
puts "#{wrap(*args)}\n"
|
13
13
|
end
|
14
14
|
|
15
|
+
def multi_print(host, results)
|
16
|
+
results.each do |r|
|
17
|
+
puts "#{wrap(host, r)}\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
15
21
|
def wrap(host, result)
|
16
22
|
host_group = colorize("[#{host.group}]", HEADER)
|
17
23
|
host_addr = colorize(host.host, HEADER)
|
data/lib/bow/ssh/rsync.rb
CHANGED
@@ -8,14 +8,14 @@ module Bow
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def call(source, target)
|
11
|
-
@ssh_helper.run(cmd_rsync(source,
|
11
|
+
@ssh_helper.run(cmd_rsync(source, target))
|
12
12
|
end
|
13
13
|
|
14
|
-
def cmd_rsync(source,
|
14
|
+
def cmd_rsync(source, target)
|
15
15
|
format(
|
16
|
-
'rsync --
|
16
|
+
'rsync --timeout=10 --force -r %s %s:%s',
|
17
17
|
source,
|
18
|
-
conn,
|
18
|
+
@ssh_helper.conn,
|
19
19
|
target
|
20
20
|
)
|
21
21
|
end
|
data/lib/bow/ssh/scp.rb
CHANGED
@@ -9,12 +9,17 @@ module Bow
|
|
9
9
|
|
10
10
|
def call(source, target)
|
11
11
|
@ssh_helper.execute(cmd_rm(target)) if cleanup_needed?
|
12
|
-
@ssh_helper.run(cmd_scp(source,
|
12
|
+
@ssh_helper.run(cmd_scp(source, target))
|
13
13
|
@ssh_helper.run(cmd)
|
14
14
|
end
|
15
15
|
|
16
|
-
def cmd_scp(source,
|
17
|
-
format(
|
16
|
+
def cmd_scp(source, target)
|
17
|
+
format(
|
18
|
+
'scp -o ConnectTimeout -r %s %s:%s',
|
19
|
+
source,
|
20
|
+
@ssh_helper.conn,
|
21
|
+
target
|
22
|
+
)
|
18
23
|
end
|
19
24
|
|
20
25
|
def cmd_rm(target)
|
data/lib/bow/ssh_helper.rb
CHANGED
@@ -19,7 +19,14 @@ module Bow
|
|
19
19
|
@conn = conn
|
20
20
|
end
|
21
21
|
|
22
|
-
def execute(cmd, timeout = 10)
|
22
|
+
def execute(cmd, timeout = 10, chdir = false)
|
23
|
+
cmd = if chdir
|
24
|
+
format("'cd %s && %s'",
|
25
|
+
@app.config.guest_from_host[:rake_dir],
|
26
|
+
cmd)
|
27
|
+
else
|
28
|
+
format("'%s'", cmd)
|
29
|
+
end
|
23
30
|
cmd = "ssh -o ConnectTimeout=#{timeout} #{conn} #{cmd}"
|
24
31
|
run(cmd)
|
25
32
|
end
|
@@ -35,11 +42,12 @@ module Bow
|
|
35
42
|
results << ensure_base_dir
|
36
43
|
results << copy_preprovision_script
|
37
44
|
results << copy_rake_tasks
|
38
|
-
|
45
|
+
results
|
46
|
+
# merge_results(*results)
|
39
47
|
end
|
40
48
|
|
41
49
|
def ensure_base_dir
|
42
|
-
execute("mkdir -p #{@app.config.guest_from_host[:
|
50
|
+
execute("mkdir -p #{@app.config.guest_from_host[:rake_dir]}", 10, false)
|
43
51
|
end
|
44
52
|
|
45
53
|
def copy_preprovision_script
|
@@ -50,7 +58,7 @@ module Bow
|
|
50
58
|
end
|
51
59
|
|
52
60
|
def copy_rake_tasks
|
53
|
-
copy(@app.inventory.location, @app.config.guest_from_host[:rake_dir])
|
61
|
+
copy("#{@app.inventory.location}/*", @app.config.guest_from_host[:rake_dir])
|
54
62
|
end
|
55
63
|
|
56
64
|
def copy_tool
|
data/lib/bow/version.rb
CHANGED
@@ -34,9 +34,14 @@ fi
|
|
34
34
|
# Install bow
|
35
35
|
which bow &>/dev/null
|
36
36
|
if [[ 0 != $? ]]; then
|
37
|
-
echo ">> Installing Bow..."
|
38
37
|
gem install bow
|
39
|
-
if [[ $? == 0 ]]; then echo "Bow installed!"; fi
|
40
38
|
else
|
41
|
-
|
39
|
+
gem_ver=`gem list --local | grep "^rails " | awk -F'[()]' '{ print $2 }'`
|
40
|
+
if [[ $gem_ver < $BOW_VERSION ]]; then
|
41
|
+
echo ">> Installing Bow..."
|
42
|
+
gem update bow
|
43
|
+
if [[ $? == 0 ]]; then echo "Bow installed!"; fi
|
44
|
+
else
|
45
|
+
echo ">> Bow already installed!"
|
46
|
+
fi
|
42
47
|
fi
|
metadata
CHANGED
@@ -1,86 +1,72 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zinovyev Ivan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '12.1'
|
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: '
|
26
|
+
version: '12.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.10.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.10.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.6'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: mocha
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
54
|
+
version: '3.6'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rubocop
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- - "
|
59
|
+
- - "~>"
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
61
|
+
version: 0.50.0
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- - "
|
66
|
+
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
83
|
-
description:
|
68
|
+
version: 0.50.0
|
69
|
+
description: Automate your infrastructure provisioning \ and configuration with Rake.
|
84
70
|
email: zinovyev.id@gmail.com
|
85
71
|
executables:
|
86
72
|
- bow
|
@@ -116,7 +102,7 @@ files:
|
|
116
102
|
- lib/bow/targets.rb
|
117
103
|
- lib/bow/thread_pool.rb
|
118
104
|
- lib/bow/version.rb
|
119
|
-
- src/
|
105
|
+
- src/provision.sh
|
120
106
|
homepage: https://github.com/zinovyev/bow
|
121
107
|
licenses:
|
122
108
|
- MIT
|
@@ -140,5 +126,5 @@ rubyforge_project:
|
|
140
126
|
rubygems_version: 2.6.11
|
141
127
|
signing_key:
|
142
128
|
specification_version: 4
|
143
|
-
summary:
|
129
|
+
summary: Automate your infrastructure provisioning \ and configuration with Rake.
|
144
130
|
test_files: []
|