lhj-tools 0.1.9 → 0.1.13
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/lhj/command/config/info.rb +73 -22
- data/lib/lhj/command/init.rb +46 -16
- data/lib/lhj/command/sync_pod_repo.rb +4 -0
- data/lib/lhj/command/view.rb +69 -53
- data/lib/lhj/command/yapi/formatters/base.rb +15 -0
- data/lib/lhj/command/yapi/formatters/command_context.rb +23 -0
- data/lib/lhj/command/yapi/formatters/service.rb +23 -0
- data/lib/lhj/command/yapi/formatters/template/model.erb +10 -0
- data/lib/lhj/command/yapi/formatters/template/yapi.erb +28 -0
- data/lib/lhj/command/yapi.rb +199 -95
- data/lib/lhj/command.rb +6 -2
- data/lib/lhj/tools/version.rb +1 -1
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9899645c85f8e5b8b2163954f95949dafaa7be4730ae80cf8db25a9a9a1523a3
|
4
|
+
data.tar.gz: bdbb99bb2a141216e287f856d54c8f812e29fa45133ffd0af54374f48dada496
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 145eecc8706741b98073e87390c56a818e718f13e7ea6cd7f8b0aafc2c346f5b219ca075c1516db22cb438cb52cf5c2210f5ebd5c51f12ae9dabdc5db979c6aa
|
7
|
+
data.tar.gz: 83d61d33a01c96d897227e692b60ef2c56d920172193f8d9754daa2db47b7a0edc5ea8f4ea1bf26a623d110e4066b11509b7676075b4d03dd100895246eb43d3
|
@@ -3,43 +3,94 @@ require 'lhj/config'
|
|
3
3
|
|
4
4
|
module Lhj
|
5
5
|
class Command
|
6
|
+
# config
|
6
7
|
class Config < Command
|
8
|
+
def initialize(argv)
|
9
|
+
@cli = HighLine.new
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def show_config
|
14
|
+
config_arr = Dir.glob("#{config_dir}/**/*.yml")
|
15
|
+
config_arr.each_index { |i| puts "#{i}.#{File.basename(config_arr[i])}".yellow }
|
16
|
+
idx = ask_which_one
|
17
|
+
config_file = config_arr[idx]
|
18
|
+
handle_yaml(config_file)
|
19
|
+
end
|
20
|
+
|
21
|
+
def handle_yaml(file)
|
22
|
+
'子类实现'
|
23
|
+
end
|
24
|
+
|
25
|
+
def handle
|
26
|
+
show_config
|
27
|
+
end
|
28
|
+
|
29
|
+
def config_dir
|
30
|
+
Lhj::Config.instance.home_dir
|
31
|
+
end
|
32
|
+
|
33
|
+
def print_table(title, table_rows)
|
34
|
+
table = Terminal::Table.new title: title, headings: %w[键 值], rows: table_rows
|
35
|
+
puts table
|
36
|
+
end
|
37
|
+
|
7
38
|
# show config info
|
8
39
|
class Info < Config
|
9
40
|
self.summary = '查看配置信息'
|
10
41
|
|
11
|
-
def initialize(argv)
|
12
|
-
@cli = HighLine.new
|
13
|
-
super
|
14
|
-
end
|
15
42
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
43
|
+
def handle_yaml(file)
|
44
|
+
table_rows = []
|
45
|
+
content = YAML.load_file(file)
|
19
46
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
47
|
+
case content
|
48
|
+
when Array
|
49
|
+
content.each do |row|
|
50
|
+
next unless row.is_a?(Hash)
|
51
|
+
|
52
|
+
row.each do |key, value|
|
53
|
+
table_rows << [key, value]
|
54
|
+
end
|
55
|
+
table_rows << :separator
|
56
|
+
end
|
57
|
+
when Hash
|
58
|
+
content.each do |key, value|
|
59
|
+
table_rows << [key, value]
|
60
|
+
end
|
61
|
+
end
|
27
62
|
|
28
|
-
def show_yaml(file)
|
29
|
-
table_rows = []
|
30
|
-
yaml = YAML.load_file(file)
|
31
|
-
yaml.each { |key, value| table_rows << [key, value] }
|
32
63
|
title = File.basename(file).to_s
|
33
|
-
|
34
|
-
puts table
|
64
|
+
print_table(title, table_rows) if table_rows.count.positive?
|
35
65
|
end
|
36
66
|
|
37
67
|
def ask_which_one
|
38
68
|
@cli.ask('查看哪个配置: '.green).strip.to_i
|
39
69
|
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class Update < Config
|
73
|
+
|
74
|
+
def ask_which_one
|
75
|
+
@cli.ask('更新哪个配置: '.green).strip.to_i
|
76
|
+
end
|
77
|
+
|
78
|
+
def handle_yaml(file)
|
79
|
+
table_rows = []
|
80
|
+
content = YAML.load_file(file)
|
81
|
+
|
82
|
+
if content.is_a?(Hash)
|
83
|
+
content.each do |key, value|
|
84
|
+
table_rows << [key, value]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
title = File.basename(file).to_s
|
89
|
+
print_table(title, table_rows) if table_rows.count.positive?
|
40
90
|
|
41
|
-
|
42
|
-
|
91
|
+
cmd = ['open']
|
92
|
+
cmd << file
|
93
|
+
Actions.sh(cmd.join(' '))
|
43
94
|
end
|
44
95
|
end
|
45
96
|
end
|
data/lib/lhj/command/init.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'faraday'
|
2
3
|
require 'faraday_middleware'
|
3
4
|
require 'net/http'
|
@@ -9,20 +10,41 @@ module Lhj
|
|
9
10
|
# sync config
|
10
11
|
class Init < Command
|
11
12
|
self.summary = '初始化控件'
|
12
|
-
self.description = '使用工具前先执行`lhj init`'
|
13
|
+
self.description = '使用工具前先执行`lhj init --url=http://xxx`'
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
self.arguments = [
|
16
|
+
CLAide::Argument.new('url', true)
|
17
|
+
]
|
18
|
+
|
19
|
+
def self.options
|
20
|
+
[
|
21
|
+
%w[--url 配置文件的url]
|
22
|
+
]
|
23
|
+
end
|
24
|
+
|
25
|
+
def validate!
|
26
|
+
super
|
27
|
+
unless @url
|
28
|
+
path = File.join(target_folder, 'config_file.yml')
|
29
|
+
help! '配置url必须输入' unless File.exist?(path)
|
30
|
+
end
|
17
31
|
end
|
18
32
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
33
|
+
def initialize(argv)
|
34
|
+
@url = argv.option('url')
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
def handle
|
39
|
+
FileUtils.mkdir_p(target_folder) unless File.exist?(target_folder)
|
40
|
+
if @url
|
41
|
+
file_path = file_name_from_url(@url)
|
42
|
+
save_url_to_file(@url, file_path)
|
43
|
+
else
|
44
|
+
file_path = File.join(target_folder, 'config_file.yml')
|
45
|
+
end
|
46
|
+
content = YAML.load_file(file_path)
|
47
|
+
download_file(content) if content.is_a?(Array)
|
26
48
|
end
|
27
49
|
|
28
50
|
def target_folder
|
@@ -41,14 +63,22 @@ module Lhj
|
|
41
63
|
url.scan(%r{/([^/]+)}).flatten.last
|
42
64
|
end
|
43
65
|
|
44
|
-
def download_file
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
save_file(url, file_path) unless File.exist?(file_path)
|
66
|
+
def download_file(urls)
|
67
|
+
urls.each do |url|
|
68
|
+
file_path = file_name_from_url(url)
|
69
|
+
save_url_to_file(url, file_path)
|
49
70
|
end
|
50
71
|
puts "工具初始化完成 \n"
|
51
72
|
end
|
73
|
+
|
74
|
+
def save_url_to_file(url, file_path)
|
75
|
+
save_file(url, file_path) unless File.exist?(file_path)
|
76
|
+
end
|
77
|
+
|
78
|
+
def file_name_from_url(url)
|
79
|
+
file_name = file_name_with_url(url)
|
80
|
+
File.join(target_folder, file_name)
|
81
|
+
end
|
52
82
|
end
|
53
83
|
end
|
54
84
|
end
|
data/lib/lhj/command/view.rb
CHANGED
@@ -47,102 +47,118 @@ module Lhj
|
|
47
47
|
print_value
|
48
48
|
end
|
49
49
|
|
50
|
+
def puts_d(str)
|
51
|
+
puts str.blue
|
52
|
+
end
|
53
|
+
|
54
|
+
def puts_i(str)
|
55
|
+
puts str.blue
|
56
|
+
end
|
57
|
+
|
58
|
+
def puts_l(str)
|
59
|
+
puts str.blue
|
60
|
+
end
|
61
|
+
|
62
|
+
def puts_v(str)
|
63
|
+
puts str.blue
|
64
|
+
end
|
65
|
+
|
50
66
|
def print_declare
|
51
67
|
names.each do |name|
|
52
|
-
|
53
|
-
|
68
|
+
puts_d '///'
|
69
|
+
puts_d "@property (nonatomic, strong) #{type} *#{name};"
|
54
70
|
end
|
55
71
|
end
|
56
72
|
|
57
73
|
def print_instance
|
58
74
|
names.each do |name|
|
59
|
-
|
60
|
-
|
61
|
-
|
75
|
+
puts_i "-(#{type} *)#{name}"
|
76
|
+
puts_i '{'
|
77
|
+
puts_i " if(!_#{name}){"
|
62
78
|
print_alloc(name)
|
63
|
-
|
79
|
+
puts_i " _#{name}.translatesAutoresizingMaskIntoConstraints = NO;"
|
64
80
|
print_property(name)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
81
|
+
puts_i ' }'
|
82
|
+
puts_i " return _#{name};"
|
83
|
+
puts_i '}'
|
84
|
+
puts_i "\n"
|
69
85
|
end
|
70
86
|
end
|
71
87
|
|
72
88
|
def print_alloc(name)
|
73
89
|
case type
|
74
90
|
when 'UIImageView'
|
75
|
-
|
91
|
+
puts_i " _#{name} = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@\"xxxx\"]];"
|
76
92
|
when 'UIButton'
|
77
|
-
|
93
|
+
puts_i " _#{name} = [UIButton buttonWithType:UIButtonTypeCustom];"
|
78
94
|
when 'UITableView'
|
79
|
-
|
95
|
+
puts_i " _#{name} = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];"
|
80
96
|
else
|
81
|
-
|
97
|
+
puts_i " _#{name} = [[#{type} alloc] init];"
|
82
98
|
end
|
83
99
|
end
|
84
100
|
|
85
101
|
def print_property(name)
|
86
102
|
case type
|
87
103
|
when 'UILabel'
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
104
|
+
puts_i " _#{name}.textColor = kSetCOLOR(0x333333);"
|
105
|
+
puts_i " _#{name}.text = @\"xxxxxxxx\";"
|
106
|
+
puts_i " _#{name}.font = [UIFont systemFontOfSize:12.0 weight:UIFontWeightRegular];"
|
107
|
+
puts_i " _#{name}.textAlignment = NSTextAlignmentCenter;"
|
92
108
|
when 'UIImageView'
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
109
|
+
puts_i " _#{name}.backgroundColor = kBackgroundColor;"
|
110
|
+
puts_i " _#{name}.contentMode = UIViewContentModeScaleAspectFit;"
|
111
|
+
puts_i " _#{name}.clipsToBounds = YES;"
|
112
|
+
puts_i " _#{name}.layer.cornerRadius = 6.0f;"
|
113
|
+
puts_i " _#{name}.layer.borderColor = kLineColor.CGColor;"
|
114
|
+
puts_i " _#{name}.layer.borderWidth = 0.5;"
|
99
115
|
when 'UITextField'
|
100
|
-
|
101
|
-
|
116
|
+
puts_i " _#{name}.textColor = kSetCOLOR(0x333333);"
|
117
|
+
puts_i " _#{name}.font = [UIFont systemFontOfSize:12.0 weight:UIFontWeightRegular];"
|
102
118
|
when 'UIView'
|
103
|
-
|
119
|
+
puts_i " _#{name}.backgroundColor = kBackgroundColor;"
|
104
120
|
when 'UIStackView'
|
105
|
-
|
106
|
-
|
121
|
+
puts_i " _#{name}.axis = UILayoutConstraintAxisHorizontal;"
|
122
|
+
puts_i " _#{name}.distribution = UIStackViewDistributionFillEqually;"
|
107
123
|
when 'UITableView'
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
124
|
+
puts_i " _#{name}.backgroundColor = kBackgroundColor;"
|
125
|
+
puts_i " _#{name}.delegate = self;"
|
126
|
+
puts_i " _#{name}.delegate = self;"
|
127
|
+
puts_i " _#{name}.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];"
|
128
|
+
puts_i " _#{name}.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];"
|
129
|
+
puts_i " _#{name}.separatorStyle = UITableViewCellSeparatorStyleNone;"
|
114
130
|
when 'UIButton'
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
131
|
+
puts_i " _#{name}.backgroundColor = kBackgroundColor;"
|
132
|
+
puts_i " [_#{name} setTitle:@\"xxx\" forState:UIControlStateNormal];"
|
133
|
+
puts_i " [_#{name} setTitleColor:kSetCOLOR(0x999999) forState:UIControlStateNormal];"
|
134
|
+
puts_i " _#{name}.titleLabel.font = [UIFont systemFontOfSize:14.0 weight:UIFontWeightRegular];"
|
135
|
+
puts_i " [_#{name} setImage:[UIImage imageNamed:@\"xx\"] forState:UIControlStateNormal];"
|
136
|
+
puts_i " [_#{name} setImage:[UIImage imageNamed:@\"xx\"] forState:UIControlStateSelected];"
|
137
|
+
puts_i " [_#{name} addTarget:self action:@selector(actionHandler:) forControlEvents:UIControlEventTouchUpInside];"
|
122
138
|
end
|
123
139
|
end
|
124
140
|
|
125
141
|
def print_layout
|
126
142
|
names.each do |name|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
143
|
+
puts_l "[contentView addSubview:self.#{name}];"
|
144
|
+
puts_l "[self.#{name}.leadingAnchor constraintEqualToAnchor:contentView.leadingAnchor constant:0].active = YES;"
|
145
|
+
puts_l "[self.#{name}.trailingAnchor constraintEqualToAnchor:contentView.trailingAnchor constant:0].active = YES;"
|
146
|
+
puts_l "[self.#{name}.topAnchor constraintEqualToAnchor:contentView.topAnchor].active = YES;"
|
147
|
+
puts_l "[self.#{name}.bottomAnchor constraintEqualToAnchor:contentView.bottomAnchor].active = YES;"
|
148
|
+
puts_l "[self.#{name}.widthAnchor constraintEqualToConstant:80].active = YES;"
|
149
|
+
puts_l "[self.#{name}.heightAnchor constraintEqualToConstant:80].active = YES;"
|
134
150
|
if type.eql?('UILabel')
|
135
|
-
|
136
|
-
|
151
|
+
puts_l "[self.#{name} setContentHuggingPriority:300 forAxis:UILayoutConstraintAxisHorizontal];"
|
152
|
+
puts_l "[self.#{name} setContentCompressionResistancePriority:300 forAxis:UILayoutConstraintAxisHorizontal];"
|
137
153
|
end
|
138
|
-
|
154
|
+
puts_l "\n\n"
|
139
155
|
end
|
140
156
|
end
|
141
157
|
|
142
158
|
def print_value
|
143
159
|
names.each do |name|
|
144
160
|
if type.eql?('UILabel')
|
145
|
-
|
161
|
+
puts_v "self.#{name}.text = @\"xxxxx\";"
|
146
162
|
end
|
147
163
|
end
|
148
164
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lhj
|
4
|
+
module ErbFormatter
|
5
|
+
# context
|
6
|
+
class Context
|
7
|
+
def initialize(target)
|
8
|
+
@target = target
|
9
|
+
end
|
10
|
+
|
11
|
+
def fetch_binding
|
12
|
+
@target.instance_eval { binding }.tap do |bind|
|
13
|
+
decorate_binding(bind)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# 空方法
|
18
|
+
def decorate_binding(bind)
|
19
|
+
bind.eval('save = 1')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require_relative 'base'
|
3
|
+
require_relative 'command_context'
|
4
|
+
|
5
|
+
module Lhj
|
6
|
+
module ErbFormatter
|
7
|
+
# service
|
8
|
+
class Service < Base
|
9
|
+
# @param [String] name
|
10
|
+
def render(name = 'yapi')
|
11
|
+
template(name).result(Context.new(@runner).fetch_binding)
|
12
|
+
end
|
13
|
+
|
14
|
+
def template(name)
|
15
|
+
if RUBY_VERSION < '2.6'
|
16
|
+
ERB.new(File.read(File.join(File.dirname(__FILE__), 'template', "#{name}.erb")), nil, '-')
|
17
|
+
else
|
18
|
+
ERB.new(File.read(File.join(File.dirname(__FILE__), 'template', "#{name}.erb")), trim_mode: '-')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% if @result_model_name %>
|
2
|
+
if (responseMessage.resultCode == 0 && responseMessage.error == nil) {
|
3
|
+
if ([responseMessage.detailMsg isKindOfClass:[NSDictionary class]]) {
|
4
|
+
<%= @result_model_name %> *info = <%= @result_model_name %> yy_modelWithDictionary:responseMessage.detailMsg];
|
5
|
+
callback(info,responseMessage);
|
6
|
+
}
|
7
|
+
} else {
|
8
|
+
callback(nil,responseMessage);
|
9
|
+
}
|
10
|
+
<% end %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
/**
|
2
|
+
* <%= @title %> -- <%= @username %>
|
3
|
+
* <%= @desc %>
|
4
|
+
*/
|
5
|
+
static NSString * const <%= @path_key %> = @"<%= @path %>";
|
6
|
+
|
7
|
+
<% if @method == 'GET' -%>
|
8
|
+
+(void)get<%= @path_name %>:(<%= @param_model_name %> *)param callback:(void (^)(<% unless @result_model_name.empty? -%><%= @result_model_name %> *model, <% end -%>MLResponseMessage *response))callback
|
9
|
+
{
|
10
|
+
[MLNetworkingManager getWithUrl:<%= @path_key %> params:params response:^(MLResponseMessage *responseMessage) {
|
11
|
+
<%= @model_template %>
|
12
|
+
}];
|
13
|
+
}
|
14
|
+
<% elsif @method == 'JSON' -%>
|
15
|
+
+(void)postJson<%= @path_name %>:(<%= @param_model_name %> *)param callback:(void (^)(<% unless @result_model_name.empty? -%><%= @result_model_name %> *model, <% end -%>MLResponseMessage *response))callback
|
16
|
+
{
|
17
|
+
[MLNetworkingManager requestJsonWithUrl:<%= @path_key %> httpMedth:kRequestMethodPOST params:param response:^(MLResponseMessage *responseMessage) {
|
18
|
+
<%= @model_template %>
|
19
|
+
}];
|
20
|
+
}
|
21
|
+
<% else -%>
|
22
|
+
+(void)post<%= @path_name %>:(<%= @param_model_name %> *)param callback:(void (^)(<% unless @result_model_name.empty? -%><%= @result_model_name %> *model, <% end -%>MLResponseMessage *response))callback
|
23
|
+
{
|
24
|
+
[MLNetworkingManager postWithUrl:<%= @path_key %> params:params response:^(MLResponseMessage *response) {
|
25
|
+
<%= @model_template %>
|
26
|
+
}];
|
27
|
+
}
|
28
|
+
<% end -%>
|
data/lib/lhj/command/yapi.rb
CHANGED
@@ -2,6 +2,7 @@ require 'net/https'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'json'
|
4
4
|
require 'yaml'
|
5
|
+
require 'lhj/command/yapi/formatters/service'
|
5
6
|
|
6
7
|
module Lhj
|
7
8
|
class Command
|
@@ -22,23 +23,58 @@ module Lhj
|
|
22
23
|
@id = argv.option('id')
|
23
24
|
@model_pre_name = argv.option('model-pre')
|
24
25
|
@save = argv.flag?('save', false)
|
26
|
+
@debug = argv.flag?('debug', false)
|
27
|
+
@language = argv.option('lan', 'oc')
|
25
28
|
@http_url = ''
|
26
29
|
@http_headers = []
|
27
|
-
@data_json = {}
|
28
|
-
@models = []
|
29
30
|
@config_id = ''
|
30
31
|
@config_model_pre = 'ML'
|
31
32
|
@model_default_suffix = 'Model'
|
32
33
|
@type_trans = {}
|
33
34
|
@config_model_names = []
|
34
35
|
@model_names = []
|
36
|
+
# <<<===== model for template
|
37
|
+
@result_model_name = ''
|
38
|
+
@param_model_name = ''
|
39
|
+
@model_template = ''
|
40
|
+
@desc = ''
|
41
|
+
@path = ''
|
42
|
+
@path_name = ''
|
43
|
+
@path_key = ''
|
44
|
+
@method = 'GET'
|
45
|
+
@title = ''
|
46
|
+
@username = ''
|
47
|
+
@req_body_is_json_schema = false
|
48
|
+
# =====>>>
|
35
49
|
super
|
36
50
|
end
|
37
51
|
|
52
|
+
def begin_title
|
53
|
+
'读取配置文件~/.lhj/yapi.yml'
|
54
|
+
end
|
55
|
+
|
38
56
|
def handle
|
39
|
-
|
40
|
-
|
41
|
-
|
57
|
+
process(yml_file) if File.exist?(yml_file)
|
58
|
+
end
|
59
|
+
|
60
|
+
def process(config_file)
|
61
|
+
load_config(config_file)
|
62
|
+
res_body = req_api_model
|
63
|
+
unless res_body['errcode'].to_i.zero?
|
64
|
+
puts '请修改 ~/.lhj/yapi.yml文件的对应的__wpkreporterwid_,_yapi_token,_yapi_uid这三个值'.red
|
65
|
+
return
|
66
|
+
end
|
67
|
+
return unless res_body && !res_body.empty?
|
68
|
+
|
69
|
+
# 1.print request result
|
70
|
+
print_res_body_model(res_body)
|
71
|
+
# 2.print request json body
|
72
|
+
print_req_body_model(res_body)
|
73
|
+
# 3.print request param
|
74
|
+
print_req_query(res_body['data'])
|
75
|
+
# 4.print request method
|
76
|
+
print_http_method(res_body['data'])
|
77
|
+
# 5.save to file
|
42
78
|
save_to_file if @save
|
43
79
|
end
|
44
80
|
|
@@ -55,6 +91,12 @@ module Lhj
|
|
55
91
|
@h_file_array << str
|
56
92
|
end
|
57
93
|
|
94
|
+
def puts_h_red(str)
|
95
|
+
puts str.red
|
96
|
+
@h_file_array ||= []
|
97
|
+
@h_file_array << str
|
98
|
+
end
|
99
|
+
|
58
100
|
def puts_m(str)
|
59
101
|
puts str.blue
|
60
102
|
@m_file_array ||= []
|
@@ -75,9 +117,12 @@ module Lhj
|
|
75
117
|
"#{@http_url}#{api_id}"
|
76
118
|
end
|
77
119
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
120
|
+
def yml_file
|
121
|
+
File.join(Lhj::Config.instance.home_dir, 'yapi.yml')
|
122
|
+
end
|
123
|
+
|
124
|
+
def load_config(file)
|
125
|
+
config = YAML.load_file(file)
|
81
126
|
config.each do |k, v|
|
82
127
|
@http_headers << "#{k}=#{v}" if k.eql?('__wpkreporterwid_') || k.eql?('_yapi_token') || k.eql?('_yapi_uid')
|
83
128
|
end
|
@@ -101,79 +146,91 @@ module Lhj
|
|
101
146
|
@config_model_suffix || @model_default_suffix
|
102
147
|
end
|
103
148
|
|
104
|
-
def
|
149
|
+
def req_api_model
|
105
150
|
uri = URI.parse(url_str)
|
106
151
|
req = Net::HTTP::Get.new(uri)
|
107
152
|
req['Cookie'] = @http_headers.join('; ')
|
108
153
|
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
109
154
|
http.request(req)
|
110
155
|
end
|
111
|
-
|
112
|
-
|
156
|
+
res_json = JSON.parse(res.body)
|
157
|
+
puts res.body unless res_json['errcode'].to_i.zero?
|
158
|
+
puts res.body if @debug
|
159
|
+
res_json
|
113
160
|
end
|
114
161
|
|
115
|
-
def
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
162
|
+
def print_res_body_model(res_json)
|
163
|
+
res_body = fetch_res_boy(res_json)
|
164
|
+
return unless res_body
|
165
|
+
|
166
|
+
puts "\n<===============打印返回数据模型-Begin=====================>\n".green
|
167
|
+
models = []
|
168
|
+
handle_model(res_body) do |model|
|
169
|
+
models << model
|
123
170
|
end
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
print_models_implementation
|
131
|
-
puts "\n<===============打印请求模型-End=====================>\n".green
|
171
|
+
case @language
|
172
|
+
when 'oc'
|
173
|
+
print_models(models)
|
174
|
+
print_models_impl(models)
|
175
|
+
when 'java'
|
176
|
+
print_models_for_java(models)
|
132
177
|
end
|
178
|
+
@result_model_name = models.last[:name]
|
179
|
+
puts "\n<===============打印返回数据模型-End=====================>\n".green
|
133
180
|
end
|
134
181
|
|
135
|
-
def
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
182
|
+
def print_req_body_model(res_json)
|
183
|
+
req_body = fetch_req_body(res_json)
|
184
|
+
return unless req_body
|
185
|
+
|
186
|
+
puts "\n<===============打印请求模型-Begin=====================>\n".green
|
187
|
+
models = []
|
188
|
+
handle_model(req_body) do |model|
|
189
|
+
models << model
|
190
|
+
end
|
191
|
+
case @language
|
192
|
+
when 'oc'
|
193
|
+
print_models(models)
|
194
|
+
print_models_impl(models)
|
195
|
+
when 'java'
|
196
|
+
print_models_for_java(models)
|
148
197
|
end
|
198
|
+
@param_model_name = models.last[:name]
|
199
|
+
puts "\n<===============打印请求模型-End=====================>\n".green
|
200
|
+
end
|
201
|
+
|
202
|
+
def fetch_res_boy(res_json)
|
203
|
+
return if !res_json || !res_json['data'] || !res_json['data']['res_body']
|
204
|
+
|
205
|
+
res_body = JSON.parse(res_json['data']['res_body'])
|
206
|
+
return if !res_body['properties'] || !res_body['properties']['detailMsg']
|
207
|
+
|
208
|
+
result = res_body['properties']['detailMsg']
|
209
|
+
return unless result['type'] == 'object' || result['type'] == 'array'
|
210
|
+
|
211
|
+
result['name'] = gen_model_name('')
|
212
|
+
result
|
149
213
|
end
|
150
214
|
|
151
215
|
def fetch_req_body(res_json)
|
152
|
-
if res_json
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
res_body['name'] = gen_model_name('')
|
158
|
-
handle_model(res_body)
|
159
|
-
rescue => ex
|
160
|
-
puts ex
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|
216
|
+
return if !res_json || !res_json['data'] || !res_json['data']['req_body_other']
|
217
|
+
|
218
|
+
result = JSON.parse(res_json['data']['req_body_other'])
|
219
|
+
result['name'] = gen_model_name('')
|
220
|
+
result
|
164
221
|
end
|
165
222
|
|
166
223
|
def gen_model_name(name)
|
167
224
|
n = name.gsub(/vo|model|list/i, '').gsub(/(.*)s$/, '\1').gsub(/^\w/) { $&.upcase }
|
168
225
|
if n.length <= 0
|
169
|
-
n = @config_model_names.detect { |c|
|
226
|
+
n = @config_model_names.detect { |c| @model_names.none? { |na| na.gsub(/#{model_pre}(.*)Model/, '\1').eql?(c) } }
|
170
227
|
end
|
171
228
|
model_name = "#{model_pre}#{n}#{model_suffix}"
|
172
229
|
@model_names << model_name
|
173
230
|
model_name
|
174
231
|
end
|
175
232
|
|
176
|
-
def handle_model(model)
|
233
|
+
def handle_model(model, &block)
|
177
234
|
p_type = model['type']
|
178
235
|
p_name = model['name']
|
179
236
|
p_properties = model['properties']
|
@@ -192,22 +249,22 @@ module Lhj
|
|
192
249
|
c_model[:type_name] = 'NSString'
|
193
250
|
else
|
194
251
|
c_model[:type_name] = o['name']
|
195
|
-
handle_model(o)
|
252
|
+
handle_model(o, &block)
|
196
253
|
end
|
197
254
|
end
|
198
255
|
properties << c_model
|
199
256
|
end
|
200
257
|
p_model[:properties] = properties
|
201
|
-
|
258
|
+
block[p_model] if block_given?
|
202
259
|
when 'array'
|
203
260
|
t = model['items']
|
204
261
|
t['name'] = p_name
|
205
|
-
handle_model(t)
|
262
|
+
handle_model(t, &block)
|
206
263
|
end
|
207
264
|
end
|
208
265
|
|
209
|
-
def print_models
|
210
|
-
|
266
|
+
def print_models(models)
|
267
|
+
models.each do |model|
|
211
268
|
model_name = model[:name] || ''
|
212
269
|
model_properties = model[:properties]
|
213
270
|
puts_h "@interface #{model_name} : NSObject"
|
@@ -218,8 +275,20 @@ module Lhj
|
|
218
275
|
end
|
219
276
|
end
|
220
277
|
|
221
|
-
def
|
222
|
-
|
278
|
+
def print_models_for_java(models)
|
279
|
+
models.each do |model|
|
280
|
+
model_name = model[:name] || ''
|
281
|
+
model_properties = model[:properties]
|
282
|
+
puts_h "public class #{model_name} extends BaseModel implements BusinessEvent.PorductDataCollect {"
|
283
|
+
model_properties.each do |m|
|
284
|
+
print_model_for_java(m)
|
285
|
+
end
|
286
|
+
puts_h "}\n\n\n"
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
def print_models_impl(models)
|
291
|
+
models.each do |model|
|
223
292
|
puts_m "@implementation #{model[:name]}"
|
224
293
|
str = model[:properties].filter { |p| p[:type].eql?('array') && !p[:type_name].eql?('NSString') }.map { |p| "@\"#{p[:key]}\": #{p[:type_name]}.class" }.join(', ')
|
225
294
|
if str && str.length.positive?
|
@@ -243,9 +312,9 @@ module Lhj
|
|
243
312
|
case type
|
244
313
|
when 'integer'
|
245
314
|
puts_h "@property (nonatomic, assign) NSInteger #{key};"
|
246
|
-
if des.include?('分')
|
247
|
-
|
248
|
-
|
315
|
+
if des.include?('分') || des.include?('0.01')
|
316
|
+
puts_h_red '/////////==========删掉其中一个属性'
|
317
|
+
puts_h_red "@property (nonatomic, strong) MLCentNumber *#{key};"
|
249
318
|
end
|
250
319
|
when 'cent'
|
251
320
|
puts_h "@property (nonatomic, strong) MLCentNumber *#{key};"
|
@@ -268,38 +337,73 @@ module Lhj
|
|
268
337
|
end
|
269
338
|
end
|
270
339
|
|
271
|
-
def
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
des
|
283
|
-
|
284
|
-
puts_h "
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
340
|
+
def print_model_for_java(m)
|
341
|
+
key = m[:key]
|
342
|
+
type_name = m[:type_name]
|
343
|
+
type = m[:type]
|
344
|
+
des = m[:description] || ''
|
345
|
+
des.gsub!(/\n/, ' ')
|
346
|
+
default = m[:default]
|
347
|
+
case type
|
348
|
+
when 'integer'
|
349
|
+
puts_h "int #{key};//#{des} #{default}"
|
350
|
+
when 'cent'
|
351
|
+
puts_h "int #{key};//#{des} #{default}"
|
352
|
+
when 'string'
|
353
|
+
puts_h "String #{key};//#{des} #{default}"
|
354
|
+
when 'number'
|
355
|
+
puts_h "double #{key};//#{des} #{default}"
|
356
|
+
when 'float'
|
357
|
+
puts_h "double #{key};//#{des} #{default}"
|
358
|
+
when 'double'
|
359
|
+
puts_h "double #{key};//#{des} #{default}"
|
360
|
+
when 'boolean'
|
361
|
+
puts_h "boolean #{key};//#{des} #{default}"
|
362
|
+
when 'object'
|
363
|
+
puts_h "#{type_name} #{key};//#{des} #{default}"
|
364
|
+
when 'array'
|
365
|
+
puts_h "#{type_name}[] #{key};//#{des} #{default}"
|
296
366
|
else
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
367
|
+
puts_h "@property (nonatomic, copy) NSString *#{key};//#{des} #{default}"
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
# @param [Object] data
|
372
|
+
def print_req_query(data)
|
373
|
+
return unless data && data['req_query']
|
374
|
+
|
375
|
+
case @language
|
376
|
+
when 'oc'
|
377
|
+
puts_h '@interface MLParamModel : NSObject'
|
378
|
+
data['req_query'].each do |h|
|
379
|
+
des = h['desc']
|
380
|
+
puts_h "///#{des} #{h['example']}"
|
381
|
+
puts_h "@property (nonatomic, copy) NSString *#{h['name']};"
|
382
|
+
end
|
383
|
+
puts_h '@end'
|
384
|
+
puts "\n\n"
|
385
|
+
when 'java'
|
386
|
+
end
|
387
|
+
@param_model_name = 'MLParamModel' if @param_model_name.empty?
|
388
|
+
end
|
389
|
+
|
390
|
+
def print_http_method(data)
|
391
|
+
return unless data
|
392
|
+
|
393
|
+
@path = data['path']
|
394
|
+
@method = data['method']
|
395
|
+
@title = data['title']
|
396
|
+
@username = data['username']
|
397
|
+
@desc = data['desc']
|
398
|
+
@method = 'JSON' if data['req_body_is_json_schema']
|
399
|
+
@path_name = @path.split('/').map { |s| s.gsub(/[^A-Za-z0-9]/, '').gsub(/^\w/) { $&.upcase } }.join('') if @path
|
400
|
+
@path_key = "k#{@path_name}URL"
|
401
|
+
case @language
|
402
|
+
when 'oc'
|
403
|
+
puts "\n<===============方法调用=====================>\n".green
|
404
|
+
@model_template = Lhj::ErbFormatter::Service.new(self).render('model')
|
405
|
+
puts Lhj::ErbFormatter::Service.new(self).render('yapi').blue
|
406
|
+
when 'java'
|
303
407
|
end
|
304
408
|
end
|
305
409
|
end
|
data/lib/lhj/command.rb
CHANGED
@@ -30,8 +30,12 @@ module Lhj
|
|
30
30
|
self.abstract_command = true
|
31
31
|
self.command = 'lhj'
|
32
32
|
|
33
|
+
def begin_title
|
34
|
+
'开始处理...'
|
35
|
+
end
|
36
|
+
|
33
37
|
def auto_spin
|
34
|
-
puts
|
38
|
+
puts begin_title.green
|
35
39
|
# @spinner.auto_spin
|
36
40
|
end
|
37
41
|
|
@@ -42,7 +46,7 @@ module Lhj
|
|
42
46
|
|
43
47
|
def initialize(argv)
|
44
48
|
super(argv)
|
45
|
-
@spinner = TTY::Spinner.new('...', output: $stdout, format: :dots, clear: true)
|
49
|
+
@spinner = TTY::Spinner.new('[:spinner]...', output: $stdout, format: :dots, clear: true)
|
46
50
|
end
|
47
51
|
|
48
52
|
def run
|
data/lib/lhj/tools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lhj-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lihaijian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: claide
|
@@ -142,16 +142,16 @@ dependencies:
|
|
142
142
|
name: colored
|
143
143
|
requirement: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
|
-
- -
|
145
|
+
- - '='
|
146
146
|
- !ruby/object:Gem::Version
|
147
|
-
version: '
|
147
|
+
version: '1.2'
|
148
148
|
type: :runtime
|
149
149
|
prerelease: false
|
150
150
|
version_requirements: !ruby/object:Gem::Requirement
|
151
151
|
requirements:
|
152
|
-
- -
|
152
|
+
- - '='
|
153
153
|
- !ruby/object:Gem::Version
|
154
|
-
version: '
|
154
|
+
version: '1.2'
|
155
155
|
- !ruby/object:Gem::Dependency
|
156
156
|
name: excon
|
157
157
|
requirement: !ruby/object:Gem::Requirement
|
@@ -297,6 +297,11 @@ files:
|
|
297
297
|
- lib/lhj/command/trans.rb
|
298
298
|
- lib/lhj/command/view.rb
|
299
299
|
- lib/lhj/command/yapi.rb
|
300
|
+
- lib/lhj/command/yapi/formatters/base.rb
|
301
|
+
- lib/lhj/command/yapi/formatters/command_context.rb
|
302
|
+
- lib/lhj/command/yapi/formatters/service.rb
|
303
|
+
- lib/lhj/command/yapi/formatters/template/model.erb
|
304
|
+
- lib/lhj/command/yapi/formatters/template/yapi.erb
|
300
305
|
- lib/lhj/config.rb
|
301
306
|
- lib/lhj/helper/local_config.rb
|
302
307
|
- lib/lhj/helper/oss_config.rb
|