lhj-tools 0.2.26 → 0.2.28
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/lhj/command/jenkins/jenkins_build.rb +39 -9
- data/lib/lhj/helper/dingtalk_helper.rb +143 -0
- data/lib/lhj/helper/ios_robot_config.rb +7 -16
- data/lib/lhj/helper/yapi/yapi_helper.rb +453 -0
- data/lib/lhj/helper/yapi/yapi_token_config.rb +36 -0
- data/lib/lhj/lhj.rb +2 -0
- data/lib/lhj/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e94e1905e459e9be531bc985e002c26e743c7c642d2489fb4f8ed5eb0ec84c29
|
4
|
+
data.tar.gz: c381978186ef918f95428253f355ba7abef8e5d3310e905efadcac868b4b5e26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f01e8a6806633435912ac4a87fbd9bf5821ebfe5c8dcc39b994628edb0e832b5605508324e6252945fb35faa263b7673668733d294201ed7a8417bb1e145b43
|
7
|
+
data.tar.gz: d107bd31f5334a85265af95da2b1cf45bbb3f765582b9f20304b38f10c420fc50ef5ef56a3d405a4081aa1980b41503fbd34adfc0d1847fc7c8321439eebd3bb
|
@@ -31,17 +31,47 @@ module Lhj
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def handle
|
34
|
+
api = Lhj::YapiHelper.new(project_id: 694, interface_id: 70595, model_name: 'Order', model_pre: 'AA')
|
35
|
+
api.process
|
36
|
+
file_list = api.save_to_file
|
37
|
+
key = Lhj::IOSRobotConfig.app_key
|
38
|
+
secret = Lhj::IOSRobotConfig.app_secret
|
39
|
+
conversation_id = 'cid31Wevlrdq9L4Q0WugLb0tw=='
|
40
|
+
user_ids = []
|
41
|
+
file_list.each { |f| Lhj::Dingtalk.upload_file_and_notify(key, secret, f, conversation_id, user_ids) }
|
42
|
+
|
43
|
+
#
|
44
|
+
#
|
45
|
+
# file = File.join(Lhj::Config.instance.home_dir, 'oc_code_notify.erb')
|
46
|
+
# conversation_id = 'cid31Wevlrdq9L4Q0WugLb0tw=='
|
47
|
+
# user_ids = []
|
48
|
+
# base_name = File.basename(file)
|
49
|
+
# file_type = File.extname(file)[1..-1]
|
50
|
+
#
|
51
|
+
# key = Lhj::IOSRobotConfig.app_key
|
52
|
+
# secret = Lhj::IOSRobotConfig.app_secret
|
53
|
+
# token = Lhj::Dingtalk.get_token(key, secret)
|
54
|
+
# content = File.open(file)
|
55
|
+
# media_id = Lhj::Dingtalk.upload(token, content)
|
56
|
+
# msg_key = 'sampleFile'
|
57
|
+
# msg_param = Lhj::Dingtalk.sample_file_param(media_id, base_name, file_type)
|
58
|
+
# msg_body = Lhj::Dingtalk.group_message_body(key, conversation_id, user_ids, msg_key, msg_param)
|
59
|
+
# Lhj::Dingtalk.send_group_message(token, msg_body)
|
60
|
+
|
61
|
+
# task = l.find { |task| d.include?(task) }
|
62
|
+
# puts task
|
63
|
+
|
34
64
|
job_name = 'aom_uat_haijian'
|
35
65
|
# job_name = 'aom_uat_haijian'
|
36
|
-
server_ip = Lhj::JenkinsConfig.server_ip
|
37
|
-
server_port = Lhj::JenkinsConfig.server_port
|
38
|
-
username = Lhj::JenkinsConfig.username
|
39
|
-
password = Lhj::JenkinsConfig.password
|
40
|
-
client = JenkinsApi::Client.new(server_ip: server_ip, server_port: server_port, username: username, password: password)
|
41
|
-
|
42
|
-
client.job.list_all.each do |a|
|
43
|
-
|
44
|
-
end
|
66
|
+
# server_ip = Lhj::JenkinsConfig.server_ip
|
67
|
+
# server_port = Lhj::JenkinsConfig.server_port
|
68
|
+
# username = Lhj::JenkinsConfig.username
|
69
|
+
# password = Lhj::JenkinsConfig.password
|
70
|
+
# client = JenkinsApi::Client.new(server_ip: server_ip, server_port: server_port, username: username, password: password)
|
71
|
+
#
|
72
|
+
# client.job.list_all.each do |a|
|
73
|
+
# add_property(client, a, 'WEBHOOK', 'https://oapi.dingtalk.com/robot/sendBySession?session=bd640dea6cd28b6c880c4f3cc0945c8f', 'Webhook url')
|
74
|
+
# end
|
45
75
|
# puts client.job.get_config('aomi_uat')
|
46
76
|
#
|
47
77
|
end
|
@@ -10,11 +10,21 @@ module Lhj
|
|
10
10
|
post_message_robot(robot_url, title, message)
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.post_message_at_users(title, message, users)
|
14
|
+
robot_url = Lhj::DingTalkConfig.dingtalk_robot
|
15
|
+
post_message_robot_at_users(robot_url, title, message, users)
|
16
|
+
end
|
17
|
+
|
13
18
|
def self.post_text_message(message)
|
14
19
|
robot_url = Lhj::DingTalkConfig.dingtalk_robot
|
15
20
|
post_text_message_robot(robot_url, message)
|
16
21
|
end
|
17
22
|
|
23
|
+
def self.post_text_message_at_users(message, users)
|
24
|
+
robot_url = Lhj::DingTalkConfig.dingtalk_robot
|
25
|
+
post_text_message_robot_at_users(robot_url, message, users)
|
26
|
+
end
|
27
|
+
|
18
28
|
def self.post_card_message(title, message, btns)
|
19
29
|
robot_url = Lhj::DingTalkConfig.dingtalk_robot
|
20
30
|
post_card_message_robot(robot_url, title, message, btns)
|
@@ -30,11 +40,21 @@ module Lhj
|
|
30
40
|
http_post(robot_url, http_body)
|
31
41
|
end
|
32
42
|
|
43
|
+
def self.post_message_robot_at_users(robot_url, title, message, users)
|
44
|
+
http_body = markdown_body_message_users(title, message, users)
|
45
|
+
http_post(robot_url, http_body)
|
46
|
+
end
|
47
|
+
|
33
48
|
def self.post_text_message_robot(robot_url, message)
|
34
49
|
http_body = text_body_message(message)
|
35
50
|
http_post(robot_url, http_body)
|
36
51
|
end
|
37
52
|
|
53
|
+
def self.post_text_message_robot_at_users(robot_url, message, users)
|
54
|
+
http_body = text_body_message_users(message, users)
|
55
|
+
http_post(robot_url, http_body)
|
56
|
+
end
|
57
|
+
|
38
58
|
def self.post_card_message_robot(robot_url, title, message, btns)
|
39
59
|
http_body = action_card_body_message(title, message, btns, :vertical)
|
40
60
|
http_post(robot_url, http_body)
|
@@ -61,6 +81,14 @@ module Lhj
|
|
61
81
|
}.to_json
|
62
82
|
end
|
63
83
|
|
84
|
+
def self.text_body_message_users(message, users)
|
85
|
+
{
|
86
|
+
'at' => { 'atUserIds' => users, 'isAtAll' => false },
|
87
|
+
'msgtype' => 'text',
|
88
|
+
'text' => { 'content' => message }
|
89
|
+
}.to_json
|
90
|
+
end
|
91
|
+
|
64
92
|
def self.markdown_body_message(title, message)
|
65
93
|
{
|
66
94
|
'msgtype' => 'markdown',
|
@@ -68,6 +96,14 @@ module Lhj
|
|
68
96
|
}.to_json
|
69
97
|
end
|
70
98
|
|
99
|
+
def self.markdown_body_message_users(title, message, users)
|
100
|
+
{
|
101
|
+
'at' => { 'atUserIds' => users, 'isAtAll' => false },
|
102
|
+
'msgtype' => 'markdown',
|
103
|
+
'markdown' => { 'title' => title, 'text' => message }
|
104
|
+
}.to_json
|
105
|
+
end
|
106
|
+
|
71
107
|
# btns: [{'title'=>'内容不错', 'actionURL'=>'https://www.baidu.com'}]
|
72
108
|
def self.action_card_body_message(title, message, btns, orientation = :vertical)
|
73
109
|
btn_orientation = orientation == :vertical ? '1' : '0'
|
@@ -98,5 +134,112 @@ module Lhj
|
|
98
134
|
'feedCard' => links
|
99
135
|
}.to_json
|
100
136
|
end
|
137
|
+
|
138
|
+
def self.get_token(app_key, app_secret)
|
139
|
+
token_url = "https://oapi.dingtalk.com/gettoken?appkey=#{app_key}&appsecret=#{app_secret}"
|
140
|
+
url = URI(token_url)
|
141
|
+
https = Net::HTTP.new(url.host, url.port)
|
142
|
+
https.use_ssl = true
|
143
|
+
request = Net::HTTP::Get.new(url)
|
144
|
+
response = https.request(request)
|
145
|
+
res_body = JSON.parse(response.body)
|
146
|
+
res_body['access_token'] if res_body['errcode'].to_i.zero?
|
147
|
+
end
|
148
|
+
|
149
|
+
def self.post_token(app_key, app_secret)
|
150
|
+
url = URI('https://api.dingtalk.com/v1.0/oauth2/accessToken')
|
151
|
+
https = Net::HTTP.new(url.host, url.port)
|
152
|
+
https.use_ssl = true
|
153
|
+
request = Net::HTTP::Post.new(url)
|
154
|
+
request['Content-Type'] = 'application/json'
|
155
|
+
request.body = { 'appKey' => app_key, 'appSecret' => app_secret }.to_json
|
156
|
+
response = https.request(request)
|
157
|
+
JSON.parse(response.body)['accessToken']
|
158
|
+
end
|
159
|
+
|
160
|
+
def self.upload(token, file)
|
161
|
+
upload_url = "https://oapi.dingtalk.com/media/upload?access_token=#{token}"
|
162
|
+
url = URI(upload_url)
|
163
|
+
https = Net::HTTP.new(url.host, url.port)
|
164
|
+
https.use_ssl = true
|
165
|
+
request = Net::HTTP::Post.new(url)
|
166
|
+
form_data = [['media', file], ['type', 'file']]
|
167
|
+
request.set_form(form_data, 'multipart/form-data')
|
168
|
+
response = https.request(request)
|
169
|
+
res_body = JSON.parse(response.body)
|
170
|
+
res_body['media_id'] if res_body['errcode'].to_i.zero?
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.send_group_message(token, body)
|
174
|
+
url = URI('https://api.dingtalk.com/v1.0/robot/groupMessages/send')
|
175
|
+
https = Net::HTTP.new(url.host, url.port)
|
176
|
+
https.use_ssl = true
|
177
|
+
request = Net::HTTP::Post.new(url)
|
178
|
+
request['x-acs-dingtalk-access-token'] = token
|
179
|
+
request['Content-Type'] = 'application/json'
|
180
|
+
request.body = body
|
181
|
+
response = https.request(request)
|
182
|
+
JSON.parse(response.body)
|
183
|
+
end
|
184
|
+
|
185
|
+
# sampleText,sampleMarkdown,sampleImageMsg,sampleLink,sampleActionCard,sampleActionCard6,sampleAudio,sampleFile,sampleVideo
|
186
|
+
def self.group_message_body(robot_code, conversation_id, user_ids, msg_key, msg_param)
|
187
|
+
{
|
188
|
+
'robotCode' => robot_code,
|
189
|
+
'openConversationId' => conversation_id,
|
190
|
+
'userIds' => user_ids,
|
191
|
+
'msgKey' => msg_key,
|
192
|
+
'msgParam' => msg_param
|
193
|
+
}.to_json
|
194
|
+
end
|
195
|
+
|
196
|
+
def self.sample_text_param(content)
|
197
|
+
{
|
198
|
+
'content' => content
|
199
|
+
}.to_json
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.sample_markdown_param(title, text)
|
203
|
+
{
|
204
|
+
'title' => title,
|
205
|
+
'text' => text
|
206
|
+
}.to_json
|
207
|
+
end
|
208
|
+
|
209
|
+
def self.sample_image_msg_param(photo_url)
|
210
|
+
{
|
211
|
+
'photoURL' => photo_url
|
212
|
+
}.to_json
|
213
|
+
end
|
214
|
+
|
215
|
+
def self.sample_file_param(media_id, file_name, file_type)
|
216
|
+
{
|
217
|
+
'mediaId' => media_id,
|
218
|
+
'fileName' => file_name,
|
219
|
+
'fileType' => file_type
|
220
|
+
}.to_json
|
221
|
+
end
|
222
|
+
|
223
|
+
def self.sample_video_param(duration, video_media_id, video_type, pic_media_id)
|
224
|
+
{
|
225
|
+
'duration' => duration,
|
226
|
+
'videoMediaId' => video_media_id,
|
227
|
+
'videoType' => video_type,
|
228
|
+
'picMediaId' => pic_media_id
|
229
|
+
}.to_json
|
230
|
+
end
|
231
|
+
|
232
|
+
def self.upload_file_and_notify(key, secret, upload_file, conversation_id, user_ids)
|
233
|
+
base_name = File.basename(upload_file)
|
234
|
+
file_type = File.extname(upload_file)[1..-1]
|
235
|
+
token = get_token(key, secret)
|
236
|
+
content = File.open(upload_file)
|
237
|
+
media_id = upload(token, content)
|
238
|
+
msg_key = 'sampleFile'
|
239
|
+
msg_param = sample_file_param(media_id, base_name, file_type) if media_id
|
240
|
+
msg_body = group_message_body(key, conversation_id, user_ids, msg_key, msg_param) if msg_param
|
241
|
+
send_group_message(token, msg_body) if msg_body
|
242
|
+
end
|
243
|
+
|
101
244
|
end
|
102
245
|
end
|
@@ -5,7 +5,7 @@ module Lhj
|
|
5
5
|
# ios Robot Config
|
6
6
|
class IOSRobotConfig
|
7
7
|
|
8
|
-
CONFIG_NAME = '
|
8
|
+
CONFIG_NAME = 'ios_robot_config.yml'
|
9
9
|
|
10
10
|
def self.config_file
|
11
11
|
File.join(Lhj::Config.instance.home_dir, CONFIG_NAME)
|
@@ -15,25 +15,16 @@ module Lhj
|
|
15
15
|
@yaml ||= YAML.load_file(config_file)
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.
|
19
|
-
|
20
|
-
robot = config.find { |r| r['conversation_title'].eql?(conversation) } if conversation
|
21
|
-
url = robot['robot_url'] if robot && robot['robot_url']
|
22
|
-
url
|
18
|
+
def self.agent_id
|
19
|
+
config['agent_id']
|
23
20
|
end
|
24
21
|
|
25
|
-
def self.
|
26
|
-
|
27
|
-
robot = config.find { |r| r['conversation_title'].eql?(conversation) } if conversation
|
28
|
-
title = robot['message_title'] if robot && robot['message_title']
|
29
|
-
title
|
22
|
+
def self.app_key
|
23
|
+
config['app_key']
|
30
24
|
end
|
31
25
|
|
32
|
-
def self.
|
33
|
-
|
34
|
-
robot = config.find { |r| r['conversation_title'].eql?(conversation) } if conversation
|
35
|
-
type = :text if robot && robot['message_type'] && robot['message_type'].eql?('text')
|
36
|
-
type
|
26
|
+
def self.app_secret
|
27
|
+
config['app_secret']
|
37
28
|
end
|
38
29
|
end
|
39
30
|
end
|
@@ -0,0 +1,453 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Lhj
|
4
|
+
# yapi helper
|
5
|
+
class YapiHelper
|
6
|
+
|
7
|
+
API_INTERFACE_URL = 'api/interface/get'.freeze
|
8
|
+
API_PROJECT_URL = 'api/project/get'.freeze
|
9
|
+
|
10
|
+
attr_reader :project_id, :interface_id, :model_pre, :model_name, :language
|
11
|
+
|
12
|
+
def initialize(args)
|
13
|
+
args.each { |key, value| instance_variable_set("@#{key}", value) } if args.is_a? Hash
|
14
|
+
|
15
|
+
raise ArgumentError, 'add project_id and interface_id args' unless @project_id || @interface_id
|
16
|
+
|
17
|
+
@base_url ||= Lhj::YapiTokenConfig.base_url
|
18
|
+
@language ||= :oc
|
19
|
+
@model_pre ||= 'ML'
|
20
|
+
@model_name ||= 'Info'
|
21
|
+
@model_suffix ||= 'Model'
|
22
|
+
end
|
23
|
+
|
24
|
+
def interface_url_str
|
25
|
+
token = Lhj::YapiTokenConfig.token(@project_id)
|
26
|
+
"#{@base_url}/#{API_INTERFACE_URL}?id=#{@interface_id}&token=#{token}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def project_url_str
|
30
|
+
token = Lhj::YapiTokenConfig.token(@project_id)
|
31
|
+
"#{@base_url}/#{API_PROJECT_URL}?token=#{token}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def api_original_url
|
35
|
+
"#{@base_url}/project/#{@project_id}/interface/api/#{@interface_id}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def process
|
39
|
+
res_body = get_interface_api_model
|
40
|
+
# get project info
|
41
|
+
project_info = get_project_info
|
42
|
+
# 1.print response result
|
43
|
+
res_models = print_res_body_model(res_body)
|
44
|
+
# 2.print request json body
|
45
|
+
req_models = print_req_body_model(res_body) if res_body['data']['req_body_is_json_schema']
|
46
|
+
# 3.print request param
|
47
|
+
req_models ||= print_req_query(res_body['data']) unless res_body['data']['req_body_is_json_schema']
|
48
|
+
# 4.print request method
|
49
|
+
print_http_method(res_body['data'], project_info)
|
50
|
+
# print request mock data
|
51
|
+
print_mock_request_data(req_models) if !req_models.nil? && !req_models.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def save_to_file
|
55
|
+
name = model_name
|
56
|
+
file_name = gen_model_name
|
57
|
+
n_folder = File.expand_path(sub_folder_name, '.')
|
58
|
+
FileUtils.mkdir_p(n_folder) unless File.exist?(n_folder)
|
59
|
+
h_file = File.join('.', sub_folder_name, "#{file_name}.h")
|
60
|
+
m_file = File.join('.', sub_folder_name, "#{file_name}.m")
|
61
|
+
service_file = File.join('.', sub_folder_name, "#{model_pre}#{name}Service.m")
|
62
|
+
req_mock_file = File.join('.', sub_folder_name, "#{model_pre}#{name}Mock.m")
|
63
|
+
|
64
|
+
result = []
|
65
|
+
if @h_file_array.count.positive?
|
66
|
+
File.write(h_file, @h_file_array.join("\n"))
|
67
|
+
result << h_file
|
68
|
+
end
|
69
|
+
if @m_file_array.count.positive?
|
70
|
+
File.write(m_file, @m_file_array.join("\n"))
|
71
|
+
result << m_file
|
72
|
+
end
|
73
|
+
if @service_content
|
74
|
+
File.write(service_file, @service_content)
|
75
|
+
result << service_file
|
76
|
+
end
|
77
|
+
if @req_mock_array&.count&.positive?
|
78
|
+
File.write(req_mock_file, @req_mock_array.join("\n"))
|
79
|
+
result << req_mock_file
|
80
|
+
end
|
81
|
+
result
|
82
|
+
end
|
83
|
+
|
84
|
+
def puts_h(str)
|
85
|
+
puts str.magenta
|
86
|
+
@h_file_array ||= []
|
87
|
+
@h_file_array << str
|
88
|
+
end
|
89
|
+
|
90
|
+
def puts_m(str)
|
91
|
+
puts str.blue
|
92
|
+
@m_file_array ||= []
|
93
|
+
@m_file_array << str
|
94
|
+
end
|
95
|
+
|
96
|
+
def puts_s(str)
|
97
|
+
puts str.green
|
98
|
+
@service_content = str
|
99
|
+
end
|
100
|
+
|
101
|
+
def puts_mock(str)
|
102
|
+
puts str.green
|
103
|
+
@req_mock_array ||= []
|
104
|
+
@req_mock_array << str
|
105
|
+
end
|
106
|
+
|
107
|
+
def sub_folder_name
|
108
|
+
return @sub_folder_name if @sub_folder_name
|
109
|
+
|
110
|
+
time = Time.now
|
111
|
+
@sub_folder_name ||= time.strftime('%Y%m%d%H%M%S')
|
112
|
+
@sub_folder_name
|
113
|
+
end
|
114
|
+
|
115
|
+
def req_model_name
|
116
|
+
'RequestParam'
|
117
|
+
end
|
118
|
+
|
119
|
+
def model_suffix
|
120
|
+
@model_suffix || 'Model'
|
121
|
+
end
|
122
|
+
|
123
|
+
def property_mapper
|
124
|
+
{ 'id' => 'gid' }
|
125
|
+
end
|
126
|
+
|
127
|
+
def get_interface_api_model
|
128
|
+
url = URI.parse(interface_url_str)
|
129
|
+
http = Net::HTTP.new(url.host, url.port)
|
130
|
+
request = Net::HTTP::Get.new(url)
|
131
|
+
|
132
|
+
response = http.request(request)
|
133
|
+
res_json = JSON.parse(response.body)
|
134
|
+
puts response.body unless res_json['errcode'].to_i.zero?
|
135
|
+
res_json
|
136
|
+
end
|
137
|
+
|
138
|
+
def get_project_info
|
139
|
+
url_str = project_url_str
|
140
|
+
url = URI.parse(url_str)
|
141
|
+
http = Net::HTTP.new(url.host, url.port)
|
142
|
+
request = Net::HTTP::Get.new(url)
|
143
|
+
response = http.request(request)
|
144
|
+
JSON.parse(response.body)
|
145
|
+
end
|
146
|
+
|
147
|
+
def print_res_body_model(res_json)
|
148
|
+
res_body = fetch_res_boy(res_json)
|
149
|
+
return unless res_body
|
150
|
+
|
151
|
+
puts "\n<===============打印返回数据模型-Begin=====================>\n".green
|
152
|
+
models = []
|
153
|
+
handle_model(res_body, :res) do |model|
|
154
|
+
models << model
|
155
|
+
end
|
156
|
+
case language
|
157
|
+
when :oc
|
158
|
+
print_models(models)
|
159
|
+
print_models_impl(models)
|
160
|
+
when :java
|
161
|
+
print_models_for_java(models)
|
162
|
+
end
|
163
|
+
puts "\n<===============打印返回数据模型-End=====================>\n".green
|
164
|
+
models
|
165
|
+
end
|
166
|
+
|
167
|
+
def print_req_body_model(res_json)
|
168
|
+
req_body = fetch_req_body(res_json)
|
169
|
+
return unless req_body
|
170
|
+
|
171
|
+
puts "\n<===============打印请求模型-Begin=====================>\n".green
|
172
|
+
models = []
|
173
|
+
handle_model(req_body, :req) do |model|
|
174
|
+
models << model
|
175
|
+
end
|
176
|
+
case language
|
177
|
+
when :oc
|
178
|
+
print_models(models)
|
179
|
+
print_models_impl(models)
|
180
|
+
when :java
|
181
|
+
print_models_for_java(models)
|
182
|
+
end
|
183
|
+
puts "\n<===============打印请求模型-End=====================>\n".green
|
184
|
+
models
|
185
|
+
end
|
186
|
+
|
187
|
+
def fetch_res_boy(res_json)
|
188
|
+
return if !res_json || !res_json['data'] || !res_json['data']['res_body']
|
189
|
+
|
190
|
+
res_body = JSON.parse(res_json['data']['res_body'])
|
191
|
+
|
192
|
+
result = res_body
|
193
|
+
result = res_body['properties']['detailMsg'] if res_body['properties'] && res_body['properties']['detailMsg']
|
194
|
+
|
195
|
+
return unless result['type'] == 'object' || result['type'] == 'array'
|
196
|
+
|
197
|
+
result['name'] = gen_model_name
|
198
|
+
result
|
199
|
+
end
|
200
|
+
|
201
|
+
def fetch_req_body(res_json)
|
202
|
+
return if !res_json || !res_json['data'] || !res_json['data']['req_body_other']
|
203
|
+
|
204
|
+
result = JSON.parse(res_json['data']['req_body_other'])
|
205
|
+
result['name'] = gen_model_name(nil, :req)
|
206
|
+
result
|
207
|
+
end
|
208
|
+
|
209
|
+
def gen_model_name(property_name = nil, type = :res)
|
210
|
+
name = model_name
|
211
|
+
unless property_name.nil?
|
212
|
+
name = property_name.gsub(/vo|model|list/i, '').gsub(/(.*)s$/, '\1').gsub(/^\w/) { Regexp.last_match(0).upcase }
|
213
|
+
name = property_name.gsub(/^\w/) { Regexp.last_match(0).upcase } if name.length <= 0
|
214
|
+
end
|
215
|
+
if type == :req
|
216
|
+
"#{model_pre}#{name}#{req_model_name}"
|
217
|
+
else
|
218
|
+
"#{model_pre}#{name}#{model_suffix}"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def handle_model(model, type, &block)
|
223
|
+
p_type = model['type']
|
224
|
+
p_name = model['name']
|
225
|
+
p_properties = model['properties']
|
226
|
+
p_model = { name: p_name }
|
227
|
+
|
228
|
+
properties = []
|
229
|
+
case p_type
|
230
|
+
when 'object'
|
231
|
+
p_properties.each do |k, v|
|
232
|
+
c_type = v['type']
|
233
|
+
c_model = { key: k, type: c_type, description: v['description'], default: '' }
|
234
|
+
if v['type'].eql?('object') || v['type'].eql?('array')
|
235
|
+
o = v['items'] || v
|
236
|
+
o['name'] = gen_model_name(k, type)
|
237
|
+
if v['type'].eql?('array') && v['items']['type'].eql?('string')
|
238
|
+
c_model[:type_name] = 'NSString'
|
239
|
+
else
|
240
|
+
c_model[:type_name] = o['name']
|
241
|
+
handle_model(o, type, &block)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
properties << c_model
|
245
|
+
end
|
246
|
+
p_model[:properties] = properties
|
247
|
+
block[p_model] if block_given?
|
248
|
+
when 'array'
|
249
|
+
t = model['items']
|
250
|
+
t['name'] = p_name
|
251
|
+
handle_model(t, type, &block)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def print_models(models)
|
256
|
+
models.each do |model|
|
257
|
+
model_name = model[:name] || ''
|
258
|
+
model_properties = model[:properties]
|
259
|
+
puts_h "@interface #{model_name} : NSObject"
|
260
|
+
model_properties.each do |m|
|
261
|
+
print_model(m)
|
262
|
+
end
|
263
|
+
puts_h "@end\n\n\n"
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def print_models_for_java(models)
|
268
|
+
models.each do |model|
|
269
|
+
model_name = model[:name] || ''
|
270
|
+
model_properties = model[:properties]
|
271
|
+
puts_h "public class #{model_name} extends BaseModel implements BusinessEvent.ProductDataCollect {"
|
272
|
+
model_properties.each do |m|
|
273
|
+
print_model_for_java(m)
|
274
|
+
end
|
275
|
+
puts_h "}\n\n\n"
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
def print_models_impl(models)
|
280
|
+
models.each do |model|
|
281
|
+
puts_m "@implementation #{model[:name]}"
|
282
|
+
str = model[:properties].filter { |p| p[:type].eql?('array') && !p[:type_name].eql?('NSString') }.map { |p| "@\"#{p[:key]}\": #{p[:type_name]}.class" }.join(', ')
|
283
|
+
if str&.length&.positive?
|
284
|
+
puts_m '+(NSDictionary *)modelContainerPropertyGenericClass {'
|
285
|
+
puts_m " return @{#{str}};"
|
286
|
+
puts_m '}'
|
287
|
+
end
|
288
|
+
properties = model[:properties].filter { |p| property_mapper.keys.include?(p[:key]) }.map do |p|
|
289
|
+
"@\"#{property_mapper[p[:key]]}\": @\"#{p[:key]}\""
|
290
|
+
end
|
291
|
+
property_mapper_str = properties.join(', ') if properties.count.positive?
|
292
|
+
if property_mapper_str&.length&.positive?
|
293
|
+
puts_m '+ (NSDictionary<NSString *, id> *)modelCustomPropertyMapper {'
|
294
|
+
puts_m " return @{#{property_mapper_str}};"
|
295
|
+
puts_m '}'
|
296
|
+
end
|
297
|
+
puts_m "@end\n"
|
298
|
+
puts "\n\n"
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
def print_model(m)
|
303
|
+
key = m[:key]
|
304
|
+
key = property_mapper[key] if property_mapper.keys.include?(key)
|
305
|
+
type_name = m[:type_name]
|
306
|
+
type = m[:type]
|
307
|
+
des = m[:description] || ''
|
308
|
+
des.gsub!(/\n/, ' ')
|
309
|
+
default = m[:default]
|
310
|
+
puts_h "///#{des} #{default}"
|
311
|
+
case type
|
312
|
+
when 'integer'
|
313
|
+
puts_h "@property (nonatomic, assign) NSInteger #{key};"
|
314
|
+
when 'string'
|
315
|
+
puts_h "@property (nonatomic, copy) NSString *#{key};"
|
316
|
+
when 'number'
|
317
|
+
puts_h "@property (nonatomic, strong) NSNumber *#{key};"
|
318
|
+
when 'float'
|
319
|
+
puts_h "@property (nonatomic, assign) CGFloat #{key};"
|
320
|
+
when 'double'
|
321
|
+
puts_h "@property (nonatomic, assign) double #{key};"
|
322
|
+
when 'boolean'
|
323
|
+
puts_h "@property (nonatomic, assign) BOOL #{key};"
|
324
|
+
when 'object'
|
325
|
+
puts_h "@property (nonatomic, strong) #{type_name} *#{key};"
|
326
|
+
when 'array'
|
327
|
+
puts_h "@property (nonatomic, strong) NSArray<#{type_name} *> *#{key};"
|
328
|
+
else
|
329
|
+
puts_h "@property (nonatomic, copy) NSString *#{key};"
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
def print_model_for_java(m)
|
334
|
+
key = m[:key]
|
335
|
+
type_name = m[:type_name]
|
336
|
+
type = m[:type]
|
337
|
+
des = m[:description] || ''
|
338
|
+
des.gsub!(/\n/, ' ')
|
339
|
+
default = m[:default]
|
340
|
+
case type
|
341
|
+
when 'integer'
|
342
|
+
puts_h "int #{key};//#{des} #{default}"
|
343
|
+
when 'string'
|
344
|
+
puts_h "String #{key};//#{des} #{default}"
|
345
|
+
when 'number'
|
346
|
+
puts_h "double #{key};//#{des} #{default}"
|
347
|
+
when 'float'
|
348
|
+
puts_h "double #{key};//#{des} #{default}"
|
349
|
+
when 'double'
|
350
|
+
puts_h "double #{key};//#{des} #{default}"
|
351
|
+
when 'boolean'
|
352
|
+
puts_h "boolean #{key};//#{des} #{default}"
|
353
|
+
when 'object'
|
354
|
+
puts_h "#{type_name} #{key};//#{des} #{default}"
|
355
|
+
when 'array'
|
356
|
+
puts_h "#{type_name}[] #{key};//#{des} #{default}"
|
357
|
+
else
|
358
|
+
puts_h "String #{key};//#{des} #{default}"
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
# @param [Object] data
|
363
|
+
def print_req_query(data)
|
364
|
+
return unless data && data['req_query']
|
365
|
+
|
366
|
+
properties = []
|
367
|
+
data['req_query'].each do |h|
|
368
|
+
properties << { key: h['name'], type: 'string', description: h['desc'], default: '' }
|
369
|
+
end
|
370
|
+
param_model_name = gen_model_name(nil, :req)
|
371
|
+
req_model = { name: param_model_name, properties: properties }
|
372
|
+
|
373
|
+
models = [req_model]
|
374
|
+
print_models(models)
|
375
|
+
print_models_impl(models)
|
376
|
+
models
|
377
|
+
end
|
378
|
+
|
379
|
+
def print_http_method(data, project_info)
|
380
|
+
return unless data
|
381
|
+
|
382
|
+
path = data['path']
|
383
|
+
if path
|
384
|
+
arr = path.split('/').map do |s|
|
385
|
+
re = s.gsub(/[^A-Za-z0-9](.)/) { Regexp.last_match(0).upcase }
|
386
|
+
re = re.gsub(/[^A-Za-z0-9]/, '')
|
387
|
+
re.gsub(/^\w/) { Regexp.last_match(0).upcase }
|
388
|
+
end
|
389
|
+
path_name = arr.join('')
|
390
|
+
end
|
391
|
+
path_key = "k#{path_name}URL"
|
392
|
+
display_path = "#{project_info['data']['basepath']}#{path}"
|
393
|
+
display_path = display_path[1..-1] if display_path.index('/') == 0
|
394
|
+
result_model_name = gen_model_name
|
395
|
+
param_model_name = gen_model_name(nil, :req)
|
396
|
+
mth = data['method']
|
397
|
+
mth = 'JSON' if data['req_body_is_json_schema']
|
398
|
+
case language
|
399
|
+
when :oc
|
400
|
+
puts "\n<===============方法调用=====================>\n".green
|
401
|
+
model_temp = Lhj::ErbTemplateHelper.load('oc_code_service_inner')
|
402
|
+
model_temp_result = Lhj::ErbTemplateHelper.render(model_temp, { result_model_name: result_model_name }, '-')
|
403
|
+
|
404
|
+
yapi_temp = Lhj::ErbTemplateHelper.load('oc_code_service')
|
405
|
+
yapi_vars = { title: data['title'],
|
406
|
+
desc: data['desc'],
|
407
|
+
username: data['username'],
|
408
|
+
path: display_path,
|
409
|
+
path_key: path_key,
|
410
|
+
path_name: path_name,
|
411
|
+
result_model_name: result_model_name,
|
412
|
+
param_model_name: param_model_name,
|
413
|
+
mth: mth,
|
414
|
+
model_template: model_temp_result }
|
415
|
+
yapi_temp_result = Lhj::ErbTemplateHelper.render(yapi_temp, yapi_vars, '-')
|
416
|
+
puts_s(yapi_temp_result)
|
417
|
+
when :java
|
418
|
+
end
|
419
|
+
|
420
|
+
end
|
421
|
+
|
422
|
+
def print_mock_request_data(req_models)
|
423
|
+
puts "\n<===============打印Mock Data-Begin=====================>\n".green
|
424
|
+
req_models.each do |model|
|
425
|
+
model_name = model[:name] || ''
|
426
|
+
model_properties = model[:properties]
|
427
|
+
puts_mock "#{model_name} *mock = [[#{model_name} alloc] init];"
|
428
|
+
model_properties.each do |m|
|
429
|
+
puts_mock "/// #{m[:description]}"
|
430
|
+
type = m[:type]
|
431
|
+
case type
|
432
|
+
when 'integer'
|
433
|
+
puts_mock "mock.#{m[:key]} = 0;"
|
434
|
+
when 'number'
|
435
|
+
puts_mock "mock.#{m[:key]} = 0;"
|
436
|
+
when 'float'
|
437
|
+
puts_mock "mock.#{m[:key]} = 0;"
|
438
|
+
when 'double'
|
439
|
+
puts_mock "mock.#{m[:key]} = 0;"
|
440
|
+
when 'object'
|
441
|
+
puts_mock "mock.#{m[:key]} = @{};"
|
442
|
+
when 'array'
|
443
|
+
puts_mock "mock.#{m[:key]} = @[];"
|
444
|
+
else
|
445
|
+
puts_mock "mock.#{m[:key]} = @\"\";"
|
446
|
+
end
|
447
|
+
end
|
448
|
+
puts_mock "\n\n"
|
449
|
+
end
|
450
|
+
puts "\n<===============打印Mock Data-End=====================>\n".green
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Lhj
|
5
|
+
# yapi token Config
|
6
|
+
class YapiTokenConfig
|
7
|
+
|
8
|
+
CONFIG_NAME = 'yapi_token_config.yml'
|
9
|
+
|
10
|
+
def self.config_file
|
11
|
+
File.join(Lhj::Config.instance.home_dir, CONFIG_NAME)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.config
|
15
|
+
@yaml ||= YAML.load_file(config_file)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.base_url
|
19
|
+
config['base_url']
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.webhook
|
23
|
+
config['webhook']
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.token(project_id)
|
27
|
+
c = config['projects'].find { |i| i['project'] == project_id }
|
28
|
+
return c['token'] if c
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.name(project_id)
|
32
|
+
c = config['projects'].find { |i| i['project'] == project_id }
|
33
|
+
return c['name'] if c
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/lhj/lhj.rb
CHANGED
@@ -14,6 +14,8 @@ module Lhj
|
|
14
14
|
require 'lhj/helper/chat_gpt_config'
|
15
15
|
require 'lhj/helper/pod_repo_config'
|
16
16
|
require 'lhj/helper/git_branch_feature_config'
|
17
|
+
require 'lhj/helper/yapi/yapi_token_config'
|
18
|
+
require 'lhj/helper/yapi/yapi_helper'
|
17
19
|
require 'lhj/helper/erb_template_helper'
|
18
20
|
require 'lhj/helper/trans_helper'
|
19
21
|
require 'lhj/helper/pgyer_helper'
|
data/lib/lhj/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.2.
|
4
|
+
version: 0.2.28
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- lihaijian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xcodeproj
|
@@ -408,6 +408,8 @@ files:
|
|
408
408
|
- lib/lhj/helper/trans_helper.rb
|
409
409
|
- lib/lhj/helper/vika_config.rb
|
410
410
|
- lib/lhj/helper/vika_helper.rb
|
411
|
+
- lib/lhj/helper/yapi/yapi_helper.rb
|
412
|
+
- lib/lhj/helper/yapi/yapi_token_config.rb
|
411
413
|
- lib/lhj/lhj.rb
|
412
414
|
- lib/lhj/tree/directory_renderer.rb
|
413
415
|
- lib/lhj/tree/hash_walker.rb
|