cocoapods-kz 0.0.2 → 0.0.3

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: 18e1dd57432a470374b85e1794cf69de70759adb36f68c49c7728938ee14a4be
4
- data.tar.gz: a3817262cf67e2e65481738f5cd9ea4f8f4af4ea70a8b763a1ea4260edcc7b0e
3
+ metadata.gz: 8f85aeb7b3f3ec7afa4fec40b6509b2f1fa599970068a00532874ba299c96a3c
4
+ data.tar.gz: eac71cb74fad8e788604563a5c10d087523fdaeee86dcd5e4b9edff9b0b645a6
5
5
  SHA512:
6
- metadata.gz: f34e514bf9be6dfc1932d3d6c636150a168613a0576070d606d22fc750c11065a8a4ba7545a4b807d80490a174d0977703a7cd639cb36aa0ae5670fe8f9eea43
7
- data.tar.gz: e59798c2da8fd42bed9ec76532799256a304d611ea0a94a7e9c38db515d9a0cea69a25e222b13f5f2c8d186eebc720c8b734c7e24c1efb2be8160adc5c895815
6
+ metadata.gz: d78c400c79c139d5beb99b5c84e349869abec6507ad4d4b720c3ffd956542e207d34ec55e72273496b074a031fb01299ec79f26959e0611a33fd2a2e7c8d1521
7
+ data.tar.gz: d5d61fdecfb237ba596539559f560747c3fdd3145324f2f069ad0e9f1c418b70786f19656405a3906992d1decea96718201f15c1103149967bea85b242e1dfc9
@@ -22,19 +22,21 @@ module Pod
22
22
  ['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
23
23
  ['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
24
24
  ['--debug', "debug模式,会打印调试日志或生成调试文件"],
25
+ ['--no-framework-update', "不再生成frameowrk"]
25
26
  ].concat(super).reject { |(name, _)| name == '--no-repo-update' }
26
27
  end
27
28
 
28
29
  def initialize(argv)
29
- @use_code_tag = argv.flag?('code')
30
- @use_framework_tag = argv.flag?('framework')
31
- @debug = argv.flag?('debug')
32
- help! if @use_code_tag && @use_framework_tag
33
- KZ::KZGlobalHelper.instance.analyze_special_parameters(@use_code_tag, @use_framework_tag, argv.arguments!)
30
+ use_code_tag = argv.flag?('code')
31
+ use_framework_tag = argv.flag?('framework')
32
+ help! if use_code_tag && use_framework_tag
33
+ KZ::KZGlobalHelper.instance.analyze_special_parameters(use_code_tag, use_framework_tag, argv.arguments!)
34
34
  if Pod.match_version?('~> 1.4')
35
35
  KZ::KZGlobalHelper.instance.kz_pod_enable = true
36
+ KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
36
37
  end
37
- KZ::KZGlobalHelper.instance.debug = true if @debug
38
+ KZ::KZGlobalHelper.instance.debug = true if argv.flag?('debug')
39
+ KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('no-framework-update')
38
40
 
39
41
  super
40
42
  @additional_args = argv.remainder!
@@ -1,5 +1,6 @@
1
1
  require_relative 'install'
2
2
  require_relative 'update'
3
+ require_relative 'repair'
3
4
 
4
5
  module Pod
5
6
  class Command
@@ -0,0 +1,47 @@
1
+ require 'cocoapods-kz/helpers/repair_dynamic_swift'
2
+ require 'cocoapods-kz/helpers/repair_module_import'
3
+
4
+ module Pod
5
+ class Command
6
+ class Kz < Command
7
+ class Repair < Kz
8
+ self.summary = 'pod kz repair,用于修复各种不符合规范的场景'
9
+
10
+ self.description = <<-DESC
11
+ 结合可选子命令用于执行各种修补脚本
12
+ DESC
13
+
14
+ def self.options
15
+ [
16
+ ['--module-import', "修复所有头文件import方式,使其支持module导入,如果后面追加指定Pod名,将只修改该Pod"],
17
+ ['--dynamic-swift', "将项目中所有swift添加上OC动态属性,如果后面追加指定Pod名,将只修改该Pod"]
18
+ ]
19
+ end
20
+
21
+ def initialize(argv)
22
+ help! if argv.arguments == 0
23
+ @repair_module_import = argv.flag?('module-import')
24
+ @repair_dynamic_swift = argv.flag?('dynamic-swift')
25
+ help! if !@repair_module_import && !@repair_dynamic_swift
26
+
27
+ KZ::KZGlobalHelper.instance.analyze_special_parameters(true, false, argv.arguments!)
28
+ KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
29
+
30
+ super
31
+ end
32
+
33
+ def run
34
+ installer = installer_for_config
35
+ installer.prepare
36
+ installer.resolve_dependencies.analyze
37
+
38
+ if @repair_dynamic_swift
39
+ KZ::KZSwiftAttachOCFeature.new.repair
40
+ else @repair_module_import
41
+ KZ::KZRepairModuleImport.new(installer.aggregate_targets.first.user_project).repair
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -22,18 +22,21 @@ module Pod
22
22
  ['--framework', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
23
23
  ['--code', "后面需要跟上pod名(多个pod,使用英文逗号隔开)"],
24
24
  ['--debug', "debug模式,会打印调试日志或生成调试文件"],
25
+ ['--no-framework-update', "不再生成frameowrk"]
25
26
  ].concat(super)
26
27
  end
27
28
 
28
29
  def initialize(argv)
29
- @use_code_tag = argv.flag?('code')
30
- @use_framework_tag = argv.flag?('framework')
31
- help! if @use_code_tag && @use_framework_tag
32
- KZ::KZGlobalHelper.instance.analyze_special_parameters(@use_code_tag, @use_framework_tag, argv.arguments!)
30
+ use_code_tag = argv.flag?('code')
31
+ use_framework_tag = argv.flag?('framework')
32
+ help! if use_code_tag && use_framework_tag
33
+ KZ::KZGlobalHelper.instance.analyze_special_parameters(use_code_tag, use_framework_tag, argv.arguments!)
33
34
  if Pod.match_version?('~> 1.4')
34
35
  KZ::KZGlobalHelper.instance.kz_pod_enable = true
36
+ KZ::KZGlobalHelper.instance.generate_kz_pod_targets = true
35
37
  end
36
- KZ::KZGlobalHelper.instance.debug = true if @debug
38
+ KZ::KZGlobalHelper.instance.debug = true if argv.flag?('debug')
39
+ KZ::KZGlobalHelper.instance.disable_generate_framework = true if argv.flag?('no-framework-update')
37
40
 
38
41
  super
39
42
  @additional_args = argv.remainder!
@@ -1,5 +1,5 @@
1
1
  module CocoapodsKz
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
4
4
 
5
5
  module Pod
@@ -23,6 +23,11 @@ fi
23
23
  PRODUCT_DIR=${PODS_BUILD_DIR}/Debug-iphoneos/${TARGET_NAME}/${FULL_PRODUCT_NAME}
24
24
  PRODUCT_SIMULATOR_DIR=${PODS_BUILD_DIR}/Debug-iphonesimulator/${TARGET_NAME}/${FULL_PRODUCT_NAME}
25
25
  CURRENT_PRODUCT_DIR=${PODS_CONFIGURATION_BUILD_DIR}/${TARGET_NAME}
26
+
27
+ if [ -d "${KZ_FRAMEWORK_CACHE_PATH}" ]; then
28
+ rm -r "${KZ_FRAMEWORK_CACHE_PATH}"
29
+ fi
30
+ mkdir -p "${KZ_FRAMEWORK_CACHE_PATH}"
26
31
 
27
32
  if [ -d "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}" ]; then
28
33
  rm -r "${KZ_FRAMEWORK_CACHE_PATH}/${FULL_PRODUCT_NAME}"
@@ -22,8 +22,8 @@ module KZ
22
22
  if File.file?(file_path)
23
23
  yield(file_path) if file_name.end_with?('.h')
24
24
  elsif File.directory?(file_path)
25
- traverse_folder(file_path) do |file_path|
26
- yield(file_path)
25
+ traverse_folder(file_path) do |path|
26
+ yield(path)
27
27
  end
28
28
  end
29
29
  end
@@ -60,14 +60,14 @@ module KZ
60
60
  private_hmap_hash[header_pathname_basename] = header_hmap_value
61
61
  end
62
62
 
63
- if !private_hmap_hash.empty?
63
+ unless private_hmap_hash.empty?
64
64
  save_hmap_file(private_hmap_hash, KZ_POD_CONFIG_ROOT, @main_project.root_object.display_name)
65
65
  end
66
66
 
67
67
  @main_project.targets.each do |target|
68
68
  if target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.application"
69
69
  target.build_configurations.each do |config|
70
- config.build_settings['HEADER_SEARCH_PATHS'] = "${PODS_ROOT}/#{@main_project.root_object.display_name }.hmap"
70
+ config.build_settings['HEADER_SEARCH_PATHS'] = "${PODS_ROOT}/KZPodConfigure/#{@main_project.root_object.display_name }.hmap"
71
71
  config.build_settings['USE_HEADERMAP'] = 'NO'
72
72
  end
73
73
  end
@@ -85,11 +85,22 @@ module KZ
85
85
  all_native_target
86
86
  end
87
87
 
88
- def get_all_handle_target_from(project)
88
+ def get_all_test_target_from(project)
89
+ all_native_target = {}
90
+
91
+ project.targets.each do |target|
92
+ if target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.bundle.unit-test"
93
+ all_native_target[target.name] = target
94
+ end
95
+ end
96
+ all_native_target
97
+ end
98
+
99
+ def get_all_aggregate_target_from(project)
89
100
  all_handle_target = {}
90
101
 
91
102
  project.targets.each do |target|
92
- if !(target.isa == "PBXNativeTarget" and target.product_type == "com.apple.product-type.bundle") and !target.name.start_with?('Pods-')
103
+ if target.isa == "PBXAggregateTarget"
93
104
  all_handle_target[target.name] = target
94
105
  end
95
106
  end
@@ -132,7 +143,15 @@ module KZ
132
143
  elsif hmap_content_style == HmapContentStyle::QUOTES_REPAIR
133
144
  header_hmap_value_slash = {}
134
145
  header_hmap_value_slash['suffix'] = header_pathname_basename
135
- header_hmap_value_slash['prefix'] = kz_pod_target.name + '/'
146
+ prefix_name = kz_pod_target.name
147
+ if header_pathname.dirname.to_s.include?('.framework')
148
+ header_pathname.dirname.to_s.split('/').each do |name|
149
+ if name.include?('.framework')
150
+ prefix_name = name.split('.').first
151
+ end
152
+ end
153
+ end
154
+ header_hmap_value_slash['prefix'] = prefix_name + '/'
136
155
  hmap_info[header_pathname_basename] = header_hmap_value_slash
137
156
  end
138
157
  end
@@ -140,7 +159,8 @@ module KZ
140
159
  end
141
160
 
142
161
  def create_pod_hamp(all_kz_pod_targets)
143
- all_handle_targets = get_all_handle_target_from(@pod_project)
162
+ all_native_targets = get_all_native_target_from(@pod_project)
163
+ all_handle_targets = all_native_targets.merge(get_all_aggregate_target_from(@pod_project))
144
164
  all_handle_targets.each do |target_name, target|
145
165
  kz_pod_target = all_kz_pod_targets[target_name]
146
166
  next unless kz_pod_target
@@ -161,17 +181,17 @@ module KZ
161
181
  end
162
182
  end
163
183
 
164
- all_native_targets = get_all_native_target_from(@pod_project)
165
184
  all_native_targets.each do |target_name, target|
166
- kz_pod_target = all_kz_pod_targets[target_name]
185
+ target_real_name = target_name.split("-").first
186
+ kz_pod_target = all_kz_pod_targets[target_real_name]
167
187
  next unless kz_pod_target
168
188
 
169
189
  # 添加私有头文件引用
170
190
  private_hamp_info = get_hmap_info_from(kz_pod_target, HmapContentStyle::QUOTES_PRIVATE)
171
191
  if private_hamp_info.count > 0
172
192
  hmap_cache_path = kz_pod_target.pod_config_cache_path(false)
173
- save_hmap_file(private_hamp_info, kz_pod_target.pod_config_cache_path(false), target_name)
174
- kz_pod_target.private_header_search_path = hmap_cache_path + "#{target_name}.hmap"
193
+ save_hmap_file(private_hamp_info, kz_pod_target.pod_config_cache_path(false), target_real_name)
194
+ kz_pod_target.private_header_search_path = hmap_cache_path + "#{target_real_name}.hmap"
175
195
  end
176
196
 
177
197
  # 修复缺失的依赖
@@ -191,8 +211,10 @@ module KZ
191
211
  kz_pod_target.framwork_search_paths = framework_search_paths
192
212
  end
193
213
 
194
- all_native_targets.each do |target_name, target|
195
- kz_pod_target = all_kz_pod_targets[target_name]
214
+ all_config_target = all_native_targets.merge(get_all_test_target_from(@pod_project))
215
+ all_config_target.each do |target_name, target|
216
+ target_real_name = target_name.split("-").first
217
+ kz_pod_target = all_kz_pod_targets[target_real_name]
196
218
  next unless kz_pod_target
197
219
 
198
220
  # 添加配置
@@ -1,15 +1,19 @@
1
1
  require 'cocoapods'
2
2
  require 'fileutils'
3
+ require 'json'
3
4
  require_relative 'kz_analyzer'
4
5
  require_relative 'kz_framework_manager'
5
6
  require_relative 'kz_config_result'
6
7
  require_relative 'kz_pod_target'
7
8
 
8
9
  module KZ
9
- KZ_POD_CONFIG_ROOT = Pod::Config.instance.sandbox_root + 'KZPodConfigure'
10
+ KZ_POD_CONFIG_ROOT = Pod::Config.instance.installation_root + 'Pods/KZPodConfigure'
11
+ # 修复pod lib报错问题
12
+ Pod::Config.instance.installation_root = nil
10
13
 
11
14
  HMAP_EXECUTE_PATH = File.dirname(__FILE__) + '/../resources/hmap'
12
15
  FLEX_COMPLIER_PATH = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
16
+ KZ_LOCK_FILE_PATH = KZ_POD_CONFIG_ROOT + 'KZConfigLock'
13
17
 
14
18
  class KZGlobalHelper
15
19
  attr_accessor :kz_pod_enable
@@ -18,6 +22,9 @@ module KZ
18
22
  attr_accessor :specify_pod_names
19
23
  attr_accessor :specify_pod_mode
20
24
  attr_accessor :debug
25
+ attr_accessor :kz_config_lock
26
+ attr_accessor :disable_generate_framework
27
+ attr_accessor :generate_kz_pod_targets
21
28
 
22
29
  private_class_method :new
23
30
 
@@ -26,9 +33,9 @@ module KZ
26
33
  @specify_pod_mode = :kz_pod_origin_mode
27
34
  @pods_config_cache = {}
28
35
  @debug = false
29
-
30
- FileUtils.mkdir_p(KZ_POD_CONFIG_ROOT)
31
- FileUtils.cp_r(File.dirname(__FILE__) + '/../resources/FlexCompiler', KZ_POD_CONFIG_ROOT)
36
+ @kz_config_lock = {}
37
+ @disable_generate_framework = false
38
+ @generate_kz_pod_targets = false
32
39
  end
33
40
 
34
41
  @@instance = nil
@@ -36,6 +43,20 @@ module KZ
36
43
  @@instance ||= new
37
44
  end
38
45
 
46
+ def kz_pod_enable=(value)
47
+ @kz_pod_enable = value
48
+ FileUtils.rm(KZ_LOCK_FILE_PATH) if File.exist?(KZ_LOCK_FILE_PATH)
49
+
50
+ if value
51
+ FileUtils.mkdir_p(KZ_POD_CONFIG_ROOT) unless File.exist?(KZ_POD_CONFIG_ROOT)
52
+
53
+ flex_compiler_de_path = KZ_POD_CONFIG_ROOT + 'FlexCompiler'
54
+ FileUtils.rm(flex_compiler_de_path) if File.exist?(flex_compiler_de_path)
55
+ FileUtils.cp_r(File.dirname(__FILE__) + '/../resources/FlexCompiler', KZ_POD_CONFIG_ROOT)
56
+ system("chmod +x #{flex_compiler_de_path}")
57
+ end
58
+ end
59
+
39
60
  def analyze_special_parameters(use_code_tag, use_framework_tag, pod_names)
40
61
  specify_pod_names = []
41
62
  if pod_names.count > 0
@@ -67,5 +88,27 @@ module KZ
67
88
  result
68
89
  end
69
90
 
91
+ def have_flexLib_pod_target
92
+ @kz_analyzer.kz_pod_targets_with("FlexLib").count > 0
93
+ end
94
+
95
+ def write_lock_file
96
+ self.kz_analyzer.all_kz_pod_targets.values.each do |kz_pod_target|
97
+ result = pod_config_result_with_target(kz_pod_target)
98
+
99
+ @kz_config_lock[kz_pod_target.name] ||= {}
100
+ @kz_config_lock[kz_pod_target.name]["dev_pod"] = kz_pod_target.is_dev_pod
101
+ @kz_config_lock[kz_pod_target.name]["use_framework"] = (result != nil)
102
+ @kz_config_lock[kz_pod_target.name]["version"] = kz_pod_target.version
103
+ end
104
+
105
+ if @kz_config_lock.count > 0
106
+ lock_file_content = JSON.pretty_generate(@kz_config_lock)
107
+ File.open(KZ_LOCK_FILE_PATH, 'w') do |file|
108
+ file.write(lock_file_content)
109
+ end
110
+ end
111
+ end
112
+
70
113
  end
71
114
  end
@@ -33,6 +33,14 @@ module KZ
33
33
  end
34
34
  @all_kz_pod_targets[native_pod_target_name] = kz_pod_target
35
35
 
36
+ if is_dev_pod && native_pod_target.test_dependent_targets_by_spec_name.count > 0
37
+ test_pod_targets = native_pod_target.test_dependent_targets_by_spec_name.values.flatten
38
+ test_pod_targets.each do |test_pod_target|
39
+ kz_test_pod_target = create_kz_pod_target_from(test_pod_target, :kz_pod_framework_mode)
40
+ @all_kz_pod_targets[test_pod_target.name] = kz_test_pod_target
41
+ end
42
+ end
43
+
36
44
  kz_dependent_target_info = {}
37
45
  native_pod_target.dependent_targets.each do |native_dependent_target|
38
46
  kz_dependent_pod_target = create_kz_pod_target_from(native_dependent_target, kz_pod_target.config_pod_mode)
@@ -30,7 +30,7 @@ module KZ
30
30
  @dependent_target_info = {}
31
31
  @repair_dependent_target_info = {}
32
32
  @repair_import = []
33
- @isDevPod = false
33
+ @is_dev_pod = false
34
34
  @config_pod_mode = :kz_pod_origin_mode
35
35
 
36
36
  native_pod_target.file_accessors.each do |file_accessor|
@@ -47,6 +47,8 @@ module KZ
47
47
 
48
48
  all_headers = []
49
49
  native_pod_target.file_accessors.each do |file_accessor|
50
+ next if file_accessor.spec.test_specification
51
+
50
52
  all_headers.concat(file_accessor.headers)
51
53
  end
52
54
 
@@ -59,8 +61,9 @@ module KZ
59
61
 
60
62
  public_headers = []
61
63
  native_pod_target.file_accessors.each do |file_accessor|
64
+ next if file_accessor.spec.test_specification
65
+
62
66
  public_headers.concat(file_accessor.origin_public_headers)
63
- public_headers.concat(file_accessor.vendored_frameworks_headers)
64
67
  end
65
68
 
66
69
  @_public_headers = public_headers
@@ -166,9 +169,23 @@ module KZ
166
169
  def pod_config_cache_path(concat_version)
167
170
  kz_target_framework_folder = KZ_POD_CONFIG_ROOT + @name
168
171
  kz_target_framework_folder += @version if concat_version
169
- FileUtils.mkdir_p(kz_target_framework_folder) unless File.exist?(kz_target_framework_folder)
172
+ FileUtils.mkdir_p(kz_target_framework_folder) unless File.exist?(kz_target_framework_folder) || concat_version
170
173
  Pathname(kz_target_framework_folder)
171
174
  end
172
175
 
176
+ def kz_module_name
177
+ return @native_pod_target.product_module_name unless all_headers.count > 0
178
+
179
+ one_header_path = all_headers.first.to_s
180
+ if one_header_path.include?('.framework')
181
+ one_header_path.split('/').each do |name|
182
+ if name.include?('.framework')
183
+ return name.split('.').first
184
+ end
185
+ end
186
+ end
187
+ return @native_pod_target.product_module_name
188
+ end
189
+
173
190
  end
174
191
  end
@@ -0,0 +1,373 @@
1
+ require_relative 'global_helper'
2
+
3
+ module KZ
4
+ class KZSwiftContext
5
+ def initialize(type_contexts)
6
+ @type_contexts = type_contexts
7
+ @type_ornament = []
8
+ @type_header = []
9
+ @type_str = ""
10
+ @type_body = []
11
+
12
+ if @type_contexts.length == 1
13
+ element = @type_contexts[0]
14
+ puts @type_contexts
15
+ @type_ornament = element.scan(/@\w+[()\w\n]*/)
16
+ element_info = element.split("{")
17
+ @type_str = element_info[0] + "{"
18
+ @type_body << element_info[1].sub("}", "")
19
+ else
20
+ # 1 从未扫描到class 2 扫描到class 3 class扫描完毕
21
+ type_line_tag = 1
22
+ type_lines = []
23
+ for type_line in @type_contexts
24
+ if type_line_tag == 1
25
+ ornaments = type_line.scan(/@\w+[()\w\n]*/)
26
+ @type_ornament.concat(ornaments) if ornaments.length > 0
27
+
28
+ result = yield(type_line)
29
+ if result
30
+ type_line_tag = 2
31
+ else
32
+ @type_header << type_line
33
+ next
34
+ end
35
+ end
36
+
37
+ if type_line_tag == 2
38
+ type_lines << type_line
39
+ if type_line.include?("{")
40
+ type_line_tag = 3
41
+ @type_str = type_lines.join("")
42
+ end
43
+ next
44
+ end
45
+
46
+ @type_body << type_line
47
+ end
48
+
49
+ last_element = @type_body[-1]
50
+ @type_body.pop()
51
+ @type_body << last_element.sub("}", "")
52
+ end
53
+ end
54
+
55
+ def get_oc_feature_contexts
56
+ @type_contexts
57
+ end
58
+
59
+ end
60
+
61
+ class KZSwiftParagraph < KZSwiftContext
62
+
63
+ def initialize(type_contexts, need_handle_func)
64
+ @type_contexts = type_contexts
65
+ @need_handle_func = need_handle_func
66
+ end
67
+
68
+ def get_oc_feature_contexts
69
+ if @need_handle_func
70
+ new_class_context = []
71
+
72
+ for context in @type_contexts
73
+ if context.include?("init()") && !context.include?("override")
74
+ context = context.sub("init()", "override init()")
75
+ context = context.sub("{", "{\nsuper.init()")
76
+ end
77
+ new_class_context << context
78
+ end
79
+ return new_class_context
80
+ else
81
+ return @type_contexts
82
+ end
83
+ end
84
+ end
85
+
86
+ class KZSwiftClass < KZSwiftContext
87
+
88
+ def initialize(type_contexts)
89
+ @system_nsobject_class = [
90
+ "NSObject"
91
+ ]
92
+
93
+ super(type_contexts) do |line|
94
+ KZSwiftClass.check_line_have_class_tag(line)
95
+ end
96
+ end
97
+
98
+ def self.check_line_have_class_tag(line)
99
+ if line =~ /^(?:.*\s)?class\s/ && !line.include?("func") && !line.include?("var") && !line.include?("let")
100
+ return true
101
+ else
102
+ return false
103
+ end
104
+ end
105
+
106
+ def get_oc_feature_contexts
107
+ new_class_context = []
108
+
109
+ # 获取类、父类、协议信息
110
+ class_name = ""
111
+ superClass_and_protocol = []
112
+
113
+ class_line = @type_str.gsub(/\s+/, "")
114
+ class_line = class_line.split("class")[1]
115
+ if class_line.include?(":")
116
+ colon_infos = class_line.split(":")
117
+ class_name = colon_infos[0]
118
+
119
+ colon_right = colon_infos[1]
120
+ colon_right = colon_right.sub("{", "")
121
+ superClass_and_protocol = colon_right.split(",")
122
+ else
123
+ class_name = class_line.sub("{", "")
124
+ end
125
+
126
+ return @type_contexts if class_name == ""
127
+
128
+ # 获取oc特性标识
129
+ have_super_class = false
130
+ if superClass_and_protocol.length > 0
131
+ have_super_class = !superClass_and_protocol[0].end_with?("Protocol")
132
+ end
133
+
134
+ have_objc_class = false
135
+ have_objc_members = false
136
+ for ornament in @type_ornament
137
+ if ornament.start_with?("@objc ") || ornament.start_with?("@objc(") || ornament == "@objc" || ornament == "@objc\n"
138
+ have_objc_class = true
139
+ end
140
+ have_objc_members = true if ornament.start_with?("@objcMembers")
141
+ end
142
+
143
+ # 添加class ornament
144
+ new_class_context.concat(@type_header)
145
+
146
+ if !have_objc_members
147
+ new_class_context.insert(0, "@objcMembers\n")
148
+ end
149
+
150
+ if !have_objc_class && !have_super_class
151
+ new_class_context.insert(0, "@objc\n")
152
+ end
153
+
154
+ # 添加class header
155
+ if !have_objc_class && !have_super_class
156
+ if superClass_and_protocol.length > 0
157
+ if !@system_nsobject_class.include?(superClass_and_protocol[0])
158
+ @type_str = @type_str.sub(":", ": NSObject,")
159
+ end
160
+ else
161
+ @type_str = @type_str.sub("{", ": NSObject {")
162
+ end
163
+ end
164
+ new_class_context << @type_str
165
+
166
+ # 添加class body
167
+ new_swift_types = KZSwiftFileAnalyse.analyse_swift_file(@type_body, !have_super_class)
168
+ new_swift_types.each do |swift_type|
169
+ new_class_context.concat(swift_type.get_oc_feature_contexts())
170
+ end
171
+ new_class_context << "}\n"
172
+
173
+ new_class_context
174
+ end
175
+ end
176
+
177
+ class KZSwiftEnum < KZSwiftContext
178
+
179
+ def initialize(type_contexts)
180
+ super(type_contexts) do |line|
181
+ return KZSwiftEnum.check_line_have_enum_tag(line)
182
+ end
183
+ end
184
+
185
+ def self.check_line_have_enum_tag(line)
186
+ if line =~ /^(?:.*\s)?enum\s/
187
+ return true
188
+ else
189
+ return false
190
+ end
191
+ end
192
+
193
+ def get_oc_feature_contexts
194
+ new_enum_context = []
195
+
196
+ have_objc_tag = false
197
+ for ornament in @type_ornament
198
+ if ornament.start_with?("@objc ") || ornament.start_with?("@objc(") || ornament == "@objc"
199
+ have_objc_tag = true
200
+ end
201
+ end
202
+
203
+ return @type_contexts if have_objc_tag
204
+
205
+ for enum_line in @type_contexts
206
+ if KZSwiftEnum.check_line_have_enum_tag(enum_line)
207
+ raw_value_type = ""
208
+ raw_value_type = $1 if enum_line =~ /^.*:\s*(\w+)\s*{/
209
+
210
+ if raw_value_type == "Int"
211
+ new_enum_context.insert(0, "@objc\n")
212
+ else
213
+ return @type_contexts
214
+ end
215
+ end
216
+ new_enum_context << enum_line
217
+ end
218
+
219
+ new_enum_context
220
+ end
221
+ end
222
+
223
+ class KZSwiftFileAnalyse
224
+ def self.analyse_swift_file(swift_files, need_handle_func)
225
+ swift_types = []
226
+
227
+ cursor_index = 0
228
+ swift_files.each_with_index do |line, index|
229
+ next if line.start_with?("//")
230
+ next if index < cursor_index
231
+
232
+ if KZSwiftClass.check_line_have_class_tag(line)
233
+ class_begin_line = find_type_begin_index(index, cursor_index, swift_files)
234
+ class_end_line = find_type_end_index(index, swift_files)
235
+
236
+ # 封装无关代码
237
+ if class_begin_line > cursor_index
238
+ contexts = swift_files[cursor_index...class_begin_line]
239
+ swift_types << KZSwiftParagraph.new(contexts, need_handle_func)
240
+ end
241
+
242
+ # 封装类代码
243
+ contexts = swift_files[class_begin_line..class_end_line]
244
+ swift_types << KZSwiftClass.new(contexts)
245
+
246
+ # 更新游标
247
+ cursor_index = class_end_line + 1
248
+ elsif KZSwiftEnum.check_line_have_enum_tag(line)
249
+ enum_begin_line = find_type_begin_index(index, cursor_index, swift_files)
250
+ enum_end_line = find_type_end_index(index, swift_files)
251
+
252
+ # 封装无关代码
253
+ if enum_begin_line > cursor_index
254
+ contexts = swift_files[cursor_index...enum_begin_line]
255
+ swift_types << KZSwiftParagraph.new(contexts, need_handle_func)
256
+ end
257
+
258
+ # 封装枚举代码
259
+ contexts = swift_files[enum_begin_line..enum_end_line]
260
+ swift_types << KZSwiftEnum.new(contexts)
261
+
262
+ # 更新游标
263
+ cursor_index = enum_end_line + 1
264
+ end
265
+ end
266
+
267
+ # 封装无关代码
268
+ if cursor_index < swift_files.length
269
+ contexts = swift_files[cursor_index...swift_files.length]
270
+ swift_types << KZSwiftParagraph.new(contexts, need_handle_func)
271
+ end
272
+
273
+ swift_types
274
+ end
275
+
276
+ def self.find_type_begin_index(current_index, cursor_index, swift_files)
277
+ class_begin_line = current_index
278
+ if current_index > 0
279
+ (cursor_index...current_index).reverse_each do |_index|
280
+ previous_line = swift_files[_index].lstrip
281
+
282
+ next if previous_line == ""
283
+
284
+ if previous_line.start_with?("@")
285
+ class_begin_line = _index
286
+ else
287
+ break
288
+ end
289
+ end
290
+ end
291
+ class_begin_line
292
+ end
293
+
294
+ def self.find_type_end_index(current_index, swift_files)
295
+ class_end_line = current_index
296
+ if current_index < swift_files.length
297
+ left_bracket_count = -1
298
+ (current_index...swift_files.length).each do |_index|
299
+ next_line = swift_files[_index]
300
+
301
+ left_brackets = next_line.scan(/{/)
302
+ right_brackets = next_line.scan(/}/)
303
+
304
+ if left_brackets.length > 0
305
+ left_bracket_count = 0 if left_bracket_count == -1
306
+ left_bracket_count += left_brackets.length
307
+ end
308
+
309
+ if right_brackets.length > 0
310
+ left_bracket_count -= right_brackets.length
311
+
312
+ if left_bracket_count == 0
313
+ class_end_line = _index
314
+ break
315
+ end
316
+ end
317
+ end
318
+ end
319
+ class_end_line
320
+ end
321
+ end
322
+
323
+ class KZSwiftAttachOCFeature
324
+
325
+ def initialize
326
+ @all_kz_pod_targets = KZ::KZGlobalHelper.instance.kz_analyzer.all_kz_pod_targets
327
+ @specify_pod_names = KZ::KZGlobalHelper.instance.specify_pod_names
328
+ end
329
+
330
+ def repair
331
+ @all_kz_pod_targets.values.each do |kz_pod_target|
332
+ next unless kz_pod_target.is_dev_pod
333
+ next if @specify_pod_names.count > 0 && !@specify_pod_names.include?(kz_pod_target.name)
334
+
335
+ need_repair_files = []
336
+ kz_pod_target.native_pod_target.file_accessors.each do |file_accessor|
337
+ next if file_accessor.spec.test_specification
338
+
339
+ file_accessor.source_files.each do |source_file|
340
+ if source_file.extname == ".swift"
341
+ need_repair_files << source_file
342
+ end
343
+ end
344
+ end
345
+
346
+ puts "Start reair '#{kz_pod_target.name}' swfit files..."
347
+ need_repair_files.each do |swift_file_path|
348
+ swift_file = File.open(swift_file_path, 'r')
349
+ swift_files = swift_file.readlines
350
+ swift_file.close
351
+ swift_types = KZSwiftFileAnalyse.analyse_swift_file(swift_files, false)
352
+
353
+ new_swift_contexts = []
354
+ swift_types.each do |swift_type|
355
+ new_swift_contexts.concat(swift_type.get_oc_feature_contexts())
356
+ end
357
+ # puts new_swift_contexts
358
+ write_swift_file(swift_file_path, new_swift_contexts)
359
+ end
360
+ end
361
+
362
+ end
363
+
364
+ def write_swift_file(file_path, contexts)
365
+ swift_file = File.open(file_path, 'w')
366
+ contexts.each do |new_line|
367
+ swift_file.write(new_line)
368
+ end
369
+ swift_file.close
370
+ end
371
+
372
+ end
373
+ end
@@ -0,0 +1,122 @@
1
+ require_relative 'global_helper'
2
+
3
+ module KZ
4
+ class KZRepairModuleImport
5
+ def initialize(main_project)
6
+ @main_project = main_project
7
+ @all_kz_pod_targets = KZ::KZGlobalHelper.instance.kz_analyzer.all_kz_pod_targets
8
+ @specify_pod_names = KZ::KZGlobalHelper.instance.specify_pod_names
9
+ end
10
+
11
+ def repair
12
+ if @specify_pod_names.count == 0
13
+ main_project_file_folder = @main_project.project_dir + @main_project.root_object.display_name
14
+ main_project_files = []
15
+ main_project_headers = []
16
+ Dir.glob(File.join(main_project_file_folder, '**', '*')).each do |file|
17
+ if File.file?(file) and (file.end_with?(".h") or file.end_with?(".m"))
18
+ if file.end_with?(".h")
19
+ main_project_headers << Pathname.new(file)
20
+ main_project_files << Pathname.new(file)
21
+ elsif file.end_with?(".m")
22
+ main_project_files << Pathname.new(file)
23
+ end
24
+ end
25
+ end
26
+ puts "Start reair main project..."
27
+ main_project_files.each do |file_path|
28
+ repair_file(file_path, main_project_headers)
29
+ end
30
+
31
+ @all_kz_pod_targets.values.each do |kz_pod_target|
32
+ next unless kz_pod_target.is_dev_pod
33
+
34
+ puts "Start reair '#{kz_pod_target.name}' header files..."
35
+ kz_pod_target.all_headers.each do |header_path|
36
+ repair_file(header_path, kz_pod_target.all_headers, kz_pod_target.recursive_dependent_targets)
37
+ end
38
+ end
39
+ else
40
+ @all_kz_pod_targets.values.each do |kz_pod_target|
41
+ next unless kz_pod_target.is_dev_pod
42
+ next unless @specify_pod_names.include?(kz_pod_target.name)
43
+
44
+ need_repair_files = []
45
+ kz_pod_target.native_pod_target.file_accessors.each do |file_accessor|
46
+ next if file_accessor.spec.test_specification
47
+
48
+ file_accessor.source_files.each do |source_file|
49
+ if [".h", ".m", ".mm"].include?(source_file.extname)
50
+ need_repair_files << source_file
51
+ end
52
+ end
53
+ end
54
+
55
+ puts "Start reair '#{kz_pod_target.name}' files..."
56
+ need_repair_files.each do |file_path|
57
+ repair_file(file_path, kz_pod_target.all_headers, kz_pod_target.recursive_dependent_targets)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ def repair_file(file_path, current_module_headers, sub_pods = nil)
64
+ new_header_content = []
65
+
66
+ file = File.open(file_path)
67
+ contents = file.readlines
68
+ file.close
69
+
70
+ contents.each do |line|
71
+ if line =~ /#import\s*["<]([a-zA-Z\+]+\.h)[">]/
72
+ heaer_name = $1
73
+ other_module_name = find_other_module_name(heaer_name, current_module_headers, sub_pods)
74
+ if other_module_name
75
+ if other_module_name == ""
76
+ new_header_content << line
77
+ else
78
+ new_header_content << "#import <#{other_module_name}/#{heaer_name}>\n"
79
+ end
80
+ else
81
+ new_header_content << "#warning '#{heaer_name}' is not included in the current pod or its subpods\n"
82
+ new_header_content << line
83
+ end
84
+ else
85
+ new_header_content << line
86
+ end
87
+ end
88
+ write_swift_file(file_path, new_header_content)
89
+ end
90
+
91
+ def write_swift_file(file_path, contexts)
92
+ swift_file = File.open(file_path, 'w')
93
+ contexts.each do |new_line|
94
+ swift_file.write(new_line)
95
+ end
96
+ swift_file.close
97
+ end
98
+
99
+ def find_other_module_name(header_name, current_module_headers, sub_pods)
100
+ current_module_headers.each do |header_path|
101
+ if header_path.basename.to_s == header_name
102
+ return ""
103
+ end
104
+ end
105
+
106
+ if sub_pods == nil
107
+ sub_pods = @all_kz_pod_targets.values
108
+ end
109
+ sub_pods.each do |sub_kz_pod_target|
110
+ sub_headers = sub_kz_pod_target.all_headers
111
+ sub_headers.each do |header_path|
112
+ if header_path.basename.to_s == header_name
113
+ return sub_kz_pod_target.kz_module_name
114
+ end
115
+ end
116
+ end
117
+
118
+ return nil
119
+ end
120
+
121
+ end
122
+ end
@@ -39,7 +39,11 @@ fi}
39
39
 
40
40
  def config_project
41
41
  @pod_project.targets.each do |target|
42
- if target.isa == "PBXNativeTarget" && target.product_type == "com.apple.product-type.framework" && target.name.start_with?("SP")
42
+ if target.isa == "PBXNativeTarget" && target.product_type == "com.apple.product-type.framework"
43
+ kz_pod_target = KZGlobalHelper.instance.kz_analyzer.all_kz_pod_targets[target.name]
44
+ next unless kz_pod_target
45
+ next unless kz_pod_target.is_dev_pod
46
+
43
47
  target.build_configurations.each do |config|
44
48
  config.build_settings["KZ_XML_FLEX_COMPILER"] = FLEX_COMPLIER_PATH.to_s
45
49
  config.build_settings["KZ_XML_FLEX_DIR"] = "${TARGET_TEMP_DIR}/XmlFlexs"
@@ -3,23 +3,16 @@ require 'cocoapods-kz/native/acknowledgements'
3
3
  module Pod
4
4
  module Generator
5
5
  class Acknowledgements
6
+
7
+ alias_method :origin_license_text, :license_text
6
8
  def license_text(spec)
7
- return nil unless spec.license
8
- text = spec.license[:text]
9
- unless text
10
- if license_file = spec.license[:file]
11
- license_path = file_accessor(spec).root + license_file
12
- if File.exist?(license_path)
13
- text = IO.read(license_path)
14
- else
15
- # UI.warn "Unable to read the license file `#{license_file}` " \
16
- # "for the spec `#{spec}`"
17
- end
18
- elsif license_file = file_accessor(spec).license
19
- text = IO.read(license_file)
20
- end
9
+ if KZ::KZGlobalHelper.instance.kz_pod_enable
10
+ return nil unless spec.license
11
+ text = spec.license[:text]
12
+ text
13
+ else
14
+ origin_license_text(spec)
21
15
  end
22
- text
23
16
  end
24
17
  end
25
18
  end
@@ -7,13 +7,11 @@ module Pod
7
7
 
8
8
  def generate_targets(resolver_specs_by_target, target_inspections)
9
9
  aggregate_targets, pod_targets = original_generate_targets(resolver_specs_by_target, target_inspections)
10
-
11
- if KZ::KZGlobalHelper.instance.kz_pod_enable
10
+ if KZ::KZGlobalHelper.instance.generate_kz_pod_targets
12
11
  kz_analyer = KZ::KZAnalyzer.new(pod_targets, self.sandbox.development_pods)
13
12
  kz_analyer.analyer
14
13
  KZ::KZGlobalHelper.instance.kz_analyzer = kz_analyer
15
14
  end
16
-
17
15
  [aggregate_targets, pod_targets]
18
16
  end
19
17
 
@@ -8,7 +8,7 @@ module Pod
8
8
 
9
9
  alias_method :origin_public_headers, :public_headers
10
10
  def public_headers(include_frameworks = false)
11
- if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
11
+ if !self.spec.test_specification && KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
12
12
  []
13
13
  else
14
14
  origin_public_headers(include_frameworks)
@@ -16,7 +16,7 @@ module Pod
16
16
  end
17
17
 
18
18
  def project_headers
19
- if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
19
+ if !self.spec.test_specification && KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
20
20
  []
21
21
  else
22
22
  project_header_files
@@ -24,7 +24,7 @@ module Pod
24
24
  end
25
25
 
26
26
  def private_headers
27
- if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
27
+ if !self.spec.test_specification && KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
28
28
  []
29
29
  else
30
30
  private_header_files
@@ -33,7 +33,7 @@ module Pod
33
33
 
34
34
  alias_method :origin_source_files, :source_files
35
35
  def source_files
36
- if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
36
+ if !self.spec.test_specification && KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
37
37
  []
38
38
  else
39
39
  origin_source_files
@@ -42,7 +42,7 @@ module Pod
42
42
 
43
43
  alias_method :origin_arc_source_files, :arc_source_files
44
44
  def arc_source_files
45
- if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
45
+ if !self.spec.test_specification && KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
46
46
  []
47
47
  else
48
48
  origin_arc_source_files
@@ -51,7 +51,7 @@ module Pod
51
51
 
52
52
  alias_method :origin_resource_bundles, :resource_bundles
53
53
  def resource_bundles
54
- if KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
54
+ if !self.spec.test_specification && KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
55
55
  {}
56
56
  else
57
57
  origin_resource_bundles
@@ -61,7 +61,7 @@ module Pod
61
61
  alias_method :origin_resources, :resources
62
62
  def resources
63
63
  result = KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
64
- if result
64
+ if !self.spec.test_specification && result
65
65
  resources = origin_resources
66
66
  resources.concat(result.get_bundle_paths)
67
67
  resources
@@ -73,7 +73,7 @@ module Pod
73
73
  alias_method :origin_vendored_frameworks, :vendored_frameworks
74
74
  def vendored_frameworks
75
75
  result = KZ::KZGlobalHelper.instance.pod_config_result_with_target(self.kz_pod_target)
76
- if result
76
+ if !self.spec.test_specification && result
77
77
  frameworks = origin_vendored_frameworks
78
78
  frameworks.concat(result.get_framework_paths)
79
79
  frameworks
@@ -14,21 +14,23 @@ module Pod
14
14
  main_project = self.aggregate_targets.first.user_project
15
15
  pods_project = self.pods_project
16
16
 
17
- puts 'Config Xml Build Rules'
18
- KZ::XmlBuildConfig.new(main_project, pods_project).config_project
17
+ puts 'Start KZPlugin Config'
18
+ if KZ::KZGlobalHelper.instance.have_flexLib_pod_target
19
+ KZ::XmlBuildConfig.new(main_project, pods_project).config_project
20
+ end
19
21
 
20
- puts 'Config Framework Strip'
21
22
  KZ::StripFrameworkConfig.new(main_project, pods_project).config_project
22
23
 
23
- puts 'Config Framework Build'
24
- KZ::BuildFrameworkConfig.new(main_project, pods_project).config_project
24
+ unless KZ::KZGlobalHelper.instance.disable_generate_framework
25
+ KZ::BuildFrameworkConfig.new(main_project, pods_project).config_project
26
+ end
25
27
 
26
- puts 'Config Hmap'
27
28
  KZ::CreateHmap.new(main_project, pods_project).config_project
28
29
 
29
30
  main_project.save
30
31
  pods_project.save
31
- puts 'Config Done'
32
+
33
+ KZ::KZGlobalHelper.instance.write_lock_file
32
34
  end
33
35
  end
34
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-kz
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - yixiong
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-09 00:00:00.000000000 Z
11
+ date: 2023-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: A short description of cocoapods-kz.
41
+ description: Kanzhun's cocoapods manage tools.
42
42
  email:
43
43
  - yixiong@kanzhun.com
44
44
  executables: []
@@ -49,6 +49,7 @@ files:
49
49
  - lib/cocoapods-kz/command.rb
50
50
  - lib/cocoapods-kz/command/install.rb
51
51
  - lib/cocoapods-kz/command/kz.rb
52
+ - lib/cocoapods-kz/command/repair.rb
52
53
  - lib/cocoapods-kz/command/update.rb
53
54
  - lib/cocoapods-kz/gem_version.rb
54
55
  - lib/cocoapods-kz/helpers/build_framework_config.rb
@@ -58,6 +59,8 @@ files:
58
59
  - lib/cocoapods-kz/helpers/kz_config_result.rb
59
60
  - lib/cocoapods-kz/helpers/kz_framework_manager.rb
60
61
  - lib/cocoapods-kz/helpers/kz_pod_target.rb
62
+ - lib/cocoapods-kz/helpers/repair_dynamic_swift.rb
63
+ - lib/cocoapods-kz/helpers/repair_module_import.rb
61
64
  - lib/cocoapods-kz/helpers/strip_framework_config.rb
62
65
  - lib/cocoapods-kz/helpers/xml_build_config.rb
63
66
  - lib/cocoapods-kz/native.rb
@@ -92,5 +95,5 @@ requirements: []
92
95
  rubygems_version: 3.4.13
93
96
  signing_key:
94
97
  specification_version: 4
95
- summary: A longer description of cocoapods-kz.
98
+ summary: Kanzhun's cocoapods manage tools.
96
99
  test_files: []