KCommercialPipeline 0.2.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.idea/.gitignore +8 -0
- data/.idea/inspectionProfiles/Project_Default.xml +6 -0
- data/.idea/inspectionProfiles/profiles_settings.xml +5 -0
- data/.idea/kcommercialpipeline.iml +130 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rubocop.yml +13 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +224 -0
- data/KCommercialPipeline-0.2.5.0.gem +0 -0
- data/KCommercialPipeline.gemspec +49 -0
- data/LICENSE.txt +21 -0
- data/README.md +43 -0
- data/Rakefile +16 -0
- data/bin/KCommercialPipeline +17 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/KCommercialPipeline/App.rb +18 -0
- data/lib/KCommercialPipeline/command/app_runner.rb +34 -0
- data/lib/KCommercialPipeline/command/auto_cherry_pick_cmd.rb +18 -0
- data/lib/KCommercialPipeline/command/change_log.rb +19 -0
- data/lib/KCommercialPipeline/command/check_release_cmd.rb +34 -0
- data/lib/KCommercialPipeline/command/command.rb +44 -0
- data/lib/KCommercialPipeline/command/feat_check.rb +16 -0
- data/lib/KCommercialPipeline/command/git_hook_install_cmd.rb +29 -0
- data/lib/KCommercialPipeline/command/ios_publish_component.rb +71 -0
- data/lib/KCommercialPipeline/command/rb_auto.rb +30 -0
- data/lib/KCommercialPipeline/command/resource.rb +52 -0
- data/lib/KCommercialPipeline/core/app_demo.rb +196 -0
- data/lib/KCommercialPipeline/core/branch_diffs.rb +95 -0
- data/lib/KCommercialPipeline/core/change_log/change_log_task.rb +317 -0
- data/lib/KCommercialPipeline/core/change_log/doc_builder.rb +91 -0
- data/lib/KCommercialPipeline/core/component_publisher.rb +122 -0
- data/lib/KCommercialPipeline/core/feature_send.rb +88 -0
- data/lib/KCommercialPipeline/core/git.rb +125 -0
- data/lib/KCommercialPipeline/core/git_hook/install_git_hook.rb +84 -0
- data/lib/KCommercialPipeline/core/git_hook/prepare_commit_msg.rb +0 -0
- data/lib/KCommercialPipeline/core/kim_cfg.rb +64 -0
- data/lib/KCommercialPipeline/core/kim_notify.rb +99 -0
- data/lib/KCommercialPipeline/core/resource/auto_publish_resource/update_resource_component.rb +35 -0
- data/lib/KCommercialPipeline/core/resource/bundle/colors_generator.rb +29 -0
- data/lib/KCommercialPipeline/core/resource/bundle/files_generator.rb +36 -0
- data/lib/KCommercialPipeline/core/resource/bundle/fonts_generator.rb +29 -0
- data/lib/KCommercialPipeline/core/resource/bundle/i18ns_generator.rb +29 -0
- data/lib/KCommercialPipeline/core/resource/bundle/images_generator.rb +67 -0
- data/lib/KCommercialPipeline/core/resource/bundle/indexes_generator.rb +55 -0
- data/lib/KCommercialPipeline/core/resource/bundle/scale_pathname.rb +23 -0
- data/lib/KCommercialPipeline/core/resource/code_generator/code_generator.rb +59 -0
- data/lib/KCommercialPipeline/core/resource/code_generator/file_generator.rb +16 -0
- data/lib/KCommercialPipeline/core/resource/code_generator/resources_status.rb +24 -0
- data/lib/KCommercialPipeline/core/resource/component_resources_config.rb +63 -0
- data/lib/KCommercialPipeline/core/resource/file_generator.rb +16 -0
- data/lib/KCommercialPipeline/core/resource/i18n/auto_component.rb +61 -0
- data/lib/KCommercialPipeline/core/resource/i18n/bundle_generator.rb +36 -0
- data/lib/KCommercialPipeline/core/resource/i18n/generator.rb +368 -0
- data/lib/KCommercialPipeline/core/resource/key_defines.rb +41 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/code_model.rb +51 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/oc_file_model.rb +59 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/oc_generator.rb +55 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{component_header_name}}.h +39 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Colors.h +31 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Colors.m +29 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Files.h +31 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Files.m +29 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Fonts.h +31 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Fonts.m +29 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+I18ns.h +31 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+I18ns.m +29 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Images.h +30 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}+Images.m +29 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}.h +39 -0
- data/lib/KCommercialPipeline/core/resource/objective-c/templates/{{oc_class_name}}.m +51 -0
- data/lib/KCommercialPipeline/core/resource/source/asset.rb +120 -0
- data/lib/KCommercialPipeline/core/resource/source/asset_type.rb +16 -0
- data/lib/KCommercialPipeline/core/resource/source/git_source.rb +105 -0
- data/lib/KCommercialPipeline/core/resource/source/git_source_manager.rb +114 -0
- data/lib/KCommercialPipeline/core/resource/source/interface.rb +9 -0
- data/lib/KCommercialPipeline/core/resource/source/lib_bundle.rb +50 -0
- data/lib/KCommercialPipeline/core/resource/source/source.rb +9 -0
- data/lib/KCommercialPipeline/core/resource/source/source_interface.rb +20 -0
- data/lib/KCommercialPipeline/core/resource/source/source_manager.rb +93 -0
- data/lib/KCommercialPipeline/core/resource/source/star_source.rb +145 -0
- data/lib/KCommercialPipeline/core/resource/source/subspec_bundle.rb +34 -0
- data/lib/KCommercialPipeline/core/resource/swift/colors_generator.rb +22 -0
- data/lib/KCommercialPipeline/core/resource/swift/files_generate.rb +22 -0
- data/lib/KCommercialPipeline/core/resource/swift/fonts_generator.rb +22 -0
- data/lib/KCommercialPipeline/core/resource/swift/i18n_generetor.rb +22 -0
- data/lib/KCommercialPipeline/core/resource/swift/images_generator.rb +22 -0
- data/lib/KCommercialPipeline/core/resource/swift/swift_generator.rb +84 -0
- data/lib/KCommercialPipeline/core/resource/xcassets/image.rb +30 -0
- data/lib/KCommercialPipeline/core/resource/xcassets/imageset.rb +53 -0
- data/lib/KCommercialPipeline/core/resource/xcassets/xcassets.rb +63 -0
- data/lib/KCommercialPipeline/core/version_pipeline/auto_cherry_pick.rb +173 -0
- data/lib/KCommercialPipeline/core/version_pipeline/release_branches.rb +183 -0
- data/lib/KCommercialPipeline/core/version_pipeline/release_check.rb +111 -0
- data/lib/KCommercialPipeline/version.rb +5 -0
- data/lib/KCommercialPipeline.rb +19 -0
- 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
|