Fixed TagsProvider
This commit is contained in:
parent
6fd0495f08
commit
9de6c3a49f
20
src/Messaging/IPublisherExtensions.cs
Normal file
20
src/Messaging/IPublisherExtensions.cs
Normal 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));
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
|
@ -1,5 +1,5 @@
|
|||
using ProSol.Html;
|
||||
using ProSol.Html.Tests.TestHelpers;
|
||||
using ProSol.Html.Messaging;
|
||||
|
||||
namespace ProSol.Html.Tests;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue