diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28bf0f27..92127c30 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: uses: actions/checkout@v4 - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_26.2.app + run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: List available devices run: xcrun simctl list devices available @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@v4 - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_26.2.app + run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: List available devices run: xcrun simctl list devices available @@ -67,13 +67,13 @@ jobs: uses: actions/checkout@v4 - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_26.2.app + run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: List available devices run: xcrun simctl list devices available - name: Build and Test - run: set -o pipefail && xcodebuild -scheme FeedKit-Package -destination 'platform=iOS Simulator,name=iPhone 17' test | xcbeautify + run: set -o pipefail && xcodebuild -scheme FeedKit-Package -destination 'platform=iOS Simulator,name=iPhone 16' test | xcbeautify macos-build-and-test-xcodebuild-tvos: name: Test (xcodebuild tvOS) @@ -83,7 +83,7 @@ jobs: uses: actions/checkout@v4 - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_26.2.app + run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: List available devices run: xcrun simctl list devices available @@ -99,7 +99,7 @@ jobs: uses: actions/checkout@v4 - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_26.2.app + run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: List available devices run: xcrun simctl list devices available @@ -115,10 +115,10 @@ jobs: uses: actions/checkout@v4 - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode_26.2.app + run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: List available devices run: xcrun simctl list devices available - name: Build and Test - run: set -o pipefail && xcodebuild -scheme FeedKit-Package -destination 'platform=visionOS Simulator,name=Apple Vision Pro,OS=26.2' test | xcbeautify + run: set -o pipefail && xcodebuild -scheme FeedKit-Package -destination 'platform=visionOS Simulator,name=Apple Vision Pro' test | xcbeautify diff --git a/.gitignore b/.gitignore index 1273b5f1..2e0e5377 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /Packages /*.swiftinterface /*.xcodeproj -xcuserdata/ \ No newline at end of file +xcuserdata/ +.swift-format diff --git a/Assets/FeedKit-dark.svg b/Assets/FeedKit-dark.svg deleted file mode 100644 index 3353f357..00000000 --- a/Assets/FeedKit-dark.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Assets/FeedKit.afdesign b/Assets/FeedKit.afdesign deleted file mode 100644 index b781abfd..00000000 Binary files a/Assets/FeedKit.afdesign and /dev/null differ diff --git a/Assets/FeedKit.icon/Assets/FeedKit.svg b/Assets/FeedKit.icon/Assets/FeedKit.svg deleted file mode 100644 index 4e161350..00000000 --- a/Assets/FeedKit.icon/Assets/FeedKit.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/Assets/FeedKit.icon/icon.json b/Assets/FeedKit.icon/icon.json deleted file mode 100644 index d879c453..00000000 --- a/Assets/FeedKit.icon/icon.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "fill" : { - "linear-gradient" : [ - "srgb:1.00000,0.53011,0.24430,1.00000", - "srgb:1.00000,0.40878,0.00527,1.00000" - ] - }, - "groups" : [ - { - "hidden" : false, - "layers" : [ - { - "blend-mode" : "normal", - "fill" : "automatic", - "glass" : true, - "image-name" : "FeedKit.svg", - "name" : "FeedKit", - "opacity" : 1 - } - ], - "shadow" : { - "kind" : "neutral", - "opacity" : 0.5 - }, - "translucency" : { - "enabled" : true, - "value" : 0.5 - } - } - ], - "supported-platforms" : { - "circles" : [ - "watchOS" - ], - "squares" : "shared" - } -} \ No newline at end of file diff --git a/Assets/FeedKit.svg b/Assets/FeedKit.svg deleted file mode 100644 index 40305070..00000000 --- a/Assets/FeedKit.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/Example/Example/ExampleApp.swift b/Example/Example/ExampleApp.swift index 1cf32924..7cde9f48 100644 --- a/Example/Example/ExampleApp.swift +++ b/Example/Example/ExampleApp.swift @@ -1,7 +1,7 @@ // // ExampleApp.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Example/Example/Models/FeedItemModel.swift b/Example/Example/Models/FeedItemModel.swift index b70bc4e7..5d2fb2e5 100644 --- a/Example/Example/Models/FeedItemModel.swift +++ b/Example/Example/Models/FeedItemModel.swift @@ -1,7 +1,7 @@ // // FeedItemModel.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Example/Example/Models/FeedModel.swift b/Example/Example/Models/FeedModel.swift index 0c52f83b..d0975850 100644 --- a/Example/Example/Models/FeedModel.swift +++ b/Example/Example/Models/FeedModel.swift @@ -1,7 +1,7 @@ // // FeedModel.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Example/Example/Views/AppleNewsView.swift b/Example/Example/Views/AppleNewsView.swift index 878d8bef..e49b8e4d 100644 --- a/Example/Example/Views/AppleNewsView.swift +++ b/Example/Example/Views/AppleNewsView.swift @@ -1,7 +1,7 @@ // // AppleNewsView.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Example/Example/Views/ConcurrencyView.swift b/Example/Example/Views/ConcurrencyView.swift index dddcbc7d..ec10b434 100644 --- a/Example/Example/Views/ConcurrencyView.swift +++ b/Example/Example/Views/ConcurrencyView.swift @@ -1,7 +1,7 @@ // // ConcurrencyView.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Example/Example/Views/FeedItemView.swift b/Example/Example/Views/FeedItemView.swift index 691c51fe..26ea41f2 100644 --- a/Example/Example/Views/FeedItemView.swift +++ b/Example/Example/Views/FeedItemView.swift @@ -1,7 +1,7 @@ // // FeedItemView.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Example/Example/Views/FeedView.swift b/Example/Example/Views/FeedView.swift index 560d293e..f4484827 100644 --- a/Example/Example/Views/FeedView.swift +++ b/Example/Example/Views/FeedView.swift @@ -1,7 +1,7 @@ // // FeedView.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/FeedKit.afdesign b/FeedKit.afdesign new file mode 100644 index 00000000..1b48a8d7 Binary files /dev/null and b/FeedKit.afdesign differ diff --git a/FeedKit.png b/FeedKit.png new file mode 100644 index 00000000..a2dde0ea Binary files /dev/null and b/FeedKit.png differ diff --git a/Package.swift b/Package.swift index f55e3d90..9f143b07 100644 --- a/Package.swift +++ b/Package.swift @@ -58,13 +58,13 @@ let package = Package( .process("Resources/xml/FeedNotFound.xml"), .process("Resources/xml/RSS.xml"), .process("Resources/xml/RSSDC.xml"), - .process("Resources/xml/AtomDC.xml"), .process("Resources/xml/RSSAtom.xml"), .process("Resources/xml/Media.xml"), .process("Resources/xml/Syndication.xml"), .process("Resources/xml/iTunes.xml"), - .process("Resources/xml/YouTube.xml") + .process("Resources/xml/YouTube.xml"), + .process("Resources/xml/GeoRSSSimple.xml"), ] - ) + ), ] ) diff --git a/Package@swift-5.9.swift b/Package@swift-5.9.swift index 3618fc3d..24527c6f 100644 --- a/Package@swift-5.9.swift +++ b/Package@swift-5.9.swift @@ -62,8 +62,9 @@ let package = Package( .process("Resources/xml/Media.xml"), .process("Resources/xml/Syndication.xml"), .process("Resources/xml/iTunes.xml"), - .process("Resources/xml/YouTube.xml") + .process("Resources/xml/YouTube.xml"), + .process("Resources/xml/GeoRSSSimple.xml"), ] - ) + ), ] ) diff --git a/README.md b/README.md index ebf5981b..86b1cc8d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,4 @@ - - - - FeedKit Logo - - -

+
[![CI](https://github.com/nmdias/FeedKit/actions/workflows/ci.yml/badge.svg)](https://github.com/nmdias/FeedKit/actions/workflows/ci.yml) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fnmdias%2FFeedKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/nmdias/FeedKit) @@ -12,6 +6,12 @@ FeedKit is a Swift library for Reading and Generating RSS, Atom, and JSON feeds. +### FeedKit v10 (Release Candidate) :warning: + +FeedKit **[`v10`](https://github.com/nmdias/FeedKit)** is now in Release Candidate (RC) and introduces a new parsing engine, features, and improvements. While this version is feature-complete and extensively tested, it may still have some minor issues to address before the final release. + +It should be stable enough :eyes:, but if stable enough is not enough, consider using **[`v9`](https://github.com/nmdias/FeedKit/releases/tag/9.1.2)**. + # Features - [x] [Atom](https://tools.ietf.org/html/rfc4287) @@ -27,7 +27,6 @@ FeedKit is a Swift library for Reading and Generating RSS, Atom, and JSON feeds. - [x] [GML](http://www.opengis.net/gml) - [x] [iTunes](http://www.itunes.com/dtds/podcast-1.0.dtd) - [x] [YouTube](http://www.youtube.com/xml/schemas/2015) - - [x] [Podcast](https://podcastindex.org/namespace/1.0) - [x] Examples - [x] [Documentation](https://swiftpackageindex.com/nmdias/FeedKit/main/documentation/feedkit) - [x] Unit Tests diff --git a/Sources/FeedKit/Extensions/String + toBool.swift b/Sources/FeedKit/Extensions/String + toBool.swift index 3097232f..e3edc742 100644 --- a/Sources/FeedKit/Extensions/String + toBool.swift +++ b/Sources/FeedKit/Extensions/String + toBool.swift @@ -1,7 +1,7 @@ // // String + toBool.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Extensions/String + toDuration.swift b/Sources/FeedKit/Extensions/String + toDuration.swift index 23994749..d891b25e 100644 --- a/Sources/FeedKit/Extensions/String + toDuration.swift +++ b/Sources/FeedKit/Extensions/String + toDuration.swift @@ -1,7 +1,7 @@ // // String + toDuration.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Extensions/String + toGMLPosition.swift b/Sources/FeedKit/Extensions/String + toGMLPosition.swift index 5e13171e..29a1d2a8 100644 --- a/Sources/FeedKit/Extensions/String + toGMLPosition.swift +++ b/Sources/FeedKit/Extensions/String + toGMLPosition.swift @@ -1,7 +1,7 @@ // // String + toGMLPosition.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Extensions/String + toKeywords.swift b/Sources/FeedKit/Extensions/String + toKeywords.swift index 0226e243..fc5b5f8f 100644 --- a/Sources/FeedKit/Extensions/String + toKeywords.swift +++ b/Sources/FeedKit/Extensions/String + toKeywords.swift @@ -1,7 +1,7 @@ // // String + toKeywords.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Extensions/String + toMediaTags.swift b/Sources/FeedKit/Extensions/String + toMediaTags.swift index 1f40eb33..eb584924 100644 --- a/Sources/FeedKit/Extensions/String + toMediaTags.swift +++ b/Sources/FeedKit/Extensions/String + toMediaTags.swift @@ -1,7 +1,7 @@ // // String + toMediaTags.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feed.swift b/Sources/FeedKit/Feed.swift index 876c8327..89cd1a3f 100644 --- a/Sources/FeedKit/Feed.swift +++ b/Sources/FeedKit/Feed.swift @@ -1,7 +1,7 @@ // // Feed.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/FeedDateFormatter.swift b/Sources/FeedKit/FeedDateFormatter.swift index f7b757c1..e5b0e93e 100644 --- a/Sources/FeedKit/FeedDateFormatter.swift +++ b/Sources/FeedKit/FeedDateFormatter.swift @@ -1,7 +1,7 @@ // // FeedDateFormatter.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -141,8 +141,6 @@ final class RFC3339DateFormatter: PermissiveDateFormatter, @unchecked Sendable { /// Formatter for RFC822 date specification with backup formats. final class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable { - // MARK: Internal - /// List of date formats supported for RFC822. override var dateFormats: [String] { [ @@ -165,9 +163,7 @@ final class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable { // Non-standard, similar to RFC 822 with numeric timezone. "d MMM yyyy HH:mm:ss Z", // Non-standard, ISO-like format with numeric timezone. - "yyyy-MM-dd HH:mm:ss Z", - // Non-standard format with both numeric and named timezones (e.g. "UTC"). - "yyyy-MM-dd HH:mm:ss Z zzz" + "yyyy-MM-dd HH:mm:ss Z" ] } @@ -182,7 +178,8 @@ final class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable { // handle these in full compliance with Unicode tr35-31. For example, // "Tues, 6 November 2007 12:00:00 GMT" is rejected because of the "Tues", // even though "Tues" is used as an example for EEE in tr35-31. - let trimmed = Self.trimRegEx.stringByReplacingMatches( + let trimRegEx = try! NSRegularExpression(pattern: "^[a-zA-Z]+, ([\\w :+-]+)$") + let trimmed = trimRegEx.stringByReplacingMatches( in: string, options: [], range: NSMakeRange(0, string.count), @@ -197,10 +194,6 @@ final class RFC822DateFormatter: PermissiveDateFormatter, @unchecked Sendable { } return nil } - - // MARK: Private - - private static let trimRegEx = try! NSRegularExpression(pattern: "^[a-zA-Z]+, ([\\w :+-]+)$") } // MARK: - RFC1123 formatter @@ -260,6 +253,21 @@ final class FeedDateFormatter: DateFormatter, @unchecked Sendable { // MARK: Internal + /// The date specification to use for formatting dates. + let spec: DateSpec + + /// ISO8601 date formatter. + lazy var iso8601Formatter: ISO8601DateFormatter = .init() + + /// RFC3339 date formatter. + lazy var rfc3339Formatter: RFC3339DateFormatter = .init() + + /// RFC822 date formatter. + lazy var rfc822Formatter: RFC822DateFormatter = .init() + + /// RFC1123 date formatter. + lazy var rfc1123Formatter: RFC1123DateFormatter = .init() + /// Converts a string to a Date based on the given date specification. /// /// - Parameters: @@ -306,21 +314,4 @@ final class FeedDateFormatter: DateFormatter, @unchecked Sendable { fatalError() } } - - // MARK: Private - - /// The date specification to use for formatting dates. - private let spec: DateSpec - - /// ISO8601 date formatter. - private lazy var iso8601Formatter: ISO8601DateFormatter = .init() - - /// RFC3339 date formatter. - private lazy var rfc3339Formatter: RFC3339DateFormatter = .init() - - /// RFC822 date formatter. - private lazy var rfc822Formatter: RFC822DateFormatter = .init() - - /// RFC1123 date formatter. - private lazy var rfc1123Formatter: RFC1123DateFormatter = .init() } diff --git a/Sources/FeedKit/FeedError.swift b/Sources/FeedKit/FeedError.swift index 9fb6aca9..bcf04373 100644 --- a/Sources/FeedKit/FeedError.swift +++ b/Sources/FeedKit/FeedError.swift @@ -1,7 +1,7 @@ // // FeedError.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/FeedInitializable.swift b/Sources/FeedKit/FeedInitializable.swift index 32d5ef86..2ab7c17a 100644 --- a/Sources/FeedKit/FeedInitializable.swift +++ b/Sources/FeedKit/FeedInitializable.swift @@ -1,7 +1,7 @@ // // FeedInitializable.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/FeedNamespace.swift b/Sources/FeedKit/FeedNamespace.swift index 00fdd717..b228049d 100644 --- a/Sources/FeedKit/FeedNamespace.swift +++ b/Sources/FeedKit/FeedNamespace.swift @@ -1,7 +1,7 @@ // // FeedNamespace.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -57,9 +57,6 @@ enum FeedNamespace: CaseIterable { /// Represents the Atom feed namespace, typically used for syndication /// in the Atom format. case atom - /// Represents the Podcast namespace, used for podcast-specific metadata - /// and extensions in podcast feeds. - case podcast // MARK: Internal @@ -84,8 +81,6 @@ enum FeedNamespace: CaseIterable { "xmlns:yt" case .atom: "xmlns:atom" - case .podcast: - "xmlns:podcast" } } @@ -110,8 +105,6 @@ enum FeedNamespace: CaseIterable { "http://www.youtube.com/xml/schemas/2015" case .atom: "http://www.w3.org/2005/Atom" - case .podcast: - "https://podcastindex.org/namespace/1.0" } } } @@ -142,7 +135,7 @@ extension FeedNamespace { feed.channel?.items?.contains(where: { $0.content != nil }) ?? false case .georss: - feed.channel?.items?.contains(where: { $0.media?.location?.geoRSS != nil }) ?? false + feed.channel?.items?.contains(where: { $0.media?.location?.geoRSS != nil || $0.geoRSS != nil }) ?? false case .gml: feed.channel?.items?.contains(where: { $0.media?.location?.geoRSS?.gmlPoint != nil }) ?? false @@ -152,10 +145,6 @@ extension FeedNamespace { case .atom: feed.channel?.atom != nil - - case .podcast: - feed.channel?.podcast != nil || - feed.channel?.items?.contains(where: { $0.podcast != nil }) ?? false } } @@ -166,6 +155,8 @@ extension FeedNamespace { switch self { case .youTube: feed.entries?.contains(where: { $0.youTube != nil }) ?? false + case .georss: + feed.entries?.contains(where: { $0.geoRSS != nil }) ?? false default: false } diff --git a/Sources/FeedKit/FeedType.swift b/Sources/FeedKit/FeedType.swift index 53187666..f2051130 100644 --- a/Sources/FeedKit/FeedType.swift +++ b/Sources/FeedKit/FeedType.swift @@ -1,7 +1,7 @@ // // FeedType.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -84,7 +84,7 @@ public extension FeedType { } /// The number of bytes to inspect when determining the feed type. -private let inspectionPrefixLength = 128 +private let inspectionPrefixLength = 200 // MARK: - FeedInitializable @@ -94,12 +94,8 @@ extension FeedType: FeedInitializable { /// - Parameter data: A `Data` object representing a feed to be inspected. /// - Returns: A `FeedType` if the data matches a known feed format, otherwise `nil`. public init(data: Data) throws { - guard data.count >= inspectionPrefixLength else { - throw FeedError.unknownFeedFormat - } - - // Inspect only the first `inspectionPrefixLength` bytes. This helps improve performance - // while still providing enough data to reliably detect the feed format. + // Inspect only the first 200 bytes. This helps improve performance while + // still providing enough data to reliably detect the feed format. let string: String = .init(decoding: data.prefix(inspectionPrefixLength), as: UTF8.self) // Determine the feed type diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeed.swift b/Sources/FeedKit/Feeds/Atom/AtomFeed.swift index a48fb71a..23956d36 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeed.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeed.swift @@ -1,7 +1,7 @@ // // AtomFeed.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -46,8 +46,7 @@ public struct AtomFeed { icon: String? = nil, logo: String? = nil, rights: String? = nil, - entries: [AtomFeedEntry]? = nil, - dublinCore: DublinCore? = nil + entries: [AtomFeedEntry]? = nil ) { self.title = title self.subtitle = subtitle @@ -62,7 +61,6 @@ public struct AtomFeed { self.logo = logo self.rights = rights self.entries = entries - self.dublinCore = dublinCore } // MARK: Public @@ -195,12 +193,6 @@ public struct AtomFeed { /// appear as the document (i.e., top-level) element of a stand-alone /// Atom Entry Document. public var entries: [AtomFeedEntry]? - - /// The Dublin Core Metadata Element Set is a standard for cross-domain - /// resource description. - /// - /// See https://tools.ietf.org/html/rfc5013 - public var dublinCore: DublinCore? } // MARK: - Sendable @@ -218,7 +210,7 @@ extension AtomFeed: Hashable {} // MARK: - Codable extension AtomFeed: Codable { - private enum CodingKeys: String, CodingKey { + private enum CodingKeys: CodingKey { case title case subtitle case link @@ -232,7 +224,6 @@ extension AtomFeed: Codable { case logo case rights case entry - case dublinCore = "dc" } public init(from decoder: any Decoder) throws { @@ -250,7 +241,6 @@ extension AtomFeed: Codable { logo = try container.decodeIfPresent(String.self, forKey: CodingKeys.logo) rights = try container.decodeIfPresent(String.self, forKey: CodingKeys.rights) entries = try container.decodeIfPresent([AtomFeedEntry].self, forKey: CodingKeys.entry) - dublinCore = try container.decodeIfPresent(DublinCore.self, forKey: CodingKeys.dublinCore) } public func encode(to encoder: any Encoder) throws { @@ -268,7 +258,6 @@ extension AtomFeed: Codable { try container.encodeIfPresent(logo, forKey: CodingKeys.logo) try container.encodeIfPresent(rights, forKey: CodingKeys.rights) try container.encodeIfPresent(entries, forKey: CodingKeys.entry) - try container.encodeIfPresent(dublinCore, forKey: CodingKeys.dublinCore) } } diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedAuthor.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedAuthor.swift index cf5c75ae..64eccc14 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedAuthor.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedAuthor.swift @@ -1,7 +1,7 @@ // // AtomFeedAuthor.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedCategory.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedCategory.swift index 676e0bb2..7cdee885 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedCategory.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedCategory.swift @@ -1,7 +1,7 @@ // // AtomFeedCategory.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedContent.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedContent.swift index b0283c5a..4b34adfa 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedContent.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedContent.swift @@ -1,7 +1,7 @@ // // AtomFeedContent.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedContributor.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedContributor.swift index 7ee5ba63..050908fe 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedContributor.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedContributor.swift @@ -1,7 +1,7 @@ // // AtomFeedContributor.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedEntry.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedEntry.swift index 9369f155..527f9500 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedEntry.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedEntry.swift @@ -1,7 +1,7 @@ // // AtomFeedEntry.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -46,7 +46,7 @@ public struct AtomFeedEntry { rights: String? = nil, media: Media? = nil, youTube: YouTube? = nil, - dublinCore: DublinCore? = nil + geoRSS: GeoRSSSimple? = nil ) { self.title = title self.summary = summary @@ -62,7 +62,7 @@ public struct AtomFeedEntry { self.rights = rights self.media = media self.youTube = youTube - self.dublinCore = dublinCore + self.geoRSS = geoRSS } // MARK: Public @@ -205,11 +205,7 @@ public struct AtomFeedEntry { /// See https://developers.google.com/youtube/v3/guides/push_notifications public var youTube: YouTube? - /// The Dublin Core Metadata Element Set is a standard for cross-domain - /// resource description. - /// - /// See https://tools.ietf.org/html/rfc5013 - public var dublinCore: DublinCore? + public var geoRSS: GeoRSSSimple? } // MARK: - Sendable @@ -242,7 +238,7 @@ extension AtomFeedEntry: Codable { case rights case media case youTube = "yt" - case dublinCore = "dc" + case geoRSS = "georss" } public init(from decoder: any Decoder) throws { @@ -260,9 +256,9 @@ extension AtomFeedEntry: Codable { published = try container.decodeIfPresent(Date.self, forKey: CodingKeys.published) source = try container.decodeIfPresent(AtomFeedSource.self, forKey: CodingKeys.source) rights = try container.decodeIfPresent(String.self, forKey: CodingKeys.rights) - media = try container.decodeIfPresent(Media.self, forKey: .media) - youTube = try container.decodeIfPresent(YouTube.self, forKey: .youTube) - dublinCore = try container.decodeIfPresent(DublinCore.self, forKey: CodingKeys.dublinCore) + media = try container.decodeIfPresent(Media.self, forKey: CodingKeys.media) + youTube = try container.decodeIfPresent(YouTube.self, forKey: CodingKeys.youTube) + geoRSS = try container.decodeIfPresent(GeoRSSSimple.self, forKey: CodingKeys.geoRSS) } public func encode(to encoder: any Encoder) throws { @@ -282,6 +278,6 @@ extension AtomFeedEntry: Codable { try container.encodeIfPresent(rights, forKey: CodingKeys.rights) try container.encodeIfPresent(media, forKey: CodingKeys.media) try container.encodeIfPresent(youTube, forKey: CodingKeys.youTube) - try container.encodeIfPresent(dublinCore, forKey: CodingKeys.dublinCore) + try container.encodeIfPresent(geoRSS, forKey: CodingKeys.geoRSS) } } diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedGenerator.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedGenerator.swift index 282e6345..30740871 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedGenerator.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedGenerator.swift @@ -1,7 +1,7 @@ // // AtomFeedGenerator.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedLink.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedLink.swift index 0ec834ae..b2042201 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedLink.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedLink.swift @@ -1,7 +1,7 @@ // // AtomFeedLink.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift index e7404b3a..ac7ee73b 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift @@ -1,7 +1,7 @@ // // AtomFeedSource.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedSubtitle.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedSubtitle.swift index 989d96ce..0c6a0023 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedSubtitle.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedSubtitle.swift @@ -1,7 +1,7 @@ // // AtomFeedSubtitle.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedSummary.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedSummary.swift index c566a1f4..4e4410f6 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedSummary.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedSummary.swift @@ -1,7 +1,7 @@ // // AtomFeedSummary.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/Atom/AtomFeedTitle.swift b/Sources/FeedKit/Feeds/Atom/AtomFeedTitle.swift index c3b305a1..505c022c 100644 --- a/Sources/FeedKit/Feeds/Atom/AtomFeedTitle.swift +++ b/Sources/FeedKit/Feeds/Atom/AtomFeedTitle.swift @@ -1,7 +1,7 @@ // // AtomFeedTitle.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/JSON/JSONFeed.swift b/Sources/FeedKit/Feeds/JSON/JSONFeed.swift index 65bc4729..a5c6d824 100644 --- a/Sources/FeedKit/Feeds/JSON/JSONFeed.swift +++ b/Sources/FeedKit/Feeds/JSON/JSONFeed.swift @@ -1,7 +1,7 @@ // // JSONFeed.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/JSON/JSONFeedAttachment.swift b/Sources/FeedKit/Feeds/JSON/JSONFeedAttachment.swift index 346d34d2..bc29a98a 100644 --- a/Sources/FeedKit/Feeds/JSON/JSONFeedAttachment.swift +++ b/Sources/FeedKit/Feeds/JSON/JSONFeedAttachment.swift @@ -1,7 +1,7 @@ // // JSONFeedAttachment.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/JSON/JSONFeedAuthor.swift b/Sources/FeedKit/Feeds/JSON/JSONFeedAuthor.swift index 942ece5b..81f790ac 100644 --- a/Sources/FeedKit/Feeds/JSON/JSONFeedAuthor.swift +++ b/Sources/FeedKit/Feeds/JSON/JSONFeedAuthor.swift @@ -1,7 +1,7 @@ // // JSONFeedAuthor.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/JSON/JSONFeedHub.swift b/Sources/FeedKit/Feeds/JSON/JSONFeedHub.swift index e28147ac..860d66f4 100644 --- a/Sources/FeedKit/Feeds/JSON/JSONFeedHub.swift +++ b/Sources/FeedKit/Feeds/JSON/JSONFeedHub.swift @@ -1,7 +1,7 @@ // // JSONFeedHub.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/JSON/JSONFeedItem.swift b/Sources/FeedKit/Feeds/JSON/JSONFeedItem.swift index 10a7915c..1d780d52 100644 --- a/Sources/FeedKit/Feeds/JSON/JSONFeedItem.swift +++ b/Sources/FeedKit/Feeds/JSON/JSONFeedItem.swift @@ -1,7 +1,7 @@ // // JSONFeedItem.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeed.swift b/Sources/FeedKit/Feeds/RSS/RSSFeed.swift index 768fcc32..f8caab88 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeed.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeed.swift @@ -1,7 +1,7 @@ // // RSSFeed.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedCategory.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedCategory.swift index 30193bdf..25466b70 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedCategory.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedCategory.swift @@ -1,7 +1,7 @@ // // RSSFeedCategory.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedChannel.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedChannel.swift index 1f05dce7..65dde920 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedChannel.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedChannel.swift @@ -1,7 +1,7 @@ // // RSSFeedChannel.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -60,8 +60,7 @@ public struct RSSFeedChannel { dublinCore: DublinCore? = nil, iTunes: ITunes? = nil, syndication: Syndication? = nil, - atom: Atom? = nil, - podcast: Podcast? = nil + atom: Atom? = nil ) { self.title = title self.link = link @@ -87,7 +86,6 @@ public struct RSSFeedChannel { self.iTunes = iTunes self.syndication = syndication self.atom = atom - self.podcast = podcast } // MARK: Public @@ -309,10 +307,6 @@ public struct RSSFeedChannel { /// and hub information. /// See https://www.w3.org/TR/websub/#discovery public var atom: Atom? - - /// Podcast namespace provides podcast-specific metadata and extensions. - /// See https://github.com/Podcastindex-org/podcast-namespace - public var podcast: Podcast? } // MARK: - Sendable @@ -355,7 +349,6 @@ extension RSSFeedChannel: Codable { case iTunes = "itunes" case syndication = "sy" case atom - case podcast } public init(from decoder: any Decoder) throws { @@ -385,7 +378,6 @@ extension RSSFeedChannel: Codable { iTunes = try container.decodeIfPresent(ITunes.self, forKey: CodingKeys.iTunes) syndication = try container.decodeIfPresent(Syndication.self, forKey: CodingKeys.syndication) atom = try container.decodeIfPresent(Atom.self, forKey: CodingKeys.atom) - podcast = try container.decodeIfPresent(Podcast.self, forKey: CodingKeys.podcast) } public func encode(to encoder: any Encoder) throws { @@ -415,6 +407,5 @@ extension RSSFeedChannel: Codable { try container.encodeIfPresent(iTunes, forKey: CodingKeys.iTunes) try container.encodeIfPresent(syndication, forKey: CodingKeys.syndication) try container.encodeIfPresent(atom, forKey: CodingKeys.atom) - try container.encodeIfPresent(podcast, forKey: CodingKeys.podcast) } } diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedCloud.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedCloud.swift index 61c27a02..75a56e95 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedCloud.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedCloud.swift @@ -1,7 +1,7 @@ // // RSSFeedCloud.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedEnclosure.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedEnclosure.swift index f86eaacc..fc54b8bf 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedEnclosure.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedEnclosure.swift @@ -1,7 +1,7 @@ // // RSSFeedEnclosure.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedGUID.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedGUID.swift index 3416b0f3..348180c2 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedGUID.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedGUID.swift @@ -1,7 +1,7 @@ // // RSSFeedGUID.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedImage.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedImage.swift index ed915b23..47042f72 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedImage.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedImage.swift @@ -1,7 +1,7 @@ // // RSSFeedImage.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedItem.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedItem.swift index cb9129cf..71c43e63 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedItem.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedItem.swift @@ -1,7 +1,7 @@ // // RSSFeedItem.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -49,7 +49,7 @@ public struct RSSFeedItem { content: Content? = nil, iTunes: ITunes? = nil, media: Media? = nil, - podcast: Podcast? = nil + geoRSS: GeoRSSSimple? = nil ) { self.title = title self.link = link @@ -65,7 +65,7 @@ public struct RSSFeedItem { self.content = content self.iTunes = iTunes self.media = media - self.podcast = podcast + self.geoRSS = geoRSS } // MARK: Public @@ -225,10 +225,8 @@ public struct RSSFeedItem { /// Media RSS is a new RSS module that supplements the /// capabilities of RSS 2.0. public var media: Media? - - /// Podcast namespace provides podcast-specific metadata and extensions. - /// See https://github.com/Podcastindex-org/podcast-namespace - public var podcast: Podcast? + + public var geoRSS: GeoRSSSimple? } // MARK: - Sendable @@ -261,7 +259,7 @@ extension RSSFeedItem: Codable { case content case iTunes = "itunes" case media - case podcast + case geoRSS = "georss" } public init(from decoder: any Decoder) throws { @@ -281,7 +279,7 @@ extension RSSFeedItem: Codable { content = try container.decodeIfPresent(Content.self, forKey: CodingKeys.content) iTunes = try container.decodeIfPresent(ITunes.self, forKey: CodingKeys.iTunes) media = try container.decodeIfPresent(Media.self, forKey: CodingKeys.media) - podcast = try container.decodeIfPresent(Podcast.self, forKey: CodingKeys.podcast) + geoRSS = try container.decodeIfPresent(GeoRSSSimple.self, forKey: CodingKeys.geoRSS) } public func encode(to encoder: any Encoder) throws { @@ -301,6 +299,6 @@ extension RSSFeedItem: Codable { try container.encodeIfPresent(content, forKey: CodingKeys.content) try container.encodeIfPresent(iTunes, forKey: CodingKeys.iTunes) try container.encodeIfPresent(media, forKey: CodingKeys.media) - try container.encodeIfPresent(podcast, forKey: CodingKeys.podcast) + try container.encodeIfPresent(geoRSS, forKey: CodingKeys.geoRSS) } } diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedSkipDay.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedSkipDay.swift index 74375740..9fe4339f 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedSkipDay.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedSkipDay.swift @@ -1,7 +1,7 @@ // // RSSFeedSkipDay.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedSkipHours.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedSkipHours.swift index ae81289c..6df0710e 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedSkipHours.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedSkipHours.swift @@ -1,7 +1,7 @@ // // RSSFeedSkipHours.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedSource.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedSource.swift index dd36fcae..752e0ffa 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedSource.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedSource.swift @@ -1,7 +1,7 @@ // // RSSFeedSource.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Feeds/RSS/RSSFeedTextInput.swift b/Sources/FeedKit/Feeds/RSS/RSSFeedTextInput.swift index 9dbdf6fd..dc4086d2 100644 --- a/Sources/FeedKit/Feeds/RSS/RSSFeedTextInput.swift +++ b/Sources/FeedKit/Feeds/RSS/RSSFeedTextInput.swift @@ -1,7 +1,7 @@ // // RSSFeedTextInput.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Atom/Atom.swift b/Sources/FeedKit/Namespaces/Atom/Atom.swift index ccabd44d..3448b65e 100644 --- a/Sources/FeedKit/Namespaces/Atom/Atom.swift +++ b/Sources/FeedKit/Namespaces/Atom/Atom.swift @@ -1,7 +1,7 @@ // // Atom.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Atom/AtomLink.swift b/Sources/FeedKit/Namespaces/Atom/AtomLink.swift index c602eb29..41a02960 100644 --- a/Sources/FeedKit/Namespaces/Atom/AtomLink.swift +++ b/Sources/FeedKit/Namespaces/Atom/AtomLink.swift @@ -1,7 +1,7 @@ // // AtomLink.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Content/Content.swift b/Sources/FeedKit/Namespaces/Content/Content.swift index 0cc12faf..4ee3187a 100644 --- a/Sources/FeedKit/Namespaces/Content/Content.swift +++ b/Sources/FeedKit/Namespaces/Content/Content.swift @@ -1,7 +1,7 @@ // // Content.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/DublinCore/DublinCore.swift b/Sources/FeedKit/Namespaces/DublinCore/DublinCore.swift index 2cdef2b1..f5bd8377 100644 --- a/Sources/FeedKit/Namespaces/DublinCore/DublinCore.swift +++ b/Sources/FeedKit/Namespaces/DublinCore/DublinCore.swift @@ -1,7 +1,7 @@ // // DublinCore.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/GML/GMLPoint.swift b/Sources/FeedKit/Namespaces/GML/GMLPoint.swift index 08cf6ac7..1cf9f402 100644 --- a/Sources/FeedKit/Namespaces/GML/GMLPoint.swift +++ b/Sources/FeedKit/Namespaces/GML/GMLPoint.swift @@ -1,7 +1,7 @@ // // GMLPoint.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Geo/GeoRSS.swift b/Sources/FeedKit/Namespaces/Geo/GeoRSS.swift index 2c1c5031..1249b43c 100644 --- a/Sources/FeedKit/Namespaces/Geo/GeoRSS.swift +++ b/Sources/FeedKit/Namespaces/Geo/GeoRSS.swift @@ -1,7 +1,7 @@ // // GeoRSS.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -39,7 +39,7 @@ public struct GeoRSS { /// A point consists of a GML element with a child element. /// Within the latitude and longitude coordinate values are separated /// by a space. - var gmlPoint: GMLPoint? + public var gmlPoint: GMLPoint? } // MARK: - Sendable diff --git a/Sources/FeedKit/Namespaces/Geo/GeoRSSSimple.swift b/Sources/FeedKit/Namespaces/Geo/GeoRSSSimple.swift new file mode 100644 index 00000000..90e651e4 --- /dev/null +++ b/Sources/FeedKit/Namespaces/Geo/GeoRSSSimple.swift @@ -0,0 +1,72 @@ +// +// GeoRSSSimple.swift +// +// Copyright (c) 2016 - 2025 Nuno Dias +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import Foundation +import XMLKit + +public struct GeoRSSSimple { + public init(point: GeoRSSSimplePoint? = nil, elevation: Double? = nil) { + self.point = point + self.elevation = elevation + } + + public var point: GeoRSSSimplePoint? + public var elevation: Double? +} + +extension GeoRSSSimple: XMLNamespaceCodable {} + +// MARK: - Sendable + +extension GeoRSSSimple: Sendable {} + +// MARK: - Equatable + +extension GeoRSSSimple: Equatable {} + +// MARK: - Hashable + +extension GeoRSSSimple: Hashable {} + +// MARK: - Codable + +extension GeoRSSSimple: Codable { + private enum CodingKeys: String, CodingKey { + case point = "georss:point" + case elevation = "georss:elev" + } + + public init(from decoder: any Decoder) throws { + let container: KeyedDecodingContainer = try decoder.container(keyedBy: GeoRSSSimple.CodingKeys.self) + + point = try container.decodeIfPresent(GeoRSSSimplePoint.self, forKey: GeoRSSSimple.CodingKeys.point) + elevation = try container.decodeIfPresent(Double.self, forKey: GeoRSSSimple.CodingKeys.elevation) + } + + public func encode(to encoder: any Encoder) throws { + var container: KeyedEncodingContainer = encoder.container(keyedBy: GeoRSSSimple.CodingKeys.self) + + try container.encodeIfPresent(point, forKey: GeoRSSSimple.CodingKeys.point) + try container.encodeIfPresent(elevation, forKey: GeoRSSSimple.CodingKeys.elevation) + } +} diff --git a/Sources/FeedKit/Namespaces/Geo/GeoRSSSimplePoint.swift b/Sources/FeedKit/Namespaces/Geo/GeoRSSSimplePoint.swift new file mode 100644 index 00000000..0770d0f6 --- /dev/null +++ b/Sources/FeedKit/Namespaces/Geo/GeoRSSSimplePoint.swift @@ -0,0 +1,77 @@ +// +// GeoRSSSimplePoint.swift +// +// Copyright (c) 2016 - 2025 Nuno Dias +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +public struct GeoRSSSimplePoint { + public init(position: (latitude: Double, longitude: Double)? = nil) { + self.position = position + } + + // MARK: Public + + /// The geographical position represented as latitude and longitude + /// for a element. + /// + /// - The `position` is an optional tuple containing the latitude and longitude + /// as `Double` values. If not provided, it defaults to `nil`. + public var position: (latitude: Double, longitude: Double)? +} + +// MARK: - Sendable + +extension GeoRSSSimplePoint: Sendable {} + +// MARK: - Equatable + +extension GeoRSSSimplePoint: Equatable { + public static func == (lhs: GeoRSSSimplePoint, rhs: GeoRSSSimplePoint) -> Bool { + lhs.position?.latitude == rhs.position?.latitude && lhs.position?.longitude == rhs.position?.longitude + } +} + +// MARK: - Hashable + +extension GeoRSSSimplePoint: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(position?.latitude) + hasher.combine(position?.longitude) + } +} + +// MARK: - Codable + +extension GeoRSSSimplePoint: Codable { + public init(from decoder: any Decoder) throws { + let container = try decoder.singleValueContainer() + + position = try container.decode(String.self).toGMLPosition() + } + + public func encode(to encoder: any Encoder) throws { + var container = encoder.singleValueContainer() + + if let position { + let positionString = "\(position.latitude) \(position.longitude)" + try container.encode(positionString) + } + } +} diff --git a/Sources/FeedKit/Namespaces/Media/Media.swift b/Sources/FeedKit/Namespaces/Media/Media.swift index 60c4563e..b4692ec3 100644 --- a/Sources/FeedKit/Namespaces/Media/Media.swift +++ b/Sources/FeedKit/Namespaces/Media/Media.swift @@ -1,7 +1,7 @@ // // Media.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaBacklinks.swift b/Sources/FeedKit/Namespaces/Media/MediaBacklinks.swift index 179d49fa..d726badf 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaBacklinks.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaBacklinks.swift @@ -1,7 +1,7 @@ // // MediaBacklinks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaCategory.swift b/Sources/FeedKit/Namespaces/Media/MediaCategory.swift index 8e958102..52603514 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaCategory.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaCategory.swift @@ -1,7 +1,7 @@ // // MediaCategory.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaComments.swift b/Sources/FeedKit/Namespaces/Media/MediaComments.swift index 0c2a043d..ebf8b2e1 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaComments.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaComments.swift @@ -1,7 +1,7 @@ // // MediaComments.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaCommunity.swift b/Sources/FeedKit/Namespaces/Media/MediaCommunity.swift index 6f6dfc9c..04632c6b 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaCommunity.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaCommunity.swift @@ -1,7 +1,7 @@ // // MediaCommunity.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaContent.swift b/Sources/FeedKit/Namespaces/Media/MediaContent.swift index 97fa90a4..511bae76 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaContent.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaContent.swift @@ -1,7 +1,7 @@ // // MediaContent.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaCopyright.swift b/Sources/FeedKit/Namespaces/Media/MediaCopyright.swift index ab9aa36e..84909cf6 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaCopyright.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaCopyright.swift @@ -1,7 +1,7 @@ // // MediaCopyright.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaCredit.swift b/Sources/FeedKit/Namespaces/Media/MediaCredit.swift index 530d6b18..7a65e293 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaCredit.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaCredit.swift @@ -1,7 +1,7 @@ // // MediaCredit.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaDescription.swift b/Sources/FeedKit/Namespaces/Media/MediaDescription.swift index 0c1c09ae..531006a6 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaDescription.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaDescription.swift @@ -1,7 +1,7 @@ // // MediaDescription.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaEmbed.swift b/Sources/FeedKit/Namespaces/Media/MediaEmbed.swift index 8a1ef08a..f0af559c 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaEmbed.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaEmbed.swift @@ -1,7 +1,7 @@ // // MediaEmbed.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaGroup.swift b/Sources/FeedKit/Namespaces/Media/MediaGroup.swift index a78e6204..2ea629d2 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaGroup.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaGroup.swift @@ -1,7 +1,7 @@ // // MediaGroup.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaHash.swift b/Sources/FeedKit/Namespaces/Media/MediaHash.swift index db62f053..6c29f90c 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaHash.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaHash.swift @@ -1,7 +1,7 @@ // // MediaHash.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaLicence.swift b/Sources/FeedKit/Namespaces/Media/MediaLicence.swift index 1eff06c7..672f677c 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaLicence.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaLicence.swift @@ -1,7 +1,7 @@ // // MediaLicence.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaLocation.swift b/Sources/FeedKit/Namespaces/Media/MediaLocation.swift index dc480fd9..bab7568d 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaLocation.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaLocation.swift @@ -1,7 +1,7 @@ // // MediaLocation.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaParam.swift b/Sources/FeedKit/Namespaces/Media/MediaParam.swift index 93f13270..c75cbbcb 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaParam.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaParam.swift @@ -1,7 +1,7 @@ // // MediaParam.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaPeerLink.swift b/Sources/FeedKit/Namespaces/Media/MediaPeerLink.swift index 06bcf455..2b18c772 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaPeerLink.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaPeerLink.swift @@ -1,7 +1,7 @@ // // MediaPeerLink.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaPlayer.swift b/Sources/FeedKit/Namespaces/Media/MediaPlayer.swift index cfb768e9..faeb0ef1 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaPlayer.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaPlayer.swift @@ -1,7 +1,7 @@ // // MediaPlayer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaPrice.swift b/Sources/FeedKit/Namespaces/Media/MediaPrice.swift index ee9b7301..e9db9b43 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaPrice.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaPrice.swift @@ -1,7 +1,7 @@ // // MediaPrice.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaRating.swift b/Sources/FeedKit/Namespaces/Media/MediaRating.swift index c060c16a..03a283cd 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaRating.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaRating.swift @@ -1,7 +1,7 @@ // // MediaRating.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaReponses.swift b/Sources/FeedKit/Namespaces/Media/MediaReponses.swift index ccbac3a9..c99f895b 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaReponses.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaReponses.swift @@ -1,7 +1,7 @@ // // MediaReponses.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaRestriction.swift b/Sources/FeedKit/Namespaces/Media/MediaRestriction.swift index 6a1dc227..3479e896 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaRestriction.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaRestriction.swift @@ -1,7 +1,7 @@ // // MediaRestriction.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaRights.swift b/Sources/FeedKit/Namespaces/Media/MediaRights.swift index 87885811..a93d7524 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaRights.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaRights.swift @@ -1,7 +1,7 @@ // // MediaRights.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaScene.swift b/Sources/FeedKit/Namespaces/Media/MediaScene.swift index 62afa2f0..4f698f2d 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaScene.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaScene.swift @@ -1,7 +1,7 @@ // // MediaScene.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaScenes.swift b/Sources/FeedKit/Namespaces/Media/MediaScenes.swift index c361abb6..25b880cc 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaScenes.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaScenes.swift @@ -1,7 +1,7 @@ // // MediaScenes.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaStarRating.swift b/Sources/FeedKit/Namespaces/Media/MediaStarRating.swift index da234659..7e722445 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaStarRating.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaStarRating.swift @@ -1,7 +1,7 @@ // // MediaStarRating.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaStatistics.swift b/Sources/FeedKit/Namespaces/Media/MediaStatistics.swift index ed75de28..ec8a7cb8 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaStatistics.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaStatistics.swift @@ -1,7 +1,7 @@ // // MediaStatistics.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaStatus.swift b/Sources/FeedKit/Namespaces/Media/MediaStatus.swift index 733c358d..c0b3a23d 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaStatus.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaStatus.swift @@ -1,7 +1,7 @@ // // MediaStatus.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaSubTitle.swift b/Sources/FeedKit/Namespaces/Media/MediaSubTitle.swift index e629e363..ff2cc73c 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaSubTitle.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaSubTitle.swift @@ -1,7 +1,7 @@ // // MediaSubTitle.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaTag.swift b/Sources/FeedKit/Namespaces/Media/MediaTag.swift index 3f24177a..dde41900 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaTag.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaTag.swift @@ -1,7 +1,7 @@ // // MediaTag.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaText.swift b/Sources/FeedKit/Namespaces/Media/MediaText.swift index 1cd27ad5..c022af83 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaText.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaText.swift @@ -1,7 +1,7 @@ // // MediaText.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaThumbnail.swift b/Sources/FeedKit/Namespaces/Media/MediaThumbnail.swift index 9b6babc2..3095a005 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaThumbnail.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaThumbnail.swift @@ -1,7 +1,7 @@ // // MediaThumbnail.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Media/MediaTitle.swift b/Sources/FeedKit/Namespaces/Media/MediaTitle.swift index 2fb60a0a..2bee8a66 100644 --- a/Sources/FeedKit/Namespaces/Media/MediaTitle.swift +++ b/Sources/FeedKit/Namespaces/Media/MediaTitle.swift @@ -1,7 +1,7 @@ // // MediaTitle.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Podcast/Podcast.swift b/Sources/FeedKit/Namespaces/Podcast/Podcast.swift deleted file mode 100644 index 4ea9f601..00000000 --- a/Sources/FeedKit/Namespaces/Podcast/Podcast.swift +++ /dev/null @@ -1,100 +0,0 @@ -// -// Podcast.swift -// -// Copyright (c) 2016 - 2026 Nuno Dias -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import Foundation -import XMLKit - -/// Podcast namespace tags for podcast-specific metadata and extensions. -/// -/// The Podcast namespace is a comprehensive RSS namespace for podcasting that -/// provides additional metadata and functionality for podcast feeds. -/// -/// See https://github.com/Podcastindex-org/podcast-namespace -public struct Podcast { - // MARK: Lifecycle - - public init( - guid: String? = nil, - transcripts: [PodcastTranscript]? = nil - - ) { - self.guid = guid - self.transcripts = transcripts - } - - // MARK: Public - - /// This element is used to declare a unique, global identifier for a podcast. - /// See https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/tags/guid.md - public var guid: String? - - /// Links to transcript or closed captions files for a podcast episode. - /// - /// Multiple transcripts can be provided for different languages or formats. - /// - /// Example: - /// ```xml - /// - /// - /// ``` - public var transcripts: [PodcastTranscript]? -} - -// MARK: - XMLNamespaceCodable - -extension Podcast: XMLNamespaceCodable {} - -// MARK: - Sendable - -extension Podcast: Sendable {} - -// MARK: - Equatable - -extension Podcast: Equatable {} - -// MARK: - Hashable - -extension Podcast: Hashable {} - -// MARK: - Codable - -extension Podcast: Codable { - private enum CodingKeys: String, CodingKey { - case guid = "podcast:guid" - case transcripts = "podcast:transcript" - } - - public init(from decoder: any Decoder) throws { - let container: KeyedDecodingContainer = try decoder.container(keyedBy: CodingKeys.self) - - guid = try container.decodeIfPresent(String.self, forKey: CodingKeys.guid) - transcripts = try container.decodeIfPresent([PodcastTranscript].self, forKey: CodingKeys.transcripts) - } - - public func encode(to encoder: any Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - - try container.encodeIfPresent(guid, forKey: CodingKeys.guid) - try container.encodeIfPresent(transcripts, forKey: CodingKeys.transcripts) - } -} diff --git a/Sources/FeedKit/Namespaces/Podcast/PodcastTranscript.swift b/Sources/FeedKit/Namespaces/Podcast/PodcastTranscript.swift deleted file mode 100644 index 1cb9b349..00000000 --- a/Sources/FeedKit/Namespaces/Podcast/PodcastTranscript.swift +++ /dev/null @@ -1,87 +0,0 @@ -// -// PodcastTranscript.swift -// -// Copyright (c) 2016 - 2026 Nuno Dias -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. - -import Foundation -import XMLKit - -/// Attributes for the `` element. -/// -/// The `` tag links to a transcript or closed captions file -/// for a podcast episode, enhancing accessibility and searchability. -/// -/// See https://github.com/Podcastindex-org/podcast-namespace -public struct PodcastTranscriptAttributes: Codable, Equatable, Hashable, Sendable { - // MARK: Lifecycle - - public init( - url: String? = nil, - type: String? = nil, - language: String? = nil, - rel: String? = nil - ) { - self.url = url - self.type = type - self.language = language - self.rel = rel - } - - // MARK: Public - - /// The URL of the transcript file (required). - /// - /// Example: https://example.com/episode1/transcript.txt - public var url: String? - - /// The MIME type of the transcript file (required). - /// - /// Common values: text/plain, text/html, text/vtt, application/json, application/x-subrip - /// - /// Example: text/vtt - public var type: String? - - /// The language of the transcript (optional). - /// - /// Example: en, es, fr - public var language: String? - - /// Indicates if the transcript is a closed captions file (optional). - /// - /// Use "captions" to indicate this is a closed captions file. - /// - /// Example: captions - public var rel: String? -} - -/// Represents a transcript or closed captions file for a podcast episode. -/// -/// The `` tag links to a transcript or closed captions file -/// for a podcast episode, enhancing accessibility and searchability. -/// -/// Example: -/// ```xml -/// -/// -/// ``` -/// -/// See https://github.com/Podcastindex-org/podcast-namespace -public typealias PodcastTranscript = XMLAttributesElement diff --git a/Sources/FeedKit/Namespaces/Syndication/Syndication.swift b/Sources/FeedKit/Namespaces/Syndication/Syndication.swift index 9a652c70..3f457024 100644 --- a/Sources/FeedKit/Namespaces/Syndication/Syndication.swift +++ b/Sources/FeedKit/Namespaces/Syndication/Syndication.swift @@ -1,7 +1,7 @@ // // Syndication.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/Syndication/SyndicationUpdatePeriod.swift b/Sources/FeedKit/Namespaces/Syndication/SyndicationUpdatePeriod.swift index de91ea33..1aa3acec 100644 --- a/Sources/FeedKit/Namespaces/Syndication/SyndicationUpdatePeriod.swift +++ b/Sources/FeedKit/Namespaces/Syndication/SyndicationUpdatePeriod.swift @@ -1,7 +1,7 @@ // // SyndicationUpdatePeriod.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/YouTube/Youtube.swift b/Sources/FeedKit/Namespaces/YouTube/Youtube.swift index 2ee01cfa..16898d90 100644 --- a/Sources/FeedKit/Namespaces/YouTube/Youtube.swift +++ b/Sources/FeedKit/Namespaces/YouTube/Youtube.swift @@ -1,7 +1,7 @@ // // Youtube.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/iTunes/ITunes.swift b/Sources/FeedKit/Namespaces/iTunes/ITunes.swift index e6f2583a..a5cc9c97 100644 --- a/Sources/FeedKit/Namespaces/iTunes/ITunes.swift +++ b/Sources/FeedKit/Namespaces/iTunes/ITunes.swift @@ -1,7 +1,7 @@ // // ITunes.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/iTunes/iTunesCategory.swift b/Sources/FeedKit/Namespaces/iTunes/iTunesCategory.swift index 0726da41..878f15a3 100644 --- a/Sources/FeedKit/Namespaces/iTunes/iTunesCategory.swift +++ b/Sources/FeedKit/Namespaces/iTunes/iTunesCategory.swift @@ -1,7 +1,7 @@ // // iTunesCategory.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/iTunes/iTunesImage.swift b/Sources/FeedKit/Namespaces/iTunes/iTunesImage.swift index 982ab968..585f74f6 100644 --- a/Sources/FeedKit/Namespaces/iTunes/iTunesImage.swift +++ b/Sources/FeedKit/Namespaces/iTunes/iTunesImage.swift @@ -1,7 +1,7 @@ // // iTunesImage.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/iTunes/iTunesOwner.swift b/Sources/FeedKit/Namespaces/iTunes/iTunesOwner.swift index 37bc392c..729aa7c1 100644 --- a/Sources/FeedKit/Namespaces/iTunes/iTunesOwner.swift +++ b/Sources/FeedKit/Namespaces/iTunes/iTunesOwner.swift @@ -1,7 +1,7 @@ // // iTunesOwner.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/FeedKit/Namespaces/iTunes/iTunesSubCategory.swift b/Sources/FeedKit/Namespaces/iTunes/iTunesSubCategory.swift index cf272ff7..fa2bbb2e 100644 --- a/Sources/FeedKit/Namespaces/iTunes/iTunesSubCategory.swift +++ b/Sources/FeedKit/Namespaces/iTunes/iTunesSubCategory.swift @@ -1,7 +1,7 @@ // // iTunesSubCategory.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/Extensions/String + escapeCharacters.swift b/Sources/XMLKit/Extensions/String + escapeCharacters.swift index b5988df2..7f770293 100644 --- a/Sources/XMLKit/Extensions/String + escapeCharacters.swift +++ b/Sources/XMLKit/Extensions/String + escapeCharacters.swift @@ -1,7 +1,7 @@ // // String + escapeCharacters.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDecoder/XMLDateDecodingStrategy.swift b/Sources/XMLKit/XMLDecoder/XMLDateDecodingStrategy.swift index cdb72403..9401c06a 100644 --- a/Sources/XMLKit/XMLDecoder/XMLDateDecodingStrategy.swift +++ b/Sources/XMLKit/XMLDecoder/XMLDateDecodingStrategy.swift @@ -1,7 +1,7 @@ // // XMLDateDecodingStrategy.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDecoder/XMLDecoder.swift b/Sources/XMLKit/XMLDecoder/XMLDecoder.swift index 6a5a7ac4..1f37e6c9 100644 --- a/Sources/XMLKit/XMLDecoder/XMLDecoder.swift +++ b/Sources/XMLKit/XMLDecoder/XMLDecoder.swift @@ -1,7 +1,7 @@ // // XMLDecoder.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDecoder/XMLKeyedDecodingContainer.swift b/Sources/XMLKit/XMLDecoder/XMLKeyedDecodingContainer.swift index 5bbd6683..3eb4c088 100644 --- a/Sources/XMLKit/XMLDecoder/XMLKeyedDecodingContainer.swift +++ b/Sources/XMLKit/XMLDecoder/XMLKeyedDecodingContainer.swift @@ -1,7 +1,7 @@ // // XMLKeyedDecodingContainer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDecoder/XMLSingleValueDecodingContainer.swift b/Sources/XMLKit/XMLDecoder/XMLSingleValueDecodingContainer.swift index a517a557..1141c3bc 100644 --- a/Sources/XMLKit/XMLDecoder/XMLSingleValueDecodingContainer.swift +++ b/Sources/XMLKit/XMLDecoder/XMLSingleValueDecodingContainer.swift @@ -1,7 +1,7 @@ // // XMLSingleValueDecodingContainer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDecoder/XMLUnkeyedDecodingContainer.swift b/Sources/XMLKit/XMLDecoder/XMLUnkeyedDecodingContainer.swift index 4d5800f8..a0d070c6 100644 --- a/Sources/XMLKit/XMLDecoder/XMLUnkeyedDecodingContainer.swift +++ b/Sources/XMLKit/XMLDecoder/XMLUnkeyedDecodingContainer.swift @@ -1,7 +1,7 @@ // // XMLUnkeyedDecodingContainer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDocument.swift b/Sources/XMLKit/XMLDocument.swift index e594e4ab..f07cb0e9 100644 --- a/Sources/XMLKit/XMLDocument.swift +++ b/Sources/XMLKit/XMLDocument.swift @@ -1,7 +1,7 @@ // // XMLDocument.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLDocumentConvertible.swift b/Sources/XMLKit/XMLDocumentConvertible.swift index 20aa844d..68b402d9 100644 --- a/Sources/XMLKit/XMLDocumentConvertible.swift +++ b/Sources/XMLKit/XMLDocumentConvertible.swift @@ -1,7 +1,7 @@ // // XMLDocumentConvertible.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLElement.swift b/Sources/XMLKit/XMLElement.swift index dcce187a..f532abcd 100644 --- a/Sources/XMLKit/XMLElement.swift +++ b/Sources/XMLKit/XMLElement.swift @@ -1,7 +1,7 @@ // // XMLElement.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLEncoder/XMLCodingKey.swift b/Sources/XMLKit/XMLEncoder/XMLCodingKey.swift index 040139e7..831ea750 100644 --- a/Sources/XMLKit/XMLEncoder/XMLCodingKey.swift +++ b/Sources/XMLKit/XMLEncoder/XMLCodingKey.swift @@ -1,7 +1,7 @@ // // XMLCodingKey.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLEncoder/XMLDateEncodingStrategy.swift b/Sources/XMLKit/XMLEncoder/XMLDateEncodingStrategy.swift index 05f303a6..4c3bad7f 100644 --- a/Sources/XMLKit/XMLEncoder/XMLDateEncodingStrategy.swift +++ b/Sources/XMLKit/XMLEncoder/XMLDateEncodingStrategy.swift @@ -1,7 +1,7 @@ // // XMLDateEncodingStrategy.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLEncoder/XMLEncoder.swift b/Sources/XMLKit/XMLEncoder/XMLEncoder.swift index 412a8322..788bd491 100644 --- a/Sources/XMLKit/XMLEncoder/XMLEncoder.swift +++ b/Sources/XMLKit/XMLEncoder/XMLEncoder.swift @@ -1,7 +1,7 @@ // // XMLEncoder.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLEncoder/XMLKeyedEncodingContainer.swift b/Sources/XMLKit/XMLEncoder/XMLKeyedEncodingContainer.swift index 4fc114f8..e7e48aee 100644 --- a/Sources/XMLKit/XMLEncoder/XMLKeyedEncodingContainer.swift +++ b/Sources/XMLKit/XMLEncoder/XMLKeyedEncodingContainer.swift @@ -1,7 +1,7 @@ // // XMLKeyedEncodingContainer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLEncoder/XMLSingleValueEncodingContainer.swift b/Sources/XMLKit/XMLEncoder/XMLSingleValueEncodingContainer.swift index e7ac4979..e07e9f02 100644 --- a/Sources/XMLKit/XMLEncoder/XMLSingleValueEncodingContainer.swift +++ b/Sources/XMLKit/XMLEncoder/XMLSingleValueEncodingContainer.swift @@ -1,7 +1,7 @@ // // XMLSingleValueEncodingContainer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLEncoder/XMLUnkeyedEncodingContainer.swift b/Sources/XMLKit/XMLEncoder/XMLUnkeyedEncodingContainer.swift index 489ad0a1..8ad60c08 100644 --- a/Sources/XMLKit/XMLEncoder/XMLUnkeyedEncodingContainer.swift +++ b/Sources/XMLKit/XMLEncoder/XMLUnkeyedEncodingContainer.swift @@ -1,7 +1,7 @@ // // XMLUnkeyedEncodingContainer.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLError.swift b/Sources/XMLKit/XMLError.swift index 7a3d745e..07bafc11 100644 --- a/Sources/XMLKit/XMLError.swift +++ b/Sources/XMLKit/XMLError.swift @@ -1,7 +1,7 @@ // // XMLError.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLHeader.swift b/Sources/XMLKit/XMLHeader.swift index 252b4cb3..b42627ed 100644 --- a/Sources/XMLKit/XMLHeader.swift +++ b/Sources/XMLKit/XMLHeader.swift @@ -1,7 +1,7 @@ // // XMLHeader.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLNamespaceCodable.swift b/Sources/XMLKit/XMLNamespaceCodable.swift index fe176275..55159dcb 100644 --- a/Sources/XMLKit/XMLNamespaceCodable.swift +++ b/Sources/XMLKit/XMLNamespaceCodable.swift @@ -1,7 +1,7 @@ // // XMLNamespaceCodable.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Sources/XMLKit/XMLNode.swift b/Sources/XMLKit/XMLNode.swift index 146db94d..79f047e7 100644 --- a/Sources/XMLKit/XMLNode.swift +++ b/Sources/XMLKit/XMLNode.swift @@ -1,7 +1,7 @@ // // XMLNode.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -49,7 +49,7 @@ class XMLNode: Codable, Equatable, Hashable { self.children?.forEach { $0.parent = self } } - required init(from decoder: any Decoder) throws { + public required init(from decoder: any Decoder) throws { let container: KeyedDecodingContainer = try decoder.container(keyedBy: XMLNode.CodingKeys.self) prefix = try container.decodeIfPresent(String.self, forKey: XMLNode.CodingKeys.prefix) @@ -59,30 +59,11 @@ class XMLNode: Codable, Equatable, Hashable { children = try container.decodeIfPresent([XMLNode].self, forKey: XMLNode.CodingKeys.children) } - // MARK: Internal - - /// The parent node of this node. - weak var parent: XMLNode? - /// Is the `text` property xhtml - var isXhtml: Bool = false - /// The namespace prefix - var prefix: String? - /// The name of the node. - var name: String - /// The text of the node, if present. - var text: String? - - /// The child nodes of this node. - var children: [XMLNode]? { - didSet { - // Update the parent reference for all children - children?.forEach { $0.parent = self } - } - } + // MARK: Public // MARK: Equatable - static func == (lhs: XMLNode, rhs: XMLNode) -> Bool { + public static func == (lhs: XMLNode, rhs: XMLNode) -> Bool { // Compare current node's properties if lhs.prefix != rhs.prefix || @@ -111,20 +92,20 @@ class XMLNode: Codable, Equatable, Hashable { // MARK: Hashable - func hash(into hasher: inout Hasher) { + public func hash(into hasher: inout Hasher) { // Hash basic properties hasher.combine(prefix) hasher.combine(name) hasher.combine(text) hasher.combine(isXhtml) - // Hash children if present + // Recursively hash the children if let children { - hasher.combine(children) + hasher.combine(children.map(\.hashValue)) } } - func encode(to encoder: any Encoder) throws { + public func encode(to encoder: any Encoder) throws { var container: KeyedEncodingContainer = encoder.container(keyedBy: XMLNode.CodingKeys.self) try container.encodeIfPresent(prefix, forKey: XMLNode.CodingKeys.prefix) @@ -134,15 +115,15 @@ class XMLNode: Codable, Equatable, Hashable { try container.encodeIfPresent(children, forKey: XMLNode.CodingKeys.children) } - func child(for name: String) -> XMLNode? { + public func child(for name: String) -> XMLNode? { children?.first(where: { $0.name == name }) } - func hasChild(for name: String) -> Bool { + public func hasChild(for name: String) -> Bool { children?.first(where: { $0.name == name || $0.prefix == name }) != nil } - func addChild(_ child: XMLNode) { + public func addChild(_ child: XMLNode) { if children == nil { children = [] } @@ -153,7 +134,7 @@ class XMLNode: Codable, Equatable, Hashable { /// - Parameters: /// - name: The name of the attribute. /// - value: The value of the attribute. - func setAttribute(name: String, value: String) { + public func setAttribute(name: String, value: String) { // Find or create the `@attributes` node if let attributesNode = children?.first(where: { $0.name == "@attributes" }) { // Add the new attribute as a child of `@attributes` @@ -181,6 +162,27 @@ class XMLNode: Codable, Equatable, Hashable { } } + // MARK: Internal + + /// The parent node of this node. + weak var parent: XMLNode? + /// Is the `text` property xhtml + var isXhtml: Bool = false + /// The namespace prefix + var prefix: String? + /// The name of the node. + var name: String + /// The text of the node, if present. + var text: String? + + /// The child nodes of this node. + var children: [XMLNode]? { + didSet { + // Update the parent reference for all children + children?.forEach { $0.parent = self } + } + } + // MARK: Private // MARK: - Codable @@ -202,7 +204,7 @@ extension XMLNode: XMLStringConvertible { /// false for compact XML). /// - Parameter indentationLevel: The current level of indentation. /// - Returns: A string representation of the XML for the node. - func toXMLString( + public func toXMLString( formatted: Bool = false, indentationLevel: Int = 1 ) -> String { diff --git a/Sources/XMLKit/XMLReader.swift b/Sources/XMLKit/XMLReader.swift index 286bbdf4..d5590334 100644 --- a/Sources/XMLKit/XMLReader.swift +++ b/Sources/XMLKit/XMLReader.swift @@ -1,7 +1,7 @@ // // XMLReader.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -103,8 +103,8 @@ extension XMLReader: XMLParserDelegate { ) { // Determine prefix and namespace var prefix: String? - if let prefixDelimiterIndex = elementName.firstIndex(of: ":") { - prefix = String(elementName[.. XMLNode? { + func pop() -> XMLNode? { stack.popLast() } /// Returns the top `XMLNode` without removing it from the stack. /// - Returns: The top `XMLNode` if the stack is not empty, otherwise `nil`. - mutating func top() -> XMLNode? { + func top() -> XMLNode? { stack.last } diff --git a/Sources/XMLKit/XMLStringConvertible.swift b/Sources/XMLKit/XMLStringConvertible.swift index 3ecade70..889ffa1d 100644 --- a/Sources/XMLKit/XMLStringConvertible.swift +++ b/Sources/XMLKit/XMLStringConvertible.swift @@ -1,7 +1,7 @@ // // XMLStringConvertible.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/FeedKitTestable.swift b/Tests/FeedKitTests/FeedKitTestable.swift index 65102fc1..15d5c907 100644 --- a/Tests/FeedKitTests/FeedKitTestable.swift +++ b/Tests/FeedKitTests/FeedKitTestable.swift @@ -1,7 +1,7 @@ // // FeedKitTestable.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -49,7 +49,7 @@ protocol FeedKitTestable { /// - directory: The directory in which the file will be saved (e.g., /// `.documentDirectory`). /// - fileName: The name of the file to be saved. - func save(_ object: some Codable, to directory: FileManager.SearchPathDirectory, as fileName: String) + func save(_ object: T, to directory: FileManager.SearchPathDirectory, as fileName: String) } extension FeedKitTestable { diff --git a/Tests/FeedKitTests/Resources/xml/AtomDC.xml b/Tests/FeedKitTests/Resources/xml/AtomDC.xml deleted file mode 100644 index 13c3ac94..00000000 --- a/Tests/FeedKitTests/Resources/xml/AtomDC.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - title - creator - subject - description - publisher - contributor - Sat, 1 Jan 2000 12:00:00 GMT - type - format - identifier - source - language - relation - coverage - rights - - title - creator - subject - description - publisher - contributor - Sat, 1 Jan 2000 12:00:00 GMT - type - format - identifier - source - language - relation - coverage - rights - - diff --git a/Tests/FeedKitTests/Resources/xml/GeoRSSSimple.xml b/Tests/FeedKitTests/Resources/xml/GeoRSSSimple.xml new file mode 100644 index 00000000..cd893d8d --- /dev/null +++ b/Tests/FeedKitTests/Resources/xml/GeoRSSSimple.xml @@ -0,0 +1,7 @@ + + + + 45 -5 + 1234 + + diff --git a/Tests/FeedKitTests/Resources/xml/Podcast.xml b/Tests/FeedKitTests/Resources/xml/Podcast.xml deleted file mode 100644 index 0f55f2ce..00000000 --- a/Tests/FeedKitTests/Resources/xml/Podcast.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - Test Podcast - https://example.com/podcast - A test podcast feed with podcast namespace elements - - Episode 1: Introduction - This is the first episode of our test podcast. - - - - - Episode 2: Advanced Topics - This episode covers advanced topics. - - - - diff --git a/Tests/FeedKitTests/Tests/AtomTests + Mocks.swift b/Tests/FeedKitTests/Tests/AtomTests + Mocks.swift index ee20ef1e..fe7d47f0 100644 --- a/Tests/FeedKitTests/Tests/AtomTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/AtomTests + Mocks.swift @@ -1,7 +1,7 @@ // // AtomTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/AtomTests.swift b/Tests/FeedKitTests/Tests/AtomTests.swift index 8655d8ae..c3acdbad 100644 --- a/Tests/FeedKitTests/Tests/AtomTests.swift +++ b/Tests/FeedKitTests/Tests/AtomTests.swift @@ -1,7 +1,7 @@ // // AtomTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/BoolTests.swift b/Tests/FeedKitTests/Tests/BoolTests.swift index b9f595ec..15649f2f 100644 --- a/Tests/FeedKitTests/Tests/BoolTests.swift +++ b/Tests/FeedKitTests/Tests/BoolTests.swift @@ -1,7 +1,7 @@ // // BoolTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/ContentTests + Mocks.swift b/Tests/FeedKitTests/Tests/ContentTests + Mocks.swift index 63e06b64..ca818225 100644 --- a/Tests/FeedKitTests/Tests/ContentTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/ContentTests + Mocks.swift @@ -1,7 +1,7 @@ // // ContentTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/ContentTests.swift b/Tests/FeedKitTests/Tests/ContentTests.swift index c254c474..d80547c2 100644 --- a/Tests/FeedKitTests/Tests/ContentTests.swift +++ b/Tests/FeedKitTests/Tests/ContentTests.swift @@ -1,7 +1,7 @@ // // ContentTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/DateTests.swift b/Tests/FeedKitTests/Tests/DateTests.swift index 5eb1e486..7982c27d 100644 --- a/Tests/FeedKitTests/Tests/DateTests.swift +++ b/Tests/FeedKitTests/Tests/DateTests.swift @@ -1,7 +1,7 @@ // // DateTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/DublinCoreTests + Mocks.swift b/Tests/FeedKitTests/Tests/DublinCoreTests + Mocks.swift index bdd01ff9..98f33050 100644 --- a/Tests/FeedKitTests/Tests/DublinCoreTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/DublinCoreTests + Mocks.swift @@ -1,7 +1,7 @@ // // DublinCoreTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -24,7 +24,7 @@ @testable import FeedKit extension DublinCoreTests { - var rssMock: RSSFeed { + var mock: RSSFeed { .init( channel: .init( items: [ @@ -68,47 +68,4 @@ extension DublinCoreTests { ) ) } - - var atomMock: AtomFeed { - .init( - entries: [ - .init( - dublinCore: .init( - title: "title", - creator: "creator", - subject: "subject", - description: "description", - publisher: "publisher", - contributor: "contributor", - date: FeedDateFormatter(spec: .rfc822).date(from: "Sat, 1 Jan 2000 12:00:00 GMT"), - type: "type", - format: "format", - identifier: "identifier", - source: "source", - language: "language", - relation: "relation", - coverage: "coverage", - rights: "rights" - ) - ) - ], - dublinCore: .init( - title: "title", - creator: "creator", - subject: "subject", - description: "description", - publisher: "publisher", - contributor: "contributor", - date: FeedDateFormatter(spec: .rfc822).date(from: "Sat, 1 Jan 2000 12:00:00 GMT"), - type: "type", - format: "format", - identifier: "identifier", - source: "source", - language: "language", - relation: "relation", - coverage: "coverage", - rights: "rights" - ) - ) - } } diff --git a/Tests/FeedKitTests/Tests/DublinCoreTests.swift b/Tests/FeedKitTests/Tests/DublinCoreTests.swift index fa3cc21e..a05f77aa 100644 --- a/Tests/FeedKitTests/Tests/DublinCoreTests.swift +++ b/Tests/FeedKitTests/Tests/DublinCoreTests.swift @@ -1,7 +1,7 @@ // // DublinCoreTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -27,10 +27,10 @@ import Testing @Suite("Dublin Core") struct DublinCoreTests: FeedKitTestable { @Test - func dublinCoreRSS() throws { + func dublinCore() throws { // Given let data = data(resource: "RSSDC", withExtension: "xml") - let expected: RSSFeed = rssMock + let expected: RSSFeed = mock // When let actual = try RSSFeed(data: data) @@ -38,17 +38,4 @@ struct DublinCoreTests: FeedKitTestable { // Then #expect(expected == actual) } - - @Test - func dublinCoreAtom() throws { - // Given - let data = data(resource: "AtomDC", withExtension: "xml") - let expected: AtomFeed = atomMock - - // When - let actual = try AtomFeed(data: data) - - // Then - #expect(expected == actual) - } } diff --git a/Tests/FeedKitTests/Tests/DurationTests.swift b/Tests/FeedKitTests/Tests/DurationTests.swift index 162ee565..819d4105 100644 --- a/Tests/FeedKitTests/Tests/DurationTests.swift +++ b/Tests/FeedKitTests/Tests/DurationTests.swift @@ -1,7 +1,7 @@ // // DurationTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/FeedTests + Mocks.swift b/Tests/FeedKitTests/Tests/FeedTests + Mocks.swift index 5faac521..559fcdad 100644 --- a/Tests/FeedKitTests/Tests/FeedTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/FeedTests + Mocks.swift @@ -1,7 +1,7 @@ // // FeedTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/FeedTests.swift b/Tests/FeedKitTests/Tests/FeedTests.swift index 33d296c0..3e47db69 100644 --- a/Tests/FeedKitTests/Tests/FeedTests.swift +++ b/Tests/FeedKitTests/Tests/FeedTests.swift @@ -1,7 +1,7 @@ // // FeedTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/FeedTypeTests.swift b/Tests/FeedKitTests/Tests/FeedTypeTests.swift index 69225c76..8aa5b142 100644 --- a/Tests/FeedKitTests/Tests/FeedTypeTests.swift +++ b/Tests/FeedKitTests/Tests/FeedTypeTests.swift @@ -1,7 +1,7 @@ // // FeedTypeTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/GMLPositionTests.swift b/Tests/FeedKitTests/Tests/GMLPositionTests.swift index 30855a31..6a6a82ea 100644 --- a/Tests/FeedKitTests/Tests/GMLPositionTests.swift +++ b/Tests/FeedKitTests/Tests/GMLPositionTests.swift @@ -1,7 +1,7 @@ // // GMLPositionTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/GeoRSSSimpleTests + Mocks.swift b/Tests/FeedKitTests/Tests/GeoRSSSimpleTests + Mocks.swift new file mode 100644 index 00000000..82f4eb7b --- /dev/null +++ b/Tests/FeedKitTests/Tests/GeoRSSSimpleTests + Mocks.swift @@ -0,0 +1,41 @@ +// +// GeoRSSSimpleTests + Mocks.swift +// +// Copyright (c) 2016 - 2025 Nuno Dias +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +@testable import FeedKit + +extension GeoRSSSimpleTests { + var mock: AtomFeed { + .init( + entries: [ + .init( + geoRSS: .init( + point: .init( + position: (latitude: 45, longitude: -5) + ), + elevation: 1234 + ) + ) + ] + ) + } +} diff --git a/Tests/FeedKitTests/Tests/GeoRSSSimpleTests.swift b/Tests/FeedKitTests/Tests/GeoRSSSimpleTests.swift new file mode 100644 index 00000000..086ffe19 --- /dev/null +++ b/Tests/FeedKitTests/Tests/GeoRSSSimpleTests.swift @@ -0,0 +1,41 @@ +// +// GeoRSSSimpleTests.swift +// +// Copyright (c) 2016 - 2025 Nuno Dias +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +@testable import FeedKit +import Testing + +@Suite("GeoRSSSimple") +struct GeoRSSSimpleTests: FeedKitTestable { + @Test + func geoRSSSimple() throws { + // Given + let data = data(resource: "GeoRSSSimple", withExtension: "xml") + let expected: AtomFeed = mock + + // When + let actual = try AtomFeed(data: data) + + // Then + #expect(expected == actual) + } +} \ No newline at end of file diff --git a/Tests/FeedKitTests/Tests/JSONTests + Mocks.swift b/Tests/FeedKitTests/Tests/JSONTests + Mocks.swift index 0270ad3f..45b41ea9 100644 --- a/Tests/FeedKitTests/Tests/JSONTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/JSONTests + Mocks.swift @@ -1,7 +1,7 @@ // // JSONTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/JSONTests.swift b/Tests/FeedKitTests/Tests/JSONTests.swift index 08409a32..c020d461 100644 --- a/Tests/FeedKitTests/Tests/JSONTests.swift +++ b/Tests/FeedKitTests/Tests/JSONTests.swift @@ -1,7 +1,7 @@ // // JSONTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/KeywordsTests.swift b/Tests/FeedKitTests/Tests/KeywordsTests.swift index 628d4d0a..187b1ada 100644 --- a/Tests/FeedKitTests/Tests/KeywordsTests.swift +++ b/Tests/FeedKitTests/Tests/KeywordsTests.swift @@ -1,7 +1,7 @@ // // KeywordsTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/MediaTagsTests.swift b/Tests/FeedKitTests/Tests/MediaTagsTests.swift index 2dcd04da..82318632 100644 --- a/Tests/FeedKitTests/Tests/MediaTagsTests.swift +++ b/Tests/FeedKitTests/Tests/MediaTagsTests.swift @@ -1,7 +1,7 @@ // // MediaTagsTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/MediaTests + Mocks.swift b/Tests/FeedKitTests/Tests/MediaTests + Mocks.swift index 119cbf89..92edcba8 100644 --- a/Tests/FeedKitTests/Tests/MediaTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/MediaTests + Mocks.swift @@ -1,7 +1,7 @@ // // MediaTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/MediaTests.swift b/Tests/FeedKitTests/Tests/MediaTests.swift index 5ea7d7d9..944af1a1 100644 --- a/Tests/FeedKitTests/Tests/MediaTests.swift +++ b/Tests/FeedKitTests/Tests/MediaTests.swift @@ -1,7 +1,7 @@ // // MediaTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/RSSAtomTests + Mocks.swift b/Tests/FeedKitTests/Tests/RSSAtomTests + Mocks.swift index 200b22a8..a2a429fd 100644 --- a/Tests/FeedKitTests/Tests/RSSAtomTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/RSSAtomTests + Mocks.swift @@ -1,7 +1,7 @@ // // RSSAtomTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/RSSAtomTests.swift b/Tests/FeedKitTests/Tests/RSSAtomTests.swift index 2223a2bc..34fb467f 100644 --- a/Tests/FeedKitTests/Tests/RSSAtomTests.swift +++ b/Tests/FeedKitTests/Tests/RSSAtomTests.swift @@ -1,7 +1,7 @@ // // RSSAtomTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/RSSTests + Mocks.swift b/Tests/FeedKitTests/Tests/RSSTests + Mocks.swift index 549af807..c8474900 100644 --- a/Tests/FeedKitTests/Tests/RSSTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/RSSTests + Mocks.swift @@ -1,7 +1,7 @@ // // RSSTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/RSSTests.swift b/Tests/FeedKitTests/Tests/RSSTests.swift index 1aeddd95..3e7eb87e 100644 --- a/Tests/FeedKitTests/Tests/RSSTests.swift +++ b/Tests/FeedKitTests/Tests/RSSTests.swift @@ -1,7 +1,7 @@ // // RSSTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/SyndicationTests + Mocks.swift b/Tests/FeedKitTests/Tests/SyndicationTests + Mocks.swift index f041c4e9..f2e16e93 100644 --- a/Tests/FeedKitTests/Tests/SyndicationTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/SyndicationTests + Mocks.swift @@ -1,7 +1,7 @@ // // SyndicationTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/SyndicationTests.swift b/Tests/FeedKitTests/Tests/SyndicationTests.swift index cf422b71..f53c68f9 100644 --- a/Tests/FeedKitTests/Tests/SyndicationTests.swift +++ b/Tests/FeedKitTests/Tests/SyndicationTests.swift @@ -1,7 +1,7 @@ // // SyndicationTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/YouTubeTests + Mocks.swift b/Tests/FeedKitTests/Tests/YouTubeTests + Mocks.swift index c118302e..16e7847b 100644 --- a/Tests/FeedKitTests/Tests/YouTubeTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/YouTubeTests + Mocks.swift @@ -1,7 +1,7 @@ // // YouTubeTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/YouTubeTests.swift b/Tests/FeedKitTests/Tests/YouTubeTests.swift index 75b42904..09e2622f 100644 --- a/Tests/FeedKitTests/Tests/YouTubeTests.swift +++ b/Tests/FeedKitTests/Tests/YouTubeTests.swift @@ -1,7 +1,7 @@ // // YouTubeTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/iTunesTests + Mocks.swift b/Tests/FeedKitTests/Tests/iTunesTests + Mocks.swift index db113df3..f95bda30 100644 --- a/Tests/FeedKitTests/Tests/iTunesTests + Mocks.swift +++ b/Tests/FeedKitTests/Tests/iTunesTests + Mocks.swift @@ -1,7 +1,7 @@ // // iTunesTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/FeedKitTests/Tests/iTunesTests.swift b/Tests/FeedKitTests/Tests/iTunesTests.swift index 4a99ed2d..c8a6aa37 100644 --- a/Tests/FeedKitTests/Tests/iTunesTests.swift +++ b/Tests/FeedKitTests/Tests/iTunesTests.swift @@ -1,7 +1,7 @@ // // iTunesTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/EscapeCharactersTests.swift b/Tests/XMLKitTests/Tests/EscapeCharactersTests.swift index 0c72c8db..4ab36141 100644 --- a/Tests/XMLKitTests/Tests/EscapeCharactersTests.swift +++ b/Tests/XMLKitTests/Tests/EscapeCharactersTests.swift @@ -1,7 +1,7 @@ // // EscapeCharactersTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/SampleTests + Mocks.swift b/Tests/XMLKitTests/Tests/SampleTests + Mocks.swift index 600280ef..fe5f2614 100644 --- a/Tests/XMLKitTests/Tests/SampleTests + Mocks.swift +++ b/Tests/XMLKitTests/Tests/SampleTests + Mocks.swift @@ -1,7 +1,7 @@ // // SampleTests + Mocks.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/SampleTests.swift b/Tests/XMLKitTests/Tests/SampleTests.swift index 0754ec32..831afca6 100644 --- a/Tests/XMLKitTests/Tests/SampleTests.swift +++ b/Tests/XMLKitTests/Tests/SampleTests.swift @@ -1,7 +1,7 @@ // // SampleTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/XMLDecoderKeyedTests.swift b/Tests/XMLKitTests/Tests/XMLDecoderKeyedTests.swift index 6eb644bd..594106ad 100644 --- a/Tests/XMLKitTests/Tests/XMLDecoderKeyedTests.swift +++ b/Tests/XMLKitTests/Tests/XMLDecoderKeyedTests.swift @@ -1,7 +1,7 @@ // // XMLDecoderKeyedTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/XMLDecoderKeyedUnkeyedTests.swift b/Tests/XMLKitTests/Tests/XMLDecoderKeyedUnkeyedTests.swift index 7d93a213..ae2bef91 100644 --- a/Tests/XMLKitTests/Tests/XMLDecoderKeyedUnkeyedTests.swift +++ b/Tests/XMLKitTests/Tests/XMLDecoderKeyedUnkeyedTests.swift @@ -1,7 +1,7 @@ // // XMLDecoderKeyedUnkeyedTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/XMLDecoderUnkeyedTests.swift b/Tests/XMLKitTests/Tests/XMLDecoderUnkeyedTests.swift index abfe90d9..60fc13bd 100644 --- a/Tests/XMLKitTests/Tests/XMLDecoderUnkeyedTests.swift +++ b/Tests/XMLKitTests/Tests/XMLDecoderUnkeyedTests.swift @@ -1,7 +1,7 @@ // // XMLDecoderUnkeyedTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/Tests/XMLHeaderTests.swift b/Tests/XMLKitTests/Tests/XMLHeaderTests.swift index ea7c3f13..cf703fd6 100644 --- a/Tests/XMLKitTests/Tests/XMLHeaderTests.swift +++ b/Tests/XMLKitTests/Tests/XMLHeaderTests.swift @@ -1,7 +1,7 @@ // // XMLHeaderTests.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Tests/XMLKitTests/XMLKitTestable.swift b/Tests/XMLKitTests/XMLKitTestable.swift index 271a8dca..3a2e693c 100644 --- a/Tests/XMLKitTests/XMLKitTestable.swift +++ b/Tests/XMLKitTests/XMLKitTestable.swift @@ -1,7 +1,7 @@ // // XMLKitTestable.swift // -// Copyright (c) 2016 - 2026 Nuno Dias +// Copyright (c) 2016 - 2025 Nuno Dias // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -49,7 +49,7 @@ protocol XMLKitTestable { /// - directory: The directory in which the file will be saved (e.g., /// `.documentDirectory`). /// - fileName: The name of the file to be saved. - func save(_ object: some Codable, to directory: FileManager.SearchPathDirectory, as fileName: String) + func save(_ object: T, to directory: FileManager.SearchPathDirectory, as fileName: String) } extension XMLKitTestable {