nub 0.0.42 → 0.0.43
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.
- checksums.yaml +4 -4
- data/lib/nub/commander.rb +2 -1
- data/lib/nub/config.rb +7 -8
- data/lib/nub/log.rb +11 -10
- data/lib/nub/string.rb +60 -0
- data/lib/nub/sys.rb +14 -64
- data/lib/nub/user.rb +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18e9121a0f51826a76f7c76172ad12a543fdc1ed177e2faafd226c4748ee1c55
|
4
|
+
data.tar.gz: b2d67cc335778e825742b6d9778026e47c07a166243b0a0909b6c5318f740812
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cc75cd89bf288b25b600f4a1f922dd4e8af61cc12c77c61ae798bfb0d20ca2dccc6712cb7ba6d3ca70cea4fd8685519e254f539ef177d893c12a1c3350ae6e0
|
7
|
+
data.tar.gz: b910fb8b96b7475db9d7d1b691eb118ee27220f78a0647cecea89c221ba3b29c92630f3058cf435abc70a586e6fc472aef73866890f643af9598533fda6f39b1
|
data/lib/nub/commander.rb
CHANGED
@@ -21,6 +21,7 @@
|
|
21
21
|
|
22
22
|
require 'colorize'
|
23
23
|
require_relative 'sys'
|
24
|
+
require_relative 'string'
|
24
25
|
|
25
26
|
# Command option encapsulation
|
26
27
|
class Option
|
@@ -160,7 +161,7 @@ class Commander
|
|
160
161
|
def help
|
161
162
|
help = @app.nil? ? "" : "#{banner}\n"
|
162
163
|
if !@examples.nil? && !@examples.empty?
|
163
|
-
newline =
|
164
|
+
newline = @examples.strip_color[-1] != "\n" ? "\n" : ""
|
164
165
|
help += "Examples:\n#{@examples}\n#{newline}"
|
165
166
|
end
|
166
167
|
app = @app || @app_default
|
data/lib/nub/config.rb
CHANGED
@@ -28,8 +28,7 @@ require_relative 'log'
|
|
28
28
|
# Simple YAML configuration for an application.
|
29
29
|
# Uses singleton pattern for single source of truth
|
30
30
|
module Config
|
31
|
-
|
32
|
-
# Private properties
|
31
|
+
extend self
|
33
32
|
@@_yml = nil
|
34
33
|
|
35
34
|
# Public properties
|
@@ -39,7 +38,7 @@ module Config
|
|
39
38
|
|
40
39
|
# Singleton new alternate
|
41
40
|
# @param config [String] name or path of the config file
|
42
|
-
def
|
41
|
+
def init(config)
|
43
42
|
|
44
43
|
# Determine caller's file path to look for sidecar config
|
45
44
|
caller_path = caller_locations(1, 1).first.path
|
@@ -52,29 +51,29 @@ module Config
|
|
52
51
|
begin
|
53
52
|
@@_yml = File.exists?(@path) ? YAML.load_file(@path) : {}
|
54
53
|
rescue Exception => e
|
55
|
-
Log.
|
54
|
+
Log.die(e)
|
56
55
|
end
|
57
56
|
|
58
57
|
return nil
|
59
58
|
end
|
60
59
|
|
61
60
|
# Simple bool whether the config exists or not on disk
|
62
|
-
def
|
61
|
+
def exists?
|
63
62
|
return File.exists?(@path)
|
64
63
|
end
|
65
64
|
|
66
65
|
# Hash like getter
|
67
|
-
def
|
66
|
+
def [](key)
|
68
67
|
return @@_yml[key]
|
69
68
|
end
|
70
69
|
|
71
70
|
# Hash like setter
|
72
|
-
def
|
71
|
+
def []=(key, val)
|
73
72
|
return @@_yml[key] = val
|
74
73
|
end
|
75
74
|
|
76
75
|
# Save the config file
|
77
|
-
def
|
76
|
+
def save
|
78
77
|
File.write(@path, @@_yml.to_yaml) if @@_yml
|
79
78
|
end
|
80
79
|
end
|
data/lib/nub/log.rb
CHANGED
@@ -24,6 +24,7 @@ require 'monitor'
|
|
24
24
|
require 'ostruct'
|
25
25
|
require 'colorize'
|
26
26
|
require_relative 'sys'
|
27
|
+
require_relative 'string'
|
27
28
|
|
28
29
|
LogLevel = OpenStruct.new({
|
29
30
|
error: 0,
|
@@ -73,7 +74,7 @@ module Log
|
|
73
74
|
@@_monitor.synchronize{
|
74
75
|
|
75
76
|
# Skip first 3 on stack (i.e. 0 = block in call_details, 1 = synchronize, 2 = call_detail)
|
76
|
-
stack = caller_locations(3,
|
77
|
+
stack = caller_locations(3, 20)
|
77
78
|
|
78
79
|
# Skip past any calls in 'log.rb' or 'monitor.rb'
|
79
80
|
i = -1
|
@@ -114,7 +115,7 @@ module Log
|
|
114
115
|
type = (opts && opts.key?(:type)) ? opts[:type] : ""
|
115
116
|
stamp = (opts && opts.key?(:stamp)) ? opts[:stamp] : true
|
116
117
|
if stamp or loc
|
117
|
-
timestamp, location = call_details
|
118
|
+
timestamp, location = self.call_details
|
118
119
|
location = loc ? location : ""
|
119
120
|
type = ":#{type}" if !type.empty?
|
120
121
|
str = "#{timestamp}#{location}#{type}:: #{str}"
|
@@ -122,7 +123,7 @@ module Log
|
|
122
123
|
|
123
124
|
# Handle output
|
124
125
|
if !str.empty?
|
125
|
-
@file <<
|
126
|
+
@file << str.strip_color if @path
|
126
127
|
@@_queue << str if @@_queue
|
127
128
|
$stdout.print(str) if @@_stdout
|
128
129
|
end
|
@@ -145,14 +146,14 @@ module Log
|
|
145
146
|
str = str.colorize(:light_yellow) if type == 'W'
|
146
147
|
|
147
148
|
if stamp or loc
|
148
|
-
timestamp, location = call_details
|
149
|
+
timestamp, location = self.call_details
|
149
150
|
location = loc ? location : ""
|
150
151
|
type = ":#{type}" if !type.empty?
|
151
152
|
str = "#{timestamp}#{location}#{type}:: #{str}"
|
152
153
|
end
|
153
154
|
|
154
155
|
# Handle output
|
155
|
-
@file.puts(
|
156
|
+
@file.puts(str.strip_color) if @path
|
156
157
|
@@_queue << "#{str}\n" if @@_queue
|
157
158
|
$stdout.puts(str) if @@_stdout
|
158
159
|
|
@@ -165,7 +166,7 @@ module Log
|
|
165
166
|
opts[:loc] = true and opts[:type] = 'E' if opts
|
166
167
|
args << {:loc => true, :type => 'E'} if !opts
|
167
168
|
|
168
|
-
return puts(*args)
|
169
|
+
return self.puts(*args)
|
169
170
|
end
|
170
171
|
|
171
172
|
def warn(*args)
|
@@ -173,7 +174,7 @@ module Log
|
|
173
174
|
opts = args.find{|x| x.is_a?(Hash)}
|
174
175
|
opts[:type] = 'W' if opts
|
175
176
|
args << {:type => 'W'} if !opts
|
176
|
-
return puts(*args)
|
177
|
+
return self.puts(*args)
|
177
178
|
end
|
178
179
|
return true
|
179
180
|
end
|
@@ -183,7 +184,7 @@ module Log
|
|
183
184
|
opts = args.find{|x| x.is_a?(Hash)}
|
184
185
|
opts[:type] = 'I' if opts
|
185
186
|
args << {:type => 'I'} if !opts
|
186
|
-
return puts(*args)
|
187
|
+
return self.puts(*args)
|
187
188
|
end
|
188
189
|
return true
|
189
190
|
end
|
@@ -193,7 +194,7 @@ module Log
|
|
193
194
|
opts = args.find{|x| x.is_a?(Hash)}
|
194
195
|
opts[:type] = 'D' if opts
|
195
196
|
args << {:type => 'D'} if !opts
|
196
|
-
return puts(*args)
|
197
|
+
return self.puts(*args)
|
197
198
|
end
|
198
199
|
return true
|
199
200
|
end
|
@@ -201,7 +202,7 @@ module Log
|
|
201
202
|
# Log the given message in red and exit
|
202
203
|
# @param msg [String] message to log
|
203
204
|
def die(msg)
|
204
|
-
puts("Error: #{msg}".colorize(:red), stamp: false) and exit
|
205
|
+
self.puts("Error: #{msg}".colorize(:red), stamp: false) and exit
|
205
206
|
end
|
206
207
|
|
207
208
|
# Remove an item from the queue, block until one exists
|
data/lib/nub/string.rb
CHANGED
@@ -19,6 +19,19 @@
|
|
19
19
|
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
20
|
#SOFTWARE.
|
21
21
|
|
22
|
+
ColorPair = Struct.new(:str, :color_code, :color_name)
|
23
|
+
ColorMap = {
|
24
|
+
30 => "black",
|
25
|
+
31 => "red",
|
26
|
+
32 => "green",
|
27
|
+
33 => "yellow",
|
28
|
+
34 => "blue",
|
29
|
+
35 => "magenta",
|
30
|
+
36 => "cyan",
|
31
|
+
37 => "white",
|
32
|
+
39 => "gray88" # default
|
33
|
+
}
|
34
|
+
|
22
35
|
# Monkey patch string with some useful methods
|
23
36
|
class String
|
24
37
|
|
@@ -32,6 +45,53 @@ class String
|
|
32
45
|
}
|
33
46
|
return self.encode(Encoding.find('ASCII'), options)
|
34
47
|
end
|
48
|
+
|
49
|
+
# Strip the ansi color codes from the given string
|
50
|
+
# @returns [String] string without any ansi codes
|
51
|
+
def strip_color
|
52
|
+
return self.gsub(/\e\[0;[39]\d;49m/, '').gsub(/\e\[0m/, '')
|
53
|
+
end
|
54
|
+
|
55
|
+
# Tokenize the given colorized string
|
56
|
+
# @returns [Array] array of Token
|
57
|
+
def tokenize_color
|
58
|
+
tokens = []
|
59
|
+
matches = self.to_enum(:scan, /\e\[0;[39]\d;49m(.*?[\s]*)\e\[0m/).map{Regexp.last_match}
|
60
|
+
|
61
|
+
i, istart, iend = 0, 0, 0
|
62
|
+
match = matches[i]
|
63
|
+
while istart < self.size
|
64
|
+
color = "39"
|
65
|
+
iend = self.size
|
66
|
+
token = self[istart..iend]
|
67
|
+
|
68
|
+
# Current token is not a match
|
69
|
+
if match && match.begin(0) != istart
|
70
|
+
iend = match.begin(0)-1
|
71
|
+
token = self[istart..iend]
|
72
|
+
istart = iend + 1
|
73
|
+
|
74
|
+
# Current token is a match
|
75
|
+
elsif match && match.begin(0) == istart
|
76
|
+
iend = match.end(0)
|
77
|
+
token = match.captures.first
|
78
|
+
color = match.to_s[/\e\[0;(\d+);49m.*/, 1]
|
79
|
+
i += 1; match = matches[i]
|
80
|
+
istart = iend
|
81
|
+
|
82
|
+
# Ending
|
83
|
+
else
|
84
|
+
istart = iend
|
85
|
+
end
|
86
|
+
|
87
|
+
# Create token and advance
|
88
|
+
tokens << ColorPair.new(token, color.to_i, ColorMap[color.to_i])
|
89
|
+
end
|
90
|
+
|
91
|
+
return tokens
|
92
|
+
end
|
93
|
+
|
94
|
+
|
35
95
|
end
|
36
96
|
|
37
97
|
# vim: ft=ruby:ts=2:sw=2:sts=2
|
data/lib/nub/sys.rb
CHANGED
@@ -22,24 +22,22 @@
|
|
22
22
|
require 'io/console'
|
23
23
|
require 'ostruct'
|
24
24
|
require 'stringio'
|
25
|
-
|
26
|
-
ColorPair = Struct.new(:str, :color_code, :color_name)
|
27
|
-
ColorMap = {
|
28
|
-
30 => "black",
|
29
|
-
31 => "red",
|
30
|
-
32 => "green",
|
31
|
-
33 => "yellow",
|
32
|
-
34 => "blue",
|
33
|
-
35 => "magenta",
|
34
|
-
36 => "cyan",
|
35
|
-
37 => "white",
|
36
|
-
39 => "gray88" # default
|
37
|
-
}
|
25
|
+
require_relative 'log'
|
38
26
|
|
39
27
|
module Sys
|
28
|
+
extend self
|
29
|
+
|
30
|
+
# Get the given environment variable by nam
|
31
|
+
# @param var [String] name of the environment var
|
32
|
+
# @param required [Bool] require that the variable exists by default
|
33
|
+
def env(var, required:true)
|
34
|
+
value = ENV[var]
|
35
|
+
Log.die("#{var} env variable is required!") if required && !value
|
36
|
+
return value
|
37
|
+
end
|
40
38
|
|
41
39
|
# Wait for any key to be pressed
|
42
|
-
def
|
40
|
+
def any_key?
|
43
41
|
begin
|
44
42
|
state = `stty -g`
|
45
43
|
`stty raw -echo -icanon isig`
|
@@ -52,14 +50,14 @@ module Sys
|
|
52
50
|
# Get the caller's filename for the caller of the function this call is nested in
|
53
51
|
# not the function this call is called in
|
54
52
|
# @returns [String] the caller's filename
|
55
|
-
def
|
53
|
+
def caller_filename
|
56
54
|
path = caller_locations(2, 1).first.path
|
57
55
|
return File.basename(path)
|
58
56
|
end
|
59
57
|
|
60
58
|
# Capture STDOUT to a string
|
61
59
|
# @returns [String] the redirected output
|
62
|
-
def
|
60
|
+
def capture(&block)
|
63
61
|
stdout, stderr = StringIO.new, StringIO.new
|
64
62
|
$stdout, $stderr = stdout, stderr
|
65
63
|
|
@@ -69,54 +67,6 @@ module Sys
|
|
69
67
|
|
70
68
|
return OpenStruct.new(result: result, stdout: stdout.string, stderr: stderr.string)
|
71
69
|
end
|
72
|
-
|
73
|
-
# Strip the ansi color codes from the given string
|
74
|
-
# @param str [String] string with ansi color codes
|
75
|
-
# @returns [String] string without any ansi codes
|
76
|
-
def self.strip_colorize(str)
|
77
|
-
return str.gsub(/\e\[0;[39]\d;49m/, '').gsub(/\e\[0m/, '')
|
78
|
-
end
|
79
|
-
|
80
|
-
# Tokenize the given colorized string
|
81
|
-
# @param str [String] string with ansi color codes
|
82
|
-
# @returns [Array] array of Token
|
83
|
-
def self.tokenize_colorize(str)
|
84
|
-
tokens = []
|
85
|
-
matches = str.to_enum(:scan, /\e\[0;[39]\d;49m(.*?[\s]*)\e\[0m/).map{Regexp.last_match}
|
86
|
-
|
87
|
-
i, istart, iend = 0, 0, 0
|
88
|
-
match = matches[i]
|
89
|
-
while istart < str.size
|
90
|
-
color = "39"
|
91
|
-
iend = str.size
|
92
|
-
token = str[istart..iend]
|
93
|
-
|
94
|
-
# Current token is not a match
|
95
|
-
if match && match.begin(0) != istart
|
96
|
-
iend = match.begin(0)-1
|
97
|
-
token = str[istart..iend]
|
98
|
-
istart = iend + 1
|
99
|
-
|
100
|
-
# Current token is a match
|
101
|
-
elsif match && match.begin(0) == istart
|
102
|
-
iend = match.end(0)
|
103
|
-
token = match.captures.first
|
104
|
-
color = match.to_s[/\e\[0;(\d+);49m.*/, 1]
|
105
|
-
i += 1; match = matches[i]
|
106
|
-
istart = iend
|
107
|
-
|
108
|
-
# Ending
|
109
|
-
else
|
110
|
-
istart = iend
|
111
|
-
end
|
112
|
-
|
113
|
-
# Create token and advance
|
114
|
-
tokens << ColorPair.new(token, color.to_i, ColorMap[color.to_i])
|
115
|
-
end
|
116
|
-
|
117
|
-
return tokens
|
118
|
-
end
|
119
|
-
|
120
70
|
end
|
121
71
|
|
122
72
|
# vim: ft=ruby:ts=2:sw=2:sts=2
|
data/lib/nub/user.rb
CHANGED
@@ -24,14 +24,15 @@ require 'etc'
|
|
24
24
|
|
25
25
|
# Some user related helper methods
|
26
26
|
module User
|
27
|
+
extend self
|
27
28
|
|
28
29
|
# Check if the current user has root privileges
|
29
|
-
def
|
30
|
+
def root?
|
30
31
|
return Process.uid.zero?
|
31
32
|
end
|
32
33
|
|
33
34
|
# Get the current user taking into account sudo priviledges
|
34
|
-
def
|
35
|
+
def name
|
35
36
|
return Process.uid.zero? ? Etc.getpwuid(ENV['SUDO_UID'].to_i).name : ENV['USER']
|
36
37
|
end
|
37
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.43
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Crummett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|