qb 0.3.15 → 0.3.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/qb/ansible/module.rb +80 -10
- data/lib/qb/package.rb +4 -14
- data/lib/qb/path.rb +21 -18
- data/lib/qb/repo.rb +5 -15
- data/lib/qb/repo/git.rb +69 -53
- data/lib/qb/repo/git/github.rb +12 -4
- data/lib/qb/repo/git/user.rb +33 -0
- data/lib/qb/role.rb +22 -22
- data/lib/qb/version.rb +1 -1
- data/library/path_facts +0 -90
- data/qb.gemspec +2 -2
- data/roles/qb/git/check/clean/defaults/main.yml +7 -0
- data/roles/qb/git/check/clean/meta/qb.yml +48 -0
- data/roles/qb/git/check/clean/tasks/main.yml +26 -10
- data/roles/qb/role/meta/qb.yml +3 -3
- data/roles/qb/role/qb/templates/qb.yml.j2 +1 -1
- data/roles/qb/ruby/dependency/.qb-options.yml +4 -0
- data/roles/qb/ruby/dependency/defaults/main.yml +23 -0
- data/roles/qb/ruby/dependency/filter_plugins/dependency_filters.py +207 -0
- data/roles/qb/ruby/dependency/meta/main.yml +10 -0
- data/roles/qb/ruby/dependency/meta/qb.yml +49 -0
- data/roles/qb/ruby/dependency/tasks/detect_type.yml +18 -0
- data/roles/qb/ruby/dependency/tasks/main.yml +16 -0
- data/roles/qb/ruby/dependency/tasks/types/gemfile.yml +6 -0
- data/roles/qb/ruby/dependency/tasks/types/gemspec.yml +71 -0
- data/roles/qb/{gem → ruby/gem}/bin_stubs/defaults/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/bin_stubs/meta/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/bin_stubs/meta/qb.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/bin_stubs/tasks/main.yml +1 -1
- data/roles/qb/ruby/gem/bin_stubs/templates/console +33 -0
- data/roles/qb/{gem → ruby/gem}/bin_stubs/templates/rake +0 -0
- data/roles/qb/{gem → ruby/gem}/bin_stubs/templates/rspec +0 -0
- data/roles/qb/{gem → ruby/gem}/build/defaults/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/build/meta/main.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/build/meta/qb.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/build/tasks/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/install/defaults/main.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/install/meta/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/install/meta/qb.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/install/tasks/main.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/new/defaults/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/new/meta/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/new/meta/qb.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/new/tasks/bundle_gem.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/new/tasks/main.yml +1 -1
- data/roles/qb/ruby/gem/release/defaults/main.yml +5 -0
- data/roles/qb/{gem → ruby/gem}/release/meta/main.yml +1 -1
- data/roles/qb/ruby/gem/release/meta/qb.yml +27 -0
- data/roles/qb/{gem → ruby/gem}/release/tasks/main.yml +4 -6
- data/roles/qb/ruby/gem/release/tasks/release.yml +42 -0
- data/roles/qb/ruby/rspec/setup/defaults/main.yml +7 -0
- data/roles/qb/ruby/rspec/setup/meta/main.yml +9 -0
- data/roles/qb/ruby/rspec/setup/meta/qb.yml +47 -0
- data/roles/qb/ruby/rspec/setup/tasks/main.yml +4 -0
- data/roles/qb/ruby/rspec/setup/tasks/persistence.yml +0 -0
- data/roles/qb/ruby/yard/clean/defaults/main.yml +7 -0
- data/roles/qb/ruby/yard/clean/meta/main.yml +9 -0
- data/roles/qb/ruby/yard/clean/meta/qb.yml +48 -0
- data/roles/qb/ruby/yard/clean/tasks/main.yml +27 -0
- data/roles/qb/ruby/yard/config/.qb-options.yml +4 -0
- data/roles/qb/ruby/yard/config/defaults/main.yml +15 -0
- data/roles/qb/ruby/yard/config/library/yard.get_output_dir +59 -0
- data/roles/qb/ruby/yard/config/meta/main.yml +10 -0
- data/roles/qb/ruby/yard/config/meta/qb.yml +49 -0
- data/roles/qb/ruby/yard/config/tasks/get_yard_output_dir.yml +10 -0
- data/roles/qb/ruby/yard/config/tasks/main.yml +4 -0
- data/roles/qb/ruby/yard/setup/defaults/main.yml +6 -0
- data/roles/qb/ruby/yard/{meta → setup/meta}/main.yml +2 -1
- data/roles/qb/ruby/yard/{meta → setup/meta}/qb.yml +5 -5
- data/roles/qb/ruby/yard/setup/tasks/main.yml +35 -0
- data/roles/qb/ruby/yard/setup/tasks/versions/v0.9.yml +32 -0
- data/roles/qb/ruby/yard/setup/tasks/yardopts.yml +59 -0
- metadata +65 -35
- data/roles/qb/gem/bin_stubs/templates/console +0 -25
- data/roles/qb/gem/release/defaults/main.yml +0 -5
- data/roles/qb/gem/release/meta/qb.yml +0 -21
- data/roles/qb/ruby/yard/defaults/args.yml +0 -2
- data/roles/qb/ruby/yard/defaults/main.yml +0 -9
- data/roles/qb/ruby/yard/tasks/main.yml +0 -28
data/roles/qb/role/meta/qb.yml
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
# prefix for role variables
|
8
8
|
var_prefix: 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
13
|
vars:
|
@@ -98,9 +98,9 @@ vars:
|
|
98
98
|
- |
|
99
99
|
Generates a `filter_plugins/filter_plugins.py`
|
100
100
|
|
101
|
-
qb qb.role roles/owner.new_role --filter-plugins
|
101
|
+
qb qb.role roles/owner.new_role --filter-plugins=true
|
102
102
|
|
103
103
|
|
104
104
|
|
105
105
|
- include: qb/project
|
106
|
-
|
106
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
##############################################################################
|
3
|
+
# Variable defaults for `qb/ruby/dependency` role
|
4
|
+
#
|
5
|
+
# @see http://docs.ansible.com/ansible/latest/playbooks_reuse_roles.html#role-default-variables
|
6
|
+
#
|
7
|
+
##############################################################################
|
8
|
+
|
9
|
+
# Default to target the QB DIRECTORY
|
10
|
+
bundle_root: >-
|
11
|
+
{{ qb_dir }}
|
12
|
+
|
13
|
+
# Default to present
|
14
|
+
ruby_dep_state: present
|
15
|
+
|
16
|
+
# Default to no version spec
|
17
|
+
ruby_dep_version: null
|
18
|
+
|
19
|
+
# Default to no comment
|
20
|
+
ruby_dep_comment: null
|
21
|
+
|
22
|
+
# Default to a runtime dependency
|
23
|
+
ruby_dep_dev: false
|
@@ -0,0 +1,207 @@
|
|
1
|
+
#!/usr/bin/env python2
|
2
|
+
##############################################################################
|
3
|
+
# `dependency` Ansible/Jinja2 filters for `qb/ruby/dependency` role.
|
4
|
+
##############################################################################
|
5
|
+
|
6
|
+
|
7
|
+
# Imports
|
8
|
+
# ============================================================================
|
9
|
+
|
10
|
+
# Make Python 2 more Python 3-like
|
11
|
+
from __future__ import (absolute_import, division, print_function)
|
12
|
+
__metaclass__ = type
|
13
|
+
|
14
|
+
from ansible.errors import AnsibleError
|
15
|
+
|
16
|
+
# Some imports you may often want:
|
17
|
+
# import sys
|
18
|
+
# improt os
|
19
|
+
# import subprocess
|
20
|
+
# import yaml
|
21
|
+
# improt json
|
22
|
+
|
23
|
+
|
24
|
+
# Utilities
|
25
|
+
# ============================================================================
|
26
|
+
|
27
|
+
def kwd_args(f):
|
28
|
+
'''
|
29
|
+
Decorator to convert a single dict arg to keyword args.
|
30
|
+
|
31
|
+
Allows usage of filter with keyword args as "subject" or whatever you
|
32
|
+
call it:
|
33
|
+
|
34
|
+
{
|
35
|
+
'owner': 'beiarea',
|
36
|
+
'name': 'www-rails_web',
|
37
|
+
'tag': '0.1.2'
|
38
|
+
} | to_image_id
|
39
|
+
|
40
|
+
'''
|
41
|
+
def new_f(*args, **kwds):
|
42
|
+
if len(args) == 1 and isinstance(args[0], dict):
|
43
|
+
return f(**args[0])
|
44
|
+
else:
|
45
|
+
return f(*args, **kwds)
|
46
|
+
|
47
|
+
return new_f
|
48
|
+
|
49
|
+
|
50
|
+
def quote(string):
|
51
|
+
'''
|
52
|
+
A dumb and bad sinlge quoert that relies on the argument not having any
|
53
|
+
single quotes in it.
|
54
|
+
|
55
|
+
:param string: str String to quote
|
56
|
+
:rtype: str
|
57
|
+
'''
|
58
|
+
return "'{}'".format(string)
|
59
|
+
|
60
|
+
|
61
|
+
def gemspec_dep_call(dev):
|
62
|
+
'''
|
63
|
+
Get the correct 'spec.add_dependency' or 'spec.add_development_dependency'
|
64
|
+
depending on `dev`.
|
65
|
+
|
66
|
+
:param dev: bool
|
67
|
+
:rtype: str
|
68
|
+
'''
|
69
|
+
|
70
|
+
if dev:
|
71
|
+
return 'spec.add_development_dependency'
|
72
|
+
else:
|
73
|
+
return 'spec.add_dependency'
|
74
|
+
|
75
|
+
|
76
|
+
# Filter Functions
|
77
|
+
# ============================================================================
|
78
|
+
#
|
79
|
+
# Suggested practice seems to be to define each filter as a top-level function
|
80
|
+
# then expose them via the `FilterModule#filters` method below.
|
81
|
+
#
|
82
|
+
|
83
|
+
def gemspec_dep_line(name, version = None, dev = False, indent = ' '):
|
84
|
+
'''
|
85
|
+
Generate a dependency line for a `.gemspec` file.
|
86
|
+
|
87
|
+
:param name: The gem name
|
88
|
+
:type name: str
|
89
|
+
|
90
|
+
:param version: The optional version spec(s)
|
91
|
+
:type version: None | str | list<str>
|
92
|
+
|
93
|
+
:param dev: If the dependency is development or not
|
94
|
+
:type dev: bool
|
95
|
+
|
96
|
+
:return: The dependency line for the `.gemspec` file.
|
97
|
+
:rtype: str
|
98
|
+
|
99
|
+
>>> gemspec_dep_line(name = 'yard')
|
100
|
+
" spec.add_dependency 'yard'"
|
101
|
+
|
102
|
+
>>> gemspec_dep_line(
|
103
|
+
... name = 'yard',
|
104
|
+
... version = '~> 0.9.12',
|
105
|
+
... )
|
106
|
+
" spec.add_dependency 'yard', '~> 0.9.12'"
|
107
|
+
|
108
|
+
>>> gemspec_dep_line(
|
109
|
+
... name = 'yard',
|
110
|
+
... version = '~> 0.9.12',
|
111
|
+
... dev = True,
|
112
|
+
... )
|
113
|
+
" spec.add_development_dependency 'yard', '~> 0.9.12'"
|
114
|
+
|
115
|
+
>>> gemspec_dep_line(
|
116
|
+
... name = 'bundler',
|
117
|
+
... version = ['~> 1.16', '>= 1.16.1'],
|
118
|
+
... dev = True,
|
119
|
+
... )
|
120
|
+
" spec.add_development_dependency 'bundler', '~> 1.16', '>= 1.16.1'"
|
121
|
+
'''
|
122
|
+
|
123
|
+
call = gemspec_dep_call(dev)
|
124
|
+
args = [quote(name)]
|
125
|
+
|
126
|
+
if not version is None:
|
127
|
+
if isinstance(version, list):
|
128
|
+
for condition in version:
|
129
|
+
args.append(
|
130
|
+
quote(condition)
|
131
|
+
)
|
132
|
+
else:
|
133
|
+
args.append(quote(version))
|
134
|
+
|
135
|
+
return "{}{} {}".format(indent, call, ", ".join(args))
|
136
|
+
|
137
|
+
|
138
|
+
def gemspec_dep_re_str(name, version = None, dev = False):
|
139
|
+
'''
|
140
|
+
Generate a regex string for Ansible's `lineinfile` module to match
|
141
|
+
a dependency line for a `.gemspec` file.
|
142
|
+
|
143
|
+
Params
|
144
|
+
|
145
|
+
:rtype: str
|
146
|
+
|
147
|
+
Does not doctest well due to backslashness.
|
148
|
+
'''
|
149
|
+
|
150
|
+
call = gemspec_dep_call(dev)
|
151
|
+
|
152
|
+
return "^\\s+{call}\s+[\\'\\\"]{name}[\\'\\\"]".format(
|
153
|
+
call = call,
|
154
|
+
name = name,
|
155
|
+
)
|
156
|
+
|
157
|
+
|
158
|
+
def gemspec_dep_insert_after(name, version = None, dev = False):
|
159
|
+
'''
|
160
|
+
Generate a regex string for Ansible's `lineinfile` module to match
|
161
|
+
the last `spec.add_dependency` or `spec.add_development_dependency`,
|
162
|
+
depending on `dev`.
|
163
|
+
|
164
|
+
Does not doctest well due to backslashness.
|
165
|
+
|
166
|
+
:rtype: str
|
167
|
+
'''
|
168
|
+
|
169
|
+
call = gemspec_dep_call(dev)
|
170
|
+
|
171
|
+
return "^\\s+{call}".format(call = call)
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
# Module
|
176
|
+
# ============================================================================
|
177
|
+
#
|
178
|
+
# How Ansible finds the filters. It looks like it gets instantiated with
|
179
|
+
# no arguments, at least most of the time, so it pretty much just serves as
|
180
|
+
# a well-known name to obtain the function references from.
|
181
|
+
#
|
182
|
+
class FilterModule(object):
|
183
|
+
'''
|
184
|
+
Ansible/Jinja2 filters for `qb/ruby/dependency` role.
|
185
|
+
'''
|
186
|
+
|
187
|
+
def filters(self):
|
188
|
+
return {
|
189
|
+
'to_gemspec_dep_line': kwd_args(gemspec_dep_line),
|
190
|
+
'to_gemspec_dep_re_str': kwd_args(gemspec_dep_re_str),
|
191
|
+
'to_gemspec_dep_insert_after': kwd_args(gemspec_dep_insert_after),
|
192
|
+
}
|
193
|
+
# filters()
|
194
|
+
# FilterModule
|
195
|
+
|
196
|
+
|
197
|
+
# Testing
|
198
|
+
# ============================================================================
|
199
|
+
#
|
200
|
+
# This is not standard Ansible-ness - they use `unittest.TestCase` in separate
|
201
|
+
# files - but `doctest` seemed like a really easy way to add and run tests
|
202
|
+
# for these typically simple functions.
|
203
|
+
#
|
204
|
+
if __name__ == '__main__':
|
205
|
+
import doctest
|
206
|
+
doctest.testmod()
|
207
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
---
|
2
|
+
##############################################################################
|
3
|
+
# Ansible metadata for `qb/ruby/dependency` role
|
4
|
+
##############################################################################
|
5
|
+
|
6
|
+
allow_duplicates: yes
|
7
|
+
|
8
|
+
dependencies: []
|
9
|
+
# - role: role-name
|
10
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
---
|
2
|
+
##############################################################################
|
3
|
+
# QB metadata for `qb/ruby/dependency` role.
|
4
|
+
#
|
5
|
+
# QB settings for this role.
|
6
|
+
#
|
7
|
+
# @see http://www.rubydoc.info/gems/qb/file/doc/qb_roles/metadata.md
|
8
|
+
#
|
9
|
+
##############################################################################
|
10
|
+
|
11
|
+
# Shown in help output, etc.
|
12
|
+
description: >-
|
13
|
+
TODO describe qb/ruby/dependency role
|
14
|
+
|
15
|
+
# Gemspec-style requirements. Right now only `.gems.qb` is used.
|
16
|
+
requirements:
|
17
|
+
gems:
|
18
|
+
qb: ~> 0.3.0
|
19
|
+
|
20
|
+
# Prefix for role variables
|
21
|
+
var_prefix: dependency
|
22
|
+
|
23
|
+
# How to get a default for `DIRECTORY` arg if not provided by user.
|
24
|
+
#
|
25
|
+
# @see http://www.rubydoc.info/gems/qb/file/doc/qb_roles/metadata/default_dir.md
|
26
|
+
#
|
27
|
+
default_dir:
|
28
|
+
- find_up: '*.gemspec'
|
29
|
+
- find_up: Gemfile
|
30
|
+
|
31
|
+
# If `true`, QB will ensure `DIRECTORY` exists before starting the play.
|
32
|
+
mkdir: false
|
33
|
+
|
34
|
+
# Default user to become for play
|
35
|
+
default_user: null
|
36
|
+
|
37
|
+
# Save options in `.qb-options.yml` files
|
38
|
+
save_options: true
|
39
|
+
|
40
|
+
# Options to pass to `ansible-playbook`
|
41
|
+
ansible_options: {}
|
42
|
+
|
43
|
+
# Role CLI options that become Ansible vars
|
44
|
+
options: []
|
45
|
+
# - name: example
|
46
|
+
# description: an example of a variable.
|
47
|
+
# required: false
|
48
|
+
# type: boolean # boolean (default) | string
|
49
|
+
# short: e
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
##
|
3
|
+
# Detect the type of `bundle_root` - gemspec or gemfile
|
4
|
+
##
|
5
|
+
|
6
|
+
- when: bundle_root_path_facts is not defined
|
7
|
+
name: >-
|
8
|
+
Get QB path facts for the bundle root at `{{ bundle_root }}`
|
9
|
+
path_facts:
|
10
|
+
path: >-
|
11
|
+
{{ bundle_root }}
|
12
|
+
register: bundle_root_path_facts
|
13
|
+
|
14
|
+
- name: >-
|
15
|
+
Set bundle_root_type based on `bundle_root_path_facts`
|
16
|
+
set_fact:
|
17
|
+
bundle_root_type: >-
|
18
|
+
{{ ('gem' in bundle_root_path_facts) | ternary('gemspec', 'gemfile') }}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
##############################################################################
|
3
|
+
# Main tasks for `qb/ruby/dependency` role
|
4
|
+
##############################################################################
|
5
|
+
|
6
|
+
- when: bundle_root_type is not defined
|
7
|
+
name: >-
|
8
|
+
Include tasks to detect type of `bundle_root={{ bundle_root}}`
|
9
|
+
(gemspec or gemfile)
|
10
|
+
include_tasks: >-
|
11
|
+
{{ role_path }}/tasks/detect_type.yml
|
12
|
+
|
13
|
+
- name: >-
|
14
|
+
Include tasks to apply state to `{{ bundle_root_type }}` type
|
15
|
+
include_tasks: >-
|
16
|
+
{{ role_path }}/tasks/types/{{ bundle_root_type }}.yml
|
@@ -0,0 +1,71 @@
|
|
1
|
+
---
|
2
|
+
##
|
3
|
+
# Apply dep state to a `.gemspec` file
|
4
|
+
##
|
5
|
+
|
6
|
+
- name: >-
|
7
|
+
Apply `{{ ruby_dep_state }}` state to `{{ ruby_dep_name }}` dep in
|
8
|
+
gemspec at `{{ bundle_root_path_facts.gem.gemspec_path }}`
|
9
|
+
|
10
|
+
lineinfile:
|
11
|
+
state: >-
|
12
|
+
{{ ruby_dep_state }}
|
13
|
+
|
14
|
+
path: >-
|
15
|
+
{{ bundle_root_path_facts.gem.gemspec_path }}
|
16
|
+
|
17
|
+
line: >-
|
18
|
+
{{
|
19
|
+
{
|
20
|
+
'name': ruby_dep_name,
|
21
|
+
'version': ruby_dep_version,
|
22
|
+
'dev': ruby_dep_dev,
|
23
|
+
} | to_gemspec_dep_line
|
24
|
+
}}
|
25
|
+
|
26
|
+
# Match any dependency of this type (runtime vs dev) for this gem
|
27
|
+
regexp: >-
|
28
|
+
{{
|
29
|
+
{
|
30
|
+
'name': ruby_dep_name,
|
31
|
+
'version': ruby_dep_version,
|
32
|
+
'dev': ruby_dep_dev,
|
33
|
+
} | to_gemspec_dep_re_str
|
34
|
+
}}
|
35
|
+
|
36
|
+
# Insert after the *last* `spec.add_dependency` or
|
37
|
+
# `spec.add_development_dependency` (depending on if the dep is dev)
|
38
|
+
insertafter: >-
|
39
|
+
{{
|
40
|
+
{
|
41
|
+
'name': ruby_dep_name,
|
42
|
+
'version': ruby_dep_version,
|
43
|
+
'dev': ruby_dep_dev,
|
44
|
+
} | to_gemspec_dep_insert_after
|
45
|
+
}}
|
46
|
+
|
47
|
+
|
48
|
+
- when: >-
|
49
|
+
ruby_dep_comment and ruby_dep_state == 'present'
|
50
|
+
|
51
|
+
name: >-
|
52
|
+
Add the comment above the dep line
|
53
|
+
|
54
|
+
lineinfile:
|
55
|
+
state: present
|
56
|
+
|
57
|
+
path: >-
|
58
|
+
{{ bundle_root_path_facts.gem.gemspec_path }}
|
59
|
+
|
60
|
+
line: >-
|
61
|
+
{{ ' # ' + ruby_dep_comment }}
|
62
|
+
|
63
|
+
# Insert it before the dep line, using the same regexp to find it
|
64
|
+
insertbefore: >-
|
65
|
+
{{
|
66
|
+
{
|
67
|
+
'name': ruby_dep_name,
|
68
|
+
'version': ruby_dep_version,
|
69
|
+
'dev': ruby_dep_dev,
|
70
|
+
} | to_gemspec_dep_re_str
|
71
|
+
}}
|