fastlane 2.85.0.beta.20180308050114 → 2.85.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 23a54fcb5d8ae827f9d599c62139d90330d27a05
4
- data.tar.gz: db688ce8bdbeeb9a1ab2d2d34e6a4d322ed7e125
3
+ metadata.gz: 3776dd5f9fe6cea24c7d2e06a213eaec89018bea
4
+ data.tar.gz: 67846f04c71a0b0a02a8cb231d0700ae10d82531
5
5
  SHA512:
6
- metadata.gz: 3cb4e87171dd13f9d013d29978bbaad8286563ab6f79c2e86dd69830947bb2fb7c39796880130a1a5459efb58d7553f710de59aa3a5a156868f7f38d1fcce191
7
- data.tar.gz: 4f7badc1fe99c4e58a26307e7b036ee3aabc4d6da097ccbb20920a4fcb771cf24ca09888807bb180d67c35827482443d2f711c757331293b293745f5b4d9ca21
6
+ metadata.gz: a3483a1f123942221a7290ff57506c92194b372c068cb9c94f14d6b53390e4c4652ecad2257d9767a843f794421f09c945d1b2981140c4a31f3a0a9f3e136dba
7
+ data.tar.gz: 97ea5db90e615a4c9b4d93a0cc1d7b1dbd224e213a1b8524b786d61955759eb0fdaf1577a25aa8e412416f39807aaf8ae000f45b26eab4705125ecaf76bfc6e9
data/README.md CHANGED
@@ -30,23 +30,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
30
30
 
31
31
  <table id='team'>
32
32
  <tr>
33
- <td id='joshua-liebowitz'>
34
- <a href='https://github.com/taquitos'>
35
- <img src='https://github.com/taquitos.png?size=140'>
33
+ <td id='maksym-grebenets'>
34
+ <a href='https://github.com/mgrebenets'>
35
+ <img src='https://github.com/mgrebenets.png?size=140'>
36
36
  </a>
37
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
37
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
38
38
  </td>
39
- <td id='danielle-tomlinson'>
40
- <a href='https://github.com/DanToml'>
41
- <img src='https://github.com/DanToml.png?size=140'>
39
+ <td id='josh-holtz'>
40
+ <a href='https://github.com/joshdholtz'>
41
+ <img src='https://github.com/joshdholtz.png?size=140'>
42
42
  </a>
43
- <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
43
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
44
44
  </td>
45
- <td id='olivier-halligon'>
46
- <a href='https://github.com/AliSoftware'>
47
- <img src='https://github.com/AliSoftware.png?size=140'>
45
+ <td id='jérôme-lacoste'>
46
+ <a href='https://github.com/lacostej'>
47
+ <img src='https://github.com/lacostej.png?size=140'>
48
48
  </a>
49
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
49
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
50
50
  </td>
51
51
  <td id='andrew-mcburney'>
52
52
  <a href='https://github.com/AndrewMcBurney'>
@@ -54,25 +54,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
54
54
  </a>
55
55
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
56
56
  </td>
57
- <td id='iulian-onofrei'>
58
- <a href='https://github.com/revolter'>
59
- <img src='https://github.com/revolter.png?size=140'>
57
+ <td id='joshua-liebowitz'>
58
+ <a href='https://github.com/taquitos'>
59
+ <img src='https://github.com/taquitos.png?size=140'>
60
60
  </a>
61
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
61
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
62
62
  </td>
63
63
  </tr>
64
64
  <tr>
65
- <td id='jimmy-dee'>
66
- <a href='https://github.com/jdee'>
67
- <img src='https://github.com/jdee.png?size=140'>
65
+ <td id='helmut-januschka'>
66
+ <a href='https://github.com/hjanuschka'>
67
+ <img src='https://github.com/hjanuschka.png?size=140'>
68
68
  </a>
69
- <h4 align='center'>Jimmy Dee</h4>
69
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
70
70
  </td>
71
- <td id='felix-krause'>
72
- <a href='https://github.com/KrauseFx'>
73
- <img src='https://github.com/KrauseFx.png?size=140'>
71
+ <td id='iulian-onofrei'>
72
+ <a href='https://github.com/revolter'>
73
+ <img src='https://github.com/revolter.png?size=140'>
74
74
  </a>
75
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
75
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
76
76
  </td>
77
77
  <td id='aaron-brager'>
78
78
  <a href='https://github.com/getaaron'>
@@ -80,31 +80,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
80
80
  </a>
81
81
  <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
82
82
  </td>
83
- <td id='luka-mirosevic'>
84
- <a href='https://github.com/lmirosevic'>
85
- <img src='https://github.com/lmirosevic.png?size=140'>
83
+ <td id='jorge-revuelta-h'>
84
+ <a href='https://github.com/minuscorp'>
85
+ <img src='https://github.com/minuscorp.png?size=140'>
86
86
  </a>
87
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
87
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
88
88
  </td>
89
- <td id='helmut-januschka'>
90
- <a href='https://github.com/hjanuschka'>
91
- <img src='https://github.com/hjanuschka.png?size=140'>
89
+ <td id='kohki-miki'>
90
+ <a href='https://github.com/giginet'>
91
+ <img src='https://github.com/giginet.png?size=140'>
92
92
  </a>
93
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
93
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
94
94
  </td>
95
95
  </tr>
96
96
  <tr>
97
- <td id='jan-piotrowski'>
98
- <a href='https://github.com/janpio'>
99
- <img src='https://github.com/janpio.png?size=140'>
100
- </a>
101
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
102
- </td>
103
- <td id='stefan-natchev'>
104
- <a href='https://github.com/snatchev'>
105
- <img src='https://github.com/snatchev.png?size=140'>
97
+ <td id='luka-mirosevic'>
98
+ <a href='https://github.com/lmirosevic'>
99
+ <img src='https://github.com/lmirosevic.png?size=140'>
106
100
  </a>
107
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
101
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
108
102
  </td>
109
103
  <td id='manu-wallner'>
110
104
  <a href='https://github.com/milch'>
@@ -112,49 +106,55 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
112
106
  </a>
113
107
  <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
114
108
  </td>
115
- <td id='fumiya-nakamura'>
116
- <a href='https://github.com/nafu'>
117
- <img src='https://github.com/nafu.png?size=140'>
118
- </a>
119
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
120
- </td>
121
- <td id='jorge-revuelta-h'>
122
- <a href='https://github.com/minuscorp'>
123
- <img src='https://github.com/minuscorp.png?size=140'>
109
+ <td id='olivier-halligon'>
110
+ <a href='https://github.com/AliSoftware'>
111
+ <img src='https://github.com/AliSoftware.png?size=140'>
124
112
  </a>
125
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
113
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
126
114
  </td>
127
- </tr>
128
- <tr>
129
115
  <td id='matthew-ellis'>
130
116
  <a href='https://github.com/matthewellis'>
131
117
  <img src='https://github.com/matthewellis.png?size=140'>
132
118
  </a>
133
119
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
134
120
  </td>
135
- <td id='kohki-miki'>
136
- <a href='https://github.com/giginet'>
137
- <img src='https://github.com/giginet.png?size=140'>
121
+ <td id='jan-piotrowski'>
122
+ <a href='https://github.com/janpio'>
123
+ <img src='https://github.com/janpio.png?size=140'>
138
124
  </a>
139
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
125
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
140
126
  </td>
141
- <td id='josh-holtz'>
142
- <a href='https://github.com/joshdholtz'>
143
- <img src='https://github.com/joshdholtz.png?size=140'>
127
+ </tr>
128
+ <tr>
129
+ <td id='felix-krause'>
130
+ <a href='https://github.com/KrauseFx'>
131
+ <img src='https://github.com/KrauseFx.png?size=140'>
144
132
  </a>
145
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
133
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
146
134
  </td>
147
- <td id='maksym-grebenets'>
148
- <a href='https://github.com/mgrebenets'>
149
- <img src='https://github.com/mgrebenets.png?size=140'>
135
+ <td id='jimmy-dee'>
136
+ <a href='https://github.com/jdee'>
137
+ <img src='https://github.com/jdee.png?size=140'>
150
138
  </a>
151
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
139
+ <h4 align='center'>Jimmy Dee</h4>
152
140
  </td>
153
- <td id='jérôme-lacoste'>
154
- <a href='https://github.com/lacostej'>
155
- <img src='https://github.com/lacostej.png?size=140'>
141
+ <td id='fumiya-nakamura'>
142
+ <a href='https://github.com/nafu'>
143
+ <img src='https://github.com/nafu.png?size=140'>
156
144
  </a>
157
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
145
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
146
+ </td>
147
+ <td id='danielle-tomlinson'>
148
+ <a href='https://github.com/DanToml'>
149
+ <img src='https://github.com/DanToml.png?size=140'>
150
+ </a>
151
+ <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
152
+ </td>
153
+ <td id='stefan-natchev'>
154
+ <a href='https://github.com/snatchev'>
155
+ <img src='https://github.com/snatchev.png?size=140'>
156
+ </a>
157
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
158
158
  </td>
159
159
  </tr>
160
160
  </table>
@@ -6,12 +6,45 @@ module Fastlane
6
6
  def self.run(params)
7
7
  path = params[:path]
8
8
  url_schemes = params[:url_schemes]
9
+ update_url_schemes = params[:update_url_schemes]
9
10
 
10
11
  hash = Plist.parse_xml(path)
11
- hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = url_schemes
12
+
13
+ # Create CFBundleURLTypes array with empty scheme if none exist
14
+ unless hash['CFBundleURLTypes']
15
+ hash['CFBundleURLTypes'] = [{
16
+ 'CFBundleTypeRole' => 'Editor',
17
+ 'CFBundleURLSchemes' => []
18
+ }]
19
+ end
20
+
21
+ # Updates schemes with update block if exists
22
+ # Else updates with array of strings if exist
23
+ # Otherwise shows error to user
24
+ if update_url_schemes
25
+ new_schemes = update_url_schemes.call(hash['CFBundleURLTypes'].first['CFBundleURLSchemes'])
26
+
27
+ # Verify array of strings
28
+ string = "The URL schemes must be an array of strings, got '#{new_schemes}'."
29
+ verify_schemes!(new_schemes, string)
30
+
31
+ hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = new_schemes
32
+ elsif url_schemes
33
+ hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = url_schemes
34
+ else
35
+ UI.user_error!("No `url_schemes` or `update_url_schemes` provided")
36
+ end
12
37
  File.write(path, Plist::Emit.dump(hash))
13
38
  end
14
39
 
40
+ def self.verify_schemes!(url_schemes, error_message)
41
+ UI.user_error!(error_message) unless url_schemes.kind_of?(Array)
42
+
43
+ url_schemes.each do |url_scheme|
44
+ UI.user_error!(error_message) unless url_scheme.kind_of?(String)
45
+ end
46
+ end
47
+
15
48
  def self.description
16
49
  'Updates the URL schemes in the given Info.plist'
17
50
  end
@@ -34,16 +67,17 @@ module Fastlane
34
67
  env_name: "FL_UPDATE_URL_SCHEMES_SCHEMES",
35
68
  description: 'The new URL schemes',
36
69
  is_string: false,
37
- optional: false,
70
+ optional: true,
38
71
  verify_block: proc do |url_schemes|
39
72
  string = "The URL schemes must be an array of strings, got '#{url_schemes}'."
40
- UI.user_error!(string) unless url_schemes.kind_of?(Array)
41
-
42
- url_schemes.each do |url_scheme|
43
- UI.user_error!(string) unless url_scheme.kind_of?(String)
44
- end
73
+ verify_schemes!(url_schemes, string)
45
74
  end
46
- )
75
+ ),
76
+
77
+ FastlaneCore::ConfigItem.new(key: :update_url_schemes,
78
+ description: "Block that is called to update schemes with current schemes passed in as parameter",
79
+ optional: true,
80
+ is_string: false)
47
81
  ]
48
82
  end
49
83
 
@@ -72,6 +106,12 @@ module Fastlane
72
106
  'update_url_schemes(
73
107
  path: "path/to/Info.plist",
74
108
  url_schemes: ["com.myapp"]
109
+ )',
110
+ 'update_url_schemes(
111
+ path: "path/to/Info.plist",
112
+ update_url_schemes: proc do |schemes|
113
+ schemes + ["anotherscheme"]
114
+ end
75
115
  )'
76
116
  ]
77
117
  end
@@ -116,8 +116,6 @@ module Fastlane
116
116
 
117
117
  c.option('-u STRING', '--user STRING', String, 'iOS projects only: Your Apple ID')
118
118
 
119
- # CrashlyticsBetaCommandLineHandler.apply_options(c)
120
-
121
119
  c.action do |args, options|
122
120
  is_swift_fastfile = args.include?("swift")
123
121
  Fastlane::Setup.start(user: options.user, is_swift_fastfile: is_swift_fastfile)
@@ -349,10 +349,3 @@ end
349
349
 
350
350
  require 'fastlane/setup/setup_ios'
351
351
  require 'fastlane/setup/setup_android'
352
- require 'fastlane/setup/crashlytics_beta_ui'
353
- require 'fastlane/setup/crashlytics_beta'
354
- require 'fastlane/setup/crashlytics_project_parser'
355
- require 'fastlane/setup/crashlytics_beta_info'
356
- require 'fastlane/setup/crashlytics_beta_info_collector'
357
- require 'fastlane/setup/crashlytics_beta_command_line_handler'
358
- require 'fastlane/setup/crashlytics_beta_user_email_fetcher'
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.85.0.beta.20180308050114'.freeze
2
+ VERSION = '2.85.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
@@ -3426,12 +3426,14 @@ func updateUrbanAirshipConfiguration(plistPath: String,
3426
3426
  _ = runner.executeCommand(command)
3427
3427
  }
3428
3428
  func updateUrlSchemes(path: String,
3429
- urlSchemes: String) {
3429
+ urlSchemes: String? = nil,
3430
+ updateUrlSchemes: String? = nil) {
3430
3431
  let command = RubyCommand(commandID: "", methodName: "update_url_schemes", className: nil, args: [RubyCommand.Argument(name: "path", value: path),
3431
- RubyCommand.Argument(name: "url_schemes", value: urlSchemes)])
3432
+ RubyCommand.Argument(name: "url_schemes", value: urlSchemes),
3433
+ RubyCommand.Argument(name: "update_url_schemes", value: updateUrlSchemes)])
3432
3434
  _ = runner.executeCommand(command)
3433
3435
  }
3434
- func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji.dSYM.zip",
3436
+ func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji.dSYM",
3435
3437
  apiToken: String? = nil,
3436
3438
  gspPath: String? = nil,
3437
3439
  binaryPath: String? = nil,
@@ -3817,4 +3819,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
3817
3819
  let snapshotfile: Snapshotfile = Snapshotfile()
3818
3820
  // Please don't remove the lines below
3819
3821
  // They are used to detect outdated files
3820
- // FastlaneRunnerAPIVersion [0.9.7]
3822
+ // FastlaneRunnerAPIVersion [0.9.8]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.84.0
21
+ // Generated with fastlane 2.85.0
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.85.0.beta.20180308050114
4
+ version: 2.85.0
5
5
  platform: ruby
6
6
  authors:
7
- - Manu Wallner
8
- - Olivier Halligon
9
- - Jimmy Dee
7
+ - Maksym Grebenets
10
8
  - Luka Mirosevic
11
- - Matthew Ellis
12
- - Felix Krause
13
9
  - Fumiya Nakamura
14
- - Aaron Brager
15
10
  - Andrew McBurney
16
- - Maksym Grebenets
11
+ - Olivier Halligon
12
+ - Helmut Januschka
13
+ - Kohki Miki
14
+ - Matthew Ellis
17
15
  - Danielle Tomlinson
18
16
  - Jérôme Lacoste
19
- - Jan Piotrowski
20
- - Josh Holtz
21
- - Helmut Januschka
22
17
  - Iulian Onofrei
18
+ - Jimmy Dee
23
19
  - Stefan Natchev
24
- - Kohki Miki
25
- - Jorge Revuelta H
20
+ - Aaron Brager
21
+ - Jan Piotrowski
26
22
  - Joshua Liebowitz
23
+ - Manu Wallner
24
+ - Felix Krause
25
+ - Jorge Revuelta H
26
+ - Josh Holtz
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
@@ -1196,13 +1196,6 @@ files:
1196
1196
  - fastlane/lib/fastlane/server/json_return_value_processor.rb
1197
1197
  - fastlane/lib/fastlane/server/socket_server.rb
1198
1198
  - fastlane/lib/fastlane/server/socket_server_action_command_executor.rb
1199
- - fastlane/lib/fastlane/setup/crashlytics_beta.rb
1200
- - fastlane/lib/fastlane/setup/crashlytics_beta_command_line_handler.rb
1201
- - fastlane/lib/fastlane/setup/crashlytics_beta_info.rb
1202
- - fastlane/lib/fastlane/setup/crashlytics_beta_info_collector.rb
1203
- - fastlane/lib/fastlane/setup/crashlytics_beta_ui.rb
1204
- - fastlane/lib/fastlane/setup/crashlytics_beta_user_email_fetcher.rb
1205
- - fastlane/lib/fastlane/setup/crashlytics_project_parser.rb
1206
1199
  - fastlane/lib/fastlane/setup/setup.rb
1207
1200
  - fastlane/lib/fastlane/setup/setup_android.rb
1208
1201
  - fastlane/lib/fastlane/setup/setup_ios.rb
@@ -1613,24 +1606,24 @@ metadata:
1613
1606
  post_install_message:
1614
1607
  rdoc_options: []
1615
1608
  require_paths:
1616
- - supply/lib
1609
+ - credentials_manager/lib
1610
+ - pem/lib
1611
+ - snapshot/lib
1617
1612
  - frameit/lib
1613
+ - match/lib
1614
+ - fastlane_core/lib
1615
+ - deliver/lib
1616
+ - scan/lib
1617
+ - supply/lib
1618
1618
  - cert/lib
1619
- - screengrab/lib
1620
- - snapshot/lib
1621
- - pem/lib
1619
+ - fastlane/lib
1620
+ - spaceship/lib
1622
1621
  - pilot/lib
1622
+ - gym/lib
1623
1623
  - precheck/lib
1624
- - match/lib
1624
+ - screengrab/lib
1625
1625
  - sigh/lib
1626
- - gym/lib
1627
- - spaceship/lib
1628
- - scan/lib
1629
- - fastlane_core/lib
1630
- - fastlane/lib
1631
- - deliver/lib
1632
1626
  - produce/lib
1633
- - credentials_manager/lib
1634
1627
  required_ruby_version: !ruby/object:Gem::Requirement
1635
1628
  requirements:
1636
1629
  - - ">="
@@ -1638,12 +1631,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
1638
1631
  version: 2.0.0
1639
1632
  required_rubygems_version: !ruby/object:Gem::Requirement
1640
1633
  requirements:
1641
- - - ">"
1634
+ - - ">="
1642
1635
  - !ruby/object:Gem::Version
1643
- version: 1.3.1
1636
+ version: '0'
1644
1637
  requirements: []
1645
1638
  rubyforge_project:
1646
- rubygems_version: 2.5.2.1
1639
+ rubygems_version: 2.5.2.2
1647
1640
  signing_key:
1648
1641
  specification_version: 4
1649
1642
  summary: The easiest way to automate beta deployments and releases for your iOS and
@@ -1,106 +0,0 @@
1
- module Fastlane
2
- class CrashlyticsBeta
3
- def initialize(beta_info, ui)
4
- @beta_info = beta_info
5
- @ui = ui
6
- end
7
-
8
- def run
9
- setup = Setup.new
10
-
11
- @ui.message('This command will generate a fastlane configuration for distributing your app with Beta by Crashlytics')
12
- @ui.message('so that you can get your testers new builds with a single command!')
13
-
14
- @ui.message('')
15
-
16
- if setup.is_android?
17
- UI.user_error!('Sorry, Beta by Crashlytics configuration is currently only available for iOS projects!')
18
- elsif !setup.is_ios?
19
- UI.user_error!('Please run Beta by Crashlytics configuration from your iOS project folder.')
20
- end
21
-
22
- @ui.message("\nAttempting to detect your project settings in this directory...".cyan)
23
- info_collector = CrashlyticsBetaInfoCollector.new(CrashlyticsProjectParser.new,
24
- CrashlyticsBetaUserEmailFetcher.new,
25
- @ui)
26
- info_collector.collect_info_into(@beta_info)
27
-
28
- if FastlaneCore::FastlaneFolder.setup?
29
- @ui.message("")
30
- @ui.header('Copy and paste the following lane into your Fastfile to use Crashlytics Beta!')
31
- @ui.message("")
32
- puts(lane_template.cyan)
33
- @ui.message("")
34
- else
35
- fastfile = fastfile_template
36
- FileUtils.mkdir_p('fastlane')
37
- File.write('fastlane/Fastfile', fastfile)
38
- @ui.success('A Fastfile has been generated for you at ./fastlane/Fastfile 🚀')
39
- end
40
- @ui.header('Next Steps')
41
- @ui.success('Run the following command to build and upload to Beta by Crashlytics. 🎯')
42
- @ui.message("\n fastlane beta")
43
- @ui.message("")
44
- end
45
-
46
- def lane_template
47
- discovered_crashlytics_path = Fastlane::Helper::CrashlyticsHelper.discover_default_crashlytics_path
48
-
49
- unless expanded_paths_equal?(@beta_info.crashlytics_path, discovered_crashlytics_path)
50
- crashlytics_path_arg = "\n crashlytics_path: '#{@beta_info.crashlytics_path}',"
51
- end
52
-
53
- beta_info_groups = @beta_info.groups_valid? ? "['#{@beta_info.groups.join("', '")}']" : "nil"
54
- beta_info_emails = @beta_info.emails_valid? ? "['#{@beta_info.emails.join("', '")}']" : "nil"
55
-
56
- # rubocop:disable Layout/IndentationConsistency
57
- %{ #
58
- # Learn more here: https://docs.fastlane.tools/getting-started/ios/beta-deployment/
59
- # and: https://docs.fastlane.tools/getting-started/android/beta-deployment/
60
- #
61
- lane :beta do |values|
62
- # Fabric generated this lane for deployment to Crashlytics Beta
63
- # set 'export_method' to 'ad-hoc' if your Crashlytics Beta distribution uses ad-hoc provisioning
64
- build_app(scheme: '#{@beta_info.schemes.first}', export_method: '#{@beta_info.export_method}')
65
-
66
- emails = values[:test_email] ? values[:test_email] : #{beta_info_emails} # You can list more emails here
67
- groups = values[:test_email] ? nil : #{beta_info_groups} # You can define groups on the web and reference them here
68
-
69
- crashlytics(api_token: '#{@beta_info.api_key}',
70
- build_secret: '#{@beta_info.build_secret}',#{crashlytics_path_arg}
71
- emails: emails,
72
- groups: groups,
73
- notes: 'Distributed with fastlane', # Check out the changelog_from_git_commits action
74
- notifications: true) # Should this distribution notify your testers via email?
75
-
76
- # for all available options run `fastlane action crashlytics`
77
-
78
- # You can notify your team in chat that a beta build has been uploaded
79
- # slack(
80
- # slack_url: "https://hooks.slack.com/services/YOUR/TEAM/INFO"
81
- # channel: "beta-releases",
82
- # message: "Successfully uploaded a beta release - see it at https://fabric.io/_/beta"
83
- # )
84
- end}
85
- # rubocop:enable Layout/IndentationConsistency
86
- end
87
-
88
- def expanded_paths_equal?(path1, path2)
89
- return nil if path1.nil? || path2.nil?
90
-
91
- File.expand_path(path1) == File.expand_path(path2)
92
- end
93
-
94
- def fastfile_template
95
- <<-eos
96
- fastlane_version "#{Fastlane::VERSION}"
97
-
98
- default_platform :ios
99
-
100
- platform :ios do
101
- #{lane_template}
102
- end
103
- eos
104
- end
105
- end
106
- end
@@ -1,26 +0,0 @@
1
- module Fastlane
2
- class CrashlyticsBetaCommandLineHandler
3
- def self.info_from_options(options)
4
- beta_info = CrashlyticsBetaInfo.new
5
- beta_info.crashlytics_path = options.crashlytics_path
6
- beta_info.api_key = options.api_key
7
- beta_info.build_secret = options.build_secret
8
- beta_info.emails = options.emails
9
- beta_info.groups = options.groups
10
- beta_info.schemes = [options.scheme] if options.scheme
11
- beta_info.export_method = options.export_method
12
-
13
- beta_info
14
- end
15
-
16
- def self.apply_options(command)
17
- command.option('--crashlytics_path STRING', String, 'Path to Crashlytics.framework')
18
- command.option('--api_key STRING', String, 'Crashlytics API key')
19
- command.option('--build_secret STRING', String, 'Crashlytics build secret')
20
- command.option('--emails ARRAY', Array, 'List of emails to invite')
21
- command.option('--groups ARRAY', Array, 'List of group aliases to invite')
22
- command.option('--scheme STRING', String, 'Xcode scheme')
23
- command.option('--export_method STRING', String, 'Provisioning profile type (ad-hoc, enterprise, development)')
24
- end
25
- end
26
- end
@@ -1,57 +0,0 @@
1
- module Fastlane
2
- class CrashlyticsBetaInfo
3
- EXPORT_METHODS = %w(app-store ad-hoc package enterprise development developer-id).freeze
4
-
5
- attr_accessor :crashlytics_path
6
- attr_accessor :api_key
7
- attr_accessor :build_secret
8
- attr_accessor :emails
9
- attr_accessor :groups
10
- attr_accessor :schemes
11
- attr_accessor :export_method
12
-
13
- def schemes=(schemes)
14
- @schemes = schemes ? schemes.compact : nil
15
- end
16
-
17
- def emails=(emails)
18
- @emails = emails ? emails.compact : nil
19
- end
20
-
21
- def groups=(groups)
22
- @groups = groups ? groups.compact : nil
23
- end
24
-
25
- def api_key_valid?
26
- !api_key.nil? && api_key.to_s.length == 40
27
- end
28
-
29
- def build_secret_valid?
30
- !build_secret.nil? && build_secret.to_s.length == 64
31
- end
32
-
33
- def crashlytics_path_valid?
34
- !crashlytics_path.nil? && File.exist?(crashlytics_path) && File.exist?(File.join(crashlytics_path, 'submit'))
35
- end
36
-
37
- def emails_valid?
38
- !emails.nil? && emails.any? { |email| !email.empty? }
39
- end
40
-
41
- def groups_valid?
42
- !groups.nil? && groups.any? { |groups| !groups.empty? }
43
- end
44
-
45
- def schemes_valid?
46
- !schemes.nil? && schemes.size == 1 && !schemes.first.empty?
47
- end
48
-
49
- def export_method_valid?
50
- !export_method.nil? && !export_method.empty? && EXPORT_METHODS.include?(export_method)
51
- end
52
-
53
- def has_all_detectable_values?
54
- api_key && build_secret && crashlytics_path && emails && schemes
55
- end
56
- end
57
- end
@@ -1,164 +0,0 @@
1
- module Fastlane
2
- class CrashlyticsBetaInfoCollector
3
- def initialize(project_parser, user_email_fetcher, ui)
4
- @project_parser = project_parser
5
- @user_email_fetcher = user_email_fetcher
6
- @ui = ui
7
-
8
- @shown_fabric_org_help = false
9
- end
10
-
11
- # @param info CrashlyticsBetaInfo to supplement with needed info that is collected
12
- def collect_info_into(info)
13
- if user_provided_invalid_values?(info) || !info.has_all_detectable_values?
14
- @ui.message("\nTrying to discover Beta by Crashlytics info from your project...".cyan)
15
- parse_project_info_into(info)
16
- fetch_email_into(info)
17
- end
18
-
19
- prompt_for_missing_values(info)
20
- end
21
-
22
- def user_provided_invalid_values?(info)
23
- invalid = false
24
-
25
- if info.crashlytics_path && !info.crashlytics_path_valid?
26
- @ui.message("The crashlytics_path you provided (#{info.crashlytics_path}) is not valid.")
27
- invalid = true
28
- end
29
-
30
- if info.api_key && !info.api_key_valid?
31
- @ui.message("The api_key you provided (#{info.api_key}) is not valid.")
32
- invalid = true
33
- end
34
-
35
- if info.build_secret && !info.build_secret_valid?
36
- @ui.message("The build_secret you provided (#{info.build_secret}) is not valid.")
37
- invalid = true
38
- end
39
-
40
- if info.emails && !info.emails_valid?
41
- @ui.message("The email you provided (#{info.emails.first}) is not valid.")
42
- invalid = true
43
- end
44
-
45
- if info.schemes && !info.schemes_valid?
46
- @ui.message("The scheme you provided (#{info.schemes.first}) is not valid.")
47
- invalid = true
48
- end
49
-
50
- invalid
51
- end
52
-
53
- def parse_project_info_into(info)
54
- begin
55
- info_hash = @project_parser.parse
56
- rescue => ex
57
- @ui.important(ex.message)
58
- end
59
-
60
- if info_hash
61
- info.api_key = info_hash[:api_key] unless info.api_key_valid?
62
- info.build_secret = info_hash[:build_secret] unless info.build_secret_valid?
63
- info.crashlytics_path = info_hash[:crashlytics_path] unless info.crashlytics_path_valid?
64
- info.schemes = info_hash[:schemes] unless info.schemes_valid?
65
- end
66
- end
67
-
68
- def fetch_email_into(info)
69
- email = @user_email_fetcher.fetch
70
- info.emails = [email] if !info.emails_valid? && email
71
- end
72
-
73
- def prompt_for_missing_values(info)
74
- if !info.crashlytics_path || !info.crashlytics_path_valid?
75
- @ui.important("A Crashlytics submit binary path couldn't be discovered from your project 🔍")
76
- prompt_for_crashlytics_path(info)
77
- end
78
-
79
- if !info.api_key || !info.api_key_valid?
80
- @ui.important("Your Fabric organization's API Key couldn't be discovered from your project 🔍")
81
- show_fabric_org_help unless @shown_fabric_org_help
82
- prompt_for_api_key(info)
83
- end
84
-
85
- if !info.build_secret || !info.build_secret_valid?
86
- @ui.important("Your Fabric organization's Build Secret couldn't be discovered from your project 🔍")
87
- show_fabric_org_help unless @shown_fabric_org_help
88
- prompt_for_build_secret(info)
89
- end
90
-
91
- if (!info.emails || !info.emails_valid?) && !info.groups
92
- @ui.important("Your email address couldn't be discovered from your project 🔍")
93
- prompt_for_email(info)
94
- end
95
-
96
- if !info.schemes || info.schemes.empty?
97
- @ui.important("Your scheme couldn't be discovered from your project 🔍")
98
- prompt_for_schemes(info)
99
- elsif info.schemes.size > 1
100
- @ui.important("Multiple schemes were discovered from your project 🔍")
101
- prompt_for_schemes(info)
102
- end
103
-
104
- info.export_method = 'development' unless info.export_method
105
- prompt_for_export_method(info) unless info.export_method_valid?
106
- end
107
-
108
- def show_fabric_org_help
109
- @ui.important("\nNavigate to https://www.fabric.io/settings/organizations, select the appropriate organization,")
110
- @ui.important('and copy the API Key and Build Secret.')
111
- @shown_fabric_org_help = true
112
- end
113
-
114
- def prompt_for_api_key(info)
115
- loop do
116
- info.api_key = @ui.input("Please provide your Fabric organization's API Key:").strip
117
- break if info.api_key_valid?
118
- @ui.message("The API Key you provided was invalid (must be 40 characters).")
119
- end
120
- end
121
-
122
- def prompt_for_build_secret(info)
123
- loop do
124
- info.build_secret = @ui.input("Please provide your Fabric organization's Build Secret:").strip
125
- break if info.build_secret_valid?
126
- @ui.message("The Build Secret you provided was invalid (must be 64 characters).")
127
- end
128
- end
129
-
130
- def prompt_for_crashlytics_path(info)
131
- loop do
132
- info.crashlytics_path = @ui.input("Please provide the path to Crashlytics.framework:").strip
133
- break if info.crashlytics_path_valid?
134
- @ui.message("A submit binary could not be found at the framework path you provided.")
135
- end
136
- end
137
-
138
- def prompt_for_email(info)
139
- loop do
140
- info.emails = [@ui.input("Please enter an email address to distribute the beta to:").strip]
141
- break if info.emails_valid?
142
- @ui.message("You must provide an email address.")
143
- end
144
- end
145
-
146
- def prompt_for_schemes(info)
147
- current_schemes = info.schemes
148
- if current_schemes.nil? || current_schemes.empty?
149
- loop do
150
- info.schemes = [@ui.input("Please enter the name of the scheme you would like to use:").strip]
151
- break if info.schemes_valid?
152
- @ui.message("You must provide a scheme name.")
153
- end
154
- else
155
- info.schemes = [@ui.choose("\nWhich scheme would you like to use?", current_schemes)]
156
- end
157
- end
158
-
159
- def prompt_for_export_method(info)
160
- @ui.important("The export method you entered was not valid.")
161
- info.export_method = @ui.choose("\nWhich export method would you like to use?", CrashlyticsBetaInfo::EXPORT_METHODS)
162
- end
163
- end
164
- end
@@ -1,33 +0,0 @@
1
- module Fastlane
2
- class CrashlyticsBetaUi
3
- def success(text)
4
- puts(text.green)
5
- end
6
-
7
- def message(text)
8
- puts(text)
9
- end
10
-
11
- def header(text)
12
- FastlaneCore::UI.header(text)
13
- end
14
-
15
- def important(text)
16
- puts(text.yellow)
17
- end
18
-
19
- def input(text)
20
- UI.input(text)
21
- end
22
-
23
- def confirm(text)
24
- UI.confirm(text)
25
- end
26
-
27
- def choose(text, options)
28
- return options[0] unless UI.interactive?
29
- message(text)
30
- Kernel.choose(*options)
31
- end
32
- end
33
- end
@@ -1,13 +0,0 @@
1
- module Fastlane
2
- class CrashlyticsBetaUserEmailFetcher
3
- def initialize(app_file_path = nil)
4
- @app_file_config = CredentialsManager::AppfileConfig.new(app_file_path)
5
- end
6
-
7
- def fetch
8
- @app_file_config.data[:itunes_connect_id] ||
9
- @app_file_config.data[:apple_dev_portal_id] ||
10
- @app_file_config.data[:apple_id]
11
- end
12
- end
13
- end
@@ -1,49 +0,0 @@
1
- require 'xcodeproj'
2
-
3
- module Fastlane
4
- class CrashlyticsProjectParser
5
- # @param project_file_path path to a .xcodeproj file
6
- def initialize(config = {})
7
- FastlaneCore::Project.detect_projects(config)
8
- @project = FastlaneCore::Project.new(config, xcodebuild_list_silent: true, xcodebuild_suppress_stderr: true)
9
-
10
- @target_name = @project.default_build_settings(key: 'TARGETNAME')
11
- @project_file_path = @project.is_workspace ? @project.path.gsub('xcworkspace', 'xcodeproj') : @project.path
12
- end
13
-
14
- def parse
15
- results = {
16
- schemes: @project.schemes
17
- }
18
-
19
- xcode_project = Xcodeproj::Project.open(@project_file_path)
20
- target = xcode_project.targets.find { |t| t.name == @target_name }
21
-
22
- UI.crash!("Unable to locate a target by the name of #{@target_name}") if target.nil?
23
-
24
- scripts = target.build_phases.select { |t| t.class == Xcodeproj::Project::Object::PBXShellScriptBuildPhase }
25
- crash_script = scripts.find { |s| includes_run_script?(s.shell_script) }
26
-
27
- UI.user_error!("Unable to find Crashlytics Run Script Build Phase") if crash_script.nil?
28
-
29
- script_array = crash_script.shell_script.split('\n').find { |line| includes_run_script?(line) }.split(' ')
30
- if script_array.count == 3
31
- results.merge!({
32
- # The run script build phase probably refers to Fabric.framework/run, but the submit binary
33
- # only lives in the Crashlytics.framework, so we'll substitute and try to resolve it that way.
34
- crashlytics_path: File.dirname(script_array[0].gsub("Fabric.framework", "Crashlytics.framework")),
35
- api_key: script_array[1],
36
- build_secret: script_array[2]
37
- })
38
- end
39
-
40
- results
41
- end
42
-
43
- def includes_run_script?(string)
44
- ['Fabric/run', 'Crashlytics/run', 'Fabric.framework/run', 'Crashlytics.framework/run'].any? do |script_path_fragment|
45
- string.include?(script_path_fragment)
46
- end
47
- end
48
- end
49
- end