diff --git a/.github/workflows/codex-macos-validation.yml b/.github/workflows/codex-macos-validation.yml new file mode 100644 index 000000000..cfc7cb51e --- /dev/null +++ b/.github/workflows/codex-macos-validation.yml @@ -0,0 +1,31 @@ +name: Codex macOS Validation + +on: + workflow_dispatch: + +jobs: + swift-test: + name: Swift tests + runs-on: macos-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Run SwiftPM tests + run: swift test + + xcodebuild: + name: Xcode build + runs-on: macos-latest + needs: swift-test + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Build iOS framework + run: xcodebuild -project "PhoneNumberKit.xcodeproj" -scheme "PhoneNumberKit" -destination "generic/platform=iOS" build + + - name: Build macOS framework + run: xcodebuild -project "PhoneNumberKit.xcodeproj" -scheme "PhoneNumberKit-macOS" -destination "generic/platform=macOS" build diff --git a/PhoneNumberKit/ParseManager.swift b/PhoneNumberKit/ParseManager.swift index db1686e69..4ff7034bd 100644 --- a/PhoneNumberKit/ParseManager.swift +++ b/PhoneNumberKit/ParseManager.swift @@ -89,13 +89,13 @@ final class ParseManager { } // Last attempt: try to parse the number as-is with the region's default country code - if let result = try validPhoneNumber(from: nationalNumber, using: regionMetadata, countryCode: regionMetadata.countryCode, ignoreType: ignoreType, numberString: numberString, numberExtension: numberExtension) { + if let result = try validPhoneNumber(from: nationalNumber, using: regionMetadata, countryCode: regionMetadata.countryCode, ignoreType: ignoreType, numberString: matchedNumber, numberExtension: numberExtension) { return result } // Final fallback for countryCode == 0: try all territories with the same country code as the region // This handles cases where a number from one NANP territory (e.g., US) is parsed with another NANP region (e.g., AS, PR) - return try tryTerritoriesWithCode(regionMetadata.countryCode, nationalNumber: nationalNumber, excludingRegion: regionMetadata.codeID, ignoreType: ignoreType, numberString: numberString, numberExtension: numberExtension) + return try tryTerritoriesWithCode(regionMetadata.countryCode, nationalNumber: nationalNumber, excludingRegion: regionMetadata.codeID, ignoreType: ignoreType, numberString: matchedNumber, numberExtension: numberExtension) } // STEP 6: Update metadata if extracted country code differs from region's default @@ -106,14 +106,14 @@ final class ParseManager { } // Attempt to create a valid phone number with the extracted country code - if let result = try validPhoneNumber(from: nationalNumber, using: regionMetadata, countryCode: countryCode, ignoreType: ignoreType, numberString: numberString, numberExtension: numberExtension) { + if let result = try validPhoneNumber(from: nationalNumber, using: regionMetadata, countryCode: countryCode, ignoreType: ignoreType, numberString: matchedNumber, numberExtension: numberExtension) { return result } // STEP 7: Final fallback - try all territories with the same country code // Some country codes are shared by multiple territories (e.g., +1 for US, CA, etc.) // Try each territory's metadata to see if the number is valid in any of them - return try tryTerritoriesWithCode(countryCode, nationalNumber: nationalNumber, excludingRegion: regionMetadata.codeID, ignoreType: ignoreType, numberString: numberString, numberExtension: numberExtension) + return try tryTerritoriesWithCode(countryCode, nationalNumber: nationalNumber, excludingRegion: regionMetadata.codeID, ignoreType: ignoreType, numberString: matchedNumber, numberExtension: numberExtension) } // Parse task diff --git a/PhoneNumberKit/RegexManager.swift b/PhoneNumberKit/RegexManager.swift index 17d5c9527..1653d44bd 100644 --- a/PhoneNumberKit/RegexManager.swift +++ b/PhoneNumberKit/RegexManager.swift @@ -58,6 +58,12 @@ final class RegexManager { let fallBackMatches = try regexMatches(PhoneNumberPatterns.validPhoneNumberPattern, string: string) if let firstMatch = fallBackMatches.first { return firstMatch + } + + let embeddedPhoneNumberPattern = #"(? mobile +1 650 253 0000" + let number = try sut.parse(input, withRegion: "US") + + XCTAssertEqual(number.numberString, "+1 650 253 0000") + XCTAssertFalse(number.numberString.contains("jane@example.com")) + XCTAssertFalse(number.numberString.contains("Jane Doe")) + } + func testRegionCountryCodeConflict() { XCTAssertThrowsError(try sut.parse("212-2344", withRegion: "US")) { error in XCTAssertEqual(error as? PhoneNumberError, .invalidNumber)