qb 0.3.25 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/ansible.cfg +10 -1
- data/exe/.qb_interop_receive +3 -10
- data/exe/qb +8 -2
- data/lib/python/qb/__init__.py +6 -0
- data/{roles/qb/ruby/rspec/setup/tasks/persistence.yml → lib/python/qb/ansible/__init__.py} +0 -0
- data/lib/python/qb/ansible/modules/__init__.py +0 -0
- data/lib/python/qb/ansible/modules/docker/__init__.py +0 -0
- data/lib/python/qb/ansible/modules/docker/client.py +177 -0
- data/lib/python/qb/ansible/modules/docker/image_manager.py +754 -0
- data/lib/python/qb/ipc/__init__.py +0 -0
- data/lib/python/qb/ipc/stdio/__init__.py +99 -0
- data/lib/python/qb/ipc/stdio/logging.py +151 -0
- data/lib/qb.rb +3 -3
- data/lib/qb/ansible/cmds/playbook.rb +5 -14
- data/lib/qb/ansible/env.rb +36 -6
- data/lib/qb/ansible/module.rb +396 -152
- data/lib/qb/ansible/module/response.rb +195 -0
- data/lib/qb/ansible/modules.rb +42 -0
- data/lib/qb/ansible/modules/docker/image.rb +273 -0
- data/lib/qb/cli.rb +5 -18
- data/lib/qb/cli/run.rb +2 -2
- data/lib/qb/data.rb +22 -0
- data/lib/qb/data/immutable.rb +39 -0
- data/lib/qb/docker.rb +2 -0
- data/lib/qb/docker/cli.rb +430 -0
- data/lib/qb/docker/image.rb +207 -0
- data/lib/qb/docker/image/name.rb +309 -0
- data/lib/qb/docker/image/tag.rb +113 -0
- data/lib/qb/docker/repo.rb +0 -0
- data/lib/qb/errors.rb +17 -3
- data/lib/qb/execution.rb +83 -0
- data/lib/qb/ipc.rb +48 -0
- data/lib/qb/ipc/stdio.rb +32 -0
- data/lib/qb/ipc/stdio/client.rb +267 -0
- data/lib/qb/ipc/stdio/server.rb +229 -0
- data/lib/qb/ipc/stdio/server/in_service.rb +18 -0
- data/lib/qb/ipc/stdio/server/log_service.rb +168 -0
- data/lib/qb/ipc/stdio/server/out_service.rb +20 -0
- data/lib/qb/ipc/stdio/server/service.rb +229 -0
- data/lib/qb/options.rb +360 -502
- data/lib/qb/options/option.rb +293 -115
- data/lib/qb/options/option/option_parser_concern.rb +228 -0
- data/lib/qb/options/types.rb +73 -0
- data/lib/qb/package.rb +0 -1
- data/lib/qb/package/version.rb +179 -58
- data/lib/qb/package/version/from.rb +192 -51
- data/lib/qb/package/version/leveled.rb +1 -1
- data/lib/qb/path.rb +3 -2
- data/lib/qb/repo/git.rb +9 -85
- data/lib/qb/role/default_dir.rb +2 -2
- data/lib/qb/role/errors.rb +2 -8
- data/lib/qb/util.rb +1 -2
- data/lib/qb/util/bundler.rb +73 -43
- data/lib/qb/util/decorators.rb +99 -0
- data/lib/qb/util/interop.rb +7 -8
- data/lib/qb/util/resource.rb +12 -13
- data/lib/qb/version.rb +10 -0
- data/library/path_facts +5 -10
- data/library/qb.module.rb +105 -0
- data/library/stream +6 -26
- data/load/ansible/module/autorun.rb +25 -0
- data/load/ansible/module/script.rb +123 -0
- data/load/rebundle.rb +39 -0
- data/plugins/filter/dict_filters.py +56 -0
- data/plugins/{filter_plugins/path_plugins.py → filter/path_filters.py} +0 -0
- data/plugins/{filter_plugins/ruby_interop_plugins.py → filter/ruby_interop_filters.py} +1 -17
- data/plugins/{filter_plugins/string_plugins.py → filter/string_filters.py} +1 -20
- data/plugins/{filter_plugins/version_plugins.py → filter/version_filters.py} +3 -18
- data/plugins/{lookup_plugins/every.py → lookup/every_lookups.py} +0 -0
- data/plugins/{lookup_plugins/resolve.py → lookup/resolve_lookups.py} +0 -0
- data/plugins/{lookup_plugins/version.py → lookup/version_lookups.py} +0 -16
- data/plugins/test/dict_tests.py +36 -0
- data/plugins/test/string_tests.py +36 -0
- data/qb.gemspec +7 -3
- data/roles/nrser.rb/library/set_fact_with_ruby.rb +3 -9
- data/roles/nrser.state_mate/library/state +3 -17
- data/roles/qb/call/meta/qb.yml +1 -1
- data/roles/qb/dev/ref/repo/git/meta/qb.yml +1 -1
- data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/defaults/main.yml +1 -1
- data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/meta/main.yml +3 -2
- data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/meta/qb.yml +12 -7
- data/roles/qb/docker/mac/kubernetes/tasks/main.yml +45 -0
- data/roles/qb/git/check/clean/meta/qb.yml +1 -1
- data/roles/qb/git/ignore/meta/qb +10 -3
- data/roles/qb/git/submodule/update/library/git_submodule_update +17 -27
- data/roles/qb/github/pages/setup/meta/qb.yml +1 -1
- data/roles/qb/labs/atom/apm/meta/qb.yml +1 -1
- data/roles/qb/osx/git/change_case/meta/qb.yml +1 -1
- data/roles/qb/osx/notif/meta/qb.yml +1 -1
- data/roles/qb/pkg/bump/library/bump +4 -16
- data/roles/qb/role/qb/defaults/main.yml +2 -0
- data/roles/qb/role/qb/meta/qb.yml +10 -5
- data/roles/qb/role/qb/templates/qb.yml.j2 +7 -2
- data/roles/qb/role/templates/library/module.rb.j2 +12 -23
- data/roles/qb/role/templates/meta/main.yml.j2 +14 -1
- data/roles/qb/ruby/bundler/meta/qb.yml +1 -1
- data/roles/qb/ruby/dependency/meta/qb.yml +1 -1
- data/roles/qb/ruby/gem/bin_stubs/meta/qb.yml +1 -1
- data/roles/qb/ruby/gem/bin_stubs/templates/console +8 -2
- data/roles/qb/ruby/gem/build/meta/qb.yml +1 -1
- data/roles/qb/ruby/gem/new/meta/qb.yml +1 -1
- data/roles/qb/ruby/nrser/rspex/generate/meta/qb.yml +5 -5
- data/roles/qb/ruby/nrser/rspex/issue/meta/qb.yml +1 -1
- data/roles/qb/ruby/yard/clean/meta/qb.yml +1 -1
- data/roles/qb/ruby/yard/config/library/yard.get_output_dir +5 -15
- data/roles/qb/ruby/yard/config/meta/qb.yml +1 -1
- data/roles/qb/ruby/yard/setup/meta/qb.yml +1 -1
- metadata +71 -22
- data/lib/qb/ansible_module.rb +0 -5
- data/lib/qb/util/stdio.rb +0 -187
- data/roles/qb/ruby/rspec/setup/tasks/main.yml +0 -4
@@ -1,23 +1,13 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
1
|
#!/usr/bin/env ruby
|
4
2
|
# WANT_JSON
|
5
3
|
|
6
|
-
#
|
7
|
-
|
8
|
-
ENV.each {|k, v|
|
9
|
-
if k.start_with? 'QB_DEV_ENV_'
|
10
|
-
ENV[k.sub('QB_DEV_ENV_', '')] = v
|
11
|
-
end
|
12
|
-
}
|
13
|
-
require 'bundler/setup'
|
14
|
-
end
|
4
|
+
# Load QB's Ansible module autorun harness
|
5
|
+
load ENV['QB_AM_AUTORUN_PATH']
|
15
6
|
|
16
7
|
require 'qb'
|
17
8
|
require 'cmds'
|
18
9
|
require 'nrser'
|
19
10
|
|
20
|
-
using NRSER
|
21
11
|
|
22
12
|
class GitSubmoduleUpdate < QB::Ansible::Module
|
23
13
|
def main_dir
|
@@ -46,7 +36,7 @@ class GitSubmoduleUpdate < QB::Ansible::Module
|
|
46
36
|
detached: detached?(dir),
|
47
37
|
dirty: dirty?(dir),
|
48
38
|
}
|
49
|
-
}.tap {|subs|
|
39
|
+
}.tap { |subs| logger.debug payload: { submodules: subs } }
|
50
40
|
end
|
51
41
|
|
52
42
|
def dirty? repo_dir
|
@@ -85,7 +75,7 @@ class GitSubmoduleUpdate < QB::Ansible::Module
|
|
85
75
|
end
|
86
76
|
|
87
77
|
def attach! submodule
|
88
|
-
|
78
|
+
logger.debug "attaching submodule #{ submodule[:rel_dir] }..."
|
89
79
|
|
90
80
|
branch_heads = branch_heads_for_commit submodule
|
91
81
|
branch_head = nil
|
@@ -107,17 +97,17 @@ class GitSubmoduleUpdate < QB::Ansible::Module
|
|
107
97
|
return false
|
108
98
|
|
109
99
|
when 1
|
110
|
-
|
100
|
+
logger.debug "commit is head of only one branch: #{ branch_heads[0][:ref] }"
|
111
101
|
branch_head = branch_heads[0]
|
112
102
|
|
113
103
|
else
|
114
|
-
|
104
|
+
logger.debug "commit is head of multiple branches..."
|
115
105
|
|
116
106
|
local = branch_heads.select {|bh| bh[:ref].start_with? 'refs/heads'}
|
117
107
|
|
118
108
|
case local.length
|
119
109
|
when 0
|
120
|
-
|
110
|
+
logger.debug "commit is head of multiple remote branches..."
|
121
111
|
|
122
112
|
# see if one is master
|
123
113
|
branch_head = branch_heads.find {|bh| bh[:ref].end_with? 'master'}
|
@@ -133,15 +123,15 @@ class GitSubmoduleUpdate < QB::Ansible::Module
|
|
133
123
|
return false
|
134
124
|
end
|
135
125
|
|
136
|
-
|
126
|
+
logger.debug "commit is head of local master, using that."
|
137
127
|
|
138
128
|
when 1
|
139
|
-
|
129
|
+
logger.debug "the commit is head of one local branch, using it."
|
140
130
|
|
141
131
|
branch_head = local[0]
|
142
132
|
|
143
133
|
else
|
144
|
-
|
134
|
+
logger.debug "the commit heads multiple local branches..."
|
145
135
|
|
146
136
|
# again, see if one is master
|
147
137
|
branch_head = local.find {|b| b[:ref].end_with? 'master'}
|
@@ -157,28 +147,30 @@ class GitSubmoduleUpdate < QB::Ansible::Module
|
|
157
147
|
return false
|
158
148
|
end
|
159
149
|
|
160
|
-
|
150
|
+
logger.debug "commit is head of remote master, using that."
|
161
151
|
end # case local.length
|
162
152
|
end # case branch_heads.length
|
163
153
|
|
164
|
-
|
154
|
+
logger.debug \
|
155
|
+
"attaching #{ submodule[:rel_dir] } to #{ branch_head[:ref] }..."
|
165
156
|
|
166
157
|
branch = branch_head[:ref].split('/')[-1]
|
167
158
|
|
168
159
|
Dir.chdir submodule[:dir] do
|
169
|
-
|
160
|
+
logger.debug \
|
161
|
+
"checking out branch #{ branch } for #{ submodule[:rel_dir] }..."
|
170
162
|
|
171
163
|
Cmds! "git checkout <%= branch %>", branch: branch
|
172
164
|
|
173
165
|
# do a pull if the head was on the remote
|
174
166
|
if branch_head[:ref].start_with? 'refs/remotes'
|
175
|
-
|
167
|
+
logger.debug "commit is head of remote branch, pulling..."
|
176
168
|
|
177
169
|
Cmds! "git pull origin <%= branch %>", branch: branch
|
178
170
|
end
|
179
171
|
end
|
180
172
|
|
181
|
-
|
173
|
+
logger.debug "attached."
|
182
174
|
@changed = true
|
183
175
|
true
|
184
176
|
end
|
@@ -193,5 +185,3 @@ class GitSubmoduleUpdate < QB::Ansible::Module
|
|
193
185
|
nil
|
194
186
|
end
|
195
187
|
end
|
196
|
-
|
197
|
-
GitSubmoduleUpdate.new.run
|
@@ -1,15 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# WANT_JSON
|
3
3
|
|
4
|
-
#
|
5
|
-
|
6
|
-
ENV.each {|k, v|
|
7
|
-
if k.start_with? 'QB_DEV_ENV_'
|
8
|
-
ENV[k.sub('QB_DEV_ENV_', '')] = v
|
9
|
-
end
|
10
|
-
}
|
11
|
-
require 'bundler/setup'
|
12
|
-
end
|
4
|
+
# Load QB's Ansible module autorun harness
|
5
|
+
load ENV['QB_AM_AUTORUN_PATH']
|
13
6
|
|
14
7
|
require 'json'
|
15
8
|
require 'pathname'
|
@@ -17,9 +10,6 @@ require 'pathname'
|
|
17
10
|
require 'qb'
|
18
11
|
require 'cmds'
|
19
12
|
require 'nrser'
|
20
|
-
require 'nrser/refinements'
|
21
|
-
|
22
|
-
using NRSER
|
23
13
|
|
24
14
|
class Version
|
25
15
|
# raw version string if available (version was read from file or whatever),
|
@@ -91,7 +81,7 @@ class Version
|
|
91
81
|
end # Version
|
92
82
|
|
93
83
|
|
94
|
-
# abstract base class for bumpers - classes that implement reading and
|
84
|
+
# abstract base class for bumpers - classes that implement reading and
|
95
85
|
# writing Version objects to a package directory.
|
96
86
|
class Bumper
|
97
87
|
# absolute path to the root directory of the package.
|
@@ -205,7 +195,7 @@ class Bump < QB::Ansible::Module
|
|
205
195
|
end # #next_rc
|
206
196
|
|
207
197
|
|
208
|
-
def bump_rc
|
198
|
+
def bump_rc
|
209
199
|
@next_version = @bumper.bump! prerelease: ['rc', next_rc]
|
210
200
|
@next_version_formatted = @bumper.class.format @next_version
|
211
201
|
|
@@ -268,5 +258,3 @@ class Bump < QB::Ansible::Module
|
|
268
258
|
end
|
269
259
|
|
270
260
|
end # Bump
|
271
|
-
|
272
|
-
Bump.new.run
|
@@ -5,11 +5,16 @@
|
|
5
5
|
#
|
6
6
|
|
7
7
|
# prefix for role variables
|
8
|
-
var_prefix:
|
8
|
+
var_prefix: qb_role
|
9
9
|
|
10
|
-
# how to get a default for `dir` if it's not provided as the
|
10
|
+
# how to get a default for `dir` if it's not provided as the
|
11
11
|
default_dir: null
|
12
12
|
|
13
|
-
options:
|
14
|
-
- include: qb/role
|
15
|
-
|
13
|
+
options:
|
14
|
+
- include: qb/role
|
15
|
+
as: false
|
16
|
+
|
17
|
+
- name: default_dir
|
18
|
+
description: >-
|
19
|
+
Optional `default_dir` value for QB metadata (meta/qb.yml).
|
20
|
+
type: default_dir
|
@@ -15,7 +15,12 @@ description: >-
|
|
15
15
|
# Gemspec-style requirements. Right now only `.gems.qb` is used.
|
16
16
|
requirements:
|
17
17
|
gems:
|
18
|
-
|
18
|
+
# Role options taking advantage of the {NRSER::Types} system require
|
19
|
+
# QB 0.4.
|
20
|
+
#
|
21
|
+
# TODO Change this to `>= 0.4.0` when 0.4.0 is released.
|
22
|
+
#
|
23
|
+
qb: '>= 0.4.0.dev'
|
19
24
|
|
20
25
|
# Prefix for role variables
|
21
26
|
var_prefix: {{ role_namespaceless }}
|
@@ -24,7 +29,7 @@ var_prefix: {{ role_namespaceless }}
|
|
24
29
|
#
|
25
30
|
# @see http://www.rubydoc.info/gems/qb/file/doc/qb_roles/metadata/default_dir.md
|
26
31
|
#
|
27
|
-
default_dir:
|
32
|
+
default_dir: {{ qb_role_default_dir | to_json }}
|
28
33
|
|
29
34
|
# If `true`, QB will ensure `DIRECTORY` exists before starting the play.
|
30
35
|
mkdir: false
|
@@ -1,45 +1,34 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# WANT_JSON
|
3
3
|
|
4
|
-
#
|
5
|
-
|
6
|
-
ENV.each {|k, v|
|
7
|
-
if k.start_with? 'QB_DEV_ENV_'
|
8
|
-
ENV[k.sub('QB_DEV_ENV_', '')] = v
|
9
|
-
end
|
10
|
-
}
|
11
|
-
require 'bundler/setup'
|
12
|
-
end
|
13
|
-
|
14
|
-
require 'qb'
|
15
|
-
require 'nrser'
|
4
|
+
# Load QB's Ansible module autorun harness
|
5
|
+
load ENV['QB_AM_AUTORUN_PATH']
|
16
6
|
|
17
7
|
class {{ role_module_class }} < QB::Ansible::Module
|
18
|
-
|
19
|
-
#
|
20
|
-
#
|
21
|
-
# example:
|
22
|
-
#
|
23
|
-
# arg :x, NRSER::Types.array(String)
|
8
|
+
|
9
|
+
# Arguments
|
10
|
+
# ==========================================================================
|
24
11
|
#
|
25
|
-
#
|
26
|
-
# is an Array of String instances, then set it's value as `@x`.
|
12
|
+
# Define arguments using the {NRSER::Props} system.
|
27
13
|
#
|
28
14
|
|
29
|
-
#
|
15
|
+
# Execution
|
16
|
+
# ==========================================================================
|
17
|
+
|
18
|
+
# Entry point for the module. invoked by {\#run}.
|
30
19
|
#
|
31
20
|
# @return [nil | {Symbol => #to_json}]
|
32
21
|
# when returning:
|
33
22
|
#
|
34
23
|
# - `nil`: module will successfully exit with no additional changes.
|
35
24
|
#
|
36
|
-
# - `{Symbol => #to_json}`: Hash will be merged over @facts that
|
25
|
+
# - `{Symbol => #to_json}`: Hash will be merged over @facts that
|
37
26
|
# are returned by the module to be set in the Ansible runtime and
|
38
27
|
# the module will exit successfully.
|
39
28
|
#
|
40
29
|
def main
|
41
30
|
return nil
|
42
31
|
end # #main
|
32
|
+
|
43
33
|
end # {{ role_module_class }}
|
44
34
|
|
45
|
-
{{ role_module_class }}.new.run
|
@@ -3,7 +3,20 @@
|
|
3
3
|
# Ansible metadata for `{{ role_role_name }}` role
|
4
4
|
##############################################################################
|
5
5
|
|
6
|
-
|
6
|
+
# `no` means duplicate invocations with the *same* parameters (vars) will not
|
7
|
+
# be run.
|
8
|
+
#
|
9
|
+
# This is *usually* what you want for idempotent roles: if roles A
|
10
|
+
# and B both want a resource R in a particular state, they can both include
|
11
|
+
# or depend on a role C that accepts that state as paramters and C will be
|
12
|
+
# run only once.
|
13
|
+
#
|
14
|
+
# However, non-idemptent roles - say one that logs message - will want to set
|
15
|
+
# this value to `yes`.
|
16
|
+
#
|
17
|
+
# https://docs.ansible.com/ansible/devel/user_guide/playbooks_reuse_roles.html#role-duplication-and-execution
|
18
|
+
#
|
19
|
+
allow_duplicates: no
|
7
20
|
|
8
21
|
dependencies: []
|
9
22
|
# - role: role-name
|
@@ -1,6 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
# So that this script can be called from places other than the Gemfile dir,
|
4
|
+
# like when it's in `//dev/bin/console` and the Gemfile is at `//dev/Gemfile`
|
5
|
+
Dir.chdir __dir__ do
|
6
|
+
require "bundler/setup"
|
7
|
+
end
|
4
8
|
|
5
9
|
# Load `nrser` gem and use refinements if it's available
|
6
10
|
begin
|
@@ -9,11 +13,13 @@ rescue LoadError => error
|
|
9
13
|
puts "WARN -- Failed to load `nrser` gem."
|
10
14
|
puts "WARN -- Add it do your dependencies or edit #{ __FILE__ }"
|
11
15
|
else
|
12
|
-
|
16
|
+
require 'nrser/refinements/types'
|
13
17
|
using NRSER::Types
|
14
18
|
end
|
15
19
|
|
20
|
+
{% if qb_gem_info is defined %}
|
16
21
|
require '{{ qb_gem_info.name }}'
|
22
|
+
{% endif %}
|
17
23
|
|
18
24
|
# You can add fixtures and/or initialization code here to make experimenting
|
19
25
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -11,7 +11,7 @@ description: null
|
|
11
11
|
# generalize in the future.
|
12
12
|
requirements:
|
13
13
|
gems:
|
14
|
-
qb:
|
14
|
+
qb: '>= 0.3.0'
|
15
15
|
|
16
16
|
# prefix for role variables
|
17
17
|
var_prefix: false # Don't prefix variables
|
@@ -33,11 +33,11 @@ var_prefix: false # Don't prefix variables
|
|
33
33
|
# - cwd
|
34
34
|
# - use the directory the `qb` command is invoked form.
|
35
35
|
# - {exe: PATH}
|
36
|
-
# - invoke an executable, passing a JSON serialization of the options
|
36
|
+
# - invoke an executable, passing a JSON serialization of the options
|
37
37
|
# mapping their CLI names to values. path can be relative to role
|
38
38
|
# directory.
|
39
39
|
# - {find_up: FILENAME}
|
40
|
-
# - starting at the current directory and climbing up to parent
|
40
|
+
# - starting at the current directory and climbing up to parent
|
41
41
|
# directories, use the first one that contains FILENAME. error
|
42
42
|
# if none is found.
|
43
43
|
default_dir: null
|
@@ -45,7 +45,7 @@ default_dir: null
|
|
45
45
|
# If `true`, QB will ensure the default dir exists before starting the play.
|
46
46
|
#
|
47
47
|
# For legacy reasons, this defaults to `true` if not present, but we want to
|
48
|
-
# default declare it as `false` here so new roles can turn it on only if
|
48
|
+
# default declare it as `false` here so new roles can turn it on only if
|
49
49
|
# they need it.
|
50
50
|
#
|
51
51
|
mkdir: false
|
@@ -76,7 +76,7 @@ options:
|
|
76
76
|
- name: require
|
77
77
|
description: >-
|
78
78
|
Explicitly specify files to require at the top of spec files.
|
79
|
-
When not provided, will add all `<spec_dir>/*_helper.rb` files that
|
79
|
+
When not provided, will add all `<spec_dir>/*_helper.rb` files that
|
80
80
|
are NOT auto-required via `<gem_root>/.rspec`.
|
81
81
|
required: false
|
82
82
|
type: list
|