• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

abatar1 / CyclicalFileWatcher / 15101239823

18 May 2025 11:43PM UTC coverage: 52.149% (+40.5%) from 11.672%
15101239823

push

github

abatar1
Refactor and modularize file watcher implementation.

Introduced interfaces and modular components to improve flexibility and testability of the file watcher system. Implemented `FileWatchProcessor`, `IFileStateStorage`, and `IFileSystemProxy` for clearer responsibilities, and replaced inline logic with reusable abstractions. Added comprehensive inline comments and enforced proper resource management with asynchronous disposals.

29 of 68 branches covered (42.65%)

Branch coverage included in aggregate %.

92 of 134 new or added lines in 7 files covered. (68.66%)

4 existing lines in 2 files now uncovered.

153 of 281 relevant lines covered (54.45%)

11.5 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

41.67
/src/CyclicalFileWatcher/CyclicalFileWatcher.cs
1
using System;
2
using System.Threading;
3
using System.Threading.Tasks;
4
using FileWatcher.Base;
5
using FileWatcher.Internals;
6

7
namespace FileWatcher;
8

9
/// <summary>
10
/// Represents a cyclical file watcher that monitors file changes and allows subscribing
11
/// to file state updates. This class facilitates managing file states, retrieving the
12
/// latest file information, and providing mechanisms to handle file updates asynchronously.
13
/// </summary>
14
/// <typeparam name="TFileStateContent">
15
/// The type of content for file state management. It must implement the <see cref="IFileStateContent"/> interface.
16
/// </typeparam>
17
public sealed class CyclicalFileWatcher<TFileStateContent> : IFileWatcher<TFileStateContent>
18
    where TFileStateContent : IFileStateContent
19
{
20
    private readonly IFileStateManager<TFileStateContent> _fileStateManager;
21
    private readonly FileSubscriptionManager<TFileStateContent> _subscriptionManager;
22
    
UNCOV
23
    public CyclicalFileWatcher(IFileStateManagerConfiguration configuration)
×
24
    {
UNCOV
25
        _subscriptionManager = new FileSubscriptionManager<TFileStateContent>();
×
NEW
26
        var fileProxy = new FileSystemProxy();
×
NEW
27
        var repository = new FileStateStorageRepository<TFileStateContent>(fileProxy);
×
NEW
28
        var lockProvider = new ReadWriteLockProvider();
×
NEW
29
        var processor = new FileWatchProcessor<TFileStateContent>(configuration, _subscriptionManager, lockProvider, repository);
×
NEW
30
        _fileStateManager = new FileStateManager<TFileStateContent>(repository, processor, lockProvider, fileProxy);
×
UNCOV
31
    }
×
32
    
33
    internal CyclicalFileWatcher(IFileStateManagerConfiguration configuration, 
1✔
34
        IFileStateStorageRepository<TFileStateContent> repository, 
1✔
35
        IFileSystemProxy fileSystemProxy)
1✔
36
    {
37
        _subscriptionManager = new FileSubscriptionManager<TFileStateContent>();
1✔
38
        var lockProvider = new ReadWriteLockProvider();
1✔
39
        var processor = new FileWatchProcessor<TFileStateContent>(configuration, _subscriptionManager, lockProvider, repository);
1✔
40
        _fileStateManager = new FileStateManager<TFileStateContent>(repository, processor, lockProvider, fileSystemProxy);
1✔
41
    }
1✔
42
    
43
    public Task WatchAsync(IFileWatcherParameters<TFileStateContent> parameters, CancellationToken cancellationToken)
44
    {
45
        return _fileStateManager.WatchAsync(parameters, cancellationToken);
1✔
46
    }
47
    
48
    public Task<IFileState<TFileStateContent>> GetAsync(string filePath, string fileKey, CancellationToken cancellationToken)
49
    {
50
        return _fileStateManager.GetAsync(filePath, fileKey, cancellationToken);
4✔
51
    }
52
    
53
    public Task<IFileState<TFileStateContent>> GetLatestAsync(string filePath, CancellationToken cancellationToken)
54
    {
55
        return _fileStateManager.GetLatestAsync(filePath, cancellationToken);
×
56
    }
57

58
    public Task<FileSubscription> SubscribeAsync(string filePath, Func<IFileState<TFileStateContent>, Task> actionOnUpdate, CancellationToken cancellationToken)
59
    {
60
        return _subscriptionManager.SubscribeAsync(filePath, actionOnUpdate, cancellationToken);
×
61
    }
62

63
    public Task UnsubscribeAsync(FileSubscription subscription, CancellationToken cancellationToken)
64
    {
65
        return _subscriptionManager.UnsubscribeAsync(subscription, cancellationToken);
×
66
    }
67
    
68
    public async ValueTask DisposeAsync()
69
    {
70
        await _fileStateManager.DisposeAsync();
×
71
        await _subscriptionManager.DisposeAsync();
×
72
    }
×
73
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc