lhj-tools 0.1.8 → 0.1.12
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 -14
- data/lib/lhj/command/sync_pod_repo.rb +5 -3
- 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 +133 -90
- data/lib/lhj/command.rb +7 -3
- 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: d53d84a79a0bde89e0f6f4299cd74bec6f34b50bb4ae9534047a1981e8ecf481
|
|
4
|
+
data.tar.gz: 5c11e01ef959b491a5bd03e8f737de5a68cd0b6dffba586015291717c71a1b39
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 60619bab6cafe45d4717c97d70fba34921dd79f2e21327bcfcdc155a76cc86a2341cef50c7506ed65980c610a2d97eb1b8d79c82641dd01faf077f581ac2d2e5
|
|
7
|
+
data.tar.gz: 95b1acbb95b7342da7bb4c946b7506c7572d619374f39906b0c6804e691f38e2388ed567c37b06b4c451e4aeb382d48fd13c5a90ae1fa6bcde9253104b092e94
|
|
@@ -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,18 +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
|
-
|
|
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)
|
|
24
48
|
end
|
|
25
49
|
|
|
26
50
|
def target_folder
|
|
@@ -39,14 +63,22 @@ module Lhj
|
|
|
39
63
|
url.scan(%r{/([^/]+)}).flatten.last
|
|
40
64
|
end
|
|
41
65
|
|
|
42
|
-
def download_file
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
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)
|
|
47
70
|
end
|
|
48
71
|
puts "工具初始化完成 \n"
|
|
49
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
|
|
50
82
|
end
|
|
51
83
|
end
|
|
52
84
|
end
|
|
@@ -12,6 +12,10 @@ module Lhj
|
|
|
12
12
|
super
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
def begin_title
|
|
16
|
+
'读取映射文件~/.lhj/pod_config.yml'
|
|
17
|
+
end
|
|
18
|
+
|
|
15
19
|
def handle
|
|
16
20
|
sync
|
|
17
21
|
end
|
|
@@ -39,7 +43,7 @@ module Lhj
|
|
|
39
43
|
Actions.sh('git add .')
|
|
40
44
|
puts '3.git add成功'.green
|
|
41
45
|
|
|
42
|
-
Actions.sh("git commit -m '
|
|
46
|
+
Actions.sh("git commit -m '使用工具同步主工程代码'")
|
|
43
47
|
puts '4.git 提交成功'.green
|
|
44
48
|
|
|
45
49
|
Actions.sh('git push')
|
|
@@ -100,13 +104,11 @@ module Lhj
|
|
|
100
104
|
cmd = ['git tag']
|
|
101
105
|
cmd << '--force'
|
|
102
106
|
cmd << tag
|
|
103
|
-
UI.message("Adding git tag '#{tag}' 🎯.")
|
|
104
107
|
Actions.sh(cmd.join(' '))
|
|
105
108
|
end
|
|
106
109
|
|
|
107
110
|
def push_tag
|
|
108
111
|
cmd = ['git push --tags']
|
|
109
|
-
UI.message('git push --tags 🎯.')
|
|
110
112
|
Actions.sh(cmd.join(' '))
|
|
111
113
|
end
|
|
112
114
|
|
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,57 @@ 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)
|
|
25
27
|
@http_url = ''
|
|
26
28
|
@http_headers = []
|
|
27
|
-
@data_json = {}
|
|
28
|
-
@models = []
|
|
29
29
|
@config_id = ''
|
|
30
30
|
@config_model_pre = 'ML'
|
|
31
31
|
@model_default_suffix = 'Model'
|
|
32
32
|
@type_trans = {}
|
|
33
33
|
@config_model_names = []
|
|
34
34
|
@model_names = []
|
|
35
|
+
# <<<===== model for template
|
|
36
|
+
@result_model_name = ''
|
|
37
|
+
@param_model_name = ''
|
|
38
|
+
@model_template = ''
|
|
39
|
+
@desc = ''
|
|
40
|
+
@path = ''
|
|
41
|
+
@path_name = ''
|
|
42
|
+
@path_key = ''
|
|
43
|
+
@method = 'GET'
|
|
44
|
+
@title = ''
|
|
45
|
+
@username = ''
|
|
46
|
+
@req_body_is_json_schema = false
|
|
47
|
+
# =====>>>
|
|
35
48
|
super
|
|
36
49
|
end
|
|
37
50
|
|
|
51
|
+
def begin_title
|
|
52
|
+
'读取配置文件~/.lhj/yapi.yml'
|
|
53
|
+
end
|
|
54
|
+
|
|
38
55
|
def handle
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
56
|
+
process(yml_file) if File.exist?(yml_file)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def process(config_file)
|
|
60
|
+
load_config(config_file)
|
|
61
|
+
res_body = req_api_model
|
|
62
|
+
unless res_body['errcode'].to_i.zero?
|
|
63
|
+
puts '请修改 ~/.lhj/yapi.yml文件的对应的__wpkreporterwid_,_yapi_token,_yapi_uid这三个值'.red
|
|
64
|
+
return
|
|
65
|
+
end
|
|
66
|
+
return unless res_body && !res_body.empty?
|
|
67
|
+
|
|
68
|
+
# 1.print request result
|
|
69
|
+
print_res_body_model(res_body)
|
|
70
|
+
# 2.print request json body
|
|
71
|
+
print_req_body_model(res_body)
|
|
72
|
+
# 3.print request param
|
|
73
|
+
print_req_query(res_body['data'])
|
|
74
|
+
# 4.print request method
|
|
75
|
+
print_http_method(res_body['data'])
|
|
76
|
+
# 5.save to file
|
|
42
77
|
save_to_file if @save
|
|
43
78
|
end
|
|
44
79
|
|
|
@@ -55,6 +90,12 @@ module Lhj
|
|
|
55
90
|
@h_file_array << str
|
|
56
91
|
end
|
|
57
92
|
|
|
93
|
+
def puts_h_red(str)
|
|
94
|
+
puts str.red
|
|
95
|
+
@h_file_array ||= []
|
|
96
|
+
@h_file_array << str
|
|
97
|
+
end
|
|
98
|
+
|
|
58
99
|
def puts_m(str)
|
|
59
100
|
puts str.blue
|
|
60
101
|
@m_file_array ||= []
|
|
@@ -75,9 +116,12 @@ module Lhj
|
|
|
75
116
|
"#{@http_url}#{api_id}"
|
|
76
117
|
end
|
|
77
118
|
|
|
78
|
-
def
|
|
79
|
-
|
|
80
|
-
|
|
119
|
+
def yml_file
|
|
120
|
+
File.join(Lhj::Config.instance.home_dir, 'yapi.yml')
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def load_config(file)
|
|
124
|
+
config = YAML.load_file(file)
|
|
81
125
|
config.each do |k, v|
|
|
82
126
|
@http_headers << "#{k}=#{v}" if k.eql?('__wpkreporterwid_') || k.eql?('_yapi_token') || k.eql?('_yapi_uid')
|
|
83
127
|
end
|
|
@@ -101,79 +145,81 @@ module Lhj
|
|
|
101
145
|
@config_model_suffix || @model_default_suffix
|
|
102
146
|
end
|
|
103
147
|
|
|
104
|
-
def
|
|
148
|
+
def req_api_model
|
|
105
149
|
uri = URI.parse(url_str)
|
|
106
150
|
req = Net::HTTP::Get.new(uri)
|
|
107
151
|
req['Cookie'] = @http_headers.join('; ')
|
|
108
152
|
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
|
109
153
|
http.request(req)
|
|
110
154
|
end
|
|
111
|
-
|
|
112
|
-
|
|
155
|
+
res_json = JSON.parse(res.body)
|
|
156
|
+
puts res.body unless res_json['errcode'].to_i.zero?
|
|
157
|
+
puts res.body if @debug
|
|
158
|
+
res_json
|
|
113
159
|
end
|
|
114
160
|
|
|
115
|
-
def
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
161
|
+
def print_res_body_model(res_json)
|
|
162
|
+
res_body = fetch_res_boy(res_json)
|
|
163
|
+
return unless res_body
|
|
164
|
+
|
|
165
|
+
puts "\n<===============打印返回数据模型-Begin=====================>\n".green
|
|
166
|
+
models = []
|
|
167
|
+
handle_model(res_body) do |model|
|
|
168
|
+
models << model
|
|
123
169
|
end
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
170
|
+
print_models(models)
|
|
171
|
+
print_models_impl(models)
|
|
172
|
+
@result_model_name = models.last[:name]
|
|
173
|
+
puts "\n<===============打印返回数据模型-End=====================>\n".green
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def print_req_body_model(res_json)
|
|
177
|
+
req_body = fetch_req_body(res_json)
|
|
178
|
+
return unless req_body
|
|
179
|
+
|
|
180
|
+
puts "\n<===============打印请求模型-Begin=====================>\n".green
|
|
181
|
+
models = []
|
|
182
|
+
handle_model(req_body) do |model|
|
|
183
|
+
models << model
|
|
132
184
|
end
|
|
185
|
+
print_models(models)
|
|
186
|
+
print_models_impl(models)
|
|
187
|
+
@param_model_name = models.last[:name]
|
|
188
|
+
puts "\n<===============打印请求模型-End=====================>\n".green
|
|
133
189
|
end
|
|
134
190
|
|
|
135
191
|
def fetch_res_boy(res_json)
|
|
136
|
-
if res_json
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
end
|
|
192
|
+
return if !res_json || !res_json['data'] || !res_json['data']['res_body']
|
|
193
|
+
|
|
194
|
+
res_body = JSON.parse(res_json['data']['res_body'])
|
|
195
|
+
return if !res_body['properties'] || !res_body['properties']['detailMsg']
|
|
196
|
+
|
|
197
|
+
result = res_body['properties']['detailMsg']
|
|
198
|
+
return unless result['type'] == 'object' || result['type'] == 'array'
|
|
199
|
+
|
|
200
|
+
result['name'] = gen_model_name('')
|
|
201
|
+
result
|
|
149
202
|
end
|
|
150
203
|
|
|
151
204
|
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
|
|
205
|
+
return if !res_json || !res_json['data'] || !res_json['data']['req_body_other']
|
|
206
|
+
|
|
207
|
+
result = JSON.parse(res_json['data']['req_body_other'])
|
|
208
|
+
result['name'] = gen_model_name('')
|
|
209
|
+
result
|
|
164
210
|
end
|
|
165
211
|
|
|
166
212
|
def gen_model_name(name)
|
|
167
213
|
n = name.gsub(/vo|model|list/i, '').gsub(/(.*)s$/, '\1').gsub(/^\w/) { $&.upcase }
|
|
168
214
|
if n.length <= 0
|
|
169
|
-
n = @config_model_names.detect { |c|
|
|
215
|
+
n = @config_model_names.detect { |c| @model_names.none? { |na| na.gsub(/#{model_pre}(.*)Model/, '\1').eql?(c) } }
|
|
170
216
|
end
|
|
171
217
|
model_name = "#{model_pre}#{n}#{model_suffix}"
|
|
172
218
|
@model_names << model_name
|
|
173
219
|
model_name
|
|
174
220
|
end
|
|
175
221
|
|
|
176
|
-
def handle_model(model)
|
|
222
|
+
def handle_model(model, &block)
|
|
177
223
|
p_type = model['type']
|
|
178
224
|
p_name = model['name']
|
|
179
225
|
p_properties = model['properties']
|
|
@@ -192,22 +238,22 @@ module Lhj
|
|
|
192
238
|
c_model[:type_name] = 'NSString'
|
|
193
239
|
else
|
|
194
240
|
c_model[:type_name] = o['name']
|
|
195
|
-
handle_model(o)
|
|
241
|
+
handle_model(o, &block)
|
|
196
242
|
end
|
|
197
243
|
end
|
|
198
244
|
properties << c_model
|
|
199
245
|
end
|
|
200
246
|
p_model[:properties] = properties
|
|
201
|
-
|
|
247
|
+
block[p_model] if block_given?
|
|
202
248
|
when 'array'
|
|
203
249
|
t = model['items']
|
|
204
250
|
t['name'] = p_name
|
|
205
|
-
handle_model(t)
|
|
251
|
+
handle_model(t, &block)
|
|
206
252
|
end
|
|
207
253
|
end
|
|
208
254
|
|
|
209
|
-
def print_models
|
|
210
|
-
|
|
255
|
+
def print_models(models)
|
|
256
|
+
models.each do |model|
|
|
211
257
|
model_name = model[:name] || ''
|
|
212
258
|
model_properties = model[:properties]
|
|
213
259
|
puts_h "@interface #{model_name} : NSObject"
|
|
@@ -218,8 +264,8 @@ module Lhj
|
|
|
218
264
|
end
|
|
219
265
|
end
|
|
220
266
|
|
|
221
|
-
def
|
|
222
|
-
|
|
267
|
+
def print_models_impl(models)
|
|
268
|
+
models.each do |model|
|
|
223
269
|
puts_m "@implementation #{model[:name]}"
|
|
224
270
|
str = model[:properties].filter { |p| p[:type].eql?('array') && !p[:type_name].eql?('NSString') }.map { |p| "@\"#{p[:key]}\": #{p[:type_name]}.class" }.join(', ')
|
|
225
271
|
if str && str.length.positive?
|
|
@@ -243,9 +289,9 @@ module Lhj
|
|
|
243
289
|
case type
|
|
244
290
|
when 'integer'
|
|
245
291
|
puts_h "@property (nonatomic, assign) NSInteger #{key};"
|
|
246
|
-
if des.include?('分')
|
|
247
|
-
|
|
248
|
-
|
|
292
|
+
if des.include?('分') || des.include?('0.01')
|
|
293
|
+
puts_h_red '/////////==========删掉其中一个属性'
|
|
294
|
+
puts_h_red "@property (nonatomic, strong) MLCentNumber *#{key};"
|
|
249
295
|
end
|
|
250
296
|
when 'cent'
|
|
251
297
|
puts_h "@property (nonatomic, strong) MLCentNumber *#{key};"
|
|
@@ -268,39 +314,36 @@ module Lhj
|
|
|
268
314
|
end
|
|
269
315
|
end
|
|
270
316
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
puts_m ' */'
|
|
276
|
-
key_str = @data_json['path'].split('/').map { |s| s.gsub(/[^A-Za-z0-9]/, '').gsub(/^\w/) { $&.upcase } }.join('')
|
|
277
|
-
key = "k#{key_str}URL"
|
|
278
|
-
puts_m "static NSString * const #{key} = @\"#{@data_json['path']}\";"
|
|
279
|
-
puts_m "\n\n"
|
|
317
|
+
# @param [Object] data
|
|
318
|
+
def print_req_query(data)
|
|
319
|
+
return unless data && data['req_query']
|
|
320
|
+
|
|
280
321
|
puts_h '@interface MLParamModel : NSObject'
|
|
281
|
-
|
|
322
|
+
data['req_query'].each do |h|
|
|
282
323
|
des = h['desc']
|
|
283
324
|
puts_h "///#{des} #{h['example']}"
|
|
284
325
|
puts_h "@property (nonatomic, copy) NSString *#{h['name']};"
|
|
285
326
|
end
|
|
286
327
|
puts_h '@end'
|
|
287
328
|
puts "\n\n"
|
|
288
|
-
|
|
289
|
-
if @
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
329
|
+
|
|
330
|
+
@param_model_name = 'MLParamModel' if @param_model_name.empty?
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def print_http_method(data)
|
|
334
|
+
return unless data
|
|
335
|
+
|
|
336
|
+
@path = data['path']
|
|
337
|
+
@method = data['method']
|
|
338
|
+
@title = data['title']
|
|
339
|
+
@username = data['username']
|
|
340
|
+
@desc = data['desc']
|
|
341
|
+
@method = 'JSON' if data['req_body_is_json_schema']
|
|
342
|
+
@path_name = @path.split('/').map { |s| s.gsub(/[^A-Za-z0-9]/, '').gsub(/^\w/) { $&.upcase } }.join('') if @path
|
|
343
|
+
@path_key = "k#{@path_name}URL"
|
|
344
|
+
puts "\n<===============方法调用=====================>\n".green
|
|
345
|
+
@model_template = Lhj::ErbFormatter::Service.new(self).render('model')
|
|
346
|
+
puts Lhj::ErbFormatter::Service.new(self).render('yapi').blue
|
|
304
347
|
end
|
|
305
348
|
end
|
|
306
349
|
end
|
data/lib/lhj/command.rb
CHANGED
|
@@ -30,19 +30,23 @@ 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
|
-
|
|
38
|
+
puts begin_title.green
|
|
35
39
|
# @spinner.auto_spin
|
|
36
40
|
end
|
|
37
41
|
|
|
38
42
|
def stop
|
|
39
|
-
|
|
43
|
+
puts '处理完成'.green
|
|
40
44
|
# @spinner.success('Done!')
|
|
41
45
|
end
|
|
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.12
|
|
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-03 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
|