Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
90618e2
Bump actions/upload-artifact from 4.4.3 to 4.6.1
dependabot[bot] Feb 24, 2025
d1f1075
Bump actions/download-artifact from 4.1.8 to 4.1.9
dependabot[bot] Feb 26, 2025
0271cac
Подавление предуприджения CS1591 об отсутствии xml-комментария у член…
Infarh Nov 18, 2025
ad464c5
Добавлены скрипты для получения версии пакета и проекта
Infarh Dec 13, 2025
7b5dc62
Обновление версий и эксперименты с методами-расширениями
Infarh Dec 13, 2025
11e07b8
Добавлена подробная документация к классу Arc
Infarh Dec 13, 2025
06ba5bf
Улучшена логика дуги Arc и добавлены модульные тесты
Infarh Dec 13, 2025
42c196d
Добавлены инструкции по написанию тестов на MSTest
Infarh Dec 13, 2025
88f8358
Добавлен IsAligned и тесты, улучшена документация Pie
Infarh Dec 13, 2025
91d8689
Улучшена читаемость и комментирование DrawGeometry
Infarh Dec 13, 2025
70a038e
Заготовка визуального элемента "Стрелка"
Infarh Dec 13, 2025
c41862c
Добавлено свойство ArrowHeadOffset для стрелки Arrow
Infarh Dec 13, 2025
35a32a7
Добавлены расширения LineEx для WPF Line и тесты
Infarh Dec 13, 2025
497f68d
Изменён стартовый Window и добавлены связанные линии
Infarh Dec 13, 2025
40770e6
XML-комментарии к реализациям поведений
Infarh Dec 13, 2025
06a8ebc
Исправление логики в поведениях
Infarh Dec 13, 2025
4364575
Добавлен документ с рекомендациями по улучшению Behaviors
Infarh Dec 13, 2025
087a540
Добавлен README.md с документацией по WPF-поведениям
Infarh Dec 13, 2025
1ac3f6b
Обновлены требования к оформлению модульных тестов
Infarh Dec 13, 2025
2536877
Initial plan
Copilot Dec 14, 2025
b2d4fb6
Merge pull request #229 from Infarh/copilot/audit-converters-document…
Infarh Dec 14, 2025
d262b5f
Merge branch 'dev' into dependabot/github_actions/actions/download-ar…
Infarh Dec 14, 2025
a4d5707
Merge pull request #220 from Infarh/dependabot/github_actions/actions…
Infarh Dec 14, 2025
b956b3f
Merge pull request #219 from Infarh/dependabot/github_actions/actions…
Infarh Dec 14, 2025
16da26a
План рефакторинга
Infarh Dec 14, 2025
3abab78
Перечень конвертеров для рефакторинга
Infarh Dec 14, 2025
e99aa7d
Создан подробный план рефакторинга с описанием требуемых изменений по…
Infarh Dec 14, 2025
54da5db
Добавление XML-комментариев
Infarh Dec 14, 2025
80c41a2
Подготовка к следующему этапу рефаторинга конвертеров
Infarh Dec 14, 2025
e320725
Подготовка к рефакторингу
Infarh Dec 14, 2025
c7fd412
Добавлен подробный README.md по WPF-конвертерам
Infarh Dec 14, 2025
e4f47f6
Модульные тесты конвертеров
Infarh Dec 14, 2025
116bc5f
Улучшена документация и форматирование BarnsleyFern
Infarh Dec 14, 2025
c624b8d
Добавлена документация и рефакторинг AutoComplete
Infarh Dec 14, 2025
e753c4a
Улучшен менеджер элементов WPF, добавлены контроллеры и триггеры
Infarh Dec 14, 2025
40396e6
Улучшена документация и локализация класса GIF
Infarh Dec 14, 2025
a58255a
Удалён файл подавления предупреждений GlobalSuppressions.cs
Infarh Dec 14, 2025
8c0e47c
Расширение ItemsCollection<T>: события, IDisposable, подписки
Infarh Dec 14, 2025
ef61ef4
Добавлены модульные тесты и документация для ItemsCollection<T>
Infarh Dec 14, 2025
c9e263c
Улучшена EventBinding: документация, очистка, надёжность
Infarh Dec 14, 2025
1ad9bdd
Комментарии для FileSystem
Infarh Dec 14, 2025
5a7da78
Добавлены XML-комментарии и улучшена документация класса
Infarh Dec 14, 2025
d9f47c3
Добавлены русские XML-комментарии и переведены пояснения
Infarh Dec 14, 2025
49cc0ff
Добавлена поддержка пользовательских XML-namespace в XAML
Infarh Dec 14, 2025
6297e68
Улучшена обёртка ThreadSafeObservableCollectionWrapper
Infarh Dec 14, 2025
4bcc94f
Улучшена и локализована XML-документация (ru)
Infarh Dec 14, 2025
aaac97b
Улучшения и рефакторинг Watermark для WPF
Infarh Dec 14, 2025
9de0c8c
Заготовка механизма показа всплывающих уведомлений.
Infarh Dec 14, 2025
d2cffdd
Доработана выгрузка приложения в момент отображения всплывающих сообщ…
Infarh Dec 14, 2025
eea8649
Обновлён рендеринг иконок уведомлений: glyph + фон
Infarh Dec 14, 2025
8d6cecd
Bump actions/upload-artifact from 4.6.1 to 6.0.0
dependabot[bot] Dec 15, 2025
91164a8
Bump actions/checkout from 4 to 6
dependabot[bot] Dec 15, 2025
f46cbed
Bump actions/cache from 4 to 5
dependabot[bot] Dec 15, 2025
8db61e1
Bump actions/setup-dotnet from 4 to 5
dependabot[bot] Dec 15, 2025
e3611c8
Bump actions/download-artifact from 5 to 7
dependabot[bot] Dec 15, 2025
6f1c931
Обновление пакетов
Infarh Dec 17, 2025
8a2c3e1
Переход на новый формат решения .slnx (XML)
Infarh Dec 17, 2025
42efcbd
Удаление поддержки устаревших платформ .NET
Infarh Dec 17, 2025
c8309d9
Рефакторинг файла проекта
Infarh Dec 17, 2025
a6df1e1
v0.0.49
Infarh Dec 17, 2025
01a361d
Merge pull request #231 from Infarh/dependabot/github_actions/actions…
Infarh Dec 17, 2025
2b135de
Merge pull request #230 from Infarh/dependabot/github_actions/actions…
Infarh Dec 17, 2025
6e6137f
Merge pull request #232 from Infarh/dependabot/github_actions/actions…
Infarh Dec 17, 2025
11a6bbf
Merge pull request #233 from Infarh/dependabot/github_actions/actions…
Infarh Dec 17, 2025
5a579a4
Merge pull request #234 from Infarh/dependabot/github_actions/actions…
Infarh Dec 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,19 @@ public string PropertyName { get; set => Set(ref field, value); }

## Совместимость целей
- В рабочем пространстве используются целевые платформы: `.NET Standard 2.0` и `.NET 10`
- Применяй современные возможности языка и платформы только если они доступны для соответствующей целевой платформы проекта
- Применяй современные возможности языка и платформы только если они доступны для соответствующей целевой платформы проекта

## Модульные тесты с использованием MSTest
- Используй платформу MSTest для написания модульных тестов
- Классы тестов должны быть помечены атрибутом `[TestClass]`
- Методы тестов должны быть помечены атрибутом `[TestMethod]`
- Для параметризованных тестов используй `[DataTestMethod]` и `[DataRow]`
- Следуй паттерну Arrange-Act-Assert (AAA) при написании тестов
- Каждый тест должен проверять только одно поведение
- Избегай использования статических полей в тестах
- Убедись, что тесты могут выполняться в любом порядке и параллельно
- Для проверки исключений используй `Assert.ThrowsException`
- Используй `Debug.WriteLine` для вывода отладочной информации о процессе выполнения тестов, если в тесте есть промежуточные вычисления
- При написании Assert-методов добавляй сообщения об ошибках на русском языке
- Файлы модульных тестов должны создаваться с учётом структуры каталогов тестируемого кода
- Каждый модульный тест должен быть снабжён XML‑документацией, описывающей его назначение и поведение
14 changes: 7 additions & 7 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x

- name: Cache NuGet
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
Expand All @@ -46,7 +46,7 @@ jobs:

- name: Building
run: |
dotnet build MathCore.WPF -c Release --no-restore --nowarn:CS1998,CS8625,CS8600,CS8603,CS8620,CS8618,CS8604,CS8602,CS8622,CS8619,CS8632,CS0108,NU1701,NU1702,MSB3277,NU1701
dotnet build MathCore.WPF -c Release --no-restore --nowarn:CS1998,CS8625,CS8600,CS8603,CS8620,CS8618,CS8604,CS8602,CS8622,CS8619,CS8632,CS0108,NU1701,NU1702,MSB3277,NU1701,CS1591
dotnet build Tests/MathCore.WPF.Tests -c Release --no-restore

- name: Test
Expand All @@ -56,7 +56,7 @@ jobs:
run: dotnet pack MathCore.WPF/MathCore.WPF.csproj --no-build -c Release -v q -o ${{ github.workspace }}/ReleasePack --include-symbols

- name: Upload build artifacts
uses: actions/upload-artifact@v4.4.3
uses: actions/upload-artifact@v6.0.0
with:
name: Release
path: ${{ github.workspace }}/ReleasePack
Expand All @@ -69,7 +69,7 @@ jobs:

steps:
- name: Get artifact
uses: actions/download-artifact@v5
uses: actions/download-artifact@v7
id: download
with:
name: Release
Expand All @@ -85,7 +85,7 @@ jobs:

steps:
- name: Get artifact
uses: actions/download-artifact@v5
uses: actions/download-artifact@v7
id: download
with:
name: Release
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x

Expand Down
120 changes: 120 additions & 0 deletions .tools/nuget-get-last-version.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
#!/usr/bin/env dotnet
#:package NuGet.Protocol@6.10.1
#:package NuGet.Configuration@6.10.1
#:package NuGet.Versioning@6.10.1
#:package NuGet.Common@6.10.1

/*
Использование:
dotnet run nuget-get-last-version.cs [<путь_к_.csproj> | <идентификатор_пакета>]


Коды возврата:
0 — успешное завершение
-1 — запрос помощи (--help, -h)
-2 — ошибка использования (отсутствует аргумент, пустой аргумент)
1 — непредвиденная ошибка выполнения (catch)
2 — ошибка чтения/парсинга .csproj
3 — отсутствуют элементы <PackageReference> в .csproj
5 — версия пакета не найдена
*/

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Configuration;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
using NuGet.Versioning;
using NuGet.Common; // для NullLogger

if (args.Length < 1)
{
Console.Error.WriteLine("Не указан путь к .csproj"); // ошибка использования
Console.Out.WriteLine("Использование: dotnet run nuget-get-last-version.cs [<путь_к_.csproj> | <идентификатор_пакета>]");
Environment.Exit(-2);
}

var input = args[0].Trim();
if (input.Length == 0)
{
Console.Error.WriteLine("Аргумент пуст"); // ошибка использования
Console.Out.WriteLine("Использование: dotnet run nuget-get-last-version.cs [<путь_к_.csproj> | <идентификатор_пакета>]");
Environment.Exit(-2);
}

if(input == "--help" || input == "-h")
{
Console.Out.WriteLine("Использование: dotnet run nuget-get-last-version.cs [<путь_к_.csproj> | <идентификатор_пакета>]");
Environment.Exit(-1);
}

// Если передан путь к .csproj, извлечь идентификатор пакета из PackageReference
string package_id;
if (File.Exists(input) && string.Equals(Path.GetExtension(input), ".csproj", StringComparison.OrdinalIgnoreCase))
try
{
var xml = XDocument.Load(input); // загрузка проекта
// Пытаемся найти ссылку на пакет MathCore, иначе берём первый PackageReference
var pkg_mathcore = xml
.Root?
.Descendants("PackageReference")
.FirstOrDefault(e => string.Equals((string?)e.Attribute("Include"), "MathCore", StringComparison.OrdinalIgnoreCase));

var pkg = pkg_mathcore ?? xml.Root?.Descendants("PackageReference").FirstOrDefault();
package_id = (string?)pkg?.Attribute("Include") ?? string.Empty;

if (string.IsNullOrWhiteSpace(package_id))
{
Console.Error.WriteLine("В .csproj не найдены элементы <PackageReference>"); // отсутствуют требуемые данные
Environment.Exit(3);
}
}
catch (Exception e)
{
Console.Error.WriteLine($"Ошибка чтения .csproj: {e.Message}"); // ошибка парсинга
Environment.Exit(2);
return;
}
else
package_id = input; // непосредственно ID пакета

try
{
if (await GetLatestStableVersionAsync(package_id, CancellationToken.None) is not { } version)
{
Console.Error.WriteLine($"Не удалось определить последнюю версию пакета {package_id}"); // ресурс/версия не найдены
Environment.Exit(5);
}

Console.Out.Write(version.ToString()); // вывод версии
}
catch (Exception e)
{
Console.Error.WriteLine($"Ошибка: {e.Message}"); // общая непредвиденная ошибка выполнения
Environment.Exit(1);
}

static async Task<NuGetVersion?> GetLatestStableVersionAsync(string PackageId, CancellationToken Cancel)
{
var providers = Repository.Provider.GetCoreV3(); // провайдеры ресурсов
var source = new PackageSource("https://api.nuget.org/v3/index.json"); // индекс nuget.org
var repo = new SourceRepository(source, providers);

var metadata = await repo.GetResourceAsync<PackageMetadataResource>(Cancel); // ресурс метаданных
var search = await metadata.GetMetadataAsync(
PackageId,
includePrerelease: true,
includeUnlisted: false,
new SourceCacheContext(),
NullLogger.Instance,
Cancel);

var versions = search.Select(m => m.Identity.Version).OrderBy(v => v); // сортировка по возрастанию
var latest_stable = versions.LastOrDefault(v => !v.IsPrerelease); // последняя стабильная

return latest_stable ?? versions.LastOrDefault(); // если стабильной нет, взять последнюю вообще
}
50 changes: 50 additions & 0 deletions .tools/version.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#!/usr/bin/env dotnet

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

if (args.Length < 1)
{
Console.Error.WriteLine("Укажите путь к .csproj файлу"); // проверка аргументов
Environment.Exit(1);
}

var project_path = args[0]; // путь к проекту

if (!File.Exists(project_path))
{
Console.Error.WriteLine($"Файл не найден: {project_path}"); // проверка наличия файла
Environment.Exit(2);
}

XDocument doc;
try
{
doc = XDocument.Load(project_path); // загрузка XML
}
catch (Exception e)
{
Console.Error.WriteLine($"Ошибка загрузки XML: {e.Message}"); // ошибка парсинга
Environment.Exit(3);
return;
}

// поиск версии в PropertyGroup/Version
var version = doc
.Root?
.Descendants("PropertyGroup")
.Elements("Version")
.Select(v => (string?)v.Value)
.FirstOrDefault(v => !string.IsNullOrWhiteSpace(v));

if (string.IsNullOrWhiteSpace(version))
{
Console.Error.WriteLine("Свойство <Version> не найдено"); // версия не обнаружена
Environment.Exit(4);
}
else
{
Console.Out.Write(version.Trim()); // вывод версии в stdout
}
68 changes: 0 additions & 68 deletions MathCore.WPF.sln

This file was deleted.

23 changes: 23 additions & 0 deletions MathCore.WPF.slnx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Solution>
<Folder Name="/.Service/">
<File Path=".editorconfig" />
<File Path=".tools/version.cs" />
</Folder>
<Folder Name="/.Service/.github/">
<File Path=".github/copilot-instructions.md" />
</Folder>
<Folder Name="/.Service/.github/workflows/">
<File Path=".github/workflows/publish.yml" />
<File Path=".github/workflows/testing.yml" />
</Folder>
<Folder Name="/.Service/tools/">
<File Path=".tools/nuget-get-last-version.cs" />
<File Path=".tools/version.cs" />
</Folder>
<Folder Name="/Tests/">
<Project Path="Tests/MathCore.WPF.ConsoleTest/MathCore.WPF.ConsoleTest.csproj" />
<Project Path="Tests/MathCore.WPF.Tests/MathCore.WPF.Tests.csproj" />
<Project Path="Tests/MathCore.WPF.WindowTest/MathCore.WPF.WindowTest.csproj" />
</Folder>
<Project Path="MathCore.WPF/MathCore.WPF.csproj" />
</Solution>
Loading