Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/development' into development
Browse files Browse the repository at this point in the history
  • Loading branch information
AnsgarLichter committed Mar 17, 2024
2 parents 18bae0b + 5f47f53 commit 55d149e
Show file tree
Hide file tree
Showing 15 changed files with 258 additions and 43 deletions.
20 changes: 20 additions & 0 deletions ClippingsExamples/issue.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
Врата Абаддона (Джеймс Кори)
– Ваша заметка на странице 868 | Место 8411 | Добавлено: воскресенье, 3 марта 2024 г. в 18:08:16

Проверка
==========
Врата Абаддона (Джеймс Кори)
– Ваш выделенный отрывок на странице 867 | Место 8408–8411 | Добавлено: воскресенье, 3 марта 2024 г. в 18:08:16

Дверь открылась, и он рывком сдвинул джойстик вперед. Мех провел его сквозь проем. Закрыв за собой, Бык, не медля и не раздумывая, свернул по коридору к внутреннему лифту, к долгому переходу на второй уровень, к сектору М.
==========
К востоку от Эдема (Джон Стейнбек)
– Ваша заметка на странице 6 | Место 55 | Добавлено: воскресенье, 3 марта 2024 г. в 18:48:36

Проверка
==========
К востоку от Эдема (Джон Стейнбек)
– Ваш выделенный отрывок на странице 6 | Место 53–55 | Добавлено: воскресенье, 3 марта 2024 г. в 18:48:36

Салинас-Вэлли расположен в Северной Калифорнии и представляет собой длинную узкую полоску равнины между двумя цепями гор, посреди которой бежит, извиваясь
==========
35 changes: 35 additions & 0 deletions ClippingsExamples/issue2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
Пожар Сиболы (Джеймс Кори)
– Ваша заметка на странице 49 | Место 473 | Добавлено: понедельник, 11 марта 2024 г. в 14:17:27

Начальник службы безопасности
==========
Пожар Сиболы (Джеймс Кори)
– Ваш выделенный отрывок на странице 49 | Место 473–473 | Добавлено: понедельник, 11 марта 2024 г. в 14:17:28

Адольфус Мартри
==========
Пожар Сиболы (Джеймс Кори)
– Ваша заметка на странице 71 | Место 690 | Добавлено: четверг, 14 марта 2024 г. в 16:19:41

Зам по полевым операциям
==========
Пожар Сиболы (Джеймс Кори)
– Ваш выделенный отрывок на странице 71 | Место 690–690 | Добавлено: четверг, 14 марта 2024 г. в 16:19:41

Гассан Смит
==========
Пожар Сиболы (Джеймс Кори)
– Ваша заметка на странице 76 | Место 738 | Добавлено: четверг, 14 марта 2024 г. в 16:28:12

Помощник главы безопасности
==========
Пожар Сиболы (Джеймс Кори)
– Ваш выделенный отрывок на странице 76 | Место 738–738 | Добавлено: четверг, 14 марта 2024 г. в 16:28:12

Рив,
==========
Пожар Сиболы (Джеймс Кори)
– Ваш выделенный отрывок на странице 78 | Место 755–756 | Добавлено: четверг, 14 марта 2024 г. в 16:29:17

Каждый вправе сам выбирать свою судьбу.
==========
17 changes: 16 additions & 1 deletion ExportKindleClippingsToNotion/ExportKindleClippingsToNotion.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,29 @@
using ExportKindleClippingsToNotion.Export;
using ExportKindleClippingsToNotion.Import;
using ExportKindleClippingsToNotion.Import.Metadata;
using ExportKindleClippingsToNotion.Parser;

namespace ExportKindleClippingsToNotion;

public class ExportKindleClippingsToNotion(IImporter importer, IBooksParser booksParser, IExporter exporter)
public class ExportKindleClippingsToNotion(
IImporter importer,
IBooksParserFactory booksParserFactory,
IExporter exporter,
IClippingsLanguage clippingsLanguage,
IClippingsParserFactory clippingsParserFactory)
{
public async Task ExecuteAsync(string pathToClippings)
{
var clippings = await importer.ImportAsync(pathToClippings);
if (clippings.Length == 0)
{
Console.WriteLine("No clippings found");
return;
}

var language = clippingsLanguage.Determine(clippings[0]);
var clippingsParser = clippingsParserFactory.GetByLanguage(language);
var booksParser = booksParserFactory.Create(clippingsParser);
var books = await booksParser.ParseAsync(clippings);
await exporter.ExportAsync(books);
}
Expand Down
5 changes: 0 additions & 5 deletions ExportKindleClippingsToNotion/Parser/BooksParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@ public class BooksParser(IBookMetadataFetcher metadataFetcher, IClippingsParser
"https://bookstoreromanceday.org/wp-content/uploads/2020/08/book-cover-placeholder.png";

public async Task<List<Book>> ParseAsync(IEnumerable<string> clippings)
{
return await ParseBooksAsync(clippings);
}

private async Task<List<Book>> ParseBooksAsync(IEnumerable<string> clippings)
{
var books = new List<Book>();
var parsedClippings = new List<Clipping>();
Expand Down
11 changes: 11 additions & 0 deletions ExportKindleClippingsToNotion/Parser/BooksParserFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using ExportKindleClippingsToNotion.Import.Metadata;

namespace ExportKindleClippingsToNotion.Parser;

public class BooksParserFactory(IBookMetadataFetcher metadataFetcher) : IBooksParserFactory
{
public IBooksParser Create(IClippingsParser clippingsParser)
{
return new BooksParser(metadataFetcher, clippingsParser);
}
}
10 changes: 5 additions & 5 deletions ExportKindleClippingsToNotion/Parser/ClippingsLanguage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

namespace ExportKindleClippingsToNotion.Parser;

public class ClippingsLanguage()
public class ClippingsLanguage() : IClippingsLanguage
{
private const string EnglishClipping = "Your Highlight on page";
private const string GermanClipping = "Ihre Markierung bei Position";
private const string RussianClipping = "Ваша заметка в месте";
private const string SpanishClipping = "La subrayado en la página";
private const string EnglishClipping = "Your Highlight";
private const string GermanClipping = "Ihre Markierung";
private const string RussianClipping = "Ваш";
private const string SpanishClipping = "La subrayado";

private readonly Dictionary<SupportedLanguages, string> _languageIdentifiers =
new()
Expand Down
20 changes: 14 additions & 6 deletions ExportKindleClippingsToNotion/Parser/ClippingsParserFactory.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
namespace ExportKindleClippingsToNotion.Parser;

public class ClippingsParserFactory
public class ClippingsParserFactory : IClippingsParserFactory
{
public IClippingsParser GetByLanguage(SupportedLanguages languages)
{
return languages switch
switch (languages)
{
SupportedLanguages.English => new ClippingsParserEnglish(),
SupportedLanguages.German => new ClippingsParserGerman(),
_ => throw new ArgumentOutOfRangeException(nameof(languages), languages, null)
};
case SupportedLanguages.English:
Console.WriteLine("Determined English language");
return new ClippingsParserEnglish();
case SupportedLanguages.German:
Console.WriteLine("Determined German language");
return new ClippingsParserGerman();
case SupportedLanguages.Russian:
Console.WriteLine("Determined Russian language");
return new ClippingsParserRussian();
default:
throw new ArgumentOutOfRangeException(nameof(languages), languages, null);
}
}
}
6 changes: 6 additions & 0 deletions ExportKindleClippingsToNotion/Parser/IBooksParserFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace ExportKindleClippingsToNotion.Parser;

public interface IBooksParserFactory
{
IBooksParser Create(IClippingsParser clippingsParser);
}
6 changes: 6 additions & 0 deletions ExportKindleClippingsToNotion/Parser/IClippingsLanguage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace ExportKindleClippingsToNotion.Parser;

public interface IClippingsLanguage
{
SupportedLanguages Determine(string clipping);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace ExportKindleClippingsToNotion.Parser;

public interface IClippingsParserFactory
{
IClippingsParser GetByLanguage(SupportedLanguages languages);
}
15 changes: 11 additions & 4 deletions ExportKindleClippingsToNotion/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,18 @@
var exporter = new Exporter(client);

var metadataFetcher = new GoogleBooksClient(new BooksService());
var clippingsParser = new ClippingsParserGerman();
var booksParser = new BooksParser(metadataFetcher, clippingsParser);

var booksParserFactory = new BooksParserFactory(metadataFetcher);
var clippingsLanguage = new ClippingsLanguage();
var clippingsParserFactory = new ClippingsParserFactory();

var exportKindleClippingsToNotion =
new ExportKindleClippingsToNotion.ExportKindleClippingsToNotion(importer, booksParser, exporter);
new ExportKindleClippingsToNotion.ExportKindleClippingsToNotion(
importer,
booksParserFactory,
exporter,
clippingsLanguage,
clippingsParserFactory
);
await exportKindleClippingsToNotion.ExecuteAsync(options.PathToClippings);
}
catch (Exception exception)
Expand Down
62 changes: 58 additions & 4 deletions UnitTests/ExportKindleClippingsToNotionTest.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using ExportKindleClippingsToNotion;
using ExportKindleClippingsToNotion.Export;
using ExportKindleClippingsToNotion.Import;
using ExportKindleClippingsToNotion.Import.Metadata;
using ExportKindleClippingsToNotion.Model;
using ExportKindleClippingsToNotion.Parser;
using FakeItEasy;
Expand All @@ -15,8 +16,12 @@ public class ExportKindleClippingsToNotionTest
public async void ExecuteAsync_ImportsParsesAndExports()
{
var importer = A.Fake<IImporter>();
var booksParser = A.Fake<IBooksParser>();
var booksParserFactory = A.Fake<IBooksParserFactory>();
var exporter = A.Fake<IExporter>();
var language = A.Fake<IClippingsLanguage>();
var clippingsParserFactory = A.Fake<IClippingsParserFactory>();
var booksParser = A.Fake<IBooksParser>();
A.CallTo(() => booksParserFactory.Create(A<IClippingsParser>._)).Returns(booksParser);

const string clippingsPath = "path/to/clippings.txt";
var clippings = new[] { "clipping1", "clipping2", "clipping3" };
Expand All @@ -29,14 +34,63 @@ public async void ExecuteAsync_ImportsParsesAndExports()

A.CallTo(() => importer.ImportAsync(clippingsPath)).Returns(Task.FromResult(clippings));
A.CallTo(() => booksParser.ParseAsync(clippings)).Returns(books);

var exportKindleClippingsToNotion =
new ExportKindleClippingsToNotion.ExportKindleClippingsToNotion(importer, booksParser, exporter);
new ExportKindleClippingsToNotion.ExportKindleClippingsToNotion(
importer,
booksParserFactory,
exporter,
language,
clippingsParserFactory
);

await exportKindleClippingsToNotion.ExecuteAsync(clippingsPath);


A.CallTo(() => language.Determine(A<string>.Ignored)).MustHaveHappenedOnceExactly();
A.CallTo(() => clippingsParserFactory.GetByLanguage(A<SupportedLanguages>.Ignored)).MustHaveHappenedOnceExactly();
A.CallTo(() => importer.ImportAsync(clippingsPath)).MustHaveHappenedOnceExactly();
A.CallTo(() => booksParser.ParseAsync(clippings)).MustHaveHappenedOnceExactly();
A.CallTo(() => exporter.ExportAsync(books)).MustHaveHappenedOnceExactly();
}

[Fact]
public async void ExecuteAsync_ImportsEmptyFile()
{
var importer = A.Fake<IImporter>();
var booksParserFactory = A.Fake<IBooksParserFactory>();
var exporter = A.Fake<IExporter>();
var language = A.Fake<IClippingsLanguage>();
var clippingsParserFactory = A.Fake<IClippingsParserFactory>();
var booksParser = A.Fake<IBooksParser>();
A.CallTo(() => booksParserFactory.Create(A<IClippingsParser>._)).Returns(booksParser);

const string clippingsPath = "path/to/clippings.txt";
var clippings = Array.Empty<string>();
var books = new List<Book>()
{
new Book("author1", "title1"),
new Book("author2", "title2"),
new Book("author3", "title3")
};

A.CallTo(() => importer.ImportAsync(clippingsPath)).Returns(Task.FromResult(clippings));
A.CallTo(() => booksParser.ParseAsync(clippings)).Returns(books);

var exportKindleClippingsToNotion =
new ExportKindleClippingsToNotion.ExportKindleClippingsToNotion(
importer,
booksParserFactory,
exporter,
language,
clippingsParserFactory
);

await exportKindleClippingsToNotion.ExecuteAsync(clippingsPath);

A.CallTo(() => language.Determine(A<string>.Ignored)).MustNotHaveHappened();
A.CallTo(() => clippingsParserFactory.GetByLanguage(A<SupportedLanguages>.Ignored)).MustNotHaveHappened();
A.CallTo(() => importer.ImportAsync(clippingsPath)).MustHaveHappenedOnceExactly();
A.CallTo(() => booksParser.ParseAsync(clippings)).MustNotHaveHappened();
A.CallTo(() => exporter.ExportAsync(books)).MustNotHaveHappened();
}
}
23 changes: 23 additions & 0 deletions UnitTests/Parser/BooksParserFactoryTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using ExportKindleClippingsToNotion.Import.Metadata;
using ExportKindleClippingsToNotion.Parser;
using FakeItEasy;
using JetBrains.Annotations;

namespace UnitTests.Parser;

[TestSubject(typeof(BooksParserFactory))]
public class BooksParserFactoryTest
{

[Fact]
public void BooksParserIsReturned()
{
var metadataFetcher = A.Fake<IBookMetadataFetcher>();
var testSubject = new BooksParserFactory(metadataFetcher);

var clippingsParser = A.Fake<IClippingsParser>();
var booksParser = testSubject.Create(clippingsParser);

Assert.NotNull(booksParser);
}
}
Loading

0 comments on commit 55d149e

Please sign in to comment.