T1.4: Create src/scheduler; move scheduler logic
Move scheduler.go and scheduler_test.go from src/core to the new src/scheduler package. The scheduler still takes *[]domain.Job and *core.Store (storage moves in T1.5). Update src/gui/app.go to import the new package; rename the local variable to sched to avoid shadowing the scheduler package name. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -247,7 +247,7 @@ Track progress here. Mark tasks complete as they land and pass review.
|
|||||||
- [x] T1.1 — Create `src/domain`; move Job/RunRecord/Config/etc
|
- [x] T1.1 — Create `src/domain`; move Job/RunRecord/Config/etc
|
||||||
- [x] T1.2 — Create `src/platform/winproc`; move `configureHiddenWindow`
|
- [x] T1.2 — Create `src/platform/winproc`; move `configureHiddenWindow`
|
||||||
- [x] T1.3 — Create `src/runner`; move runner logic
|
- [x] T1.3 — Create `src/runner`; move runner logic
|
||||||
- [ ] T1.4 — Create `src/scheduler`; move scheduler
|
- [x] T1.4 — Create `src/scheduler`; move scheduler
|
||||||
- [ ] T1.5 — Create `src/storage`; move store/paths
|
- [ ] T1.5 — Create `src/storage`; move store/paths
|
||||||
- [ ] T1.6 — Create `src/platform/autostart`; move autostart logic
|
- [ ] T1.6 — Create `src/platform/autostart`; move autostart logic
|
||||||
- [ ] T1.7 — Create `src/platform/desktop`; move desktop integration
|
- [ ] T1.7 — Create `src/platform/desktop`; move desktop integration
|
||||||
|
|||||||
+15
-14
@@ -16,6 +16,7 @@ import (
|
|||||||
"gitea.mixdep.ru/mix/gosentry/src/core"
|
"gitea.mixdep.ru/mix/gosentry/src/core"
|
||||||
"gitea.mixdep.ru/mix/gosentry/src/domain"
|
"gitea.mixdep.ru/mix/gosentry/src/domain"
|
||||||
"gitea.mixdep.ru/mix/gosentry/src/runner"
|
"gitea.mixdep.ru/mix/gosentry/src/runner"
|
||||||
|
"gitea.mixdep.ru/mix/gosentry/src/scheduler"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/app"
|
"fyne.io/fyne/v2/app"
|
||||||
@@ -263,7 +264,7 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
jobLogs.Refresh()
|
jobLogs.Refresh()
|
||||||
history.Refresh()
|
history.Refresh()
|
||||||
}
|
}
|
||||||
var scheduler *core.Scheduler
|
var sched *scheduler.Scheduler
|
||||||
|
|
||||||
list := widget.NewList(
|
list := widget.NewList(
|
||||||
func() int { return len(filteredJobs) },
|
func() int { return len(filteredJobs) },
|
||||||
@@ -353,8 +354,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
updated := newEvent(saved.ID, saved.Name, "Updated", "Job settings changed")
|
updated := newEvent(saved.ID, saved.Name, "Updated", "Job settings changed")
|
||||||
jobs[selected].Logs = append([]event{updated}, jobs[selected].Logs...)
|
jobs[selected].Logs = append([]event{updated}, jobs[selected].Logs...)
|
||||||
events = append(events, updated)
|
events = append(events, updated)
|
||||||
if scheduler != nil {
|
if sched != nil {
|
||||||
scheduler.RefreshSchedule(selected)
|
sched.RefreshSchedule(selected)
|
||||||
}
|
}
|
||||||
_ = store.SaveJobs(jobs)
|
_ = store.SaveJobs(jobs)
|
||||||
folderSelect.Options = folderOptions(jobs)
|
folderSelect.Options = folderOptions(jobs)
|
||||||
@@ -373,7 +374,7 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
dialog.ShowInformation("Scheduler paused", "Global pause is active. Resume the scheduler before running jobs.", w)
|
dialog.ShowInformation("Scheduler paused", "Global pause is active. Resume the scheduler before running jobs.", w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !scheduler.RunNow(selected) {
|
if !sched.RunNow(selected) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
list.Refresh()
|
list.Refresh()
|
||||||
@@ -391,8 +392,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
jobs[index].NextRun = "Scheduler paused"
|
jobs[index].NextRun = "Scheduler paused"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if scheduler != nil {
|
if sched != nil {
|
||||||
scheduler.SetPaused(true)
|
sched.SetPaused(true)
|
||||||
}
|
}
|
||||||
events = append(events, newEvent(0, "Scheduler", "Paused", "All job execution paused"))
|
events = append(events, newEvent(0, "Scheduler", "Paused", "All job execution paused"))
|
||||||
} else {
|
} else {
|
||||||
@@ -406,8 +407,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
jobs[index].NextRun = "Waiting for scheduler"
|
jobs[index].NextRun = "Waiting for scheduler"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if scheduler != nil {
|
if sched != nil {
|
||||||
scheduler.SetPaused(false)
|
sched.SetPaused(false)
|
||||||
}
|
}
|
||||||
events = append(events, newEvent(0, "Scheduler", "Resumed", "All job execution resumed"))
|
events = append(events, newEvent(0, "Scheduler", "Resumed", "All job execution resumed"))
|
||||||
}
|
}
|
||||||
@@ -426,8 +427,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
resumed := newEvent(current.ID, current.Name, "Resumed", "Job was enabled")
|
resumed := newEvent(current.ID, current.Name, "Resumed", "Job was enabled")
|
||||||
current.Logs = append([]event{resumed}, current.Logs...)
|
current.Logs = append([]event{resumed}, current.Logs...)
|
||||||
events = append(events, resumed)
|
events = append(events, resumed)
|
||||||
if scheduler != nil {
|
if sched != nil {
|
||||||
scheduler.RefreshSchedule(selected)
|
sched.RefreshSchedule(selected)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
current.LastState = "Paused"
|
current.LastState = "Paused"
|
||||||
@@ -435,8 +436,8 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
paused := newEvent(current.ID, current.Name, "Paused", "Job was disabled")
|
paused := newEvent(current.ID, current.Name, "Paused", "Job was disabled")
|
||||||
current.Logs = append([]event{paused}, current.Logs...)
|
current.Logs = append([]event{paused}, current.Logs...)
|
||||||
events = append(events, paused)
|
events = append(events, paused)
|
||||||
if scheduler != nil {
|
if sched != nil {
|
||||||
scheduler.RefreshSchedule(selected)
|
sched.RefreshSchedule(selected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ = store.SaveJobs(jobs)
|
_ = store.SaveJobs(jobs)
|
||||||
@@ -503,13 +504,13 @@ func newMainView(w fyne.Window) (fyne.CanvasObject, func(time.Duration, bool)) {
|
|||||||
jobLogs,
|
jobLogs,
|
||||||
)
|
)
|
||||||
|
|
||||||
scheduler = core.NewScheduler(store, &jobs, func(record domain.RunRecord) {
|
sched = scheduler.NewScheduler(store, &jobs, func(record domain.RunRecord) {
|
||||||
// Scheduled runs happen on the scheduler goroutine. The callback updates
|
// Scheduled runs happen on the scheduler goroutine. The callback updates
|
||||||
// the shared in-memory event list so History reflects background activity.
|
// the shared in-memory event list so History reflects background activity.
|
||||||
events = append(events, record)
|
events = append(events, record)
|
||||||
refresh()
|
refresh()
|
||||||
})
|
})
|
||||||
scheduler.Start()
|
sched.Start()
|
||||||
|
|
||||||
fixedSidebar := container.New(minWidthLayout{width: minJobsSidebarWidth}, sidebar)
|
fixedSidebar := container.New(minWidthLayout{width: minJobsSidebarWidth}, sidebar)
|
||||||
jobsView := container.NewBorder(nil, nil, fixedSidebar, nil, container.NewPadded(details))
|
jobsView := container.NewBorder(nil, nil, fixedSidebar, nil, container.NewPadded(details))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package core
|
package scheduler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"gitea.mixdep.ru/mix/gosentry/src/core"
|
||||||
"gitea.mixdep.ru/mix/gosentry/src/domain"
|
"gitea.mixdep.ru/mix/gosentry/src/domain"
|
||||||
"gitea.mixdep.ru/mix/gosentry/src/runner"
|
"gitea.mixdep.ru/mix/gosentry/src/runner"
|
||||||
"github.com/robfig/cron/v3"
|
"github.com/robfig/cron/v3"
|
||||||
@@ -19,7 +20,7 @@ var cronParser = cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month
|
|||||||
// this keeps the early architecture simple while storage and scheduling are
|
// this keeps the early architecture simple while storage and scheduling are
|
||||||
// still in one desktop process.
|
// still in one desktop process.
|
||||||
type Scheduler struct {
|
type Scheduler struct {
|
||||||
store *Store
|
store *core.Store
|
||||||
jobs *[]domain.Job
|
jobs *[]domain.Job
|
||||||
onChange func(domain.RunRecord)
|
onChange func(domain.RunRecord)
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ type Scheduler struct {
|
|||||||
paused bool
|
paused bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewScheduler(store *Store, jobs *[]domain.Job, onChange func(domain.RunRecord)) *Scheduler {
|
func NewScheduler(store *core.Store, jobs *[]domain.Job, onChange func(domain.RunRecord)) *Scheduler {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
s := &Scheduler{
|
s := &Scheduler{
|
||||||
store: store,
|
store: store,
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package core
|
package scheduler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
Reference in New Issue
Block a user