pindo 5.13.1 → 5.13.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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +692 -0
  3. data/lib/pindo/command/android/autobuild.rb +2 -2
  4. data/lib/pindo/command/appstore/adhocbuild.rb +256 -311
  5. data/lib/pindo/command/appstore/autobuild.rb +203 -0
  6. data/lib/pindo/command/appstore/autoresign.rb +35 -17
  7. data/lib/pindo/command/appstore/bundleid.rb +120 -0
  8. data/lib/pindo/command/appstore/cert.rb +212 -0
  9. data/lib/pindo/command/appstore/configproj.rb +81 -0
  10. data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
  11. data/lib/pindo/command/appstore/iap.rb +788 -24
  12. data/lib/pindo/command/appstore/initconfig.rb +105 -0
  13. data/lib/pindo/command/appstore/itcapp.rb +95 -13
  14. data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
  15. data/lib/pindo/command/appstore/pem.rb +136 -0
  16. data/lib/pindo/command/appstore/pullconfig.rb +99 -0
  17. data/lib/pindo/command/appstore/quswark.rb +87 -0
  18. data/lib/pindo/command/appstore/quswauth.rb +67 -0
  19. data/lib/pindo/command/appstore/tag.rb +77 -0
  20. data/lib/pindo/command/appstore.rb +13 -1
  21. data/lib/pindo/command/env/quarkenv.rb +11 -13
  22. data/lib/pindo/command/env/swarkenv.rb +11 -16
  23. data/lib/pindo/command/ios/applovin.rb +24 -182
  24. data/lib/pindo/command/ios/autobuild.rb +64 -43
  25. data/lib/pindo/command/ios/autoresign.rb +34 -19
  26. data/lib/pindo/command/ios/build.rb +9 -6
  27. data/lib/pindo/command/ios/cert.rb +27 -20
  28. data/lib/pindo/command/ios/podupdate.rb +6 -37
  29. data/lib/pindo/command/jps/upload.rb +3 -3
  30. data/lib/pindo/command/unity/autobuild.rb +2 -2
  31. data/lib/pindo/command/utils/clearcert.rb +2 -17
  32. data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
  33. data/lib/pindo/command/utils/renewcert.rb +62 -38
  34. data/lib/pindo/command/utils/renewproj.rb +0 -3
  35. data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
  36. data/lib/pindo/command/utils.rb +2 -0
  37. data/lib/pindo/command/web/autobuild.rb +2 -2
  38. data/lib/pindo/command.rb +30 -3
  39. data/lib/pindo/config/build_info_manager.rb +176 -0
  40. data/lib/pindo/config/ios_config_parser.rb +404 -0
  41. data/lib/pindo/module/android/android_config_helper.rb +9 -5
  42. data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
  43. data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
  44. data/lib/pindo/module/build/build_helper.rb +12 -0
  45. data/lib/pindo/module/build/swark_helper.rb +116 -77
  46. data/lib/pindo/module/cert/cert_helper.rb +74 -0
  47. data/lib/pindo/module/cert/pem_helper.rb +72 -0
  48. data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +211 -6
  49. data/lib/pindo/module/pgyer/pgyerhelper.rb +13 -5
  50. data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
  51. data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
  52. data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
  53. data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
  54. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
  55. data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
  56. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
  57. data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
  58. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +342 -0
  59. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +341 -0
  60. data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +40 -59
  61. data/lib/pindo/module/task/model/build/ios_build_task.rb +23 -0
  62. data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
  63. data/lib/pindo/module/task/model/build_task.rb +15 -12
  64. data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
  65. data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
  66. data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
  67. data/lib/pindo/module/unity/unity_helper.rb +2 -1
  68. data/lib/pindo/module/xcode/applovin_xcode_helper.rb +271 -0
  69. data/lib/pindo/module/xcode/cocoapods_helper.rb +153 -0
  70. data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
  71. data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
  72. data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
  73. data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
  74. data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
  75. data/lib/pindo/options/core/global_options_state.rb +268 -0
  76. data/lib/pindo/options/core/option_configuration.rb +206 -0
  77. data/lib/pindo/options/core/option_initializer.rb +51 -0
  78. data/lib/pindo/options/core/option_item.rb +144 -0
  79. data/lib/pindo/options/core/option_value_parser.rb +54 -0
  80. data/lib/pindo/options/groups/build_options.rb +60 -0
  81. data/lib/pindo/options/groups/jps_options.rb +70 -0
  82. data/lib/pindo/options/groups/option_group.rb +73 -0
  83. data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
  84. data/lib/pindo/options/options.rb +14 -0
  85. data/lib/pindo/version.rb +1 -1
  86. metadata +51 -40
  87. data/lib/pindo/command/appstore/import.rb +0 -259
  88. data/lib/pindo/command/deploy/build.rb +0 -250
  89. data/lib/pindo/command/deploy/bundleid.rb +0 -259
  90. data/lib/pindo/command/deploy/cert.rb +0 -202
  91. data/lib/pindo/command/deploy/check.rb +0 -93
  92. data/lib/pindo/command/deploy/configproj.rb +0 -120
  93. data/lib/pindo/command/deploy/confusecode.rb +0 -262
  94. data/lib/pindo/command/deploy/confuseproj.rb +0 -122
  95. data/lib/pindo/command/deploy/iap.rb +0 -826
  96. data/lib/pindo/command/deploy/initconfig.rb +0 -138
  97. data/lib/pindo/command/deploy/itcapp.rb +0 -146
  98. data/lib/pindo/command/deploy/pem.rb +0 -55
  99. data/lib/pindo/command/deploy/pullconfig.rb +0 -56
  100. data/lib/pindo/command/deploy/pushconfig.rb +0 -93
  101. data/lib/pindo/command/deploy/quswark.rb +0 -156
  102. data/lib/pindo/command/deploy/quswauth.rb +0 -76
  103. data/lib/pindo/command/deploy/reportbug.rb +0 -145
  104. data/lib/pindo/command/deploy/resign.rb +0 -300
  105. data/lib/pindo/command/deploy/tag.rb +0 -108
  106. data/lib/pindo/command/deploy/uploadipa.rb +0 -73
  107. data/lib/pindo/command/deploy.rb +0 -42
  108. data/lib/pindo/command/dev/autobuild.rb +0 -117
  109. data/lib/pindo/command/dev/build.rb +0 -94
  110. data/lib/pindo/command/dev/debug.rb +0 -112
  111. data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
  112. data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
  113. data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
  114. data/lib/pindo/options/appconfigoptions.rb +0 -24
  115. data/lib/pindo/options/deployoptions.rb +0 -372
@@ -0,0 +1,105 @@
1
+ require 'fileutils'
2
+ require 'pindo/options/options'
3
+ require 'pindo/config/build_info_manager'
4
+
5
+ module Pindo
6
+ class Command
7
+ class Appstore < Command
8
+
9
+ class Initconfig < Appstore
10
+
11
+ # 命令的简要说明 - 创建应用配置仓库
12
+ self.summary = '创建应用配置仓库(在Gitee上创建并初始化)'
13
+
14
+ # 命令的详细说明,包含用法示例
15
+ self.description = <<-DESC
16
+ 在Gitee上创建新的应用配置仓库,并从模板仓库复制配置文件结构。
17
+
18
+ 支持功能:
19
+
20
+ * 在Gitee上创建新的应用配置仓库
21
+
22
+ * 从模板仓库复制配置文件结构
23
+
24
+ * 支持测试环境和生产环境仓库创建
25
+
26
+ * 自动替换配置文件中的Bundle ID
27
+
28
+ * 支持位置参数(向后兼容)和选项参数两种格式
29
+
30
+ 使用示例:
31
+
32
+ $ pindo appstore initconfig com.example.app # 位置参数(向后兼容)
33
+
34
+ $ pindo appstore initconfig --bundleid=com.example.app # 选项参数
35
+
36
+ $ pindo appstore initconfig com.example.app --test # 创建测试环境仓库
37
+
38
+ $ pindo appstore initconfig --bundleid=com.example.app --test # 选项参数 + 测试环境
39
+
40
+ $ pindo appstore initconfig # 交互式输入Bundle ID
41
+
42
+ $ PINDO_BUNDLE_ID=com.example.app pindo appstore initconfig # 使用环境变量
43
+ DESC
44
+
45
+ # 定义位置参数(向后兼容)
46
+ self.arguments = [
47
+ CLAide::Argument.new('bundleid', true)
48
+ ]
49
+
50
+ # 定义此命令使用的参数项
51
+ def self.option_items
52
+ @option_items ||= Pindo::Options::BuildOptions.select(:bundleid)
53
+ end
54
+
55
+ # 命令的选项列表
56
+ def self.options
57
+ [
58
+ ['--test', '创建测试环境仓库']
59
+ ].concat(option_items.map { |item| item.to_claide_option }).concat(super)
60
+ end
61
+
62
+ def initialize(argv)
63
+ # 首先获取位置参数(向后兼容)
64
+ positional_bundleid = argv.shift_argument
65
+
66
+ # 获取 test 标志
67
+ @test_flag = argv.flag?('test', false)
68
+
69
+ # 使用 Options 模块初始化参数
70
+ @options = initialize_options(argv)
71
+
72
+ # 优先使用选项参数,如果没有则使用位置参数
73
+ @bundle_id = @options[:bundleid] || positional_bundleid
74
+
75
+ super
76
+ @additional_args = argv.remainder!
77
+ end
78
+
79
+ def validate!
80
+ super
81
+
82
+ # 如果没有提供 bundleid,提示用户输入
83
+ if @bundle_id.nil? || @bundle_id.empty?
84
+ require 'highline/import'
85
+ cli = HighLine.new
86
+ say "需要输入仓库名称,默认以 Bundle ID 作为仓库名称"
87
+ @bundle_id = cli.ask('请输入 Bundle ID: ')
88
+ end
89
+
90
+ help! '需要提供 Bundle ID' if @bundle_id.nil? || @bundle_id.empty?
91
+ end
92
+
93
+ def run
94
+ # 使用 BuildInfoManager 创建配置仓库
95
+ build_info_manager = Pindo::BuildInfoManager.share_instance
96
+ build_info_manager.create_appconfig_with_bundleid(
97
+ bundle_id: @bundle_id,
98
+ test_flag: @test_flag
99
+ )
100
+ end
101
+
102
+ end
103
+ end
104
+ end
105
+ end
@@ -1,52 +1,134 @@
1
1
  require 'highline/import'
2
- require 'xcodeproj'
3
- require 'find'
4
2
  require 'fileutils'
3
+ require 'json'
4
+ require 'pindo/options/options'
5
+ require 'pindo/module/appstore/itcapp_helper'
5
6
 
6
7
  module Pindo
7
8
  class Command
8
9
  class Appstore < Command
9
10
  class Itcapp < Appstore
10
11
 
12
+ # 命令的简要说明 - 在App Store Connect中创建App
13
+ self.summary = '在App Store Connect中创建App'
11
14
 
12
- self.summary = 'Appstore中创建app'
13
-
15
+ # 命令的详细说明,包含用法示例
14
16
  self.description = <<-DESC
15
- Appstore中创建app。
17
+ 根据config.json中的配置, 在App Store Connect中创建应用。
16
18
 
17
19
  支持功能:
18
20
 
19
21
  * 在App Store Connect创建新应用
20
22
 
23
+ * 自动生成SKU ID
24
+
21
25
  * 配置应用基本信息
22
26
 
23
- * 设置应用权限
27
+ * 自动更新config.json中的App ID
28
+
29
+ * 支持位置参数(向后兼容)和选项参数两种格式
24
30
 
25
31
  使用示例:
26
32
 
27
- $ pindo appstore itcapp # 使用默认配置创建app
33
+ $ pindo appstore itcapp # 使用当前目录的config.json
34
+
35
+ $ pindo appstore itcapp config.json # 位置参数(向后兼容)
36
+
37
+ $ pindo appstore itcapp --config=config.json # 选项参数
28
38
 
29
- $ pindo appstore itcapp config.json # 使用指定配置文件创建app
39
+ $ pindo appstore itcapp --num=1.0.0 # 指定版本号
40
+
41
+ $ pindo appstore itcapp --com="My Company" # 指定公司名称
42
+
43
+ $ pindo appstore itcapp --config=config.json --num=1.0.0 --com="My Company"
30
44
  DESC
31
45
 
46
+ # 定义位置参数(向后兼容)
32
47
  self.arguments = [
33
- CLAide::Argument.new('path/to/config.json', false),
48
+ CLAide::Argument.new('path/to/config.json', true)
34
49
  ]
35
50
 
36
- def self.options
37
- [
51
+ # 定义此命令使用的参数项(类方法,避免重复定义)
52
+ def self.option_items
53
+ @option_items ||= [
54
+ Pindo::Options::OptionItem.new(
55
+ key: :config,
56
+ description: '指定config.json文件路径',
57
+ type: String,
58
+ optional: true,
59
+ example: 'pindo appstore itcapp --config=config.json'
60
+ ),
61
+ Pindo::Options::OptionItem.new(
62
+ key: :num,
63
+ description: '指定应用版本号',
64
+ type: String,
65
+ optional: true,
66
+ example: 'pindo appstore itcapp --num=1.0.0'
67
+ ),
68
+ Pindo::Options::OptionItem.new(
69
+ key: :com,
70
+ description: '指定公司名称',
71
+ type: String,
72
+ optional: true,
73
+ example: 'pindo appstore itcapp --com="My Company"'
74
+ )
75
+ ]
76
+ end
38
77
 
39
- ].concat(super)
78
+ # 命令的选项列表
79
+ def self.options
80
+ # 转换为 CLAide 格式
81
+ option_items.map { |item| item.to_claide_option }.concat(super)
40
82
  end
41
83
 
42
84
  def initialize(argv)
85
+ # 首先获取位置参数(向后兼容)
86
+ positional_config = argv.shift_argument
87
+
88
+ # 使用 Options 模块初始化参数
89
+ @options = initialize_options(argv)
90
+
91
+ # 优先使用选项参数,如果没有则使用位置参数,最后默认为当前目录的config.json
92
+ @config_path = @options[:config] || positional_config || File.join(Dir.pwd, 'config.json')
93
+ @app_version = @options[:num]
94
+ @company_name = @options[:com]
95
+
96
+ puts "@app_version = #{@app_version}" if @app_version
43
97
 
44
98
  super
99
+ @additional_args = argv.remainder!
45
100
  end
46
101
 
102
+ def validate!
103
+ super
47
104
 
48
- def run
105
+ # 检查 config.json 文件是否存在
106
+ unless File.exist?(@config_path)
107
+ help! "配置文件不存在: #{@config_path}"
108
+ end
109
+
110
+ # 读取并解析 config.json
111
+ begin
112
+ @config_json = JSON.parse(File.read(@config_path))
113
+ rescue JSON::ParserError => e
114
+ help! "配置文件格式错误: #{e.message}"
115
+ end
116
+ end
49
117
 
118
+ def run
119
+ # 调用 ItcAppHelper 执行 iTunes Connect App 创建流程
120
+ begin
121
+ Pindo::ItcAppHelper.execute_itcapp_creation(
122
+ config_json: @config_json,
123
+ config_path: @config_path,
124
+ app_version: @app_version,
125
+ company_name: @company_name
126
+ )
127
+ puts "\n✓ iTunes Connect App 创建完成!"
128
+ rescue StandardError => e
129
+ puts "\n❌ iTunes Connect App 创建失败: #{e.message}"
130
+ raise e
131
+ end
50
132
  end
51
133
 
52
134
  end
@@ -4,19 +4,15 @@ require 'find'
4
4
  require 'fileutils'
5
5
  require "fastimage"
6
6
  require 'deliver'
7
-
7
+ require 'pindo/config/ios_config_parser'
8
8
 
9
9
  module Pindo
10
10
  class Command
11
- class Deploy < Command
12
- class Itcinfo < Deploy
13
-
14
- include Command::DeployOptions
11
+ class Appstore < Command
12
+ class Itcinfo < Appstore
15
13
 
16
- include XcodeCertHelper
17
14
  include AppstoreMetadataConnectApiHelper
18
15
 
19
-
20
16
  self.summary = '更新AppStore中的App信息'
21
17
 
22
18
  self.description = <<-DESC
@@ -28,68 +24,79 @@ module Pindo
28
24
  - 同步和覆盖现有截图
29
25
 
30
26
  使用示例:
31
- pindo deploy itcinfo path/to/config.json --metadata
32
- pindo deploy itcinfo path/to/config.json --screenshots
33
- pindo deploy itcinfo path/to/config.json --metadata --screenshots
34
- pindo deploy itcinfo path/to/config.json --screenshots --overwrite
27
+ pindo appstore itcinfo --metadata
28
+ pindo appstore itcinfo --screenshots
29
+ pindo appstore itcinfo --metadata --screenshots
30
+ pindo appstore itcinfo --screenshots --overwrite
35
31
  DESC
36
32
 
37
33
  self.arguments = [
38
- CLAide::Argument.new('path/to/config.json', true),
39
34
  ]
40
35
 
41
36
  def self.options
42
37
  [
43
- ['--metadata', 'Upload metadata to iTunes Connect.'],
44
- ['--screenshots', 'Upload screenshots to iTunes Connect.'],
45
- ['--overwrite', 'overwrite screenshots to iTunes Connect.'],
46
- ['--sync', 'sync screenshots to iTunes Connect.'],
47
-
48
- ['--ipa', 'Upload ipa to iTunes Connect.'],
38
+ ['--metadata', '上传元数据到iTunes Connect'],
39
+ ['--screenshots', '上传截图到iTunes Connect'],
40
+ ['--overwrite', '覆盖iTunes Connect中的截图'],
41
+ ['--sync', '同步截图到iTunes Connect'],
42
+ ['--ipa', '上传ipa到iTunes Connect'],
49
43
  ].concat(super)
50
44
  end
51
45
 
52
- def initialize(argv)
53
-
46
+ def initialize(argv)
54
47
  @upload_metadata_flag = argv.flag?('metadata', false)
55
48
  @upload_screenshots_flag = argv.flag?('screenshots', false)
56
-
57
49
  @overwrite_flag = argv.flag?('overwrite', false)
58
50
  @sync_flag = argv.flag?('sync', false)
59
-
60
51
  @upload_ipa_flag = argv.flag?('ipa', false)
61
52
 
62
53
  super
63
- end
64
-
54
+ end
65
55
 
66
56
  def run
67
57
  current_project_dir = Dir.pwd
58
+ config_file = File.join(current_project_dir, "config.json")
68
59
 
69
- pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
70
- @app_config_dir = File.join(pindo_dir, @deploy_repo_name)
60
+ # 加载配置
61
+ config_parser = Pindo::IosConfigParser.instance
62
+ config_parser.load_config(config_file: config_file)
63
+ @config_json = config_parser.config_json
64
+ @bundle_id = config_parser.bundle_id
65
+ @apple_id = config_parser.apple_id
71
66
 
72
- # @app_config_dir = clong_buildconfig_repo(repo_name: @deploy_repo_name)
67
+ if @config_json.nil? || @config_json.empty?
68
+ raise Informative, "配置未加载,请检查配置文件: #{config_file}"
69
+ end
73
70
 
74
- print_info(project_dir:current_project_dir, apple_id:@apple_id, bundle_id:@bundle_id, config_json:@config_json)
71
+ if @bundle_id.nil? || @bundle_id.empty?
72
+ raise Informative, "无法从配置文件中获取 Bundle ID"
73
+ end
74
+
75
+ if @apple_id.nil? || @apple_id.empty?
76
+ raise Informative, "无法从配置文件中获取 Apple ID"
77
+ end
78
+
79
+ pindo_dir = File.expand_path(pindo_single_config.pindo_dir)
80
+ @app_config_dir = File.join(pindo_dir, @bundle_id)
81
+
82
+ print_info(project_dir: current_project_dir, apple_id: @apple_id, bundle_id: @bundle_id, config_json: @config_json)
75
83
 
76
84
  if @upload_metadata_flag
77
85
  process_itunes_metadata()
78
- fastlane_login(apple_id:@apple_id)
79
- fastlane_upload_metadata(temp_bundle_id:@bundle_id)
86
+ fastlane_login(apple_id: @apple_id)
87
+ fastlane_upload_metadata(temp_bundle_id: @bundle_id)
80
88
  end
81
89
 
82
90
  if @upload_screenshots_flag
83
91
  ENV["FASTLANE_ENABLE_BETA_DELIVER_SYNC_SCREENSHOTS"] = "YES"
84
- app_screenshots_dir = File.join(@app_config_dir, "fastlane/screenshots")
85
- fastlane_process_screenshots(app_screenshots_dir:app_screenshots_dir)
92
+ app_screenshots_dir = File.join(@app_config_dir, "fastlane/screenshots")
93
+ fastlane_process_screenshots(app_screenshots_dir: app_screenshots_dir)
86
94
 
87
- fastlane_login(apple_id:@apple_id)
88
- fastlane_upload_screenshots(apple_id:@apple_id, bundle_id:@bundle_id, app_screenshots_dir:app_screenshots_dir)
95
+ fastlane_login(apple_id: @apple_id)
96
+ fastlane_upload_screenshots(apple_id: @apple_id, bundle_id: @bundle_id, app_screenshots_dir: app_screenshots_dir)
89
97
  end
90
98
 
91
99
  if @upload_ipa_flag
92
- # prepare_screenshots(project_dir:current_project_dir, apple_id:@apple_id, bundle_id:@bundle_id, config_json:@config_json)
93
100
  command = "fastlane uploadipa"
94
101
  system command
95
102
  end
@@ -97,25 +104,19 @@ module Pindo
97
104
  puts "Done !!!"
98
105
  end
99
106
 
100
- def process_itunes_metadata( )
101
- app_itunes_dir = File.join(@app_config_dir, "fastlane")
102
- app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
107
+ def process_itunes_metadata()
108
+ app_itunes_dir = File.join(@app_config_dir, "fastlane")
109
+ app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
103
110
  app_itunes_json = JSON.parse(File.read(app_itunes_file))
104
111
 
105
-
106
-
107
-
108
112
  app_itunes_json = app_itunes_json || {}
109
113
 
110
-
111
-
112
114
  app_itunes_json["app_info"] = app_itunes_json["app_info"] || {}
113
115
  app_itunes_json["app_info"]["app_info_localization"] = app_itunes_json["app_info"]["app_info_localization"] || {}
114
116
 
115
-
116
117
  if !app_itunes_json["app_info"]["app_info_localization"].nil?
117
- app_itunes_json["app_info"]["app_info_localization"].each do |lang , app_info_localization|
118
- check_app_info_localization(lang:lang, localization_json:app_info_localization)
118
+ app_itunes_json["app_info"]["app_info_localization"].each do |lang, app_info_localization|
119
+ check_app_info_localization(lang: lang, localization_json: app_info_localization)
119
120
  end
120
121
  end
121
122
 
@@ -138,43 +139,33 @@ module Pindo
138
139
  app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"] || {}
139
140
  app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"]["en-US"] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"]["en-US"] || {}
140
141
 
141
-
142
- notes_file = File.join(platform_metadata_path, "review_notes.txt")
142
+ notes_file = File.join(platform_metadata_path, "review_notes.txt")
143
143
  if File.exist?(notes_file)
144
- notes_file_txt = File.read(notes_file)
144
+ notes_file_txt = File.read(notes_file)
145
145
  app_itunes_json["app_edit_version_info"][platform]["app_review_info"]["notes"] = notes_file_txt.to_s.strip
146
146
  end
147
147
 
148
-
149
148
  if !app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].nil?
150
- app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].each do |lang , value|
149
+ app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"].each do |lang, value|
151
150
 
152
151
  app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] = app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang] || {}
153
152
 
154
- lang_metadata_path = File.join(platform_metadata_path, lang)
153
+ lang_metadata_path = File.join(platform_metadata_path, lang)
155
154
  if !File.exist?(lang_metadata_path)
156
155
  FileUtils.mkdir_p(lang_metadata_path)
157
156
  end
158
157
 
159
- read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"description")
160
- read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"keywords")
161
- read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"support_url")
162
- read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"marketing_url")
163
- read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"promotional_text")
164
- read_app_version_info_localization(lang:lang, localization_json:app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path:lang_metadata_path, key_name:"whats_new")
158
+ read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "description")
159
+ read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "keywords")
160
+ read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "support_url")
161
+ read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "marketing_url")
162
+ read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "promotional_text")
163
+ read_app_version_info_localization(lang: lang, localization_json: app_itunes_json["app_edit_version_info"][platform]["app_version_info_localization"][lang], lang_metadata_path: lang_metadata_path, key_name: "whats_new")
165
164
  end
166
165
  end
167
166
 
168
167
  end
169
168
 
170
-
171
- #platforms = ["IOS", "MAC_OS", "TV_OS"]
172
-
173
- # Dir.foreach(app_itunes_dir) do |file|
174
- # if File::directory?(File.join(app_itunes_dir, file)) && platforms.include?(file)
175
- # end
176
- # end
177
-
178
169
  File.open(app_itunes_file, "w") do |file|
179
170
  file.write(JSON.pretty_generate(app_itunes_json))
180
171
  file.close
@@ -182,9 +173,7 @@ module Pindo
182
173
 
183
174
  end
184
175
 
185
-
186
-
187
- def check_app_info_localization(lang:nil, localization_json:nil)
176
+ def check_app_info_localization(lang: nil, localization_json: nil)
188
177
  if !localization_json.nil?
189
178
 
190
179
  localization_json.each do |key, value|
@@ -193,7 +182,7 @@ module Pindo
193
182
  localization_json[key] = value.to_s.strip
194
183
  end
195
184
 
196
- if ( key.eql?("name") || key.eql?("subtitle") ) && !localization_json[key].nil? && localization_json[key].length > 30 && localization_json[key].length <2
185
+ if (key.eql?("name") || key.eql?("subtitle")) && !localization_json[key].nil? && localization_json[key].length > 30 && localization_json[key].length < 2
197
186
  puts
198
187
  puts
199
188
  puts localization_json[key]
@@ -205,17 +194,12 @@ module Pindo
205
194
 
206
195
  end
207
196
 
197
+ def read_app_version_info_localization(lang: nil, localization_json: nil, lang_metadata_path: nil, key_name: nil)
208
198
 
209
- def read_app_version_info_localization(lang:nil, localization_json:nil, lang_metadata_path:nil, key_name:nil)
210
-
211
- # puts "lang_metadata_path : #{lang_metadata_path}"
212
-
213
- key_name_file = File.join(lang_metadata_path, key_name + ".txt")
199
+ key_name_file = File.join(lang_metadata_path, key_name + ".txt")
214
200
  if File.exist?(key_name_file)
215
201
  localization_json = localization_json || {}
216
- key_name_txt = File.read(key_name_file)
217
- # puts "key_name : #{key_name}"
218
- # puts "key_name_txt : #{key_name_txt}"
202
+ key_name_txt = File.read(key_name_file)
219
203
  localization_json[key_name] = key_name_txt.to_s.strip
220
204
  if key_name.eql?("keywords") && !localization_json[key_name].nil? && localization_json[key_name].length > 100
221
205
  puts localization_json[key_name]
@@ -229,23 +213,21 @@ module Pindo
229
213
  puts "长度: #{localization_json[key_name].length}"
230
214
  raise Informative, "#{lang} : description 超出限定的4000个字符 !!!"
231
215
  end
232
- # puts localization_json
233
216
  end
234
217
  end
235
218
 
219
+ def fastlane_upload_metadata(temp_bundle_id: nil)
236
220
 
237
- def fastlane_upload_metadata(temp_bundle_id:nil)
238
-
239
- app_itunes_dir = File.join(@app_config_dir, "fastlane")
240
- app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
221
+ app_itunes_dir = File.join(@app_config_dir, "fastlane")
222
+ app_itunes_file = File.join(app_itunes_dir, "app_itunes.json")
241
223
  app_itunes_json = JSON.parse(File.read(app_itunes_file))
242
224
 
243
225
  app = Spaceship::ConnectAPI::App.find(temp_bundle_id)
244
226
 
245
- fastlane_update_app_metadata(app: app, app_itunes_json:app_itunes_json)
227
+ fastlane_update_app_metadata(app: app, app_itunes_json: app_itunes_json)
246
228
 
247
229
  if !app_itunes_json["app_info"].nil?
248
- fastlane_update_app_info_metadata(app: app, app_itunes_json:app_itunes_json)
230
+ fastlane_update_app_info_metadata(app: app, app_itunes_json: app_itunes_json)
249
231
  end
250
232
 
251
233
  if !app_itunes_json["app_edit_version_info"].nil?
@@ -255,24 +237,21 @@ module Pindo
255
237
  puts "===========正在处理平台: #{platform}"
256
238
  app_edit_version_info = app.get_edit_app_store_version(platform: platform)
257
239
 
258
- if !app_edit_version_info.nil? && !app_itunes_json["app_edit_version_info"].nil? && !app_itunes_json["app_edit_version_info"][platform].nil?
240
+ if !app_edit_version_info.nil? && !app_itunes_json["app_edit_version_info"].nil? && !app_itunes_json["app_edit_version_info"][platform].nil?
259
241
 
260
- fastlane_update_app_version_info_metadata(app: app, platform:platform, app_itunes_json:app_itunes_json)
242
+ fastlane_update_app_version_info_metadata(app: app, platform: platform, app_itunes_json: app_itunes_json)
261
243
  end
262
244
 
263
245
  end
264
246
  end
265
247
 
266
-
267
- fastlane_update_app_info_localizations(app: app, app_itunes_json:app_itunes_json)
268
-
248
+ fastlane_update_app_info_localizations(app: app, app_itunes_json: app_itunes_json)
269
249
 
270
250
  end
271
251
 
252
+ def print_info(project_dir: nil, apple_id: nil, bundle_id: nil, config_json: nil)
272
253
 
273
- def print_info(project_dir:nil, apple_id:nil, bundle_id:nil, config_json:nil)
274
-
275
- pindo_dir = File::expand_path(pindo_single_config.pindo_dir)
254
+ pindo_dir = File.expand_path(pindo_single_config.pindo_dir)
276
255
  config_repo_dir = File.join(pindo_dir, bundle_id)
277
256
  apple_id = @config_json['app_info']['app_id_ios']
278
257
 
@@ -296,23 +275,21 @@ module Pindo
296
275
 
297
276
  end
298
277
 
299
-
300
-
301
- def fastlane_process_screenshots(app_screenshots_dir:nil)
278
+ def fastlane_process_screenshots(app_screenshots_dir: nil)
302
279
 
303
280
  if File.exist?(app_screenshots_dir)
304
281
  platforms = ["IOS", "MAC_OS", "TV_OS", "XR_OS"]
305
- platforms.each do | platform|
306
- platform_screenshots_path = File.join(app_screenshots_dir, platform.downcase)
282
+ platforms.each do |platform|
283
+ platform_screenshots_path = File.join(app_screenshots_dir, platform.downcase)
307
284
  if File.exist?(platform_screenshots_path)
308
285
  Dir.glob(File.join(platform_screenshots_path, "*")).each do |lang_screenshots_path|
309
- if File.directory?(lang_screenshots_path) && ![".", "..","iMessage", "imessage"].include?(File.basename(lang_screenshots_path))
310
- fastlane_process_lang_screenshots(lang_screenshots_path:lang_screenshots_path)
286
+ if File.directory?(lang_screenshots_path) && ![".", "..", "iMessage", "imessage"].include?(File.basename(lang_screenshots_path))
287
+ fastlane_process_lang_screenshots(lang_screenshots_path: lang_screenshots_path)
311
288
  elsif File.directory?(lang_screenshots_path) && ["iMessage", "imessage", "IMESSAGE"].include?(File.basename(lang_screenshots_path))
312
289
  imessage_screenshots_path = lang_screenshots_path
313
- Dir.glob(File.join(imessage_screenshots_path, "*")).each do |imessage_lane_screenshots_path|
290
+ Dir.glob(File.join(imessage_screenshots_path, "*")).each do |imessage_lane_screenshots_path|
314
291
  if File.directory?(lang_screenshots_path) && ![".", ".."].include?(File.basename(imessage_lane_screenshots_path))
315
- fastlane_process_lang_screenshots(lang_screenshots_path:imessage_lane_screenshots_path)
292
+ fastlane_process_lang_screenshots(lang_screenshots_path: imessage_lane_screenshots_path)
316
293
  end
317
294
  end
318
295
  end
@@ -325,52 +302,47 @@ module Pindo
325
302
 
326
303
  end
327
304
 
328
-
329
- def fastlane_upload_screenshots(apple_id:nil, bundle_id:nil, app_screenshots_dir:nil)
305
+ def fastlane_upload_screenshots(apple_id: nil, bundle_id: nil, app_screenshots_dir: nil)
330
306
 
331
307
  if !File.exist?(app_screenshots_dir)
332
308
  return
333
309
  end
334
310
 
335
- platform_screenshots_path = File.join(app_screenshots_dir, "ios")
311
+ platform_screenshots_path = File.join(app_screenshots_dir, "ios")
336
312
 
337
313
  if !File.exist?(platform_screenshots_path)
338
314
  puts "!!! Screenshots Path is not exist !!!"
339
315
  return
340
316
  end
341
317
 
342
- app_metadata_dir = File.join(@app_config_dir, "fastlane")
343
- app_metadata_path = File.join(app_metadata_dir, "ios")
344
-
318
+ app_metadata_dir = File.join(@app_config_dir, "fastlane")
319
+ app_metadata_path = File.join(app_metadata_dir, "ios")
345
320
 
346
321
  if @overwrite_flag
347
322
  @sync_flag = false
348
323
  end
349
324
 
350
-
351
325
  if @sync_flag
352
326
  @overwrite_flag = false
353
327
  end
354
328
 
355
-
356
329
  values = {
357
- username:apple_id,
330
+ username: apple_id,
358
331
  app_identifier: bundle_id,
359
332
  skip_metadata: true,
360
- skip_binary_upload:true,
361
- skip_app_version_update:true,
362
- precheck_include_in_app_purchases:false,
363
- metadata_path:app_metadata_dir,
364
- screenshots_path:platform_screenshots_path,
333
+ skip_binary_upload: true,
334
+ skip_app_version_update: true,
335
+ precheck_include_in_app_purchases: false,
336
+ metadata_path: app_metadata_dir,
337
+ screenshots_path: platform_screenshots_path,
365
338
  overwrite_screenshots: @overwrite_flag,
366
- ignore_language_directory_validation:true,
339
+ ignore_language_directory_validation: true,
367
340
  sync_screenshots: @sync_flag
368
341
  }
369
342
 
370
343
  config = FastlaneCore::Configuration.create(Deliver::Options.available_options, values)
371
344
  Deliver::Runner.new(config).run
372
345
 
373
-
374
346
  end
375
347
 
376
348
  end