gwtools 0.0.6 → 0.0.9

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: 623dae2a8da9444e088fb0775b8490beb07a339d1b48e040b28be4c955fb30b1
4
- data.tar.gz: 4488cddef5c3b1e72e992f263d38cd23e40951731cc5218aa95e1afb31fb2dd6
3
+ metadata.gz: a0d8d1c08e191ea5994386b5ffa6ff37ead560cf421bacf85bc5378cabbff27d
4
+ data.tar.gz: 72b8d9b5c16ca85bc8dd2ae93451f03b09aea284fd617554647eb74c9ba52df9
5
5
  SHA512:
6
- metadata.gz: c52c6bffb2ff6816c726ab1c6d13fc7430e8d2e7b07c8005683a18b0da6dd7a1c3a9d8b49251234f4285067b7cb3aab92df6255e01297143ce6c942f253d2338
7
- data.tar.gz: 46e363b7424217396fc8ca484850eea5a9b4a6a7cc7042adf8a812c4203f1943a13c843bfa16104c4931b8ce15fa579820efa2ee56b27540a9a965b3a5570b4c
6
+ metadata.gz: 6a8bfa15a1f9f640e62796a01c1cb0475705a62b4ab5860ed9e6d98fb4c2f9f039f6b84951961b63c3cb155a6cb7333cb295764c4c4270647eeef83a7a91a267
7
+ data.tar.gz: b79801bece0b7663e9ff5cc3048147964d89df2a6531473fcf1670a7b4ad300ad9e4aae1ae3a368f852570085056394afaedf5a09d3ca1ce522d92cd9b8a1f58
@@ -32,32 +32,41 @@ module Gwtools
32
32
  # """
33
33
 
34
34
  makeDirAndFile(@url)
35
- # # 生成对应Model文件
36
- # Generate::Swift.createModelAndRequest(@target_path, @responseJson)
37
-
38
35
  end
39
36
 
40
37
  def makeDirAndFile(url)
41
38
  uri = URI(url)
42
39
  path = uri.path
40
+ file_name = 'restful'
43
41
 
44
42
  # remove leading '/'
45
43
  path = path[1..-1] if path.start_with? '/'
46
44
 
47
45
  # split path by '/' and create directories
48
- dirs = path.split('/').map { |part| part.gsub(/[.-]/, "_") } + ['restful']
46
+ dirs = path.split('/').map { |part| part.gsub(/[.-]/, "_") } + [file_name]
47
+
48
+ # 先判断路径下是否存在restful.swift
49
+ puts "文件已存在: #{@target_path + '/' + dirs.join('/') + '.swift'}" unless !File.exist?(@target_path + '/' + dirs.join('/') + '.swift')
50
+
49
51
  FileUtils.mkdir_p(@target_path) unless File.directory?(@target_path)
50
52
  dirs.each_with_index do |dir, index|
51
53
  # construct directory path
52
54
  dir_path = @target_path + '/' + dirs[0..index].join('/')
53
55
 
54
- # create directory if it doesn't exist, with out restful
55
- if dir != 'restful'
56
+ # create directory if it doesn't exist, with out file_name
57
+ if dir != file_name
56
58
  FileUtils.mkdir_p(dir_path) unless File.directory?(dir_path)
57
59
  end
58
-
59
60
  # create file
60
- Generate::Swift.createPathFile(dir_path, dir, dirs, index, @httpMethod, @responseJson)
61
+ Generate::Swift.createPathFile(dir_path, dir, dirs, index,
62
+ path,
63
+ @url,
64
+ @header,
65
+ @httpMethod,
66
+ @parameters,
67
+ @body,
68
+ @responseJson
69
+ )
61
70
  end
62
71
  end
63
72
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'erb'
4
4
  require 'json'
5
+ require 'pp'
5
6
 
6
7
  module Gwtools
7
8
  class Generate
@@ -37,7 +38,8 @@ extension <%="#{@api_name}"%> {
37
38
 
38
39
  class ModelReqGenerateConfig
39
40
  include(ERB::Util)
40
- attr_accessor :api_name, :httpmethod, :prefixPath, :modulePath, :detailPath, :model_name, :model_data
41
+ attr_accessor :api_name, :httpmethod, :prefixPath, :modulePath, :detailPath,
42
+ :model_name, :model_data, :json_data_is_arr, :readme
41
43
 
42
44
  # 将 erb 文件的一个实例化,绑定到当前的一个对象的上下文
43
45
  def config_file
@@ -51,6 +53,10 @@ import GWUserCenterBase
51
53
  import SwiftyUserDefaults
52
54
  import HandyJSON
53
55
 
56
+ /** 参考代码
57
+ <%="#{@readme}"%>
58
+ */
59
+
54
60
  public extension <%="#{@api_name}"%> {
55
61
  <%="#{@model_data}\n"%>
56
62
  }
@@ -60,7 +66,11 @@ public extension <%="#{@api_name}"%> {
60
66
  isCache: Bool = false,
61
67
  isLoading: Bool = false,
62
68
  module: String? = nil,
63
- des: String? = nil) -> Observable<Self.<%="#{@httpmethod}"%><%="#{@model_name}"%>> {
69
+ <% if #{@json_data_is_arr} %>
70
+ des: String? = nil) -> Observable<[Self.<%="#{@model_name}"%>]> {
71
+ <% else %>
72
+ des: String? = nil) -> Observable<Self.<%="#{@model_name}"%>> {
73
+ <% end %>
64
74
  // ================= 逻辑处理 =================
65
75
  let headerParms: [String : String] = [:]
66
76
  let parms: [String : Any] = [:]
@@ -69,22 +79,26 @@ public extension <%="#{@api_name}"%> {
69
79
  return GWNetworkManager.request(requestType: .<%="#{@httpmethod}"%>,
70
80
  prefixPath: "<%="#{@prefixPath}"%>",
71
81
  modulePath: "<%="#{@modulePath}"%>",
72
- detailPath: "<%="#{@detailPath}"%>",
82
+ detailPath: "<%="#{@detailPath}"%>",
73
83
  parms: parms,
74
84
  headerParms: headerParms,
75
85
  isCache: isCache,
76
86
  isLoading: isLoading,
77
87
  module: module,
78
88
  des: des)
79
- .mapHandyJSON(Self.<%="#{@model_name}"%>.self)
80
-
89
+ <% if #{@json_data_is_arr} %>
90
+ .mapHandyJSON2Array(Self.<%="#{@model_name}"%>.self)
91
+ <% else %>
92
+ .mapHandyJSON(Self.<%="#{@model_name}"%>.self)
93
+ <% end %>
81
94
  }
82
95
  }
83
96
  ERB
84
97
  ERB.new(template, nil, '>').result(binding)
85
98
  end
86
99
 
87
- def initialize(file_path, api_name, httpmethod, prefixPath, modulePath, detailPath, model_name, model_data)
100
+ def initialize(file_path, api_name, httpmethod, prefixPath, modulePath, detailPath,
101
+ model_name, model_data, json_data_is_arr, readme)
88
102
  @api_name = api_name
89
103
  @httpmethod = httpmethod
90
104
  @prefixPath = prefixPath
@@ -92,6 +106,8 @@ public extension <%="#{@api_name}"%> {
92
106
  @detailPath = detailPath
93
107
  @model_name = model_name
94
108
  @model_data = model_data
109
+ @json_data_is_arr = json_data_is_arr
110
+ @readme = readme
95
111
 
96
112
  File.open(file_path, 'w+') do |f|
97
113
  f.puts(config_file)
@@ -99,43 +115,151 @@ public extension <%="#{@api_name}"%> {
99
115
  end
100
116
  end
101
117
 
102
- def self.createPathFile(dir_path, dir, dirs, index, http_method, response_json)
103
- if index <= 0
104
- return
118
+ def self.getPrefixPath(dir_path)
119
+ prefixPaths = %w[app-api/api/v1.0 app-api/api/v2.0]
120
+
121
+ prefixPaths.each do |prefix_path|
122
+ return prefix_path.gsub(/^\/|\/$/, "") if dir_path.start_with?(prefix_path)
123
+ end
124
+
125
+ puts "PrefixPath不在预设数组中, 请检查请求路径中的PrefixPath, 预设 PrefixPath(代码生成终止) \n#{dir_path}\n#{prefixPaths} "
126
+
127
+ return ''
128
+ end
129
+
130
+ def self.getModulePath(dir_path, prefixPath)
131
+ modulePaths = %w[content community]
132
+ dir_path = dir_path.gsub(/\A#{prefixPath}/, "").gsub(/^\/|\/$/, "")
133
+
134
+ modulePaths.each do |modulePath|
135
+ return modulePath if dir_path.split("/").first == modulePath
136
+ end
137
+
138
+ puts "ModulePath不在预设数组中, 请检查请求路径中的ModulePath, 预设 ModulePath \n#{dir_path}\n#{modulePaths} "
139
+
140
+ return ''
141
+ end
142
+
143
+ def self.getDetailPath(dir_path, prefixPath, modulePath)
144
+ return dir_path.gsub(/^\/|\/$/, "").gsub(/\A#{prefixPath}/, "")
145
+ .gsub(/^\/|\/$/, "").gsub(/\A#{modulePath}/, "")
146
+ .gsub(/^\/|\/$/, "")
147
+ end
148
+
149
+ def self.createPathFile(dir_path, dir, dirs, index,
150
+ url_path,
151
+ url,
152
+ header,
153
+ httpMethod,
154
+ parameters,
155
+ body,
156
+ responseJson)
157
+ app_name = "AppAPI.#{dirs[0..index-1].join('.')}"
158
+ if index == 0
159
+ app_name = "AppAPI"
105
160
  end
106
161
  if dir == 'restful'
107
- puts dir_path
108
- puts dir
109
- puts dirs.join('/')
110
- puts dirs[0..index-1].join('.')
111
- swift_model = generate_model("Model", response_json)
162
+ swift_model = generate_model("#{httpMethod.capitalize.chomp}Model", responseJson)
163
+ prefixPath = getPrefixPath(url_path)
164
+
165
+ return unless !prefixPath.empty?
166
+
167
+ modulePath = getModulePath(url_path, prefixPath)
168
+ detailPath = getDetailPath(url_path, prefixPath, modulePath)
169
+
170
+ readme = """
171
+ 请求参数
172
+ URL = #{url.chomp}
173
+ HTTPMETHOD = #{httpMethod.chomp}
174
+
175
+ ViewModel
176
+ class <##SomeViewModel##> {
177
+ let disposeBag = DisposeBag()
178
+
179
+ public struct Input {
180
+ let <##AnyObservable##>: Observable<<##AnyObservableType##>>
181
+ }
182
+
183
+ public struct Output {
184
+ let data: BehaviorRelay<#{@json_data_is_arr ? "[" : ""}#{app_name}.#{httpMethod.capitalize.chomp}Model#{@json_data_is_arr ? "]" : ""}>
185
+ }
186
+
187
+ public func transform(input: Input) -> Output {
188
+ let outDatas = BehaviorRelay<#{@json_data_is_arr ? "[" : ""}#{app_name}.#{httpMethod.capitalize.chomp}Model#{@json_data_is_arr ? "]" : ""}>(value: [])
189
+ input.<##AnyObservable##>.flatMapLatest({ [weak self] () -> Observable<#{@json_data_is_arr ? "[" : ""}#{app_name}.#{httpMethod.capitalize.chomp}Model#{@json_data_is_arr ? "]" : ""}> in
190
+ guard let self = self else { return Observable.just([]) }
191
+ return self.reqData()
192
+ }).subscribe(onNext: { (items) in
193
+ outDatas.accept(outDatas.value + items)
194
+ }, onError: { error in
195
+ outDatas.accept([])
196
+ }).disposed(by: disposeBag)
197
+
198
+ return Output(data: outDatas)
199
+ }
200
+ }
201
+
202
+ extension <##SomeViewModel##> {
203
+ func reqData() -> Observable<#{@json_data_is_arr ? "[" : ""}#{app_name}.#{httpMethod.capitalize.chomp}Model#{@json_data_is_arr ? "]" : ""}> {
204
+ #{app_name}.#{httpMethod.capitalize.chomp}()
205
+ .compactMap { $0 } // 解析出需要的类型
206
+ .observeOn(MainScheduler.instance)
207
+ .catchErrorJustReturn([])
208
+ }
209
+ }
210
+ """
211
+
112
212
  ModelReqGenerateConfig.new(
113
213
  "#{dir_path}.swift",
114
- "AppAPI.#{dirs[0..index-1].join('.')}",
115
- http_method.capitalize,
116
- 'app-api/api/v1.0',
117
- 'content',
118
- '/route/getContentInfo',
119
- 'GetModel',
120
- swift_model
214
+ app_name,
215
+ httpMethod.capitalize.chomp,
216
+ prefixPath,
217
+ modulePath,
218
+ detailPath,
219
+ "#{httpMethod.capitalize.chomp}Model",
220
+ swift_model,
221
+ @json_data_is_arr,
222
+ readme
121
223
  )
122
224
 
123
225
  `swiftformat --swiftversion 5.0 #{dir_path}.swift`
124
226
  else
125
227
  PathGenerateConfig.new(
126
228
  "#{dir_path}.swift",
127
- "AppAPI.#{dirs[0..index-1].join('.')}",
229
+ app_name,
128
230
  dir
129
231
  )
130
232
  end
131
233
 
132
234
  end
133
235
 
134
- def self.generate_model(name, json_data)
135
- swift_model = "struct #{name}: HandyJson {\n"
236
+ def self.capitalize_first_letter(str)
237
+ str[0].upcase + str[1..-1]
238
+ end
239
+
240
+ def self.generate_model(name, json_data, level = 0)
241
+
136
242
  if json_data == nil
137
243
  return ''
138
244
  end
245
+
246
+ if level == 0
247
+ # 找到 真正要处理的 data 数据
248
+ json_data.each do |key, value|
249
+ if key == 'data'
250
+ case value
251
+ when Array
252
+ json_data = value.first
253
+ @json_data_is_arr = true
254
+ when Hash
255
+ json_data = value
256
+ @json_data_is_arr = false
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ swift_model = "struct #{name}: HandyJSON {\n"
139
263
  json_data.each do |key, value|
140
264
  case value
141
265
  when NilClass # nil 对象默认给个Stirng?类型
@@ -151,25 +275,23 @@ public extension <%="#{@api_name}"%> {
151
275
  when String
152
276
  swift_model += " var #{key}: String?\n"
153
277
  when Array
154
- swift_model += " var #{key}: [#{key.capitalize}] = []\n"
155
- swift_model += generate_model("#{key.capitalize}", value.first)
278
+
279
+ if !value.empty?
280
+ swift_model += " var #{key}: [#{capitalize_first_letter(key)}] = []\n"
281
+ swift_model += generate_model("#{capitalize_first_letter(key)}", value.first, level+1)
282
+ else
283
+ swift_model += " var #{key}: [Any] = []\n"
284
+ end
156
285
  when Hash
157
- swift_model += " var #{key}: #{key.capitalize}?\n"
158
- swift_model += generate_model("#{key.capitalize}", value)
286
+ swift_model += " var #{key}: #{capitalize_first_letter(key)}?\n"
287
+ swift_model += generate_model("#{capitalize_first_letter(key)}", value, level+1)
159
288
  else
160
289
  swift_model += " var #{key}: #{value.class == String ? 'String' : 'Int'}\n"
161
290
  end
162
291
  end
163
- swift_model + "}\n"
292
+ swift_model + "public init() {}\n}\n"
164
293
  end
165
294
 
166
- # def self.createModelAndRequest(target_path, responseJson)
167
- # swift_model = generate_model("Model", responseJson)
168
- # File.write(target_path + 'Model.swift', swift_model)
169
- # end
170
-
171
- # 生成 Swift 模型
172
-
173
295
  end
174
296
  end
175
297
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gwtools
4
- VERSION = "0.0.6"
4
+ VERSION = "0.0.9"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gwtools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - chenglq
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-30 00:00:00.000000000 Z
11
+ date: 2023-01-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Write a longer description or delete this line.
14
14
  email: