pindo 4.6.9

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 (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
@@ -0,0 +1,116 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "size" : "20x20",
5
+ "idiom" : "iphone",
6
+ "filename" : "icon20@2x.png",
7
+ "scale" : "2x"
8
+ },
9
+ {
10
+ "size" : "20x20",
11
+ "idiom" : "iphone",
12
+ "filename" : "icon20@3x.png",
13
+ "scale" : "3x"
14
+ },
15
+ {
16
+ "size" : "29x29",
17
+ "idiom" : "iphone",
18
+ "filename" : "icon29@2x.png",
19
+ "scale" : "2x"
20
+ },
21
+ {
22
+ "size" : "29x29",
23
+ "idiom" : "iphone",
24
+ "filename" : "icon29@3x.png",
25
+ "scale" : "3x"
26
+ },
27
+ {
28
+ "size" : "40x40",
29
+ "idiom" : "iphone",
30
+ "filename" : "icon40@2x.png",
31
+ "scale" : "2x"
32
+ },
33
+ {
34
+ "size" : "40x40",
35
+ "idiom" : "iphone",
36
+ "filename" : "icon40@3x.png",
37
+ "scale" : "3x"
38
+ },
39
+ {
40
+ "size" : "60x60",
41
+ "idiom" : "iphone",
42
+ "filename" : "icon60@2x.png",
43
+ "scale" : "2x"
44
+ },
45
+ {
46
+ "size" : "60x60",
47
+ "idiom" : "iphone",
48
+ "filename" : "icon60@3x.png",
49
+ "scale" : "3x"
50
+ },
51
+ {
52
+ "size" : "20x20",
53
+ "idiom" : "ipad",
54
+ "filename" : "icon20@1x.png",
55
+ "scale" : "1x"
56
+ },
57
+ {
58
+ "size" : "20x20",
59
+ "idiom" : "ipad",
60
+ "filename" : "icon20@2x.png",
61
+ "scale" : "2x"
62
+ },
63
+ {
64
+ "size" : "29x29",
65
+ "idiom" : "ipad",
66
+ "filename" : "icon29@1x.png",
67
+ "scale" : "1x"
68
+ },
69
+ {
70
+ "size" : "29x29",
71
+ "idiom" : "ipad",
72
+ "filename" : "icon29@2x.png",
73
+ "scale" : "2x"
74
+ },
75
+ {
76
+ "size" : "40x40",
77
+ "idiom" : "ipad",
78
+ "filename" : "icon40@1x.png",
79
+ "scale" : "1x"
80
+ },
81
+ {
82
+ "size" : "40x40",
83
+ "idiom" : "ipad",
84
+ "filename" : "icon40@2x.png",
85
+ "scale" : "2x"
86
+ },
87
+ {
88
+ "size" : "76x76",
89
+ "idiom" : "ipad",
90
+ "filename" : "icon76@1x.png",
91
+ "scale" : "1x"
92
+ },
93
+ {
94
+ "size" : "76x76",
95
+ "idiom" : "ipad",
96
+ "filename" : "icon76@2x.png",
97
+ "scale" : "2x"
98
+ },
99
+ {
100
+ "size" : "83.5x83.5",
101
+ "idiom" : "ipad",
102
+ "filename" : "icon83_5@2x.png",
103
+ "scale" : "2x"
104
+ },
105
+ {
106
+ "size" : "1024x1024",
107
+ "idiom" : "ios-marketing",
108
+ "filename" : "icon1024@1x.png",
109
+ "scale" : "1x"
110
+ }
111
+ ],
112
+ "info" : {
113
+ "version" : 1,
114
+ "author" : "xcode"
115
+ }
116
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "size" : "29x29",
5
+ "idiom" : "iphone",
6
+ "filename" : "icon29@2x.png",
7
+ "scale" : "2x"
8
+ },
9
+ {
10
+ "size" : "29x29",
11
+ "idiom" : "iphone",
12
+ "filename" : "icon29@3x.png",
13
+ "scale" : "3x"
14
+ },
15
+ {
16
+ "size" : "60x45",
17
+ "idiom" : "iphone",
18
+ "filename" : "icon60_45@2x.png",
19
+ "scale" : "2x"
20
+ },
21
+ {
22
+ "size" : "60x45",
23
+ "idiom" : "iphone",
24
+ "filename" : "icon60_45@3x.png",
25
+ "scale" : "3x"
26
+ },
27
+ {
28
+ "size" : "29x29",
29
+ "idiom" : "ipad",
30
+ "filename" : "icon29@2x.png",
31
+ "scale" : "2x"
32
+ },
33
+ {
34
+ "size" : "67x50",
35
+ "idiom" : "ipad",
36
+ "filename" : "icon67_50@2x.png",
37
+ "scale" : "2x"
38
+ },
39
+ {
40
+ "size" : "74x55",
41
+ "idiom" : "ipad",
42
+ "filename" : "icon74_55@2x.png",
43
+ "scale" : "2x"
44
+ },
45
+ {
46
+ "size" : "1024x1024",
47
+ "idiom" : "ios-marketing",
48
+ "filename" : "icon1024@1x.png",
49
+ "scale" : "1x"
50
+ },
51
+ {
52
+ "size" : "27x20",
53
+ "idiom" : "universal",
54
+ "filename" : "icon27_20@2x.png",
55
+ "scale" : "2x",
56
+ "platform" : "ios"
57
+ },
58
+ {
59
+ "size" : "27x20",
60
+ "idiom" : "universal",
61
+ "filename" : "icon27_20@3x.png",
62
+ "scale" : "3x",
63
+ "platform" : "ios"
64
+ },
65
+ {
66
+ "size" : "32x24",
67
+ "idiom" : "universal",
68
+ "filename" : "icon32_24@2x.png",
69
+ "scale" : "2x",
70
+ "platform" : "ios"
71
+ },
72
+ {
73
+ "size" : "32x24",
74
+ "idiom" : "universal",
75
+ "filename" : "icon32_24@3x.png",
76
+ "scale" : "3x",
77
+ "platform" : "ios"
78
+ },
79
+ {
80
+ "size" : "1024x768",
81
+ "idiom" : "ios-marketing",
82
+ "filename" : "icon1024_768@1x.png",
83
+ "scale" : "1x",
84
+ "platform" : "ios"
85
+ }
86
+ ],
87
+ "info" : {
88
+ "version" : 1,
89
+ "author" : "xcode"
90
+ }
91
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "images": [
3
+ {
4
+ "idiom": "universal",
5
+ "scale": "1x"
6
+ },
7
+ {
8
+ "idiom": "universal",
9
+ "filename": "w768_h1024@2x.png",
10
+ "scale": "2x"
11
+ },
12
+ {
13
+ "idiom": "universal",
14
+ "scale": "3x"
15
+ }
16
+ ],
17
+ "info": {
18
+ "version": 1,
19
+ "author": "xcode"
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "images": [
3
+ {
4
+ "idiom": "universal",
5
+ "scale": "1x"
6
+ },
7
+ {
8
+ "idiom": "universal",
9
+ "filename": "w768_h1024@2x.png",
10
+ "scale": "2x"
11
+ },
12
+ {
13
+ "idiom": "universal",
14
+ "scale": "3x"
15
+ }
16
+ ],
17
+ "info": {
18
+ "version": 1,
19
+ "author": "xcode"
20
+ }
21
+ }
@@ -0,0 +1,63 @@
1
+
2
+ module Pindo
3
+ module Pemcreate
4
+ def create_certificate(bundle_id:nil, type:"prod", output_path:"")
5
+
6
+ if bundle_id.empty? || output_path.empty?
7
+ UI.user_error!("bundle id is nil or output_path is nil.")
8
+ end
9
+
10
+ puts "Creating a new push certificate for app '#{bundle_id}'. "
11
+
12
+ csr, pkey = Spaceship::Portal.certificate.create_certificate_signing_request
13
+
14
+ cert = nil
15
+ begin
16
+ if type == "dev"
17
+ cert = Spaceship::Portal.certificate.development_push.create!(csr: csr, bundle_id: bundle_id)
18
+ else
19
+ cert = Spaceship::Portal.certificate.production_push.create!(csr: csr, bundle_id: bundle_id)
20
+ end
21
+ rescue => ex
22
+ if ex.to_s.include?("You already have a current")
23
+ # That's the most common failure probably
24
+ raise Informative, "You already have 2 active push profiles for this application/environment. You'll need to revoke an old certificate to make room for a new one"
25
+ else
26
+ raise ex
27
+ end
28
+ end
29
+
30
+
31
+ x509_certificate = cert.download
32
+ certificate_type = (type == "dev" ? 'development' : 'production')
33
+
34
+ base_base = bundle_id.gsub('.', '_')
35
+ puts base_base
36
+ filename_base = base_base + '_' + type
37
+
38
+
39
+ private_key_path = File.join(output_path, "#{filename_base}.pkey")
40
+ File.write(private_key_path, pkey.to_pem)
41
+ puts "key: #{private_key_path}"
42
+
43
+
44
+ p12_cert_path = File.join(output_path, "#{filename_base}.p12")
45
+ p12 = OpenSSL::PKCS12.create('goodcert1', certificate_type, pkey, x509_certificate)
46
+ File.write(p12_cert_path, p12.to_der)
47
+ puts "p12 : #{p12_cert_path}"
48
+
49
+
50
+ x509_cert_path = File.join(output_path, "#{filename_base}.pem")
51
+ File.write(x509_cert_path, x509_certificate.to_pem + pkey.to_pem)
52
+ puts "pem : #{x509_cert_path}"
53
+
54
+ return x509_cert_path
55
+ end
56
+
57
+ def login(apple_id:nil)
58
+ puts apple_id
59
+ Spaceship::Portal.login(apple_id.to_s)
60
+ Spaceship::Portal.select_team
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,339 @@
1
+
2
+ require 'highline/import'
3
+ require 'fileutils'
4
+ require 'json'
5
+ require 'faraday'
6
+ require "rqrcode"
7
+ require 'pindo/client/pgyerclient'
8
+ require 'pindo/client/aws3sclient'
9
+
10
+
11
+ module Pindo
12
+
13
+ class PgyerHelper
14
+
15
+ class << self
16
+ attr_writer :instance
17
+ end
18
+
19
+ def self.share_instace
20
+ @instance ||= new
21
+ end
22
+
23
+ def get_user_local_wechat_url( )
24
+
25
+ wechat_msg_url = nil
26
+ wechat_msg_url = PindoUserLocalConfig.instance.read_local_wechat_url
27
+ if !wechat_msg_url.nil? && wechat_msg_url.length > 1
28
+ else
29
+
30
+ wechat_msg_url = ask('请输入Wechat Url:')
31
+ if !wechat_msg_url.nil? && wechat_msg_url.length > 1
32
+ PindoUserLocalConfig.instance.write_local_wechat_url(wechat_msg_url:wechat_msg_url)
33
+ end
34
+
35
+ end
36
+ wechat_msg_url
37
+ end
38
+
39
+
40
+ def send_apptest_wechat_msg(msg_data:nil)
41
+
42
+ wechat_msg_url = get_user_local_wechat_url()
43
+
44
+ if !wechat_msg_url.nil? && wechat_msg_url.length >1
45
+
46
+ else
47
+ puts "企业微信Wechat Url无效"
48
+ end
49
+
50
+ begin
51
+
52
+ download_url = msg_data[:download_url]
53
+ app_name = msg_data[:app_name]
54
+ download_password = msg_data[:download_password]
55
+ bundle_id = msg_data[:bundle_id]
56
+ app_version = msg_data[:app_version]
57
+ index_num = msg_data[:index_num]
58
+ upload_time = msg_data[:time]
59
+ description = msg_data[:description]
60
+ msg_from = msg_data[:msg_from]
61
+
62
+
63
+ # current_dir = current_dir = Dir.pwd
64
+ # output_file = File.join(current_dir, app_name + "_qrcode.png")
65
+ qrcode = RQRCode::QRCode.new(download_url)
66
+
67
+ png = qrcode.as_png(
68
+ bit_depth: 1,
69
+ border_modules: 4,
70
+ color_mode: ChunkyPNG::COLOR_GRAYSCALE,
71
+ color: "black",
72
+ file: nil,
73
+ fill: "white",
74
+ module_px_size: 6,
75
+ resize_exactly_to: false,
76
+ resize_gte_to: false,
77
+ size: 300
78
+ )
79
+
80
+
81
+ checksum = Digest::MD5.hexdigest(png.to_s)
82
+ image_base64_data = Base64.strict_encode64(png.to_s)
83
+
84
+ body_data = {
85
+ msgtype:"image",
86
+ image:{
87
+ base64: image_base64_data,
88
+ md5:checksum
89
+ }
90
+ }
91
+
92
+ con = Faraday.new
93
+ res = con.post do |req|
94
+ req.url wechat_msg_url
95
+ req.headers['Content-Type'] = 'application/json'
96
+ req.body = body_data.to_json
97
+ end
98
+
99
+
100
+ body_data = {
101
+ msgtype:"text",
102
+ text:{
103
+ content: "#{app_name} 测试\r\r版本号: #{app_version} build:#{index_num}\r安装密码: #{download_password}\r上传时间: #{upload_time}\rBundle Id: #{bundle_id}\r链接:#{download_url}\r\n说明:\r\r#{description}\r\r消息发送来自: #{msg_from}"
104
+
105
+ }
106
+ }
107
+
108
+ con = Faraday.new
109
+ res = con.post do |req|
110
+ req.url wechat_msg_url
111
+ req.headers['Content-Type'] = 'application/json'
112
+ req.body = body_data.to_json
113
+ end
114
+ puts
115
+ puts "发送企业微信成功 !!!"
116
+ puts
117
+
118
+ rescue StandardError => e
119
+ puts
120
+ puts "发送企业微信失败 !!!"
121
+ puts
122
+ end
123
+
124
+ end
125
+
126
+ def print_app_version_info(msg_data:nil)
127
+
128
+ qrcode = RQRCode::QRCode.new(msg_data[:download_url])
129
+ svg = qrcode.as_ansi(
130
+ light: "\033[47m", dark: "\033[40m",
131
+ fill_character: " ",
132
+ quiet_zone_size: 1,
133
+ size: 300
134
+ )
135
+ puts "\r\n\r\n\r\n\r\n"
136
+ puts svg
137
+ puts
138
+ puts "#{msg_data[:app_name]} 测试"
139
+ puts "Bundle Id: #{msg_data[:bundle_id]}"
140
+ puts "版本号: #{msg_data[:app_version]} build: #{msg_data[:index_num]}"
141
+ puts "安装密码: #{msg_data[:download_password]}"
142
+ puts "上传时间: #{msg_data[:time]}"
143
+ puts "链接: #{msg_data[:download_url]}"
144
+ puts "说明: #{msg_data[:description]}"
145
+ puts "\r\n\r\n\r\n\r\n"
146
+
147
+ end
148
+
149
+ def find_app_info_with_obj_list(proj_name:nil)
150
+ if proj_name.nil?
151
+ return nil
152
+ end
153
+
154
+ key_proj_name = proj_name.downcase.strip.gsub(/[\s\-_]/, '')
155
+
156
+ app_info_list = Pindoconfig.instance.get_pgyerapps_info_list()
157
+ app_info_obj = app_info_list&.find do |app_info_item|
158
+ app_info_item_name = app_info_item["appName"].to_s.downcase.strip.gsub(/[\s\-_]/, '')
159
+ app_info_item_name.eql?(key_proj_name) && app_info_item["appType"].eql?("iOS")
160
+ end
161
+
162
+ app_info_obj
163
+ end
164
+
165
+ def get_app_version(client:nil, appId:nil, app_version_index:nil, latest_version:true)
166
+
167
+ version_data = client.get_app_version_list_req(appId:appId)
168
+
169
+ version_item_obj = nil
170
+ if latest_version
171
+ version_item_obj = version_data["data"].find{ |item| item["latest"]}
172
+ else
173
+ if !app_version_index.nil?
174
+ version_item_obj = version_data["data"].find{ |item| item["incId"].to_s.eql?(app_version_index.to_s)}
175
+ end
176
+ end
177
+
178
+ # puts JSON.pretty_generate(version_item_obj)
179
+
180
+ return version_item_obj
181
+ end
182
+
183
+ def get_app_list_in_pgyer(client:nil)
184
+
185
+ puts "正在向pgyer拉取app信息列表, 查找app信息..."
186
+ params = {
187
+ pageNo:1,
188
+ pageSize:1000
189
+ }
190
+
191
+ app_info_list = Pindoconfig.instance.get_pgyerapps_info_list()
192
+ if app_info_list.nil?
193
+ res_data = client.get_app_list_req(params:params)
194
+ # puts JSON.pretty_generate(res_data)
195
+ if !res_data["data"].nil? && res_data["data"].size > 0
196
+ app_info_list = res_data["data"]
197
+ Pindoconfig.instance.set_pgyerapps_info_list(app_info_list:app_info_list)
198
+ end
199
+ end
200
+
201
+ if app_info_list.nil?
202
+ res_data = client.get_app_list_req(params:params)
203
+ # puts JSON.pretty_generate(res_data)
204
+ if !res_data["data"].nil? && res_data["data"].size > 0
205
+ app_info_list = res_data["data"]
206
+ Pindoconfig.instance.set_pgyerapps_info_list(app_info_list:app_info_list)
207
+ end
208
+ end
209
+
210
+ if app_info_list.nil?
211
+ raise Informative, "Pgyer网络数据异常!!!"
212
+ end
213
+ return app_info_list
214
+ end
215
+
216
+ def get_versioon_history_item(client:nil, app_info_obj:nil, list_select_flat:false)
217
+
218
+ appId = app_info_obj["appId"]
219
+ version_data = client.get_app_version_list_req(appId:appId) || {}
220
+
221
+ if version_data["data"].nil? || version_data["data"].size <=0
222
+ raise Informative, "#{proj_name} 错误, 没有找到上传记录"
223
+ end
224
+
225
+ app_incId_index = nil
226
+ if list_select_flat
227
+
228
+ #获取version_data 最后10个数
229
+ list_num = [version_data["data"].size, 10].min
230
+ #获取version_data 最后10个的incId, bundleId, updateTime组成新数组
231
+ version_array_temp = version_data["data"].take(list_num).map do |item|
232
+ {
233
+ "appVersion" => item["appVersion"] + "(build " + item["build"] + " )",
234
+ "incId" => item["incId"],
235
+ "bundleId" => item["bundleId"],
236
+ "updateTime" => item["updateTime"]
237
+ }
238
+ end
239
+
240
+ version_array_temp.each do |item|
241
+ puts "版本:#{item["appVersion"]} Build号:#{item["incId"]} bundleId:#{item["bundleId"]} 上传时间:#{item["updateTime"]}"
242
+ end
243
+ puts
244
+ app_incId_index = ask('请选择上面的Build号:')
245
+
246
+ end
247
+
248
+ version_item_obj = nil
249
+ if !app_incId_index.nil?
250
+ version_item_obj = version_data["data"].find{ |item| item["incId"].to_s.eql?(app_incId_index.to_s)}
251
+ else
252
+ version_item_obj = version_data["data"].find{ |item| item["latest"]}
253
+ end
254
+
255
+ version_item_obj
256
+
257
+ end
258
+
259
+
260
+ def get_description()
261
+ comment_array = []
262
+ puts "请输入备注信息(按Esc结束):"
263
+ loop do
264
+
265
+ line = STDIN.gets.chomp
266
+ comment_array << line
267
+
268
+ key = STDIN.getch
269
+ break if key == "\e" # Break the loop if Esc key is pressed
270
+ end
271
+ puts "================================="
272
+ puts "输入结束,输入内容为:"
273
+ puts "================================="
274
+ comment_str = comment_array.join("\n")
275
+ puts comment_array
276
+ puts "================================="
277
+ return comment_str
278
+ end
279
+
280
+ def modify_coment(client:nil, app_info_obj:nil, version_item_obj:nil)
281
+
282
+ comment_str = get_description()
283
+ puts
284
+ puts "确修改信息:"
285
+ puts
286
+ puts "================================="
287
+ puts "App: #{app_info_obj["appName"]}"
288
+ puts "版本: #{version_item_obj["appVersion"]} (build #{version_item_obj["build"]})"
289
+ puts "Build号: #{version_item_obj["incId"]}"
290
+ puts "bundleId: #{version_item_obj["bundleId"]}"
291
+ puts "上传时间: #{version_item_obj["updateTime"]}"
292
+ puts
293
+ puts "旧备注: \n#{version_item_obj["description"]}"
294
+ puts
295
+ puts "修改备注: \n#{comment_str.strip}"
296
+ puts "================================="
297
+ puts
298
+ answer = agree("确认修改备注信息(Y/n)?:")
299
+ unless answer
300
+ raise Informative, "暂停修改!!"
301
+ end
302
+
303
+ client.post_update_upload_comment(appId:app_info_obj["appId"], id:version_item_obj["id"], comment:comment_str.strip)
304
+
305
+ puts "备注信息修改成功!!"
306
+
307
+ end
308
+
309
+ def make_msg_data(app_info_obj:nil, app_version_info_obj:nil, msg_from: nil)
310
+
311
+ app_name = app_info_obj["appName"]
312
+ download_password = app_info_obj["password"]
313
+ download_url = app_info_obj["downloadUrl"] + "?" + "id=" + app_version_info_obj["id"]
314
+ bundle_id = app_version_info_obj["bundleId"]
315
+ app_version = app_version_info_obj["appVersion"]
316
+ index_num = app_version_info_obj["incId"]
317
+ time = app_version_info_obj["updateTime"]
318
+ description = app_version_info_obj["description"]
319
+ msg_from = msg_from || " "
320
+ msg_data ={
321
+ app_name: app_name,
322
+ download_password: download_password,
323
+ download_url: download_url,
324
+ bundle_id: bundle_id,
325
+ app_version: app_version,
326
+ index_num: index_num,
327
+ time: time,
328
+ description: description,
329
+ msg_from:msg_from
330
+ }
331
+
332
+ return msg_data
333
+
334
+ end
335
+
336
+
337
+ end
338
+
339
+ end