mysigner 0.1.2 → 0.1.4

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.githooks/pre-commit +15 -0
  3. data/.githooks/pre-push +21 -0
  4. data/.github/workflows/ci.yml +29 -0
  5. data/.gitignore +4 -0
  6. data/.rubocop.yml +55 -0
  7. data/.rubocop_todo.yml +126 -0
  8. data/CHANGELOG.md +96 -0
  9. data/Gemfile +5 -3
  10. data/Gemfile.lock +38 -8
  11. data/README.md +14 -16
  12. data/Rakefile +5 -3
  13. data/bin/console +4 -3
  14. data/bin/setup +3 -0
  15. data/certificate_.cer +0 -0
  16. data/exe/mysigner +19 -2
  17. data/iOS_App_Store_Profile.mobileprovision +1 -0
  18. data/iOS_Distribution_Certificate.cer +1 -0
  19. data/lib/mysigner/build/android_executor.rb +83 -63
  20. data/lib/mysigner/build/android_parser.rb +33 -40
  21. data/lib/mysigner/build/configurator.rb +17 -16
  22. data/lib/mysigner/build/detector.rb +39 -50
  23. data/lib/mysigner/build/error_analyzer.rb +70 -68
  24. data/lib/mysigner/build/executor.rb +30 -37
  25. data/lib/mysigner/build/parser.rb +18 -18
  26. data/lib/mysigner/cleanup/private_keys_purger.rb +41 -0
  27. data/lib/mysigner/cli/auth_commands.rb +771 -764
  28. data/lib/mysigner/cli/build_commands.rb +962 -796
  29. data/lib/mysigner/cli/concerns/actionable_suggestions.rb +208 -154
  30. data/lib/mysigner/cli/concerns/api_helpers.rb +46 -54
  31. data/lib/mysigner/cli/concerns/error_handlers.rb +247 -237
  32. data/lib/mysigner/cli/concerns/helpers.rb +44 -1
  33. data/lib/mysigner/cli/diagnostic_commands.rb +667 -636
  34. data/lib/mysigner/cli/resource_commands.rb +1153 -985
  35. data/lib/mysigner/cli/validate_commands.rb +25 -25
  36. data/lib/mysigner/cli.rb +11 -1
  37. data/lib/mysigner/client.rb +27 -19
  38. data/lib/mysigner/config.rb +161 -60
  39. data/lib/mysigner/export/exporter.rb +38 -37
  40. data/lib/mysigner/signing/certificate_checker.rb +18 -23
  41. data/lib/mysigner/signing/gradle_signing_injector.rb +67 -0
  42. data/lib/mysigner/signing/keystore_manager.rb +81 -61
  43. data/lib/mysigner/signing/validator.rb +38 -40
  44. data/lib/mysigner/signing/wizard.rb +329 -342
  45. data/lib/mysigner/upload/app_store_automation.rb +96 -49
  46. data/lib/mysigner/upload/app_store_submission.rb +87 -92
  47. data/lib/mysigner/upload/asc_rest_uploader.rb +119 -0
  48. data/lib/mysigner/upload/play_store_uploader.rb +164 -144
  49. data/lib/mysigner/upload/uploader.rb +136 -115
  50. data/lib/mysigner/version.rb +3 -1
  51. data/lib/mysigner.rb +13 -11
  52. data/mysigner.gemspec +36 -33
  53. data/profile_.mobileprovision +0 -0
  54. data/test_manual.rb +37 -36
  55. metadata +44 -17
  56. data/.DS_Store +0 -0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mysigner
2
4
  module Signing
3
5
  class Validator
@@ -19,20 +21,20 @@ module Mysigner
19
21
  team_id = @team_id_override || @parser.team_id(@target_name, @configuration)
20
22
  if team_id.nil? || team_id.empty?
21
23
  result[:errors] << "No development team set for target '#{@target_name}'"
22
- result[:errors] << ""
23
- result[:errors] << "Fix Option 1: Add team to My Signer"
24
- result[:errors] << " 1. Open https://mysigner.dev"
25
- result[:errors] << " 2. Go to Settings → App Store Connect"
26
- result[:errors] << " 3. Add your Team ID"
27
- result[:errors] << " 4. Run: mysigner build (team will auto-fetch)"
28
- result[:errors] << ""
29
- result[:errors] << "Fix Option 2: Pass team via CLI"
30
- result[:errors] << " mysigner build --team YOUR_TEAM_ID"
31
- result[:errors] << ""
32
- result[:errors] << "Fix Option 3: Set in Xcode"
33
- result[:errors] << " Open Xcode → Select target → Signing & Capabilities → Select a team"
34
- result[:errors] << ""
35
- result[:errors] << "Find your team ID at: https://developer.apple.com/account/#!/membership/"
24
+ result[:errors] << ''
25
+ result[:errors] << 'Fix Option 1: Add team to My Signer'
26
+ result[:errors] << ' 1. Open https://mysigner.dev'
27
+ result[:errors] << ' 2. Go to Settings → App Store Connect'
28
+ result[:errors] << ' 3. Add your Team ID'
29
+ result[:errors] << ' 4. Run: mysigner build (team will auto-fetch)'
30
+ result[:errors] << ''
31
+ result[:errors] << 'Fix Option 2: Pass team via CLI'
32
+ result[:errors] << ' mysigner build --team YOUR_TEAM_ID'
33
+ result[:errors] << ''
34
+ result[:errors] << 'Fix Option 3: Set in Xcode'
35
+ result[:errors] << ' Open Xcode → Select target → Signing & Capabilities → Select a team'
36
+ result[:errors] << ''
37
+ result[:errors] << 'Find your team ID at: https://developer.apple.com/account/#!/membership/'
36
38
  result[:valid] = false
37
39
  elsif @team_id_override && @parser.team_id(@target_name, @configuration).nil?
38
40
  result[:warnings] << "Using team from My Signer: #{@team_id_override}"
@@ -42,15 +44,13 @@ module Mysigner
42
44
 
43
45
  # Check 2: Code signing style
44
46
  signing_style = @parser.code_sign_style(@target_name, @configuration)
45
- if signing_style.nil?
46
- result[:warnings] << "Code signing style not explicitly set (will use Xcode default)"
47
- end
47
+ result[:warnings] << 'Code signing style not explicitly set (will use Xcode default)' if signing_style.nil?
48
48
 
49
49
  # Check 3: Bundle ID
50
50
  bundle_id = @parser.bundle_id(@target_name, @configuration)
51
51
  if bundle_id.nil? || bundle_id.empty? || bundle_id.include?('$(')
52
52
  result[:errors] << "Bundle ID not set or contains variables: #{bundle_id}"
53
- result[:errors] << "Fix: Open Xcode → Select target → General → Bundle Identifier"
53
+ result[:errors] << 'Fix: Open Xcode → Select target → General → Bundle Identifier'
54
54
  result[:valid] = false
55
55
  end
56
56
 
@@ -79,22 +79,22 @@ module Mysigner
79
79
  result = validate
80
80
 
81
81
  if result[:warnings].any?
82
- puts ""
83
- puts "⚠️ Warnings:"
82
+ puts ''
83
+ puts '⚠️ Warnings:'
84
84
  result[:warnings].each { |w| puts " • #{w}" }
85
85
  end
86
86
 
87
87
  if result[:errors].any?
88
- puts ""
89
- puts "❌ Validation Failed:"
90
- puts ""
88
+ puts ''
89
+ puts '❌ Validation Failed:'
90
+ puts ''
91
91
  result[:errors].each { |e| puts " • #{e}" }
92
- puts ""
93
- raise ValidationError, "Pre-build validation failed. Fix the errors above and try again."
92
+ puts ''
93
+ raise ValidationError, 'Pre-build validation failed. Fix the errors above and try again.'
94
94
  end
95
95
 
96
- puts "✓ Pre-build validation passed" if result[:warnings].empty?
97
- puts "" if result[:warnings].any?
96
+ puts '✓ Pre-build validation passed' if result[:warnings].empty?
97
+ puts '' if result[:warnings].any?
98
98
  end
99
99
 
100
100
  private
@@ -104,19 +104,17 @@ module Mysigner
104
104
 
105
105
  # Check for valid iOS distribution certificates in keychain
106
106
  output = `security find-identity -v -p codesigning 2>&1`
107
-
107
+
108
108
  if output.include?('0 valid identities found')
109
- result[:errors] << "No code signing certificates found in keychain"
110
- result[:errors] << "Fix: Install your distribution certificate (.p12 file)"
109
+ result[:errors] << 'No code signing certificates found in keychain'
110
+ result[:errors] << 'Fix: Install your distribution certificate (.p12 file)'
111
111
  else
112
112
  # Count valid certificates
113
113
  cert_count = output.scan(/\d+\)\s+[A-F0-9]+/).count
114
114
  result[:warnings] << "Found #{cert_count} code signing certificate(s) in keychain"
115
-
115
+
116
116
  # Check for expired certificates
117
- if output.include?('CSSMERR')
118
- result[:warnings] << "Some certificates may be invalid or expired"
119
- end
117
+ result[:warnings] << 'Some certificates may be invalid or expired' if output.include?('CSSMERR')
120
118
  end
121
119
 
122
120
  result
@@ -127,18 +125,18 @@ module Mysigner
127
125
 
128
126
  # Check provisioning profile directory
129
127
  profiles_dir = File.expand_path('~/Library/MobileDevice/Provisioning Profiles')
130
-
128
+
131
129
  unless Dir.exist?(profiles_dir)
132
- result[:warnings] << "No provisioning profiles directory found"
133
- result[:warnings] << "Profiles will be downloaded automatically if using automatic signing"
130
+ result[:warnings] << 'No provisioning profiles directory found'
131
+ result[:warnings] << 'Profiles will be downloaded automatically if using automatic signing'
134
132
  return result
135
133
  end
136
134
 
137
135
  profiles = Dir.glob("#{profiles_dir}/*.mobileprovision")
138
-
136
+
139
137
  if profiles.empty?
140
- result[:warnings] << "No provisioning profiles found"
141
- result[:warnings] << "Profiles will be downloaded automatically if using automatic signing"
138
+ result[:warnings] << 'No provisioning profiles found'
139
+ result[:warnings] << 'Profiles will be downloaded automatically if using automatic signing'
142
140
  else
143
141
  result[:warnings] << "Found #{profiles.count} provisioning profile(s) installed"
144
142
  end