qb 0.3.15 → 0.3.16

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/lib/qb/ansible/module.rb +80 -10
  3. data/lib/qb/package.rb +4 -14
  4. data/lib/qb/path.rb +21 -18
  5. data/lib/qb/repo.rb +5 -15
  6. data/lib/qb/repo/git.rb +69 -53
  7. data/lib/qb/repo/git/github.rb +12 -4
  8. data/lib/qb/repo/git/user.rb +33 -0
  9. data/lib/qb/role.rb +22 -22
  10. data/lib/qb/version.rb +1 -1
  11. data/library/path_facts +0 -90
  12. data/qb.gemspec +2 -2
  13. data/roles/qb/git/check/clean/defaults/main.yml +7 -0
  14. data/roles/qb/git/check/clean/meta/qb.yml +48 -0
  15. data/roles/qb/git/check/clean/tasks/main.yml +26 -10
  16. data/roles/qb/role/meta/qb.yml +3 -3
  17. data/roles/qb/role/qb/templates/qb.yml.j2 +1 -1
  18. data/roles/qb/ruby/dependency/.qb-options.yml +4 -0
  19. data/roles/qb/ruby/dependency/defaults/main.yml +23 -0
  20. data/roles/qb/ruby/dependency/filter_plugins/dependency_filters.py +207 -0
  21. data/roles/qb/ruby/dependency/meta/main.yml +10 -0
  22. data/roles/qb/ruby/dependency/meta/qb.yml +49 -0
  23. data/roles/qb/ruby/dependency/tasks/detect_type.yml +18 -0
  24. data/roles/qb/ruby/dependency/tasks/main.yml +16 -0
  25. data/roles/qb/ruby/dependency/tasks/types/gemfile.yml +6 -0
  26. data/roles/qb/ruby/dependency/tasks/types/gemspec.yml +71 -0
  27. data/roles/qb/{gem → ruby/gem}/bin_stubs/defaults/main.yml +1 -1
  28. data/roles/qb/{gem → ruby/gem}/bin_stubs/meta/main.yml +1 -1
  29. data/roles/qb/{gem → ruby/gem}/bin_stubs/meta/qb.yml +1 -1
  30. data/roles/qb/{gem → ruby/gem}/bin_stubs/tasks/main.yml +1 -1
  31. data/roles/qb/ruby/gem/bin_stubs/templates/console +33 -0
  32. data/roles/qb/{gem → ruby/gem}/bin_stubs/templates/rake +0 -0
  33. data/roles/qb/{gem → ruby/gem}/bin_stubs/templates/rspec +0 -0
  34. data/roles/qb/{gem → ruby/gem}/build/defaults/main.yml +1 -1
  35. data/roles/qb/{gem → ruby/gem}/build/meta/main.yml +0 -0
  36. data/roles/qb/{gem → ruby/gem}/build/meta/qb.yml +1 -1
  37. data/roles/qb/{gem → ruby/gem}/build/tasks/main.yml +1 -1
  38. data/roles/qb/{gem → ruby/gem}/install/defaults/main.yml +0 -0
  39. data/roles/qb/{gem → ruby/gem}/install/meta/main.yml +1 -1
  40. data/roles/qb/{gem → ruby/gem}/install/meta/qb.yml +0 -0
  41. data/roles/qb/{gem → ruby/gem}/install/tasks/main.yml +0 -0
  42. data/roles/qb/{gem → ruby/gem}/new/defaults/main.yml +1 -1
  43. data/roles/qb/{gem → ruby/gem}/new/meta/main.yml +1 -1
  44. data/roles/qb/{gem → ruby/gem}/new/meta/qb.yml +1 -1
  45. data/roles/qb/{gem → ruby/gem}/new/tasks/bundle_gem.yml +0 -0
  46. data/roles/qb/{gem → ruby/gem}/new/tasks/main.yml +1 -1
  47. data/roles/qb/ruby/gem/release/defaults/main.yml +5 -0
  48. data/roles/qb/{gem → ruby/gem}/release/meta/main.yml +1 -1
  49. data/roles/qb/ruby/gem/release/meta/qb.yml +27 -0
  50. data/roles/qb/{gem → ruby/gem}/release/tasks/main.yml +4 -6
  51. data/roles/qb/ruby/gem/release/tasks/release.yml +42 -0
  52. data/roles/qb/ruby/rspec/setup/defaults/main.yml +7 -0
  53. data/roles/qb/ruby/rspec/setup/meta/main.yml +9 -0
  54. data/roles/qb/ruby/rspec/setup/meta/qb.yml +47 -0
  55. data/roles/qb/ruby/rspec/setup/tasks/main.yml +4 -0
  56. data/roles/qb/ruby/rspec/setup/tasks/persistence.yml +0 -0
  57. data/roles/qb/ruby/yard/clean/defaults/main.yml +7 -0
  58. data/roles/qb/ruby/yard/clean/meta/main.yml +9 -0
  59. data/roles/qb/ruby/yard/clean/meta/qb.yml +48 -0
  60. data/roles/qb/ruby/yard/clean/tasks/main.yml +27 -0
  61. data/roles/qb/ruby/yard/config/.qb-options.yml +4 -0
  62. data/roles/qb/ruby/yard/config/defaults/main.yml +15 -0
  63. data/roles/qb/ruby/yard/config/library/yard.get_output_dir +59 -0
  64. data/roles/qb/ruby/yard/config/meta/main.yml +10 -0
  65. data/roles/qb/ruby/yard/config/meta/qb.yml +49 -0
  66. data/roles/qb/ruby/yard/config/tasks/get_yard_output_dir.yml +10 -0
  67. data/roles/qb/ruby/yard/config/tasks/main.yml +4 -0
  68. data/roles/qb/ruby/yard/setup/defaults/main.yml +6 -0
  69. data/roles/qb/ruby/yard/{meta → setup/meta}/main.yml +2 -1
  70. data/roles/qb/ruby/yard/{meta → setup/meta}/qb.yml +5 -5
  71. data/roles/qb/ruby/yard/setup/tasks/main.yml +35 -0
  72. data/roles/qb/ruby/yard/setup/tasks/versions/v0.9.yml +32 -0
  73. data/roles/qb/ruby/yard/setup/tasks/yardopts.yml +59 -0
  74. metadata +65 -35
  75. data/roles/qb/gem/bin_stubs/templates/console +0 -25
  76. data/roles/qb/gem/release/defaults/main.yml +0 -5
  77. data/roles/qb/gem/release/meta/qb.yml +0 -21
  78. data/roles/qb/ruby/yard/defaults/args.yml +0 -2
  79. data/roles/qb/ruby/yard/defaults/main.yml +0 -9
  80. data/roles/qb/ruby/yard/tasks/main.yml +0 -28
@@ -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
+
@@ -39,7 +39,7 @@ save_options: true
39
39
  ansible_options: {}
40
40
 
41
41
  # Role CLI options that become Ansible vars
42
- options: []
42
+ options:
43
43
  # - name: example
44
44
  # description: an example of a variable.
45
45
  # required: false
@@ -0,0 +1,4 @@
1
+ ---
2
+ qb/role/qb:
3
+ filter-plugins:
4
+ - 'true'
@@ -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,6 @@
1
+ ---
2
+ ##
3
+ # Apply state to a `Gemfile` file
4
+ ##
5
+
6
+ - fail: msg="FIXME: NOT IMPLEMENTED"
@@ -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
+ }}