rct 0.6 → 0.7
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.
- data/bin/rct +2 -2
- data/lib/rct/baseutils.rb +42 -2
- data/lib/rct/constants.rb +2 -2
- data/lib/rct/rct_cli.rb +68 -3
- data/lib/rct/rct_http.rb +7 -1
- data/lib/rct/response.rb +1 -1
- data/lib/rct_cli_app.rb +27 -1
- metadata +2 -2
data/bin/rct
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright 2012-
|
3
|
+
# Copyright 2012-2015 Jyri J. Virkki <jyri@virkki.com>
|
4
4
|
#
|
5
5
|
# This file is part of rct.
|
6
6
|
#
|
@@ -23,7 +23,7 @@
|
|
23
23
|
# rct main
|
24
24
|
#
|
25
25
|
# Runs either a CLI invocation or a test suite depending on arguments.
|
26
|
-
#
|
26
|
+
#
|
27
27
|
|
28
28
|
require 'rct'
|
29
29
|
require 'rct/rct_init'
|
data/lib/rct/baseutils.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright 2012-
|
2
|
+
# Copyright 2012-2015 Jyri J. Virkki <jyri@virkki.com>
|
3
3
|
#
|
4
4
|
# This file is part of rct.
|
5
5
|
#
|
@@ -19,18 +19,24 @@
|
|
19
19
|
|
20
20
|
|
21
21
|
#-----------------------------------------------------------------------------
|
22
|
-
# Assorted utility methods of general interest.
|
22
|
+
# Assorted utility methods of general interest.
|
23
23
|
#
|
24
24
|
class RCT
|
25
25
|
|
26
26
|
@log_level = RESULT
|
27
27
|
|
28
28
|
|
29
|
+
#---------------------------------------------------------------------------
|
30
|
+
# Return current log level.
|
31
|
+
#
|
29
32
|
def self.log_level
|
30
33
|
@log_level
|
31
34
|
end
|
32
35
|
|
33
36
|
|
37
|
+
#---------------------------------------------------------------------------
|
38
|
+
# Set log level (RESULT, INFO, DEBUG; from constants.rb).
|
39
|
+
#
|
34
40
|
def self.set_log_level(level)
|
35
41
|
@log_level = RESULT if level == RESULT
|
36
42
|
@log_level = INFO if level == INFO
|
@@ -38,11 +44,17 @@ class RCT
|
|
38
44
|
end
|
39
45
|
|
40
46
|
|
47
|
+
#---------------------------------------------------------------------------
|
48
|
+
# Increase log verbosity level by one.
|
49
|
+
#
|
41
50
|
def self.increase_log_level
|
42
51
|
@log_level += 1
|
43
52
|
end
|
44
53
|
|
45
54
|
|
55
|
+
#---------------------------------------------------------------------------
|
56
|
+
# Log a line of output, if appropriate for current log level.
|
57
|
+
#
|
46
58
|
def self.log(level, line)
|
47
59
|
if (level <= @log_level)
|
48
60
|
puts line
|
@@ -50,23 +62,36 @@ class RCT
|
|
50
62
|
end
|
51
63
|
|
52
64
|
|
65
|
+
#---------------------------------------------------------------------------
|
66
|
+
# Log an error to stdout (prefixed with 'error:')
|
67
|
+
#
|
53
68
|
def self.error(msg)
|
54
69
|
puts "error: #{msg}"
|
55
70
|
end
|
56
71
|
|
57
72
|
|
73
|
+
#---------------------------------------------------------------------------
|
74
|
+
# Log an error to stdout (prefixed with 'error:') and exit.
|
75
|
+
#
|
58
76
|
def self.bad_invocation(msg)
|
59
77
|
error(msg)
|
60
78
|
exit(1)
|
61
79
|
end
|
62
80
|
|
63
81
|
|
82
|
+
#---------------------------------------------------------------------------
|
83
|
+
# Log an error to stdout (prefixed with 'error:') and exit.
|
84
|
+
#
|
64
85
|
def self.die(msg)
|
65
86
|
error(msg)
|
66
87
|
exit(1)
|
67
88
|
end
|
68
89
|
|
69
90
|
|
91
|
+
#---------------------------------------------------------------------------
|
92
|
+
# Return the value of the flag at position pos in ARGV.
|
93
|
+
# Removes both the value and the flag from ARGV.
|
94
|
+
#
|
70
95
|
def self.argv_get(pos)
|
71
96
|
value = ARGV[pos + 1]
|
72
97
|
ARGV.delete_at(pos + 1)
|
@@ -75,6 +100,9 @@ class RCT
|
|
75
100
|
end
|
76
101
|
|
77
102
|
|
103
|
+
#---------------------------------------------------------------------------
|
104
|
+
#
|
105
|
+
#
|
78
106
|
def self.help
|
79
107
|
|
80
108
|
# default is CLI invocation of method name
|
@@ -160,21 +188,33 @@ class RCT
|
|
160
188
|
end
|
161
189
|
|
162
190
|
|
191
|
+
#---------------------------------------------------------------------------
|
192
|
+
# Set a key,value pair in the global state.
|
193
|
+
#
|
163
194
|
def self.sset(key, value, temp=false)
|
164
195
|
$STATE.set(key, value, temp)
|
165
196
|
end
|
166
197
|
|
167
198
|
|
199
|
+
#---------------------------------------------------------------------------
|
200
|
+
# Set a temporary key,value pair in the global state.
|
201
|
+
#
|
168
202
|
def self.ssettmp(key, value)
|
169
203
|
$STATE.set(key, value, true)
|
170
204
|
end
|
171
205
|
|
172
206
|
|
207
|
+
#---------------------------------------------------------------------------
|
208
|
+
# Get the value of a key from the global state.
|
209
|
+
#
|
173
210
|
def self.sget(key)
|
174
211
|
$STATE.get(key)
|
175
212
|
end
|
176
213
|
|
177
214
|
|
215
|
+
#---------------------------------------------------------------------------
|
216
|
+
# Remove the value of a key from the global state.
|
217
|
+
#
|
178
218
|
def self.sdelete(key)
|
179
219
|
$STATE.delete(key)
|
180
220
|
end
|
data/lib/rct/constants.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright 2012-
|
2
|
+
# Copyright 2012-2015 Jyri J. Virkki <jyri@virkki.com>
|
3
3
|
#
|
4
4
|
# This file is part of rct.
|
5
5
|
#
|
@@ -17,7 +17,7 @@
|
|
17
17
|
# along with rct. If not, see <http://www.gnu.org/licenses/>.
|
18
18
|
#
|
19
19
|
|
20
|
-
RCT_VERSION = '0.
|
20
|
+
RCT_VERSION = '0.7'
|
21
21
|
|
22
22
|
RCT_MODE = '_mode'
|
23
23
|
RCT_MODE_CLI = 'cli'
|
data/lib/rct/rct_cli.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright 2012-
|
2
|
+
# Copyright 2012-2015 Jyri J. Virkki <jyri@virkki.com>
|
3
3
|
#
|
4
4
|
# This file is part of rct.
|
5
5
|
#
|
@@ -32,6 +32,16 @@
|
|
32
32
|
class RCTCLI
|
33
33
|
|
34
34
|
|
35
|
+
#----------------------------------------------------------------------------
|
36
|
+
# CLI entry point.
|
37
|
+
#
|
38
|
+
# ARGV[0] must contain string "Class.operation". We'll instantiate 'Class'
|
39
|
+
# and execute CLI operation 'operation'. This operation must be one described
|
40
|
+
# by the 'cli' inspection method.
|
41
|
+
#
|
42
|
+
# The exception is if 'operation' is 'HELP', in which case auto-generated
|
43
|
+
# help output is shown.
|
44
|
+
#
|
35
45
|
def self.rct_cli
|
36
46
|
method = ARGV.shift
|
37
47
|
if (method == nil || method.empty?)
|
@@ -44,18 +54,33 @@ class RCTCLI
|
|
44
54
|
RCT.log(DEBUG, "Requested [#{method}]")
|
45
55
|
RCT.log(DEBUG, "CLI class: #{class_name}, method: #{method_name}")
|
46
56
|
|
57
|
+
if (!class_name)
|
58
|
+
RCT.error("No class specified for CLI operation")
|
59
|
+
exit(1)
|
60
|
+
end
|
61
|
+
|
62
|
+
if (!method_name)
|
63
|
+
RCT.error("No method specified for CLI operation")
|
64
|
+
exit(1)
|
65
|
+
end
|
66
|
+
|
47
67
|
obj = Object::const_get(class_name).new()
|
48
68
|
begin
|
49
69
|
cli_info = obj.send('cli')
|
50
70
|
rescue Exception => e
|
51
71
|
puts e
|
52
|
-
error("#{class_name} does not support CLI operations")
|
72
|
+
RCT.error("#{class_name} does not support CLI operations")
|
53
73
|
exit(1)
|
54
74
|
end
|
55
75
|
|
76
|
+
if (method_name == "HELP")
|
77
|
+
description = obj.send('description')
|
78
|
+
show_help(description, cli_info)
|
79
|
+
end
|
80
|
+
|
56
81
|
method_info = cli_info[method_name]
|
57
82
|
if (method_info == nil)
|
58
|
-
error("#{class_name}.#{method_name} not available")
|
83
|
+
RCT.error("#{class_name}.#{method_name} not available")
|
59
84
|
exit(1)
|
60
85
|
end
|
61
86
|
|
@@ -77,4 +102,44 @@ class RCTCLI
|
|
77
102
|
end
|
78
103
|
|
79
104
|
|
105
|
+
#----------------------------------------------------------------------------
|
106
|
+
# Show autogenerated help based on cli_info
|
107
|
+
#
|
108
|
+
def self.show_help(description, cli_info)
|
109
|
+
|
110
|
+
puts
|
111
|
+
if (description != nil)
|
112
|
+
puts description
|
113
|
+
puts
|
114
|
+
end
|
115
|
+
|
116
|
+
cli_info.each_key { |key|
|
117
|
+
|
118
|
+
method_info = cli_info[key]
|
119
|
+
description = method_info['description']
|
120
|
+
req = method_info['required']
|
121
|
+
opt = method_info['optional']
|
122
|
+
|
123
|
+
puts
|
124
|
+
puts "#{key}: #{description}"
|
125
|
+
|
126
|
+
if (req != nil && req.length > 0)
|
127
|
+
puts " Required arguments:"
|
128
|
+
req.each { |key,arg|
|
129
|
+
puts " #{arg[0]} (#{arg[1]}) : #{arg[2]}"
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
if (opt != nil && opt.length > 0)
|
134
|
+
puts " Optional arguments:"
|
135
|
+
opt.each { |key,arg|
|
136
|
+
puts " #{arg[0]} (#{arg[1]}) : #{arg[2]}"
|
137
|
+
}
|
138
|
+
end
|
139
|
+
}
|
140
|
+
|
141
|
+
exit(0)
|
142
|
+
end
|
143
|
+
|
144
|
+
|
80
145
|
end
|
data/lib/rct/rct_http.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright 2012-
|
2
|
+
# Copyright 2012-2015 Jyri J. Virkki <jyri@virkki.com>
|
3
3
|
#
|
4
4
|
# This file is part of rct.
|
5
5
|
#
|
@@ -156,6 +156,12 @@ class RCTHTTP
|
|
156
156
|
end
|
157
157
|
|
158
158
|
response = Response.new(res)
|
159
|
+
|
160
|
+
status = response.status
|
161
|
+
if (status == 401)
|
162
|
+
response.add_error("Unauthorized")
|
163
|
+
end
|
164
|
+
|
159
165
|
show_response(response)
|
160
166
|
return response
|
161
167
|
end
|
data/lib/rct/response.rb
CHANGED
data/lib/rct_cli_app.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright 2013 Jyri J. Virkki <jyri@virkki.com>
|
2
|
+
# Copyright 2013-2015 Jyri J. Virkki <jyri@virkki.com>
|
3
3
|
#
|
4
4
|
# This file is part of rct.
|
5
5
|
#
|
@@ -18,7 +18,33 @@
|
|
18
18
|
#
|
19
19
|
|
20
20
|
|
21
|
+
#-----------------------------------------------------------------------------
|
21
22
|
# CLI scripts built on top of rct can require this file to initialize rct.
|
23
|
+
#
|
24
|
+
# The common use case for this is when implementing convenience
|
25
|
+
# scripts to call the CLI functionality of an rct module (which
|
26
|
+
# supports CLI operation). For an example see 'jira' script installed
|
27
|
+
# by rct_jira gem.
|
28
|
+
#
|
29
|
+
# If global $RCT_CLI_APP_CLASS has been set, it is used as the CLI
|
30
|
+
# class name to run. This allows convenience script to set their class
|
31
|
+
# name so the user can provide only the CLI operation name. If not
|
32
|
+
# set, ARGV from caller is not modified. See below.
|
33
|
+
#
|
34
|
+
|
22
35
|
|
23
36
|
require 'rct'
|
24
37
|
require 'rct/rct_init'
|
38
|
+
|
39
|
+
|
40
|
+
if ($RCT_CLI_APP_CLASS != nil)
|
41
|
+
if (ARGV.length == 0)
|
42
|
+
ARGV.insert(0, "#{$RCT_CLI_APP_CLASS}.HELP")
|
43
|
+
else
|
44
|
+
method = ARGV.shift
|
45
|
+
ARGV.insert(0, "#{$RCT_CLI_APP_CLASS}.#{method}")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
RCT.parse_global_options()
|
50
|
+
RCTCLI.rct_cli()
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.7'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-02-12 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: wip
|
15
15
|
email: jyri@virkki.com
|