From 7ed05abdb873b2686810fe2e5f61c91fd17bc704 Mon Sep 17 00:00:00 2001
From: qwsdcvghyu89 <61093706+qwsdcvghyu89@users.noreply.github.com>
Date: Mon, 22 Sep 2025 01:51:46 +1000
Subject: [PATCH] refactor: modularize Beam into new projects and interfaces
- Introduced modularity by splitting Beam into new projects: Beam.Abstractions, Beam.Models, and Beam.Downloaders.
- Refactored existing classes into appropriate namespaces and projects.
- Replaced specific implementations with abstractions (e.g., SourceLinkBuilder to LinkBuilder, State to IState, etc.).
- Updated interfaces: added ITemplate, IArticleData, IDownloadReport, and others for improved extensibility.
- Removed deprecated classes like SourceLinkBuilder and StateChangerFactory.
- Enhanced link handling in downloaders by refactoring to use `string` over `SourceLink`.
- Consolidated shared logic under Beam.Abstractions.
---
Beam.Abstractions/Beam.Abstractions.csproj | 16 +
Beam.Abstractions/IArticleData.cs | 10 +
Beam.Abstractions/IDataBindings.cs | 27 +
Beam.Abstractions/IDataProvider.cs | 14 +
Beam.Abstractions/IDocument.cs | 28 +
Beam.Abstractions/IDocumentMetaData.cs | 7 +
Beam.Abstractions/IDownloadReport.cs | 3 +
Beam.Abstractions/ILinkBuilder.cs | 11 +
Beam.Abstractions/IOrdered.cs | 6 +
Beam.Abstractions/IReadOnlyState.cs | 6 +
Beam.Abstractions/IResourceDictionary.cs | 3 +
Beam.Abstractions/IRetryReport.cs | 6 +
Beam.Abstractions/IState.cs | 8 +
Beam.Abstractions/IStateChangeBehaviour.cs | 10 +
Beam.Abstractions/IStateChangerFactory.cs | 3 +
Beam.Abstractions/ITemplate.cs | 8 +
Beam.Abstractions/IUnitDownloader.cs | 7 +
{Beam => Beam.Api}/ApiCall.cs | 0
{Beam => Beam.Api}/ApiCallBuilder.cs | 5 +-
{Beam => Beam.Api}/ApiCalls.cs | 0
{Beam => Beam.Api}/ApiCallsBuilder.cs | 0
{Beam => Beam.Api}/ApiResponse.cs | 0
Beam.Data/BeamDataContext.cs | 50 +
.../LinkBuilder.cs | 42 +-
.../ResourceDictionary.cs | 16 +-
Beam.Data/Template.cs | 19 +
{Beam.Models => Beam.Data}/WebResource.cs | 10 +-
{Beam => Beam.Downloaders}/DownloadContext.cs | 32 +-
.../DownloadContextBuilder.cs | 23 +-
.../SequentialDownloader.cs | 15 +-
.../SequentialFragmentDownloader.cs | 7 +-
{Beam => Beam.Downloaders}/UnitDownloader.cs | 10 +-
.../UnitDownloaderBinary.cs | 11 +-
.../UnitFragmentDownloader.cs | 21 +-
.../UnitFragmentDownloaderBinary.cs | 15 +-
Beam.Dynamic/AnchorCollectionDataProvider.cs | 16 +-
Beam.Dynamic/AnchorDataProvider.cs | 13 +-
.../Architecture.cs | 10 +-
Beam.Dynamic/Beam.Dynamic.csproj | 8 +-
{Beam => Beam.Dynamic}/CommonStateChangers.cs | 22 +-
Beam.Dynamic/CommonTransformers.cs | 45 +
Beam.Dynamic/ConstantStateChanger.cs | 9 +
Beam.Dynamic/DataBindings.cs | 365 +++---
.../DataProviderJsonTypeInfoResolver.cs | 37 +
Beam.Dynamic/DropDownDataProvider.cs | 13 +-
Beam.Dynamic/IDataProvider.cs | 21 -
.../MainArchitecture.cs | 6 +-
.../NumberedStateChanger.cs | 12 +-
Beam.Dynamic/StateChangerFactory.cs | 3 +-
.../{OnlineCleaner.cs => StringCleaner.cs} | 2 +-
Beam.Exceptions/AssertionException.cs | 14 +
Beam.Exceptions/Exceptions.Designer.cs | 116 ++
Beam.Exceptions/Exceptions.resx | 39 +
Beam.Exceptions/MapException.cs | 11 +
Beam.Exports/Beam.Exports.csproj | 6 +-
Beam.Exports/Exporter.cs | 7 +-
Beam.Exports/HtmlExporter.cs | 2 +
Beam.Fluent/Beam.Fluent.csproj | 9 +-
Beam.Fluent/DownloadBuilder.ContextStage.cs | 10 +-
Beam.Fluent/DownloadBuilder.DownloadStage.cs | 1 +
.../DownloadBuilder.IAlternativeLinkStage.cs | 6 +-
...nloadBuilder.IAlternativeTransformStage.cs | 4 +-
Beam.Fluent/DownloadBuilder.IContextStage.cs | 7 +-
.../DownloadBuilder.ITransformStage.cs | 1 +
Beam.Fluent/DownloadBuilder.LinkStage.cs | 11 +-
Beam.Fluent/DownloadBuilder.TransformStage.cs | 4 +-
Beam.Fluent/DownloadBuilder.cs | 4 +-
Beam.Models/AsyncDownloadFailurePredicate.cs | 3 +
Beam.Models/AsyncTransformer.cs | 3 +
Beam.Models/Beam.Models.csproj | 9 +-
Beam.Models/BeamDataContext.cs | 50 -
{Beam => Beam.Models}/ByteDocument.cs | 2 +-
{Beam => Beam.Models}/Document.cs | 11 +-
{Beam => Beam.Models}/DocumentCache.cs | 8 +-
Beam.Models/DownloadReport.cs | 8 +
Beam.Models/File.cs | 2 +-
{Beam => Beam.Models}/Fragment.cs | 2 +-
{Beam => Beam.Models}/ImmutableState.cs | 9 +-
Beam.Models/LinkCollection.cs | 13 -
Beam.Models/Ordered.cs | 6 +
Beam.Models/Public Concrete/ArticleData.cs | 41 +
{Beam => Beam.Models}/RetryReport.cs | 6 +-
{Beam => Beam.Models}/State.cs | 15 +-
{Beam => Beam.Models}/StreamDocument.cs | 2 +-
{Beam => Beam.Models}/StringDocument.cs | 8 +-
.../TableOfContentsData.cs | 12 +-
Beam.Models/Template.cs | 15 -
Beam.Models/Tracked.cs | 11 -
Beam.Playwright/Beam.Playwright.csproj | 4 +-
Beam.Playwright/PlaywrightUnitDownloader.cs | 4 +-
.../PlaywrightUnitPageDownloader.cs | 2 +
Beam.Stealth/Beam.Stealth.csproj | 4 +-
Beam.Stealth/StealthFragmentDownloader.cs | 2 +
Beam.Stealth/StealthFragmentPageDownloader.cs | 2 +
Beam.Stealth/StealthUnitDownloader.cs | 4 +
Beam.Stealth/StealthUnitPageDownloader.cs | 2 +
Beam.Temporary.Cli/Beam.Temporary.Cli.csproj | 2 +-
Beam.Temporary.Cli/CommonTransformers.cs | 46 -
Beam.Temporary.Cli/NovelDefinitionBuilder.cs | 212 ++--
Beam.Temporary.Cli/NovelStatics.cs | 1037 +++++++++--------
Beam.Temporary.Cli/Program.cs | 445 +++----
Beam.Temporary.Cli/QuickAndDirtyJanitor.cs | 51 +-
Beam.Temporary.Cli/StateChangerFactory.cs | 34 -
.../Templates/Classic/ClassicTemplates.cs | 60 +-
Beam.Tests/Beam.Tests.csproj | 1 +
Beam.Tests/OnlineCleaner.Tests.cs | 6 +-
Beam.Tests/SouceLinkBuilder.Tests.cs | 31 +-
Beam.sln | 30 +
Beam/ArticleData.cs | 22 -
Beam/Beam.csproj | 3 +-
Beam/ConstantStateChanger.cs | 13 -
Beam/DownloadEnumerable.cs | 1 +
Beam/DownloadReport.cs | 6 -
Beam/IAsyncEnumeratorExtensions.cs | 4 +-
Beam/IDocument.cs | 29 -
Beam/IDocumentExtensions.cs | 7 -
Beam/IDocumentMetaData.cs | 7 -
Beam/IDocumentSourceLinkFactory.cs | 10 +-
Beam/IStateChangeBehaviour.cs | 8 -
Beam/IUnitDownloader.cs | 6 -
Beam/Ordered.cs | 3 -
Beam/OrderedLinkGenerator.cs | 63 +
Beam/OrderedSourceLinkGenerator.cs | 60 -
Beam/S.cs | 22 +-
Beam/SourceLink.cs | 37 -
Beam/SourceLinkEnumerable.cs | 27 -
Beam/StringEnumerable.cs | 22 +
aeqw89.Beam/aeqw89.Beam.csproj | 14 +-
128 files changed, 2058 insertions(+), 1804 deletions(-)
create mode 100644 Beam.Abstractions/Beam.Abstractions.csproj
create mode 100644 Beam.Abstractions/IArticleData.cs
create mode 100644 Beam.Abstractions/IDataBindings.cs
create mode 100644 Beam.Abstractions/IDataProvider.cs
create mode 100644 Beam.Abstractions/IDocument.cs
create mode 100644 Beam.Abstractions/IDocumentMetaData.cs
create mode 100644 Beam.Abstractions/IDownloadReport.cs
create mode 100644 Beam.Abstractions/ILinkBuilder.cs
create mode 100644 Beam.Abstractions/IOrdered.cs
create mode 100644 Beam.Abstractions/IReadOnlyState.cs
create mode 100644 Beam.Abstractions/IResourceDictionary.cs
create mode 100644 Beam.Abstractions/IRetryReport.cs
create mode 100644 Beam.Abstractions/IState.cs
create mode 100644 Beam.Abstractions/IStateChangeBehaviour.cs
create mode 100644 Beam.Abstractions/IStateChangerFactory.cs
create mode 100644 Beam.Abstractions/ITemplate.cs
create mode 100644 Beam.Abstractions/IUnitDownloader.cs
rename {Beam => Beam.Api}/ApiCall.cs (100%)
rename {Beam => Beam.Api}/ApiCallBuilder.cs (96%)
rename {Beam => Beam.Api}/ApiCalls.cs (100%)
rename {Beam => Beam.Api}/ApiCallsBuilder.cs (100%)
rename {Beam => Beam.Api}/ApiResponse.cs (100%)
create mode 100644 Beam.Data/BeamDataContext.cs
rename Beam/SourceLinkBuilder.cs => Beam.Data/LinkBuilder.cs (92%)
rename {Beam.Models => Beam.Data}/ResourceDictionary.cs (74%)
create mode 100644 Beam.Data/Template.cs
rename {Beam.Models => Beam.Data}/WebResource.cs (82%)
rename {Beam => Beam.Downloaders}/DownloadContext.cs (74%)
rename {Beam => Beam.Downloaders}/DownloadContextBuilder.cs (90%)
rename {Beam => Beam.Downloaders}/SequentialDownloader.cs (87%)
rename {Beam => Beam.Downloaders}/SequentialFragmentDownloader.cs (98%)
rename {Beam => Beam.Downloaders}/UnitDownloader.cs (89%)
rename {Beam => Beam.Downloaders}/UnitDownloaderBinary.cs (93%)
rename {Beam => Beam.Downloaders}/UnitFragmentDownloader.cs (80%)
rename {Beam => Beam.Downloaders}/UnitFragmentDownloaderBinary.cs (91%)
rename {Beam.Temporary.Cli => Beam.Dynamic}/Architecture.cs (93%)
rename {Beam => Beam.Dynamic}/CommonStateChangers.cs (52%)
create mode 100644 Beam.Dynamic/CommonTransformers.cs
create mode 100644 Beam.Dynamic/ConstantStateChanger.cs
create mode 100644 Beam.Dynamic/DataProviderJsonTypeInfoResolver.cs
delete mode 100644 Beam.Dynamic/IDataProvider.cs
rename {Beam.Temporary.Cli => Beam.Dynamic}/MainArchitecture.cs (96%)
rename {Beam => Beam.Dynamic}/NumberedStateChanger.cs (52%)
rename Beam.Dynamic/{OnlineCleaner.cs => StringCleaner.cs} (97%)
create mode 100644 Beam.Exceptions/AssertionException.cs
create mode 100644 Beam.Exceptions/Exceptions.Designer.cs
create mode 100644 Beam.Exceptions/Exceptions.resx
create mode 100644 Beam.Exceptions/MapException.cs
create mode 100644 Beam.Models/AsyncDownloadFailurePredicate.cs
create mode 100644 Beam.Models/AsyncTransformer.cs
delete mode 100644 Beam.Models/BeamDataContext.cs
rename {Beam => Beam.Models}/ByteDocument.cs (94%)
rename {Beam => Beam.Models}/Document.cs (53%)
rename {Beam => Beam.Models}/DocumentCache.cs (93%)
create mode 100644 Beam.Models/DownloadReport.cs
rename {Beam => Beam.Models}/Fragment.cs (98%)
rename {Beam => Beam.Models}/ImmutableState.cs (77%)
delete mode 100644 Beam.Models/LinkCollection.cs
create mode 100644 Beam.Models/Ordered.cs
create mode 100644 Beam.Models/Public Concrete/ArticleData.cs
rename {Beam => Beam.Models}/RetryReport.cs (65%)
rename {Beam => Beam.Models}/State.cs (59%)
rename {Beam => Beam.Models}/StreamDocument.cs (95%)
rename {Beam => Beam.Models}/StringDocument.cs (73%)
rename {Beam.Temporary.Cli => Beam.Models}/TableOfContentsData.cs (54%)
delete mode 100644 Beam.Models/Template.cs
delete mode 100644 Beam.Models/Tracked.cs
delete mode 100644 Beam.Temporary.Cli/CommonTransformers.cs
delete mode 100644 Beam.Temporary.Cli/StateChangerFactory.cs
delete mode 100644 Beam/ArticleData.cs
delete mode 100644 Beam/ConstantStateChanger.cs
delete mode 100644 Beam/DownloadReport.cs
delete mode 100644 Beam/IDocument.cs
delete mode 100644 Beam/IDocumentExtensions.cs
delete mode 100644 Beam/IDocumentMetaData.cs
delete mode 100644 Beam/IStateChangeBehaviour.cs
delete mode 100644 Beam/IUnitDownloader.cs
delete mode 100644 Beam/Ordered.cs
create mode 100644 Beam/OrderedLinkGenerator.cs
delete mode 100644 Beam/OrderedSourceLinkGenerator.cs
delete mode 100644 Beam/SourceLink.cs
delete mode 100644 Beam/SourceLinkEnumerable.cs
create mode 100644 Beam/StringEnumerable.cs
diff --git a/Beam.Abstractions/Beam.Abstractions.csproj b/Beam.Abstractions/Beam.Abstractions.csproj
new file mode 100644
index 0000000..bea4d88
--- /dev/null
+++ b/Beam.Abstractions/Beam.Abstractions.csproj
@@ -0,0 +1,16 @@
+
+
+
+ net9.0
+ enable
+ enable
+ Beam.Abstract
+
+
+
+
+
+
+
+
+
diff --git a/Beam.Abstractions/IArticleData.cs b/Beam.Abstractions/IArticleData.cs
new file mode 100644
index 0000000..b9cc6de
--- /dev/null
+++ b/Beam.Abstractions/IArticleData.cs
@@ -0,0 +1,10 @@
+namespace Beam.Abstractions;
+
+public interface IArticleData : IDocumentMetaData, IEquatable {
+ string? Name { get; set; }
+ string[] Authors { get; set; }
+ string? Language { get; set; }
+ string[] Categories { get; set; }
+ string? Version { get; set; }
+ string? Description { get; set; }
+}
\ No newline at end of file
diff --git a/Beam.Abstractions/IDataBindings.cs b/Beam.Abstractions/IDataBindings.cs
new file mode 100644
index 0000000..1155eee
--- /dev/null
+++ b/Beam.Abstractions/IDataBindings.cs
@@ -0,0 +1,27 @@
+using Beam.Dynamic;
+
+namespace Beam.Abstractions;
+
+public interface IDataBindings {
+ IDataProvider? Title { get; set; }
+ IDataProvider? Authors { get; set; }
+ IDataProvider? Description { get; set; }
+ IDataProvider? Content { get; set; }
+ IDataProvider? Language { get; set; }
+ IDataProvider? Tags { get; set; }
+ IDataProvider? Publisher { get; set; }
+ IDataProvider? PublicationDate { get; set; }
+ IDataProvider? ISBN { get; set; }
+ IDataProvider? PageCount { get; set; }
+ IDataProvider? CoverImage { get; set; }
+ IDataProvider? Series { get; set; }
+ IDataProvider? Edition { get; set; }
+ IDataProvider? Contributors { get; set; }
+ IDataProvider? Subjects { get; set; }
+ IDataProvider? Rights { get; set; }
+ IDataProvider? TableOfContents { get; set; }
+ IDataProvider? PagesDropDown { get; set; }
+ IDataProvider? NextPageButton { get; set; }
+ IDataProvider? PreviousPageButton { get; set; }
+ Dictionary Providers { get; set; }
+}
\ No newline at end of file
diff --git a/Beam.Abstractions/IDataProvider.cs b/Beam.Abstractions/IDataProvider.cs
new file mode 100644
index 0000000..db87588
--- /dev/null
+++ b/Beam.Abstractions/IDataProvider.cs
@@ -0,0 +1,14 @@
+using HtmlAgilityPack;
+using System.Text.Json.Serialization;
+
+namespace Beam.Dynamic;
+
+public interface IDataProvider {
+ public string GetString(HtmlDocument document)
+ => (this as IDataProvider