Skip to content

Commit e14ddb9

Browse files
authored
fix: device type matching (#20)
1 parent f6b6f9f commit e14ddb9

File tree

5 files changed

+61
-22
lines changed

5 files changed

+61
-22
lines changed

lib/fastlane/plugin/create_simulator_devices/actions/create_simulator_devices_action.rb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def self.run(params)
2525
required_devices = params[:devices]
2626
UI.user_error!('No devices specified') if required_devices.nil? || required_devices.empty?
2727

28-
shell_helper = CreateSimulatorDevices::ShellHelper.new(verbose:, action_context: self)
28+
shell_helper = CreateSimulatorDevices::ShellHelper.new(print_command: params[:print_command], print_command_output: params[:print_command_output], action_context: self)
2929
runtime_helper = CreateSimulatorDevices::RuntimeHelper.new(cache_dir: params[:cache_dir], shell_helper:, verbose:)
3030

3131
runner = CreateSimulatorDevices::Runner.new(
@@ -69,16 +69,26 @@ def self.available_options
6969
default_value: 'iPhone 16'),
7070
::FastlaneCore::ConfigItem.new(key: :cache_dir,
7171
description: 'The directory to cache the simulator runtimes',
72-
is_string: true,
72+
type: String,
7373
optional: true,
7474
default_value: "#{Dir.home}/.cache/create_simulator_devices"),
7575
::FastlaneCore::ConfigItem.new(key: :verbose,
7676
env_name: 'VERBOSE',
7777
description: 'Verbose output',
78-
is_string: false,
78+
type: Boolean,
7979
optional: true,
8080
default_value: ::FastlaneCore::Globals.verbose?,
81-
default_value_dynamic: true)
81+
default_value_dynamic: true),
82+
::FastlaneCore::ConfigItem.new(key: :print_command,
83+
description: 'Print xcrun simctl commands',
84+
type: Boolean,
85+
optional: true,
86+
default_value: false),
87+
::FastlaneCore::ConfigItem.new(key: :print_command_output,
88+
description: 'Print xcrun simctl commands output',
89+
type: Boolean,
90+
optional: true,
91+
default_value: false)
8292
]
8393
end
8494

lib/fastlane/plugin/create_simulator_devices/helpers/create_simulator_devices/runner.rb

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ def initialize(runtime_helper:, shell_helper:, verbose:)
1818
end
1919

2020
def run(devices)
21+
UI.message("Simulator devices to create: #{devices.join(', ')}")
22+
2123
shell_helper.stop_core_simulator_services
2224

2325
# Delete unusable runtimes and unavailable devices.
@@ -29,6 +31,11 @@ def run(devices)
2931
.filter_map { |device| required_device_for_device(device) }
3032
.uniq { |required_device| [required_device.device_type.name, required_device.required_runtime.product_version] }
3133

34+
if verbose
35+
UI.message('Unique required devices:')
36+
UI.message(" #{required_devices.map(&:description).join("\n ")}")
37+
end
38+
3239
# Install missing runtimes if needed.
3340
runtime_helper.install_missing_runtimes(required_devices)
3441

@@ -39,12 +46,7 @@ def run(devices)
3946
matched_devices = required_devices
4047
.reject { |required_device| required_device.available_device.nil? }
4148

42-
if verbose
43-
UI.message('Matched devices:')
44-
matched_devices.each do |matched_device|
45-
UI.message("\t#{matched_device.description}: #{matched_device.available_device.description}")
46-
end
47-
end
49+
log_matched_devices
4850

4951
matched_devices.map!(&:description)
5052

@@ -53,6 +55,18 @@ def run(devices)
5355
matched_devices
5456
end
5557

58+
def log_matched_devices
59+
UI.message('Matched devices:')
60+
matched_devices.each do |matched_device|
61+
device_info = ''
62+
if verbose
63+
device_info = shell_helper.device_info_by_udid(matched_device.available_device.udid)
64+
device_info = "\n#{device_info}"
65+
end
66+
UI.message(" #{matched_device.description}: #{matched_device.available_device.description}#{device_info}")
67+
end
68+
end
69+
5670
def delete_unavailable_devices
5771
return unless shell_helper.available_devices_for_runtimes.values.flatten.any?(&:available?)
5872

@@ -82,7 +96,10 @@ def create_missing_devices(required_devices)
8296
missing_devices = required_devices
8397
.select { |required_device| required_device.available_device.nil? }
8498

85-
return if missing_devices.empty?
99+
if missing_devices.empty?
100+
UI.message('All required devices are present. Skipping device creation...') if verbose
101+
return
102+
end
86103

87104
UI.message('Creating missing devices')
88105
missing_devices.each do |missing_device|
@@ -118,9 +135,11 @@ def find_runtime_and_device_for_required_devices(required_devices)
118135
def required_device_for_device(device)
119136
available_device_types = shell_helper.available_device_types
120137

138+
device_os_version = device[/ \(([\d.]*?)\)$/, 1]
139+
device_name = device.delete_suffix(" (#{device_os_version})").strip unless device_os_version.nil?
140+
121141
device_type = available_device_types.detect do |available_device_type|
122-
# Avoid matching "iPhone 16" for the "iPhone 16e" device.
123-
"#{device} ".start_with?("#{available_device_type.name} ")
142+
device_name == available_device_type.name
124143
end
125144

126145
unless device_type
@@ -131,8 +150,6 @@ def required_device_for_device(device)
131150
product_family = device_type.product_family
132151

133152
os_name = PRODUCT_FAMILY_TO_OS_NAME[product_family]
134-
device_os_version = device.delete_prefix(device_type.name).strip
135-
device_os_version = device_os_version[/\(([\d.]*?)\)/, 1]
136153

137154
runtime_version = nil
138155
unless device_os_version.nil? || device_os_version.empty?

lib/fastlane/plugin/create_simulator_devices/helpers/create_simulator_devices/runtime_helper.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ def install_missing_runtimes(required_devices)
4343

4444
missing_runtimes = missing_runtimes(needed_runtimes)
4545

46-
return if missing_runtimes.empty?
46+
if missing_runtimes.empty?
47+
UI.message('All required runtimes are present. Skipping runtime installation...') if verbose
48+
return
49+
end
4750

4851
missing_runtimes.each do |missing_runtime|
4952
download_and_install_missing_runtime(missing_runtime)

lib/fastlane/plugin/create_simulator_devices/helpers/create_simulator_devices/shell_helper.rb

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@ class ShellHelper
1010
UI = ::Fastlane::UI unless defined?(UI)
1111

1212
# Proprty verbose
13-
attr_accessor :verbose, :action_context
13+
attr_accessor :print_command, :print_command_output, :action_context
1414

15-
def initialize(verbose: false, action_context: nil)
16-
self.verbose = verbose
15+
def initialize(print_command: false, print_command_output: false, action_context: nil)
16+
self.print_command = print_command
17+
self.print_command_output = print_command_output
1718
self.action_context = action_context
1819
end
1920

20-
def sh(command:, print_command: verbose, print_command_output: verbose)
21+
def sh(command:, print_command: self.print_command, print_command_output: self.print_command_output)
2122
if action_context
22-
action_context.sh(command, print_command:, print_command_output:)
23+
action_context.sh(command, print_command: print_command, print_command_output: print_command_output)
2324
else
2425
# Fallback for testing or direct usage
2526
require 'open3'
@@ -163,6 +164,14 @@ def import_runtime(runtime_dmg_filename, runtime_name)
163164
UI.important("Failed to import runtime #{runtime_name} with '#{import_platform_command}' :\n#{e}")
164165
end
165166
end
167+
168+
def device_info_by_udid(udid)
169+
sh(
170+
command: "xcrun simctl list devices --json | jq '.devices | to_entries[].value[] | select(.udid==\"#{udid.shellescape}\")'",
171+
print_command: false,
172+
print_command_output: false
173+
)
174+
end
166175
end
167176
end
168177
end

spec/create_simulator_devices/shell_helper_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
RSpec.describe Fastlane::CreateSimulatorDevices::ShellHelper do
77
AppleBuildVersion = Fastlane::CreateSimulatorDevices::AppleBuildVersion
88
RequiredRuntime = Fastlane::CreateSimulatorDevices::RequiredRuntime
9-
let(:sut) { described_class.new(verbose: false) }
9+
let(:sut) { described_class.new(print_command: false, print_command_output: false) }
1010
before do
1111
# Mock the sh method directly on the ShellHelper instance
1212
allow(sut).to receive(:sh)

0 commit comments

Comments
 (0)