qb 0.3.15 → 0.3.16

Sign up to get free protection for your applications and to get access to all the features.
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
+ }}