rototiller 0.0.0.b
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +32 -0
- data/Gemfile.lock +279 -0
- data/LICENSE.md +15 -0
- data/README.md +57 -0
- data/Rakefile +56 -0
- data/lib/rototiller.rb +2 -0
- data/lib/rototiller/rake/dsl/dsl_extention.rb +14 -0
- data/lib/rototiller/task/flags/cli_flags.rb +7 -0
- data/lib/rototiller/task/rototiller_task.rb +95 -0
- data/lib/rototiller/utilities/color_text.rb +32 -0
- data/lib/rototiller/utilities/command_flag.rb +35 -0
- data/lib/rototiller/utilities/env_collection.rb +15 -0
- data/lib/rototiller/utilities/env_var.rb +62 -0
- data/lib/rototiller/utilities/flag_collection.rb +26 -0
- data/lib/rototiller/utilities/param_collection.rb +67 -0
- data/lib/rototiller/version.rb +5 -0
- data/spec/spec_helper.rb +41 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1d55671811e2416321d690faed5b873e6656bb5a
|
4
|
+
data.tar.gz: c6bd60e740eafc188f462997b429132752806a70
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2641a1a861d9f54b1218c6b718179ff985b9f2c77a2472729d2a0ba58907279e484e6c448506b83fe8c2234720a28df78e0fe2dfdfca6a823b0f7e2c3c3437b8
|
7
|
+
data.tar.gz: 77a6855654474501fb1152b470e4e71d99c160065f0e46a0940e976f34fd1e9e01b139f7c336d677b8f933474978e210f751b5e41ab6b97e74232189895b83eb
|
data/Gemfile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# place all development, system_test, etc dependencies here
|
4
|
+
|
5
|
+
group :system_tests do
|
6
|
+
#gem 'beaker', :path => "../../beaker/"
|
7
|
+
gem 'beaker' ,'~> 2.22'
|
8
|
+
gem 'beaker-hostgenerator'
|
9
|
+
end
|
10
|
+
|
11
|
+
group :development do
|
12
|
+
gem 'rspec' ,'~> 3.1.0'
|
13
|
+
gem 'simplecov'
|
14
|
+
#Documentation dependencies
|
15
|
+
gem 'yard' ,'~> 0'
|
16
|
+
gem 'markdown' ,'~> 0'
|
17
|
+
# restrict version to enable ruby 1.9.3
|
18
|
+
gem 'mime-types' ,'~> 2.0'
|
19
|
+
end
|
20
|
+
|
21
|
+
local_gemfile = "#{__FILE__}.local"
|
22
|
+
if File.exists? local_gemfile
|
23
|
+
eval(File.read(local_gemfile), binding)
|
24
|
+
end
|
25
|
+
|
26
|
+
user_gemfile = File.join(Dir.home,'.Gemfile')
|
27
|
+
if File.exists? user_gemfile
|
28
|
+
eval(File.read(user_gemfile), binding)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Specify your gem's dependencies in rototiller.gemspec
|
32
|
+
gemspec
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,279 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rototiller (0.0.0.b)
|
5
|
+
rake
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
CFPropertyList (2.3.2)
|
11
|
+
activesupport (4.2.6)
|
12
|
+
i18n (~> 0.7)
|
13
|
+
json (~> 1.7, >= 1.7.7)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
16
|
+
tzinfo (~> 1.1)
|
17
|
+
addressable (2.4.0)
|
18
|
+
aws-sdk (1.66.0)
|
19
|
+
aws-sdk-v1 (= 1.66.0)
|
20
|
+
aws-sdk-v1 (1.66.0)
|
21
|
+
json (~> 1.4)
|
22
|
+
nokogiri (>= 1.4.4)
|
23
|
+
beaker (2.37.0)
|
24
|
+
aws-sdk (~> 1.57)
|
25
|
+
beaker-answers (~> 0.0)
|
26
|
+
beaker-hiera (~> 0.0)
|
27
|
+
beaker-pe (~> 0.0)
|
28
|
+
docker-api
|
29
|
+
fission (~> 0.4)
|
30
|
+
fog (~> 1.25, < 1.35.0)
|
31
|
+
fog-google (~> 0.0.9)
|
32
|
+
google-api-client (~> 0.8)
|
33
|
+
hocon (~> 0.1)
|
34
|
+
inifile (~> 2.0)
|
35
|
+
json (~> 1.8)
|
36
|
+
mime-types (~> 2.99)
|
37
|
+
minitest (~> 5.4)
|
38
|
+
net-scp (~> 1.2)
|
39
|
+
net-ssh (~> 2.9)
|
40
|
+
open_uri_redirections (~> 0.2.1)
|
41
|
+
rbvmomi (~> 1.8)
|
42
|
+
rsync (~> 1.0.9)
|
43
|
+
stringify-hash (~> 0.0)
|
44
|
+
unf (~> 0.1)
|
45
|
+
beaker-answers (0.4.0)
|
46
|
+
require_all (~> 1.3.2)
|
47
|
+
stringify-hash (~> 0.0.0)
|
48
|
+
beaker-hiera (0.1.1)
|
49
|
+
stringify-hash (~> 0.0.0)
|
50
|
+
beaker-hostgenerator (0.4.0)
|
51
|
+
deep_merge (~> 1.0)
|
52
|
+
stringify-hash (~> 0.0.0)
|
53
|
+
beaker-pe (0.1.0)
|
54
|
+
stringify-hash (~> 0.0.0)
|
55
|
+
builder (3.2.2)
|
56
|
+
deep_merge (1.0.1)
|
57
|
+
diff-lcs (1.2.5)
|
58
|
+
docile (1.1.5)
|
59
|
+
docker-api (1.26.2)
|
60
|
+
excon (>= 0.38.0)
|
61
|
+
json
|
62
|
+
excon (0.48.0)
|
63
|
+
faraday (0.9.2)
|
64
|
+
multipart-post (>= 1.2, < 3)
|
65
|
+
fission (0.5.0)
|
66
|
+
CFPropertyList (~> 2.2)
|
67
|
+
fog (1.34.0)
|
68
|
+
fog-atmos
|
69
|
+
fog-aws (>= 0.6.0)
|
70
|
+
fog-brightbox (~> 0.4)
|
71
|
+
fog-core (~> 1.32)
|
72
|
+
fog-dynect (~> 0.0.2)
|
73
|
+
fog-ecloud (~> 0.1)
|
74
|
+
fog-google (>= 0.0.2)
|
75
|
+
fog-json
|
76
|
+
fog-local
|
77
|
+
fog-powerdns (>= 0.1.1)
|
78
|
+
fog-profitbricks
|
79
|
+
fog-radosgw (>= 0.0.2)
|
80
|
+
fog-riakcs
|
81
|
+
fog-sakuracloud (>= 0.0.4)
|
82
|
+
fog-serverlove
|
83
|
+
fog-softlayer
|
84
|
+
fog-storm_on_demand
|
85
|
+
fog-terremark
|
86
|
+
fog-vmfusion
|
87
|
+
fog-voxel
|
88
|
+
fog-xml (~> 0.1.1)
|
89
|
+
ipaddress (~> 0.5)
|
90
|
+
nokogiri (~> 1.5, >= 1.5.11)
|
91
|
+
fog-atmos (0.1.0)
|
92
|
+
fog-core
|
93
|
+
fog-xml
|
94
|
+
fog-aws (0.9.2)
|
95
|
+
fog-core (~> 1.27)
|
96
|
+
fog-json (~> 1.0)
|
97
|
+
fog-xml (~> 0.1)
|
98
|
+
ipaddress (~> 0.8)
|
99
|
+
fog-brightbox (0.10.1)
|
100
|
+
fog-core (~> 1.22)
|
101
|
+
fog-json
|
102
|
+
inflecto (~> 0.0.2)
|
103
|
+
fog-core (1.36.0)
|
104
|
+
builder
|
105
|
+
excon (~> 0.45)
|
106
|
+
formatador (~> 0.2)
|
107
|
+
fog-dynect (0.0.3)
|
108
|
+
fog-core
|
109
|
+
fog-json
|
110
|
+
fog-xml
|
111
|
+
fog-ecloud (0.3.0)
|
112
|
+
fog-core
|
113
|
+
fog-xml
|
114
|
+
fog-google (0.0.9)
|
115
|
+
fog-core
|
116
|
+
fog-json
|
117
|
+
fog-xml
|
118
|
+
fog-json (1.0.2)
|
119
|
+
fog-core (~> 1.0)
|
120
|
+
multi_json (~> 1.10)
|
121
|
+
fog-local (0.3.0)
|
122
|
+
fog-core (~> 1.27)
|
123
|
+
fog-powerdns (0.1.1)
|
124
|
+
fog-core (~> 1.27)
|
125
|
+
fog-json (~> 1.0)
|
126
|
+
fog-xml (~> 0.1)
|
127
|
+
fog-profitbricks (0.0.5)
|
128
|
+
fog-core
|
129
|
+
fog-xml
|
130
|
+
nokogiri
|
131
|
+
fog-radosgw (0.0.5)
|
132
|
+
fog-core (>= 1.21.0)
|
133
|
+
fog-json
|
134
|
+
fog-xml (>= 0.0.1)
|
135
|
+
fog-riakcs (0.1.0)
|
136
|
+
fog-core
|
137
|
+
fog-json
|
138
|
+
fog-xml
|
139
|
+
fog-sakuracloud (1.7.5)
|
140
|
+
fog-core
|
141
|
+
fog-json
|
142
|
+
fog-serverlove (0.1.2)
|
143
|
+
fog-core
|
144
|
+
fog-json
|
145
|
+
fog-softlayer (1.1.0)
|
146
|
+
fog-core
|
147
|
+
fog-json
|
148
|
+
fog-storm_on_demand (0.1.1)
|
149
|
+
fog-core
|
150
|
+
fog-json
|
151
|
+
fog-terremark (0.1.0)
|
152
|
+
fog-core
|
153
|
+
fog-xml
|
154
|
+
fog-vmfusion (0.1.0)
|
155
|
+
fission
|
156
|
+
fog-core
|
157
|
+
fog-voxel (0.1.0)
|
158
|
+
fog-core
|
159
|
+
fog-xml
|
160
|
+
fog-xml (0.1.2)
|
161
|
+
fog-core
|
162
|
+
nokogiri (~> 1.5, >= 1.5.11)
|
163
|
+
formatador (0.2.5)
|
164
|
+
google-api-client (0.9.4)
|
165
|
+
addressable (~> 2.3)
|
166
|
+
googleauth (~> 0.5)
|
167
|
+
httpclient (~> 2.7)
|
168
|
+
hurley (~> 0.1)
|
169
|
+
memoist (~> 0.11)
|
170
|
+
mime-types (>= 1.6)
|
171
|
+
representable (~> 2.3.0)
|
172
|
+
retriable (~> 2.0)
|
173
|
+
thor (~> 0.19)
|
174
|
+
googleauth (0.5.1)
|
175
|
+
faraday (~> 0.9)
|
176
|
+
jwt (~> 1.4)
|
177
|
+
logging (~> 2.0)
|
178
|
+
memoist (~> 0.12)
|
179
|
+
multi_json (~> 1.11)
|
180
|
+
os (~> 0.9)
|
181
|
+
signet (~> 0.7)
|
182
|
+
hocon (0.9.5)
|
183
|
+
httpclient (2.7.1)
|
184
|
+
hurley (0.2)
|
185
|
+
i18n (0.7.0)
|
186
|
+
inflecto (0.0.2)
|
187
|
+
inifile (2.0.2)
|
188
|
+
ipaddress (0.8.3)
|
189
|
+
json (1.8.3)
|
190
|
+
jwt (1.5.4)
|
191
|
+
kramdown (1.10.0)
|
192
|
+
little-plugger (1.1.4)
|
193
|
+
logging (2.1.0)
|
194
|
+
little-plugger (~> 1.1)
|
195
|
+
multi_json (~> 1.10)
|
196
|
+
logutils (0.6.1)
|
197
|
+
markdown (0.4.0)
|
198
|
+
kramdown (>= 0.13.7)
|
199
|
+
props (>= 0.2.0)
|
200
|
+
textutils (>= 0.2.0)
|
201
|
+
memoist (0.14.0)
|
202
|
+
mime-types (2.99.1)
|
203
|
+
mini_portile2 (2.0.0)
|
204
|
+
minitest (5.8.4)
|
205
|
+
multi_json (1.11.2)
|
206
|
+
multipart-post (2.0.0)
|
207
|
+
net-scp (1.2.1)
|
208
|
+
net-ssh (>= 2.6.5)
|
209
|
+
net-ssh (2.9.4)
|
210
|
+
nokogiri (1.6.7.2)
|
211
|
+
mini_portile2 (~> 2.0.0.rc2)
|
212
|
+
open_uri_redirections (0.2.1)
|
213
|
+
os (0.9.6)
|
214
|
+
props (1.1.2)
|
215
|
+
rake (11.1.2)
|
216
|
+
rbvmomi (1.8.2)
|
217
|
+
builder
|
218
|
+
nokogiri (>= 1.4.1)
|
219
|
+
trollop
|
220
|
+
representable (2.3.0)
|
221
|
+
uber (~> 0.0.7)
|
222
|
+
require_all (1.3.3)
|
223
|
+
retriable (2.1.0)
|
224
|
+
rspec (3.1.0)
|
225
|
+
rspec-core (~> 3.1.0)
|
226
|
+
rspec-expectations (~> 3.1.0)
|
227
|
+
rspec-mocks (~> 3.1.0)
|
228
|
+
rspec-core (3.1.7)
|
229
|
+
rspec-support (~> 3.1.0)
|
230
|
+
rspec-expectations (3.1.2)
|
231
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
232
|
+
rspec-support (~> 3.1.0)
|
233
|
+
rspec-mocks (3.1.3)
|
234
|
+
rspec-support (~> 3.1.0)
|
235
|
+
rspec-support (3.1.2)
|
236
|
+
rsync (1.0.9)
|
237
|
+
rubyzip (1.2.0)
|
238
|
+
signet (0.7.2)
|
239
|
+
addressable (~> 2.3)
|
240
|
+
faraday (~> 0.9)
|
241
|
+
jwt (~> 1.5)
|
242
|
+
multi_json (~> 1.10)
|
243
|
+
simplecov (0.11.2)
|
244
|
+
docile (~> 1.1.0)
|
245
|
+
json (~> 1.8)
|
246
|
+
simplecov-html (~> 0.10.0)
|
247
|
+
simplecov-html (0.10.0)
|
248
|
+
stringify-hash (0.0.2)
|
249
|
+
textutils (1.4.0)
|
250
|
+
activesupport
|
251
|
+
logutils (>= 0.6.1)
|
252
|
+
props (>= 1.1.2)
|
253
|
+
rubyzip (>= 1.0.0)
|
254
|
+
thor (0.19.1)
|
255
|
+
thread_safe (0.3.5)
|
256
|
+
trollop (2.1.2)
|
257
|
+
tzinfo (1.2.2)
|
258
|
+
thread_safe (~> 0.1)
|
259
|
+
uber (0.0.15)
|
260
|
+
unf (0.1.4)
|
261
|
+
unf_ext
|
262
|
+
unf_ext (0.0.7.2)
|
263
|
+
yard (0.8.7.6)
|
264
|
+
|
265
|
+
PLATFORMS
|
266
|
+
ruby
|
267
|
+
|
268
|
+
DEPENDENCIES
|
269
|
+
beaker (~> 2.22)
|
270
|
+
beaker-hostgenerator
|
271
|
+
markdown (~> 0)
|
272
|
+
mime-types (~> 2.0)
|
273
|
+
rototiller!
|
274
|
+
rspec (~> 3.1.0)
|
275
|
+
simplecov
|
276
|
+
yard (~> 0)
|
277
|
+
|
278
|
+
BUNDLED WITH
|
279
|
+
1.11.2
|
data/LICENSE.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Copyright 2015 Puppet Labs Inc
|
2
|
+
|
3
|
+
Puppet Labs can be contacted at: info@puppetlabs.com
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# rototiller
|
2
|
+
|
3
|
+
A shared rake task library for use at Puppet.
|
4
|
+
Goals of Rototiller
|
5
|
+
|
6
|
+
* Provide a tool that can house shared rake task code for Puppet Labs.
|
7
|
+
|
8
|
+
* Reduce duplication in rakefiles across projects at Puppet Labs.
|
9
|
+
|
10
|
+
* Reduce effort required to write first class rake tasks.
|
11
|
+
|
12
|
+
* Reduce time and effort trying to understand requirement to run rake tasks.
|
13
|
+
|
14
|
+
* Provide a standard interface for executing tests in a given test tier regardless of framework (Not MVP)
|
15
|
+
|
16
|
+
## Classes & Modules under development
|
17
|
+
For more detailed documentation please refer to the yard docs.
|
18
|
+
|
19
|
+
####[EnvVar](lib/rototiller/utilities/env_var.rb)
|
20
|
+
|
21
|
+
A class that tracks the state of an ENV variable.
|
22
|
+
This class is responsible for formatting its own messaging, the value that should be used, and if a task should stop.
|
23
|
+
|
24
|
+
####[Flag](lib/rototiller/utilities/flag.rb)
|
25
|
+
|
26
|
+
A class that tracks the desired state of command line flags used in test invocation.
|
27
|
+
The desired state of these flags is determined by the user.
|
28
|
+
|
29
|
+
####[ParamCollection](lib/rototiller/utilities/param_collection.rb)
|
30
|
+
|
31
|
+
A class to contain EnvVar and Flag classes.
|
32
|
+
Behaves similar to an Array.
|
33
|
+
|
34
|
+
####[RototillerTask](lib/rototiller/task/rototiller_task.rb)
|
35
|
+
|
36
|
+
A class used to build a rake task.
|
37
|
+
Similar in approach to [RSpec::Core::RakeTask](https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/rake_task.rb)
|
38
|
+
|
39
|
+
####[CLIFlags](lib/rototiller/task/flags/cli_flags.rb)
|
40
|
+
|
41
|
+
A class to contain the known CLI flags.
|
42
|
+
|
43
|
+
## More Documentation
|
44
|
+
|
45
|
+
|
46
|
+
Rototiller is documented using yard
|
47
|
+
to view yard docs
|
48
|
+
|
49
|
+
First build a local copy of the gem
|
50
|
+
|
51
|
+
$ bundle exec rake build
|
52
|
+
|
53
|
+
Next start the yard server
|
54
|
+
|
55
|
+
$ bundle exec yard server
|
56
|
+
|
57
|
+
Finally navigate to http://0.0.0.0:8808/ to view the documentation
|
data/Rakefile
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
task :default => :test
|
5
|
+
|
6
|
+
desc "Run spec tests"
|
7
|
+
RSpec::Core::RakeTask.new(:test) do |t|
|
8
|
+
t.rspec_opts = ['--color']
|
9
|
+
t.pattern = 'spec/'
|
10
|
+
end
|
11
|
+
|
12
|
+
task :generate_host_config do |t, args|
|
13
|
+
if ENV["BEAKER_CONFIG"]
|
14
|
+
next
|
15
|
+
end
|
16
|
+
|
17
|
+
target = ENV["TEST_TARGET"] || 'centos7-64'
|
18
|
+
generate = "bundle exec beaker-hostgenerator"
|
19
|
+
generate += " #{target}"
|
20
|
+
generate += " > acceptance/hosts.cfg"
|
21
|
+
sh generate
|
22
|
+
sh "cat acceptance/hosts.cfg"
|
23
|
+
end
|
24
|
+
|
25
|
+
task acceptance: :generate_host_config
|
26
|
+
|
27
|
+
desc 'Run acceptance tests for Rototiller'
|
28
|
+
task :acceptance do |t, args|
|
29
|
+
|
30
|
+
config = ENV["BEAKER_CONFIG"] || 'acceptance/hosts.cfg'
|
31
|
+
|
32
|
+
preserve_hosts = ENV["BEAKER_PRESERVEHOSTS"] || 'never'
|
33
|
+
type = 'pe'
|
34
|
+
keyfile = ENV["BEAKER_KEYFILE"] || "#{ENV['HOME']}/.ssh/id_rsa-acceptance"
|
35
|
+
load_path = ENV["BEAKER_LOADPATH"] || 'acceptance/lib'
|
36
|
+
pre_suite = ENV["BEAKER_PRESUITE"] || 'acceptance/pre-suite'
|
37
|
+
post_suite = ENV["BEAKER_POSTSUITE"] || ''
|
38
|
+
test_suite = ENV["BEAKER_TESTSUITE"] || 'acceptance/tests'
|
39
|
+
opts = ENV["BEAKER_OPTS"] || ''
|
40
|
+
|
41
|
+
beaker = "bundle exec beaker "
|
42
|
+
beaker += " --xml"
|
43
|
+
beaker += " --debug"
|
44
|
+
beaker += " --root-keys"
|
45
|
+
beaker += " --repo-proxy"
|
46
|
+
beaker += " --preserve-hosts #{preserve_hosts}" if preserve_hosts != ''
|
47
|
+
beaker += " --config #{config}" if config != ''
|
48
|
+
beaker += " --type #{type}" if type != ''
|
49
|
+
beaker += " --keyfile #{keyfile}" if keyfile != ''
|
50
|
+
beaker += " --load-path #{load_path}" if load_path != ''
|
51
|
+
beaker += " --pre-suite #{pre_suite}" if pre_suite != ''
|
52
|
+
beaker += " --post-suite #{post_suite}" if post_suite != ''
|
53
|
+
beaker += " --tests #{test_suite}" if test_suite != ''
|
54
|
+
beaker += " #{opts}" if opts != ''
|
55
|
+
sh beaker
|
56
|
+
end
|
data/lib/rototiller.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rototiller/task/rototiller_task'
|
2
|
+
|
3
|
+
module Rake
|
4
|
+
module DSL
|
5
|
+
|
6
|
+
def acceptance_task(*args, &block)
|
7
|
+
# Default task description
|
8
|
+
# can be overridden with 'desc' method
|
9
|
+
desc "Tests in the 'Acceptance' tier" unless ::Rake.application.last_comment
|
10
|
+
Rototiller::Task::RototillerTask.define_task :acceptance, &block
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'rototiller/utilities/env_var'
|
2
|
+
require 'rototiller/utilities/param_collection'
|
3
|
+
require 'rototiller/utilities/env_collection'
|
4
|
+
require 'rototiller/utilities/flag_collection'
|
5
|
+
require 'rake/tasklib'
|
6
|
+
|
7
|
+
module Rototiller
|
8
|
+
module Task
|
9
|
+
class RototillerTask < ::Rake::TaskLib
|
10
|
+
attr_accessor :name
|
11
|
+
attr_accessor :command
|
12
|
+
|
13
|
+
# Whether or not to fail Rake when an error occurs (typically when
|
14
|
+
# examples fail). Defaults to `true`.
|
15
|
+
attr_accessor :fail_on_error
|
16
|
+
|
17
|
+
# A message to print to stderr when there are failures.
|
18
|
+
attr_accessor :failure_message
|
19
|
+
|
20
|
+
def initialize(*args, &task_block)
|
21
|
+
@name = args.shift
|
22
|
+
@fail_on_error = true
|
23
|
+
@command = 'echo empty RototillerTask. You should define a command, send a block, or EnvVar to track.'
|
24
|
+
# rake's in-task implied method is true when using --verbose
|
25
|
+
@verbose = verbose == true
|
26
|
+
@env_vars = EnvCollection.new
|
27
|
+
@flags = FlagCollection.new
|
28
|
+
|
29
|
+
define(args, &task_block)
|
30
|
+
end
|
31
|
+
|
32
|
+
# define_task is included to allow task to work like Rake::Task
|
33
|
+
# using .define_task or .new as appropriate
|
34
|
+
def self.define_task(*args, &task_block)
|
35
|
+
self.new(*args, &task_block)
|
36
|
+
end
|
37
|
+
|
38
|
+
#TODO add arg validation to EnvVar and CommandFlag
|
39
|
+
# add_env(EnvVar.new(), EnvVar.new(), EnvVar.new())
|
40
|
+
# add_env('FOO', 'This is how you use FOO', 'default_value')
|
41
|
+
def add_env(*args)
|
42
|
+
args.all?{ |arg| arg.is_a?(EnvVar)} ? @env_vars.push(*args) : @env_vars.push(EnvVar.new(*args))
|
43
|
+
end
|
44
|
+
|
45
|
+
#TODO add arg validation to CommandFlag
|
46
|
+
# add_flag(CommandFlag.new(), CommandFlag.new(), CommandFlag.new())
|
47
|
+
# add_flag('--foo', 'This is how you use --foo', 'default_value')
|
48
|
+
def add_flag(*args)
|
49
|
+
args.all?{ |arg| arg.is_a?(CommandFlag)} ? @flags.push(*flags) : @flags.push(CommandFlag.new(*args))
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# @private
|
55
|
+
def run_task
|
56
|
+
puts @flags.format_messages
|
57
|
+
puts @env_vars.format_messages
|
58
|
+
exit if @env_vars.stop?
|
59
|
+
|
60
|
+
command_str = @command << @flags.to_s
|
61
|
+
puts command_str if @verbose
|
62
|
+
|
63
|
+
return if system(command_str)
|
64
|
+
puts failure_message if failure_message
|
65
|
+
|
66
|
+
return unless fail_on_error
|
67
|
+
$stderr.puts "#{command_str} failed" if @verbose
|
68
|
+
exit $?.exitstatus
|
69
|
+
end
|
70
|
+
|
71
|
+
# @private
|
72
|
+
# register the new block w/ run_task call in a rake task
|
73
|
+
# any block passed is run prior to our command
|
74
|
+
# TODO: probably need pre/post-command block functionality
|
75
|
+
def define(args, &task_block)
|
76
|
+
# Default task description
|
77
|
+
# can be overridden with standard 'desc' DSL method
|
78
|
+
desc "RototillerTask: A Task with optional environment variable and command flag tracking" unless ::Rake.application.last_comment
|
79
|
+
|
80
|
+
task(@name, *args) do |_, task_args|
|
81
|
+
RakeFileUtils.__send__(:verbose, @verbose) do
|
82
|
+
task_block.call(*[self, task_args].slice(0, task_block.arity)) if task_block
|
83
|
+
run_task
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# @private
|
89
|
+
# for unit testing, we need a shortcut around rake's CLI --verbose
|
90
|
+
def set_verbose(verbosity=true)
|
91
|
+
@verbose = verbosity
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ColorText
|
2
|
+
|
3
|
+
# Colors a string of text
|
4
|
+
# @param text [String] the text to color
|
5
|
+
# @param color [Integer] ASCII-code 30-37 http://ascii-table.com/ansi-escape-sequences.php
|
6
|
+
# @return [String] formatted text with color
|
7
|
+
def colorize(text, color)
|
8
|
+
"\e[#{color}m#{text}\e[0m"
|
9
|
+
end
|
10
|
+
|
11
|
+
# Adds yellow color to a string of text
|
12
|
+
# @param text [String] The text to color
|
13
|
+
# @return [String] Text formatted in yellow color
|
14
|
+
def yellow_text(text)
|
15
|
+
colorize(text, 33)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Adds green color to a string of text
|
19
|
+
# @param text [String] The text to color
|
20
|
+
# @return [String] Text formatted in green color
|
21
|
+
def green_text(text)
|
22
|
+
colorize(text, 32)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Adds red color to a string of text
|
26
|
+
# @param text [String] The text to color
|
27
|
+
# @return [String] Text formatted in red color
|
28
|
+
def red_text(text)
|
29
|
+
colorize(text, 31)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rototiller/utilities/color_text'
|
2
|
+
|
3
|
+
class CommandFlag
|
4
|
+
|
5
|
+
include ColorText
|
6
|
+
|
7
|
+
# @return [String] the flag to be set on a CLI '-v' or '--verbose'
|
8
|
+
attr_reader :flag
|
9
|
+
|
10
|
+
# @return [true, false, nil, String] the value if any of the flag
|
11
|
+
attr_reader :value
|
12
|
+
|
13
|
+
# Creates a new instance of CommandFlag, holds information about desired state of a CLI flag
|
14
|
+
# @param flag [String] the flag to be set on a CLI '-v' or '--verbose'
|
15
|
+
# @param message [String] the message describing the Flag
|
16
|
+
# @param value [String] the value to use as the value if one is required
|
17
|
+
def initialize(flag, value=nil, message)
|
18
|
+
@flag = flag
|
19
|
+
@message = message
|
20
|
+
@value = value
|
21
|
+
end
|
22
|
+
|
23
|
+
# The formatted message to be displayed to the user
|
24
|
+
# @return [String] the CommandFlag's message, formatted with color
|
25
|
+
def message
|
26
|
+
green_text(@message) << "\n" << describe_flag_state
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def describe_flag_state
|
31
|
+
only_flag = "The CLI flag #{@flag} will be used, no value was provided."
|
32
|
+
flag_with_value = "The CLI flag #{@flag} will be used with value #{@value}."
|
33
|
+
green_text(@value.nil? ? only_flag : flag_with_value)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rototiller/utilities/param_collection'
|
2
|
+
|
3
|
+
class EnvCollection < ParamCollection
|
4
|
+
|
5
|
+
def push(*args)
|
6
|
+
check_classes(EnvVar, *args)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
# Do any of the contents of this ParamCollection require the task to stop
|
11
|
+
# @return [true, nil] should the values of this ParamCollection stop the task
|
12
|
+
def stop?
|
13
|
+
@collection.any?{ |param| param.stop }
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rototiller/utilities/color_text'
|
2
|
+
|
3
|
+
class EnvVar
|
4
|
+
|
5
|
+
include ColorText
|
6
|
+
|
7
|
+
attr_accessor :var, :message, :default
|
8
|
+
|
9
|
+
# @return [Symbol] the debug level of the message, ':warning', ':error', ':info'
|
10
|
+
attr_reader :message_level
|
11
|
+
|
12
|
+
# @return [true, nil] if the state of the EnvVar requires the task to stop
|
13
|
+
attr_reader :stop
|
14
|
+
|
15
|
+
# Creates a new instance of EnvVar, holds information about the ENV in the environment
|
16
|
+
# @param var [String] the ENV in the environment, 'HOME'
|
17
|
+
# @param message [String] the message describing the ENV
|
18
|
+
# @param default [String] the value to use as the default if the ENV is not present
|
19
|
+
def initialize(var, default=false, message)
|
20
|
+
@var = var
|
21
|
+
@message = message
|
22
|
+
@default = default
|
23
|
+
set_message_level
|
24
|
+
end
|
25
|
+
|
26
|
+
# The value of the ENV determined by the EnvVar class
|
27
|
+
# @return [String] the value determined by the EnvVar class
|
28
|
+
def value
|
29
|
+
ENV[@var] || @default
|
30
|
+
end
|
31
|
+
|
32
|
+
# The formatted message to be displayed to the user
|
33
|
+
# @return [String] the EnvVar's message, formatted for color and meaningful to the state of the EnvVAr
|
34
|
+
def message
|
35
|
+
if message_level == :error
|
36
|
+
red_text("The ENV #{@var} is required, #{@message}")
|
37
|
+
elsif message_level == :info
|
38
|
+
green_text("The ENV #{@var} was found in the environment with the value #{value}")
|
39
|
+
elsif message_level == :warning
|
40
|
+
yellow_text("WARNING: the ENV #{@var} is not set, proceeding with default value: #{@default}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def check
|
46
|
+
ENV.key?(@var)
|
47
|
+
end
|
48
|
+
|
49
|
+
def set_message_level
|
50
|
+
if !@default && !check
|
51
|
+
# ENV is not Present and it has no default value
|
52
|
+
@message_level = :error
|
53
|
+
@stop = true
|
54
|
+
elsif !@default && check || @default && check
|
55
|
+
# ENV is present and it has no default value
|
56
|
+
@message_level = :info
|
57
|
+
elsif @default && !check
|
58
|
+
# ENV is not present and it has default value
|
59
|
+
@message_level = :warning
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rototiller/utilities/param_collection'
|
2
|
+
|
3
|
+
class FlagCollection < ParamCollection
|
4
|
+
|
5
|
+
def push(*args)
|
6
|
+
check_classes(CommandFlag, *args)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
# Joins contents into a String, works with no value flags and flags with value
|
11
|
+
# @return [String] flags formatted into a single string
|
12
|
+
def to_s
|
13
|
+
|
14
|
+
flag_str = String.new
|
15
|
+
|
16
|
+
@collection.each do |flag|
|
17
|
+
if flag.value.nil?
|
18
|
+
flag_str << ' ' << flag.flag
|
19
|
+
else
|
20
|
+
flag_str << ' ' << flag.flag << ' ' << flag.value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
flag_str
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rototiller/utilities/command_flag'
|
2
|
+
require 'rototiller/utilities/env_var'
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
class ParamCollection
|
6
|
+
|
7
|
+
# This may be useful if we use individual ParamCollection objects for EnvVars and Flags
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :@collection, :clear, :delete_if, :include?, :include, :inspect, :push
|
11
|
+
|
12
|
+
# collect a given task's params
|
13
|
+
def initialize
|
14
|
+
@collection = []
|
15
|
+
end
|
16
|
+
|
17
|
+
# format the messages inside this ParamCollection
|
18
|
+
# @param [Hash] filters any method from EnvVar can be used as a key
|
19
|
+
# @option filters [String, false, true] :stop the value of the return from .stop on EnvVar
|
20
|
+
# @option filters [String, false, true] :message_level the value of the return from .message_level on EnvVar
|
21
|
+
# @option filters [String, false, true] :default the value of the return from .default on EnvVar
|
22
|
+
# @option filters [String, false, true] :message the value of the return from .message on EnvVar
|
23
|
+
# @option filters [String, false, true] :var the value of the return from .var on EnvVar
|
24
|
+
# @return [String] messages from the contents of this ParamCollection, formatted with new lines and color
|
25
|
+
# @example Get the messages where :stop is true & :message_level is :warning
|
26
|
+
'format_message({:stop => true, :message_level => :warning})'
|
27
|
+
def format_messages(filters=nil)
|
28
|
+
|
29
|
+
formatted_message = String.new
|
30
|
+
build_message = lambda { |param| formatted_message << param.message << "\n"}
|
31
|
+
filters ? filter_contents(filters).each(&build_message) : @collection.each(&build_message)
|
32
|
+
formatted_message
|
33
|
+
end
|
34
|
+
|
35
|
+
def filter_contents(filters={})
|
36
|
+
|
37
|
+
filtered = []
|
38
|
+
|
39
|
+
@collection.each do |param|
|
40
|
+
|
41
|
+
filtered.push(param) if filters.all? do |method, value|
|
42
|
+
|
43
|
+
if param.respond_to?(method)
|
44
|
+
if param.send(method).nil?
|
45
|
+
value.nil?
|
46
|
+
else
|
47
|
+
param.send(method).to_s =~ /#{value.to_s}/
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
filtered
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_classes(allowed_klass, *args)
|
56
|
+
|
57
|
+
args.each do |arg|
|
58
|
+
|
59
|
+
unless arg.is_a?(allowed_klass)
|
60
|
+
argument_error = "Argument was of class #{arg.class}, Can only be of class #{allowed_klass}"
|
61
|
+
raise(ArgumentError, argument_error)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private :filter_contents, :check_classes
|
67
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
if ENV["COVERAGE"]
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start do
|
4
|
+
add_filter '/spec/'
|
5
|
+
add_filter '.bundle/gems'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rspec'
|
10
|
+
require 'rototiller'
|
11
|
+
|
12
|
+
def random_string
|
13
|
+
(0...10).map { ('a'..'z').to_a[rand(26)] }.join
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_random_env
|
17
|
+
name = unique_env
|
18
|
+
ENV[name] = random_string
|
19
|
+
return name
|
20
|
+
end
|
21
|
+
|
22
|
+
def unique_env
|
23
|
+
env = random_string
|
24
|
+
env = random_string until !ENV[env]
|
25
|
+
return env
|
26
|
+
end
|
27
|
+
|
28
|
+
def with_captured_stdout
|
29
|
+
begin
|
30
|
+
old_stdout = $stdout
|
31
|
+
$stdout = StringIO.new('','w')
|
32
|
+
yield
|
33
|
+
$stdout.string
|
34
|
+
ensure
|
35
|
+
$stdout = old_stdout
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
RSpec.configure do |config|
|
40
|
+
config.include Rake::DSL
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rototiller
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.b
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Puppetlabs
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Puppetlabs tool for building rake tasks
|
28
|
+
email:
|
29
|
+
- qa@puppetlabs.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- Gemfile
|
35
|
+
- Gemfile.lock
|
36
|
+
- LICENSE.md
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- lib/rototiller.rb
|
40
|
+
- lib/rototiller/rake/dsl/dsl_extention.rb
|
41
|
+
- lib/rototiller/task/flags/cli_flags.rb
|
42
|
+
- lib/rototiller/task/rototiller_task.rb
|
43
|
+
- lib/rototiller/utilities/color_text.rb
|
44
|
+
- lib/rototiller/utilities/command_flag.rb
|
45
|
+
- lib/rototiller/utilities/env_collection.rb
|
46
|
+
- lib/rototiller/utilities/env_var.rb
|
47
|
+
- lib/rototiller/utilities/flag_collection.rb
|
48
|
+
- lib/rototiller/utilities/param_collection.rb
|
49
|
+
- lib/rototiller/version.rb
|
50
|
+
- spec/spec_helper.rb
|
51
|
+
homepage: https://github.com/puppetlabs/rototiller
|
52
|
+
licenses:
|
53
|
+
- Apache-2.0
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>'
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.3.1
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 2.6.2
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: Puppetlabs rake tool
|
75
|
+
test_files: []
|
76
|
+
has_rdoc:
|