qb 0.1.60 → 0.1.61

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/qb/options.rb +6 -6
  3. data/lib/qb/role.rb +20 -33
  4. data/lib/qb/role/errors.rb +30 -0
  5. data/lib/qb/version.rb +1 -1
  6. data/library/path_facts +304 -0
  7. data/plugins/lookup_plugins/every.py +165 -0
  8. data/roles/qb.facts/defaults/main.yml +3 -0
  9. data/roles/{qb.yarn → qb.facts}/meta/main.yml +1 -1
  10. data/roles/{qb.yarn → qb.facts}/meta/qb.yml +21 -26
  11. data/roles/qb.facts/tasks/main.yml +10 -0
  12. data/roles/qb.git_repo/defaults/main.yml +1 -0
  13. data/roles/qb.git_repo/meta/main.yml +1 -9
  14. data/roles/qb.git_repo/tasks/main.yml +26 -1
  15. data/roles/qb.qb_role/templates/qb.yml.j2 +8 -0
  16. data/roles/qb.role/defaults/main.yml +1 -1
  17. data/roles/qb.role/tasks/main.yml +1 -1
  18. data/roles/qb.yarn_release/defaults/main.yml +4 -0
  19. data/roles/{qb.release_yarn → qb.yarn_release}/meta/main.yml +1 -1
  20. data/roles/{qb.release_yarn → qb.yarn_release}/meta/qb.yml +1 -1
  21. data/roles/qb.yarn_release/tasks/main.yml +73 -0
  22. data/roles/qb.yarn_setup/defaults/main.yml +11 -0
  23. data/roles/qb.yarn_setup/meta/main.yml +8 -0
  24. data/roles/qb.yarn_setup/meta/qb.yml +100 -0
  25. data/roles/qb.yarn_setup/tasks/distribution/MacOSX/brew_create.yml +59 -0
  26. data/roles/qb.yarn_setup/tasks/distribution/MacOSX/main.yml +42 -0
  27. data/roles/qb.yarn_setup/tasks/main.yml +11 -0
  28. data/roles/qb.yarn_setup/templates/yarn@M.m.p.rb.j2 +22 -0
  29. metadata +20 -12
  30. data/lib/qb/options/errors.rb +0 -11
  31. data/roles/qb.release_yarn/defaults/main.yml +0 -4
  32. data/roles/qb.release_yarn/tasks/main.yml +0 -73
  33. data/roles/qb.yarn/defaults/main.yml +0 -5
  34. data/roles/qb.yarn/tasks/distribution/MacOSX.yml +0 -7
  35. data/roles/qb.yarn/tasks/main.yml +0 -11
@@ -0,0 +1,165 @@
1
+ """
2
+ DOCUMENTATION:
3
+ lookup: every
4
+ version_added: "QB-0.1.61"
5
+ short_description: Returns true for a key every X time delta (per host).
6
+ description:
7
+ - Returns `True` if more than a specified amount of time has passed
8
+ since it last returned `True` for that key for the current
9
+ `inventory_hostname` fact.
10
+
11
+ If it's never returned `True` for the `key` / `inventory_hostname`
12
+ combo it will.
13
+
14
+ This is useful to control updating - things like "run
15
+ `apt-get update` if it doesn't look like it's been run in a day",
16
+ etcetera.
17
+
18
+ ** WARNING: NOT AT ALL THREAD / CONCURRENCY SAFE **
19
+
20
+ This is meant for things that you're *rather not* have run too
21
+ often, it is not indented for and should not be used for
22
+ controlling stuff that *must not* be run more than a certain
23
+ frequency because it's a shit-simple implementation with
24
+ **NO LOCKING / CONCURRENCY SUPPORT** so if another thread or
25
+ process is trying to do the same thing at the same time they will
26
+ potentially both return `True` or who really knows what else.
27
+
28
+ Data is stored at `~/.ansible/qb/data/every.yml`. This should
29
+ probably be configurable for for the moment it will do.
30
+
31
+ options:
32
+ key:
33
+ description:
34
+ - Required single positional argument, used as the key to
35
+ store / retrieve data.
36
+ required: True
37
+ **kwargs:
38
+ description:
39
+ - Accepts all the Python `datetime.timedelta` constructor
40
+ keywords. Requires at least one.
41
+
42
+ You can set the delta to zero (so it returns True every
43
+ call) by providing `days=0` or similar (useful to test
44
+ stuff out maybe).
45
+ required: True
46
+ EXAMPLES:
47
+
48
+ - name: Install Yarn via Homebrew, updating Homebrew at most once per day
49
+ homebrew:
50
+ name: yarn
51
+ update_homebrew: "{{ lookup('every', 'update_homebrew' days=1) }}"
52
+
53
+ RETURN:
54
+
55
+ `True` if it's been more than the provided period since the lookup returned
56
+ `True` last for this key /
57
+
58
+ """
59
+
60
+ from __future__ import (absolute_import, division, print_function)
61
+ __metaclass__ = type
62
+
63
+ from ansible.errors import AnsibleError
64
+ from ansible.plugins.lookup import LookupBase
65
+
66
+ try:
67
+ from __main__ import display
68
+ except ImportError:
69
+ from ansible.utils.display import Display
70
+ display = Display()
71
+
72
+ from datetime import datetime, timedelta
73
+ import os
74
+ import errno
75
+ import yaml
76
+
77
+ def mkdir_p(path):
78
+ """
79
+ Can't believe Python doesn't have this built-in...
80
+ """
81
+ try:
82
+ os.makedirs(path)
83
+ except OSError as exc:
84
+ if exc.errno == errno.EEXIST and os.path.isdir(path):
85
+ pass
86
+ else:
87
+ raise
88
+
89
+
90
+ class LookupModule(LookupBase):
91
+ def run(self, terms, variables=None, **kwargs):
92
+ # Check args
93
+
94
+ if len(terms) != 1:
95
+ raise AnsibleError(
96
+ "Requires exacty one positional argument (key)."
97
+ )
98
+
99
+ if len(kwargs) == 0:
100
+ raise AnsibleError(
101
+ "Requires at least one Python timedelta keyword arg."
102
+ )
103
+
104
+ # Setup variables
105
+
106
+ key = terms[0]
107
+ host = variables['inventory_hostname']
108
+
109
+ data_path = os.path.join(
110
+ variables['ansible_env']['HOME'],
111
+ '.ansible',
112
+ 'qb',
113
+ 'data',
114
+ 'every.yml'
115
+ )
116
+
117
+ delta = timedelta(**kwargs)
118
+ now = datetime.now()
119
+
120
+ # Default to empty data
121
+ data = {}
122
+
123
+ # No idea how / where to see this output...
124
+ # display.debug("Seeing if %s has been done in last %s" % (key, delta))
125
+
126
+ # Ensure the data directory exists
127
+ mkdir_p(os.path.dirname(data_path))
128
+
129
+ # Read the data file, overwriting `data` var (if file it exists)
130
+ try:
131
+ with open(data_path, 'r') as f:
132
+ data = yaml.safe_load(f)
133
+ except IOError as error:
134
+ pass
135
+
136
+ # If there's no entry for this host default to empty dict
137
+ if host not in data:
138
+ data[host] = {}
139
+
140
+ # Default `should` (our return value) to True: if it's never returned
141
+ # `True` it will now.
142
+ should = True
143
+
144
+ # If we have `data[host][key]['last']`, see if's been at least `delta`
145
+ # and set `should`
146
+ if key in data[host]:
147
+ if 'last' in data[host][key]:
148
+ should = (now - delta) >= data[host][key]['last']
149
+ else:
150
+ # Create a new dict at `data[host][key]` so we can write `now` to
151
+ # it
152
+ data[host][key] = {}
153
+
154
+ # If we're gonna return `True`, set `last` to `now` and write back
155
+ # to the path.
156
+ #
157
+ # WARNING Not at all thread / concurrency safe!
158
+ if should:
159
+ data[host][key]['last'] = now
160
+
161
+ with open(data_path, 'w') as f:
162
+ yaml.safe_dump(data, f, default_flow_style=False)
163
+
164
+ # And return our result
165
+ return should
@@ -0,0 +1,3 @@
1
+ ---
2
+ # defaults file for qb.facts
3
+ facts_github_api: false
@@ -1,5 +1,5 @@
1
1
  ---
2
- # meta file for qb.yarn
2
+ # meta file for qb.facts
3
3
 
4
4
  allow_duplicates: yes
5
5
 
@@ -1,11 +1,11 @@
1
1
  ---
2
- # meta/qb.yml file for qb.yarn
2
+ # meta/qb.yml file for qb.facts
3
3
  #
4
4
  # qb settings for this role. see README.md for more info.
5
5
  #
6
6
 
7
7
  # description of the role to show in it's help output.
8
- description: ensure yarn is installed and packages are present.
8
+ description: null
9
9
 
10
10
  # prefix for role variables
11
11
  var_prefix: null
@@ -34,39 +34,34 @@ var_prefix: null
34
34
  # - starting at the current direcotry and climbing up to parent
35
35
  # directories, use the first one that contains FILENAME. error
36
36
  # if none is found.
37
- default_dir: null
37
+ default_dir: cwd
38
+
39
+ # If `true`, QB will ensure the default dir exists before starting the play.
40
+ #
41
+ # For legacy reasons, this defaults to `true` if not present, but we want to
42
+ # default declare it as `false` here so new roles can turn it on only if
43
+ # they need it.
44
+ #
45
+ mkdir: false
38
46
 
39
47
  # default user to become for play
40
48
  default_user: null
41
49
 
42
50
  # set to false to not save options in .qb-options.yml files
43
- save_options: true
51
+ save_options: false
44
52
 
45
- # ask for an ansible vault password
46
- ask_vault_pass: false
53
+ # options to pass to ansible-playbook
54
+ ansible_options: {}
47
55
 
48
- options: # []
56
+ options:
49
57
  # - name: example
50
58
  # description: an example of a variable.
51
59
  # required: false
52
60
  # type: boolean # boolean (default) | string
53
61
  # short: e
54
- - name: version
55
- description: version to install.
56
- type: string
57
- short: v
58
-
59
- - name: state
60
- description: >
61
- present to install, absent to uninstall. the rest of the options are up to
62
- you to much around with if you like.
63
- see:
64
- - http://docs.ansible.com/ansible/homebrew_module.html
65
- type:
66
- one_of:
67
- - present
68
- - absent
69
- - latest
70
- - head
71
- - linked
72
- - unlinked
62
+ - name: github_api
63
+ description: >-
64
+ If path is a git repo with a GitHub origin, contact the GitHub API for
65
+ additonal facts (including privacy status).
66
+ type: boolean
67
+ short: g
@@ -0,0 +1,10 @@
1
+ ---
2
+ # tasks file for qb.facts
3
+
4
+ - path_facts:
5
+ path: "{{ qb_dir }}"
6
+ github_api: "{{ facts_github_api }}"
7
+ register: qb_dir_facts
8
+
9
+ - debug:
10
+ var: qb_dir_facts
@@ -1,3 +1,4 @@
1
1
  ---
2
2
  # defaults file for qb.git_repo
3
3
  git_repo_dest: "{{ qb_dir }}"
4
+ git_repo_gitignore: []
@@ -1,12 +1,4 @@
1
1
  ---
2
2
  # meta file for qb.git_repo
3
3
 
4
- dependencies:
5
- - role: qb.gitignore
6
- gitignore_name: Global/macOS
7
- gitignore_dest: "{{ git_repo_dest }}"
8
- when: ansible_distribution == "MacOSX"
9
-
10
- - role: qb.gitignore
11
- gitignore_name: QB
12
- gitignore_dest: "{{ git_repo_dest }}"
4
+ dependencies: []
@@ -6,4 +6,29 @@
6
6
  args:
7
7
  chdir: "{{ git_repo_dest }}"
8
8
  creates: "{{ git_repo_dest }}/.git"
9
-
9
+
10
+ - name: Tell Git to ignore OSX artifacts
11
+ when: ansible_distribution == "MacOSX"
12
+ include_role:
13
+ name: qb.gitignore
14
+ vars:
15
+ gitignore_name: Global/macOS
16
+ gitignore_dest: "{{ git_repo_dest }}"
17
+
18
+ - name: Tell Git to ignore QB artifacts
19
+ include_role:
20
+ name: qb.gitignore
21
+ vars:
22
+ gitignore_name: QB
23
+ gitignore_dest: "{{ git_repo_dest }}"
24
+
25
+ - name: >-
26
+ Tell Git to ignore each of <git_repo_gitignores>
27
+ with_items: "{{ git_repo_gitignores }}"
28
+ loop_control:
29
+ loop_var: name
30
+ include_role:
31
+ name: qb.gitignore
32
+ vars:
33
+ gitignore_name: "{{ name }}"
34
+ gitignore_dest: "{{ git_repo_dest }}"
@@ -36,6 +36,14 @@ var_prefix: null
36
36
  # if none is found.
37
37
  default_dir: null
38
38
 
39
+ # If `true`, QB will ensure the default dir exists before starting the play.
40
+ #
41
+ # For legacy reasons, this defaults to `true` if not present, but we want to
42
+ # default declare it as `false` here so new roles can turn it on only if
43
+ # they need it.
44
+ #
45
+ mkdir: false
46
+
39
47
  # default user to become for play
40
48
  default_user: null
41
49
 
@@ -14,7 +14,7 @@ role_readme: false
14
14
  role_library: false
15
15
 
16
16
  # modules
17
- qb_role_modules: []
17
+ role_modules: []
18
18
 
19
19
  # galaxy
20
20
  role_galaxy: false
@@ -145,7 +145,7 @@
145
145
  # modules
146
146
  # =======
147
147
 
148
- - include: module.yml
148
+ - include: module.yml
149
149
  with_items: "{{ role_modules }}"
150
150
  loop_control:
151
151
  loop_var: role_module
@@ -0,0 +1,4 @@
1
+ ---
2
+ # defaults file for qb.yarn_release
3
+ yarn_release_level: patch
4
+ yarn_release_package_dir: "{{ qb_dir }}"
@@ -1,5 +1,5 @@
1
1
  ---
2
- # meta file for qb.release_yarn
2
+ # meta file for qb.yarn_release
3
3
 
4
4
  allow_duplicates: yes
5
5
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- # meta/qb.yml file for qb.release_yarn
2
+ # meta/qb.yml file for qb.yarn_release
3
3
  #
4
4
  # qb settings for this role. see README.md for more info.
5
5
  #
@@ -0,0 +1,73 @@
1
+ ---
2
+ # tasks file for qb.yarn_release
3
+
4
+ - name: load package.json
5
+ include_vars:
6
+ file: "{{ yarn_release_package_dir }}/package.json"
7
+ name: yarn_release_package_json
8
+
9
+ - name: get current version
10
+ set_fact:
11
+ yarn_release_current_version: "{{ yarn_release_package_json.version }}"
12
+
13
+ - name: create release version
14
+ set_fact:
15
+ yarn_release_release_version: >-
16
+ {{ yarn_release_current_version | semver_inc(yarn_release_level) }}
17
+
18
+ - name: >
19
+ increment to version {{ yarn_release_release_version }}
20
+ and create the git tag
21
+ command: "yarn version --new-version={{ yarn_release_release_version }}"
22
+ args:
23
+ chdir: "{{ yarn_release_package_dir }}"
24
+
25
+ - name: >
26
+ git push the v{{ yarn_release_release_version }} tag
27
+ command: "git push origin v{{ yarn_release_release_version }}"
28
+ args:
29
+ chdir: "{{ yarn_release_package_dir }}"
30
+
31
+ - name: >
32
+ npm publish v{{ yarn_release_release_version }}
33
+ command: npm publish
34
+ args:
35
+ chdir: "{{ yarn_release_package_dir }}"
36
+
37
+ - name: create the next -dev version
38
+ set_fact:
39
+ yarn_release_next_version: "{{
40
+ yarn_release_release_version | semver_inc(
41
+ level='prerelease',
42
+ preid='dev'
43
+ )
44
+ }}"
45
+
46
+ - name: >
47
+ increment to {{ yarn_release_next_version }} version
48
+ command: >
49
+ yarn version
50
+ --new-version={{ yarn_release_next_version }}
51
+ --no-git-tag-version
52
+ args:
53
+ chdir: "{{ yarn_release_package_dir }}"
54
+
55
+ - name: git add package.json
56
+ command: git add package.json
57
+ args:
58
+ chdir: "{{ yarn_release_package_dir }}"
59
+
60
+ - name: >
61
+ git commit next dev version
62
+ command: git commit -m "start {{ yarn_release_next_version }}"
63
+ args:
64
+ chdir: "{{ yarn_release_package_dir }}"
65
+
66
+ - name: git push next dev version
67
+ command: git push
68
+ args:
69
+ chdir: "{{ yarn_release_package_dir }}"
70
+
71
+ - debug:
72
+ msg: >
73
+ v{{ yarn_release_release_version }} released.
@@ -0,0 +1,11 @@
1
+ ---
2
+ # defaults file for qb.yarn_setup
3
+ yarn_setup_version: null
4
+ yarn_setup_state: present
5
+ yarn_setup_global_packages: []
6
+
7
+ yarn_setup_force: false
8
+
9
+ yarn_setup_brew_create: true
10
+ yarn_setup_brew_tap: "{{ qb_git_user_name }}/versions"
11
+ yarn_setup_brew_link: true