Skip to content

Commit

Permalink
Fix typo
Browse files Browse the repository at this point in the history
  • Loading branch information
nauaros committed Feb 6, 2025
1 parent 29cccaf commit f179986
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 28 deletions.
8 changes: 4 additions & 4 deletions Adyen.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@
C9D8EB9E27452D3B006D8CA1 /* BACSItemsFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D8EB9D27452D3B006D8CA1 /* BACSItemsFactory.swift */; };
C9D8EBA02745556B006D8CA1 /* BACSDirectDebitDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D8EB9F2745556B006D8CA1 /* BACSDirectDebitDetails.swift */; };
C9D8EBA2274556ED006D8CA1 /* BACSDirectDebitPaymentMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D8EBA1274556ED006D8CA1 /* BACSDirectDebitPaymentMethod.swift */; };
C9EEEFEC2D5516B300B7AFFC /* ExpireDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9EEEFEA2D5516B300B7AFFC /* ExpireDateFormatter.swift */; };
C9EEEFEC2D5516B300B7AFFC /* ExpirationDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9EEEFEA2D5516B300B7AFFC /* ExpirationDateFormatter.swift */; };
C9F468E227465FCF00500FF5 /* BACSDirectDebitData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F468E127465FCF00500FF5 /* BACSDirectDebitData.swift */; };
C9FC2C452D50D0B700C9D0F3 /* AdyenCardScanner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9FC2C3D2D50D0B700C9D0F3 /* AdyenCardScanner.framework */; };
C9FC2C462D50D0B700C9D0F3 /* AdyenCardScanner.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C9FC2C3D2D50D0B700C9D0F3 /* AdyenCardScanner.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
Expand Down Expand Up @@ -1891,7 +1891,7 @@
C9D8EB9D27452D3B006D8CA1 /* BACSItemsFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BACSItemsFactory.swift; sourceTree = "<group>"; };
C9D8EB9F2745556B006D8CA1 /* BACSDirectDebitDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BACSDirectDebitDetails.swift; sourceTree = "<group>"; };
C9D8EBA1274556ED006D8CA1 /* BACSDirectDebitPaymentMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BACSDirectDebitPaymentMethod.swift; sourceTree = "<group>"; };
C9EEEFEA2D5516B300B7AFFC /* ExpireDateFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpireDateFormatter.swift; sourceTree = "<group>"; };
C9EEEFEA2D5516B300B7AFFC /* ExpirationDateFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpirationDateFormatter.swift; sourceTree = "<group>"; };
C9F468E127465FCF00500FF5 /* BACSDirectDebitData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BACSDirectDebitData.swift; sourceTree = "<group>"; };
C9FC2C3D2D50D0B700C9D0F3 /* AdyenCardScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AdyenCardScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E2028F5B2227F1930007FF8B /* Details.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Details.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3675,7 +3675,7 @@
C9EEEFEB2D5516B300B7AFFC /* Formatters */ = {
isa = PBXGroup;
children = (
C9EEEFEA2D5516B300B7AFFC /* ExpireDateFormatter.swift */,
C9EEEFEA2D5516B300B7AFFC /* ExpirationDateFormatter.swift */,
);
path = Formatters;
sourceTree = "<group>";
Expand Down Expand Up @@ -6932,7 +6932,7 @@
files = (
C99FF2BB2D50E872007179C5 /* CardScannerError.swift in Sources */,
C99FF2BC2D50E872007179C5 /* CreditCard.swift in Sources */,
C9EEEFEC2D5516B300B7AFFC /* ExpireDateFormatter.swift in Sources */,
C9EEEFEC2D5516B300B7AFFC /* ExpirationDateFormatter.swift in Sources */,
C99FF2BD2D50E872007179C5 /* CardImageParser.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
41 changes: 21 additions & 20 deletions AdyenCardScanner/Sources/CardImageParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,23 @@ protocol CardImageParsing {
class CardImageParser: CardImageParsing {

private enum Constants {
static let expireDateRegex = "\\d{2}\\/\\d{2,4}"
static let expirationDateRegex = "\\d{2}\\/\\d{2,4}"
static let topCandidates = 10

static let cardNumberConfidence: Float = 0.4
static let expireDateConfidence: Float = 0.4
static let expirationDateConfidence: Float = 0.4
}

// MARK: - Properties

private let expireDateFormatter: ExpireDateFormatting
private let expirationDateFormatter: ExpirationDateFormatting
private var cachedCardNumber: String?
private var cachedExpireDate: Date?
private var cachedExpirationDate: Date?

// MARK: - Initializers

init(expireDateFormatter: ExpireDateFormatting) {
self.expireDateFormatter = expireDateFormatter
init(expirationDateFormatter: ExpirationDateFormatting) {
self.expirationDateFormatter = expirationDateFormatter
}

// MARK: - CardImageParsing
Expand Down Expand Up @@ -68,15 +68,18 @@ class CardImageParser: CardImageParsing {

dispatchGroup.enter()
DispatchQueue.global().async {
if self.cachedExpireDate == nil {
self.cachedExpireDate = self.extractExpireDate(from: results)
if self.cachedExpirationDate == nil {
self.cachedExpirationDate = self.extractExpirationDate(from: results)
}
dispatchGroup.leave()
}

dispatchGroup.notify(queue: .main) {
guard let cardNumber = self.cachedCardNumber, let expireDate = self.cachedExpireDate else { return }
let card = CreditCard(number: cardNumber, expireDate: expireDate)
guard let cardNumber = self.cachedCardNumber,
let expirationDate = self.cachedExpirationDate else {
return
}
let card = CreditCard(number: cardNumber, expirationDate: expirationDate)
completion(card)
}
}
Expand All @@ -97,28 +100,26 @@ class CardImageParser: CardImageParsing {
.compactMap { $0.topCandidates(Constants.topCandidates).first }
.filter { $0.confidence > Constants.cardNumberConfidence }
.map { $0.string.replacingOccurrences(of: " ", with: "") }
.filter { $0.isCardNumber }
.filter { isValidLuhn($0) }
.first
.first(where: { $0.isCardNumber && isValidLuhn($0) })
guard let cardNumberMatch else { return nil }
self.cachedCardNumber = cardNumberMatch

return cardNumberMatch
}

private func extractExpireDate(from textObservations: [VNRecognizedTextObservation]) -> Date? {
if let cachedExpireDate { return cachedExpireDate }
private func extractExpirationDate(from textObservations: [VNRecognizedTextObservation]) -> Date? {
if let cachedExpirationDate { return cachedExpirationDate }

let match = textObservations
.compactMap { $0.topCandidates(Constants.topCandidates).first }
.filter { $0.confidence > Constants.expireDateConfidence }
.compactMap { extractMatch(from: $0.string, using: Constants.expireDateRegex) }
.filter { $0.confidence > Constants.expirationDateConfidence }
.compactMap { extractMatch(from: $0.string, using: Constants.expirationDateRegex) }
.first
guard let match else { return nil }
let expireDate = expireDateFormatter.date(from: match)
self.cachedExpireDate = expireDate
let expirationDate = expirationDateFormatter.date(from: match)
self.cachedExpirationDate = expirationDate

return expireDate
return expirationDate
}

private func isValidLuhn(_ number: String) -> Bool {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

import Foundation

protocol ExpireDateFormatting {
protocol ExpirationDateFormatting {
func date(from string: String) -> Date?
}

class ExpireDateFormatter: ExpireDateFormatting {
class ExpirationDateFormatter: ExpirationDateFormatting {

enum CardExpireDateFormat {
static let short = "MM/yy"
Expand Down
4 changes: 2 additions & 2 deletions AdyenCardScanner/Sources/Models/CreditCard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ public struct CreditCard {

// MARK: - Properties

public var number: String?
public var expireDate: Date?
public let number: String?
public let expirationDate: Date?
}

0 comments on commit f179986

Please sign in to comment.