feat: export/import for ScrapedTags (#46)#48
Merged
astar-development-jb merged 5 commits intoJun 27, 2026
Conversation
…ble rules feat: add original C# developer guidelines file fix: update settings.json to include 'graphify' in spell check
14 new tests in GivenAnImportExportService covering tag file I/O paths. 4 new tests in GivenAScrapedTagService covering export and upsert behaviour. All fail to compile — production interfaces/classes do not exist yet. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ApplicationMetadata.ScrapedTagsExportFilePath (~/Documents/Scrapper/ScrapedTags.json) - DTOs/ScrapedTagExtensions: list-level ToDtos/ToDomain - Repositories/TagData: extracted to own file (one type per file) - IScrapedTagRepository: GetAllAsync + UpsertAsync (batched, no N+1) - IScrapedTagService + ScrapedTagService: export/import via repository - IImportExportService: ExportScrapedTagsToFile + ImportScrapedTagsFromFile - ImportExportService: implements tag I/O methods; sealed - MainWindow: ExportTagsButton + ImportTagsButton with disable/enable lifecycle - 15 new tests (GivenAnImportExportService + GivenAScrapedTagService); 70 total, all green Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ScrapedTagExtensions (DTOs): add single-item ToDomain/ToDto; list methods delegate to avoid duplication - ScrapedTagExtensions (Repositories): add using aliases for all three qualified type names - GivenAScrapedTagService: rename ActionTagCategory -> GenreCategory; simplify Returns(Task.FromResult) -> Returns - GivenAnImportExportService: add when_importing_valid_tags_then_second_tag_category_is_mapped test Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Directory.Build.props:
- Fix test-project condition to match *.Tests.Unit / *.Tests.Integration
- Suppress CA1707 (snake_case test method names per repo convention)
- Suppress CA1859 (sut typed to interface in tests)
AStar.Dev.FunctionalParadigm:
- Split Result.cs into non-generic Result factory + Result{TResult,TError} record
to resolve CA1000 (static members on generic type)
- Update all 9 test files to use Result.Success/Failure factory methods
- Suppress CA1716 (Option name is intentional FP convention)
AStar.Dev.Guard.Clauses:
- Rename parameter @object -> value (CA1720)
Project files:
- Remove per-project TargetFramework/Nullable/ImplicitUsings (inherited globally)
- Update xunit.runner.visualstudio 2.9.3 -> 3.0.0 (NU1603)
- Override Tmds.DBus.Protocol to 0.93.0 (NU1903)
- Suppress GHSA-2m69-gcr7-jv3q for SQLitePCLRaw (NU1903)
AStar.Dev.Wallpaper.Scrapper production:
- Fix unreachable code in SearchWorkflow/SearchWorkflowFunctional (CS0162)
- Remove unused imagePageService field in SearchWorkflowFunctional (CS0414)
- MainWindow implements IDisposable; dispose CTS on Close (CA1001)
- Add GC.SuppressFinalize to DisposeAsync in ViewModel + PlaywrightService (CA1816)
- Seal ImageSaveHelper (CA1852)
- StringComparison.OrdinalIgnoreCase in ImagePage (CA1309)
- Replace IndexOf(" ") with IndexOf(' ') in page classes (CA1865)
- Add CultureInfo.InvariantCulture to Parse/format calls (CA1305)
- FileClassificationService: client-side HashSet for OrdinalIgnoreCase matching (CA1304/CA1311/CA1862)
- StringComparison.Ordinal to StartsWith in ChromeCookieExtractor (CA1310)
- CultureInfo.InvariantCulture to Serilog sinks + StatusLogSink (CA1305)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
astar-development-jb
approved these changes
Jun 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
FileClassificationexport/import pattern forScrapedTagentities~/Documents/Scrapper/ScrapedTags.json; imports with upsert semantics (match onValue + Category, updateIncludeInSearchon existing rows)MainWindow: Export Tags / Import Tags with disable/enable lifecycleChanges
ApplicationMetadata.ScrapedTagsExportFilePath— new export path; both paths switched fromPath.CombinetoCombinePathextensionDTOs/ScrapedTagExtensions— list-levelToDtos/ToDomainRepositories/TagData— extracted to its own file (one type per file rule)IScrapedTagRepository—GetAllAsync+UpsertAsync(batched lookup, no N+1)IScrapedTagService+ScrapedTagService— export/import via repository; wired into DI as interfaceIImportExportService—ExportScrapedTagsToFile+ImportScrapedTagsFromFileImportExportService— implements both tag I/O methods; nowsealedMainWindow—ExportTagsButton+ImportTagsButtonhandlers following functional pipeline patternTest plan
GivenAnImportExportService, 1 renamed + 1 added inGivenAScrapedTagService)Closes #46
🤖 Generated with Claude Code