From 202bf06dc622a82685d67d0e102309b526ebb51f Mon Sep 17 00:00:00 2001 From: Thomas Ricouard Date: Tue, 29 Nov 2022 09:28:17 +0100 Subject: [PATCH] Split Models from Network package --- IceCubesApp.xcodeproj/project.pbxproj | 2 ++ Packages/Models/.gitignore | 9 +++++++ Packages/Models/Package.swift | 27 +++++++++++++++++++ Packages/Models/README.md | 3 +++ .../Sources}/Models/Account.swift | 0 .../Sources/Models/Ext}/StatusExt.swift | 24 +++++++++++------ .../Sources}/Models/Status.swift | 0 .../Tests/ModelsTests/ModelsTests.swift | 11 ++++++++ Packages/Network/Package.swift | 6 ++--- Packages/Timeline/Package.swift | 4 ++- .../Timeline/Status/StatusRowView.swift | 2 +- .../Sources/Timeline/TimelineViewModel.swift | 1 + 12 files changed, 75 insertions(+), 14 deletions(-) create mode 100644 Packages/Models/.gitignore create mode 100644 Packages/Models/Package.swift create mode 100644 Packages/Models/README.md rename Packages/{Network/Sources/Network => Models/Sources}/Models/Account.swift (100%) rename Packages/{Network/Sources/Network/ModelsExt => Models/Sources/Models/Ext}/StatusExt.swift (64%) rename Packages/{Network/Sources/Network => Models/Sources}/Models/Status.swift (100%) create mode 100644 Packages/Models/Tests/ModelsTests/ModelsTests.swift diff --git a/IceCubesApp.xcodeproj/project.pbxproj b/IceCubesApp.xcodeproj/project.pbxproj index 8fbb0bb5..542ff4ff 100644 --- a/IceCubesApp.xcodeproj/project.pbxproj +++ b/IceCubesApp.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ /* Begin PBXFileReference section */ 9F29553D292B67B600E0E81B /* Network */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Network; path = Packages/Network; sourceTree = ""; }; 9F29553E292B6AF600E0E81B /* Timeline */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Timeline; path = Packages/Timeline; sourceTree = ""; }; + 9F398AA32935F90100A889F2 /* Models */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Models; path = Packages/Models; sourceTree = ""; }; 9FBFE639292A715500C250E9 /* IceCubesApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IceCubesApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9FBFE63C292A715500C250E9 /* IceCubesAppApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IceCubesAppApp.swift; sourceTree = ""; }; 9FBFE640292A715600C250E9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -43,6 +44,7 @@ 9FBFE63B292A715500C250E9 /* IceCubesApp */, 9FBFE63A292A715500C250E9 /* Products */, 9FBFE64C292A72BD00C250E9 /* Frameworks */, + 9F398AA32935F90100A889F2 /* Models */, 9F29553E292B6AF600E0E81B /* Timeline */, 9F29553D292B67B600E0E81B /* Network */, ); diff --git a/Packages/Models/.gitignore b/Packages/Models/.gitignore new file mode 100644 index 00000000..3b298120 --- /dev/null +++ b/Packages/Models/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/Packages/Models/Package.swift b/Packages/Models/Package.swift new file mode 100644 index 00000000..5bb699fb --- /dev/null +++ b/Packages/Models/Package.swift @@ -0,0 +1,27 @@ +// swift-tools-version: 5.7 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "Models", + platforms: [ + .iOS(.v16), + ], + products: [ + .library( + name: "Models", + targets: ["Models"]), + ], + dependencies: [ + .package(url: "https://gitlab.com/mflint/HTML2Markdown", exact: "1.0.0") + ], + targets: [ + .target( + name: "Models", + dependencies: ["HTML2Markdown"]), + .testTarget( + name: "ModelsTests", + dependencies: ["Models"]), + ] +) diff --git a/Packages/Models/README.md b/Packages/Models/README.md new file mode 100644 index 00000000..8924ceaa --- /dev/null +++ b/Packages/Models/README.md @@ -0,0 +1,3 @@ +# Models + +A description of this package. diff --git a/Packages/Network/Sources/Network/Models/Account.swift b/Packages/Models/Sources/Models/Account.swift similarity index 100% rename from Packages/Network/Sources/Network/Models/Account.swift rename to Packages/Models/Sources/Models/Account.swift diff --git a/Packages/Network/Sources/Network/ModelsExt/StatusExt.swift b/Packages/Models/Sources/Models/Ext/StatusExt.swift similarity index 64% rename from Packages/Network/Sources/Network/ModelsExt/StatusExt.swift rename to Packages/Models/Sources/Models/Ext/StatusExt.swift index 494ede6b..59d20278 100644 --- a/Packages/Network/Sources/Network/ModelsExt/StatusExt.swift +++ b/Packages/Models/Sources/Models/Ext/StatusExt.swift @@ -2,6 +2,20 @@ import HTML2Markdown import Foundation extension Status { + private static var createdAtDateFormatter: DateFormatter { + let dateFormatter = DateFormatter() + dateFormatter.calendar = .init(identifier: .iso8601) + dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX" + dateFormatter.timeZone = .init(abbreviation: "UTC") + return dateFormatter + } + + private static var createdAtRelativeFormatter: RelativeDateTimeFormatter { + let dateFormatter = RelativeDateTimeFormatter() + dateFormatter.unitsStyle = .abbreviated + return dateFormatter + } + public var contentAsMarkdown: String { do { let dom = try HTMLParser().parse(html: content) @@ -12,16 +26,10 @@ extension Status { } public var createdAtDate: Date { - let dateFormatter = DateFormatter() - dateFormatter.calendar = .init(identifier: .iso8601) - dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX" - dateFormatter.timeZone = .init(abbreviation: "UTC") - return dateFormatter.date(from: createdAt)! + Self.createdAtDateFormatter.date(from: createdAt)! } public var createdAtFormatted: String { - let dateFormatter = RelativeDateTimeFormatter() - dateFormatter.unitsStyle = .abbreviated - return dateFormatter.localizedString(for: createdAtDate, relativeTo: Date()) + Self.createdAtRelativeFormatter.localizedString(for: createdAtDate, relativeTo: Date()) } } diff --git a/Packages/Network/Sources/Network/Models/Status.swift b/Packages/Models/Sources/Models/Status.swift similarity index 100% rename from Packages/Network/Sources/Network/Models/Status.swift rename to Packages/Models/Sources/Models/Status.swift diff --git a/Packages/Models/Tests/ModelsTests/ModelsTests.swift b/Packages/Models/Tests/ModelsTests/ModelsTests.swift new file mode 100644 index 00000000..9397c1d2 --- /dev/null +++ b/Packages/Models/Tests/ModelsTests/ModelsTests.swift @@ -0,0 +1,11 @@ +import XCTest +@testable import Models + +final class ModelsTests: XCTestCase { + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct + // results. + XCTAssertEqual(Models().text, "Hello, World!") + } +} diff --git a/Packages/Network/Package.swift b/Packages/Network/Package.swift index 13a06c89..023af411 100644 --- a/Packages/Network/Package.swift +++ b/Packages/Network/Package.swift @@ -13,13 +13,11 @@ let package = Package( name: "Network", targets: ["Network"]), ], - dependencies: [ - .package(url: "https://gitlab.com/mflint/HTML2Markdown", exact: "1.0.0") - ], + dependencies: [], targets: [ .target( name: "Network", - dependencies: ["HTML2Markdown"]), + dependencies: []), .testTarget( name: "NetworkTests", dependencies: ["Network"]), diff --git a/Packages/Timeline/Package.swift b/Packages/Timeline/Package.swift index 2cef5ac6..d80643e5 100644 --- a/Packages/Timeline/Package.swift +++ b/Packages/Timeline/Package.swift @@ -15,12 +15,14 @@ let package = Package( ], dependencies: [ .package(name: "Network", path: "../Network"), + .package(name: "Models", path: "../Models"), ], targets: [ .target( name: "Timeline", dependencies: [ - .product(name: "Network", package: "Network") + .product(name: "Network", package: "Network"), + .product(name: "Models", package: "Models") ]), .testTarget( name: "TimelineTests", diff --git a/Packages/Timeline/Sources/Timeline/Status/StatusRowView.swift b/Packages/Timeline/Sources/Timeline/Status/StatusRowView.swift index 712606b7..c3a8e5f0 100644 --- a/Packages/Timeline/Sources/Timeline/Status/StatusRowView.swift +++ b/Packages/Timeline/Sources/Timeline/Status/StatusRowView.swift @@ -1,5 +1,5 @@ import SwiftUI -import Network +import Models struct StatusRowView: View { let status: Status diff --git a/Packages/Timeline/Sources/Timeline/TimelineViewModel.swift b/Packages/Timeline/Sources/Timeline/TimelineViewModel.swift index c2a48f11..afd2a494 100644 --- a/Packages/Timeline/Sources/Timeline/TimelineViewModel.swift +++ b/Packages/Timeline/Sources/Timeline/TimelineViewModel.swift @@ -1,5 +1,6 @@ import SwiftUI import Network +import Models @MainActor class TimelineViewModel: ObservableObject {