KCommercialPipeline 0.2.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.idea/.gitignore +8 -0
  4. data/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. data/.idea/inspectionProfiles/profiles_settings.xml +5 -0
  6. data/.idea/kcommercialpipeline.iml +130 -0
  7. data/.idea/misc.xml +4 -0
  8. data/.idea/modules.xml +8 -0
  9. data/.idea/vcs.xml +6 -0
  10. data/.rubocop.yml +13 -0
  11. data/.ruby-version +1 -0
  12. data/CHANGELOG.md +5 -0
  13. data/CODE_OF_CONDUCT.md +84 -0
  14. data/Gemfile +16 -0
  15. data/Gemfile.lock +224 -0
  16. data/KCommercialPipeline-0.2.5.0.gem +0 -0
  17. data/KCommercialPipeline.gemspec +49 -0
  18. data/LICENSE.txt +21 -0
  19. data/README.md +43 -0
  20. data/Rakefile +16 -0
  21. data/bin/KCommercialPipeline +17 -0
  22. data/bin/console +15 -0
  23. data/bin/setup +8 -0
  24. data/lib/KCommercialPipeline/App.rb +18 -0
  25. data/lib/KCommercialPipeline/command/app_runner.rb +34 -0
  26. data/lib/KCommercialPipeline/command/auto_cherry_pick_cmd.rb +18 -0
  27. data/lib/KCommercialPipeline/command/change_log.rb +19 -0
  28. data/lib/KCommercialPipeline/command/check_release_cmd.rb +34 -0
  29. data/lib/KCommercialPipeline/command/command.rb +44 -0
  30. data/lib/KCommercialPipeline/command/feat_check.rb +16 -0
  31. data/lib/KCommercialPipeline/command/git_hook_install_cmd.rb +29 -0
  32. data/lib/KCommercialPipeline/command/ios_publish_component.rb +71 -0
  33. data/lib/KCommercialPipeline/command/rb_auto.rb +30 -0
  34. data/lib/KCommercialPipeline/command/resource.rb +52 -0
  35. data/lib/KCommercialPipeline/core/app_demo.rb +196 -0
  36. data/lib/KCommercialPipeline/core/branch_diffs.rb +95 -0
  37. data/lib/KCommercialPipeline/core/change_log/change_log_task.rb +317 -0
  38. data/lib/KCommercialPipeline/core/change_log/doc_builder.rb +91 -0
  39. data/lib/KCommercialPipeline/core/component_publisher.rb +122 -0
  40. data/lib/KCommercialPipeline/core/feature_send.rb +88 -0
  41. data/lib/KCommercialPipeline/core/git.rb +125 -0
  42. data/lib/KCommercialPipeline/core/git_hook/install_git_hook.rb +84 -0
  43. data/lib/KCommercialPipeline/core/git_hook/prepare_commit_msg.rb +0 -0
  44. data/lib/KCommercialPipeline/core/kim_cfg.rb +64 -0
  45. data/lib/KCommercialPipeline/core/kim_notify.rb +99 -0
  46. data/lib/KCommercialPipeline/core/resource/auto_publish_resource/update_resource_component.rb +35 -0
  47. data/lib/KCommercialPipeline/core/resource/bundle/colors_generator.rb +29 -0
  48. data/lib/KCommercialPipeline/core/resource/bundle/files_generator.rb +36 -0
  49. data/lib/KCommercialPipeline/core/resource/bundle/fonts_generator.rb +29 -0
  50. data/lib/KCommercialPipeline/core/resource/bundle/i18ns_generator.rb +29 -0
  51. data/lib/KCommercialPipeline/core/resource/bundle/images_generator.rb +67 -0
  52. data/lib/KCommercialPipeline/core/resource/bundle/indexes_generator.rb +55 -0
  53. data/lib/KCommercialPipeline/core/resource/bundle/scale_pathname.rb +23 -0
  54. data/lib/KCommercialPipeline/core/resource/code_generator/code_generator.rb +59 -0
  55. data/lib/KCommercialPipeline/core/resource/code_generator/file_generator.rb +16 -0
  56. data/lib/KCommercialPipeline/core/resource/code_generator/resources_status.rb +24 -0
  57. data/lib/KCommercialPipeline/core/resource/component_resources_config.rb +63 -0
  58. data/lib/KCommercialPipeline/core/resource/file_generator.rb +16 -0
  59. data/lib/KCommercialPipeline/core/resource/i18n/auto_component.rb +61 -0
  60. data/lib/KCommercialPipeline/core/resource/i18n/bundle_generator.rb +36 -0
  61. data/lib/KCommercialPipeline/core/resource/i18n/generator.rb +368 -0
  62. data/lib/KCommercialPipeline/core/resource/key_defines.rb +41 -0
  63. data/lib/KCommercialPipeline/core/resource/objective-c/code_model.rb +51 -0
  64. data/lib/KCommercialPipeline/core/resource/objective-c/oc_file_model.rb +59 -0
  65. data/lib/KCommercialPipeline/core/resource/objective-c/oc_generator.rb +55 -0
  66. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{component_header_name}}.h +39 -0
  67. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Colors.h +31 -0
  68. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Colors.m +29 -0
  69. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Files.h +31 -0
  70. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Files.m +29 -0
  71. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Fonts.h +31 -0
  72. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Fonts.m +29 -0
  73. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+I18ns.h +31 -0
  74. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+I18ns.m +29 -0
  75. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Images.h +30 -0
  76. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Images.m +29 -0
  77. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}.h +39 -0
  78. data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}.m +51 -0
  79. data/lib/KCommercialPipeline/core/resource/source/asset.rb +120 -0
  80. data/lib/KCommercialPipeline/core/resource/source/asset_type.rb +16 -0
  81. data/lib/KCommercialPipeline/core/resource/source/git_source.rb +105 -0
  82. data/lib/KCommercialPipeline/core/resource/source/git_source_manager.rb +114 -0
  83. data/lib/KCommercialPipeline/core/resource/source/interface.rb +9 -0
  84. data/lib/KCommercialPipeline/core/resource/source/lib_bundle.rb +50 -0
  85. data/lib/KCommercialPipeline/core/resource/source/source.rb +9 -0
  86. data/lib/KCommercialPipeline/core/resource/source/source_interface.rb +20 -0
  87. data/lib/KCommercialPipeline/core/resource/source/source_manager.rb +93 -0
  88. data/lib/KCommercialPipeline/core/resource/source/star_source.rb +145 -0
  89. data/lib/KCommercialPipeline/core/resource/source/subspec_bundle.rb +34 -0
  90. data/lib/KCommercialPipeline/core/resource/swift/colors_generator.rb +22 -0
  91. data/lib/KCommercialPipeline/core/resource/swift/files_generate.rb +22 -0
  92. data/lib/KCommercialPipeline/core/resource/swift/fonts_generator.rb +22 -0
  93. data/lib/KCommercialPipeline/core/resource/swift/i18n_generetor.rb +22 -0
  94. data/lib/KCommercialPipeline/core/resource/swift/images_generator.rb +22 -0
  95. data/lib/KCommercialPipeline/core/resource/swift/swift_generator.rb +84 -0
  96. data/lib/KCommercialPipeline/core/resource/xcassets/image.rb +30 -0
  97. data/lib/KCommercialPipeline/core/resource/xcassets/imageset.rb +53 -0
  98. data/lib/KCommercialPipeline/core/resource/xcassets/xcassets.rb +63 -0
  99. data/lib/KCommercialPipeline/core/version_pipeline/auto_cherry_pick.rb +173 -0
  100. data/lib/KCommercialPipeline/core/version_pipeline/release_branches.rb +183 -0
  101. data/lib/KCommercialPipeline/core/version_pipeline/release_check.rb +111 -0
  102. data/lib/KCommercialPipeline/version.rb +5 -0
  103. data/lib/KCommercialPipeline.rb +19 -0
  104. metadata +304 -0
@@ -0,0 +1,368 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../component_resources_config'
3
+ require_relative '../swift/colors_generator'
4
+ require_relative '../swift/files_generate'
5
+ require_relative '../swift/fonts_generator'
6
+ require_relative '../swift/i18n_generetor'
7
+ require_relative '../swift/images_generator'
8
+ require_relative '../bundle/images_generator'
9
+ require_relative '../bundle/colors_generator'
10
+ require_relative '../bundle/files_generator'
11
+ require_relative '../bundle/fonts_generator'
12
+ require_relative '../bundle/i18ns_generator'
13
+ require_relative '../objective-c/oc_generator'
14
+ require_relative '../objective-c/oc_file_model'
15
+ require_relative 'bundle_generator'
16
+ require_relative '../auto_publish_resource/update_resource_component'
17
+ require 'ruby-enum'
18
+ require_relative '../source/lib_bundle'
19
+ require_relative '../../component_publisher'
20
+ module KCommercial
21
+ module Resources
22
+ class Generator
23
+
24
+ class SupportLanguage
25
+ include Ruby::Enum
26
+ define :OC, 'objective-c'
27
+ define :SWIFT, 'swift'
28
+ end
29
+
30
+ class ResourcesStatus
31
+ attr_accessor :has_i18ns, :has_images, :has_fonts, :has_files, :has_colors
32
+
33
+ alias has_images? has_images
34
+ alias has_fonts? has_fonts
35
+ alias has_files? has_files
36
+ alias has_colors? has_colors
37
+ alias has_i18ns? has_i18ns
38
+
39
+ def initialize
40
+ has_images = false
41
+ has_fonts = false
42
+ has_files = false
43
+ has_colors = false
44
+ has_i18ns = false
45
+ end
46
+ end
47
+
48
+ # The component for generate the resources
49
+ # @return [CocoaDepot::Component]
50
+ attr_reader :component
51
+
52
+ # The source for this generator
53
+ # @return [CocoaDepot::Resources::GitSource]
54
+ attr_reader :source
55
+
56
+ attr_reader :language
57
+
58
+ attr_reader :auto_push
59
+ # Create a new Generator
60
+ def initialize(component, source, options = {})
61
+ @component = component
62
+ @super_module = options.delete(:super_module) { 'MKResources' }
63
+ @language = options.delete(:language) || component.main_language
64
+ @source = source
65
+ @resources_status = ResourcesStatus.new
66
+ @language = SupportLanguage::OC if @language == 'oc'
67
+ unless SupportLanguage.values.include?(@language)
68
+ raise "You set unsupported language #{@language}, please check!"
69
+ end
70
+ raise "Unsupported options: #{options}" if options.count.positive?
71
+ end
72
+
73
+ # The path for auto generated files
74
+ # @return [Pathname]
75
+ def auto_path
76
+ component.path.join('Auto')
77
+ end
78
+
79
+ # The path for auto generated resources
80
+ # @return [Pathname]
81
+ def auto_assets_path
82
+ auto_path.join('Assets')
83
+ end
84
+
85
+ # The path for auto generated classes
86
+ # @return [Pathname]
87
+ def auto_classes_path
88
+ auto_path.join('Classes')
89
+ end
90
+
91
+ def check_local_file_status
92
+ @auto_push = ResourcesUpdate.can_auto_push?
93
+ end
94
+ # Do the generate process, it will generate the code and get the remote resources
95
+ def generate!
96
+ check_local_file_status
97
+ update_source
98
+ write_colors
99
+ write_files
100
+ write_fonts
101
+ write_i18ns
102
+ write_images
103
+ case language
104
+ when SupportLanguage::SWIFT
105
+ write_swift_code 'Resources.swift', resources_class_contents
106
+ when SupportLanguage::OC
107
+ write_oc_key_defines OCFileModel.main_model, []
108
+ write_oc_key_defines OCFileModel.public_model, []
109
+ end
110
+ auto_compoment_list = component.auto_compoment_list
111
+ component.check_auto_compoment!
112
+ component.check_auto_codes!
113
+ auto_publish_components(auto_compoment_list || [])
114
+ push_resource_to_remote
115
+ end
116
+
117
+ private
118
+
119
+ def update_source
120
+ source.update
121
+ end
122
+
123
+ def write_colors
124
+ return unless component.colors_keys
125
+
126
+ valid_assets = valid_assets(KCommercial::Resources::AssetType::Color, component.colors_keys)
127
+ return unless valid_assets
128
+ return if valid_assets.empty?
129
+
130
+ KCommercial::UI.info 'Generating the colors indexes ...'
131
+ valid_assets.each do |app_assets|
132
+ bundle_generator = ColorsIndexesGenerator.new(app_assets.assets, auto_assets_path.join(app_assets.app))
133
+ bundle_generator.generate!
134
+ end
135
+ sort_assets = valid_assets.sort_by { |items| items.assets.size }
136
+ write_universal_code_defines 'Colors.swift',
137
+ KCommercial::Resources::OCFileModel.colors_model,
138
+ sort_assets.first.assets.map(&:name),
139
+ ColorsGenerator
140
+ @resources_status.has_colors = true
141
+ end
142
+
143
+ def write_files
144
+ return unless component.files_keys
145
+
146
+ valid_assets = valid_assets(KCommercial::Resources::AssetType::File, component.files_keys)
147
+ return unless valid_assets
148
+ return if valid_assets.empty?
149
+
150
+ KCommercial::UI.info 'Generating the files indexes ...'
151
+ valid_assets.each do |app_assets|
152
+ bundle_generator = FilesIndexesGenerator.new(app_assets.assets, auto_assets_path.join(app_assets.app))
153
+ bundle_generator.generate!
154
+ end
155
+ sort_assets = valid_assets.sort_by { |items| items.assets.size }
156
+ write_universal_code_defines 'Files.swift',
157
+ KCommercial::Resources::OCFileModel.files_model,
158
+ sort_assets.first.assets.map(&:name),
159
+ FilesGenerator
160
+ @resources_status.has_files = true
161
+
162
+ end
163
+
164
+ def write_fonts
165
+ return unless component.fonts_keys
166
+
167
+ valid_assets = valid_assets(KCommercial::Resources::AssetType::Font, component.fonts_keys)
168
+ return unless valid_assets
169
+ return if valid_assets.empty?
170
+
171
+ KCommercial::UI.info 'Generating the fonts indexes ...'
172
+ valid_assets.each do |app_assets|
173
+ bundle_generator = FontsIndexesGenerator.new(app_assets.assets, auto_assets_path.join(app_assets.app))
174
+ bundle_generator.generate!
175
+ end
176
+ sort_assets = valid_assets.sort_by { |items| items.assets.size }
177
+ write_universal_code_defines 'Fonts.swift',
178
+ KCommercial::Resources::OCFileModel.fonts_model,
179
+ sort_assets.first.assets.map(&:name),
180
+ FontsGenerator
181
+
182
+ @resources_status.has_fonts = true
183
+ end
184
+
185
+ def write_i18ns
186
+ return unless component.i18ns_keys
187
+
188
+ valid_assets = valid_assets(KCommercial::Resources::AssetType::I18n, component.i18ns_keys)
189
+ return unless valid_assets
190
+ return if valid_assets.empty?
191
+
192
+ KCommercial::UI.info 'Generating the i18ns indexes ...'
193
+ valid_assets.each do |app_assets|
194
+ bundle_generator = I18nsIndexesGenerator.new(app_assets.assets, auto_assets_path.join(app_assets.app))
195
+ bundle_generator.generate!
196
+ end
197
+ sort_assets = valid_assets.sort_by { |items| items.assets.size }
198
+ write_universal_code_defines 'I18ns.swift',
199
+ KCommercial::Resources::OCFileModel.i18ns_model,
200
+ sort_assets.first.assets.map(&:name),
201
+ I18nsGenerator
202
+ @resources_status.has_i18ns = true
203
+ end
204
+
205
+ def write_images
206
+ return unless component.images_keys
207
+
208
+ valid_assets = valid_assets(KCommercial::Resources::AssetType::Image, component.images_keys)
209
+ return unless valid_assets
210
+ return if valid_assets.empty?
211
+
212
+ KCommercial::UI.info 'Generating the images indexes ...'
213
+ valid_assets.each do |app_assets|
214
+ bundle_generator = ImagesIndexesGenerator.new(app_assets.assets, auto_assets_path.join(app_assets.app))
215
+ bundle_generator.generate!
216
+ end
217
+ sort_assets = valid_assets.sort_by { |items| items.assets.size }
218
+ write_universal_code_defines 'Images.swift',
219
+ KCommercial::Resources::OCFileModel.images_model,
220
+ sort_assets.last.assets.map(&:name),
221
+ ImagesGenerator
222
+ @resources_status.has_images = true
223
+ end
224
+
225
+ def valid_assets(type, key_defines)
226
+ keys = key_defines.keys
227
+ return if keys.empty?
228
+
229
+ # 返回各宿主 + default 资源
230
+ app_sources = source.load_assets(type)
231
+ app_sources.each do |e|
232
+ valid_resources(e, keys)
233
+ end
234
+ end
235
+
236
+ def valid_resources(app_source, keys)
237
+ exist_keys = app_source.assets.map(&:name)
238
+ not_found_keys = keys - exist_keys
239
+ found_keys = keys & exist_keys
240
+ exist_assets = app_source.assets.select{|asset| found_keys.include? asset.name}
241
+ valid_assets = exist_assets.select(&:valid)
242
+ invalid_assets = exist_assets - valid_assets
243
+ if not_found_keys.count.positive?
244
+ KCommercial::UI.warning "Some assets is not found for(#{app_source.app}): \n#{not_found_keys.map{|key|"\t #{key}"}.join("\n")}"
245
+ end
246
+ if invalid_assets.count.positive?
247
+ KCommercial::UI.warning "Some cdasset is invalid: for(#{app_source.app}): \n" + invalid_assets.map{|a|"\t #{a.name}"}.join("\n")
248
+ end
249
+ app_source.assets = valid_assets
250
+ end
251
+ # The name for the auto generated bundle
252
+ # @return [String]
253
+ def auto_bundle_name
254
+ if component.name.end_with? "Resources"
255
+ return "Auto#{component.name}"
256
+ else
257
+ "Auto#{component.name}Resources"
258
+ end
259
+ end
260
+
261
+ private
262
+
263
+ def push_resource_to_remote
264
+ raise "有变动,退出自动推送资源组件代码" unless auto_push
265
+ ResourcesUpdate.push
266
+ end
267
+
268
+ def auto_publish_components(components)
269
+ components.each do |c|
270
+ publisher = KCommercial::KCPipeline::Publisher.new(c,'patch','true','true') unless c.empty?
271
+ publisher.publish if !publisher.nil?
272
+ end
273
+ end
274
+
275
+ def write_universal_code_defines(swift_file_name,
276
+ oc_file_model,
277
+ keys,
278
+ swift_generator)
279
+ return if keys.nil? || keys.empty?
280
+
281
+ case language
282
+ when SupportLanguage::SWIFT
283
+ write_swift_key_defines swift_file_name, keys, swift_generator
284
+ when SupportLanguage::OC
285
+ write_oc_key_defines oc_file_model, keys
286
+ end
287
+ end
288
+
289
+ def write_oc_key_defines(file_model, key_defines)
290
+ options = {}
291
+ options[:super] = @super_module if @super_module
292
+ code_generator = KCommercial::Resources::OCGenerator.new(file_model,
293
+ component.name,
294
+ key_defines,
295
+ @resources_status,
296
+ options)
297
+ render_map = {
298
+ 'oc_class_name' => code_generator.code_model.oc_class_name,
299
+ 'component_name' => component.name,
300
+ 'component_header_name' => code_generator.code_model.component_header_name
301
+ }
302
+ write_oc_code(file_model.header.basename.to_s, code_generator.header_contents, render_map) if file_model.header
303
+ if file_model.implementation
304
+ write_oc_code(file_model.implementation.basename.to_s, code_generator.imp_contents, render_map)
305
+ end
306
+ end
307
+
308
+ def write_oc_code(file_name, contents, render_map)
309
+ file_name = Liquid::Template.parse(file_name).render(render_map)
310
+ output_path = auto_classes_path.join(file_name)
311
+ output_path.parent.mkpath
312
+ File.open(output_path, 'w+') do |file|
313
+ file.write contents
314
+ end
315
+ end
316
+
317
+ def write_swift_key_defines(filename, key_defines, generator_class)
318
+ return if key_defines.nil?
319
+
320
+ options = {
321
+ super: @super_module
322
+ }
323
+ contents = generator_class.new(key_defines, options).extension_contents
324
+ write_swift_code filename, contents
325
+ end
326
+
327
+ # Write the contents to the local file
328
+ # @param [String] filename the name for the code file
329
+ # @param [String] contents the content for the code file
330
+ def write_swift_code(filename, contents)
331
+ path = auto_classes_path.join(filename)
332
+ path.parent.mkpath
333
+ File.open(path, 'w+') do |file|
334
+ file.write contents
335
+ end
336
+ end
337
+
338
+ def resources_class_contents
339
+ <<EOF
340
+ //
341
+ // Resources.swift
342
+ // MKSharedResources
343
+ //
344
+ // Created by Dong Zhao on 2021/1/1.
345
+ //
346
+
347
+ import Foundation
348
+ import #{@super_module}
349
+ #{'import MKResources' if @super_module != 'MKResources'}
350
+ // swiftlint:disable type_name
351
+ open class R: #{@super_module}.R {
352
+ static let `default` = R()
353
+ public override init() {
354
+ super.init()
355
+ if let pack = Bundle.main.url(forResource: "#{auto_bundle_name}", withExtension: "bundle") {
356
+ registerPack(pack: Pack(url: pack))
357
+ } else if let url = Bundle(for: type(of: self)).url(forResource: "#{auto_bundle_name}",
358
+ withExtension: "bundle") {
359
+ registerPack(pack: Pack(url: url))
360
+ }
361
+ }
362
+ }
363
+ // swiftlint:enable type_name
364
+ EOF
365
+ end
366
+ end
367
+ end
368
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ require 'yaml'
3
+
4
+ module KCommercial
5
+ module Resources
6
+ class KeyDefines
7
+
8
+ class << self
9
+ # Creat a new KeyDefines from a file
10
+ # @return [KeyDefines]
11
+ def from_file(file)
12
+ unless file
13
+ KCommercial::UI.debug "can not find the key defines file #{file}"
14
+ return nil
15
+ end
16
+ contents = File.read(file)
17
+ hash = YAML.load contents
18
+ unless hash.is_a? Hash
19
+ raise KCommercial::Exception("The content is not an hash in #{file}")
20
+ end
21
+ keys = KeyDefines.new(hash)
22
+ keys.defined_in_file = file
23
+ keys
24
+ end
25
+ end
26
+ # All the key defines for the generator
27
+ attr_reader :keys
28
+
29
+ # The configuration file defines in the storage path
30
+ attr_accessor :defined_in_file
31
+
32
+ def initialize(hash = {})
33
+ @keys = hash['keys'] or hash[:keys]
34
+ if @keys.nil?
35
+ @keys = []
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+ require 'liquid'
3
+ require_relative '../code_generator/resources_status'
4
+ module KCommercial
5
+ module Resources
6
+ class CodeModel
7
+ attr_accessor :component_name, :super_module_name, :keys, :resources_status
8
+
9
+ def oc_class_name
10
+ name = component_name
11
+ name = "#{component_name}Resources" unless component_name.end_with? "Resources"
12
+ "#{name}Internal"
13
+ end
14
+
15
+ def super_class_name
16
+ name = "#{super_module_name}Internal"
17
+ if super_module_name.to_s == "KCSemanticResources"
18
+ name = "KCResources"
19
+ end
20
+ name
21
+ end
22
+
23
+ def component_header_name
24
+ name = "#{component_name}Auto"
25
+ name
26
+ end
27
+
28
+ def bundle_name
29
+ if component_name.end_with? "Resources"
30
+ return "Auto#{component_name}"
31
+ else
32
+ "Auto#{component_name}Resources"
33
+ end
34
+ end
35
+
36
+ def key_to_function_name(key)
37
+ key = key.camelize(false)
38
+ if key.length > 0
39
+ key[0] = key[0].downcase
40
+ end
41
+ key
42
+ end
43
+
44
+ def get_binding
45
+ binding
46
+ end
47
+
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,59 @@
1
+ module KCommercial
2
+ module Resources
3
+
4
+ class OCFileModel
5
+ attr_accessor :header
6
+ attr_accessor :implementation
7
+
8
+ class << self
9
+ def templates_root
10
+ Pathname(__FILE__).parent.join('templates')
11
+ end
12
+
13
+ def public_header
14
+ templates_root.join('{{component_header_name}}.h')
15
+ end
16
+
17
+ def public_model
18
+ OCFileModel.new('{{component_header_name}}.h', nil)
19
+ end
20
+
21
+ def main_model
22
+ OCFileModel.new('{{oc_class_name}}.h',
23
+ '{{oc_class_name}}.m')
24
+ end
25
+
26
+ def i18ns_model
27
+ file_model_for_type('I18ns')
28
+ end
29
+
30
+ def fonts_model
31
+ file_model_for_type('Fonts')
32
+ end
33
+
34
+ def images_model
35
+ file_model_for_type('Images')
36
+ end
37
+
38
+ def files_model
39
+ file_model_for_type('Files')
40
+ end
41
+
42
+ def colors_model
43
+ file_model_for_type('Colors')
44
+ end
45
+
46
+ def file_model_for_type(type)
47
+ OCFileModel.new("{{oc_class_name}}+#{type}.h",
48
+ "{{oc_class_name}}+#{type}.m")
49
+ end
50
+ end
51
+
52
+ def initialize(header_name, imp_name)
53
+ @header = OCFileModel.templates_root.join(header_name) if header_name
54
+ @implementation = OCFileModel.templates_root.join(imp_name) if imp_name
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../code_generator/code_generator'
2
+ require_relative 'code_model'
3
+ require 'liquid'
4
+
5
+ module KCommercial
6
+ module Resources
7
+ class OCGenerator
8
+ class << self
9
+ def templates_root
10
+ Pathname(__FILE__).parent.join('templates')
11
+ end
12
+ end
13
+
14
+ def initialize(file_model, name, keys, resources_status, options)
15
+ @file_model = file_model
16
+ @name = name
17
+ @keys = keys
18
+ @super_module_name = options.delete(:super) { :KCSemanticResources }
19
+ @resources_status = resources_status
20
+ end
21
+
22
+ def header_contents
23
+ ERB.new(File.read(@file_model.header)).result(code_model.get_binding)
24
+ end
25
+
26
+ def imp_contents
27
+ ERB.new(File.read(@file_model.implementation)).result(code_model.get_binding)
28
+ end
29
+
30
+ def code_model
31
+ @code_model ||= begin
32
+ model = CodeModel.new
33
+ model.keys = @keys
34
+ model.super_module_name = @super_module_name
35
+ model.component_name = @name
36
+ model.resources_status = @resources_status
37
+ model
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def render_map
44
+ {
45
+ "oc_class_name" => code_model.oc_class_name,
46
+ "bundle_name" => code_model.bundle_name,
47
+ "component_name" => code_model.component_name,
48
+ "keys" => @keys
49
+ }
50
+ end
51
+
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,39 @@
1
+ //
2
+ // Auto Generated By CocoaDepot
3
+ //
4
+ // _____ _____ _
5
+ // / ____| | __ \ | |
6
+ // | | ___ ___ ___ __ _| | | | ___ _ __ ___ | |_
7
+ // | | / _ \ / __/ _ \ / _` | | | |/ _ | '_ \ / _ \| __|
8
+ // | |___| (_) | (_| (_) | (_| | |__| | __| |_) | (_) | |_
9
+ // \_____\___/ \___\___/ \__,_|_____/ \___| .__/ \___/ \__|
10
+ // | |
11
+ // |_|
12
+ // The universal cocoa devops toolchain.
13
+ // This file is generated using the semantic resources. If you want
14
+ // check more info please see:
15
+ // * RFC-2021.07.01 iOS 资源语义化方案 http://shortlink.test.gifshow.com/A8nIepnk
16
+ // * 资源语义化 Objective-C 代码生成 http://shortlink.test.gifshow.com/A8nIepnk
17
+ //
18
+
19
+
20
+ #ifndef <%= component_header_name%>_h
21
+ #define <%= component_header_name%>_h
22
+ /// The main portal for resources with component named '<%= component_name%>'
23
+ #define <%= component_header_name%>R [<%= oc_class_name%> R]
24
+ <% if resources_status.has_i18ns? %>
25
+ #import "<%= oc_class_name %>+I18ns.h"
26
+ <% end %>
27
+ <% if resources_status.has_images? %>
28
+ #import "<%=oc_class_name %>+Images.h"
29
+ <% end %>
30
+ <% if resources_status.has_colors? %>
31
+ #import "<%=oc_class_name %>+Colors.h"
32
+ <% end %>
33
+ <% if resources_status.has_files? %>
34
+ #import "<%=oc_class_name %>+Files.h"
35
+ <% end %>
36
+ <% if resources_status.has_fonts? %>
37
+ #import "<%=oc_class_name %>+Fonts.h"
38
+ <% end %>
39
+ #endif
@@ -0,0 +1,31 @@
1
+ //
2
+ // Auto Generated By CocoaDepot
3
+ //
4
+ // _____ _____ _
5
+ // / ____| | __ \ | |
6
+ // | | ___ ___ ___ __ _| | | | ___ _ __ ___ | |_
7
+ // | | / _ \ / __/ _ \ / _` | | | |/ _ | '_ \ / _ \| __|
8
+ // | |___| (_) | (_| (_) | (_| | |__| | __| |_) | (_) | |_
9
+ // \_____\___/ \___\___/ \__,_|_____/ \___| .__/ \___/ \__|
10
+ // | |
11
+ // |_|
12
+ // The universal cocoa devops toolchain.
13
+ // This file is generated using the semantic resources. If you want
14
+ // check more info please see:
15
+ // * RFC-2021.07.01 iOS 资源语义化方案 http://shortlink.test.gifshow.com/A8nIepnk
16
+ // * 资源语义化 Objective-C 代码生成 http://shortlink.test.gifshow.com/A8nIepnk
17
+ //
18
+
19
+
20
+ #import <Foundation/Foundation.h>
21
+ #import "<%= oc_class_name %>.h"
22
+
23
+ /// @brief The portal for using colors from component named <%= component_name%>.
24
+ @interface <%= oc_class_name %> (Colors)
25
+ <% for key in keys %>
26
+ /// The color for key '<%= key%>'
27
+ ///
28
+ /// @return The color for key '<%= key%>'
29
+ - (UIColor *)<%= key_to_function_name(key)%>;
30
+ <% end %>
31
+ @end
@@ -0,0 +1,29 @@
1
+ //
2
+ // Auto Generated By CocoaDepot
3
+ //
4
+ // _____ _____ _
5
+ // / ____| | __ \ | |
6
+ // | | ___ ___ ___ __ _| | | | ___ _ __ ___ | |_
7
+ // | | / _ \ / __/ _ \ / _` | | | |/ _ | '_ \ / _ \| __|
8
+ // | |___| (_) | (_| (_) | (_| | |__| | __| |_) | (_) | |_
9
+ // \_____\___/ \___\___/ \__,_|_____/ \___| .__/ \___/ \__|
10
+ // | |
11
+ // |_|
12
+ // The universal cocoa devops toolchain.
13
+ // This file is generated using the semantic resources. If you want
14
+ // check more info please see:
15
+ // * RFC-2021.07.01 iOS 资源语义化方案 http://shortlink.test.gifshow.com/A8nIepnk
16
+ // * 资源语义化 Objective-C 代码生成 http://shortlink.test.gifshow.com/A8nIepnk
17
+ //
18
+
19
+ #import "<%= oc_class_name %>+Colors.h"
20
+ #import <KCSemanticResources/KCSemanticResources.h>
21
+
22
+ @implementation <%= oc_class_name %> (Colors)
23
+
24
+ <% for key in keys %>
25
+ - (UIColor *)<%= key_to_function_name(key)%> {
26
+ return [self colorForKey:@"<%= key%>" env:KCRuntimeEnviroment.sharedInstance];
27
+ }
28
+ <% end %>
29
+ @end