qb 0.3.8 → 0.3.9

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +4 -0
  3. data/exe/.qb_interop_receive +39 -0
  4. data/exe/qb +8 -5
  5. data/lib/qb.rb +64 -19
  6. data/lib/qb/cli/run.rb +1 -1
  7. data/lib/qb/github.rb +4 -0
  8. data/lib/qb/github/api.rb +43 -0
  9. data/lib/qb/github/issue.rb +83 -0
  10. data/lib/qb/github/repo_id.rb +127 -0
  11. data/lib/qb/github/resource.rb +59 -0
  12. data/lib/qb/github/types.rb +45 -0
  13. data/lib/qb/package.rb +131 -0
  14. data/lib/qb/package/gem.rb +2 -4
  15. data/lib/qb/package/version.rb +175 -2
  16. data/lib/qb/path.rb +2 -2
  17. data/lib/qb/repo.rb +137 -1
  18. data/lib/qb/repo/git.rb +55 -23
  19. data/lib/qb/repo/git/github.rb +137 -0
  20. data/lib/qb/role.rb +74 -30
  21. data/lib/qb/util.rb +1 -4
  22. data/lib/qb/util/docker_mixin.rb +30 -2
  23. data/lib/qb/util/interop.rb +68 -7
  24. data/lib/qb/util/logging.rb +215 -0
  25. data/lib/qb/util/stdio.rb +25 -9
  26. data/lib/qb/version.rb +16 -28
  27. data/library/stream +2 -2
  28. data/plugins/filter_plugins/ruby_interop_plugins.py +49 -31
  29. data/qb.gemspec +16 -4
  30. data/roles/qb.role/defaults/main.yml +6 -2
  31. data/roles/{qb.bump → qb/pkg/bump}/.qb-options.yml +0 -0
  32. data/roles/{qb.bump → qb/pkg/bump}/README.md +0 -0
  33. data/roles/{qb.bump → qb/pkg/bump}/defaults/main.yml +0 -0
  34. data/roles/{qb.bump → qb/pkg/bump}/library/bump +0 -0
  35. data/roles/{qb.bump → qb/pkg/bump}/meta/main.yml +0 -0
  36. data/roles/{qb.bump → qb/pkg/bump}/meta/qb.yml +0 -0
  37. data/roles/{qb.bump → qb/pkg/bump}/tasks/frontend/level/dev.yml +0 -0
  38. data/roles/{qb.bump → qb/pkg/bump}/tasks/frontend/level/rc.yml +0 -0
  39. data/roles/{qb.bump → qb/pkg/bump}/tasks/frontend/level/release.yml +0 -0
  40. data/roles/{qb.bump → qb/pkg/bump}/tasks/frontend/main.yml +0 -0
  41. data/roles/{qb.bump → qb/pkg/bump}/tasks/main.yml +1 -1
  42. data/roles/{qb.qb_role → qb/role/qb}/.qb-options.yml +0 -0
  43. data/roles/{qb.qb_role → qb/role/qb}/defaults/main.yml +0 -0
  44. data/roles/{qb.qb_role → qb/role/qb}/meta/main.yml +0 -0
  45. data/roles/{qb.qb_role → qb/role/qb}/meta/qb.yml +0 -0
  46. data/roles/{qb.qb_role → qb/role/qb}/tasks/main.yml +0 -0
  47. data/roles/{qb.qb_role → qb/role/qb}/templates/.gitkeep +0 -0
  48. data/roles/{qb.qb_role → qb/role/qb}/templates/qb.yml.j2 +0 -0
  49. data/roles/qb/test/rspec/spec/issue/defaults/main.yml +2 -0
  50. data/roles/qb/test/rspec/spec/issue/meta/main.yml +8 -0
  51. data/roles/qb/test/rspec/spec/issue/meta/qb.yml +67 -0
  52. data/roles/qb/test/rspec/spec/issue/tasks/main.yml +21 -0
  53. metadata +95 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fbc3b61137b1ac315d4a59b946216ffc49a698c5
4
- data.tar.gz: 382fa7a1f0d99d90adfef8421811464811ecb855
3
+ metadata.gz: d3fd3a036ee3a1411833a1e6ac82066a7ee291c0
4
+ data.tar.gz: 9caacbd64094d48b491115d62a80940e1932438f
5
5
  SHA512:
6
- metadata.gz: 2399c2e4af9def73a5589e91a005aff11085663fe388d16010f2eb1684b36073faed4c778958056a4b63f84e107e810b43141723b01c18980e97805a301f8808
7
- data.tar.gz: ef7ef9dd5b12cd9c8aab404a5ede52e5afdb642b1a4205c8f1a5fdc0ea45aa60aee2f9ef7c3bcbdb11177a37739804635aeb550a13b74da2a18ae455481449bf
6
+ metadata.gz: bf5bbd2d09e43ba8be882cfbf5fee05669c124c7366eda20b31e1ad86e13ec844dc7c9a237d342475994a187c12565ab7f8d8d21d5f88ab92b79bf128dbfae1b
7
+ data.tar.gz: 4f6351760bb78e66626ea2870d74c48468d6b5a102d12371a5caab719718dd799178762c4ac0ec755c55b73f9aed756572ca708c191b859293703a57914c7e22
data/.yardopts CHANGED
@@ -1 +1,5 @@
1
1
  --markup markdown
2
+ lib/**/*.rb
3
+ dev/packages/gems/nrser/lib/**/*.rb
4
+ -
5
+ README.md
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # This script is the entry point for the Ansible "Ruby Interop" filter plugins
4
+ # that execute QB Ruby code via a sub-process to do shitty RPC.
5
+ #
6
+ # @todo
7
+ # Should prob eventually be merged into `//exe/qb` under a command, but
8
+ # not gonna right now. At least it's not a string in the Python file anymore.
9
+ #
10
+
11
+ # init bundler in dev env
12
+ if ENV['QB_DEV_ENV']
13
+ ENV.each {|k, v|
14
+ if k.start_with? 'QB_DEV_ENV_'
15
+ ENV[k.sub('QB_DEV_ENV_', '')] = v
16
+ end
17
+ }
18
+ require 'bundler/setup'
19
+ end
20
+
21
+ # Set the thread name so that logs make sense.
22
+ require 'thread'
23
+ Thread.current.name = "qb_interop_receive"
24
+
25
+ require 'qb'
26
+
27
+ # Connect to the master QB process for logging to CLI STDOUT (if it's there,
28
+ # which it should be in this case).
29
+ if ENV['QB_STDIO_ERR']
30
+ $stderr = UNIXSocket.new ENV['QB_STDIO_ERR']
31
+
32
+ QB::Util::Logging.setup
33
+
34
+ QB.debug "Connected to QB stderr stream at #{ ENV['QB_STDIO_ERR'] } #{ $stderr.path }."
35
+ end
36
+
37
+ # Kick off the interop. Payload will be read from STDIN and results written to
38
+ # STDOUT (both YAML at the moment).
39
+ QB::Util::Interop.receive
data/exe/qb CHANGED
@@ -5,6 +5,7 @@ require 'pp'
5
5
  require 'yaml'
6
6
  require 'json'
7
7
  require 'fileutils'
8
+ require 'thread'
8
9
 
9
10
  require 'cmds'
10
11
 
@@ -19,20 +20,22 @@ DEBUG_ARGS = ['-D', '--DEBUG']
19
20
 
20
21
  def set_debug! args
21
22
  if DEBUG_ARGS.any? {|arg| args.include? arg}
22
- ENV['QB_DEBUG'] = 'true'
23
- QB.debug "ON"
23
+ QB::Util::Logging.setup level: :debug
24
24
  DEBUG_ARGS.each {|arg| args.delete arg}
25
25
  end
26
26
  end
27
27
 
28
28
 
29
29
  def main args
30
+ Thread.current.name = 'main'
31
+ logger = SemanticLogger['qb/exe/qb#main']
32
+
30
33
  set_debug! args
31
- QB.debug args: args
34
+ logger.debug args: args
32
35
 
33
36
  QB.check_ansible_version
34
37
 
35
- QB.debug "Switch arg", args[0]
38
+ logger.debug "Switch arg" => args[0]
36
39
 
37
40
  status = case args[0]
38
41
  when nil, '-h', '--help', 'help'
@@ -53,7 +56,7 @@ def main args
53
56
  QB::CLI.run args
54
57
  end
55
58
 
56
- QB.debug "Exit status", status
59
+ logger.debug "Exit status", status
57
60
 
58
61
  # exit status
59
62
  exit status
data/lib/qb.rb CHANGED
@@ -1,40 +1,84 @@
1
+ # Requirements
2
+ # =======================================================================
3
+
4
+ # Stdlib
5
+ # -----------------------------------------------------------------------
6
+
7
+ # Deps
8
+ # -----------------------------------------------------------------------
1
9
  require 'nrser/extras'
2
10
 
3
- require_relative './qb/errors'
4
- require_relative './qb/version'
5
- require_relative './qb/util'
6
- require_relative './qb/path'
11
+ # Project / Package
12
+ # -----------------------------------------------------------------------
13
+ require 'qb/errors'
14
+ require 'qb/version'
15
+ require 'qb/util'
16
+ require 'qb/path'
17
+
18
+
19
+ # Refinements
20
+ # =======================================================================
21
+
22
+ require 'nrser/refinements'
23
+ using NRSER
24
+
25
+ require 'nrser/refinements/types'
26
+ using NRSER::Types
27
+
28
+
29
+ # Definitions
30
+ # =======================================================================
7
31
 
8
32
  module QB
33
+
34
+ # Constants
35
+ # =====================================================================
36
+
9
37
  ROOT = (Pathname.new(__FILE__).dirname + '..').expand_path
10
38
  GEM_ROLES_DIR = ROOT + 'roles'
11
39
  USER_ROLES_DIR = Pathname.new(ENV['HOME']).join '.ansible', 'roles'
12
40
 
13
41
 
42
+ # Mixins
43
+ # =====================================================================
44
+
45
+ include SemanticLogger::Loggable
46
+
47
+
14
48
  def self.debug *args
15
- return unless ENV['QB_DEBUG'] && args.length > 0
16
-
17
- header = 'DEBUG'
18
-
19
49
  if args[0].is_a? String
20
- header += " " + args.shift
21
- end
22
-
23
- dumpObj = case args.length
24
- when 0
25
- header
26
- when 1
27
- {header => args[0]}
50
+ logger.debug *args
28
51
  else
29
- {header => args}
52
+ logger.debug payload: args
30
53
  end
31
54
 
32
- # $stderr.puts("DEBUG " + format(msg, values))
33
- $stderr.puts dumpObj.pretty_inspect
55
+ # return unless ENV['QB_DEBUG'] && args.length > 0
56
+ #
57
+ # header = 'DEBUG'
58
+ #
59
+ # if args[0].is_a? String
60
+ # header += " " + args.shift
61
+ # end
62
+ #
63
+ # dumpObj = case args.length
64
+ # when 0
65
+ # header
66
+ # when 1
67
+ # {header => args[0]}
68
+ # else
69
+ # {header => args}
70
+ # end
71
+ #
72
+ # # $stderr.puts("DEBUG " + format(msg, values))
73
+ # $stderr.puts dumpObj.pretty_inspect
34
74
  end
35
75
 
36
76
  end
37
77
 
78
+
79
+ # Post-Processing
80
+ # =======================================================================
81
+
38
82
  # needs QB::*_ROLES_DIR
39
83
  require 'qb/role'
40
84
  require 'qb/options'
@@ -47,3 +91,4 @@ require 'qb/ansible_module'
47
91
 
48
92
  require 'qb/package'
49
93
 
94
+ require 'qb/github'
@@ -41,7 +41,7 @@ module QB::CLI
41
41
  return 1
42
42
  end
43
43
 
44
- QB.check_qb_version role
44
+ role.check_requirements
45
45
 
46
46
  options = QB::Options.new role, args
47
47
 
@@ -0,0 +1,4 @@
1
+ require 'qb/github/types'
2
+ require 'qb/github/repo_id'
3
+ require 'qb/github/api'
4
+ require 'qb/github/issue'
@@ -0,0 +1,43 @@
1
+ # Requirements
2
+ # =======================================================================
3
+
4
+ # Stdlib
5
+ # -----------------------------------------------------------------------
6
+
7
+ # Deps
8
+ # -----------------------------------------------------------------------
9
+ require 'octokit'
10
+
11
+ # Project / Package
12
+ # -----------------------------------------------------------------------
13
+
14
+
15
+ # Refinements
16
+ # =======================================================================
17
+
18
+
19
+ # Declarations
20
+ # =======================================================================
21
+
22
+
23
+ # Definitions
24
+ # =======================================================================
25
+
26
+
27
+ # @todo document QB::GitHub::API module.
28
+ module QB::GitHub::API
29
+
30
+ def self.client
31
+ @client ||= if token = ENV['GH_TOKEN']
32
+ Octokit::Client.new access_token: token
33
+ else
34
+ Octokit::Client.new
35
+ end
36
+ end
37
+
38
+ end # module QB::GitHub::API
39
+
40
+
41
+
42
+ # Post-Processing
43
+ # =======================================================================
@@ -0,0 +1,83 @@
1
+ # Requirements
2
+ # =======================================================================
3
+
4
+ # Stdlib
5
+ # -----------------------------------------------------------------------
6
+
7
+ # Deps
8
+ # -----------------------------------------------------------------------
9
+
10
+ # Project / Package
11
+ # -----------------------------------------------------------------------
12
+ require 'qb/github/resource'
13
+
14
+
15
+ # Refinements
16
+ # =======================================================================
17
+
18
+ require 'nrser/refinements'
19
+ using NRSER
20
+
21
+ require 'nrser/refinements/types'
22
+ using NRSER::Types
23
+
24
+
25
+ # Declarations
26
+ # =======================================================================
27
+
28
+
29
+ # Definitions
30
+ # =======================================================================
31
+
32
+
33
+ # @todo document QB::GitHub::Issue class.
34
+ class QB::GitHub::Issue < QB::GitHub::Resource
35
+
36
+ # Constants
37
+ # ======================================================================
38
+
39
+
40
+ # Class Methods
41
+ # ======================================================================
42
+
43
+
44
+ # @todo Document find method.
45
+ #
46
+ # @param [type] arg_name
47
+ # @todo Add name param description.
48
+ #
49
+ # @return [return_type]
50
+ # @todo Document return value.
51
+ #
52
+ def self.find_by repo_id:, number:
53
+ new QB::GitHub::API.client.issue( repo_id.path, number )
54
+ end # .find
55
+
56
+
57
+
58
+ # Properties
59
+ # ======================================================================
60
+
61
+ prop :title, type: t.str, source: ->() { self[:title] }
62
+ prop :title_filename, source: :title_filename
63
+
64
+ # Constructor
65
+ # ======================================================================
66
+
67
+ # Instance Methods
68
+ # ======================================================================
69
+
70
+ def [] key
71
+ @octokit_resource[key]
72
+ end
73
+
74
+ def title_filename
75
+
76
+ end
77
+
78
+ end # class QB::GitHub::Issue
79
+
80
+
81
+
82
+ # Post-Processing
83
+ # =======================================================================
@@ -0,0 +1,127 @@
1
+ # Requirements
2
+ # =======================================================================
3
+
4
+ # Stdlib
5
+ # -----------------------------------------------------------------------
6
+
7
+ # Deps
8
+ # -----------------------------------------------------------------------
9
+
10
+ # Project / Package
11
+ # -----------------------------------------------------------------------
12
+ require 'qb/util/resource'
13
+ require 'qb/github/types'
14
+
15
+
16
+ # Refinements
17
+ # =======================================================================
18
+
19
+ require 'nrser/refinements'
20
+ using NRSER
21
+
22
+ require 'nrser/refinements/types'
23
+ using NRSER::Types
24
+
25
+
26
+ # Definitions
27
+ # =======================================================================
28
+
29
+
30
+ # Unique identifier for a GitHub repo, which is a composite of an `owner`
31
+ # and a `name` string.
32
+ #
33
+ class QB::GitHub::RepoID < QB::Util::Resource
34
+
35
+ # Configuration
36
+ # =====================================================================
37
+
38
+ # Props
39
+ # ---------------------------------------------------------------------
40
+
41
+ ### Primary Properties
42
+
43
+ prop :owner, type: QB::GitHub::Types.repo_owner
44
+ prop :name, type: QB::GitHub::Types.repo_name
45
+
46
+
47
+ ### Derived Properties
48
+
49
+ prop :path, type: t.non_empty_str, source: :path
50
+ prop :full_name, type: t.maybe(t.str), source: :full_name
51
+
52
+
53
+ # Class Methods
54
+ # ======================================================================
55
+
56
+
57
+ # Instance Methods
58
+ # ======================================================================
59
+
60
+ # "Path" on GitHub for the repo - the `<owner>/<name>` part that comes
61
+ # after the host in URLs.
62
+ #
63
+ # Called `full_name` in GitHub API (we include a `#full_name` method alias
64
+ # as well).
65
+ #
66
+ # This is also what we return for {#to_s}.
67
+ #
68
+ # @example
69
+ # repo_id = QB::GitHub::RepoID.new owner: 'nrser', name: 'qb'
70
+ # repo_id.path
71
+ # # => "nrser/qb"
72
+ #
73
+ # @return [String]
74
+ #
75
+ def path
76
+ "#{ owner }/#{ name }"
77
+ end # #path
78
+
79
+ alias_method :full_name, :path
80
+ alias_method :to_s, :path
81
+
82
+
83
+ # SSH protocol URL string for use as a Git remote.
84
+ #
85
+ # @example
86
+ # repo_id = QB::GitHub::RepoID.new owner: 'nrser', name: 'qb'
87
+ # repo_id.git_ssh_url
88
+ # # => "git@github.com:nrser/qb.git"
89
+ #
90
+ # @return [String]
91
+ #
92
+ def git_ssh_url
93
+ "git@github.com:#{ path }.git"
94
+ end # #to_git_ssh_url
95
+
96
+
97
+ # HTTPS protocol URL string for use as a Git remote.
98
+ #
99
+ # @example
100
+ # repo_id = QB::GitHub::RepoID.new owner: 'nrser', name: 'qb'
101
+ # repo_id.git_https_url
102
+ # # => "https://github.com/nrser/qb.git"
103
+ #
104
+ # @return [String]
105
+ #
106
+ def git_https_url
107
+ "https://github.com/#{ path }.git"
108
+ end
109
+
110
+
111
+ # Return {#git_ssh_url} or {#git_https_url} depending on `protocol`
112
+ # parameter.
113
+ #
114
+ # @param [Symbol] protocol
115
+ # `:ssh` or `:https`.
116
+ #
117
+ # @return [String]
118
+ # URL.
119
+ #
120
+ def git_url protocol
121
+ t.match protocol,
122
+ :ssh, ->( _ ) { git_ssh_url },
123
+ :https, ->( _ ) { git_https_url }
124
+ end # #to_url
125
+
126
+
127
+ end # class QB::GitHub::RepoID