Fixed TagsProvider

This commit is contained in:
Alexander Kozachenko 2023-12-02 19:30:02 +03:00
parent 6fd0495f08
commit 9de6c3a49f
8 changed files with 32 additions and 63 deletions

View file

@ -0,0 +1,20 @@
using ProSol.Html.Contracts.Data;
using ProSol.Messaging;
using ProSol.Messaging.Subscriptions;
namespace ProSol.Html.Messaging;
public static class IPublisherExtensions
{
public static IPublisher Subscribe(
this IPublisher publisher,
IPipelineSubscriber<TagsProviderMessage> subscriber,
params string[] tagNames)
=> publisher.Subscribe(subscriber, x => tagNames.Contains(x.CurrentTag.TagInfo.Name));
public static IPublisher Subscribe(
this IPublisher publisher,
ISubscriber<TagsProviderMessage> subscriber,
params string[] tagNames)
=> publisher.Subscribe(subscriber, x => tagNames.Contains(x.CurrentTag.TagInfo.Name));
}

View file

@ -1,22 +0,0 @@
using ProSol.Html.Contracts.Data;
using ProSol.Messaging;
using ProSol.Messaging.Subscriptions;
namespace ProSol.Html.Messaging;
public class TagsSubscription(ISubscriber<TagsProviderMessage> subscriber, params string[] tagNames)
: SubscriptionBase<TagsProviderMessage>(subscriber)
{
protected override void OnNext(ISubscriber<TagsProviderMessage> subscriber, TagsProviderMessage message, NextDelegate next)
{
// HACK: a duplicated code.
if (tagNames.Any(x => message.CurrentTag.TagInfo.Name == x))
{
subscriber.OnNext(message, next);
}
else
{
next();
}
}
}

View file

@ -2,14 +2,12 @@
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>preview</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ProSol.Messaging" Version="4.0.0-rc.1" />
<PackageReference Include="ProSol.Messaging.Subscriptions" Version="1.0.0-rc.6" />
<PackageReference Include="ProSol.Messaging" Version="4.0.0-rc.6.0" />
</ItemGroup>
</Project>

View file

@ -1,8 +1,6 @@
using ProSol.Html.Contracts.Data;
using ProSol.Html.Data;
using ProSol.Html.Messaging;
using ProSol.Messaging;
using ProSol.Messaging.Subscriptions;
namespace ProSol.Html;
@ -12,7 +10,7 @@ namespace ProSol.Html;
/// <remarks>
/// Push-notification happens only when the closing tag met, so it contains the full data on tag.
/// </remarks>
public class TagsProvider : IPublisher<TagsProviderMessage>
public class TagsProvider : IPublisher
{
readonly HistoryTracker historyTracker = new();
readonly PipelineMessagePublisher<TagsProviderMessage> publisher = new();
@ -31,14 +29,9 @@ public class TagsProvider : IPublisher<TagsProviderMessage>
publisher.Complete();
}
public IDisposable Subscribe(ISubscriber<TagsProviderMessage> observer)
public IDisposable Subscribe(ISubscriber observer)
=> publisher.Subscribe(observer);
public IDisposable Subscribe(ISubscriber<TagsProviderMessage> observer, params string[] tagNames)
{
return publisher.Subscribe(new TagsSubscription(observer, tagNames));
}
void Process(ReadOnlySpan<char> currentHtml, int charsProcessed)
{
if (TagDetector.Detect(currentHtml) != TagKind.Closing)

View file

@ -3,7 +3,7 @@
<metadata>
<id>ProSol.Html.TagsProvider</id>
<title>ProSol.Html.TagsProvider</title>
<version>2.0.0-rc0.5</version>
<version>2.0.0-rc1.1</version>
<authors>Alex Kozachenko</authors>
<owners>Alex Kozachenko</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
@ -14,7 +14,9 @@
Helps to extract text, structured data, from a specific site.
</description>
<dependencies>
<group targetFramework="net8.0" />
<group targetFramework="net8.0" >
<dependency id="ProSol.Messaging" version="4.*" />
</group>
</dependencies>
<tags> tool extraction web html observer observer-pattern design-patterns </tags>
</metadata>

View file

@ -1,8 +1,9 @@
using ProSol.Html.Tests.TestHelpers;
using ProSol.Html.Messaging;
namespace ProSol.Html.Tests;
public class TagsProvider_FilteresSubscribers_Tests
public class TagsProvider_FiltersSubscribers_Tests
{
[Test]
@ -48,27 +49,6 @@ public class TagsProvider_FilteresSubscribers_Tests
Assert.That(result, Is.EquivalentTo(expected));
}
[Test]
public void Process_Multiple_NamedSubcribers_ShouldProcess_OnlyOne()
{
var expected = new string[] { "tasks" };
var tagsProvider = new TagsProvider();
var listener = new TagsProviderListener();
var fallbackListener = new TagsProviderListener();
tagsProvider.Subscribe(listener, "i", "b");
tagsProvider.Subscribe(fallbackListener);
var html = """
<b>Terminal</b> will be reused by <span>tasks</span>, press <i>any</i> key to <i>close</i> it.
""";
tagsProvider.Process(html);
var result = GetText(fallbackListener, html);
Assert.That(result, Is.EquivalentTo(expected));
}
static string[] GetText(TagsProviderListener listener, string html)
{
return listener.ProcessedTags

View file

@ -1,5 +1,5 @@
using ProSol.Html;
using ProSol.Html.Tests.TestHelpers;
using ProSol.Html.Messaging;
namespace ProSol.Html.Tests;

View file

@ -16,7 +16,7 @@ internal class TagsProviderListener : ISubscriber<TagsProviderMessage>
public void Subscribe(TagsProvider source)
{
unsubscriber = source.Subscribe(this);
source.Subscribe(this);
}
public void OnCompleted()
@ -24,10 +24,8 @@ internal class TagsProviderListener : ISubscriber<TagsProviderMessage>
unsubscriber?.Dispose();
}
public void OnNext(TagsProviderMessage value, NextDelegate next)
public void OnNext(TagsProviderMessage value)
{
messages.Add(value);
// NOTE: this listener gets a message and stops the pipeline, by design.
// next();
}
}