fastlane 2.99.1 → 2.100.0

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +74 -74
  3. data/deliver/lib/deliver/html_generator.rb +2 -1
  4. data/fastlane/lib/fastlane/actions/download_dsyms.rb +2 -2
  5. data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/github_api.rb +2 -2
  7. data/fastlane/lib/fastlane/actions/jira.rb +14 -1
  8. data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +1 -0
  9. data/fastlane/lib/fastlane/actions/pod_push.rb +1 -0
  10. data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +22 -4
  11. data/fastlane/lib/fastlane/actions/run_tests.rb +5 -0
  12. data/fastlane/lib/fastlane/actions/sonar.rb +7 -1
  13. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +14 -0
  14. data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +11 -3
  15. data/fastlane/lib/fastlane/helper/podspec_helper.rb +1 -1
  16. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -0
  17. data/fastlane/lib/fastlane/swift_lane_manager.rb +4 -0
  18. data/fastlane/lib/fastlane/version.rb +1 -1
  19. data/fastlane/swift/Deliverfile.swift +1 -1
  20. data/fastlane/swift/Fastlane.swift +18 -6
  21. data/fastlane/swift/Gymfile.swift +1 -1
  22. data/fastlane/swift/Matchfile.swift +1 -1
  23. data/fastlane/swift/Precheckfile.swift +1 -1
  24. data/fastlane/swift/Scanfile.swift +1 -1
  25. data/fastlane/swift/Screengrabfile.swift +1 -1
  26. data/fastlane/swift/Snapshotfile.swift +1 -1
  27. data/fastlane/swift/SnapshotfileProtocol.swift +3 -1
  28. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +23 -0
  29. data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +1 -1
  30. data/pilot/lib/pilot/options.rb +1 -1
  31. data/produce/lib/produce/developer_center.rb +2 -2
  32. data/snapshot/lib/assets/SnapshotHelper.swift +2 -2
  33. data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +11 -0
  34. data/snapshot/lib/snapshot/options.rb +7 -0
  35. data/snapshot/lib/snapshot/test_command_generator.rb +1 -1
  36. data/snapshot/lib/snapshot/test_command_generator_base.rb +18 -1
  37. data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +1 -1
  38. data/spaceship/README.md +1 -1
  39. data/spaceship/lib/spaceship/portal/app_service.rb +1 -1
  40. data/spaceship/lib/spaceship/portal/portal_client.rb +0 -1
  41. data/spaceship/lib/spaceship/tunes/app_ratings.rb +1 -1
  42. data/spaceship/lib/spaceship/tunes/spaceship.rb +2 -2
  43. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
  44. data/supply/lib/supply/client.rb +10 -1
  45. data/supply/lib/supply/uploader.rb +7 -4
  46. metadata +15 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cde7fd25ec7ad1f9b2679572e27d6ec673474ebe
4
- data.tar.gz: 3671178c17764f2f9afacc484d6aeacaebcd2630
3
+ metadata.gz: 603c6c4c52a4b7e3ee28a74647967d1a164d57ec
4
+ data.tar.gz: a16ae832039304eeb3a65d8329cc5c2bfd40539f
5
5
  SHA512:
6
- metadata.gz: 6b60cd59ca4aaad546afd7fa15cf1f3ee804b04945e15e21f51b2a2f00d80395fe895301fc9f09497eeba7e742d5d1fd58088dd173ac7a24197e6a2f10599b91
7
- data.tar.gz: b1ef1b30a9aa03755a6a12dec71e27b8c803b00201b974537fcb6f155707e40f7e2e57a62edc53364c5aa05374ecc7cbc899809b3deded0a110c17d245d0202d
6
+ metadata.gz: d9a120cf0031540c113f5b796351f02988ef8868edb67c7cf1941371459ba6a8f36140293ecd4f76476856ade5a7c7287f743c63c13cfeabbd3b14ce780a73bd
7
+ data.tar.gz: 9165f7db15d367bcf5a9503a7a2d304f6c141d56873f8e7104abe5c927ad788717bac03775b84cc4a7e0506b2957d31c3cef592937addadade8ade982d419c8c
data/README.md CHANGED
@@ -32,17 +32,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
32
32
 
33
33
  <table id='team'>
34
34
  <tr>
35
+ <td id='jorge-revuelta-h'>
36
+ <a href='https://github.com/minuscorp'>
37
+ <img src='https://github.com/minuscorp.png?size=140'>
38
+ </a>
39
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
40
+ </td>
41
+ <td id='maksym-grebenets'>
42
+ <a href='https://github.com/mgrebenets'>
43
+ <img src='https://github.com/mgrebenets.png?size=140'>
44
+ </a>
45
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
46
+ </td>
35
47
  <td id='danielle-tomlinson'>
36
48
  <a href='https://github.com/DanToml'>
37
49
  <img src='https://github.com/DanToml.png?size=140'>
38
50
  </a>
39
51
  <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
40
52
  </td>
41
- <td id='jimmy-dee'>
42
- <a href='https://github.com/jdee'>
43
- <img src='https://github.com/jdee.png?size=140'>
53
+ <td id='matthew-ellis'>
54
+ <a href='https://github.com/matthewellis'>
55
+ <img src='https://github.com/matthewellis.png?size=140'>
44
56
  </a>
45
- <h4 align='center'>Jimmy Dee</h4>
57
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
58
+ </td>
59
+ <td id='helmut-januschka'>
60
+ <a href='https://github.com/hjanuschka'>
61
+ <img src='https://github.com/hjanuschka.png?size=140'>
62
+ </a>
63
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
64
+ </td>
65
+ </tr>
66
+ <tr>
67
+ <td id='luka-mirosevic'>
68
+ <a href='https://github.com/lmirosevic'>
69
+ <img src='https://github.com/lmirosevic.png?size=140'>
70
+ </a>
71
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
72
+ </td>
73
+ <td id='andrew-mcburney'>
74
+ <a href='https://github.com/AndrewMcBurney'>
75
+ <img src='https://github.com/AndrewMcBurney.png?size=140'>
76
+ </a>
77
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
46
78
  </td>
47
79
  <td id='olivier-halligon'>
48
80
  <a href='https://github.com/AliSoftware'>
@@ -50,31 +82,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
50
82
  </a>
51
83
  <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
52
84
  </td>
53
- <td id='stefan-natchev'>
54
- <a href='https://github.com/snatchev'>
55
- <img src='https://github.com/snatchev.png?size=140'>
85
+ <td id='aaron-brager'>
86
+ <a href='https://github.com/getaaron'>
87
+ <img src='https://github.com/getaaron.png?size=140'>
56
88
  </a>
57
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
89
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
58
90
  </td>
59
- <td id='iulian-onofrei'>
60
- <a href='https://github.com/revolter'>
61
- <img src='https://github.com/revolter.png?size=140'>
91
+ <td id='kohki-miki'>
92
+ <a href='https://github.com/giginet'>
93
+ <img src='https://github.com/giginet.png?size=140'>
62
94
  </a>
63
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
95
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
64
96
  </td>
65
97
  </tr>
66
98
  <tr>
67
- <td id='jorge-revuelta-h'>
68
- <a href='https://github.com/minuscorp'>
69
- <img src='https://github.com/minuscorp.png?size=140'>
99
+ <td id='jérôme-lacoste'>
100
+ <a href='https://github.com/lacostej'>
101
+ <img src='https://github.com/lacostej.png?size=140'>
70
102
  </a>
71
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
103
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
72
104
  </td>
73
- <td id='andrew-mcburney'>
74
- <a href='https://github.com/AndrewMcBurney'>
75
- <img src='https://github.com/AndrewMcBurney.png?size=140'>
105
+ <td id='iulian-onofrei'>
106
+ <a href='https://github.com/revolter'>
107
+ <img src='https://github.com/revolter.png?size=140'>
76
108
  </a>
77
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
109
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
78
110
  </td>
79
111
  <td id='joshua-liebowitz'>
80
112
  <a href='https://github.com/taquitos'>
@@ -82,37 +114,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
82
114
  </a>
83
115
  <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
84
116
  </td>
85
- <td id='fumiya-nakamura'>
86
- <a href='https://github.com/nafu'>
87
- <img src='https://github.com/nafu.png?size=140'>
117
+ <td id='stefan-natchev'>
118
+ <a href='https://github.com/snatchev'>
119
+ <img src='https://github.com/snatchev.png?size=140'>
88
120
  </a>
89
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
121
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
90
122
  </td>
91
- <td id='jan-piotrowski'>
92
- <a href='https://github.com/janpio'>
93
- <img src='https://github.com/janpio.png?size=140'>
123
+ <td id='jimmy-dee'>
124
+ <a href='https://github.com/jdee'>
125
+ <img src='https://github.com/jdee.png?size=140'>
94
126
  </a>
95
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
127
+ <h4 align='center'>Jimmy Dee</h4>
96
128
  </td>
97
129
  </tr>
98
130
  <tr>
99
- <td id='matthew-ellis'>
100
- <a href='https://github.com/matthewellis'>
101
- <img src='https://github.com/matthewellis.png?size=140'>
102
- </a>
103
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
104
- </td>
105
- <td id='aaron-brager'>
106
- <a href='https://github.com/getaaron'>
107
- <img src='https://github.com/getaaron.png?size=140'>
131
+ <td id='manu-wallner'>
132
+ <a href='https://github.com/milch'>
133
+ <img src='https://github.com/milch.png?size=140'>
108
134
  </a>
109
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
135
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
110
136
  </td>
111
- <td id='maksym-grebenets'>
112
- <a href='https://github.com/mgrebenets'>
113
- <img src='https://github.com/mgrebenets.png?size=140'>
137
+ <td id='fumiya-nakamura'>
138
+ <a href='https://github.com/nafu'>
139
+ <img src='https://github.com/nafu.png?size=140'>
114
140
  </a>
115
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
141
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
116
142
  </td>
117
143
  <td id='felix-krause'>
118
144
  <a href='https://github.com/KrauseFx'>
@@ -120,6 +146,12 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
120
146
  </a>
121
147
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
122
148
  </td>
149
+ <td id='jan-piotrowski'>
150
+ <a href='https://github.com/janpio'>
151
+ <img src='https://github.com/janpio.png?size=140'>
152
+ </a>
153
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
154
+ </td>
123
155
  <td id='josh-holtz'>
124
156
  <a href='https://github.com/joshdholtz'>
125
157
  <img src='https://github.com/joshdholtz.png?size=140'>
@@ -127,38 +159,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
127
159
  <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
128
160
  </td>
129
161
  </tr>
130
- <tr>
131
- <td id='kohki-miki'>
132
- <a href='https://github.com/giginet'>
133
- <img src='https://github.com/giginet.png?size=140'>
134
- </a>
135
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
136
- </td>
137
- <td id='helmut-januschka'>
138
- <a href='https://github.com/hjanuschka'>
139
- <img src='https://github.com/hjanuschka.png?size=140'>
140
- </a>
141
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
142
- </td>
143
- <td id='jérôme-lacoste'>
144
- <a href='https://github.com/lacostej'>
145
- <img src='https://github.com/lacostej.png?size=140'>
146
- </a>
147
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
148
- </td>
149
- <td id='manu-wallner'>
150
- <a href='https://github.com/milch'>
151
- <img src='https://github.com/milch.png?size=140'>
152
- </a>
153
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
154
- </td>
155
- <td id='luka-mirosevic'>
156
- <a href='https://github.com/lmirosevic'>
157
- <img src='https://github.com/lmirosevic.png?size=140'>
158
- </a>
159
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
160
- </td>
161
- </tr>
162
162
  </table>
163
163
 
164
164
  Special thanks to all [contributors](https://github.com/fastlane/fastlane/graphs/contributors) for extending and improving _fastlane_.
@@ -9,7 +9,8 @@ module Deliver
9
9
 
10
10
  def run(options, screenshots)
11
11
  begin
12
- html_path = self.render(options, screenshots, '.')
12
+ fastlane_path = FastlaneCore::FastlaneFolder.path
13
+ html_path = self.render(options, screenshots, fastlane_path)
13
14
  rescue => ex
14
15
  UI.error(ex.inspect)
15
16
  UI.error(ex.backtrace.join("\n"))
@@ -120,7 +120,7 @@ module Fastlane
120
120
  #####################################################
121
121
 
122
122
  def self.description
123
- "Download dSYM files from Apple App Store Connect for Bitcode apps"
123
+ "Download dSYM files from App Store Connect for Bitcode apps"
124
124
  end
125
125
 
126
126
  def self.details
@@ -135,7 +135,7 @@ module Fastlane
135
135
  SAMPLE
136
136
 
137
137
  [
138
- "This action downloads dSYM files from Apple App Store Connect after the ipa gets re-compiled by Apple. Useful if you have Bitcode enabled.".markdown_preserve_newlines,
138
+ "This action downloads dSYM files from App Store Connect after the ipa gets re-compiled by Apple. Useful if you have Bitcode enabled.".markdown_preserve_newlines,
139
139
  sample
140
140
  ].join("\n")
141
141
  end
@@ -9,7 +9,7 @@ module Fastlane
9
9
  branch = params[:branch]
10
10
  branch_expr = /#{branch}/
11
11
  if Actions.git_branch =~ branch_expr
12
- UI.success("Git branch match `#{branch}`, all good! 💪")
12
+ UI.success("Git branch matches `#{branch}`, all good! 💪")
13
13
  else
14
14
  UI.user_error!("Git is not on a branch matching `#{branch}`. Current branch is `#{Actions.git_branch}`! Please ensure the repo is checked out to the correct branch.")
15
15
  end
@@ -16,7 +16,7 @@ module Fastlane
16
16
  headers = construct_headers(params[:api_token], params[:headers])
17
17
  payload = construct_body(params[:body], params[:raw_body])
18
18
  error_handlers = params[:error_handlers] || {}
19
- secure = params[:secure] || true
19
+ secure = params[:secure]
20
20
 
21
21
  response = call_endpoint(
22
22
  url,
@@ -140,7 +140,7 @@ module Fastlane
140
140
  FastlaneCore::ConfigItem.new(key: :secure,
141
141
  env_name: "FL_GITHUB_API_SECURE",
142
142
  description: "Optionally disable secure requests (ssl_verify_peer)",
143
- is_string: false,
143
+ type: Boolean,
144
144
  default_value: true,
145
145
  optional: true)
146
146
  ]
@@ -6,8 +6,8 @@ module Fastlane
6
6
  require 'jira-ruby'
7
7
 
8
8
  site = params[:url]
9
- context_path = ""
10
9
  auth_type = :basic
10
+ context_path = params[:context_path]
11
11
  username = params[:username]
12
12
  password = params[:password]
13
13
  ticket_id = params[:ticket_id]
@@ -43,6 +43,11 @@ module Fastlane
43
43
  verify_block: proc do |value|
44
44
  UI.user_error!("No url for Jira given, pass using `url: 'url'`") if value.to_s.length == 0
45
45
  end),
46
+ FastlaneCore::ConfigItem.new(key: :context_path,
47
+ env_name: "FL_JIRA_CONTEXT_PATH",
48
+ description: "Appends to the url (ex: \"/jira\")",
49
+ optional: true,
50
+ default_value: ""),
46
51
  FastlaneCore::ConfigItem.new(key: :username,
47
52
  env_name: "FL_JIRA_USERNAME",
48
53
  description: "Username for JIRA instance",
@@ -90,6 +95,14 @@ module Fastlane
90
95
  password: "Your password",
91
96
  ticket_id: "Ticket ID, i.e. IOS-123",
92
97
  comment_text: "Text to post as a comment"
98
+ )',
99
+ 'jira(
100
+ url: "https://yourserverdomain.com",
101
+ context_path: "/jira",
102
+ username: "Your username",
103
+ password: "Your password",
104
+ ticket_id: "Ticket ID, i.e. IOS-123",
105
+ comment_text: "Text to post as a comment"
93
106
  )'
94
107
  ]
95
108
  end
@@ -61,6 +61,7 @@ module Fastlane
61
61
  description: "The sources of repos you want the pod spec to lint with, separated by commas",
62
62
  optional: true,
63
63
  is_string: false,
64
+ type: Array,
64
65
  verify_block: proc do |value|
65
66
  UI.user_error!("Sources must be an array.") unless value.kind_of?(Array)
66
67
  end),
@@ -80,6 +80,7 @@ module Fastlane
80
80
  description: "The sources of repos you want the pod spec to lint with, separated by commas",
81
81
  optional: true,
82
82
  is_string: false,
83
+ type: Array,
83
84
  verify_block: proc do |value|
84
85
  UI.user_error!("Sources must be an array.") unless value.kind_of?(Array)
85
86
  end),
@@ -2,13 +2,31 @@ module Fastlane
2
2
  module Actions
3
3
  class ResetSimulatorContentsAction < Action
4
4
  def self.run(params)
5
+ ios_versions = params[:ios]
6
+
5
7
  if Helper.xcode_at_least?("9")
6
- UI.important("Resetting simulators currently doesn't work with Xcode 9, stay tuned as we are working to add support for all new tools.")
7
- return
8
+ reset_xcode9_and_higher(ios_versions)
9
+ else
10
+ reset_up_to_xcode8(ios_versions)
11
+ end
12
+ end
13
+
14
+ def self.reset_xcode9_and_higher(ios_versions)
15
+ UI.verbose("Resetting simulator contents for Xcode 9 and later")
16
+ simulators = FastlaneCore::DeviceManager.simulators('iOS')
17
+ if ios_versions
18
+ simulators.select! { |s| ios_versions.include?(s.os_version) }
19
+ end
20
+ simulators.each do |simulator|
21
+ FastlaneCore::Simulator.reset(udid: simulator.udid)
8
22
  end
23
+ UI.success('Simulators reset')
24
+ end
9
25
 
10
- if params[:ios]
11
- params[:ios].each do |os_version|
26
+ def self.reset_up_to_xcode8(ios_versions)
27
+ UI.verbose("Resetting simulator contents for Xcode 8 and earlier")
28
+ if ios_versions
29
+ ios_versions.each do |os_version|
12
30
  FastlaneCore::Simulator.reset_all_by_version(os_version: os_version)
13
31
  end
14
32
  else
@@ -22,6 +22,11 @@ module Fastlane
22
22
  Scan::Manager.new.work(values)
23
23
 
24
24
  return true
25
+ rescue FastlaneCore::Interface::FastlaneBuildFailure => ex
26
+ # Specifically catching FastlaneBuildFailure to prevent build/compile errors from being
27
+ # silenced when :fail_build is set to false
28
+ # :fail_build should only suppress testing failures
29
+ raise ex
25
30
  rescue => ex
26
31
  if values[:fail_build]
27
32
  raise ex
@@ -19,6 +19,7 @@ module Fastlane
19
19
  sonar_scanner_args << "-Dsonar.language=\"#{params[:project_language]}\"" if params[:project_language]
20
20
  sonar_scanner_args << "-Dsonar.sourceEncoding=\"#{params[:source_encoding]}\"" if params[:source_encoding]
21
21
  sonar_scanner_args << "-Dsonar.login=\"#{params[:sonar_login]}\"" if params[:sonar_login]
22
+ sonar_scanner_args << "-Dsonar.host.url=\"#{params[:sonar_url]}\"" if params[:sonar_url]
22
23
  sonar_scanner_args << params[:sonar_runner_args] if params[:sonar_runner_args]
23
24
 
24
25
  command = [
@@ -91,7 +92,12 @@ module Fastlane
91
92
  description: "Pass the Sonar Login token (e.g: xxxxxxprivate_token_XXXXbXX7e)",
92
93
  optional: true,
93
94
  is_string: true,
94
- sensitive: true)
95
+ sensitive: true),
96
+ FastlaneCore::ConfigItem.new(key: :sonar_url,
97
+ env_name: "FL_SONAR_URL",
98
+ description: "Pass the url of the Sonar server",
99
+ optional: true,
100
+ is_string: true)
95
101
  ]
96
102
  end
97
103
 
@@ -18,6 +18,9 @@ module Fastlane
18
18
  dsym_paths << params[:dsym_path] if params[:dsym_path]
19
19
  dsym_paths += Actions.lane_context[SharedValues::DSYM_PATHS] if Actions.lane_context[SharedValues::DSYM_PATHS]
20
20
 
21
+ # Allows adding of additional multiple dsym_paths since :dsym_path can be autoset by other actions
22
+ dsym_paths += params[:dsym_paths] if params[:dsym_paths]
23
+
21
24
  if dsym_paths.count == 0
22
25
  UI.error("Couldn't find any dSYMs, please pass them using the dsym_path option")
23
26
  return nil
@@ -151,6 +154,17 @@ module Fastlane
151
154
  UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
152
155
  UI.user_error!("Symbolication file needs to be dSYM or zip") unless value.end_with?(".zip", ".dSYM")
153
156
  end),
157
+ FastlaneCore::ConfigItem.new(key: :dsym_paths,
158
+ env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_DSYM_PATHS",
159
+ description: "Paths to the DSYM files or zips to upload",
160
+ optional: true,
161
+ type: Array,
162
+ verify_block: proc do |values|
163
+ values.each do |value|
164
+ UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
165
+ UI.user_error!("Symbolication file needs to be dSYM or zip") unless value.end_with?(".zip", ".dSYM")
166
+ end
167
+ end),
154
168
  FastlaneCore::ConfigItem.new(key: :api_token,
155
169
  env_name: "CRASHLYTICS_API_TOKEN",
156
170
  sensitive: true,
@@ -8,8 +8,13 @@ module Fastlane
8
8
  path = params[:crashlytics_path]
9
9
 
10
10
  # Finding submit binary inside of given Crashlytics path (for backwards compatability)
11
- if path && File.basename(path) == "Crashlytics.framework"
12
- path = Dir[File.join(path, '**', 'submit')].last
11
+ if path
12
+ if File.basename(path) != "submit"
13
+ path = Dir[File.join(path, '**', 'submit')].last
14
+ UI.verbose(":crashlytics_path passed through parameters did not point to a submit binary. Using this submit binary on that path instead: '#{path}'")
15
+ else
16
+ UI.verbose("Using :crashlytics_path passed in through parameters: '#{path}'")
17
+ end
13
18
  end
14
19
 
15
20
  # Check for submit binary outside of Crashlytics.framework (for Crashlytics 3.4.1 and over)
@@ -20,7 +25,7 @@ module Fastlane
20
25
  path ||= Dir["./**/Crashlytics.framework/submit"].last
21
26
 
22
27
  if path && path.downcase.include?("crashlytics.framework")
23
- UI.deprecated("Crashlytics has removed support for the submit binary in Crashlytics.framework as of 3.4.1. Please change :crashlytics_path to `<PODS_ROOT>/Crashlytics/submit`")
28
+ UI.deprecated("Crashlytics has moved the submit binary outside of Crashlytics.framework directory as of 3.4.1. Please change :crashlytics_path to `<PODS_ROOT>/Crashlytics/submit`")
24
29
  end
25
30
 
26
31
  return path
@@ -31,6 +36,9 @@ module Fastlane
31
36
  unless submit_binary
32
37
  UI.user_error!("Couldn't find Crashlytics' submit binary in current directory. Make sure to add the 'Crashlytics' pod to your 'Podfile' and run `pod update`")
33
38
  end
39
+ if File.basename(submit_binary) != "submit"
40
+ UI.user_error!("Invalid crashlytics path was detected with '#{submit_binary}'. Path must point to the `submit` binary (example: './Pods/Crashlytics/submit')")
41
+ end
34
42
  submit_binary = "Crashlytics.framework/submit" if Helper.test?
35
43
 
36
44
  command = []
@@ -10,7 +10,7 @@ module Fastlane
10
10
  def initialize(path = nil, require_variable_prefix = true)
11
11
  version_var_name = 'version'
12
12
  variable_prefix = require_variable_prefix ? /\w\./ : //
13
- @version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?)(?<end>['"])/i
13
+ @version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?(-(?<prerelease>(.+)))?)(?<end>['"])/i
14
14
 
15
15
  return unless (path || '').length > 0
16
16
  UI.user_error!("Could not find podspec file at path '#{path}'") unless File.exist?(path)
@@ -158,6 +158,7 @@ Style/MethodCallWithArgsParentheses:
158
158
  IgnoredMethods:
159
159
  - require
160
160
  - require_relative
161
+ - fastlane_require
161
162
  - gem
162
163
  - program
163
164
  - command
@@ -10,6 +10,10 @@ module Fastlane
10
10
  UI.user_error!("lane must be a string") unless lane.kind_of?(String) || lane.nil?
11
11
  UI.user_error!("parameters must be a hash") unless parameters.kind_of?(Hash) || parameters.nil?
12
12
 
13
+ # Sets environment variable and lane context for lane name
14
+ ENV["FASTLANE_LANE_NAME"] = lane
15
+ Actions.lane_context[Actions::SharedValues::LANE_NAME] = lane
16
+
13
17
  # xcodeproj has a bug in certain versions that causes it to change directories
14
18
  # and not return to the original working directory
15
19
  # https://github.com/CocoaPods/Xcodeproj/issues/426
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.99.1'.freeze
2
+ VERSION = '2.100.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.99.1
21
+ // Generated with fastlane 2.100.0
@@ -724,6 +724,7 @@ func captureIosScreenshots(workspace: String? = nil,
724
724
  numberOfRetries: Int = 1,
725
725
  stopAfterFirstError: Bool = false,
726
726
  derivedDataPath: String? = nil,
727
+ resultBundle: Bool = false,
727
728
  testTargetName: String? = nil,
728
729
  namespaceLogFiles: String? = nil,
729
730
  concurrentSimulators: Bool = true) {
@@ -756,6 +757,7 @@ func captureIosScreenshots(workspace: String? = nil,
756
757
  RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
757
758
  RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
758
759
  RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
760
+ RubyCommand.Argument(name: "result_bundle", value: resultBundle),
759
761
  RubyCommand.Argument(name: "test_target_name", value: testTargetName),
760
762
  RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
761
763
  RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
@@ -790,6 +792,7 @@ func captureScreenshots(workspace: String? = nil,
790
792
  numberOfRetries: Int = 1,
791
793
  stopAfterFirstError: Bool = false,
792
794
  derivedDataPath: String? = nil,
795
+ resultBundle: Bool = false,
793
796
  testTargetName: String? = nil,
794
797
  namespaceLogFiles: String? = nil,
795
798
  concurrentSimulators: Bool = true) {
@@ -822,6 +825,7 @@ func captureScreenshots(workspace: String? = nil,
822
825
  RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
823
826
  RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
824
827
  RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
828
+ RubyCommand.Argument(name: "result_bundle", value: resultBundle),
825
829
  RubyCommand.Argument(name: "test_target_name", value: testTargetName),
826
830
  RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
827
831
  RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
@@ -1968,11 +1972,13 @@ func jazzy(config: String? = nil) {
1968
1972
  _ = runner.executeCommand(command)
1969
1973
  }
1970
1974
  func jira(url: String,
1975
+ contextPath: String = "",
1971
1976
  username: String,
1972
1977
  password: String,
1973
1978
  ticketId: String,
1974
1979
  commentText: String) {
1975
1980
  let command = RubyCommand(commandID: "", methodName: "jira", className: nil, args: [RubyCommand.Argument(name: "url", value: url),
1981
+ RubyCommand.Argument(name: "context_path", value: contextPath),
1976
1982
  RubyCommand.Argument(name: "username", value: username),
1977
1983
  RubyCommand.Argument(name: "password", value: password),
1978
1984
  RubyCommand.Argument(name: "ticket_id", value: ticketId),
@@ -2340,7 +2346,7 @@ func pluginScores(outputPath: String,
2340
2346
  func podLibLint(useBundleExec: Bool = true,
2341
2347
  verbose: String? = nil,
2342
2348
  allowWarnings: String? = nil,
2343
- sources: String? = nil,
2349
+ sources: [String]? = nil,
2344
2350
  useLibraries: Bool = false,
2345
2351
  failFast: Bool = false,
2346
2352
  `private`: Bool = false,
@@ -2360,7 +2366,7 @@ func podPush(useBundleExec: Bool = false,
2360
2366
  repo: String? = nil,
2361
2367
  allowWarnings: String? = nil,
2362
2368
  useLibraries: String? = nil,
2363
- sources: String? = nil,
2369
+ sources: [String]? = nil,
2364
2370
  swiftVersion: String? = nil,
2365
2371
  verbose: Bool = false) {
2366
2372
  let command = RubyCommand(commandID: "", methodName: "pod_push", className: nil, args: [RubyCommand.Argument(name: "use_bundle_exec", value: useBundleExec),
@@ -3134,6 +3140,7 @@ func snapshot(workspace: String? = snapshotfile.workspace,
3134
3140
  numberOfRetries: Int = snapshotfile.numberOfRetries,
3135
3141
  stopAfterFirstError: Bool = snapshotfile.stopAfterFirstError,
3136
3142
  derivedDataPath: String? = snapshotfile.derivedDataPath,
3143
+ resultBundle: Bool = snapshotfile.resultBundle,
3137
3144
  testTargetName: String? = snapshotfile.testTargetName,
3138
3145
  namespaceLogFiles: String? = snapshotfile.namespaceLogFiles,
3139
3146
  concurrentSimulators: Bool = snapshotfile.concurrentSimulators) {
@@ -3166,6 +3173,7 @@ func snapshot(workspace: String? = snapshotfile.workspace,
3166
3173
  RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
3167
3174
  RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
3168
3175
  RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
3176
+ RubyCommand.Argument(name: "result_bundle", value: resultBundle),
3169
3177
  RubyCommand.Argument(name: "test_target_name", value: testTargetName),
3170
3178
  RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
3171
3179
  RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
@@ -3179,7 +3187,8 @@ func sonar(projectConfigurationPath: String? = nil,
3179
3187
  projectLanguage: String? = nil,
3180
3188
  sourceEncoding: String? = nil,
3181
3189
  sonarRunnerArgs: String? = nil,
3182
- sonarLogin: String? = nil) {
3190
+ sonarLogin: String? = nil,
3191
+ sonarUrl: String? = nil) {
3183
3192
  let command = RubyCommand(commandID: "", methodName: "sonar", className: nil, args: [RubyCommand.Argument(name: "project_configuration_path", value: projectConfigurationPath),
3184
3193
  RubyCommand.Argument(name: "project_key", value: projectKey),
3185
3194
  RubyCommand.Argument(name: "project_name", value: projectName),
@@ -3188,7 +3197,8 @@ func sonar(projectConfigurationPath: String? = nil,
3188
3197
  RubyCommand.Argument(name: "project_language", value: projectLanguage),
3189
3198
  RubyCommand.Argument(name: "source_encoding", value: sourceEncoding),
3190
3199
  RubyCommand.Argument(name: "sonar_runner_args", value: sonarRunnerArgs),
3191
- RubyCommand.Argument(name: "sonar_login", value: sonarLogin)])
3200
+ RubyCommand.Argument(name: "sonar_login", value: sonarLogin),
3201
+ RubyCommand.Argument(name: "sonar_url", value: sonarUrl)])
3192
3202
  _ = runner.executeCommand(command)
3193
3203
  }
3194
3204
  func splunkmint(dsym: String? = nil,
@@ -3581,13 +3591,15 @@ func updateUrlSchemes(path: String,
3581
3591
  RubyCommand.Argument(name: "update_url_schemes", value: updateUrlSchemes)])
3582
3592
  _ = runner.executeCommand(command)
3583
3593
  }
3584
- func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji.dSYM.zip",
3594
+ func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji2.dSYM",
3595
+ dsymPaths: [String]? = nil,
3585
3596
  apiToken: String? = nil,
3586
3597
  gspPath: String? = nil,
3587
3598
  binaryPath: String? = nil,
3588
3599
  platform: String = "ios",
3589
3600
  dsymWorkerThreads: Int = 1) {
3590
3601
  let command = RubyCommand(commandID: "", methodName: "upload_symbols_to_crashlytics", className: nil, args: [RubyCommand.Argument(name: "dsym_path", value: dsymPath),
3602
+ RubyCommand.Argument(name: "dsym_paths", value: dsymPaths),
3591
3603
  RubyCommand.Argument(name: "api_token", value: apiToken),
3592
3604
  RubyCommand.Argument(name: "gsp_path", value: gspPath),
3593
3605
  RubyCommand.Argument(name: "binary_path", value: binaryPath),
@@ -4051,4 +4063,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
4051
4063
  let snapshotfile: Snapshotfile = Snapshotfile()
4052
4064
  // Please don't remove the lines below
4053
4065
  // They are used to detect outdated files
4054
- // FastlaneRunnerAPIVersion [0.9.22]
4066
+ // FastlaneRunnerAPIVersion [0.9.23]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.99.1
21
+ // Generated with fastlane 2.100.0
@@ -28,6 +28,7 @@ protocol SnapshotfileProtocol: class {
28
28
  var numberOfRetries: Int { get }
29
29
  var stopAfterFirstError: Bool { get }
30
30
  var derivedDataPath: String? { get }
31
+ var resultBundle: Bool { get }
31
32
  var testTargetName: String? { get }
32
33
  var namespaceLogFiles: String? { get }
33
34
  var concurrentSimulators: Bool { get }
@@ -63,6 +64,7 @@ extension SnapshotfileProtocol {
63
64
  var numberOfRetries: Int { return 1 }
64
65
  var stopAfterFirstError: Bool { return false }
65
66
  var derivedDataPath: String? { return nil }
67
+ var resultBundle: Bool { return false }
66
68
  var testTargetName: String? { return nil }
67
69
  var namespaceLogFiles: String? { return nil }
68
70
  var concurrentSimulators: Bool { return true }
@@ -70,4 +72,4 @@ extension SnapshotfileProtocol {
70
72
 
71
73
  // Please don't remove the lines below
72
74
  // They are used to detect outdated files
73
- // FastlaneRunnerAPIVersion [0.9.3]
75
+ // FastlaneRunnerAPIVersion [0.9.4]
@@ -19,6 +19,10 @@ module FastlaneCore
19
19
  end
20
20
 
21
21
  def action_launched(launch_context: nil)
22
+ unless did_show_message?
23
+ show_message
24
+ end
25
+
22
26
  if @launch_event_sent || launch_context.p_hash.nil?
23
27
  return
24
28
  end
@@ -40,6 +44,25 @@ module FastlaneCore
40
44
  def action_completed(completion_context: nil)
41
45
  end
42
46
 
47
+ def show_message
48
+ UI.message("Sending anonymous analytics information")
49
+ UI.message("Learn more at https://docs.fastlane.tools/#metrics")
50
+ UI.message("No personal or sensitive data is sent.")
51
+ UI.message("You can disable this by adding `opt_out_usage` at the top of your Fastfile")
52
+ end
53
+
54
+ def did_show_message?
55
+ file_name = ".did_show_opt_info"
56
+
57
+ new_path = File.join(FastlaneCore.fastlane_user_dir, file_name)
58
+ did_show = File.exist?(new_path)
59
+
60
+ return did_show if did_show
61
+
62
+ File.write(new_path, '1')
63
+ false
64
+ end
65
+
43
66
  def finalize_session
44
67
  @threads.map(&:join)
45
68
  end
@@ -43,7 +43,7 @@ module FastlaneCore
43
43
 
44
44
  begin
45
45
  # rubocop:disable Security/Eval
46
- puts(eval(content)) # this is okay in this case
46
+ eval(content) # this is okay in this case
47
47
  # rubocop:enable Security/Eval
48
48
 
49
49
  print_resulting_config_values unless skip_printing_values # only on success
@@ -77,7 +77,7 @@ module Pilot
77
77
  deprecated: true,
78
78
  short_option: "-x",
79
79
  env_name: "PILOT_UPDATE_BUILD_INFO_ON_UPLOAD",
80
- description: "Update build info immediately after validation. This is deprecated and will be removed in a future release. iTunesConnect no longer supports setting build info until after build processing has completed, which is when build info is updated by default",
80
+ description: "Update build info immediately after validation. This is deprecated and will be removed in a future release. App Store Connect no longer supports setting build info until after build processing has completed, which is when build info is updated by default",
81
81
  is_string: false,
82
82
  default_value: false),
83
83
  FastlaneCore::ConfigItem.new(key: :apple_id,
@@ -81,8 +81,8 @@ module Produce
81
81
  app_service = Spaceship.app_service
82
82
  enabled_clean_options = {}
83
83
 
84
- # "enable_services" was deprecated in favor of "enable_services"
85
- config_enabled_services = Produce.config[:enable_services] || Produce.config[:enable_services]
84
+ # "enabled_features" was deprecated in favor of "enable_services"
85
+ config_enabled_services = Produce.config[:enable_services] || Produce.config[:enabled_features]
86
86
 
87
87
  config_enabled_services.each do |k, v|
88
88
  if k.to_sym == :data_protection
@@ -257,7 +257,7 @@ private extension XCUIElementQuery {
257
257
  }
258
258
 
259
259
  var deviceStatusBars: XCUIElementQuery {
260
- let deviceWidth = XCUIApplication().frame.width
260
+ let deviceWidth = XCUIApplication().windows.firstMatch.frame.width
261
261
 
262
262
  let isStatusBar = NSPredicate { (evaluatedObject, _) in
263
263
  guard let element = evaluatedObject as? XCUIElementAttributes else { return false }
@@ -277,4 +277,4 @@ private extension CGFloat {
277
277
 
278
278
  // Please don't remove the lines below
279
279
  // They are used to detect outdated configuration files
280
- // SnapshotHelperVersion [1.10]
280
+ // SnapshotHelperVersion [1.11]
@@ -10,6 +10,17 @@ module Snapshot
10
10
  UI.verbose("Patching simulator to work with secure text fields")
11
11
 
12
12
  Helper.backticks("defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0", print: FastlaneCore::Globals.verbose?)
13
+
14
+ # For > Xcode 9
15
+ # https://stackoverflow.com/questions/38010494/is-it-possible-to-toggle-software-keyboard-via-the-code-in-ui-test/47820883#47820883
16
+ Helper.backticks("/usr/libexec/PlistBuddy "\
17
+ "-c \"Print :DevicePreferences\" ~/Library/Preferences/com.apple.iphonesimulator.plist | "\
18
+ "perl -lne 'print $1 if /^ (\\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy "\
19
+ "-c \"Set :DevicePreferences:$a:ConnectHardwareKeyboard false\" "\
20
+ "~/Library/Preferences/com.apple.iphonesimulator.plist "\
21
+ "|| /usr/libexec/PlistBuddy "\
22
+ "-c \"Add :DevicePreferences:$a:ConnectHardwareKeyboard bool false\" "\
23
+ "~/Library/Preferences/com.apple.iphonesimulator.plist; done", print: FastlaneCore::Globals.verbose?)
13
24
  end
14
25
  end
15
26
  end
@@ -195,6 +195,13 @@ module Snapshot
195
195
  env_name: "SNAPSHOT_DERIVED_DATA_PATH",
196
196
  description: "The directory where build products and other derived data will go",
197
197
  optional: true),
198
+ FastlaneCore::ConfigItem.new(key: :result_bundle,
199
+ short_option: "-z",
200
+ env_name: "SNAPSHOT_RESULT_BUNDLE",
201
+ is_string: false,
202
+ description: "Should an Xcode result bundle be generated in the output directory",
203
+ default_value: false,
204
+ optional: true),
198
205
  FastlaneCore::ConfigItem.new(key: :test_target_name,
199
206
  env_name: "SNAPSHOT_TEST_TARGET_NAME",
200
207
  description: "The name of the target you want to test (if you desire to override the Target Application from Xcode)",
@@ -11,7 +11,7 @@ module Snapshot
11
11
  def generate(devices: nil, language: nil, locale: nil, log_path: nil)
12
12
  parts = prefix
13
13
  parts << "xcodebuild"
14
- parts += options
14
+ parts += options(language, locale)
15
15
  parts += destination(devices)
16
16
  parts += build_settings
17
17
  parts += actions
@@ -17,12 +17,15 @@ module Snapshot
17
17
  UI.user_error!("No project/workspace found")
18
18
  end
19
19
 
20
- def options
20
+ def options(language, locale)
21
21
  config = Snapshot.config
22
+ result_bundle_path = resolve_result_bundle_path(language, locale) if config[:result_bundle]
23
+
22
24
  options = []
23
25
  options += project_path_array
24
26
  options << "-sdk '#{config[:sdk]}'" if config[:sdk]
25
27
  options << "-derivedDataPath '#{derived_data_path}'"
28
+ options << "-resultBundlePath '#{result_bundle_path}'" if result_bundle_path
26
29
  options << config[:xcargs] if config[:xcargs]
27
30
  return options
28
31
  end
@@ -80,6 +83,20 @@ module Snapshot
80
83
  Snapshot.cache[:derived_data_path] ||= (Snapshot.config[:derived_data_path] || Dir.mktmpdir("snapshot_derived"))
81
84
  end
82
85
 
86
+ def resolve_result_bundle_path(language, locale)
87
+ Snapshot.cache[:result_bundle_path] = {}
88
+ language_key = locale || language
89
+
90
+ unless Snapshot.cache[:result_bundle_path][language_key]
91
+ path = File.join(Snapshot.config[:output_directory], "test_output", language_key, Snapshot.config[:scheme]) + ".test_result"
92
+ if File.directory?(path)
93
+ FileUtils.remove_dir(path)
94
+ end
95
+ Snapshot.cache[:result_bundle_path][language_key] = path
96
+ end
97
+ return Snapshot.cache[:result_bundle_path][language_key]
98
+ end
99
+
83
100
  def initialize
84
101
  not_implemented(__method__)
85
102
  end
@@ -12,7 +12,7 @@ module Snapshot
12
12
  def generate(device_type: nil, language: nil, locale: nil)
13
13
  parts = prefix
14
14
  parts << "xcodebuild"
15
- parts += options
15
+ parts += options(language, locale)
16
16
  parts += destination(device_type)
17
17
  parts += build_settings
18
18
  parts += actions
@@ -109,7 +109,7 @@ This requires you to install `pry` using `sudo gem install pry`. `pry` is not in
109
109
 
110
110
  ## App Store Connect API
111
111
 
112
- ##### Open [iTunesConnect.md](docs/iTunesConnect.md) for code samples
112
+ ##### Open [AppStoreConnect.md](docs/AppStoreConnect.md) for code samples
113
113
 
114
114
  ## 2 Step Verification
115
115
 
@@ -63,7 +63,7 @@ module Spaceship
63
63
  PushNotification = AppService.new_service("push")
64
64
  SiriKit = AppService.new_service("SI015DKUHP")
65
65
  VPNConfiguration = AppService.new_service("V66P55NK2I")
66
- Wallet = AppService.new_service("passbook")
66
+ Wallet = AppService.new_service("pass")
67
67
  WirelessAccessory = AppService.new_service("WC421J6T7P")
68
68
 
69
69
  constants.each do |c|
@@ -184,7 +184,6 @@ module Spaceship
184
184
  {
185
185
  type: 'explicit',
186
186
  identifier: bundle_id,
187
- push: 'on',
188
187
  inAppPurchase: 'on',
189
188
  gameCenter: 'on'
190
189
  }
@@ -2,7 +2,7 @@ require_relative 'app_review'
2
2
 
3
3
  module Spaceship
4
4
  module Tunes
5
- # Represents app ratings from iTunesConnect
5
+ # Represents app ratings from App Store Connect
6
6
  class AppRatings < TunesBase
7
7
  # @return (Spaceship::Tunes::Application) A reference to the application
8
8
  # this version is for
@@ -29,8 +29,8 @@ module Spaceship
29
29
  # If the user is in multiple teams, a team selection is shown.
30
30
  # The user can then select a team by entering the number
31
31
  #
32
- # @param team_id (String) (optional): The ID of a iTunesConnect team
33
- # @param team_name (String) (optional): The name of a iTunesConnect team
32
+ # @param team_id (String) (optional): The ID of an App Store Connect team
33
+ # @param team_name (String) (optional): The name of an App Store Connect team
34
34
  def select_team(team_id: nil, team_name: nil)
35
35
  @client.select_team(team_id: team_id, team_name: team_name)
36
36
  end
@@ -56,8 +56,8 @@ module Spaceship
56
56
  # Shows a team selection for the user in the terminal. This should not be
57
57
  # called on CI systems
58
58
  #
59
- # @param team_id (String) (optional): The ID of a iTunesConnect team
60
- # @param team_name (String) (optional): The name of a iTunesConnect team
59
+ # @param team_id (String) (optional): The ID of an App Store Connect team
60
+ # @param team_name (String) (optional): The name of an App Store Connect team
61
61
  def select_team(team_id: nil, team_name: nil)
62
62
  t_id = (team_id || ENV['FASTLANE_ITC_TEAM_ID'] || '').strip
63
63
  t_name = (team_name || ENV['FASTLANE_ITC_TEAM_NAME'] || '').strip
@@ -156,7 +156,7 @@ module Supply
156
156
  end
157
157
  end
158
158
 
159
- # Get a list of all apks verion codes - returns the list of version codes
159
+ # Get a list of all APK version codes - returns the list of version codes
160
160
  def apks_version_codes
161
161
  ensure_active_edit!
162
162
 
@@ -165,6 +165,15 @@ module Supply
165
165
  return Array(result.apks).map(&:version_code)
166
166
  end
167
167
 
168
+ # Get a list of all AAB version codes - returns the list of version codes
169
+ def aab_version_codes
170
+ ensure_active_edit!
171
+
172
+ result = call_google_api { android_publisher.list_edit_bundles(current_package_name, current_edit.id) }
173
+
174
+ return Array(result.bundles).map(&:version_code)
175
+ end
176
+
168
177
  # Get a list of all apk listings (changelogs) - returns the list
169
178
  def apk_listings(apk_version_code)
170
179
  ensure_active_edit!
@@ -66,13 +66,16 @@ module Supply
66
66
  client.apks_version_codes.each do |apk_version_code|
67
67
  upload_changelog(language, apk_version_code)
68
68
  end
69
+ client.aab_version_codes.each do |aab_version_code|
70
+ upload_changelog(language, aab_version_code)
71
+ end
69
72
  end
70
73
 
71
- def upload_changelog(language, apk_version_code)
72
- path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{apk_version_code}.txt")
74
+ def upload_changelog(language, version_code)
75
+ path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{version_code}.txt")
73
76
  if File.exist?(path)
74
- UI.message("Updating changelog for code version '#{apk_version_code}' and language '#{language}'...")
75
- apk_listing = ApkListing.new(File.read(path, encoding: 'UTF-8'), language, apk_version_code)
77
+ UI.message("Updating changelog for code version '#{version_code}' and language '#{language}'...")
78
+ apk_listing = ApkListing.new(File.read(path, encoding: 'UTF-8'), language, version_code)
76
79
  client.update_apk_listing_for_language(apk_listing)
77
80
  end
78
81
  end
metadata CHANGED
@@ -1,33 +1,33 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.99.1
4
+ version: 2.100.0
5
5
  platform: ruby
6
6
  authors:
7
+ - Aaron Brager
8
+ - Jorge Revuelta H
9
+ - Joshua Liebowitz
10
+ - Maksym Grebenets
7
11
  - Jimmy Dee
8
- - Josh Holtz
12
+ - Helmut Januschka
13
+ - Fumiya Nakamura
9
14
  - Stefan Natchev
10
- - Felix Krause
15
+ - Andrew McBurney
16
+ - Josh Holtz
17
+ - Luka Mirosevic
11
18
  - Manu Wallner
12
- - Joshua Liebowitz
19
+ - Kohki Miki
20
+ - Olivier Halligon
13
21
  - Jan Piotrowski
14
- - Aaron Brager
15
22
  - Iulian Onofrei
16
- - Danielle Tomlinson
17
- - Fumiya Nakamura
18
- - Olivier Halligon
19
- - Helmut Januschka
20
- - Luka Mirosevic
21
- - Maksym Grebenets
22
- - Jorge Revuelta H
23
23
  - Matthew Ellis
24
+ - Danielle Tomlinson
25
+ - Felix Krause
24
26
  - Jérôme Lacoste
25
- - Andrew McBurney
26
- - Kohki Miki
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2018-07-11 00:00:00.000000000 Z
30
+ date: 2018-07-19 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier