idcfcloud 0.2.2 → 1.1.1
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 +5 -5
- data/.codeclimate.yml +12 -0
- data/.rubocop.yml +12 -2
- data/README.md +30 -12
- data/idcfcloud.gemspec +12 -12
- data/lib/idcf/cli/command/morio.rb +4 -4
- data/lib/idcf/cli/conf/conf.yml +0 -6
- data/lib/idcf/cli/conf/const.rb +32 -29
- data/lib/idcf/cli/controller/base.rb +50 -23
- data/lib/idcf/cli/controller/compute.rb +15 -2
- data/lib/idcf/cli/controller/extend/command.rb +25 -2
- data/lib/idcf/cli/controller/extend/search_module.rb +0 -10
- data/lib/idcf/cli/controller/extend/util.rb +12 -0
- data/lib/idcf/cli/controller/include/client.rb +1 -1
- data/lib/idcf/cli/controller/include/command.rb +1 -1
- data/lib/idcf/cli/controller/include/util.rb +3 -5
- data/lib/idcf/cli/controller/include/validate.rb +1 -1
- data/lib/idcf/cli/extend/configure.rb +2 -4
- data/lib/idcf/cli/extend/update.rb +21 -21
- data/lib/idcf/cli/extend/update_file.rb +21 -10
- data/lib/idcf/cli/gem_ext/idcf/json_hyper_schema/expands/link_info_base_extension.rb +25 -9
- data/lib/idcf/cli/gem_ext/thor/init_util.rb +6 -3
- data/lib/idcf/cli/index.rb +17 -5
- data/lib/idcf/cli/lib/api.rb +5 -4
- data/lib/idcf/cli/lib/configure.rb +2 -2
- data/lib/idcf/cli/lib/convert/filter/field_filter.rb +9 -12
- data/lib/idcf/cli/lib/convert/filter/json_path_filter.rb +1 -1
- data/lib/idcf/cli/lib/convert/formatter/base.rb +1 -2
- data/lib/idcf/cli/lib/convert/formatter/csv_format.rb +15 -32
- data/lib/idcf/cli/lib/convert/formatter/json_format.rb +1 -1
- data/lib/idcf/cli/lib/convert/formatter/table_format.rb +2 -2
- data/lib/idcf/cli/lib/convert/formatter/xml_format.rb +1 -1
- data/lib/idcf/cli/lib/convert/helper.rb +16 -5
- data/lib/idcf/cli/lib/document.rb +45 -0
- data/lib/idcf/cli/lib/util/cli_file.rb +1 -1
- data/lib/idcf/cli/lib/util/cli_logger.rb +3 -3
- data/lib/idcf/cli/lib/util/ini_conf.rb +2 -2
- data/lib/idcf/cli/lib/util/input.rb +40 -5
- data/lib/idcf/cli/lib/util/yml_conf.rb +1 -1
- data/lib/idcf/cli/service/base.rb +6 -6
- data/lib/idcf/cli/service/ilb/base_server_for_protocol.rb +22 -18
- data/lib/idcf/cli/validate/custom/month_check_validator.rb +1 -1
- data/lib/idcf/cli/validate/custom/require_relation_validator.rb +2 -2
- data/lib/idcf/cli/validate/define/base.rb +3 -2
- data/lib/idcf/cli/version.rb +1 -1
- metadata +55 -68
- data/lib/idcf/cli/controller/cdn.rb +0 -37
data/lib/idcf/cli/index.rb
CHANGED
@@ -28,12 +28,24 @@ module Idcf
|
|
28
28
|
# @param arg [Hash] options
|
29
29
|
def init(arg)
|
30
30
|
map COMMAND_MAPS
|
31
|
+
add_classify_rule
|
31
32
|
sub_command_regist('controller', File.dirname(__FILE__), arg)
|
32
33
|
rescue Idcf::Cli::Error::CliError => e
|
33
34
|
error_exit(e)
|
34
|
-
rescue => e
|
35
|
+
rescue StandardError => e
|
35
36
|
error_exit(Idcf::Cli::Error::CliError.new(e.message))
|
36
37
|
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
# add classify rule
|
42
|
+
def add_classify_rule
|
43
|
+
Idcf::Cli::Conf::Const::CLASSIFY_RULE.each do |rule|
|
44
|
+
ActiveSupport::Inflector.inflections do |inflect|
|
45
|
+
inflect.irregular(*rule)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
37
49
|
end
|
38
50
|
|
39
51
|
def initialize(*args)
|
@@ -48,7 +60,7 @@ module Idcf
|
|
48
60
|
def init
|
49
61
|
configure
|
50
62
|
update
|
51
|
-
rescue => e
|
63
|
+
rescue StandardError => e
|
52
64
|
self.class.error_exit(e)
|
53
65
|
end
|
54
66
|
|
@@ -56,7 +68,7 @@ module Idcf
|
|
56
68
|
|
57
69
|
def update
|
58
70
|
do_update(options)
|
59
|
-
rescue => e
|
71
|
+
rescue StandardError => e
|
60
72
|
self.class.error_exit(e)
|
61
73
|
end
|
62
74
|
|
@@ -67,7 +79,7 @@ module Idcf
|
|
67
79
|
def configure
|
68
80
|
init_f = ARGV[0] == 'init'
|
69
81
|
do_configure(options, init_f)
|
70
|
-
rescue => e
|
82
|
+
rescue StandardError => e
|
71
83
|
self.class.error_exit(e)
|
72
84
|
end
|
73
85
|
|
@@ -75,7 +87,7 @@ module Idcf
|
|
75
87
|
|
76
88
|
def version
|
77
89
|
puts Idcf::Cli::Conf::Const::VERSION_STR
|
78
|
-
rescue => e
|
90
|
+
rescue StandardError => e
|
79
91
|
self.class.error_exit(e)
|
80
92
|
end
|
81
93
|
end
|
data/lib/idcf/cli/lib/api.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'idcf/cli/lib/util/cli_logger'
|
2
|
+
require 'idcf/cli/lib/document'
|
2
3
|
module Idcf
|
3
4
|
module Cli
|
4
5
|
module Lib
|
@@ -113,16 +114,16 @@ module Idcf
|
|
113
114
|
min = link.url_param_names.size + offset
|
114
115
|
max = between_max(min, link)
|
115
116
|
|
116
|
-
msg = format('Argument:
|
117
|
+
msg = format('Argument: %<arg>s', arg: self.class.command_param_str(link))
|
118
|
+
msg = "#{msg}\n#{Idcf::Cli::Lib::Document.make_document_desc(link)}"
|
117
119
|
cli_error msg unless args.size.between?(min, max)
|
118
120
|
end
|
119
121
|
|
120
122
|
def between_max(min, link)
|
121
123
|
offset = 0
|
122
124
|
required_f = self.class.param_required?(link)
|
123
|
-
if !required_f && (link.properties.present? || link.query_param_names.present?)
|
124
|
-
|
125
|
-
end
|
125
|
+
offset = 1 if !required_f && (link.properties.present? || link.query_param_names.present?)
|
126
|
+
|
126
127
|
min + offset
|
127
128
|
end
|
128
129
|
|
@@ -40,7 +40,7 @@ module Idcf
|
|
40
40
|
profile = get_profile(o)
|
41
41
|
|
42
42
|
return get_user_conf(path, profile)
|
43
|
-
rescue
|
43
|
+
rescue StandardError => _e
|
44
44
|
return code_config.find(path) if code_config
|
45
45
|
f_path = Idcf::Cli::Conf::Const::CODE_CONF_PATH
|
46
46
|
@code_config = Idcf::Cli::Lib::Util::YmlConf.new(f_path)
|
@@ -65,7 +65,7 @@ module Idcf
|
|
65
65
|
region = ''
|
66
66
|
region = get_user_conf('region', get_profile(o)) if read_conf
|
67
67
|
region.empty? ? 'default' : region
|
68
|
-
rescue
|
68
|
+
rescue StandardError => _e
|
69
69
|
'default'
|
70
70
|
end
|
71
71
|
|
@@ -6,7 +6,7 @@ module Idcf
|
|
6
6
|
module Filter
|
7
7
|
# filter fields
|
8
8
|
class FieldFilter < Base
|
9
|
-
MSG_NO_TARGETS = '[fields][
|
9
|
+
MSG_NO_TARGETS = '[fields][%<field>s] is not found.'.freeze
|
10
10
|
|
11
11
|
# filter
|
12
12
|
#
|
@@ -41,18 +41,15 @@ module Idcf
|
|
41
41
|
|
42
42
|
def extraction(data, condition)
|
43
43
|
check_extraction(data, condition)
|
44
|
-
{}
|
45
|
-
|
46
|
-
|
44
|
+
result = {}
|
45
|
+
condition.split(',').each do |key|
|
46
|
+
next if key.blank?
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
next
|
52
|
-
end
|
53
|
-
result[key] = val
|
54
|
-
end
|
48
|
+
val = data[key]
|
49
|
+
flg = @options[:table_flag] && [Array, Hash].include?(val.class)
|
50
|
+
result[key] = flg ? val.to_s : val
|
55
51
|
end
|
52
|
+
result
|
56
53
|
end
|
57
54
|
|
58
55
|
def check_extraction(data, condition)
|
@@ -63,7 +60,7 @@ module Idcf
|
|
63
60
|
end
|
64
61
|
|
65
62
|
return nil if no_targets.empty?
|
66
|
-
cli_error(MSG_NO_TARGETS
|
63
|
+
cli_error(format(MSG_NO_TARGETS, field: no_targets.join(',')))
|
67
64
|
end
|
68
65
|
end
|
69
66
|
end
|
@@ -8,9 +8,9 @@ module Idcf
|
|
8
8
|
module Formatter
|
9
9
|
# csv formatter
|
10
10
|
class CsvFormat < Base
|
11
|
-
def format(data
|
12
|
-
result = CSV.generate do |csv|
|
13
|
-
scrape_line(data
|
11
|
+
def format(data)
|
12
|
+
result = CSV.generate(force_quotes: true) do |csv|
|
13
|
+
scrape_line(data).each do |v|
|
14
14
|
csv << v
|
15
15
|
end
|
16
16
|
end
|
@@ -20,11 +20,11 @@ module Idcf
|
|
20
20
|
|
21
21
|
protected
|
22
22
|
|
23
|
-
def scrape_line(data
|
24
|
-
list = scrape(data
|
23
|
+
def scrape_line(data)
|
24
|
+
list = scrape(data)
|
25
25
|
return [] if list.size.zero?
|
26
26
|
|
27
|
-
result
|
27
|
+
result = []
|
28
28
|
headers = make_header(list.first)
|
29
29
|
result << headers
|
30
30
|
push_list(list, headers, result)
|
@@ -33,7 +33,7 @@ module Idcf
|
|
33
33
|
def make_header(first_list)
|
34
34
|
result = []
|
35
35
|
if first_list.class == Hash
|
36
|
-
first_list.
|
36
|
+
first_list.each_key do |k|
|
37
37
|
result << k
|
38
38
|
end
|
39
39
|
else
|
@@ -56,10 +56,8 @@ module Idcf
|
|
56
56
|
|
57
57
|
# scrape
|
58
58
|
# @param data [Hash]
|
59
|
-
# @param err_f [Boolean]
|
60
59
|
# @return Array in Hash
|
61
|
-
def scrape(data
|
62
|
-
return [flat_hash(data)] if err_f
|
60
|
+
def scrape(data)
|
63
61
|
return [flat_hash(data)] if data.class == Hash
|
64
62
|
return [[data]] unless data.class == Array
|
65
63
|
|
@@ -83,29 +81,14 @@ module Idcf
|
|
83
81
|
end
|
84
82
|
|
85
83
|
def flat_hash(data)
|
86
|
-
{}
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
value = flat(value) if arr_f
|
93
|
-
result[k.to_sym] = value
|
94
|
-
end
|
84
|
+
result = {}
|
85
|
+
return result unless data.class == Hash
|
86
|
+
data.each do |k, v|
|
87
|
+
value = v
|
88
|
+
value = JSON.generate(value) if v.class == Array || v.class == Hash
|
89
|
+
result[k.to_sym] = value
|
95
90
|
end
|
96
|
-
|
97
|
-
|
98
|
-
def flat(list)
|
99
|
-
result = []
|
100
|
-
list.each do |k, v|
|
101
|
-
if list.class == Hash
|
102
|
-
result << "#{k}:#{v.join('/')}"
|
103
|
-
next
|
104
|
-
end
|
105
|
-
result << (v.nil? ? k : v)
|
106
|
-
end
|
107
|
-
|
108
|
-
result.join("\n")
|
91
|
+
result
|
109
92
|
end
|
110
93
|
end
|
111
94
|
end
|
@@ -7,9 +7,9 @@ module Idcf
|
|
7
7
|
module Formatter
|
8
8
|
# table formatter
|
9
9
|
class TableFormat < CsvFormat
|
10
|
-
def format(data
|
10
|
+
def format(data)
|
11
11
|
require 'kosi'
|
12
|
-
Kosi::Table.new.render(scrape_line(data
|
12
|
+
Kosi::Table.new.render(scrape_line(data))
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -9,16 +9,15 @@ module Idcf
|
|
9
9
|
module Convert
|
10
10
|
# format helper
|
11
11
|
class Helper
|
12
|
-
FILTER_OPTION = [
|
12
|
+
FILTER_OPTION = %i[json_path fields].freeze
|
13
13
|
|
14
14
|
# data convert
|
15
15
|
#
|
16
16
|
# @param data [Hash]
|
17
|
-
# @param err_f [Boolean]
|
18
17
|
# @param f [String] format
|
19
18
|
# @return String
|
20
|
-
def format(data,
|
21
|
-
cls_load("Formatter::#{f.classify}Format").new.format(data
|
19
|
+
def format(data, f)
|
20
|
+
cls_load("Formatter::#{f.classify}Format").new.format(data)
|
22
21
|
end
|
23
22
|
|
24
23
|
# is filter target
|
@@ -31,6 +30,19 @@ module Idcf
|
|
31
30
|
false
|
32
31
|
end
|
33
32
|
|
33
|
+
# only filter
|
34
|
+
#
|
35
|
+
# @param o [Hash]
|
36
|
+
# @return Boolean
|
37
|
+
def only_filter_fields?(o)
|
38
|
+
return false if o[:fields].nil?
|
39
|
+
list = []
|
40
|
+
FILTER_OPTION.each do |k|
|
41
|
+
list << k if o[k].present?
|
42
|
+
end
|
43
|
+
list.count == 1
|
44
|
+
end
|
45
|
+
|
34
46
|
# data convert
|
35
47
|
#
|
36
48
|
# @param data [Hash]
|
@@ -38,7 +50,6 @@ module Idcf
|
|
38
50
|
# @param table_flag [Boolean]
|
39
51
|
# @return Hash
|
40
52
|
def filter(data, o, table_flag)
|
41
|
-
return data unless [Hash, Array].include?(data.class)
|
42
53
|
result = data.deep_dup
|
43
54
|
FILTER_OPTION.each do |k|
|
44
55
|
next if o[k].nil? || o[k].empty?
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'idcf/cli/conf/const'
|
2
|
+
|
3
|
+
module Idcf
|
4
|
+
module Cli
|
5
|
+
module Lib
|
6
|
+
# document
|
7
|
+
class Document
|
8
|
+
class << self
|
9
|
+
attr_reader :region, :version
|
10
|
+
|
11
|
+
def init(region: '', version: '')
|
12
|
+
@region = region
|
13
|
+
@version = version
|
14
|
+
end
|
15
|
+
|
16
|
+
def make_document_desc(link)
|
17
|
+
"reference : #{make_document_url(link)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def make_document_url(link)
|
21
|
+
result = URI(Idcf::Cli::Conf::Const::DOCUMENT_URL)
|
22
|
+
add_params = {
|
23
|
+
'id' => make_document_id(link)
|
24
|
+
}.to_param
|
25
|
+
result.query = result.query ? "#{result.query}&#{add_params}" : add_params
|
26
|
+
result.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def make_document_id(link)
|
30
|
+
titles = link.parent_titles
|
31
|
+
service_str = titles.shift.downcase
|
32
|
+
version_str = "#{Idcf::Cli::Conf::Const::DOCUMENT_SPACE_CONVERSION}#{@version}"
|
33
|
+
version_str = (@region.present? && @region != 'default' ? '' : version_str)
|
34
|
+
id_format = Idcf::Cli::Conf::Const::DOCUMENT_ID_PREFIX_FORMAT
|
35
|
+
prefix = format(id_format, service: service_str, version: version_str)
|
36
|
+
results = [prefix]
|
37
|
+
results.concat(titles)
|
38
|
+
result = results.join(Idcf::Cli::Conf::Const::DOCUMENT_ID_SEP)
|
39
|
+
result.gsub(/ /, Idcf::Cli::Conf::Const::DOCUMENT_SPACE_CONVERSION)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -12,7 +12,7 @@ module Idcf
|
|
12
12
|
class CliLogger
|
13
13
|
class << self
|
14
14
|
attr_reader :logger, :current_path
|
15
|
-
LOG_METHODS = %w
|
15
|
+
LOG_METHODS = %w[debug error fatal info unknown warn].freeze
|
16
16
|
|
17
17
|
def log_instance
|
18
18
|
return nil unless output_log?
|
@@ -68,7 +68,7 @@ module Idcf
|
|
68
68
|
return false unless conf.get_user_conf('output_log').casecmp('y').zero?
|
69
69
|
path = conf.get_user_conf('log_path')
|
70
70
|
path.present?
|
71
|
-
rescue => _e
|
71
|
+
rescue StandardError => _e
|
72
72
|
false
|
73
73
|
end
|
74
74
|
|
@@ -77,7 +77,7 @@ module Idcf
|
|
77
77
|
|
78
78
|
path = "#{base_path}/#{Idcf::Cli::Conf::Const::LOG_FILE_NAME}"
|
79
79
|
File.expand_path(path)
|
80
|
-
rescue => _e
|
80
|
+
rescue StandardError => _e
|
81
81
|
nil
|
82
82
|
end
|
83
83
|
|
@@ -40,10 +40,10 @@ module Idcf
|
|
40
40
|
def find(name, profile)
|
41
41
|
begin
|
42
42
|
@load_data[profile].fetch(name)
|
43
|
-
rescue
|
43
|
+
rescue StandardError => _e
|
44
44
|
@load_data['default'].fetch(name)
|
45
45
|
end
|
46
|
-
rescue
|
46
|
+
rescue StandardError => _e
|
47
47
|
msg = "Error: could not read #{profile}:#{name}"
|
48
48
|
raise Idcf::Cli::Error::CliError, msg
|
49
49
|
end
|
@@ -5,20 +5,29 @@ module Idcf
|
|
5
5
|
# input
|
6
6
|
class Input
|
7
7
|
class << self
|
8
|
+
# qa
|
9
|
+
#
|
10
|
+
# @param title [String]
|
11
|
+
# @param setting [Hash]
|
12
|
+
# @param nd [String]
|
13
|
+
# @return [String]
|
8
14
|
def qa(title, setting, nd = '')
|
9
15
|
loop do
|
10
|
-
v
|
11
|
-
|
12
|
-
set_s = v.empty? ? '' : "(#{v.join('/')})"
|
13
|
-
puts "#{title}#{set_s}[#{nd.empty? ? 'NONE' : nd}]"
|
16
|
+
v = qa_setting_list(setting)
|
17
|
+
qa_puts_question(title, nd, v)
|
14
18
|
result = qa_answer_input(v, nd)
|
15
19
|
return result unless result.empty?
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
23
|
+
# qa_answer_input
|
24
|
+
#
|
25
|
+
# @param list [Array]
|
26
|
+
# @param nd [String]
|
27
|
+
# @return [String]
|
19
28
|
def qa_answer_input(list, nd = '')
|
20
29
|
loop do
|
21
|
-
res
|
30
|
+
res = STDIN.gets.strip
|
22
31
|
result = res.empty? ? nd : res
|
23
32
|
return result if qa_answer?(result, list)
|
24
33
|
puts "from this [#{list.join('/')}]"
|
@@ -28,6 +37,32 @@ module Idcf
|
|
28
37
|
|
29
38
|
protected
|
30
39
|
|
40
|
+
# qa_puts_question
|
41
|
+
#
|
42
|
+
# @param title [String]
|
43
|
+
# @param nd [String]
|
44
|
+
# @param set_list [Array]
|
45
|
+
# @return nil
|
46
|
+
def qa_puts_question(title, nd, set_list)
|
47
|
+
set_s = set_list.blank? ? '' : "(#{set_list.join('/')})"
|
48
|
+
puts "#{title}#{set_s}[#{nd.empty? ? 'NONE' : nd}]"
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
|
52
|
+
# qa_setting_list
|
53
|
+
#
|
54
|
+
# @param setting [Hash]
|
55
|
+
# @return [Array]
|
56
|
+
def qa_setting_list(setting)
|
57
|
+
v = setting.class == Hash ? setting[:list] : nil
|
58
|
+
v.nil? ? [] : v
|
59
|
+
end
|
60
|
+
|
61
|
+
# qa_answer?
|
62
|
+
#
|
63
|
+
# @param val [String]
|
64
|
+
# @param list [Array]
|
65
|
+
# @return [Boolean]
|
31
66
|
def qa_answer?(val, list)
|
32
67
|
return true if list.nil? || list.empty?
|
33
68
|
return true if Regexp.new("\\A(#{list.join('|')})\\Z") =~ val
|