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 @@
-
-
-
-
-
-
-
+
[](https://github.com/nmdias/FeedKit/actions/workflows/ci.yml)
[](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 {