spaceship/lib/spaceship/connect_api/models/device.rb in fastlane-2.217.0 vs spaceship/lib/spaceship/connect_api/models/device.rb in fastlane-2.218.0

- old
+ new

@@ -1,6 +1,7 @@ -require_relative '../model' +require_relative '../../connect_api' + module Spaceship class ConnectAPI class Device include Spaceship::ConnectAPI::Model @@ -48,14 +49,92 @@ end # # API # - - def self.all(client: nil, filter: {}, includes: nil, fields: nil, limit: nil, sort: nil) + def self.all(client: nil, filter: {}, includes: nil, fields: nil, limit: Spaceship::ConnectAPI::MAX_OBJECTS_PER_PAGE_LIMIT, sort: nil) client ||= Spaceship::ConnectAPI resps = client.get_devices(filter: filter, includes: includes, fields: fields, limit: limit, sort: sort).all_pages return resps.flat_map(&:to_models) + end + + # @param platform [String] The provisioning profile's platform (i.e. ios, tvos, macos, catalyst). + # @param include_mac_in_profiles [Bool] Whether to include macs in iOS provisioning profiles. false by default. + # @param client [ConnectAPI] ConnectAPI client. + # @return (Device) List of enabled devices. + def self.devices_for_platform(platform: nil, include_mac_in_profiles: false, client: nil) + platform = platform.to_sym + include_mac_in_profiles &&= platform == :ios + + device_platform = case platform + when :osx, :macos, :mac + Spaceship::ConnectAPI::Platform::MAC_OS + when :ios + Spaceship::ConnectAPI::Platform::IOS + when :catalyst + Spaceship::ConnectAPI::Platform::MAC_OS + end + + device_platforms = [ + device_platform, + 'UNIVERSAL' # Universal Bundle ID platform is undocumented as of Oct 4, 2023. + ] + + device_classes = + case platform + when :ios + [ + Spaceship::ConnectAPI::Device::DeviceClass::IPAD, + Spaceship::ConnectAPI::Device::DeviceClass::IPHONE, + Spaceship::ConnectAPI::Device::DeviceClass::IPOD, + Spaceship::ConnectAPI::Device::DeviceClass::APPLE_WATCH + ] + when :tvos + [ + Spaceship::ConnectAPI::Device::DeviceClass::APPLE_TV + ] + when :macos, :catalyst + [ + Spaceship::ConnectAPI::Device::DeviceClass::MAC + ] + else + [] + end + + if include_mac_in_profiles + device_classes << Spaceship::ConnectAPI::Device::DeviceClass::APPLE_SILICON_MAC + device_platforms << Spaceship::ConnectAPI::Platform::MAC_OS + end + + filter = { + status: Spaceship::ConnectAPI::Device::Status::ENABLED, + platform: device_platforms.uniq.join(',') + } + + devices = Spaceship::ConnectAPI::Device.all( + client: client, + filter: filter + ) + + unless device_classes.empty? + devices.select! do |device| + # App Store Connect API return MAC in device_class instead of APPLE_SILICON_MAC for Silicon Macs. + # The difference between old MAC and APPLE_SILICON_MAC is provisioning uuid. + # Intel-based provisioning UUID: 01234567-89AB-CDEF-0123-456789ABCDEF. + # arm64-based provisioning UUID: 01234567-89ABCDEF12345678. + # Workaround is to include macs having: + # * 25 chars length and only one hyphen in provisioning UUID. + if include_mac_in_profiles && + device.device_class == Spaceship::ConnectAPI::Device::DeviceClass::MAC + + next device.udid.length == 25 && device.udid.count('-') == 1 + end + + device_classes.include?(device.device_class) + end + end + + devices end # @param client [ConnectAPI] ConnectAPI client. # @param platform [String] The platform of the device. # @param include_disabled [Bool] Whether to include disable devices. false by default.