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

net-daemon / netdaemon / 6682362857

29 Oct 2023 08:56AM UTC coverage: 79.505% (-1.2%) from 80.706%
6682362857

push

github

web-flow
Bump Roslynator.Analyzers from 4.5.0 to 4.6.1 (#960)

Bumps [Roslynator.Analyzers](https://github.com/dotnet/roslynator) from 4.5.0 to 4.6.1.
- [Release notes](https://github.com/dotnet/roslynator/releases)
- [Changelog](https://github.com/dotnet/roslynator/blob/main/ChangeLog.md)
- [Commits](https://github.com/dotnet/roslynator/compare/v4.5.0...v4.6.1)

---
updated-dependencies:
- dependency-name: Roslynator.Analyzers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

802 of 1143 branches covered (0.0%)

Branch coverage included in aggregate %.

2895 of 3507 relevant lines covered (82.55%)

50.4 hits per line

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

92.22
/src/Runtime/NetDaemon.Runtime/Internal/AppStateManager.cs
1
using System.Collections.Concurrent;
2
using System.Reactive.Linq;
3
using NetDaemon.AppModel;
4

5
namespace NetDaemon.Runtime.Internal;
6

7
internal class AppStateManager(IAppStateRepository appStateRepository,
13✔
8
    IHostEnvironment hostEnvironment) : IAppStateManager, IHandleHomeAssistantAppStateUpdates, IDisposable
13✔
9
{
10
    private readonly CancellationTokenSource _cancelTokenSource = new();
13✔
11
    private readonly ConcurrentDictionary<string, ApplicationState> _stateCache = new();
13✔
12

13
    public async Task InitializeAsync(IHomeAssistantConnection haConnection, IAppModelContext appContext)
14
    {
15
        _stateCache.Clear();
5✔
16
        if (appContext.Applications.Count > 0 && !hostEnvironment.IsDevelopment())
5✔
17
            await appStateRepository.RemoveNotUsedStatesAsync(appContext.Applications.Select(a => a.Id).ToList()!,
8✔
18
                _cancelTokenSource.Token);
4✔
19

20
        var hassEvents = await haConnection.SubscribeToHomeAssistantEventsAsync(null, _cancelTokenSource.Token)
5✔
21
            .ConfigureAwait(false);
5✔
22

23
        hassEvents
5✔
24
            .Where(n => n.EventType == "state_changed")
3✔
25
            .Select(async s =>
5✔
26
            {
5✔
27
                var changedEvent = s.ToStateChangedEvent() ?? throw new InvalidOperationException();
3!
28

5✔
29
                if (changedEvent.NewState is null || changedEvent.OldState is null)
3✔
30
                    // Ignore if entity just created or deleted
5✔
31
                    return;
1✔
32
                if (changedEvent.NewState.State == changedEvent.OldState.State)
2✔
33
                    // We only care about changed state
5✔
34
                    return;
1✔
35
                foreach (var app in appContext.Applications)
3✔
36
                {
5✔
37
                    var entityId =
1!
38
                        EntityMapperHelper.ToEntityIdFromApplicationId(app.Id ??
1✔
39
                            throw new InvalidOperationException(), hostEnvironment.IsDevelopment());
1✔
40
                    if (entityId != changedEvent.NewState.EntityId) continue;
1✔
41

5✔
42
                    var appState = changedEvent.NewState?.State == "on"
1!
43
                        ? ApplicationState.Enabled
1✔
44
                        : ApplicationState.Disabled;
1✔
45

5✔
46
                    await app.SetStateAsync(
1✔
47
                        appState
1✔
48
                    );
1✔
49
                    break;
1✔
50
                }
5✔
51
            }).Subscribe();
8✔
52
    }
5✔
53

54
    public async Task<ApplicationState> GetStateAsync(string applicationId)
55
    {
56
        if (_stateCache.TryGetValue(applicationId, out var applicationState)) return applicationState;
4!
57

58
        return await appStateRepository.GetOrCreateAsync(applicationId, _cancelTokenSource.Token)
4✔
59
            .ConfigureAwait(false)
4✔
60
            ? ApplicationState.Enabled
4✔
61
            : ApplicationState.Disabled;
4✔
62
    }
4✔
63

64
    public async Task SaveStateAsync(string applicationId, ApplicationState state)
65
    {
66
        _stateCache[applicationId] = state;
4✔
67

68
        var isEnabled = await appStateRepository.GetOrCreateAsync(applicationId, _cancelTokenSource.Token)
4✔
69
            .ConfigureAwait(false);
4✔
70

71
        // Only update state if it is different from current
72
        if (
4✔
73
            (state == ApplicationState.Enabled && !isEnabled) ||
4✔
74
            (state == ApplicationState.Disabled && isEnabled)
4✔
75
            )
4✔
76
        {
77
            await appStateRepository.UpdateAsync(applicationId, isEnabled, _cancelTokenSource.Token)
2✔
78
                .ConfigureAwait(false);
2✔
79
        }
80
    }
4✔
81

82
    public void Dispose()
83
    {
84
        _cancelTokenSource.Dispose();
×
85
    }
×
86
}
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