gwtools 0.0.7 → 0.0.10

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: 001eef35553a92118abccc74a73ef133fce57509e775e9cb7361b014a2bc6436
4
- data.tar.gz: 35ed21f791aee545295149c39b747b789d02057616b7c0e747861e9fb6f9ff14
3
+ metadata.gz: cd2b37aeec182ef52a494b197f0eb4abfe9405e440efa2e2ab3b79b9c810e044
4
+ data.tar.gz: 3734ca2671df99c5a879ec5a5a5a336fab43f6e96028900f9ecf68baaffa9081
5
5
  SHA512:
6
- metadata.gz: dd259aa0fde7b6c9c958b5b49b8bd83dc70d4cfde0dc3eafea2265f1b6976a657ebd4beee4c559b866e25e133e02d58b704312babed58cfac442bf010c78d229
7
- data.tar.gz: 2e8e27d43e284ccf7301d0ce5eff6b3e9b49cd18908ce32e4c87dadded65104da415d5cb8bb753b1b87f5992e58020278f4a0dd3d08e8f806970f797b77d5a38
6
+ metadata.gz: 259ec36cc9e7cb1ea91f86ac6c646a69375103ccd005e5c9d86629a91ac442cd642804b0c04807c81d5ac0878a541b7eedbafd70417ee2a68910ae0aa914aeab
7
+ data.tar.gz: ed034226ac174115a66b2e16173b33afb0057c1797453c292010759fa190e4804b55d6f174c1743d35b069a9adcb4cdac303dbaba3091e0f3b6964c22e442b23
@@ -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, path)
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
 
@@ -38,7 +38,8 @@ extension <%="#{@api_name}"%> {
38
38
 
39
39
  class ModelReqGenerateConfig
40
40
  include(ERB::Util)
41
- attr_accessor :api_name, :httpmethod, :prefixPath, :modulePath, :detailPath, :model_name, :model_data, :json_data_is_arr
41
+ attr_accessor :api_name, :httpmethod, :prefixPath, :modulePath, :detailPath,
42
+ :model_name, :model_data, :json_data_is_arr, :readme
42
43
 
43
44
  # 将 erb 文件的一个实例化,绑定到当前的一个对象的上下文
44
45
  def config_file
@@ -52,6 +53,10 @@ import GWUserCenterBase
52
53
  import SwiftyUserDefaults
53
54
  import HandyJSON
54
55
 
56
+ /** 参考代码
57
+ <%="#{@readme}"%>
58
+ */
59
+
55
60
  public extension <%="#{@api_name}"%> {
56
61
  <%="#{@model_data}\n"%>
57
62
  }
@@ -92,7 +97,8 @@ public extension <%="#{@api_name}"%> {
92
97
  ERB.new(template, nil, '>').result(binding)
93
98
  end
94
99
 
95
- def initialize(file_path, api_name, httpmethod, prefixPath, modulePath, detailPath, model_name, model_data, json_data_is_arr)
100
+ def initialize(file_path, api_name, httpmethod, prefixPath, modulePath, detailPath,
101
+ model_name, model_data, json_data_is_arr, readme)
96
102
  @api_name = api_name
97
103
  @httpmethod = httpmethod
98
104
  @prefixPath = prefixPath
@@ -101,6 +107,7 @@ public extension <%="#{@api_name}"%> {
101
107
  @model_name = model_name
102
108
  @model_data = model_data
103
109
  @json_data_is_arr = json_data_is_arr
110
+ @readme = readme
104
111
 
105
112
  File.open(file_path, 'w+') do |f|
106
113
  f.puts(config_file)
@@ -109,22 +116,27 @@ public extension <%="#{@api_name}"%> {
109
116
  end
110
117
 
111
118
  def self.getPrefixPath(dir_path)
112
- prefixPaths = %w[app-api/api/v1.0 app-api/api/v2.0]
119
+ prefixPaths = %w[app-api/api/v1.0 app-api/api/v2.0 community-app-api/app-api/api/v1.0]
113
120
 
114
121
  prefixPaths.each do |prefix_path|
115
122
  return prefix_path.gsub(/^\/|\/$/, "") if dir_path.start_with?(prefix_path)
116
123
  end
117
124
 
125
+ puts "PrefixPath不在预设数组中, 请检查请求路径中的PrefixPath, 预设 PrefixPath(代码生成终止) \n#{dir_path}\n#{prefixPaths} "
126
+
118
127
  return ''
119
128
  end
120
129
 
121
130
  def self.getModulePath(dir_path, prefixPath)
122
131
  modulePaths = %w[content community]
123
132
  dir_path = dir_path.gsub(/\A#{prefixPath}/, "").gsub(/^\/|\/$/, "")
133
+
124
134
  modulePaths.each do |modulePath|
125
- return modulePath if dir_path.start_with?(modulePath)
135
+ return modulePath if dir_path.split("/").first == modulePath
126
136
  end
127
137
 
138
+ puts "ModulePath不在预设数组中, 请检查请求路径中的ModulePath, 预设 ModulePath \n#{dir_path}\n#{modulePaths} "
139
+
128
140
  return ''
129
141
  end
130
142
 
@@ -134,31 +146,84 @@ public extension <%="#{@api_name}"%> {
134
146
  .gsub(/^\/|\/$/, "")
135
147
  end
136
148
 
137
- def self.createPathFile(dir_path, dir, dirs, index, http_method, response_json, url_path)
149
+ def self.createPathFile(dir_path, dir, dirs, index,
150
+ url_path,
151
+ url,
152
+ header,
153
+ httpMethod,
154
+ parameters,
155
+ body,
156
+ responseJson)
138
157
  app_name = "AppAPI.#{dirs[0..index-1].join('.')}"
139
158
  if index == 0
140
159
  app_name = "AppAPI"
141
160
  end
142
161
  if dir == 'restful'
143
- swift_model = generate_model("#{http_method.capitalize.chomp}Model", response_json)
162
+ swift_model = generate_model("#{httpMethod.capitalize.chomp}Model", responseJson, 'data')
144
163
  prefixPath = getPrefixPath(url_path)
164
+
165
+ return unless !prefixPath.empty?
166
+
145
167
  modulePath = getModulePath(url_path, prefixPath)
146
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
+
147
212
  ModelReqGenerateConfig.new(
148
213
  "#{dir_path}.swift",
149
214
  app_name,
150
- http_method.capitalize.chomp,
215
+ httpMethod.capitalize.chomp,
151
216
  prefixPath,
152
217
  modulePath,
153
218
  detailPath,
154
- "#{http_method.capitalize.chomp}Model",
219
+ "#{httpMethod.capitalize.chomp}Model",
155
220
  swift_model,
156
- @json_data_is_arr
221
+ @json_data_is_arr,
222
+ readme
157
223
  )
158
224
 
159
225
  `swiftformat --swiftversion 5.0 #{dir_path}.swift`
160
226
  else
161
-
162
227
  PathGenerateConfig.new(
163
228
  "#{dir_path}.swift",
164
229
  app_name,
@@ -167,59 +232,69 @@ public extension <%="#{@api_name}"%> {
167
232
  end
168
233
 
169
234
  end
235
+ def self.capitalize_first_letter(str)
236
+ str[0].upcase + str[1..-1]
237
+ end
170
238
 
171
- def self.generate_model(name, json_data, level = 0)
172
-
173
- if json_data == nil
174
- return ''
239
+ def self.generate_model(name, json_data, root_path = '')
240
+ # 找到真实数据(data)所在位置
241
+ if !root_path.empty?
242
+ json_data = json_data[root_path]
243
+ if json_data.all? { |element| element.is_a?(Hash) }
244
+ json_data = json_data.inject(:merge)
245
+ end
175
246
  end
176
247
 
177
- if level == 0
178
- # 找到 真正要处理的 data 数据
248
+ swift_model = ''
249
+ case json_data
250
+ when String
251
+ return "var #{name}: [String] = []\n"
252
+ when Float
253
+ return "var #{name}: [Float] = []\n"
254
+ when Integer
255
+ return "var #{name}: [Int] = []\n"
256
+ when Array
257
+ return ''
258
+ when Hash
259
+ swift_model += "struct #{name}: HandyJSON {\n"
260
+ # generate_model(name, json_data)
179
261
  json_data.each do |key, value|
180
- if key == 'data'
181
- case value
182
- when Array
183
- json_data = value.first
184
- @json_data_is_arr = true
185
- when Hash
186
- json_data = value
187
- @json_data_is_arr = false
262
+ case value
263
+ when NilClass # nil 对象默认给个Stirng?类型
264
+ swift_model += " var #{key}: String?\n"
265
+ when FalseClass
266
+ swift_model += " var #{key}: Bool = false\n"
267
+ when TrueClass
268
+ swift_model += " var #{key}: Bool = false\n"
269
+ when Float
270
+ swift_model += " var #{key}: Float = 0.0\n"
271
+ when Integer
272
+ swift_model += " var #{key}: Int = 0\n"
273
+ when String
274
+ swift_model += " var #{key}: String?\n"
275
+ when Array
276
+ if value.count > 0
277
+ if value.all? { |element| element.is_a?(Hash) }
278
+ merged_hash = value.inject(:merge)
279
+ swift_model += "var #{key}: [#{capitalize_first_letter(key)}Model]?\n"
280
+ swift_model += generate_model("#{capitalize_first_letter(key)}Model", merged_hash)
281
+ else
282
+ swift_model += generate_model(key, value[0])
283
+ end
284
+ else
285
+ swift_model += "var #{key}: [Any]?\n"
188
286
  end
189
- end
190
- end
191
- end
192
-
193
- swift_model = "struct #{name}: HandyJSON {\n"
194
- json_data.each do |key, value|
195
- case value
196
- when NilClass # nil 对象默认给个Stirng?类型
197
- swift_model += " var #{key}: String?\n"
198
- when FalseClass
199
- swift_model += " var #{key}: Bool = false\n"
200
- when TrueClass
201
- swift_model += " var #{key}: Bool = false\n"
202
- when Float
203
- swift_model += " var #{key}: Float = 0.0\n"
204
- when Integer
205
- swift_model += " var #{key}: Int = 0\n"
206
- when String
207
- swift_model += " var #{key}: String?\n"
208
- when Array
209
- if !value.empty?
210
- swift_model += " var #{key}: [#{key.capitalize}] = []\n"
211
- swift_model += generate_model("#{key.capitalize}", value.first, level+1)
287
+ when Hash
288
+ swift_model += "var #{key}: #{capitalize_first_letter(key)}Model?\n"
289
+ swift_model += generate_model("#{capitalize_first_letter(key)}Model", value)
212
290
  else
213
- swift_model += " var #{key}: [Any] = []\n"
291
+ swift_model += "var #{key}: #{value.class}?\n"
214
292
  end
215
- when Hash
216
- swift_model += " var #{key}: #{key.capitalize}?\n"
217
- swift_model += generate_model("#{key.capitalize}", value, level+1)
218
- else
219
- swift_model += " var #{key}: #{value.class == String ? 'String' : 'Int'}\n"
220
293
  end
294
+ swift_model + "public init() {}\n}\n"
295
+ else
296
+ return swift_model
221
297
  end
222
- swift_model + "public init() {}\n}\n"
223
298
  end
224
299
 
225
300
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gwtools
4
- VERSION = "0.0.7"
4
+ VERSION = "0.0.10"
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.7
4
+ version: 0.0.10
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: