Skip to content

Commit fb21793

Browse files
committed
Fix all nullable warnings
1 parent a50f9c2 commit fb21793

File tree

3 files changed

+54
-57
lines changed

3 files changed

+54
-57
lines changed

SimpleFeedReader/DefaultFeedItemNormalizer.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ public virtual FeedItem Normalize(SyndicationFeed feed, SyndicationItem item)
3131
{
3232
var alternatelink = item.Links.FirstOrDefault(l => l.RelationshipType == null || l.RelationshipType.Equals("alternate", StringComparison.OrdinalIgnoreCase));
3333

34-
var itemuri = alternatelink == null && !Uri.TryCreate(item.Id, UriKind.Absolute, out var parsed) ? parsed : alternatelink.GetAbsoluteUri();
34+
var itemuri = alternatelink == null && !Uri.TryCreate(item.Id, UriKind.Absolute, out var parsed)
35+
? parsed
36+
: alternatelink?.GetAbsoluteUri();
37+
3538
return new FeedItem
3639
{
3740
Id = string.IsNullOrEmpty(item.Id) ? null : item.Id.Trim(),
@@ -50,7 +53,7 @@ private static IEnumerable<Uri> GetFeedItemImages(SyndicationItem item) => item.
5053
.Where(p => p.OuterName.Equals("image"))
5154
.Select(p => new Uri(p.GetObject<XElement>().Value));
5255

53-
private static string Normalize(string value)
56+
private static string? Normalize(string? value)
5457
{
5558
if (!string.IsNullOrEmpty(value))
5659
{
@@ -62,18 +65,18 @@ private static string Normalize(string value)
6265

6366
value = StripHTML(value);
6467
value = StripDoubleOrMoreWhiteSpace(RemoveControlChars(value));
65-
value = value.Normalize().Trim();
68+
value = value?.Normalize().Trim();
6669
}
6770
return value;
6871
}
6972

70-
private static string RemoveControlChars(string value) => _controlcodesregex.Replace(value, " ");
73+
private static string? RemoveControlChars(string? value) => _controlcodesregex.Replace(value, " ");
7174

72-
private static string StripDoubleOrMoreWhiteSpace(string value) => _whitespaceregex.Replace(value, " ");
75+
private static string? StripDoubleOrMoreWhiteSpace(string? value) => _whitespaceregex.Replace(value, " ");
7376

74-
private static string StripHTML(string value) => _htmlregex.Replace(value, " ");
77+
private static string? StripHTML(string? value) => _htmlregex.Replace(value, " ");
7578

76-
private static string HtmlDecode(string value, int threshold = 5)
79+
private static string? HtmlDecode(string? value, int threshold = 5)
7780
{
7881
var c = 0;
7982
var newvalue = WebUtility.HtmlDecode(value);

SimpleFeedReader/FeedReader.cs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,29 @@ namespace SimpleFeedReader;
66
/// <summary>
77
/// Retrieves <see cref="SyndicationFeed"/>s and normalizes the items from the feed into <see cref="FeedItem"/>s.
88
/// </summary>
9-
public class FeedReader
9+
/// <remarks>
10+
/// Initializes a new instance of the <see cref="FeedReader"/> class.
11+
/// </remarks>
12+
/// <param name="defaultFeedItemNormalizer">
13+
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="SyndicationItem"/>s.
14+
/// </param>
15+
/// <param name="throwOnError">
16+
/// When true, the <see cref="FeedReader"/> will throw on errors, when false the <see cref="FeedReader"/> will
17+
/// suppress exceptions and return empty results.
18+
/// </param>
19+
public class FeedReader(IFeedItemNormalizer defaultFeedItemNormalizer, bool throwOnError)
1020
{
1121
/// <summary>
1222
/// Gets the default FeedItemNormalizer the <see cref="FeedReader"/> will use when normalizing
1323
/// <see cref="SyndicationItem"/>s.
1424
/// </summary>
15-
public IFeedItemNormalizer DefaultNormalizer { get; private set; }
25+
public IFeedItemNormalizer DefaultNormalizer { get; private set; } = defaultFeedItemNormalizer ?? throw new ArgumentNullException(nameof(defaultFeedItemNormalizer));
1626

1727
/// <summary>
1828
/// Gets wether the FeedReader will throw on exceptions or suppress exceptions and return empty results on
1929
/// errors.
2030
/// </summary>
21-
public bool ThrowOnError { get; private set; }
31+
public bool ThrowOnError { get; private set; } = throwOnError;
2232

2333
/// <summary>
2434
/// Initializes a new instance of the <see cref="FeedReader"/> class.
@@ -45,22 +55,6 @@ public FeedReader(bool throwOnError)
4555
public FeedReader(IFeedItemNormalizer defaultFeedItemNormalizer)
4656
: this(defaultFeedItemNormalizer, false) { }
4757

48-
/// <summary>
49-
/// Initializes a new instance of the <see cref="FeedReader"/> class.
50-
/// </summary>
51-
/// <param name="defaultFeedItemNormalizer">
52-
/// The <see cref="IFeedItemNormalizer"/> to use when normalizing <see cref="SyndicationItem"/>s.
53-
/// </param>
54-
/// <param name="throwOnError">
55-
/// When true, the <see cref="FeedReader"/> will throw on errors, when false the <see cref="FeedReader"/> will
56-
/// suppress exceptions and return empty results.
57-
/// </param>
58-
public FeedReader(IFeedItemNormalizer defaultFeedItemNormalizer, bool throwOnError)
59-
{
60-
DefaultNormalizer = defaultFeedItemNormalizer ?? throw new ArgumentNullException(nameof(defaultFeedItemNormalizer));
61-
ThrowOnError = throwOnError;
62-
}
63-
6458
/// <summary>
6559
/// Retrieves the specified feeds.
6660
/// </summary>

SimpleFeedReaderTests/FeedReaderTests.cs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public void BasicRSSFeedTest()
1818

1919
Assert.AreEqual(2, items.Length);
2020

21-
Assert.AreEqual("http://example.org/foo/bar/1", items[0].Uri.ToString());
21+
Assert.AreEqual("http://example.org/foo/bar/1", items[0].Uri?.ToString());
2222
Assert.AreEqual("Title 1", items[0].Title);
23-
Assert.IsTrue(items[0].Summary.StartsWith("Lorem ipsum dolor sit"));
23+
Assert.IsTrue(items[0].Summary?.StartsWith("Lorem ipsum dolor sit"));
2424
Assert.IsNull(items[0].Content);
2525
Assert.AreEqual("tag:example.org,1999:blog-123456789123456789123456789.post-987564321987654231", items[0].Id);
2626
Assert.AreEqual(DateTimeOffset.Parse("2014-04-16T13:57:35.0000000+02:00", CultureInfo.InvariantCulture, DateTimeStyles.None), items[0].PublishDate);
@@ -34,8 +34,8 @@ public void BasicRSSFeedTest()
3434
Assert.AreEqual(DateTimeOffset.MinValue, items[1].PublishDate);
3535
Assert.AreEqual(DateTimeOffset.MinValue, items[1].LastUpdatedDate);
3636

37-
Assert.IsTrue(items[0].GetContent().StartsWith("Lorem ipsum dolor sit"));
38-
Assert.IsTrue(items[0].GetSummary().StartsWith("Lorem ipsum dolor sit"));
37+
Assert.IsTrue(items[0].GetContent()?.StartsWith("Lorem ipsum dolor sit"));
38+
Assert.IsTrue(items[0].GetSummary()?.StartsWith("Lorem ipsum dolor sit"));
3939

4040
#pragma warning disable 0618
4141
Assert.AreEqual(DateTimeOffset.Parse("2014-04-16T13:57:35.0000000+02:00", CultureInfo.InvariantCulture, DateTimeStyles.None), items[0].Date);
@@ -51,9 +51,9 @@ public void BasicRSSWithImageFeedTest()
5151

5252
Assert.AreEqual(2, items.Length);
5353

54-
Assert.AreEqual("http://example.org/foo/bar/1", items[0].Uri.ToString());
54+
Assert.AreEqual("http://example.org/foo/bar/1", items[0].Uri?.ToString());
5555
Assert.AreEqual("Title 1", items[0].Title);
56-
Assert.IsTrue(items[0].Summary.StartsWith("Lorem ipsum dolor sit"));
56+
Assert.IsTrue(items[0].Summary?.StartsWith("Lorem ipsum dolor sit"));
5757
Assert.IsNull(items[0].Content);
5858
Assert.AreEqual("tag:example.org,1999:blog-123456789123456789123456789.post-987564321987654231", items[0].Id);
5959
Assert.AreEqual(DateTimeOffset.Parse("2014-04-16T13:57:35.0000000+02:00", CultureInfo.InvariantCulture, DateTimeStyles.None), items[0].PublishDate);
@@ -67,17 +67,17 @@ public void BasicRSSWithImageFeedTest()
6767
Assert.AreEqual(DateTimeOffset.MinValue, items[1].PublishDate);
6868
Assert.AreEqual(DateTimeOffset.MinValue, items[1].LastUpdatedDate);
6969

70-
Assert.IsTrue(items[0].GetContent().StartsWith("Lorem ipsum dolor sit"));
71-
Assert.IsTrue(items[0].GetSummary().StartsWith("Lorem ipsum dolor sit"));
70+
Assert.IsTrue(items[0].GetContent()?.StartsWith("Lorem ipsum dolor sit"));
71+
Assert.IsTrue(items[0].GetSummary()?.StartsWith("Lorem ipsum dolor sit"));
7272

7373
#pragma warning disable 0618
7474
Assert.AreEqual(DateTimeOffset.Parse("2014-04-16T13:57:35.0000000+02:00", CultureInfo.InvariantCulture, DateTimeStyles.None), items[0].Date);
7575
Assert.AreEqual(DateTimeOffset.MinValue, items[1].Date);
7676
#pragma warning restore 0618
7777

78-
Assert.AreEqual(2, items[0].Images.Count());
79-
Assert.AreEqual("http://example.org/foo/bar/123abc.png", items[0].Images.ElementAt(0).ToString());
80-
Assert.AreEqual("http://example.org/foo/bar/123abc_2.png", items[0].Images.ElementAt(1).ToString());
78+
Assert.AreEqual(2, items[0]?.Images?.Count());
79+
Assert.AreEqual("http://example.org/foo/bar/123abc.png", items[0].Images?.ElementAt(0).ToString());
80+
Assert.AreEqual("http://example.org/foo/bar/123abc_2.png", items[0].Images?.ElementAt(1).ToString());
8181
}
8282

8383
[TestMethod]
@@ -126,8 +126,8 @@ public void ExtendedNormalizerRSSFeedTest()
126126
var items = target.RetrieveFeed(@"TestFeeds\basic.rss").ToArray();
127127

128128
Assert.IsInstanceOfType<ExtendedFeedItem>(items[0]);
129-
Assert.AreEqual(1, ((ExtendedFeedItem)items[0]).Authors.Length);
130-
Assert.AreEqual("noreply1@example.org (John Doe 1)", ((ExtendedFeedItem)items[0]).Authors[0]);
129+
Assert.AreEqual(1, ((ExtendedFeedItem)items[0]).Authors?.Length);
130+
Assert.AreEqual("noreply1@example.org (John Doe 1)", ((ExtendedFeedItem)items[0]).Authors?[0]);
131131
}
132132

133133
[TestMethod]
@@ -152,7 +152,7 @@ public void BasicAtomFeedTest()
152152

153153
Assert.AreEqual(2, items.Length);
154154

155-
Assert.AreEqual("http://example.org/foo/bar/1", items[0].Uri.ToString());
155+
Assert.AreEqual("http://example.org/foo/bar/1", items[0].Uri?.ToString());
156156
Assert.AreEqual("Summary1", items[0].Summary);
157157
Assert.AreEqual("Test1", items[0].Title);
158158
Assert.AreEqual("HTML content", items[0].Content);
@@ -161,7 +161,7 @@ public void BasicAtomFeedTest()
161161
Assert.AreEqual(DateTimeOffset.Parse("2013-03-13T13:37:31.0000000+00:00", CultureInfo.InvariantCulture, DateTimeStyles.None), items[0].PublishDate);
162162
Assert.AreEqual(DateTimeOffset.Parse("2014-04-16T13:57:35.0000000+00:00", CultureInfo.InvariantCulture, DateTimeStyles.None), items[0].LastUpdatedDate);
163163

164-
Assert.AreEqual("http://example.org/foo/bar/2", items[1].Uri.ToString());
164+
Assert.AreEqual("http://example.org/foo/bar/2", items[1].Uri?.ToString());
165165
Assert.AreEqual("Summary2", items[1].Summary);
166166
Assert.AreEqual("Test2", items[1].Title);
167167
Assert.AreEqual("Text content", items[1].Content);
@@ -182,11 +182,11 @@ public void BasicActualRSSFeedTest()
182182
var items = target.RetrieveFeed(@"TestFeeds\google_snapshot.rss").ToArray();
183183

184184
Assert.AreEqual(10, items.Length);
185-
Assert.IsTrue(items[0].GetContent().StartsWith("(CNN) -- Rescue boats"));
186-
Assert.IsTrue(items[1].GetContent().StartsWith("Pro-Russian troops guard"));
187-
Assert.IsTrue(items[2].GetContent().StartsWith("(CNN) -- Former New York"));
188-
Assert.IsTrue(items[3].GetContent().StartsWith("Two blasts near the"));
189-
Assert.IsTrue(items[4].GetContent().StartsWith("A three-year-old boy"));
185+
Assert.IsTrue(items[0].GetContent()?.StartsWith("(CNN) -- Rescue boats"));
186+
Assert.IsTrue(items[1].GetContent()?.StartsWith("Pro-Russian troops guard"));
187+
Assert.IsTrue(items[2].GetContent()?.StartsWith("(CNN) -- Former New York"));
188+
Assert.IsTrue(items[3].GetContent()?.StartsWith("Two blasts near the"));
189+
Assert.IsTrue(items[4].GetContent()?.StartsWith("A three-year-old boy"));
190190
}
191191

192192
[TestMethod]
@@ -196,36 +196,36 @@ public void BasicActualAtomFeedTest()
196196
var items = target.RetrieveFeed(@"TestFeeds\google_snapshot.atom").ToArray();
197197

198198
Assert.AreEqual(10, items.Length);
199-
Assert.IsTrue(items[0].GetContent().StartsWith("(CNN) -- Rescue boats"));
200-
Assert.IsTrue(items[1].GetContent().StartsWith("Pro-Russian troops guard"));
201-
Assert.IsTrue(items[2].GetContent().StartsWith("(CNN) -- Former New York"));
202-
Assert.IsTrue(items[3].GetContent().StartsWith("Two blasts near the"));
203-
Assert.IsTrue(items[4].GetContent().StartsWith("A three-year-old boy"));
199+
Assert.IsTrue(items[0].GetContent()?.StartsWith("(CNN) -- Rescue boats"));
200+
Assert.IsTrue(items[1].GetContent()?.StartsWith("Pro-Russian troops guard"));
201+
Assert.IsTrue(items[2].GetContent()?.StartsWith("(CNN) -- Former New York"));
202+
Assert.IsTrue(items[3].GetContent()?.StartsWith("Two blasts near the"));
203+
Assert.IsTrue(items[4].GetContent()?.StartsWith("A three-year-old boy"));
204204
}
205205

206206
[TestMethod]
207207
public void BasicRSSCategoriesTest()
208208
{
209209
var target = new FeedReader();
210210
var items = target.RetrieveFeed(@"TestFeeds\categories.rss").ToArray();
211-
Assert.AreEqual("NEWS", items[0].Categories.ElementAt(0));
212-
Assert.AreEqual("TEST", items[0].Categories.ElementAt(1));
211+
Assert.AreEqual("NEWS", items[0].Categories?.ElementAt(0));
212+
Assert.AreEqual("TEST", items[0].Categories?.ElementAt(1));
213213
}
214214

215215
[TestMethod]
216216
public void BasicAtomCategoriesTest()
217217
{
218218
var target = new FeedReader();
219219
var items = target.RetrieveFeed(@"TestFeeds\categories.atom").ToArray();
220-
Assert.AreEqual("a", items[0].Categories.ElementAt(0));
221-
Assert.AreEqual("b", items[1].Categories.ElementAt(0));
222-
Assert.AreEqual("c", items[1].Categories.ElementAt(1));
220+
Assert.AreEqual("a", items[0].Categories?.ElementAt(0));
221+
Assert.AreEqual("b", items[1].Categories?.ElementAt(0));
222+
Assert.AreEqual("c", items[1].Categories?.ElementAt(1));
223223
}
224224

225225
#region TestClasses
226226
private class ExtendedFeedItem : FeedItem
227227
{
228-
public string[] Authors { get; set; }
228+
public string[]? Authors { get; set; }
229229

230230
public ExtendedFeedItem() { }
231231
public ExtendedFeedItem(FeedItem item)

0 commit comments

Comments
 (0)