lhj-tools 0.2.26 → 0.2.28

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 16224374a128ff4316f5553b1d5baa614e23d4e13bc1deadbbf3ca2e2e891dd8
4
- data.tar.gz: d312a877fc8e1e32964b985aa9d302ff903a36aad3da75cc20796000582771cb
3
+ metadata.gz: e94e1905e459e9be531bc985e002c26e743c7c642d2489fb4f8ed5eb0ec84c29
4
+ data.tar.gz: c381978186ef918f95428253f355ba7abef8e5d3310e905efadcac868b4b5e26
5
5
  SHA512:
6
- metadata.gz: f69613a09746ac7ab39733e3a1fc657ddbc463a7bcc0efaf6954fb32edff46120b6d819d354e641b450ad45a57630a50d1944c6f8091cf3a589d6e16faeb0544
7
- data.tar.gz: 3e4c95527e71b21d3612aa31ea8dd549f268c7a6e6e0d8076a91a57163deed8f5658c8043bc6321b47674939927f1e91019f7f22b34c40113b4139805a8248b4
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
- add_property(client, a, 'WEBHOOK', 'https://oapi.dingtalk.com/robot/sendBySession?session=bd640dea6cd28b6c880c4f3cc0945c8f', 'Webhook url')
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 = 'robot_notify_config.yml'
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.fetch_robot_url(conversation)
19
- url = config[0]['robot_url']
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.fetch_robot_title(conversation)
26
- title = '信息来自iOS机器人'
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.fetch_robot_message_type(conversation)
33
- type = :markdown
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lhj
4
- VERSION = '0.2.26'
4
+ VERSION = '0.2.28'
5
5
  end
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.26
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-22 00:00:00.000000000 Z
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