From ec77782f7ad72e704b4418167725790c39db40c8 Mon Sep 17 00:00:00 2001 From: Woraphot Chokratanasombat Date: Wed, 21 Aug 2024 18:23:18 +0700 Subject: [PATCH 1/6] feat(swift-package-manager): add support for swift package manager --- .gitignore | 3 + .../contents.xcworkspacedata | 2 +- Package.swift | 31 + .../WCPhotoManipulator}/BitmapUtils.swift | 0 .../WCPhotoManipulator}/FileUtils.swift | 0 .../WCPhotoManipulator}/MimeUtils.swift | 0 .../WCPhotoManipulator}/Models/FlipMode.swift | 0 .../Models/ResizeMode.swift | 0 .../Models/RotationMode.swift | 0 .../Models/TextStyle.swift | 0 .../UIImage+PhotoManipulator.swift | 0 .../BitmapUtilsObjCTests.m | 2 +- .../FileUtilsObjCTests.m | 8 +- .../Helpers/NSData+Testing.h | 0 .../Helpers/NSData+Testing.m | 0 .../Helpers/UIImage+Testing.h | 3 +- .../Helpers/UIImage+Testing.m | 14 +- .../MimeUtilsObjCTests.m | 2 +- .../Resources}/background.jpg | Bin .../Resources}/overlay.png | Bin .../UIImage+PhotoManipulatorObjCTests.m | 2 +- .../BitmapUtilsSwiftTests.swift | 0 .../FileUtilsSwiftTests.swift | 6 +- .../Helpers/CGBitmapInfo+Testing.swift | 64 ++ .../Helpers/Data+Testing.swift | 24 + .../Helpers/UIImage+Testing.swift | 65 ++ .../MimeUtilsSwiftTests.swift | 0 .../Models/TextStyleTests.swift | 1 + .../Resources/background.jpg | Bin 0 -> 80180 bytes .../Resources/overlay.png | Bin 0 -> 4365 bytes .../UIImage+PhotoManipulatorSwiftTests.swift | 5 +- WCPhotoManipulator.podspec | 2 +- WCPhotoManipulator.xcodeproj/project.pbxproj | 565 ------------------ .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcschemes/WCPhotoManipulator.xcscheme | 101 ---- WCPhotoManipulator/FoolSonarcloud.h | 17 - WCPhotoManipulator/FoolSonarcloud.m | 13 - .../WCPhotoManipulator-Bridging-Header.h | 4 - WCPhotoManipulatorTests/Info.plist | 22 - .../WCPhotoManipulatorTests-Bridging-Header.h | 6 - 40 files changed, 216 insertions(+), 754 deletions(-) rename {WCPhotoManipulator.xcodeproj/project.xcworkspace => .swiftpm/xcode/package.xcworkspace}/contents.xcworkspacedata (66%) create mode 100644 Package.swift rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/BitmapUtils.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/FileUtils.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/MimeUtils.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/Models/FlipMode.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/Models/ResizeMode.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/Models/RotationMode.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/Models/TextStyle.swift (100%) rename {WCPhotoManipulator => Sources/WCPhotoManipulator}/UIImage+PhotoManipulator.swift (100%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/BitmapUtilsObjCTests.m (99%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/FileUtilsObjCTests.m (99%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/Helpers/NSData+Testing.h (100%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/Helpers/NSData+Testing.m (100%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/Helpers/UIImage+Testing.h (83%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/Helpers/UIImage+Testing.m (86%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/MimeUtilsObjCTests.m (95%) rename {WCPhotoManipulatorTests/Images => Tests/WCPhotoManipulatorObjCTests/Resources}/background.jpg (100%) rename {WCPhotoManipulatorTests/Images => Tests/WCPhotoManipulatorObjCTests/Resources}/overlay.png (100%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorObjCTests}/UIImage+PhotoManipulatorObjCTests.m (99%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorTests}/BitmapUtilsSwiftTests.swift (100%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorTests}/FileUtilsSwiftTests.swift (99%) create mode 100644 Tests/WCPhotoManipulatorTests/Helpers/CGBitmapInfo+Testing.swift create mode 100644 Tests/WCPhotoManipulatorTests/Helpers/Data+Testing.swift create mode 100644 Tests/WCPhotoManipulatorTests/Helpers/UIImage+Testing.swift rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorTests}/MimeUtilsSwiftTests.swift (100%) rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorTests}/Models/TextStyleTests.swift (98%) create mode 100644 Tests/WCPhotoManipulatorTests/Resources/background.jpg create mode 100644 Tests/WCPhotoManipulatorTests/Resources/overlay.png rename {WCPhotoManipulatorTests => Tests/WCPhotoManipulatorTests}/UIImage+PhotoManipulatorSwiftTests.swift (97%) delete mode 100644 WCPhotoManipulator.xcodeproj/project.pbxproj delete mode 100644 WCPhotoManipulator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 WCPhotoManipulator.xcodeproj/xcshareddata/xcschemes/WCPhotoManipulator.xcscheme delete mode 100644 WCPhotoManipulator/FoolSonarcloud.h delete mode 100644 WCPhotoManipulator/FoolSonarcloud.m delete mode 100644 WCPhotoManipulator/WCPhotoManipulator-Bridging-Header.h delete mode 100644 WCPhotoManipulatorTests/Info.plist delete mode 100644 WCPhotoManipulatorTests/WCPhotoManipulatorTests-Bridging-Header.h diff --git a/.gitignore b/.gitignore index 312d1f6..85352d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Mac OS X +.DS_Store + # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore diff --git a/WCPhotoManipulator.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata similarity index 66% rename from WCPhotoManipulator.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata index 181eaaf..919434a 100644 --- a/WCPhotoManipulator.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..f5fbc78 --- /dev/null +++ b/Package.swift @@ -0,0 +1,31 @@ +// swift-tools-version: 5.4 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "WCPhotoManipulator", + platforms: [.iOS(.v14)], + products: [ + .library( + name: "WCPhotoManipulator", + targets: ["WCPhotoManipulator"]), + ], + targets: [ + .target( + name: "WCPhotoManipulator"), + .testTarget( + name: "WCPhotoManipulatorTests", + dependencies: ["WCPhotoManipulator"], + resources: [.copy("Resources/background.jpg"), + .copy("Resources/overlay.png")] + ), + .testTarget( + name: "WCPhotoManipulatorObjCTests", + dependencies: ["WCPhotoManipulator"], + resources: [.copy("Resources/background.jpg"), + .copy("Resources/overlay.png")] + ), + ], + swiftLanguageVersions: [.v5] +) diff --git a/WCPhotoManipulator/BitmapUtils.swift b/Sources/WCPhotoManipulator/BitmapUtils.swift similarity index 100% rename from WCPhotoManipulator/BitmapUtils.swift rename to Sources/WCPhotoManipulator/BitmapUtils.swift diff --git a/WCPhotoManipulator/FileUtils.swift b/Sources/WCPhotoManipulator/FileUtils.swift similarity index 100% rename from WCPhotoManipulator/FileUtils.swift rename to Sources/WCPhotoManipulator/FileUtils.swift diff --git a/WCPhotoManipulator/MimeUtils.swift b/Sources/WCPhotoManipulator/MimeUtils.swift similarity index 100% rename from WCPhotoManipulator/MimeUtils.swift rename to Sources/WCPhotoManipulator/MimeUtils.swift diff --git a/WCPhotoManipulator/Models/FlipMode.swift b/Sources/WCPhotoManipulator/Models/FlipMode.swift similarity index 100% rename from WCPhotoManipulator/Models/FlipMode.swift rename to Sources/WCPhotoManipulator/Models/FlipMode.swift diff --git a/WCPhotoManipulator/Models/ResizeMode.swift b/Sources/WCPhotoManipulator/Models/ResizeMode.swift similarity index 100% rename from WCPhotoManipulator/Models/ResizeMode.swift rename to Sources/WCPhotoManipulator/Models/ResizeMode.swift diff --git a/WCPhotoManipulator/Models/RotationMode.swift b/Sources/WCPhotoManipulator/Models/RotationMode.swift similarity index 100% rename from WCPhotoManipulator/Models/RotationMode.swift rename to Sources/WCPhotoManipulator/Models/RotationMode.swift diff --git a/WCPhotoManipulator/Models/TextStyle.swift b/Sources/WCPhotoManipulator/Models/TextStyle.swift similarity index 100% rename from WCPhotoManipulator/Models/TextStyle.swift rename to Sources/WCPhotoManipulator/Models/TextStyle.swift diff --git a/WCPhotoManipulator/UIImage+PhotoManipulator.swift b/Sources/WCPhotoManipulator/UIImage+PhotoManipulator.swift similarity index 100% rename from WCPhotoManipulator/UIImage+PhotoManipulator.swift rename to Sources/WCPhotoManipulator/UIImage+PhotoManipulator.swift diff --git a/WCPhotoManipulatorTests/BitmapUtilsObjCTests.m b/Tests/WCPhotoManipulatorObjCTests/BitmapUtilsObjCTests.m similarity index 99% rename from WCPhotoManipulatorTests/BitmapUtilsObjCTests.m rename to Tests/WCPhotoManipulatorObjCTests/BitmapUtilsObjCTests.m index 3cd1ae8..46fa599 100644 --- a/WCPhotoManipulatorTests/BitmapUtilsObjCTests.m +++ b/Tests/WCPhotoManipulatorObjCTests/BitmapUtilsObjCTests.m @@ -7,8 +7,8 @@ // #import -#import "WCPhotoManipulator-Swift.h" #import "Helpers/UIImage+Testing.h" +@import WCPhotoManipulator; @interface BitmapUtilsObjCTests : XCTestCase diff --git a/WCPhotoManipulatorTests/FileUtilsObjCTests.m b/Tests/WCPhotoManipulatorObjCTests/FileUtilsObjCTests.m similarity index 99% rename from WCPhotoManipulatorTests/FileUtilsObjCTests.m rename to Tests/WCPhotoManipulatorObjCTests/FileUtilsObjCTests.m index ed94943..148532c 100644 --- a/WCPhotoManipulatorTests/FileUtilsObjCTests.m +++ b/Tests/WCPhotoManipulatorObjCTests/FileUtilsObjCTests.m @@ -7,9 +7,9 @@ // #import -#import "UIImage+Testing.h" -#import "NSData+Testing.h" -#import "WCPhotoManipulator-Swift.h" +#import "Helpers/UIImage+Testing.h" +#import "Helpers/NSData+Testing.h" +@import WCPhotoManipulator; @interface FileUtilsObjCTests : XCTestCase @@ -103,7 +103,7 @@ - (void)testImageToData_WhenOuptutPNG_ShouldReturnPng { /// imageFromUrl /////////////////////////// - (void)testImageFromUrl_WhenLocalFile_ShouldHaveData { - url = [[NSBundle bundleForClass:[self class]] URLForResource:@"overlay" withExtension:@"png"]; + url = [NSURL fileURLWithPath:[UIImage urlImageNamedTest:@"overlay.png"]]; image = [FileUtils imageFromUrl:url]; XCTAssertNotNil(image); diff --git a/WCPhotoManipulatorTests/Helpers/NSData+Testing.h b/Tests/WCPhotoManipulatorObjCTests/Helpers/NSData+Testing.h similarity index 100% rename from WCPhotoManipulatorTests/Helpers/NSData+Testing.h rename to Tests/WCPhotoManipulatorObjCTests/Helpers/NSData+Testing.h diff --git a/WCPhotoManipulatorTests/Helpers/NSData+Testing.m b/Tests/WCPhotoManipulatorObjCTests/Helpers/NSData+Testing.m similarity index 100% rename from WCPhotoManipulatorTests/Helpers/NSData+Testing.m rename to Tests/WCPhotoManipulatorObjCTests/Helpers/NSData+Testing.m diff --git a/WCPhotoManipulatorTests/Helpers/UIImage+Testing.h b/Tests/WCPhotoManipulatorObjCTests/Helpers/UIImage+Testing.h similarity index 83% rename from WCPhotoManipulatorTests/Helpers/UIImage+Testing.h rename to Tests/WCPhotoManipulatorObjCTests/Helpers/UIImage+Testing.h index 1737187..b585983 100644 --- a/WCPhotoManipulatorTests/Helpers/UIImage+Testing.h +++ b/Tests/WCPhotoManipulatorObjCTests/Helpers/UIImage+Testing.h @@ -7,13 +7,14 @@ // #import -#import "WCPhotoManipulator-Swift.h" +@import WCPhotoManipulator; NS_ASSUME_NONNULL_BEGIN @interface UIImage (Testing) +(UIImage*)imageNamedTest:(NSString *)name; ++(NSString*)urlImageNamedTest:(NSString *)name; -(UIColor*)colorAt:(CGPoint)location; @end diff --git a/WCPhotoManipulatorTests/Helpers/UIImage+Testing.m b/Tests/WCPhotoManipulatorObjCTests/Helpers/UIImage+Testing.m similarity index 86% rename from WCPhotoManipulatorTests/Helpers/UIImage+Testing.m rename to Tests/WCPhotoManipulatorObjCTests/Helpers/UIImage+Testing.m index 892d816..c4b88ef 100644 --- a/WCPhotoManipulatorTests/Helpers/UIImage+Testing.m +++ b/Tests/WCPhotoManipulatorObjCTests/Helpers/UIImage+Testing.m @@ -17,9 +17,17 @@ @implementation BundleLocator @implementation UIImage (Testing) +(UIImage *)imageNamedTest:(NSString *)name { - NSBundle *bundle = [NSBundle bundleForClass:[BundleLocator class]]; - NSString *path = [bundle pathForResource:name.stringByDeletingPathExtension ofType:name.pathExtension]; - return [UIImage imageWithContentsOfFile:path]; + return [UIImage imageWithContentsOfFile:[self urlImageNamedTest:name]]; +} + ++(NSString *)urlImageNamedTest:(NSString *)name { + return [[self bundle] pathForResource:name.stringByDeletingPathExtension ofType:name.pathExtension]; +} + ++(NSBundle *)bundle { + NSURL *url = [[[NSBundle bundleForClass:[BundleLocator class]] resourceURL] URLByAppendingPathComponent:@"WCPhotoManipulator_WCPhotoManipulatorObjCTests.bundle"]; + + return [NSBundle bundleWithURL:url]; } -(BOOL)isAlphaFirst { diff --git a/WCPhotoManipulatorTests/MimeUtilsObjCTests.m b/Tests/WCPhotoManipulatorObjCTests/MimeUtilsObjCTests.m similarity index 95% rename from WCPhotoManipulatorTests/MimeUtilsObjCTests.m rename to Tests/WCPhotoManipulatorObjCTests/MimeUtilsObjCTests.m index 5f41504..82417e0 100644 --- a/WCPhotoManipulatorTests/MimeUtilsObjCTests.m +++ b/Tests/WCPhotoManipulatorObjCTests/MimeUtilsObjCTests.m @@ -7,7 +7,7 @@ // #import -#import "WCPhotoManipulator-Swift.h" +@import WCPhotoManipulator; @interface MimeUtilsObjCTests : XCTestCase diff --git a/WCPhotoManipulatorTests/Images/background.jpg b/Tests/WCPhotoManipulatorObjCTests/Resources/background.jpg similarity index 100% rename from WCPhotoManipulatorTests/Images/background.jpg rename to Tests/WCPhotoManipulatorObjCTests/Resources/background.jpg diff --git a/WCPhotoManipulatorTests/Images/overlay.png b/Tests/WCPhotoManipulatorObjCTests/Resources/overlay.png similarity index 100% rename from WCPhotoManipulatorTests/Images/overlay.png rename to Tests/WCPhotoManipulatorObjCTests/Resources/overlay.png diff --git a/WCPhotoManipulatorTests/UIImage+PhotoManipulatorObjCTests.m b/Tests/WCPhotoManipulatorObjCTests/UIImage+PhotoManipulatorObjCTests.m similarity index 99% rename from WCPhotoManipulatorTests/UIImage+PhotoManipulatorObjCTests.m rename to Tests/WCPhotoManipulatorObjCTests/UIImage+PhotoManipulatorObjCTests.m index 32595b3..3c71ed8 100644 --- a/WCPhotoManipulatorTests/UIImage+PhotoManipulatorObjCTests.m +++ b/Tests/WCPhotoManipulatorObjCTests/UIImage+PhotoManipulatorObjCTests.m @@ -7,8 +7,8 @@ // #import -#import "WCPhotoManipulator-Swift.h" #import "Helpers/UIImage+Testing.h" +@import WCPhotoManipulator; @interface UIImage_PhotoManipulatorObjCTests : XCTestCase diff --git a/WCPhotoManipulatorTests/BitmapUtilsSwiftTests.swift b/Tests/WCPhotoManipulatorTests/BitmapUtilsSwiftTests.swift similarity index 100% rename from WCPhotoManipulatorTests/BitmapUtilsSwiftTests.swift rename to Tests/WCPhotoManipulatorTests/BitmapUtilsSwiftTests.swift diff --git a/WCPhotoManipulatorTests/FileUtilsSwiftTests.swift b/Tests/WCPhotoManipulatorTests/FileUtilsSwiftTests.swift similarity index 99% rename from WCPhotoManipulatorTests/FileUtilsSwiftTests.swift rename to Tests/WCPhotoManipulatorTests/FileUtilsSwiftTests.swift index 0bc9f12..34186f2 100644 --- a/WCPhotoManipulatorTests/FileUtilsSwiftTests.swift +++ b/Tests/WCPhotoManipulatorTests/FileUtilsSwiftTests.swift @@ -65,7 +65,7 @@ class FileUtilsSwiftTests: XCTestCase { data = FileUtils.imageToData(image, mimeType: MimeUtils.JPEG, quality: 100) XCTAssertNotNil(data) - XCTAssertEqual((data as NSData).mimeType(), MimeUtils.JPEG) + XCTAssertEqual(data.mimeType(), MimeUtils.JPEG) } func testImageToData_WhenOuptutPNG_ShouldReturnPng() throws { @@ -73,14 +73,14 @@ class FileUtilsSwiftTests: XCTestCase { data = FileUtils.imageToData(image, mimeType: MimeUtils.PNG, quality: 100) XCTAssertNotNil(data) - XCTAssertEqual((data as NSData).mimeType(), MimeUtils.PNG) + XCTAssertEqual(data.mimeType(), MimeUtils.PNG) } //////////////////////////// /// imageFromUrl /////////////////////////// func testImageFromUrl_WhenLocalFile_ShouldHaveData() throws { - url = Bundle(for: type(of: self)).url(forResource: "overlay", withExtension: "png") + url = URL(fileURLWithPath: UIImage.urlImageNamedTest("overlay.png") ?? "") image = FileUtils.imageFromUrl(url) XCTAssertNotNil(image) diff --git a/Tests/WCPhotoManipulatorTests/Helpers/CGBitmapInfo+Testing.swift b/Tests/WCPhotoManipulatorTests/Helpers/CGBitmapInfo+Testing.swift new file mode 100644 index 0000000..4ad6576 --- /dev/null +++ b/Tests/WCPhotoManipulatorTests/Helpers/CGBitmapInfo+Testing.swift @@ -0,0 +1,64 @@ +// +// File.swift +// +// +// Created by Woraphot Chokratanasombat on 21/8/2567 BE. +// + +import UIKit + +extension CGBitmapInfo { + enum ComponentLayout { + case bgra + case abgr + case argb + case rgba + case bgr + case rgb + + var count: Int { + switch self { + case .bgr, .rgb: return 3 + default: return 4 + } + } + } +/*** + + + var isAlphaFirst: Bool { + let alphaInfo = cgImage?.alphaInfo + return alphaInfo == .first || alphaInfo == .premultipliedFirst || alphaInfo == .noneSkipFirst + } + + var isAlphaLast: Bool { + let alphaInfo = cgImage?.alphaInfo + return alphaInfo == .last || alphaInfo == .premultipliedLast || alphaInfo == .noneSkipLast + } + + var isLittleEndian: Bool { + let byteInfo = cgImage?.bitmapInfo + return byteInfo == .byteOrder16Little || byteInfo == .byteOrder32Little + } + */ + var componentLayout: ComponentLayout? { + guard let alphaInfo = CGImageAlphaInfo(rawValue: rawValue & Self.alphaInfoMask.rawValue) else { return nil } + let isLittleEndian = contains(.byteOrder32Little) + + if alphaInfo == .none { + return isLittleEndian ? .bgr : .rgb + } + let alphaIsFirst = alphaInfo == .premultipliedFirst || alphaInfo == .first || alphaInfo == .noneSkipFirst + + if isLittleEndian { + return alphaIsFirst ? .bgra : .abgr + } else { + return alphaIsFirst ? .argb : .rgba + } + } + + var chromaIsPremultipliedByAlpha: Bool { + let alphaInfo = CGImageAlphaInfo(rawValue: rawValue & Self.alphaInfoMask.rawValue) + return alphaInfo == .premultipliedFirst || alphaInfo == .premultipliedLast + } +} diff --git a/Tests/WCPhotoManipulatorTests/Helpers/Data+Testing.swift b/Tests/WCPhotoManipulatorTests/Helpers/Data+Testing.swift new file mode 100644 index 0000000..58494ff --- /dev/null +++ b/Tests/WCPhotoManipulatorTests/Helpers/Data+Testing.swift @@ -0,0 +1,24 @@ +// +// File.swift +// +// +// Created by Woraphot Chokratanasombat on 21/8/2567 BE. +// + +import Foundation + +extension Data { + public func mimeType() -> String? { + var c: UInt8 = 0; + + copyBytes(to: &c, count: 1) + + switch (c) { + case 0xFF: return "image/jpeg" + case 0x89: return "image/png" + case 0x47: return "image/gif" + case 0x49, 0x4D: return "image/tiff" + default: return nil + } + } +} diff --git a/Tests/WCPhotoManipulatorTests/Helpers/UIImage+Testing.swift b/Tests/WCPhotoManipulatorTests/Helpers/UIImage+Testing.swift new file mode 100644 index 0000000..b3ab5b7 --- /dev/null +++ b/Tests/WCPhotoManipulatorTests/Helpers/UIImage+Testing.swift @@ -0,0 +1,65 @@ +// +// File.swift +// +// +// Created by Woraphot Chokratanasombat on 21/8/2567 BE. +// + +import UIKit + +extension UIImage { + public convenience init?(namedTest name: String) { + self.init(contentsOfFile: Self.urlImageNamedTest(name) ?? "") + } + + static func urlImageNamedTest(_ name: String) -> String? { + guard let name = name as NSString? else { + return nil + } + return bundle()?.path(forResource: name.deletingPathExtension, ofType: name.pathExtension) + } + + static func bundle() -> Bundle? { + guard let url = Bundle(for: BundleLocator.self).resourceURL?.appendingPathComponent("WCPhotoManipulator_WCPhotoManipulatorTests.bundle") else { + return nil + } + return Bundle(url: url) + } + + func color(at point: CGPoint) -> UIColor? { + guard + let cgImage = cgImage, + let space = cgImage.colorSpace, + let pixelData = cgImage.dataProvider?.data, + let layout = cgImage.bitmapInfo.componentLayout + else { + return nil + } + let data: UnsafePointer = CFDataGetBytePtr(pixelData) + + let comp = CGFloat(layout.count) + let isHDR = CGColorSpaceUsesITUR_2100TF(space) + let hdr = CGFloat(isHDR ? 2 : 1) + let pixelInfo = Int((size.width * point.y * scale + point.x * scale) * comp * hdr) + let i = Array(0 ... Int(comp - 1)).map { + CGFloat(data[pixelInfo + $0 * Int(hdr)]) / CGFloat(255) + } + + switch layout { + case .bgra: + return UIColor(red: i[2], green: i[1], blue: i[0], alpha: i[3]) + case .abgr: + return UIColor(red: i[3], green: i[2], blue: i[1], alpha: i[0]) + case .argb: + return UIColor(red: i[1], green: i[2], blue: i[3], alpha: i[0]) + case .rgba: + return UIColor(red: i[0], green: i[1], blue: i[2], alpha: i[3]) + case .bgr: + return UIColor(red: i[2], green: i[1], blue: i[0], alpha: 1) + case .rgb: + return UIColor(red: i[0], green: i[1], blue: i[2], alpha: 1) + } + } +} + +class BundleLocator {} diff --git a/WCPhotoManipulatorTests/MimeUtilsSwiftTests.swift b/Tests/WCPhotoManipulatorTests/MimeUtilsSwiftTests.swift similarity index 100% rename from WCPhotoManipulatorTests/MimeUtilsSwiftTests.swift rename to Tests/WCPhotoManipulatorTests/MimeUtilsSwiftTests.swift diff --git a/WCPhotoManipulatorTests/Models/TextStyleTests.swift b/Tests/WCPhotoManipulatorTests/Models/TextStyleTests.swift similarity index 98% rename from WCPhotoManipulatorTests/Models/TextStyleTests.swift rename to Tests/WCPhotoManipulatorTests/Models/TextStyleTests.swift index 026626f..1d87232 100644 --- a/WCPhotoManipulatorTests/Models/TextStyleTests.swift +++ b/Tests/WCPhotoManipulatorTests/Models/TextStyleTests.swift @@ -7,6 +7,7 @@ // import XCTest +import WCPhotoManipulator final class TextStyleTests: XCTestCase { override func setUpWithError() throws { diff --git a/Tests/WCPhotoManipulatorTests/Resources/background.jpg b/Tests/WCPhotoManipulatorTests/Resources/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1ff0a55bca95591e148b82fe8869a07a0f5cde3 GIT binary patch literal 80180 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 c () -> Bool))) XCTAssertFalse(image.hasAlpha()) } func testHasAlpha_ShouldReturnCorrectly() throws { image = UIImage.init(namedTest: "overlay.png") XCTAssertNotNil(image) - XCTAssertTrue(image.responds(to: Selector(("hasAlpha")))) + XCTAssertTrue(image.responds(to: #selector(UIImage.hasAlpha as (UIImage) -> () -> Bool))) XCTAssertTrue(image.hasAlpha()) diff --git a/WCPhotoManipulator.podspec b/WCPhotoManipulator.podspec index 44d40e5..b32da67 100644 --- a/WCPhotoManipulator.podspec +++ b/WCPhotoManipulator.podspec @@ -17,6 +17,6 @@ Pod::Spec.new do |s| s.platform = :ios, "9.0" s.source = { :git => "https://github.com/guhungry/ios-photo-manipulator.git", :tag => "v#{s.version}" } - s.source_files = "WCPhotoManipulator/**/*.{swift}" + s.source_files = "Sources/WCPhotoManipulator/**/*.{swift}" s.swift_version = '5.0' end diff --git a/WCPhotoManipulator.xcodeproj/project.pbxproj b/WCPhotoManipulator.xcodeproj/project.pbxproj deleted file mode 100644 index 3f26d0b..0000000 --- a/WCPhotoManipulator.xcodeproj/project.pbxproj +++ /dev/null @@ -1,565 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - CA10C5262BB331B7008464A7 /* FlipMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA10C5252BB331B7008464A7 /* FlipMode.swift */; }; - CA11C0FB2C0C1E9B005542AA /* RotationMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA11C0FA2C0C1E9B005542AA /* RotationMode.swift */; }; - CAC665652C445049002FD9A7 /* TextStyleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC665642C445049002FD9A7 /* TextStyleTests.swift */; }; - CADEFF822C4147EC00DFE3E3 /* TextStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CADEFF812C4147EC00DFE3E3 /* TextStyle.swift */; }; - CC92AF5124D250160061CC87 /* FoolSonarcloud.m in Sources */ = {isa = PBXBuildFile; fileRef = CC92AF5024D250160061CC87 /* FoolSonarcloud.m */; }; - CC92AF6A24D545070061CC87 /* BitmapUtilsSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC92AF6924D545070061CC87 /* BitmapUtilsSwiftTests.swift */; }; - CC92AF6C24D558500061CC87 /* FileUtilsSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC92AF6B24D558500061CC87 /* FileUtilsSwiftTests.swift */; }; - CC92AF6F24D55E950061CC87 /* NSData+Testing.m in Sources */ = {isa = PBXBuildFile; fileRef = CC92AF6E24D55E950061CC87 /* NSData+Testing.m */; }; - CC92AF7124D5CD9F0061CC87 /* UIImage+PhotoManipulatorSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC92AF7024D5CD9F0061CC87 /* UIImage+PhotoManipulatorSwiftTests.swift */; }; - CCC2503C24CFDE4B000BAC48 /* MimeUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC2503B24CFDE4B000BAC48 /* MimeUtils.swift */; }; - CCC2504B24CFDE89000BAC48 /* libWCPhotoManipulator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CCC2503824CFDE4B000BAC48 /* libWCPhotoManipulator.a */; }; - CCC2505724CFE206000BAC48 /* MimeUtilsObjCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC2505624CFE206000BAC48 /* MimeUtilsObjCTests.m */; }; - CCC2505924CFF0C1000BAC48 /* FileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC2505824CFF0C1000BAC48 /* FileUtils.swift */; }; - CCC2505B24CFF272000BAC48 /* FileUtilsObjCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC2505A24CFF272000BAC48 /* FileUtilsObjCTests.m */; }; - CCC2506324D000DA000BAC48 /* UIImage+Testing.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC2506224D000DA000BAC48 /* UIImage+Testing.m */; }; - CCC2506724D000E3000BAC48 /* background.jpg in Resources */ = {isa = PBXBuildFile; fileRef = CCC2506524D000E3000BAC48 /* background.jpg */; }; - CCC2506824D000E3000BAC48 /* overlay.png in Resources */ = {isa = PBXBuildFile; fileRef = CCC2506624D000E3000BAC48 /* overlay.png */; }; - CCC2506A24D05A87000BAC48 /* MimeUtilsSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC2506924D05A87000BAC48 /* MimeUtilsSwiftTests.swift */; }; - CCC2506C24D05C97000BAC48 /* BitmapUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC2506B24D05C97000BAC48 /* BitmapUtils.swift */; }; - CCC2506E24D05EE7000BAC48 /* ResizeMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC2506D24D05EE7000BAC48 /* ResizeMode.swift */; }; - CCC2507024D060C9000BAC48 /* UIImage+PhotoManipulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC2506F24D060C9000BAC48 /* UIImage+PhotoManipulator.swift */; }; - CCC2507224D066A2000BAC48 /* BitmapUtilsObjCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC2507124D066A2000BAC48 /* BitmapUtilsObjCTests.m */; }; - CCC2507424D0818E000BAC48 /* UIImage+PhotoManipulatorObjCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC2507324D0818E000BAC48 /* UIImage+PhotoManipulatorObjCTests.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - CCC2504C24CFDE89000BAC48 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CCC2503024CFDE4B000BAC48 /* Project object */; - proxyType = 1; - remoteGlobalIDString = CCC2503724CFDE4B000BAC48; - remoteInfo = WCPhotoManipulator; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - CCC2503624CFDE4B000BAC48 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - CA10C5252BB331B7008464A7 /* FlipMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlipMode.swift; sourceTree = ""; }; - CA11C0FA2C0C1E9B005542AA /* RotationMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RotationMode.swift; sourceTree = ""; }; - CAC665642C445049002FD9A7 /* TextStyleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextStyleTests.swift; sourceTree = ""; }; - CADEFF812C4147EC00DFE3E3 /* TextStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextStyle.swift; sourceTree = ""; }; - CC92AF4F24D250160061CC87 /* FoolSonarcloud.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FoolSonarcloud.h; sourceTree = ""; }; - CC92AF5024D250160061CC87 /* FoolSonarcloud.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FoolSonarcloud.m; sourceTree = ""; }; - CC92AF6924D545070061CC87 /* BitmapUtilsSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitmapUtilsSwiftTests.swift; sourceTree = ""; }; - CC92AF6B24D558500061CC87 /* FileUtilsSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileUtilsSwiftTests.swift; sourceTree = ""; }; - CC92AF6D24D55E950061CC87 /* NSData+Testing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSData+Testing.h"; sourceTree = ""; }; - CC92AF6E24D55E950061CC87 /* NSData+Testing.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSData+Testing.m"; sourceTree = ""; }; - CC92AF7024D5CD9F0061CC87 /* UIImage+PhotoManipulatorSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+PhotoManipulatorSwiftTests.swift"; sourceTree = ""; }; - CCC2503824CFDE4B000BAC48 /* libWCPhotoManipulator.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libWCPhotoManipulator.a; sourceTree = BUILT_PRODUCTS_DIR; }; - CCC2503B24CFDE4B000BAC48 /* MimeUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MimeUtils.swift; sourceTree = ""; }; - CCC2504624CFDE89000BAC48 /* WCPhotoManipulatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WCPhotoManipulatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - CCC2504A24CFDE89000BAC48 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CCC2505124CFE1D2000BAC48 /* WCPhotoManipulator-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WCPhotoManipulator-Bridging-Header.h"; sourceTree = ""; }; - CCC2505524CFE205000BAC48 /* WCPhotoManipulatorTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WCPhotoManipulatorTests-Bridging-Header.h"; sourceTree = ""; }; - CCC2505624CFE206000BAC48 /* MimeUtilsObjCTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MimeUtilsObjCTests.m; sourceTree = ""; }; - CCC2505824CFF0C1000BAC48 /* FileUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileUtils.swift; sourceTree = ""; }; - CCC2505A24CFF272000BAC48 /* FileUtilsObjCTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FileUtilsObjCTests.m; sourceTree = ""; }; - CCC2506124D000DA000BAC48 /* UIImage+Testing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Testing.h"; sourceTree = ""; }; - CCC2506224D000DA000BAC48 /* UIImage+Testing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Testing.m"; sourceTree = ""; }; - CCC2506524D000E3000BAC48 /* background.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = background.jpg; sourceTree = ""; }; - CCC2506624D000E3000BAC48 /* overlay.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = overlay.png; sourceTree = ""; }; - CCC2506924D05A87000BAC48 /* MimeUtilsSwiftTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MimeUtilsSwiftTests.swift; sourceTree = ""; }; - CCC2506B24D05C97000BAC48 /* BitmapUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitmapUtils.swift; sourceTree = ""; }; - CCC2506D24D05EE7000BAC48 /* ResizeMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResizeMode.swift; sourceTree = ""; }; - CCC2506F24D060C9000BAC48 /* UIImage+PhotoManipulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+PhotoManipulator.swift"; sourceTree = ""; }; - CCC2507124D066A2000BAC48 /* BitmapUtilsObjCTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BitmapUtilsObjCTests.m; sourceTree = ""; }; - CCC2507324D0818E000BAC48 /* UIImage+PhotoManipulatorObjCTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+PhotoManipulatorObjCTests.m"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - CCC2503524CFDE4B000BAC48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCC2504324CFDE89000BAC48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CCC2504B24CFDE89000BAC48 /* libWCPhotoManipulator.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - CAC665632C444FCA002FD9A7 /* Models */ = { - isa = PBXGroup; - children = ( - CAC665642C445049002FD9A7 /* TextStyleTests.swift */, - ); - path = Models; - sourceTree = ""; - }; - CADEFF802C41479400DFE3E3 /* Models */ = { - isa = PBXGroup; - children = ( - CA10C5252BB331B7008464A7 /* FlipMode.swift */, - CCC2506D24D05EE7000BAC48 /* ResizeMode.swift */, - CA11C0FA2C0C1E9B005542AA /* RotationMode.swift */, - CADEFF812C4147EC00DFE3E3 /* TextStyle.swift */, - ); - path = Models; - sourceTree = ""; - }; - CCC2502F24CFDE4B000BAC48 = { - isa = PBXGroup; - children = ( - CCC2503A24CFDE4B000BAC48 /* WCPhotoManipulator */, - CCC2504724CFDE89000BAC48 /* WCPhotoManipulatorTests */, - CCC2503924CFDE4B000BAC48 /* Products */, - ); - sourceTree = ""; - }; - CCC2503924CFDE4B000BAC48 /* Products */ = { - isa = PBXGroup; - children = ( - CCC2503824CFDE4B000BAC48 /* libWCPhotoManipulator.a */, - CCC2504624CFDE89000BAC48 /* WCPhotoManipulatorTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - CCC2503A24CFDE4B000BAC48 /* WCPhotoManipulator */ = { - isa = PBXGroup; - children = ( - CADEFF802C41479400DFE3E3 /* Models */, - CCC2506B24D05C97000BAC48 /* BitmapUtils.swift */, - CCC2505824CFF0C1000BAC48 /* FileUtils.swift */, - CC92AF4F24D250160061CC87 /* FoolSonarcloud.h */, - CC92AF5024D250160061CC87 /* FoolSonarcloud.m */, - CCC2503B24CFDE4B000BAC48 /* MimeUtils.swift */, - CCC2506F24D060C9000BAC48 /* UIImage+PhotoManipulator.swift */, - CCC2505124CFE1D2000BAC48 /* WCPhotoManipulator-Bridging-Header.h */, - ); - path = WCPhotoManipulator; - sourceTree = ""; - }; - CCC2504724CFDE89000BAC48 /* WCPhotoManipulatorTests */ = { - isa = PBXGroup; - children = ( - CCC2506024D000DA000BAC48 /* Helpers */, - CCC2506424D000E3000BAC48 /* Images */, - CAC665632C444FCA002FD9A7 /* Models */, - CCC2507124D066A2000BAC48 /* BitmapUtilsObjCTests.m */, - CC92AF6924D545070061CC87 /* BitmapUtilsSwiftTests.swift */, - CCC2505A24CFF272000BAC48 /* FileUtilsObjCTests.m */, - CC92AF6B24D558500061CC87 /* FileUtilsSwiftTests.swift */, - CCC2504A24CFDE89000BAC48 /* Info.plist */, - CCC2505624CFE206000BAC48 /* MimeUtilsObjCTests.m */, - CCC2506924D05A87000BAC48 /* MimeUtilsSwiftTests.swift */, - CCC2507324D0818E000BAC48 /* UIImage+PhotoManipulatorObjCTests.m */, - CC92AF7024D5CD9F0061CC87 /* UIImage+PhotoManipulatorSwiftTests.swift */, - CCC2505524CFE205000BAC48 /* WCPhotoManipulatorTests-Bridging-Header.h */, - ); - path = WCPhotoManipulatorTests; - sourceTree = ""; - }; - CCC2506024D000DA000BAC48 /* Helpers */ = { - isa = PBXGroup; - children = ( - CC92AF6D24D55E950061CC87 /* NSData+Testing.h */, - CC92AF6E24D55E950061CC87 /* NSData+Testing.m */, - CCC2506124D000DA000BAC48 /* UIImage+Testing.h */, - CCC2506224D000DA000BAC48 /* UIImage+Testing.m */, - ); - path = Helpers; - sourceTree = ""; - }; - CCC2506424D000E3000BAC48 /* Images */ = { - isa = PBXGroup; - children = ( - CCC2506524D000E3000BAC48 /* background.jpg */, - CCC2506624D000E3000BAC48 /* overlay.png */, - ); - path = Images; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - CCC2503724CFDE4B000BAC48 /* WCPhotoManipulator */ = { - isa = PBXNativeTarget; - buildConfigurationList = CCC2503F24CFDE4B000BAC48 /* Build configuration list for PBXNativeTarget "WCPhotoManipulator" */; - buildPhases = ( - CCC2503424CFDE4B000BAC48 /* Sources */, - CCC2503524CFDE4B000BAC48 /* Frameworks */, - CCC2503624CFDE4B000BAC48 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WCPhotoManipulator; - productName = WCPhotoManipulator; - productReference = CCC2503824CFDE4B000BAC48 /* libWCPhotoManipulator.a */; - productType = "com.apple.product-type.library.static"; - }; - CCC2504524CFDE89000BAC48 /* WCPhotoManipulatorTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = CCC2504E24CFDE89000BAC48 /* Build configuration list for PBXNativeTarget "WCPhotoManipulatorTests" */; - buildPhases = ( - CCC2504224CFDE89000BAC48 /* Sources */, - CCC2504324CFDE89000BAC48 /* Frameworks */, - CCC2504424CFDE89000BAC48 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - CCC2504D24CFDE89000BAC48 /* PBXTargetDependency */, - ); - name = WCPhotoManipulatorTests; - productName = WCPhotoManipulatorTests; - productReference = CCC2504624CFDE89000BAC48 /* WCPhotoManipulatorTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - CCC2503024CFDE4B000BAC48 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1150; - LastUpgradeCheck = 1250; - ORGANIZATIONNAME = "Woraphot Chokratanasombat"; - TargetAttributes = { - CCC2503724CFDE4B000BAC48 = { - CreatedOnToolsVersion = 11.5; - LastSwiftMigration = 1150; - }; - CCC2504524CFDE89000BAC48 = { - CreatedOnToolsVersion = 11.5; - LastSwiftMigration = 1150; - }; - }; - }; - buildConfigurationList = CCC2503324CFDE4B000BAC48 /* Build configuration list for PBXProject "WCPhotoManipulator" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = CCC2502F24CFDE4B000BAC48; - productRefGroup = CCC2503924CFDE4B000BAC48 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - CCC2503724CFDE4B000BAC48 /* WCPhotoManipulator */, - CCC2504524CFDE89000BAC48 /* WCPhotoManipulatorTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - CCC2504424CFDE89000BAC48 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CCC2506824D000E3000BAC48 /* overlay.png in Resources */, - CCC2506724D000E3000BAC48 /* background.jpg in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - CCC2503424CFDE4B000BAC48 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CADEFF822C4147EC00DFE3E3 /* TextStyle.swift in Sources */, - CCC2506C24D05C97000BAC48 /* BitmapUtils.swift in Sources */, - CCC2507024D060C9000BAC48 /* UIImage+PhotoManipulator.swift in Sources */, - CA11C0FB2C0C1E9B005542AA /* RotationMode.swift in Sources */, - CA10C5262BB331B7008464A7 /* FlipMode.swift in Sources */, - CCC2503C24CFDE4B000BAC48 /* MimeUtils.swift in Sources */, - CC92AF5124D250160061CC87 /* FoolSonarcloud.m in Sources */, - CCC2506E24D05EE7000BAC48 /* ResizeMode.swift in Sources */, - CCC2505924CFF0C1000BAC48 /* FileUtils.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CCC2504224CFDE89000BAC48 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CCC2505724CFE206000BAC48 /* MimeUtilsObjCTests.m in Sources */, - CCC2507424D0818E000BAC48 /* UIImage+PhotoManipulatorObjCTests.m in Sources */, - CCC2507224D066A2000BAC48 /* BitmapUtilsObjCTests.m in Sources */, - CCC2506A24D05A87000BAC48 /* MimeUtilsSwiftTests.swift in Sources */, - CC92AF6A24D545070061CC87 /* BitmapUtilsSwiftTests.swift in Sources */, - CC92AF6C24D558500061CC87 /* FileUtilsSwiftTests.swift in Sources */, - CC92AF6F24D55E950061CC87 /* NSData+Testing.m in Sources */, - CC92AF7124D5CD9F0061CC87 /* UIImage+PhotoManipulatorSwiftTests.swift in Sources */, - CAC665652C445049002FD9A7 /* TextStyleTests.swift in Sources */, - CCC2506324D000DA000BAC48 /* UIImage+Testing.m in Sources */, - CCC2505B24CFF272000BAC48 /* FileUtilsObjCTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - CCC2504D24CFDE89000BAC48 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = CCC2503724CFDE4B000BAC48 /* WCPhotoManipulator */; - targetProxy = CCC2504C24CFDE89000BAC48 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - CCC2503D24CFDE4B000BAC48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.5; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - CCC2503E24CFDE4B000BAC48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.5; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - CCC2504024CFDE4B000BAC48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "WCPhotoManipulator/WCPhotoManipulator-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - CCC2504124CFDE4B000BAC48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_OBJC_BRIDGING_HEADER = "WCPhotoManipulator/WCPhotoManipulator-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - CCC2504F24CFDE89000BAC48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - HEADER_SEARCH_PATHS = "$(TARGET_TEMP_DIR)/../WCPhotoManipulator.build/DerivedSources"; - INFOPLIST_FILE = WCPhotoManipulatorTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.guhungry.WCPhotoManipulatorTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "WCPhotoManipulatorTests/WCPhotoManipulatorTests-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - CCC2505024CFDE89000BAC48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - HEADER_SEARCH_PATHS = "$(TARGET_TEMP_DIR)/../WCPhotoManipulator.build/DerivedSources"; - INFOPLIST_FILE = WCPhotoManipulatorTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.guhungry.WCPhotoManipulatorTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "WCPhotoManipulatorTests/WCPhotoManipulatorTests-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - CCC2503324CFDE4B000BAC48 /* Build configuration list for PBXProject "WCPhotoManipulator" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CCC2503D24CFDE4B000BAC48 /* Debug */, - CCC2503E24CFDE4B000BAC48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CCC2503F24CFDE4B000BAC48 /* Build configuration list for PBXNativeTarget "WCPhotoManipulator" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CCC2504024CFDE4B000BAC48 /* Debug */, - CCC2504124CFDE4B000BAC48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CCC2504E24CFDE89000BAC48 /* Build configuration list for PBXNativeTarget "WCPhotoManipulatorTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CCC2504F24CFDE89000BAC48 /* Debug */, - CCC2505024CFDE89000BAC48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = CCC2503024CFDE4B000BAC48 /* Project object */; -} diff --git a/WCPhotoManipulator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WCPhotoManipulator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/WCPhotoManipulator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/WCPhotoManipulator.xcodeproj/xcshareddata/xcschemes/WCPhotoManipulator.xcscheme b/WCPhotoManipulator.xcodeproj/xcshareddata/xcschemes/WCPhotoManipulator.xcscheme deleted file mode 100644 index 9bb53c9..0000000 --- a/WCPhotoManipulator.xcodeproj/xcshareddata/xcschemes/WCPhotoManipulator.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WCPhotoManipulator/FoolSonarcloud.h b/WCPhotoManipulator/FoolSonarcloud.h deleted file mode 100644 index 41a65a9..0000000 --- a/WCPhotoManipulator/FoolSonarcloud.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// FoolSonarcloud.h -// WCPhotoManipulator -// -// Created by Woraphot Chokratanasombat on 30/7/20. -// Copyright © 2020 Woraphot Chokratanasombat. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface FoolSonarcloud : NSObject - -@end - -NS_ASSUME_NONNULL_END diff --git a/WCPhotoManipulator/FoolSonarcloud.m b/WCPhotoManipulator/FoolSonarcloud.m deleted file mode 100644 index 71e1f61..0000000 --- a/WCPhotoManipulator/FoolSonarcloud.m +++ /dev/null @@ -1,13 +0,0 @@ -// -// FoolSonarcloud.m -// WCPhotoManipulator -// -// Created by Woraphot Chokratanasombat on 30/7/20. -// Copyright © 2020 Woraphot Chokratanasombat. All rights reserved. -// - -#import "FoolSonarcloud.h" - -@implementation FoolSonarcloud - -@end diff --git a/WCPhotoManipulator/WCPhotoManipulator-Bridging-Header.h b/WCPhotoManipulator/WCPhotoManipulator-Bridging-Header.h deleted file mode 100644 index 1b2cb5d..0000000 --- a/WCPhotoManipulator/WCPhotoManipulator-Bridging-Header.h +++ /dev/null @@ -1,4 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - diff --git a/WCPhotoManipulatorTests/Info.plist b/WCPhotoManipulatorTests/Info.plist deleted file mode 100644 index 64d65ca..0000000 --- a/WCPhotoManipulatorTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/WCPhotoManipulatorTests/WCPhotoManipulatorTests-Bridging-Header.h b/WCPhotoManipulatorTests/WCPhotoManipulatorTests-Bridging-Header.h deleted file mode 100644 index 1a8ef6f..0000000 --- a/WCPhotoManipulatorTests/WCPhotoManipulatorTests-Bridging-Header.h +++ /dev/null @@ -1,6 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import "NSData+Testing.h" -#import "UIImage+Testing.h" From c15f13e702a780c673b958aea4566062df3da677 Mon Sep 17 00:00:00 2001 From: Woraphot Chokratanasombat Date: Wed, 21 Aug 2024 18:25:20 +0700 Subject: [PATCH 2/6] ci(build): build using swift package manager --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 576af5b..387c5f5 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -28,7 +28,7 @@ jobs: mkdir -p DerivedData/compilation-database curl -L -O https://sonarcloud.io/static/cpp/build-wrapper-macosx-x86.zip unzip -o build-wrapper-macosx-x86.zip - build-wrapper-macosx-x86/build-wrapper-macosx-x86 --out-dir DerivedData/compilation-database xcodebuild clean test -project WCPhotoManipulator.xcodeproj -scheme WCPhotoManipulator -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15 Pro' -enableCodeCoverage YES -configuration Debug | xcpretty -c + build-wrapper-macosx-x86/build-wrapper-macosx-x86 --out-dir DerivedData/compilation-database xcodebuild clean test -scheme WCPhotoManipulator -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15 Pro' -enableCodeCoverage YES -configuration Debug | xcpretty -c ./xccov-to-sonarqube-generic.sh ~/Library/Developer/Xcode/DerivedData/*/Logs/Test/*.xcresult/ > sonarqube-generic-coverage.xml - name: Setup sonarqube From 7918ec442fd175ef2f0e375183cf99da162db72d Mon Sep 17 00:00:00 2001 From: Woraphot Chokratanasombat Date: Wed, 21 Aug 2024 18:43:34 +0700 Subject: [PATCH 3/6] ci(build-and-test): remove build-wrapper-macosx-x86 --- .github/workflows/build-and-test.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 387c5f5..8e5514b 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -25,11 +25,8 @@ jobs: - name: Build shell: bash run: | - mkdir -p DerivedData/compilation-database - curl -L -O https://sonarcloud.io/static/cpp/build-wrapper-macosx-x86.zip - unzip -o build-wrapper-macosx-x86.zip - build-wrapper-macosx-x86/build-wrapper-macosx-x86 --out-dir DerivedData/compilation-database xcodebuild clean test -scheme WCPhotoManipulator -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15 Pro' -enableCodeCoverage YES -configuration Debug | xcpretty -c - ./xccov-to-sonarqube-generic.sh ~/Library/Developer/Xcode/DerivedData/*/Logs/Test/*.xcresult/ > sonarqube-generic-coverage.xml + xcodebuild clean test -scheme WCPhotoManipulator -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15' -enableCodeCoverage YES -configuration Debug -derivedDataPath Build/ | xcpretty -c + ./xccov-to-sonarqube-generic.sh Build/Logs/Test/*.xcresult/ > sonarqube-generic-coverage.xml - name: Setup sonarqube uses: warchant/setup-sonar-scanner@v8 From 211883af392a0f9d429eb12a3b33df601710ffc2 Mon Sep 17 00:00:00 2001 From: Woraphot Chokratanasombat Date: Wed, 21 Aug 2024 18:32:01 +0700 Subject: [PATCH 4/6] ci(build-and-test): use macos-latest --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 8e5514b..68b1238 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -14,7 +14,7 @@ on: jobs: publish: name: Build and Test - runs-on: macos-13 + runs-on: macos-latest steps: - name: Checkout From 6bcb3cbdddd882d1cffa56e74fb5f82df617fcc4 Mon Sep 17 00:00:00 2001 From: Woraphot Chokratanasombat Date: Wed, 21 Aug 2024 18:57:15 +0700 Subject: [PATCH 5/6] ci(sonarcloud): fix change sonar.sources and sonar.tests --- sonar-project.properties | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index 13def92..48f2343 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,18 +3,14 @@ sonar.projectKey=guhungry_ios-photo-manipulator # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=ios-photo-manipulator -sonar.sources=WCPhotoManipulator -sonar.tests=WCPhotoManipulatorTests +sonar.sources=Sources +sonar.tests=Tests -sonar.c.file.suffixes=- -sonar.cpp.file.suffixes=- -sonar.objc.file.suffixes=.h,.m sonar.language=swift -sonar.cfamily.build-wrapper-output=DerivedData/compilation-database sonar.cfamily.threads=2 sonar.cfamily.cache.enabled=false sonar.coverageReportPaths=sonarqube-generic-coverage.xml -sonar.swift.project=WCPhotoManipulator.xcodeproj +sonar.swift.project=.swiftpm/xcode/package.xcworkspace sonar.swift.appScheme=WCPhotoManipulator -sonar.swift.simulator=platform=iOS Simulator,name=iPhone SE (2nd generation) +sonar.swift.simulator=platform=iOS Simulator,name=iPhone 15 From 5f4314f9c7b62d39f3623490eba9fcf202630a59 Mon Sep 17 00:00:00 2001 From: Woraphot Chokratanasombat Date: Wed, 21 Aug 2024 19:26:52 +0700 Subject: [PATCH 6/6] ci(sonarcloud): don't analyse objective-c --- sonar-project.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sonar-project.properties b/sonar-project.properties index 48f2343..9769858 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,6 +6,9 @@ sonar.projectName=ios-photo-manipulator sonar.sources=Sources sonar.tests=Tests +sonar.c.file.suffixes=- +sonar.cpp.file.suffixes=- +sonar.objc.file.suffixes=- sonar.language=swift sonar.cfamily.threads=2 sonar.cfamily.cache.enabled=false