diff --git a/pack/package.nuspec b/pack/package.nuspec index 6dfeb84..c93b6cc 100644 --- a/pack/package.nuspec +++ b/pack/package.nuspec @@ -3,7 +3,7 @@ ProSol.Html.TagsProvider ProSol.Html.TagsProvider - 2.0.0-rc1.4 + 2.0.0-rc2.0 Alex Kozachenko Alex Kozachenko false @@ -15,7 +15,7 @@ - + tool extraction web html observer observer-pattern design-patterns diff --git a/src/Messaging/IPublisherExtensions.cs b/src/Messaging/IPublisherExtensions.cs index 1992758..9026dfc 100644 --- a/src/Messaging/IPublisherExtensions.cs +++ b/src/Messaging/IPublisherExtensions.cs @@ -1,20 +1,18 @@ using ProSol.Html.Contracts.Data; using ProSol.Messaging; -using ProSol.Messaging.Subscriptions; +using ProSol.Messaging.Filtering; namespace ProSol.Html.Messaging; public static class IPublisherExtensions { - public static IPublisher Subscribe( - this IPublisher publisher, - IPipelineSubscriber subscriber, - params string[] tagNames) - => publisher.Subscribe(subscriber, x => tagNames.Contains(x.CurrentTag.TagInfo.Name)); + public static IPublisher Filter( + this IPublisher publisher, + string tagName) + => publisher.Filter([tagName]); - public static IPublisher Subscribe( - this IPublisher publisher, - ISubscriber subscriber, + public static IPublisher Filter( + this IPublisher publisher, params string[] tagNames) - => publisher.Subscribe(subscriber, x => tagNames.Contains(x.CurrentTag.TagInfo.Name)); + => publisher.Filter(x => tagNames.Contains(x.CurrentTag.TagInfo.Name)); } \ No newline at end of file diff --git a/src/ProSol.Html.csproj b/src/ProSol.Html.csproj index 5421cfa..3e2668a 100644 --- a/src/ProSol.Html.csproj +++ b/src/ProSol.Html.csproj @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/src/TagsProvider.cs b/src/TagsProvider.cs index 4cfcd2d..7dba425 100644 --- a/src/TagsProvider.cs +++ b/src/TagsProvider.cs @@ -10,10 +10,9 @@ namespace ProSol.Html; /// /// Push-notification happens only when the closing tag met, so it contains the full data on tag. /// -public class TagsProvider : IPublisher +public class TagsProvider : PipelineMessagePublisher { readonly HistoryTracker historyTracker = new(); - readonly PipelineMessagePublisher publisher = new(); public void Process(ReadOnlySpan html) { @@ -26,12 +25,9 @@ public class TagsProvider : IPublisher charsProcessed += Proceed(currentHtml); } while (charsProcessed < html.Length); - publisher.Complete(); + base.Complete(); } - public IDisposable Subscribe(ISubscriber observer) - => publisher.Subscribe(observer); - void Process(ReadOnlySpan currentHtml, int charsProcessed) { if (TagDetector.Detect(currentHtml) != TagKind.Closing) @@ -69,7 +65,7 @@ public class TagsProvider : IPublisher [..history], value); - publisher.Publish(message); + base.Publish(message); } static int Proceed(ReadOnlySpan currentHtml) diff --git a/tests/KnownIssues/TagProcessorBase_KnownIssues.cs b/tests/KnownIssues/TagProcessorBase_KnownIssues.cs index ad487b5..e90614f 100644 --- a/tests/KnownIssues/TagProcessorBase_KnownIssues.cs +++ b/tests/KnownIssues/TagProcessorBase_KnownIssues.cs @@ -1,18 +1,23 @@ -using ProSol.Html.Tests.TestHelpers; +using ProSol.Html.Contracts.Data; +using ProSol.Messaging; +using ProSol.Messaging.Translating; namespace ProSol.Html.Tests.KnownIssues; public class TagsProvider_KnownIssues { private TagsProvider tagsProvider; - private TagsProviderListener listener; + private DataSubscriber processedTagsListener; [SetUp] public void Setup() { tagsProvider = new(); - listener = new(); - listener.Subscribe(tagsProvider); + processedTagsListener = new(); + + tagsProvider + .Translate(x => x.CurrentTag) + .Subscribe(processedTagsListener); } [Test] @@ -24,6 +29,6 @@ public class TagsProvider_KnownIssues { var html = "
"; tagsProvider.Process(html); - Assert.That(listener.ProcessedTags, Has.Length.EqualTo(0)); + Assert.That(processedTagsListener.Messages, Has.Length.EqualTo(0)); } } \ No newline at end of file diff --git a/tests/TagsProvider_FiltersSubscribers_Tests.cs b/tests/TagsProvider_FiltersSubscribers_Tests.cs index b75664d..42c1143 100644 --- a/tests/TagsProvider_FiltersSubscribers_Tests.cs +++ b/tests/TagsProvider_FiltersSubscribers_Tests.cs @@ -1,5 +1,8 @@ -using ProSol.Html.Tests.TestHelpers; using ProSol.Html.Messaging; +using ProSol.Messaging.Filtering; +using ProSol.Messaging.Translating; +using ProSol.Html.Contracts.Data; +using ProSol.Messaging; namespace ProSol.Html.Tests; @@ -9,12 +12,6 @@ public class TagsProvider_FiltersSubscribers_Tests [Test] public void Process_Single_Named_Tag() { - var expected = new string[] { "Rock", "Paper", "Scissors" }; - - var tagsProvider = new TagsProvider(); - var listener = new TagsProviderListener(); - tagsProvider.Subscribe(listener, "li"); - var html = """
  • Rock
  • @@ -22,38 +19,42 @@ public class TagsProvider_FiltersSubscribers_Tests
  • Scissors
"""; + var expected = new string[] { "Rock", "Paper", "Scissors" }; + + var tagsProvider = new TagsProvider(); + var data = new DataSubscriber(); + + tagsProvider + .Filter("li") + .Translate(x => x.CurrentTag) + .Translate(x => html[x.InnerTextRange]) + .Subscribe(data); tagsProvider.Process(html); - var result = GetText(listener, html); - Assert.That(result, Is.EquivalentTo(expected)); + Assert.That(data.Messages, Is.EquivalentTo(expected)); } - [Test] public void Process_Multiple_Named_Tag() { - var expected = new string[] { "Terminal", "tasks", "any", "close" }; - - var tagsProvider = new TagsProvider(); - var listener = new TagsProviderListener(); - tagsProvider.Subscribe(listener, "i", "b"); - var html = """ Terminal will be reused by tasks, press any key to close it. """; + var expected = new string[] { "Terminal", "tasks", "any", "close" }; + + var tagsProvider = new TagsProvider(); + var data = new DataSubscriber(); + + tagsProvider + .Filter("i", "b") + .Translate(x => x.CurrentTag) + .Translate(x => html[x.InnerTextRange]) + .Subscribe(data); + tagsProvider.Process(html); - var result = GetText(listener, html); - Assert.That(result, Is.EquivalentTo(expected)); - } - - static string[] GetText(TagsProviderListener listener, string html) - { - return listener.ProcessedTags - .Select(x => html[x.InnerTextRange] - .ToString()) - .ToArray(); + Assert.That(data.Messages, Is.EquivalentTo(expected)); } } \ No newline at end of file diff --git a/tests/TagsProvider_MessageHistory_Tests.cs b/tests/TagsProvider_MessageHistory_Tests.cs index 69c9ee8..7c626f3 100644 --- a/tests/TagsProvider_MessageHistory_Tests.cs +++ b/tests/TagsProvider_MessageHistory_Tests.cs @@ -1,19 +1,24 @@ +using System.Collections.Immutable; using ProSol.Html; -using ProSol.Html.Tests.TestHelpers; +using ProSol.Html.Contracts.Data; +using ProSol.Messaging; +using ProSol.Messaging.Translating; namespace ProSol.Html.Tests; public class TagsProvider_MessageHistory_Tests { private TagsProvider tagsProvider; - private TagsProviderListener listener; + private DataSubscriber tagNamesListener; [SetUp] public void Setup() { tagsProvider = new(); - listener = new(); - listener.Subscribe(tagsProvider); + tagNamesListener = new(); + tagsProvider + .Translate(x => x.CurrentTag.TagInfo.Name) + .Subscribe(tagNamesListener); } [Test] @@ -23,10 +28,9 @@ public class TagsProvider_MessageHistory_Tests var html = $"

{text}

"; tagsProvider.Process(html); + var names = tagNamesListener.Messages; Assert.Multiple( () => { - var names = listener.Messages - .Select(x => x.CurrentTag.TagInfo.Name) - .ToArray(); + Assert.That(names[0], Is.EqualTo("p")); Assert.That(names[1], Is.EqualTo("div")); Assert.That(names[2], Is.EqualTo("main")); @@ -38,14 +42,20 @@ public class TagsProvider_MessageHistory_Tests { var text = "LoremIpsum"; var html = $"

{text}

"; + + var tagsHistoryListener = new DataSubscriber>(); + tagsProvider + .Translate>(x => x.TagsHistory) + .Subscribe(tagsHistoryListener); + tagsProvider.Process(html); - Assert.That(listener.Messages[0].CurrentTag.TagInfo.Name, - Is.EqualTo("p")); + var names = tagNamesListener.Messages; + + Assert.That(names[0], Is.EqualTo("p")); Assert.Multiple( () => { - var deepestHistory = listener.Messages[0] - .TagsHistory + var deepestHistory = tagsHistoryListener.Messages[0] .Select(x => x.Name) .ToArray(); Assert.That(deepestHistory[0], Is.EqualTo("main")); diff --git a/tests/TagsProvider_MultipleTags_Tests.cs b/tests/TagsProvider_MultipleTags_Tests.cs index 97f2f22..c24b597 100644 --- a/tests/TagsProvider_MultipleTags_Tests.cs +++ b/tests/TagsProvider_MultipleTags_Tests.cs @@ -1,5 +1,7 @@ -using ProSol.Html.Tests.TestHelpers; using ProSol.Html.Messaging; +using ProSol.Messaging; +using ProSol.Html.Contracts.Data; +using ProSol.Messaging.Translating; namespace ProSol.Html.Tests; @@ -11,10 +13,14 @@ public class TagsProvider_MultipleTags_Tests var html = $"

LoremIpsum

"; var tagsProvider = new TagsProvider(); - var listener = new TagsProviderListener(); - tagsProvider.Subscribe(listener); + var data = new DataSubscriber(); + tagsProvider + .Translate(x => x.CurrentTag) + .Subscribe(data); + tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = data.Messages; Assert.Multiple(() => { @@ -32,10 +38,14 @@ public class TagsProvider_MultipleTags_Tests var html = $"

LoremIpsum

"; var tagsProvider = new TagsProvider(); - var listener = new TagsProviderListener(); - tagsProvider.Subscribe(listener); + var data = new DataSubscriber(); + tagsProvider + .Translate(x => x.CurrentTag) + .Subscribe(data); + tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = data.Messages; Assert.Multiple(() => { @@ -59,10 +69,15 @@ public class TagsProvider_MultipleTags_Tests """; var tagsProvider = new TagsProvider(); - var listener = new TagsProviderListener(); - tagsProvider.Subscribe(listener, "b"); + var data = new DataSubscriber(); + tagsProvider + .Filter("b") + .Translate(x => x.CurrentTag) + .Subscribe(data); + tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = data.Messages; Assert.Multiple(() => { diff --git a/tests/TagsProvider_SingleTag_Tests.cs b/tests/TagsProvider_SingleTag_Tests.cs index 8bf2690..b26c338 100644 --- a/tests/TagsProvider_SingleTag_Tests.cs +++ b/tests/TagsProvider_SingleTag_Tests.cs @@ -1,20 +1,24 @@ using ProSol.Html; -using ProSol.Html.Tests.TestHelpers; +using ProSol.Html.Contracts.Data; +using ProSol.Messaging; +using ProSol.Messaging.Translating; namespace ProSol.Html.Tests; public class TagsProvider_SingleTag_Tests { private TagsProvider tagsProvider; - private TagsProviderListener listener; + private DataSubscriber processedTagsListener; [SetUp] public void Setup() { tagsProvider = new(); - listener = new(); - listener.Subscribe(tagsProvider); + processedTagsListener = new(); + tagsProvider + .Translate(x => x.CurrentTag) + .Subscribe(processedTagsListener); } [Test] @@ -23,7 +27,8 @@ public class TagsProvider_SingleTag_Tests var html = "
"; tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = processedTagsListener.Messages; Assert.Multiple(() => { @@ -45,7 +50,8 @@ public class TagsProvider_SingleTag_Tests var html = "
Lorem
"; tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = processedTagsListener.Messages; Assert.Multiple(() => { @@ -69,7 +75,8 @@ public class TagsProvider_SingleTag_Tests var html = "
Lorem
"; tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = processedTagsListener.Messages; Assert.Multiple(() => { @@ -101,7 +108,8 @@ public class TagsProvider_SingleTag_Tests var html = "
\r\n\r\n
"; tagsProvider.Process(html); - var result = listener.ProcessedTags; + + var result = processedTagsListener.Messages; Assert.Multiple(() => { diff --git a/tests/TestHelpers/TagsProviderListener.cs b/tests/TestHelpers/TagsProviderListener.cs deleted file mode 100644 index c405d33..0000000 --- a/tests/TestHelpers/TagsProviderListener.cs +++ /dev/null @@ -1,31 +0,0 @@ -using ProSol.Html.Contracts.Data; -using ProSol.Messaging; - -namespace ProSol.Html.Tests.TestHelpers; - -internal class TagsProviderListener : ISubscriber -{ - IDisposable? unsubscriber; - HashSet messages = new(); - - public ProcessedTag[] ProcessedTags => - [.. messages - .Select(x => x.CurrentTag)]; - - public TagsProviderMessage[] Messages => [.. messages]; - - public void Subscribe(TagsProvider source) - { - source.Subscribe(this); - } - - public void OnCompleted() - { - unsubscriber?.Dispose(); - } - - public void OnNext(TagsProviderMessage value) - { - messages.Add(value); - } -} \ No newline at end of file