From 69db707d6803ada3891e4e71b8660ad095392973 Mon Sep 17 00:00:00 2001 From: Serghei Cebotari Date: Thu, 8 Feb 2024 17:11:11 +0300 Subject: Rename Parser projects --- RhSolutions.Api.Tests/ProductQueryModifierTests.cs | 14 -- RhSolutions.Api.Tests/RautitanFittingsTests.cs | 146 --------------------- RhSolutions.Api.Tests/RautitanPipesTests.cs | 31 ----- RhSolutions.Api.Tests/RhSolutions.Api.Tests.csproj | 29 ---- RhSolutions.Api.Tests/TestServiceCollection.cs | 23 ---- RhSolutions.Api.Tests/Usings.cs | 2 - RhSolutions.Api.sln | 20 +-- RhSolutions.Api/Middleware/QueryModifier.cs | 14 +- RhSolutions.Api/Program.cs | 2 +- RhSolutions.Api/RhSolutions.Api.csproj | 2 +- .../DrinkingWaterHeatingFittings/Adapter.cs | 23 ---- .../AdapterExternal.cs | 7 - .../AdapterInternal.cs | 7 - .../AdapterScrewcap.cs | 7 - .../BendFormerHeating.cs | 25 ---- .../BendFormerSanitary.cs | 22 ---- .../DrinkingWaterHeatingFittings/ConnectionBend.cs | 27 ---- .../DrinkingWaterHeatingFittings/ConnectionTee.cs | 7 - .../DrinkingWaterHeatingFittings/Coupling.cs | 30 ----- .../DrinkingWaterHeatingFitting.cs | 30 ----- .../DrinkingWaterHeatingFittings/DummyPlug.cs | 7 - .../DrinkingWaterHeatingFittings/Elbow.cs | 22 ---- .../DrinkingWaterHeatingFittings/Eurocone.cs | 22 ---- .../EuroconeAdapter.cs | 20 --- .../EuroconeConnectionBend.cs | 11 -- .../DrinkingWaterHeatingFittings/EuroconeFlex.cs | 11 -- .../DrinkingWaterHeatingFittings/EuroconeStabil.cs | 11 -- .../DrinkingWaterHeatingFittings/ManifoldG1.cs | 27 ---- .../DrinkingWaterHeatingFittings/ManifoldHLV.cs | 26 ---- .../DrinkingWaterHeatingFittings/Nippel.cs | 11 -- .../DrinkingWaterHeatingFittings/ProtectivePipe.cs | 24 ---- .../DrinkingWaterHeatingFittings/ScrewcapElbow.cs | 7 - .../DrinkingWaterHeatingFittings/Sleeve.cs | 7 - .../DrinkingWaterHeatingFittings/SupportingClip.cs | 24 ---- .../DrinkingWaterHeatingFittings/TPiece.cs | 36 ----- .../ThreadElbowDoubleWallInternal.cs | 32 ----- .../ThreadElbowExternal.cs | 7 - .../ThreadElbowInternal.cs | 7 - .../ThreadElbowWallExternal.cs | 26 ---- .../ThreadElbowWallInternal.cs | 30 ----- .../ThreadTPieceExternal.cs | 30 ----- .../ThreadTPieceInternal.cs | 42 ------ .../DrinkingWaterHeatingPipes/BlackPipe.cs | 17 --- .../DrinkingWaterHeatingPipe.cs | 56 -------- .../DrinkingWaterHeatingPipes/FlexPipe.cs | 7 - .../DrinkingWaterHeatingPipes/PinkPipe.cs | 24 ---- .../DrinkingWaterHeatingPipes/StabilPipe.cs | 17 --- RhSolutions.MLModifiers/IProductMLModifier.cs | 6 - RhSolutions.MLModifiers/MLModifierKey.cs | 10 -- RhSolutions.MLModifiers/MLModifiersRegistration.cs | 25 ---- .../RhSolutions.MLModifiers.csproj | 13 -- RhSolutions.Parsers.Tests/ProductParsersTests.cs | 14 ++ RhSolutions.Parsers.Tests/RautitanFittingsTests.cs | 146 +++++++++++++++++++++ RhSolutions.Parsers.Tests/RautitanPipesTests.cs | 31 +++++ .../RhSolutions.Parsers.Tests.csproj | 29 ++++ RhSolutions.Parsers.Tests/TestServiceCollection.cs | 23 ++++ RhSolutions.Parsers.Tests/Usings.cs | 2 + .../DrinkingWaterHeatingFittings/Adapter.cs | 23 ++++ .../AdapterExternal.cs | 7 + .../AdapterInternal.cs | 7 + .../AdapterScrewcap.cs | 7 + .../BendFormerHeating.cs | 25 ++++ .../BendFormerSanitary.cs | 22 ++++ .../DrinkingWaterHeatingFittings/ConnectionBend.cs | 27 ++++ .../DrinkingWaterHeatingFittings/ConnectionTee.cs | 7 + .../DrinkingWaterHeatingFittings/Coupling.cs | 30 +++++ .../DrinkingWaterHeatingFitting.cs | 30 +++++ .../DrinkingWaterHeatingFittings/DummyPlug.cs | 7 + .../DrinkingWaterHeatingFittings/Elbow.cs | 22 ++++ .../DrinkingWaterHeatingFittings/Eurocone.cs | 22 ++++ .../EuroconeAdapter.cs | 20 +++ .../EuroconeConnectionBend.cs | 11 ++ .../DrinkingWaterHeatingFittings/EuroconeFlex.cs | 11 ++ .../DrinkingWaterHeatingFittings/EuroconeStabil.cs | 11 ++ .../DrinkingWaterHeatingFittings/ManifoldG1.cs | 27 ++++ .../DrinkingWaterHeatingFittings/ManifoldHLV.cs | 26 ++++ .../DrinkingWaterHeatingFittings/Nippel.cs | 11 ++ .../DrinkingWaterHeatingFittings/ProtectivePipe.cs | 24 ++++ .../DrinkingWaterHeatingFittings/ScrewcapElbow.cs | 7 + .../DrinkingWaterHeatingFittings/Sleeve.cs | 7 + .../DrinkingWaterHeatingFittings/SupportingClip.cs | 24 ++++ .../DrinkingWaterHeatingFittings/TPiece.cs | 36 +++++ .../ThreadElbowDoubleWallInternal.cs | 32 +++++ .../ThreadElbowExternal.cs | 7 + .../ThreadElbowInternal.cs | 7 + .../ThreadElbowWallExternal.cs | 26 ++++ .../ThreadElbowWallInternal.cs | 30 +++++ .../ThreadTPieceExternal.cs | 30 +++++ .../ThreadTPieceInternal.cs | 42 ++++++ .../DrinkingWaterHeatingPipes/BlackPipe.cs | 17 +++ .../DrinkingWaterHeatingPipe.cs | 56 ++++++++ .../DrinkingWaterHeatingPipes/FlexPipe.cs | 7 + .../DrinkingWaterHeatingPipes/PinkPipe.cs | 24 ++++ .../DrinkingWaterHeatingPipes/StabilPipe.cs | 17 +++ RhSolutions.Parsers/IProductParser.cs | 6 + RhSolutions.Parsers/ParserKey.cs | 10 ++ RhSolutions.Parsers/ParsersRegistration.cs | 25 ++++ RhSolutions.Parsers/RhSolutions.Parsers.csproj | 13 ++ 98 files changed, 1064 insertions(+), 1064 deletions(-) delete mode 100644 RhSolutions.Api.Tests/ProductQueryModifierTests.cs delete mode 100644 RhSolutions.Api.Tests/RautitanFittingsTests.cs delete mode 100644 RhSolutions.Api.Tests/RautitanPipesTests.cs delete mode 100644 RhSolutions.Api.Tests/RhSolutions.Api.Tests.csproj delete mode 100644 RhSolutions.Api.Tests/TestServiceCollection.cs delete mode 100644 RhSolutions.Api.Tests/Usings.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Adapter.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterExternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterInternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerHeating.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionBend.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionTee.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Coupling.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DummyPlug.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Elbow.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Eurocone.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeFlex.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeStabil.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldG1.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldHLV.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Nippel.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ProtectivePipe.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Sleeve.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/SupportingClip.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/TPiece.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/BlackPipe.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/FlexPipe.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/PinkPipe.cs delete mode 100644 RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/StabilPipe.cs delete mode 100644 RhSolutions.MLModifiers/IProductMLModifier.cs delete mode 100644 RhSolutions.MLModifiers/MLModifierKey.cs delete mode 100644 RhSolutions.MLModifiers/MLModifiersRegistration.cs delete mode 100644 RhSolutions.MLModifiers/RhSolutions.MLModifiers.csproj create mode 100644 RhSolutions.Parsers.Tests/ProductParsersTests.cs create mode 100644 RhSolutions.Parsers.Tests/RautitanFittingsTests.cs create mode 100644 RhSolutions.Parsers.Tests/RautitanPipesTests.cs create mode 100644 RhSolutions.Parsers.Tests/RhSolutions.Parsers.Tests.csproj create mode 100644 RhSolutions.Parsers.Tests/TestServiceCollection.cs create mode 100644 RhSolutions.Parsers.Tests/Usings.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs create mode 100644 RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs create mode 100644 RhSolutions.Parsers/IProductParser.cs create mode 100644 RhSolutions.Parsers/ParserKey.cs create mode 100644 RhSolutions.Parsers/ParsersRegistration.cs create mode 100644 RhSolutions.Parsers/RhSolutions.Parsers.csproj diff --git a/RhSolutions.Api.Tests/ProductQueryModifierTests.cs b/RhSolutions.Api.Tests/ProductQueryModifierTests.cs deleted file mode 100644 index a642f9c..0000000 --- a/RhSolutions.Api.Tests/ProductQueryModifierTests.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace RhSolutions.Api.Tests; - -public abstract class ProductQueryModifierTests -{ - public void Invoke(string productType, string query, string expected) - { - var modifier = TestServiceCollection.ServiceProvider?.GetRequiredKeyedService(productType); - string actual = string.Empty; - Assert.That(modifier?.TryQueryModify(query, out actual), Is.True); - Assert.That(actual, Is.EqualTo(expected)); - } -} diff --git a/RhSolutions.Api.Tests/RautitanFittingsTests.cs b/RhSolutions.Api.Tests/RautitanFittingsTests.cs deleted file mode 100644 index 49a7bbe..0000000 --- a/RhSolutions.Api.Tests/RautitanFittingsTests.cs +++ /dev/null @@ -1,146 +0,0 @@ - -namespace RhSolutions.Api.Tests; - -public class RautitanFittingsTests : ProductQueryModifierTests -{ - [TestCase("Гильза 16", "Монтажная гильза 16")] - [TestCase("Пресс-втулка 20", "Монтажная гильза 20")] - [TestCase("UPONOR Q&E EVOLUTION КОЛЬЦО БЕЛОЕ 16 '900Ф", "Монтажная гильза 16")] - public void SleeveTest(string query, string modified) - => Invoke(productType: "Монтажная гильза", query, modified); - - [TestCase("Гофра 16", "Гофротруба защитн.для ПЭ-трубы 16/17")] - [TestCase("Гофра 20", "Гофротруба защитн.для ПЭ-трубы 20")] - public void ProtectivePipeTest(string query, string modified) - => Invoke(productType: "Гофротруба RAUTITAN", query, modified); - - [TestCase("Фиксирующий желоб для ПЭ-трубы 16", "Фиксирующий желоб для ПЭ-трубы 16/17")] - [TestCase("Фиксирующий желоб для ПЭ-трубы 20", "Фиксирующий желоб для ПЭ-трубы 20")] - public void SupportingClipTest(string query, string modified) - => Invoke(productType: "Желоб", query, modified); - - [TestCase("Тройник 20-16-16", "Тройник -PLATINUM 20-16-16")] - [TestCase("Тройник 20x16x16", "Тройник -PLATINUM 20-16-16")] - [TestCase("Тройник 20-16-25", "Тройник -PLATINUM 25-16-20")] - public void TPieceTest(string query, string modified) - => Invoke(productType: "Тройник RAUTITAN", query, modified); - - [TestCase("муфта 20", "Муфта соединительная равнопроходная 20")] - [TestCase("переходник 20-16", "Муфта соединительная переходная 20-16")] - [TestCase("переходник 16-20", "Муфта соединительная переходная 20-16")] - [TestCase("Соединение труба-труба 20/20, бронза", "Муфта соединительная равнопроходная 20")] - [TestCase("Муфта соединительная переходная 20x16 для труб из сшитого полиэтилена аксиальный", "Муфта соединительная переходная 20-16")] - public void CouplingTest(string query, string modified) - => Invoke(productType: "Муфта соединительная", query, modified); - - [TestCase("Переходник с внутренней резьбой 16xG 3/4\" для труб из сшитого полиэтилена аксиальный", "Переходник с внутренней резьбой -угольник-переходник 16 3/4")] - public void AdapterInternalTest(string query, string modified) - => Invoke(productType: "Переходник на внутреннюю резьбу", query, modified); - - [TestCase("Угольник 90°, 40 PX", "Угольник -PLATINUM 90 40")] - public void ElbowTest(string query, string modified) - => Invoke(productType: "Угольник RAUTITAN", query, modified); - - [TestCase("Уголок соединительный с ниппелем 20 х 1/2'', бронза", "Угольник-переходник с наружной резьбой 20 1/2")] - public void ThreadElbowExternalTest(string query, string modified) - => Invoke(productType: "Угольник с наружной резьбой", query, modified); - - [TestCase("Уголок соединительный с муфтой 16 х 1/2\", бронза", "Угольник-переходник с внутренней резьбой 16 1/2")] - public void ThreadElbowInternalTest(string query, string modified) - => Invoke(productType: "Угольник с внутренней резьбой", query, modified); - - [TestCase("Угольник-переходник с накидной гайкой 16-G 1/2 RX+", "Угольник-переходник с накидной гайкой 16 1/2")] - [TestCase("Соединение угловое с накидной гайкой 16 х 1/2\", латунь", "Угольник-переходник с накидной гайкой 16 1/2")] - public void ScrewcapElbowTest(string query, string modified) - => Invoke(productType: "Угольник с накидной гайкой", query, modified); - - [TestCase("Тройник с внутр. резьбой на боков. проходе 25-Rp 1/2-25 RX+", "Тройник с внутр. резьбой на боков. проходе 25-Rp 1/2-25")] - [TestCase("Тройник настенный с внутренней резьбой 16-Rp1/2-16 RX+", "Тройник настенный с внутренней резьбой 16-Rp1/2-16")] - public void ThreadTPieceInternalTest(string query, string modified) - => Invoke(productType: "Тройник RAUTITAN резьбовой внутренний", query, modified); - - [TestCase("Тройник RAUTITAN RX+ с наружной резьбой 20-20-R 3/4", "Тройник с наружной резьбой 20-20-R 3/4")] - public void ThreadTPieceExternalTest(string query, string modified) - => Invoke(productType: "Тройник RAUTITAN резьбовой наружный", query, modified); - - [TestCase("Фиксатор поворота трубы 16/17/90°, без колец (оцинк. сталь)", "Фиксатор поворота 16/17/90°")] - [TestCase("Дуга 90° 25", "Фиксатор поворота 25/90°")] - [TestCase("Дуга 90° r/d >= 2.5. Ø25 (767025)", "Фиксатор поворота 25/90°")] - public void BendFormerHeatingTest(string query, string modified) - => Invoke(productType: "Фиксатор поворота отопление", query, modified); - - [TestCase("Фиксатор поворота с кольцами 90°, 32", "Фиксатор поворота с кольцами 90° 32")] - [TestCase("Фиксатор поворота с кольцами 45°, 16", "Фиксатор поворота с кольцами 45° 16")] - public void BendFormerSanitaryTest(string query, string modified) - => Invoke(productType: "Фиксатор поворота водоснабжение", query, modified); - - [TestCase("Угольник настенный с наружной резьбой 16-R 1/2 RX+", "Угольник настенный с наружной резьбой 16-R 1/2")] - public void ThreadElbowWallExternalTest(string query, string modified) - => Invoke(productType: "Угольник настенный наружный", query, modified); - - [TestCase("Угольник настенный с внутр. резьбой 16-Rp 1/2 RX+", "Угольник настенный внутр. резьба 16-Rp 1/2")] - [TestCase("Угольник настенный с длинным патрубком, внутр. резьба 16-Rp 1/2 RX+", "Угольник настенный внутр. резьба длинный 16-Rp 1/2")] - [TestCase("Уголок с настенным креплением, удлиненный, 16 х 1/2'', бронза", "Угольник настенный внутр. резьба длинный 16-Rp 1/2")] - public void ThreadElbowWallInternalTest(string query, string modified) - => Invoke(productType: "Угольник настенный внутренний", query, modified); - - [TestCase("Проточный настенный угольник 16/16-Rp 1/2 длинный RX+", "Проточный настенный угольник 16/16-Rp 1/2 длинный")] - [TestCase("Проточный настенный угольник 16/16-Rp 1/2 короткий RX+", "Проточный настенный угольник 16/16-Rp 1/2 короткий")] - public void ThreadElbowDoubleWallInternalTest(string query, string modified) - => Invoke(productType: "Проточный настенный угольник", query, modified); - - [TestCase("Трубка из. нерж. стали для подкл. радиатора, Г-образная 16/250", "Трубка Г-образная 16/250")] - [TestCase("Монтажная трубка для радиатора, конечная, 16 х 15 х 300 мм", "Трубка Г-образная 16/250")] - public void ConnectionBendTest(string query, string modified) - => Invoke(productType: "Трубка Г-образная", query, modified); - - [TestCase("Трубка из. нерж. стали для подкл. радиатора, Т-образная 16/250", "Трубка Т-образная 16/250")] - [TestCase("Монтажная трубка для радиатора, проходная 20 х 15 х 300 мм", "Трубка Т-образная 20/250")] - public void ConnectionTeeTest(string query, string modified) - => Invoke(productType: "Трубка Т-образная", query, modified); - - [TestCase("Заглушка для полимерн. трубы 16 RX+", "Заглушка для полимерн. трубы 16")] - [TestCase("Заглушка 20", "Заглушка для полимерн. трубы 20")] - [TestCase("Заглушка, 16, латунь", "Заглушка для полимерн. трубы 16")] - public void DummyPlugTest(string query, string modified) - => Invoke(productType: "Заглушка труб RAUTITAN", query, modified); - - [TestCase("Концовка разб. 3/4'' (еврок) для универс. трубы 16", "Резьбозажимное соединение flex/pink 16х2,2xG3/4")] - [TestCase("Переходник компрессионный PEX 20х2.8-G 3/4\" Евроконус", "Резьбозажимное соединение flex/pink 20х2,8xG3/4")] - [TestCase("Резьбозажимное соединение flex/pink 20х2,8xG3/4", "Резьбозажимное соединение flex/pink 20х2,8xG3/4")] - public void EuroconeFlexTest(string query, string modified) - => Invoke(productType: "Резьбозажимное flex", query, modified); - - [TestCase("Резьбозажимное соединение stabil 16,2x2,6xG3/4", "Резьбозажимное соединение stabil 16,2x2,6xG3/4")] - [TestCase("Резьбозажимное соединение stabil 20x2,9xG3/4", "Резьбозажимное соединение stabil 20x2,9xG3/4")] - [TestCase("Концовка разб.3/4''(еврок.) для PE-Xc и PE-MDXс 16", "Резьбозажимное соединение stabil 16,2x2,6xG3/4")] - public void EuroconeStabilTest(string query, string modified) - => Invoke(productType: "Резьбозажимное stabil", query, modified); - - [TestCase("Переходник на евроконус 16-G 3/4", "Переходник на евроконус 16-G 3/4")] - [TestCase("Соед.прям. с вн.резьбой (н.гайка, еврок.) 16 ник.", "Переходник на евроконус 16-G 3/4")] - [TestCase("Переходник с накидной гайкой 16x2.2 -G 3/4\" Евроконус, c гильзой в комплекте", "Переходник на евроконус 16-G 3/4")] - public void EuroconeAdapterTest(string query, string modified) - => Invoke(productType: "Переходник на евроконус", query, modified); - - [TestCase("Резьбозажимное соединение для металлической трубки G 3/4 -15", "Резьбозажимное соединение для металлической трубки G 3/4 -15")] - [TestCase("Концовка для монтажной трубы 15 х 1/2''", "Резьбозажимное соединение для металлической трубки G 3/4 -15")] - [TestCase("Фитинг подключения L и T-образной медной трубки - D15 - G 3/4", "Резьбозажимное соединение для металлической трубки G 3/4 -15")] - public void EuroconeConnectionBendTest(string query, string modified) - => Invoke(productType: "Резьбозажимное для трубки", query, modified); - - [TestCase("Ниппель", "К-т двух резьбозажим. нипелей с нар.резьбой 1/2х3/4")] - public void NippelTest(string query, string modified) - => Invoke(productType: "Ниппель", query, modified); - - [TestCase("Распределительный коллектор G1 2 отвода G 3/4", "Распределительный коллектор G1 2")] - [TestCase("Коллектор Квартирный с отсекающими кранами, латунь ДУ20, НР-ВР 3/4\", 3 контура НР 1/2", "Распределительный коллектор G1 3")] - [TestCase("Коллектор Квартирный с отсекающими кранами, латунь ДУ20, НР-ВР 3/\", 4 контура НР 1/2\"", "Распределительный коллектор G1 4")] - public void ManifoldG1Test(string query, string modified) - => Invoke(productType: "Коллектор G1", query, modified); - - [TestCase("Распределительный коллектор HLV на 2 группы нерж. сталь", "Распределительный коллектор HLV на 2 групп")] - [TestCase("Распределительный коллектор HLV на 12 групп нерж. сталь", "Распределительный коллектор HLV на 12 групп")] - public void ManifoldHLVTest(string query, string modified) - => Invoke(productType: "Коллектор HLV", query, modified); -} diff --git a/RhSolutions.Api.Tests/RautitanPipesTests.cs b/RhSolutions.Api.Tests/RautitanPipesTests.cs deleted file mode 100644 index 64a549b..0000000 --- a/RhSolutions.Api.Tests/RautitanPipesTests.cs +++ /dev/null @@ -1,31 +0,0 @@ - -namespace RhSolutions.Api.Tests; - -public class RautitanPipesTests : ProductQueryModifierTests -{ - [TestCase("Унив.труба RAUTITAN flex 16x2,2, бухта 100м", "Труба Flex 16x2,2 бухта")] - [TestCase("Труба flex 16", "Труба Flex 16x2,2 бухта")] - [TestCase("Унив.труба RAUTITAN flex 32x4,4, прям.отрезки 6м", "Труба Flex 32x4,4 прям.отрезки")] - [TestCase("Труба flex 32", "Труба Flex 32x4,4 прям.отрезки")] - public void FlexPipeTest(string query, string modified) - => Invoke(productType: "Flex", query, modified); - - [TestCase("Унив. труба RAUTITAN pink+ 16х2,2 мм, бухта 120 м", "Труба Pink+ 16х2,2 бухта")] - [TestCase("труба pink 16", "Труба Pink+ 16х2,2 бухта")] - [TestCase("Унив. труба RAUTITAN pink+ 32х4,4 мм, бухта 50 м", "Труба Pink+ 32х4,4 бухта")] - [TestCase("труба pink 32", "Труба Pink+ 32х4,4 прямые отрезки")] - public void PinkPipeTest(string query, string modified) - => Invoke(productType: "Pink", query, modified); - - [TestCase("Универсальн.труба RAUTITAN stabil 16,2х2,6 мм, бухта 100 м", "Труба Stabil -PLATINUM 16,2х2,6 бухта")] - [TestCase("труба stabil 16", "Труба Stabil -PLATINUM 16,2х2,6 бухта")] - [TestCase("Универсальн.труба RAUTITAN stabil 32х4,7 мм, прям.отрезки 5м", "Труба Stabil -PLATINUM 32х4,7 прям.отрезки")] - [TestCase("труба stabil 32", "Труба Stabil -PLATINUM 32х4,7 прям.отрезки")] - public void StabilPipeTest(string query, string modified) - => Invoke(productType: "Stabil", query, modified); - - [TestCase("Отоп.труба РЕХАУ BLACK 16х2,2 мм, бухта 200 м", "Труба Black 16х2,2 бухта")] - [TestCase("труба BLACK 16", "Труба Black 16х2,2 бухта")] - public void BlackPipeTest(string query, string modified) - => Invoke(productType: "Black", query, modified); -} \ No newline at end of file diff --git a/RhSolutions.Api.Tests/RhSolutions.Api.Tests.csproj b/RhSolutions.Api.Tests/RhSolutions.Api.Tests.csproj deleted file mode 100644 index cc4ff74..0000000 --- a/RhSolutions.Api.Tests/RhSolutions.Api.Tests.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - net8.0 - enable - enable - false - false - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/RhSolutions.Api.Tests/TestServiceCollection.cs b/RhSolutions.Api.Tests/TestServiceCollection.cs deleted file mode 100644 index 9f15c89..0000000 --- a/RhSolutions.Api.Tests/TestServiceCollection.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace RhSolutions.Api.Tests; - -[SetUpFixture] -public class TestServiceCollection -{ - public static ServiceProvider? ServiceProvider { get; private set; } - - [OneTimeSetUp] - public void CreateProvider() - { - var collection = new ServiceCollection(); - collection.AddModifiers(); - ServiceProvider = collection.BuildServiceProvider(); - } - - [OneTimeTearDown] - public void DisposeProvider() - { - ServiceProvider?.Dispose(); - } -} \ No newline at end of file diff --git a/RhSolutions.Api.Tests/Usings.cs b/RhSolutions.Api.Tests/Usings.cs deleted file mode 100644 index 0c5cc00..0000000 --- a/RhSolutions.Api.Tests/Usings.cs +++ /dev/null @@ -1,2 +0,0 @@ -global using NUnit.Framework; -global using RhSolutions.MLModifiers; \ No newline at end of file diff --git a/RhSolutions.Api.sln b/RhSolutions.Api.sln index a0f5d9c..8a56b73 100644 --- a/RhSolutions.Api.sln +++ b/RhSolutions.Api.sln @@ -5,9 +5,9 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RhSolutions.Api", "RhSolutions.Api\RhSolutions.Api.csproj", "{6AACEC90-0811-418D-8505-EB142A2B2AFA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RhSolutions.Api.Tests", "RhSolutions.Api.Tests\RhSolutions.Api.Tests.csproj", "{E49F46C4-5F07-4055-AE8B-700AA6FC35FD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RhSolutions.Parsers", "RhSolutions.Parsers\RhSolutions.Parsers.csproj", "{C00C3DAB-275B-416D-BB66-4CB144441B18}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RhSolutions.MLModifiers", "RhSolutions.MLModifiers\RhSolutions.MLModifiers.csproj", "{50A53BB3-1F9D-4F19-90DB-BCB4D49FF9FE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RhSolutions.Parsers.Tests", "RhSolutions.Parsers.Tests\RhSolutions.Parsers.Tests.csproj", "{5AD110C3-A08C-459F-9CB1-198E75A955EE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -22,13 +22,13 @@ Global {6AACEC90-0811-418D-8505-EB142A2B2AFA}.Debug|Any CPU.Build.0 = Debug|Any CPU {6AACEC90-0811-418D-8505-EB142A2B2AFA}.Release|Any CPU.ActiveCfg = Release|Any CPU {6AACEC90-0811-418D-8505-EB142A2B2AFA}.Release|Any CPU.Build.0 = Release|Any CPU - {E49F46C4-5F07-4055-AE8B-700AA6FC35FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E49F46C4-5F07-4055-AE8B-700AA6FC35FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E49F46C4-5F07-4055-AE8B-700AA6FC35FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E49F46C4-5F07-4055-AE8B-700AA6FC35FD}.Release|Any CPU.Build.0 = Release|Any CPU - {50A53BB3-1F9D-4F19-90DB-BCB4D49FF9FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50A53BB3-1F9D-4F19-90DB-BCB4D49FF9FE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50A53BB3-1F9D-4F19-90DB-BCB4D49FF9FE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50A53BB3-1F9D-4F19-90DB-BCB4D49FF9FE}.Release|Any CPU.Build.0 = Release|Any CPU + {C00C3DAB-275B-416D-BB66-4CB144441B18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C00C3DAB-275B-416D-BB66-4CB144441B18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C00C3DAB-275B-416D-BB66-4CB144441B18}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C00C3DAB-275B-416D-BB66-4CB144441B18}.Release|Any CPU.Build.0 = Release|Any CPU + {5AD110C3-A08C-459F-9CB1-198E75A955EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AD110C3-A08C-459F-9CB1-198E75A955EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AD110C3-A08C-459F-9CB1-198E75A955EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AD110C3-A08C-459F-9CB1-198E75A955EE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/RhSolutions.Api/Middleware/QueryModifier.cs b/RhSolutions.Api/Middleware/QueryModifier.cs index f349e48..8f10928 100644 --- a/RhSolutions.Api/Middleware/QueryModifier.cs +++ b/RhSolutions.Api/Middleware/QueryModifier.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Http.Extensions; using RhSolutions.Api.Services; -using RhSolutions.MLModifiers; +using RhSolutions.Parsers; namespace RhSolutions.Api.Middleware; @@ -8,7 +8,7 @@ public class QueryModifier { private RequestDelegate _next; private IServiceProvider _provider; - private IProductMLModifier? _modifier; + private IProductParser? _modifier; public QueryModifier(RequestDelegate nextDelegate, IServiceProvider provider) { @@ -21,15 +21,15 @@ public class QueryModifier if (context.Request.Method == HttpMethods.Get && context.Request.Path == "/api/search") { - string query = context.Request.Query["query"].ToString(); - var productType = typePredicter.GetPredictedProductType(query); - _modifier = _provider.GetRequiredKeyedService(productType); + string input = context.Request.Query["query"].ToString(); + var productType = typePredicter.GetPredictedProductType(input); + _modifier = _provider.GetRequiredKeyedService(productType); if (_modifier == null) return; - if (_modifier.TryQueryModify(query, out var modified)) + if (_modifier.TryParse(input, out var output)) { QueryBuilder qb = new() { - {"query", modified} + {"query", output} }; context.Request.QueryString = qb.ToQueryString(); } diff --git a/RhSolutions.Api/Program.cs b/RhSolutions.Api/Program.cs index ac5269c..19268bc 100644 --- a/RhSolutions.Api/Program.cs +++ b/RhSolutions.Api/Program.cs @@ -2,7 +2,7 @@ using Microsoft.EntityFrameworkCore; using RhSolutions.Models; using RhSolutions.Api.Services; using RhSolutions.Api.Middleware; -using RhSolutions.MLModifiers; +using RhSolutions.Parsers; using Microsoft.OpenApi.Models; using System.Reflection; using Microsoft.AspNetCore.Identity; diff --git a/RhSolutions.Api/RhSolutions.Api.csproj b/RhSolutions.Api/RhSolutions.Api.csproj index 7690469..dfab389 100644 --- a/RhSolutions.Api/RhSolutions.Api.csproj +++ b/RhSolutions.Api/RhSolutions.Api.csproj @@ -34,7 +34,7 @@ - + diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Adapter.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Adapter.cs deleted file mode 100644 index 78cb9a2..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Adapter.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -public abstract class Adapter : DrinkingWaterHeatingFitting -{ - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - Match diameter = _diameter.Match(input); - if (!diameter.Success) - { - return false; - } - Match thread = _thread.Match(input); - if (!thread.Success) - { - return false; - } - output = $"{_title} {diameter.Groups["Diameter"]} {thread.Groups["Thread"]}"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterExternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterExternal.cs deleted file mode 100644 index 2aeb63e..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterExternal.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Переходник на наружную резьбу")] -public class AdapterExternal : Adapter -{ - protected override string _title => "Переходник с наружной резьбой"; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterInternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterInternal.cs deleted file mode 100644 index 52954bd..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterInternal.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Переходник на внутреннюю резьбу")] -public class AdapterInternal : Adapter -{ - protected override string _title => "Переходник с внутренней резьбой -угольник-переходник"; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs deleted file mode 100644 index 543fb8a..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Переходник с накидной гайкой")] -public class AdapterScrewcap : Adapter -{ - protected override string _title => "Переходник с накидной гайкой"; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerHeating.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerHeating.cs deleted file mode 100644 index 9507ea0..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerHeating.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Фиксатор поворота отопление")] -public class BendFormerHeating : DrinkingWaterHeatingFitting -{ - protected override string _title => "Фиксатор поворота"; - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (!diameterMatch.Success) - { - return false; - } - string diameter = diameterMatch.Groups["Diameter"].Value; - if (diameter == "16") - { - diameter += "/17"; - } - var angleMatch = _angle.Match(input); - string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; - output = $"{_title} {diameter}/{angle}°"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs deleted file mode 100644 index 74bcc09..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Фиксатор поворота водоснабжение")] -public class BendFormerSanitary : DrinkingWaterHeatingFitting -{ - protected override string _title => "Фиксатор поворота с кольцами"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (!diameterMatch.Success) - { - return false; - } - string diameter = diameterMatch.Groups["Diameter"].Value; - var angleMatch = _angle.Match(input); - string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; - output = $"{_title} {angle}° {diameter}"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionBend.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionBend.cs deleted file mode 100644 index 4bdadef..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionBend.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Трубка Г-образная")] -public class ConnectionBend : DrinkingWaterHeatingFitting -{ - private static readonly int[] lengths = [250, 500, 1000]; - private static readonly Regex _pattern = - new(@"([\b\D]|^)?(?16|20|25)(\D+|.*15.*)(?\b\d{3,4})([\b\D]|$)"); - protected override string _title => "Трубка Г-образная"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var match = _pattern.Match(input); - if (!match.Success) - { - return false; - } - string diameter = match.Groups["Diameter"].Value; - int length = int.Parse(match.Groups["Length"].Value); - int nearest = lengths.OrderBy(x => Math.Abs(x - length)).First(); - output = $"{_title} {diameter}/{nearest}"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionTee.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionTee.cs deleted file mode 100644 index 64b5243..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ConnectionTee.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Трубка Т-образная")] -public class ConnectionTee : ConnectionBend -{ - protected override string _title => "Трубка Т-образная"; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Coupling.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Coupling.cs deleted file mode 100644 index 8f12566..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Coupling.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Муфта соединительная")] -public class Coupling : DrinkingWaterHeatingFitting -{ - protected override string _title => "Муфта соединительная"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diametersMatches = _diameter.Matches(input); - if (diametersMatches.Count == 0) - { - return false; - } - var diameters = diametersMatches.Select(x => x.Groups["Diameter"].Value) - .Take(2) - .OrderByDescending(x => int.Parse(x)) - .ToArray(); - if (diameters.Length == 1 || diameters[0] == diameters[1]) - { - output = $"{_title} равнопроходная {diameters[0]}"; - } - else - { - output = $"{_title} переходная {diameters[0]}-{diameters[1]}"; - } - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs deleted file mode 100644 index 50a9943..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -public abstract class DrinkingWaterHeatingFitting : IProductMLModifier -{ - protected static readonly Regex _diameter = - new(@"([\b\D]|^)?(?16|20|25|32|40|50|63)([\b\D]|$)"); - protected static readonly Regex _angle = - new(@"([\b\D])(?45|90)([\b\D]|$)"); - protected static readonly Regex _thread = - new(@"([\b\D])(?1\s+1/4|1\s+1/2|1/2|3/4|2|1)([\b\D]|$)"); - - protected virtual string _title { get; } = string.Empty; - - public virtual bool TryQueryModify(string input, out string output) - { - var match = _diameter.Match(input); - if (match.Success) - { - output = $"{_title} {match.Groups["Diameter"]}"; - return true; - } - else - { - output = string.Empty; - return false; - } - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DummyPlug.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DummyPlug.cs deleted file mode 100644 index 9cf4ba8..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/DummyPlug.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Заглушка труб RAUTITAN")] -public class DummyPlug : DrinkingWaterHeatingFitting -{ - protected override string _title => "Заглушка для полимерн. трубы"; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Elbow.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Elbow.cs deleted file mode 100644 index c762936..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Elbow.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Угольник RAUTITAN")] -public class Elbow : DrinkingWaterHeatingFitting -{ - protected override string _title { get; } = "Угольник -PLATINUM"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (!diameterMatch.Success) - { - return false; - } - string diameter = diameterMatch.Groups["Diameter"].Value; - var angleMatch = _angle.Match(input); - string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; - output = $"{_title} {angle} {diameter}"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Eurocone.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Eurocone.cs deleted file mode 100644 index 4aaa812..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Eurocone.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -public abstract class Eurocone : DrinkingWaterHeatingFitting -{ - protected virtual Dictionary _titles { get; } = new(); - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (diameterMatch.Success) - { - string diameter = diameterMatch.Groups["Diameter"].Value; - if (_titles.TryGetValue(diameter, out string? title)) - { - output = title; - return true; - } - } - return false; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs deleted file mode 100644 index b9a4e09..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Переходник на евроконус")] -public class EuroconeAdapter : DrinkingWaterHeatingFitting -{ - protected override string _title => "Переходник на евроконус"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (diameterMatch.Success) - { - string diameter = diameterMatch.Groups["Diameter"].Value; - output = $"{_title} {diameter}-G 3/4"; - return true; - } - return false; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs deleted file mode 100644 index a011f01..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Резьбозажимное для трубки")] -public class EuroconeConnectionBend : DrinkingWaterHeatingFitting -{ - public override bool TryQueryModify(string input, out string output) - { - output = "Резьбозажимное соединение для металлической трубки G 3/4 -15"; - return true; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeFlex.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeFlex.cs deleted file mode 100644 index d84a92c..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeFlex.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Резьбозажимное flex")] -public class EuroconeFlex : Eurocone -{ - protected override Dictionary _titles => new() - { - ["16"] = "Резьбозажимное соединение flex/pink 16х2,2xG3/4", - ["20"] = "Резьбозажимное соединение flex/pink 20х2,8xG3/4" - }; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeStabil.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeStabil.cs deleted file mode 100644 index 5b8c700..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/EuroconeStabil.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Резьбозажимное stabil")] -public class EuroconeStabil : Eurocone -{ - protected override Dictionary _titles => new() - { - ["16"] = "Резьбозажимное соединение stabil 16,2x2,6xG3/4", - ["20"] = "Резьбозажимное соединение stabil 20x2,9xG3/4" - }; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldG1.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldG1.cs deleted file mode 100644 index 5e364a8..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldG1.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Коллектор G1")] -public class ManifoldG1 : DrinkingWaterHeatingFitting -{ - private static readonly Regex _portsCount = - new(@"\s(?\d{1})\s"); - - protected override string _title => "Распределительный коллектор G1"; - - public override bool TryQueryModify(string input, out string output) - { - var match = _portsCount.Match(input); - if (match.Success) - { - output = $"{_title} {match.Groups["Ports"]}"; - return true; - } - else - { - output = string.Empty; - return false; - } - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldHLV.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldHLV.cs deleted file mode 100644 index 4b895fd..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ManifoldHLV.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Коллектор HLV")] -public class ManifoldHLV : DrinkingWaterHeatingFitting -{ private static readonly Regex _portsCount = - new(@"\s(?\d{1,2})\s"); - - protected override string _title => "Распределительный коллектор HLV"; - - public override bool TryQueryModify(string input, out string output) - { - var match = _portsCount.Match(input); - if (match.Success) - { - output = $"{_title} на {match.Groups["Ports"]} групп"; - return true; - } - else - { - output = string.Empty; - return false; - } - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Nippel.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Nippel.cs deleted file mode 100644 index 12ffa72..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Nippel.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Ниппель")] -public class Nippel : DrinkingWaterHeatingFitting -{ - public override bool TryQueryModify(string input, out string output) - { - output = "К-т двух резьбозажим. нипелей с нар.резьбой 1/2х3/4"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ProtectivePipe.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ProtectivePipe.cs deleted file mode 100644 index aa4f736..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ProtectivePipe.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Гофротруба RAUTITAN")] -public class ProtectivePipe : DrinkingWaterHeatingFitting -{ - protected override string _title => "Гофротруба защитн.для ПЭ-трубы"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (diameterMatch.Success) - { - string diameter = diameterMatch.Groups["Diameter"].Value; - if (diameter == "16") - { - diameter += "/17"; - } - output = $"{_title} {diameter}"; - return true; - } - return false; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs deleted file mode 100644 index d0f494c..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Угольник с накидной гайкой")] -public class ScrewcapElbow : Adapter -{ - protected override string _title => "Угольник-переходник с накидной гайкой"; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Sleeve.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Sleeve.cs deleted file mode 100644 index facb4c6..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/Sleeve.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Монтажная гильза")] -public class Sleeve : DrinkingWaterHeatingFitting -{ - protected override string _title => "Монтажная гильза"; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/SupportingClip.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/SupportingClip.cs deleted file mode 100644 index 955a515..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/SupportingClip.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Желоб")] -public class SupportingClip : DrinkingWaterHeatingFitting -{ - protected override string _title => "Фиксирующий желоб для ПЭ-трубы"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (diameterMatch.Success) - { - string diameter = diameterMatch.Groups["Diameter"].Value; - if (diameter == "16") - { - diameter += "/17"; - } - output = $"{_title} {diameter}"; - return true; - } - return false; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/TPiece.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/TPiece.cs deleted file mode 100644 index f7a5eb9..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/TPiece.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Тройник RAUTITAN")] -public class TPiece : DrinkingWaterHeatingFitting -{ - protected override string _title => "Тройник -PLATINUM"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameters = _diameter.Matches(input) - .Select(match => match.Groups["Diameter"].Value) - .Select(d => int.Parse(d)) - .ToArray(); - if (diameters.Length == 1) - { - output = $"{_title} {diameters[0]}-{diameters[0]}-{diameters[0]}"; - } - else if (diameters.Length >= 3) - { - if (diameters[2] > diameters[0]) - { - output = $"{_title} {diameters[2]}-{diameters[1]}-{diameters[0]}"; - } - else - { - output = $"{_title} {diameters[0]}-{diameters[1]}-{diameters[2]}"; - } - } - else - { - return false; - } - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs deleted file mode 100644 index aaeca67..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Проточный настенный угольник")] -public class ThreadElbowDoubleWallInternal : DrinkingWaterHeatingFitting -{ - protected override string _title => "Проточный настенный угольник"; - private Regex _type = new(@"([\b\Wу])(?длин)([\b\w\.\s])"); - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatches = _diameter.Matches(input); - if (diameterMatches.Count == 0) - { - return false; - } - var threadMatch = _thread.Match(input); - if (!threadMatch.Success) - { - return false; - } - var typeMatch = _type.Match(input); - string[] diameters = diameterMatches.Select(x => x.Groups["Diameter"].Value).ToArray(); - string thread = threadMatch.Groups["Thread"].Value; - string type = typeMatch.Success ? "длинный" : "короткий"; - - output = $"{_title} {diameters[0]}/{(diameters.Length > 1 ? diameters[1] : diameters[0])}-Rp {thread} {type}"; - return true; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs deleted file mode 100644 index 6cebc22..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Угольник с наружной резьбой")] -public class ThreadElbowExternal : Adapter -{ - protected override string _title => "Угольник-переходник с наружной резьбой"; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs deleted file mode 100644 index 4a7e5f4..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Угольник с внутренней резьбой")] -public class ThreadElbowInternal : Adapter -{ - protected override string _title => "Угольник-переходник с внутренней резьбой"; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs deleted file mode 100644 index 4df2e3e..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Угольник настенный наружный")] -public class ThreadElbowWallExternal : DrinkingWaterHeatingFitting -{ - protected override string _title => "Угольник настенный с наружной резьбой"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (!diameterMatch.Success) - { - return false; - } - var threadMatch = _thread.Match(input); - if (!threadMatch.Success) - { - return false; - } - string diameter = diameterMatch.Groups["Diameter"].Value; - string thread = threadMatch.Groups["Thread"].Value; - output = $"{_title} {diameter}-R {thread}"; - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs deleted file mode 100644 index 8a4edb3..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Угольник настенный внутренний")] -public class ThreadElbowWallInternal : DrinkingWaterHeatingFitting -{ - protected override string _title => "Угольник настенный внутр. резьба"; - private Regex _type = new(@"([\b\Wу])(?длин)([\b\w\.\s])"); - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (!diameterMatch.Success) - { - return false; - } - var threadMatch = _thread.Match(input); - if (!threadMatch.Success) - { - return false; - } - var typeMatch = _type.Match(input); - string diameter = diameterMatch.Groups["Diameter"].Value; - string thread = threadMatch.Groups["Thread"].Value; - output = $"{_title} {(typeMatch.Success ? "длинный " : string.Empty)}{diameter}-Rp {thread}"; - return true; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs deleted file mode 100644 index 30b35c3..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Тройник RAUTITAN резьбовой наружный")] -public class ThreadTPieceExternal : DrinkingWaterHeatingFitting -{ - protected override string _title => "Тройник с наружной резьбой"; - - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - MatchCollection diametersMatches = _diameter.Matches(input); - if (diametersMatches.Count == 0) - { - return false; - } - string thread = _thread.Match(input).Groups["Thread"].Value; - int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); - if (diameters.Length == 1) - { - output = $"{_title} {diameters[0]}-{diameters[0]}-R {thread}"; - } - else - { - output = $"{_title} {diameters[0]}-{diameters[1]}-R {thread}"; - } - return true; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs deleted file mode 100644 index b57fffc..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingFittings; - -[MLModifierKey("Тройник RAUTITAN резьбовой внутренний")] -public class ThreadTPieceInternal : DrinkingWaterHeatingFitting -{ - public override bool TryQueryModify(string input, out string output) - { - output = string.Empty; - MatchCollection diametersMatches = _diameter.Matches(input); - if (diametersMatches.Count == 0) - { - return false; - } - string thread = _thread.Match(input).Groups["Thread"].Value; - int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); - if (diameters.Length == 1) - { - if (diameters[0] < 25) - { - output = $"Тройник настенный с внутренней резьбой {diameters[0]}-Rp{thread}-{diameters[0]}"; - } - else - { - output = $"Тройник с внутр. резьбой на боков. проходе {diameters[0]}-Rp {thread}-{diameters[0]}"; - } - } - else - { - if (diameters[0] < 25) - { - output = $"Тройник настенный с внутренней резьбой {diameters[0]}-Rp{thread}-{diameters[1]}"; - } - else - { - output = $"Тройник с внутр. резьбой на боков. проходе {diameters[0]}-Rp {thread}-{diameters[1]}"; - } - } - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/BlackPipe.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/BlackPipe.cs deleted file mode 100644 index 5c8f981..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/BlackPipe.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingPipes; - -[MLModifierKey("Black")] -public class BlackPipe : DrinkingWaterHeatingPipe -{ - protected override string _title => "Black"; - protected override Dictionary _diameterNames => new() - { - [16] = "16х2,2", - [20] = "20х2,8", - [25] = "25х3,5", - [32] = string.Empty, - [40] = string.Empty, - [50] = string.Empty, - [63] = string.Empty - }; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs deleted file mode 100644 index f83d93a..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Text.RegularExpressions; - -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingPipes; - -public abstract class DrinkingWaterHeatingPipe : IProductMLModifier -{ - protected static readonly Regex _diameter = - new(@"([\b\D]|^)?(?16|20|25|32|40|50|63)([\b\D]|$)"); - protected static readonly Regex _type = - new(@"([\b\W])(?бухт|отр|штанг)([\b\w\.\s])"); - protected virtual string _title { get; } = string.Empty; - - protected virtual Dictionary _diameterNames { get; } = new() - { - [16] = "16x2,2", - [20] = "20x2,8", - [25] = "25x3,5", - [32] = "32x4,4", - [40] = "40x5,5", - [50] = "50x6,9", - [63] = "63x8,6" - }; - - protected virtual Dictionary _makeUp { get; } = new() - { - ["бухт"] = "бухта", - ["штанг"] = "прям.отрезки", - ["отр"] = "прям.отрезки" - }; - - public bool TryQueryModify(string input, out string output) - { - output = string.Empty; - var diameterMatch = _diameter.Match(input); - if (!diameterMatch.Success) - { - return false; - } - var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); - var typeMatch = _type.Match(input); - if (typeMatch.Success) - { - var type = typeMatch.Groups["Type"].Value; - output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp[type]}"; - } - else if (diameter < 32) - { - output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["бухт"]}"; - } - else - { - output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["отр"]}"; - } - return true; - } -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/FlexPipe.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/FlexPipe.cs deleted file mode 100644 index b567bb0..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/FlexPipe.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingPipes; - -[MLModifierKey("Flex")] -public class FlexPipe : DrinkingWaterHeatingPipe -{ - protected override string _title => "Flex"; -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/PinkPipe.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/PinkPipe.cs deleted file mode 100644 index e7969a0..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/PinkPipe.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingPipes; - -[MLModifierKey("Pink")] -public class PinkPipe : DrinkingWaterHeatingPipe -{ - protected override string _title => "Pink+"; - - protected override Dictionary _makeUp => new() - { - ["бухт"] = "бухта", - ["штанг"] = "прямые отрезки", - ["отр"] = "прямые отрезки" - }; - protected override Dictionary _diameterNames => new() - { - [16] = "16х2,2", - [20] = "20х2,8", - [25] = "25х3,5", - [32] = "32х4,4", - [40] = "40х5,5", - [50] = "50х6,9", - [63] = "63х8,7" - }; -} diff --git a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/StabilPipe.cs b/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/StabilPipe.cs deleted file mode 100644 index 15cc857..0000000 --- a/RhSolutions.MLModifiers/DrinkingWaterHeatingPipes/StabilPipe.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace RhSolutions.MLModifiers.DrinkingWaterHeatingPipes; - -[MLModifierKey("Stabil")] -public class StabilPipe : DrinkingWaterHeatingPipe -{ - protected override string _title => "Stabil -PLATINUM"; - protected override Dictionary _diameterNames => new() - { - [16] = "16,2х2,6", - [20] = "20х2,9", - [25] = "25х3,7", - [32] = "32х4,7", - [40] = "40х6,0", - [50] = "50x6,9", - [63] = "63x8,6" - }; -} diff --git a/RhSolutions.MLModifiers/IProductMLModifier.cs b/RhSolutions.MLModifiers/IProductMLModifier.cs deleted file mode 100644 index 544fcbe..0000000 --- a/RhSolutions.MLModifiers/IProductMLModifier.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace RhSolutions.MLModifiers; - -public interface IProductMLModifier -{ - public bool TryQueryModify(string query, out string queryModified); -} diff --git a/RhSolutions.MLModifiers/MLModifierKey.cs b/RhSolutions.MLModifiers/MLModifierKey.cs deleted file mode 100644 index 564abea..0000000 --- a/RhSolutions.MLModifiers/MLModifierKey.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace RhSolutions.MLModifiers; - -public class MLModifierKey : Attribute -{ - public string Value { get; private set; } - public MLModifierKey(string value) - { - Value = value; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/MLModifiersRegistration.cs b/RhSolutions.MLModifiers/MLModifiersRegistration.cs deleted file mode 100644 index 57016ea..0000000 --- a/RhSolutions.MLModifiers/MLModifiersRegistration.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using System.Reflection; - -namespace RhSolutions.MLModifiers; - -public static class MLModifiersRegistration -{ - public static void AddModifiers(this IServiceCollection services) - { - var types = AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(s => s.GetTypes()) - .Where(p => p.IsDefined(typeof(MLModifierKey), true)); - - foreach (Type t in types) - { - string key = GetModifierKey(t); - services.AddKeyedTransient(typeof(IProductMLModifier), key, t); - } - } - - private static string GetModifierKey(Type t) - { - return t.GetCustomAttribute()?.Value ?? string.Empty; - } -} \ No newline at end of file diff --git a/RhSolutions.MLModifiers/RhSolutions.MLModifiers.csproj b/RhSolutions.MLModifiers/RhSolutions.MLModifiers.csproj deleted file mode 100644 index e20e8ff..0000000 --- a/RhSolutions.MLModifiers/RhSolutions.MLModifiers.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - diff --git a/RhSolutions.Parsers.Tests/ProductParsersTests.cs b/RhSolutions.Parsers.Tests/ProductParsersTests.cs new file mode 100644 index 0000000..1108a2d --- /dev/null +++ b/RhSolutions.Parsers.Tests/ProductParsersTests.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace RhSolutions.Api.Tests; + +public abstract class ProductParsersTests +{ + public void Invoke(string productType, string query, string expected) + { + var modifier = TestServiceCollection.ServiceProvider?.GetRequiredKeyedService(productType); + string actual = string.Empty; + Assert.That(modifier?.TryParse(query, out actual), Is.True); + Assert.That(actual, Is.EqualTo(expected)); + } +} diff --git a/RhSolutions.Parsers.Tests/RautitanFittingsTests.cs b/RhSolutions.Parsers.Tests/RautitanFittingsTests.cs new file mode 100644 index 0000000..e20fcda --- /dev/null +++ b/RhSolutions.Parsers.Tests/RautitanFittingsTests.cs @@ -0,0 +1,146 @@ + +namespace RhSolutions.Api.Tests; + +public class RautitanFittingsTests : ProductParsersTests +{ + [TestCase("Гильза 16", "Монтажная гильза 16")] + [TestCase("Пресс-втулка 20", "Монтажная гильза 20")] + [TestCase("UPONOR Q&E EVOLUTION КОЛЬЦО БЕЛОЕ 16 '900Ф", "Монтажная гильза 16")] + public void SleeveTest(string query, string modified) + => Invoke(productType: "Монтажная гильза", query, modified); + + [TestCase("Гофра 16", "Гофротруба защитн.для ПЭ-трубы 16/17")] + [TestCase("Гофра 20", "Гофротруба защитн.для ПЭ-трубы 20")] + public void ProtectivePipeTest(string query, string modified) + => Invoke(productType: "Гофротруба RAUTITAN", query, modified); + + [TestCase("Фиксирующий желоб для ПЭ-трубы 16", "Фиксирующий желоб для ПЭ-трубы 16/17")] + [TestCase("Фиксирующий желоб для ПЭ-трубы 20", "Фиксирующий желоб для ПЭ-трубы 20")] + public void SupportingClipTest(string query, string modified) + => Invoke(productType: "Желоб", query, modified); + + [TestCase("Тройник 20-16-16", "Тройник -PLATINUM 20-16-16")] + [TestCase("Тройник 20x16x16", "Тройник -PLATINUM 20-16-16")] + [TestCase("Тройник 20-16-25", "Тройник -PLATINUM 25-16-20")] + public void TPieceTest(string query, string modified) + => Invoke(productType: "Тройник RAUTITAN", query, modified); + + [TestCase("муфта 20", "Муфта соединительная равнопроходная 20")] + [TestCase("переходник 20-16", "Муфта соединительная переходная 20-16")] + [TestCase("переходник 16-20", "Муфта соединительная переходная 20-16")] + [TestCase("Соединение труба-труба 20/20, бронза", "Муфта соединительная равнопроходная 20")] + [TestCase("Муфта соединительная переходная 20x16 для труб из сшитого полиэтилена аксиальный", "Муфта соединительная переходная 20-16")] + public void CouplingTest(string query, string modified) + => Invoke(productType: "Муфта соединительная", query, modified); + + [TestCase("Переходник с внутренней резьбой 16xG 3/4\" для труб из сшитого полиэтилена аксиальный", "Переходник с внутренней резьбой -угольник-переходник 16 3/4")] + public void AdapterInternalTest(string query, string modified) + => Invoke(productType: "Переходник на внутреннюю резьбу", query, modified); + + [TestCase("Угольник 90°, 40 PX", "Угольник -PLATINUM 90 40")] + public void ElbowTest(string query, string modified) + => Invoke(productType: "Угольник RAUTITAN", query, modified); + + [TestCase("Уголок соединительный с ниппелем 20 х 1/2'', бронза", "Угольник-переходник с наружной резьбой 20 1/2")] + public void ThreadElbowExternalTest(string query, string modified) + => Invoke(productType: "Угольник с наружной резьбой", query, modified); + + [TestCase("Уголок соединительный с муфтой 16 х 1/2\", бронза", "Угольник-переходник с внутренней резьбой 16 1/2")] + public void ThreadElbowInternalTest(string query, string modified) + => Invoke(productType: "Угольник с внутренней резьбой", query, modified); + + [TestCase("Угольник-переходник с накидной гайкой 16-G 1/2 RX+", "Угольник-переходник с накидной гайкой 16 1/2")] + [TestCase("Соединение угловое с накидной гайкой 16 х 1/2\", латунь", "Угольник-переходник с накидной гайкой 16 1/2")] + public void ScrewcapElbowTest(string query, string modified) + => Invoke(productType: "Угольник с накидной гайкой", query, modified); + + [TestCase("Тройник с внутр. резьбой на боков. проходе 25-Rp 1/2-25 RX+", "Тройник с внутр. резьбой на боков. проходе 25-Rp 1/2-25")] + [TestCase("Тройник настенный с внутренней резьбой 16-Rp1/2-16 RX+", "Тройник настенный с внутренней резьбой 16-Rp1/2-16")] + public void ThreadTPieceInternalTest(string query, string modified) + => Invoke(productType: "Тройник RAUTITAN резьбовой внутренний", query, modified); + + [TestCase("Тройник RAUTITAN RX+ с наружной резьбой 20-20-R 3/4", "Тройник с наружной резьбой 20-20-R 3/4")] + public void ThreadTPieceExternalTest(string query, string modified) + => Invoke(productType: "Тройник RAUTITAN резьбовой наружный", query, modified); + + [TestCase("Фиксатор поворота трубы 16/17/90°, без колец (оцинк. сталь)", "Фиксатор поворота 16/17/90°")] + [TestCase("Дуга 90° 25", "Фиксатор поворота 25/90°")] + [TestCase("Дуга 90° r/d >= 2.5. Ø25 (767025)", "Фиксатор поворота 25/90°")] + public void BendFormerHeatingTest(string query, string modified) + => Invoke(productType: "Фиксатор поворота отопление", query, modified); + + [TestCase("Фиксатор поворота с кольцами 90°, 32", "Фиксатор поворота с кольцами 90° 32")] + [TestCase("Фиксатор поворота с кольцами 45°, 16", "Фиксатор поворота с кольцами 45° 16")] + public void BendFormerSanitaryTest(string query, string modified) + => Invoke(productType: "Фиксатор поворота водоснабжение", query, modified); + + [TestCase("Угольник настенный с наружной резьбой 16-R 1/2 RX+", "Угольник настенный с наружной резьбой 16-R 1/2")] + public void ThreadElbowWallExternalTest(string query, string modified) + => Invoke(productType: "Угольник настенный наружный", query, modified); + + [TestCase("Угольник настенный с внутр. резьбой 16-Rp 1/2 RX+", "Угольник настенный внутр. резьба 16-Rp 1/2")] + [TestCase("Угольник настенный с длинным патрубком, внутр. резьба 16-Rp 1/2 RX+", "Угольник настенный внутр. резьба длинный 16-Rp 1/2")] + [TestCase("Уголок с настенным креплением, удлиненный, 16 х 1/2'', бронза", "Угольник настенный внутр. резьба длинный 16-Rp 1/2")] + public void ThreadElbowWallInternalTest(string query, string modified) + => Invoke(productType: "Угольник настенный внутренний", query, modified); + + [TestCase("Проточный настенный угольник 16/16-Rp 1/2 длинный RX+", "Проточный настенный угольник 16/16-Rp 1/2 длинный")] + [TestCase("Проточный настенный угольник 16/16-Rp 1/2 короткий RX+", "Проточный настенный угольник 16/16-Rp 1/2 короткий")] + public void ThreadElbowDoubleWallInternalTest(string query, string modified) + => Invoke(productType: "Проточный настенный угольник", query, modified); + + [TestCase("Трубка из. нерж. стали для подкл. радиатора, Г-образная 16/250", "Трубка Г-образная 16/250")] + [TestCase("Монтажная трубка для радиатора, конечная, 16 х 15 х 300 мм", "Трубка Г-образная 16/250")] + public void ConnectionBendTest(string query, string modified) + => Invoke(productType: "Трубка Г-образная", query, modified); + + [TestCase("Трубка из. нерж. стали для подкл. радиатора, Т-образная 16/250", "Трубка Т-образная 16/250")] + [TestCase("Монтажная трубка для радиатора, проходная 20 х 15 х 300 мм", "Трубка Т-образная 20/250")] + public void ConnectionTeeTest(string query, string modified) + => Invoke(productType: "Трубка Т-образная", query, modified); + + [TestCase("Заглушка для полимерн. трубы 16 RX+", "Заглушка для полимерн. трубы 16")] + [TestCase("Заглушка 20", "Заглушка для полимерн. трубы 20")] + [TestCase("Заглушка, 16, латунь", "Заглушка для полимерн. трубы 16")] + public void DummyPlugTest(string query, string modified) + => Invoke(productType: "Заглушка труб RAUTITAN", query, modified); + + [TestCase("Концовка разб. 3/4'' (еврок) для универс. трубы 16", "Резьбозажимное соединение flex/pink 16х2,2xG3/4")] + [TestCase("Переходник компрессионный PEX 20х2.8-G 3/4\" Евроконус", "Резьбозажимное соединение flex/pink 20х2,8xG3/4")] + [TestCase("Резьбозажимное соединение flex/pink 20х2,8xG3/4", "Резьбозажимное соединение flex/pink 20х2,8xG3/4")] + public void EuroconeFlexTest(string query, string modified) + => Invoke(productType: "Резьбозажимное flex", query, modified); + + [TestCase("Резьбозажимное соединение stabil 16,2x2,6xG3/4", "Резьбозажимное соединение stabil 16,2x2,6xG3/4")] + [TestCase("Резьбозажимное соединение stabil 20x2,9xG3/4", "Резьбозажимное соединение stabil 20x2,9xG3/4")] + [TestCase("Концовка разб.3/4''(еврок.) для PE-Xc и PE-MDXс 16", "Резьбозажимное соединение stabil 16,2x2,6xG3/4")] + public void EuroconeStabilTest(string query, string modified) + => Invoke(productType: "Резьбозажимное stabil", query, modified); + + [TestCase("Переходник на евроконус 16-G 3/4", "Переходник на евроконус 16-G 3/4")] + [TestCase("Соед.прям. с вн.резьбой (н.гайка, еврок.) 16 ник.", "Переходник на евроконус 16-G 3/4")] + [TestCase("Переходник с накидной гайкой 16x2.2 -G 3/4\" Евроконус, c гильзой в комплекте", "Переходник на евроконус 16-G 3/4")] + public void EuroconeAdapterTest(string query, string modified) + => Invoke(productType: "Переходник на евроконус", query, modified); + + [TestCase("Резьбозажимное соединение для металлической трубки G 3/4 -15", "Резьбозажимное соединение для металлической трубки G 3/4 -15")] + [TestCase("Концовка для монтажной трубы 15 х 1/2''", "Резьбозажимное соединение для металлической трубки G 3/4 -15")] + [TestCase("Фитинг подключения L и T-образной медной трубки - D15 - G 3/4", "Резьбозажимное соединение для металлической трубки G 3/4 -15")] + public void EuroconeConnectionBendTest(string query, string modified) + => Invoke(productType: "Резьбозажимное для трубки", query, modified); + + [TestCase("Ниппель", "К-т двух резьбозажим. нипелей с нар.резьбой 1/2х3/4")] + public void NippelTest(string query, string modified) + => Invoke(productType: "Ниппель", query, modified); + + [TestCase("Распределительный коллектор G1 2 отвода G 3/4", "Распределительный коллектор G1 2")] + [TestCase("Коллектор Квартирный с отсекающими кранами, латунь ДУ20, НР-ВР 3/4\", 3 контура НР 1/2", "Распределительный коллектор G1 3")] + [TestCase("Коллектор Квартирный с отсекающими кранами, латунь ДУ20, НР-ВР 3/\", 4 контура НР 1/2\"", "Распределительный коллектор G1 4")] + public void ManifoldG1Test(string query, string modified) + => Invoke(productType: "Коллектор G1", query, modified); + + [TestCase("Распределительный коллектор HLV на 2 группы нерж. сталь", "Распределительный коллектор HLV на 2 групп")] + [TestCase("Распределительный коллектор HLV на 12 групп нерж. сталь", "Распределительный коллектор HLV на 12 групп")] + public void ManifoldHLVTest(string query, string modified) + => Invoke(productType: "Коллектор HLV", query, modified); +} diff --git a/RhSolutions.Parsers.Tests/RautitanPipesTests.cs b/RhSolutions.Parsers.Tests/RautitanPipesTests.cs new file mode 100644 index 0000000..12755d9 --- /dev/null +++ b/RhSolutions.Parsers.Tests/RautitanPipesTests.cs @@ -0,0 +1,31 @@ + +namespace RhSolutions.Api.Tests; + +public class RautitanPipesTests : ProductParsersTests +{ + [TestCase("Унив.труба RAUTITAN flex 16x2,2, бухта 100м", "Труба Flex 16x2,2 бухта")] + [TestCase("Труба flex 16", "Труба Flex 16x2,2 бухта")] + [TestCase("Унив.труба RAUTITAN flex 32x4,4, прям.отрезки 6м", "Труба Flex 32x4,4 прям.отрезки")] + [TestCase("Труба flex 32", "Труба Flex 32x4,4 прям.отрезки")] + public void FlexPipeTest(string query, string modified) + => Invoke(productType: "Flex", query, modified); + + [TestCase("Унив. труба RAUTITAN pink+ 16х2,2 мм, бухта 120 м", "Труба Pink+ 16х2,2 бухта")] + [TestCase("труба pink 16", "Труба Pink+ 16х2,2 бухта")] + [TestCase("Унив. труба RAUTITAN pink+ 32х4,4 мм, бухта 50 м", "Труба Pink+ 32х4,4 бухта")] + [TestCase("труба pink 32", "Труба Pink+ 32х4,4 прямые отрезки")] + public void PinkPipeTest(string query, string modified) + => Invoke(productType: "Pink", query, modified); + + [TestCase("Универсальн.труба RAUTITAN stabil 16,2х2,6 мм, бухта 100 м", "Труба Stabil -PLATINUM 16,2х2,6 бухта")] + [TestCase("труба stabil 16", "Труба Stabil -PLATINUM 16,2х2,6 бухта")] + [TestCase("Универсальн.труба RAUTITAN stabil 32х4,7 мм, прям.отрезки 5м", "Труба Stabil -PLATINUM 32х4,7 прям.отрезки")] + [TestCase("труба stabil 32", "Труба Stabil -PLATINUM 32х4,7 прям.отрезки")] + public void StabilPipeTest(string query, string modified) + => Invoke(productType: "Stabil", query, modified); + + [TestCase("Отоп.труба РЕХАУ BLACK 16х2,2 мм, бухта 200 м", "Труба Black 16х2,2 бухта")] + [TestCase("труба BLACK 16", "Труба Black 16х2,2 бухта")] + public void BlackPipeTest(string query, string modified) + => Invoke(productType: "Black", query, modified); +} \ No newline at end of file diff --git a/RhSolutions.Parsers.Tests/RhSolutions.Parsers.Tests.csproj b/RhSolutions.Parsers.Tests/RhSolutions.Parsers.Tests.csproj new file mode 100644 index 0000000..54c5487 --- /dev/null +++ b/RhSolutions.Parsers.Tests/RhSolutions.Parsers.Tests.csproj @@ -0,0 +1,29 @@ + + + + net8.0 + enable + enable + false + false + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/RhSolutions.Parsers.Tests/TestServiceCollection.cs b/RhSolutions.Parsers.Tests/TestServiceCollection.cs new file mode 100644 index 0000000..9f15c89 --- /dev/null +++ b/RhSolutions.Parsers.Tests/TestServiceCollection.cs @@ -0,0 +1,23 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace RhSolutions.Api.Tests; + +[SetUpFixture] +public class TestServiceCollection +{ + public static ServiceProvider? ServiceProvider { get; private set; } + + [OneTimeSetUp] + public void CreateProvider() + { + var collection = new ServiceCollection(); + collection.AddModifiers(); + ServiceProvider = collection.BuildServiceProvider(); + } + + [OneTimeTearDown] + public void DisposeProvider() + { + ServiceProvider?.Dispose(); + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers.Tests/Usings.cs b/RhSolutions.Parsers.Tests/Usings.cs new file mode 100644 index 0000000..af50770 --- /dev/null +++ b/RhSolutions.Parsers.Tests/Usings.cs @@ -0,0 +1,2 @@ +global using NUnit.Framework; +global using RhSolutions.Parsers; \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs new file mode 100644 index 0000000..59da412 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Adapter.cs @@ -0,0 +1,23 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +public abstract class Adapter : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = string.Empty; + Match diameter = _diameter.Match(input); + if (!diameter.Success) + { + return false; + } + Match thread = _thread.Match(input); + if (!thread.Success) + { + return false; + } + output = $"{_title} {diameter.Groups["Diameter"]} {thread.Groups["Thread"]}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs new file mode 100644 index 0000000..af77ee8 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterExternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник на наружную резьбу")] +public class AdapterExternal : Adapter +{ + protected override string _title => "Переходник с наружной резьбой"; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs new file mode 100644 index 0000000..8c1fe92 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterInternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник на внутреннюю резьбу")] +public class AdapterInternal : Adapter +{ + protected override string _title => "Переходник с внутренней резьбой -угольник-переходник"; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs new file mode 100644 index 0000000..8223bb4 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/AdapterScrewcap.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник с накидной гайкой")] +public class AdapterScrewcap : Adapter +{ + protected override string _title => "Переходник с накидной гайкой"; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs new file mode 100644 index 0000000..6a578fb --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerHeating.cs @@ -0,0 +1,25 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Фиксатор поворота отопление")] +public class BendFormerHeating : DrinkingWaterHeatingFitting +{ + protected override string _title => "Фиксатор поворота"; + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + if (diameter == "16") + { + diameter += "/17"; + } + var angleMatch = _angle.Match(input); + string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; + output = $"{_title} {diameter}/{angle}°"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs new file mode 100644 index 0000000..334f3fe --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/BendFormerSanitary.cs @@ -0,0 +1,22 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Фиксатор поворота водоснабжение")] +public class BendFormerSanitary : DrinkingWaterHeatingFitting +{ + protected override string _title => "Фиксатор поворота с кольцами"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + var angleMatch = _angle.Match(input); + string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; + output = $"{_title} {angle}° {diameter}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs new file mode 100644 index 0000000..af54329 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionBend.cs @@ -0,0 +1,27 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Трубка Г-образная")] +public class ConnectionBend : DrinkingWaterHeatingFitting +{ + private static readonly int[] lengths = [250, 500, 1000]; + private static readonly Regex _pattern = + new(@"([\b\D]|^)?(?16|20|25)(\D+|.*15.*)(?\b\d{3,4})([\b\D]|$)"); + protected override string _title => "Трубка Г-образная"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var match = _pattern.Match(input); + if (!match.Success) + { + return false; + } + string diameter = match.Groups["Diameter"].Value; + int length = int.Parse(match.Groups["Length"].Value); + int nearest = lengths.OrderBy(x => Math.Abs(x - length)).First(); + output = $"{_title} {diameter}/{nearest}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs new file mode 100644 index 0000000..72f2015 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ConnectionTee.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Трубка Т-образная")] +public class ConnectionTee : ConnectionBend +{ + protected override string _title => "Трубка Т-образная"; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs new file mode 100644 index 0000000..79ed7b4 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Coupling.cs @@ -0,0 +1,30 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Муфта соединительная")] +public class Coupling : DrinkingWaterHeatingFitting +{ + protected override string _title => "Муфта соединительная"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) + { + return false; + } + var diameters = diametersMatches.Select(x => x.Groups["Diameter"].Value) + .Take(2) + .OrderByDescending(x => int.Parse(x)) + .ToArray(); + if (diameters.Length == 1 || diameters[0] == diameters[1]) + { + output = $"{_title} равнопроходная {diameters[0]}"; + } + else + { + output = $"{_title} переходная {diameters[0]}-{diameters[1]}"; + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs new file mode 100644 index 0000000..218e9e0 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DrinkingWaterHeatingFitting.cs @@ -0,0 +1,30 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +public abstract class DrinkingWaterHeatingFitting : IProductParser +{ + protected static readonly Regex _diameter = + new(@"([\b\D]|^)?(?16|20|25|32|40|50|63)([\b\D]|$)"); + protected static readonly Regex _angle = + new(@"([\b\D])(?45|90)([\b\D]|$)"); + protected static readonly Regex _thread = + new(@"([\b\D])(?1\s+1/4|1\s+1/2|1/2|3/4|2|1)([\b\D]|$)"); + + protected virtual string _title { get; } = string.Empty; + + public virtual bool TryParse(string input, out string output) + { + var match = _diameter.Match(input); + if (match.Success) + { + output = $"{_title} {match.Groups["Diameter"]}"; + return true; + } + else + { + output = string.Empty; + return false; + } + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs new file mode 100644 index 0000000..cf7ec22 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/DummyPlug.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Заглушка труб RAUTITAN")] +public class DummyPlug : DrinkingWaterHeatingFitting +{ + protected override string _title => "Заглушка для полимерн. трубы"; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs new file mode 100644 index 0000000..ccfb7d5 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Elbow.cs @@ -0,0 +1,22 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник RAUTITAN")] +public class Elbow : DrinkingWaterHeatingFitting +{ + protected override string _title { get; } = "Угольник -PLATINUM"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + var angleMatch = _angle.Match(input); + string angle = angleMatch.Success ? angleMatch.Groups["Angle"].Value : "90"; + output = $"{_title} {angle} {diameter}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs new file mode 100644 index 0000000..e82533a --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Eurocone.cs @@ -0,0 +1,22 @@ +namespace RhSolutions.Parsers.Fittings; + +public abstract class Eurocone : DrinkingWaterHeatingFitting +{ + protected virtual Dictionary _titles { get; } = new(); + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + if (_titles.TryGetValue(diameter, out string? title)) + { + output = title; + return true; + } + } + return false; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs new file mode 100644 index 0000000..909bb14 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeAdapter.cs @@ -0,0 +1,20 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Переходник на евроконус")] +public class EuroconeAdapter : DrinkingWaterHeatingFitting +{ + protected override string _title => "Переходник на евроконус"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + output = $"{_title} {diameter}-G 3/4"; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs new file mode 100644 index 0000000..a683fef --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeConnectionBend.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Резьбозажимное для трубки")] +public class EuroconeConnectionBend : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = "Резьбозажимное соединение для металлической трубки G 3/4 -15"; + return true; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs new file mode 100644 index 0000000..7bc1738 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeFlex.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Резьбозажимное flex")] +public class EuroconeFlex : Eurocone +{ + protected override Dictionary _titles => new() + { + ["16"] = "Резьбозажимное соединение flex/pink 16х2,2xG3/4", + ["20"] = "Резьбозажимное соединение flex/pink 20х2,8xG3/4" + }; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs new file mode 100644 index 0000000..bab3765 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/EuroconeStabil.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Резьбозажимное stabil")] +public class EuroconeStabil : Eurocone +{ + protected override Dictionary _titles => new() + { + ["16"] = "Резьбозажимное соединение stabil 16,2x2,6xG3/4", + ["20"] = "Резьбозажимное соединение stabil 20x2,9xG3/4" + }; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs new file mode 100644 index 0000000..2ac2cf1 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldG1.cs @@ -0,0 +1,27 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Коллектор G1")] +public class ManifoldG1 : DrinkingWaterHeatingFitting +{ + private static readonly Regex _portsCount = + new(@"\s(?\d{1})\s"); + + protected override string _title => "Распределительный коллектор G1"; + + public override bool TryParse(string input, out string output) + { + var match = _portsCount.Match(input); + if (match.Success) + { + output = $"{_title} {match.Groups["Ports"]}"; + return true; + } + else + { + output = string.Empty; + return false; + } + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs new file mode 100644 index 0000000..f4a4d48 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ManifoldHLV.cs @@ -0,0 +1,26 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Коллектор HLV")] +public class ManifoldHLV : DrinkingWaterHeatingFitting +{ private static readonly Regex _portsCount = + new(@"\s(?\d{1,2})\s"); + + protected override string _title => "Распределительный коллектор HLV"; + + public override bool TryParse(string input, out string output) + { + var match = _portsCount.Match(input); + if (match.Success) + { + output = $"{_title} на {match.Groups["Ports"]} групп"; + return true; + } + else + { + output = string.Empty; + return false; + } + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs new file mode 100644 index 0000000..9a0b3bf --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Nippel.cs @@ -0,0 +1,11 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Ниппель")] +public class Nippel : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = "К-т двух резьбозажим. нипелей с нар.резьбой 1/2х3/4"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs new file mode 100644 index 0000000..36f028d --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ProtectivePipe.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Гофротруба RAUTITAN")] +public class ProtectivePipe : DrinkingWaterHeatingFitting +{ + protected override string _title => "Гофротруба защитн.для ПЭ-трубы"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + if (diameter == "16") + { + diameter += "/17"; + } + output = $"{_title} {diameter}"; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs new file mode 100644 index 0000000..3a735bc --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ScrewcapElbow.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник с накидной гайкой")] +public class ScrewcapElbow : Adapter +{ + protected override string _title => "Угольник-переходник с накидной гайкой"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs new file mode 100644 index 0000000..f821829 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/Sleeve.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Монтажная гильза")] +public class Sleeve : DrinkingWaterHeatingFitting +{ + protected override string _title => "Монтажная гильза"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs new file mode 100644 index 0000000..8dd4a21 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/SupportingClip.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Желоб")] +public class SupportingClip : DrinkingWaterHeatingFitting +{ + protected override string _title => "Фиксирующий желоб для ПЭ-трубы"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (diameterMatch.Success) + { + string diameter = diameterMatch.Groups["Diameter"].Value; + if (diameter == "16") + { + diameter += "/17"; + } + output = $"{_title} {diameter}"; + return true; + } + return false; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs new file mode 100644 index 0000000..8a80808 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/TPiece.cs @@ -0,0 +1,36 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Тройник RAUTITAN")] +public class TPiece : DrinkingWaterHeatingFitting +{ + protected override string _title => "Тройник -PLATINUM"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameters = _diameter.Matches(input) + .Select(match => match.Groups["Diameter"].Value) + .Select(d => int.Parse(d)) + .ToArray(); + if (diameters.Length == 1) + { + output = $"{_title} {diameters[0]}-{diameters[0]}-{diameters[0]}"; + } + else if (diameters.Length >= 3) + { + if (diameters[2] > diameters[0]) + { + output = $"{_title} {diameters[2]}-{diameters[1]}-{diameters[0]}"; + } + else + { + output = $"{_title} {diameters[0]}-{diameters[1]}-{diameters[2]}"; + } + } + else + { + return false; + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs new file mode 100644 index 0000000..f45bc1f --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowDoubleWallInternal.cs @@ -0,0 +1,32 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Проточный настенный угольник")] +public class ThreadElbowDoubleWallInternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Проточный настенный угольник"; + private Regex _type = new(@"([\b\Wу])(?длин)([\b\w\.\s])"); + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatches = _diameter.Matches(input); + if (diameterMatches.Count == 0) + { + return false; + } + var threadMatch = _thread.Match(input); + if (!threadMatch.Success) + { + return false; + } + var typeMatch = _type.Match(input); + string[] diameters = diameterMatches.Select(x => x.Groups["Diameter"].Value).ToArray(); + string thread = threadMatch.Groups["Thread"].Value; + string type = typeMatch.Success ? "длинный" : "короткий"; + + output = $"{_title} {diameters[0]}/{(diameters.Length > 1 ? diameters[1] : diameters[0])}-Rp {thread} {type}"; + return true; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs new file mode 100644 index 0000000..78741ef --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowExternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник с наружной резьбой")] +public class ThreadElbowExternal : Adapter +{ + protected override string _title => "Угольник-переходник с наружной резьбой"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs new file mode 100644 index 0000000..2246ec6 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowInternal.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник с внутренней резьбой")] +public class ThreadElbowInternal : Adapter +{ + protected override string _title => "Угольник-переходник с внутренней резьбой"; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs new file mode 100644 index 0000000..3f9a66a --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallExternal.cs @@ -0,0 +1,26 @@ +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник настенный наружный")] +public class ThreadElbowWallExternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Угольник настенный с наружной резьбой"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + var threadMatch = _thread.Match(input); + if (!threadMatch.Success) + { + return false; + } + string diameter = diameterMatch.Groups["Diameter"].Value; + string thread = threadMatch.Groups["Thread"].Value; + output = $"{_title} {diameter}-R {thread}"; + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs new file mode 100644 index 0000000..7729304 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadElbowWallInternal.cs @@ -0,0 +1,30 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Угольник настенный внутренний")] +public class ThreadElbowWallInternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Угольник настенный внутр. резьба"; + private Regex _type = new(@"([\b\Wу])(?длин)([\b\w\.\s])"); + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + var threadMatch = _thread.Match(input); + if (!threadMatch.Success) + { + return false; + } + var typeMatch = _type.Match(input); + string diameter = diameterMatch.Groups["Diameter"].Value; + string thread = threadMatch.Groups["Thread"].Value; + output = $"{_title} {(typeMatch.Success ? "длинный " : string.Empty)}{diameter}-Rp {thread}"; + return true; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs new file mode 100644 index 0000000..0a75865 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceExternal.cs @@ -0,0 +1,30 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Тройник RAUTITAN резьбовой наружный")] +public class ThreadTPieceExternal : DrinkingWaterHeatingFitting +{ + protected override string _title => "Тройник с наружной резьбой"; + + public override bool TryParse(string input, out string output) + { + output = string.Empty; + MatchCollection diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) + { + return false; + } + string thread = _thread.Match(input).Groups["Thread"].Value; + int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); + if (diameters.Length == 1) + { + output = $"{_title} {diameters[0]}-{diameters[0]}-R {thread}"; + } + else + { + output = $"{_title} {diameters[0]}-{diameters[1]}-R {thread}"; + } + return true; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs new file mode 100644 index 0000000..c0d939f --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingFittings/ThreadTPieceInternal.cs @@ -0,0 +1,42 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Fittings; + +[ParserKey("Тройник RAUTITAN резьбовой внутренний")] +public class ThreadTPieceInternal : DrinkingWaterHeatingFitting +{ + public override bool TryParse(string input, out string output) + { + output = string.Empty; + MatchCollection diametersMatches = _diameter.Matches(input); + if (diametersMatches.Count == 0) + { + return false; + } + string thread = _thread.Match(input).Groups["Thread"].Value; + int[] diameters = diametersMatches.Select(match => int.Parse(match.Groups["Diameter"].Value)).ToArray(); + if (diameters.Length == 1) + { + if (diameters[0] < 25) + { + output = $"Тройник настенный с внутренней резьбой {diameters[0]}-Rp{thread}-{diameters[0]}"; + } + else + { + output = $"Тройник с внутр. резьбой на боков. проходе {diameters[0]}-Rp {thread}-{diameters[0]}"; + } + } + else + { + if (diameters[0] < 25) + { + output = $"Тройник настенный с внутренней резьбой {diameters[0]}-Rp{thread}-{diameters[1]}"; + } + else + { + output = $"Тройник с внутр. резьбой на боков. проходе {diameters[0]}-Rp {thread}-{diameters[1]}"; + } + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs new file mode 100644 index 0000000..ca94117 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/BlackPipe.cs @@ -0,0 +1,17 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Black")] +public class BlackPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Black"; + protected override Dictionary _diameterNames => new() + { + [16] = "16х2,2", + [20] = "20х2,8", + [25] = "25х3,5", + [32] = string.Empty, + [40] = string.Empty, + [50] = string.Empty, + [63] = string.Empty + }; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs new file mode 100644 index 0000000..f3e0fc2 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/DrinkingWaterHeatingPipe.cs @@ -0,0 +1,56 @@ +using System.Text.RegularExpressions; + +namespace RhSolutions.Parsers.Pipes; + +public abstract class DrinkingWaterHeatingPipe : IProductParser +{ + protected static readonly Regex _diameter = + new(@"([\b\D]|^)?(?16|20|25|32|40|50|63)([\b\D]|$)"); + protected static readonly Regex _type = + new(@"([\b\W])(?бухт|отр|штанг)([\b\w\.\s])"); + protected virtual string _title { get; } = string.Empty; + + protected virtual Dictionary _diameterNames { get; } = new() + { + [16] = "16x2,2", + [20] = "20x2,8", + [25] = "25x3,5", + [32] = "32x4,4", + [40] = "40x5,5", + [50] = "50x6,9", + [63] = "63x8,6" + }; + + protected virtual Dictionary _makeUp { get; } = new() + { + ["бухт"] = "бухта", + ["штанг"] = "прям.отрезки", + ["отр"] = "прям.отрезки" + }; + + public bool TryParse(string input, out string output) + { + output = string.Empty; + var diameterMatch = _diameter.Match(input); + if (!diameterMatch.Success) + { + return false; + } + var diameter = int.Parse(diameterMatch.Groups["Diameter"].Value); + var typeMatch = _type.Match(input); + if (typeMatch.Success) + { + var type = typeMatch.Groups["Type"].Value; + output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp[type]}"; + } + else if (diameter < 32) + { + output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["бухт"]}"; + } + else + { + output = $"Труба {_title} {_diameterNames[diameter]} {_makeUp["отр"]}"; + } + return true; + } +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs new file mode 100644 index 0000000..4a98634 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/FlexPipe.cs @@ -0,0 +1,7 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Flex")] +public class FlexPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Flex"; +} \ No newline at end of file diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs new file mode 100644 index 0000000..d40483a --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/PinkPipe.cs @@ -0,0 +1,24 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Pink")] +public class PinkPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Pink+"; + + protected override Dictionary _makeUp => new() + { + ["бухт"] = "бухта", + ["штанг"] = "прямые отрезки", + ["отр"] = "прямые отрезки" + }; + protected override Dictionary _diameterNames => new() + { + [16] = "16х2,2", + [20] = "20х2,8", + [25] = "25х3,5", + [32] = "32х4,4", + [40] = "40х5,5", + [50] = "50х6,9", + [63] = "63х8,7" + }; +} diff --git a/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs new file mode 100644 index 0000000..1a52562 --- /dev/null +++ b/RhSolutions.Parsers/DrinkingWaterHeatingPipes/StabilPipe.cs @@ -0,0 +1,17 @@ +namespace RhSolutions.Parsers.Pipes; + +[ParserKey("Stabil")] +public class StabilPipe : DrinkingWaterHeatingPipe +{ + protected override string _title => "Stabil -PLATINUM"; + protected override Dictionary _diameterNames => new() + { + [16] = "16,2х2,6", + [20] = "20х2,9", + [25] = "25х3,7", + [32] = "32х4,7", + [40] = "40х6,0", + [50] = "50x6,9", + [63] = "63x8,6" + }; +} diff --git a/RhSolutions.Parsers/IProductParser.cs b/RhSolutions.Parsers/IProductParser.cs new file mode 100644 index 0000000..485ff7e --- /dev/null +++ b/RhSolutions.Parsers/IProductParser.cs @@ -0,0 +1,6 @@ +namespace RhSolutions.Parsers; + +public interface IProductParser +{ + public bool TryParse(string input, out string output); +} diff --git a/RhSolutions.Parsers/ParserKey.cs b/RhSolutions.Parsers/ParserKey.cs new file mode 100644 index 0000000..3bf4513 --- /dev/null +++ b/RhSolutions.Parsers/ParserKey.cs @@ -0,0 +1,10 @@ +namespace RhSolutions.Parsers; + +public class ParserKey : Attribute +{ + public string Value { get; private set; } + public ParserKey(string value) + { + Value = value; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/ParsersRegistration.cs b/RhSolutions.Parsers/ParsersRegistration.cs new file mode 100644 index 0000000..54f34be --- /dev/null +++ b/RhSolutions.Parsers/ParsersRegistration.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; + +namespace RhSolutions.Parsers; + +public static class ParsersRegistration +{ + public static void AddModifiers(this IServiceCollection services) + { + var types = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(s => s.GetTypes()) + .Where(p => p.IsDefined(typeof(ParserKey), true)); + + foreach (Type t in types) + { + string key = GetModifierKey(t); + services.AddKeyedTransient(typeof(IProductParser), key, t); + } + } + + private static string GetModifierKey(Type t) + { + return t.GetCustomAttribute()?.Value ?? string.Empty; + } +} \ No newline at end of file diff --git a/RhSolutions.Parsers/RhSolutions.Parsers.csproj b/RhSolutions.Parsers/RhSolutions.Parsers.csproj new file mode 100644 index 0000000..e20e8ff --- /dev/null +++ b/RhSolutions.Parsers/RhSolutions.Parsers.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + -- cgit v1.2.3