@rip-lang/swarm 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/swarm.rip +28 -30
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rip-lang/swarm",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.4",
|
|
4
4
|
"description": "Parallel job runner with worker threads — setup once, swarm many",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "swarm.rip",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"author": "Steve Shreeve <steve.shreeve@gmail.com>",
|
|
36
36
|
"license": "MIT",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"rip-lang": "^3.13.
|
|
38
|
+
"rip-lang": "^3.13.2"
|
|
39
39
|
},
|
|
40
40
|
"files": [
|
|
41
41
|
"swarm.rip",
|
package/swarm.rip
CHANGED
|
@@ -94,19 +94,18 @@ bg = (rgb) -> if rgb then "\x1b[48;2;#{hex(rgb)}m" else "\x1b[49m"
|
|
|
94
94
|
# Progress display
|
|
95
95
|
# ==============================================================================
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
char = wide = len = null
|
|
98
98
|
|
|
99
99
|
drawFrame = (workers) ->
|
|
100
|
-
|
|
100
|
+
len = String(workers).length
|
|
101
101
|
write clear()
|
|
102
|
-
write go(2 + workers,
|
|
103
|
-
write go(1,
|
|
102
|
+
write go(2 + workers, len + 3) + "╰" + "─".repeat(wide + 2) + "╯"
|
|
103
|
+
write go(1, len + 3) + "╭" + "─".repeat(wide + 2) + "╮"
|
|
104
104
|
for i in [0...workers]
|
|
105
105
|
write go(i + 2, 1)
|
|
106
|
-
label = String(i + 1).padStart(
|
|
107
|
-
write " #{label} │ " + " ".repeat(
|
|
108
|
-
|
|
109
|
-
write go(workers + 3, _len + 3) + "│ " + " ".repeat(_wide) + " │"
|
|
106
|
+
label = String(i + 1).padStart(len)
|
|
107
|
+
write " #{label} │ " + " ".repeat(wide) + " │"
|
|
108
|
+
write go(workers + 3, len + 3) + "│ " + " ".repeat(wide) + " │"
|
|
110
109
|
|
|
111
110
|
draw = (state) ->
|
|
112
111
|
{ live, done, died, jobs, workers, info } = state
|
|
@@ -117,27 +116,29 @@ draw = (state) ->
|
|
|
117
116
|
# worker bars
|
|
118
117
|
for slot, count of info
|
|
119
118
|
tpct = count / most
|
|
120
|
-
cols = Math.floor(ppct * tpct *
|
|
121
|
-
write go(parseInt(slot) + 1,
|
|
119
|
+
cols = Math.floor(ppct * tpct * wide)
|
|
120
|
+
write go(parseInt(slot) + 1, len + 5) + bg("5383ec") + char.repeat(cols) + bg()
|
|
122
121
|
|
|
123
122
|
# summary bar
|
|
124
123
|
dpct = done / jobs
|
|
125
124
|
lpct = live / jobs
|
|
126
|
-
gcol = Math.floor(dpct *
|
|
127
|
-
ycol = Math.floor(lpct *
|
|
128
|
-
rcol = Math.max(0,
|
|
125
|
+
gcol = Math.floor(dpct * wide)
|
|
126
|
+
ycol = Math.floor(lpct * wide)
|
|
127
|
+
rcol = Math.max(0, wide - gcol - ycol)
|
|
129
128
|
row = workers + 3
|
|
130
129
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
130
|
+
out = [
|
|
131
|
+
go(row, len + 5)
|
|
132
|
+
fg("fff")
|
|
133
|
+
bg("58a65c") + char.repeat(gcol) # green (done)
|
|
134
|
+
bg("f1bf42") + char.repeat(ycol) # yellow (live)
|
|
135
|
+
bg("d85140") + " ".repeat(rcol) # red (rest)
|
|
136
|
+
go(row, len + 5 + wide + 3)
|
|
137
|
+
bg("5383ec") + " #{(ppct * 100).toFixed(1)}% " # blue (pct)
|
|
138
|
+
if done > 0 then bg() + " " + bg("58a65c") + " #{done}/#{jobs} done "
|
|
139
|
+
if died > 0 then bg() + " " + bg("d85140") + " #{died} died "
|
|
140
|
+
].filter(Boolean).join('') + fg() + bg()
|
|
141
|
+
write out
|
|
141
142
|
|
|
142
143
|
# ==============================================================================
|
|
143
144
|
# Worker orchestration
|
|
@@ -157,8 +158,8 @@ export swarm = (opts = {}) ->
|
|
|
157
158
|
# parse CLI options
|
|
158
159
|
args = process.argv.slice(2)
|
|
159
160
|
workers = parseInt(findArg(args, '-w', '--workers')) or opts.workers or cpus().length
|
|
160
|
-
|
|
161
|
-
char = findArg(args, '-c', '--char')
|
|
161
|
+
wide = parseInt(findArg(args, '-b', '--bar')) or opts.bar or 20
|
|
162
|
+
char = (findArg(args, '-c', '--char') or opts.char or '•')[0]
|
|
162
163
|
doreset = args.includes('-r') or args.includes('--reset')
|
|
163
164
|
dosafe = args.includes('-s') or args.includes('--safe')
|
|
164
165
|
|
|
@@ -166,9 +167,6 @@ export swarm = (opts = {}) ->
|
|
|
166
167
|
console.error 'error: workers must be at least 1'
|
|
167
168
|
process.exit(1)
|
|
168
169
|
|
|
169
|
-
_wide = barw
|
|
170
|
-
_char = char[0]
|
|
171
|
-
|
|
172
170
|
if doreset
|
|
173
171
|
rmSync(_dir, { recursive: true, force: true })
|
|
174
172
|
console.log 'removed .swarm directory'
|
|
@@ -256,7 +254,7 @@ export swarm = (opts = {}) ->
|
|
|
256
254
|
taskPath = tasks[taskIdx++]
|
|
257
255
|
inflight[slot] = taskPath
|
|
258
256
|
live++
|
|
259
|
-
write go(slot + 1,
|
|
257
|
+
write go(slot + 1, len + 5 + wide + 3) + " " + taskPath.split('/').pop() + clear(true)
|
|
260
258
|
draw({ live, done, died, jobs, workers, info })
|
|
261
259
|
worker.postMessage { type: 'task', taskPath }
|
|
262
260
|
else
|
|
@@ -327,7 +325,7 @@ export swarm = (opts = {}) ->
|
|
|
327
325
|
s = parseInt(slot)
|
|
328
326
|
n = info[slot]
|
|
329
327
|
rate = if secs > 0 then (n / secs).toFixed(1) else '—'
|
|
330
|
-
write go(s + 1,
|
|
328
|
+
write go(s + 1, len + 5) + bg("5383ec") + char.repeat(wide) + bg() + " │ #{n} jobs @ #{rate}/sec" + clear(true)
|
|
331
329
|
draw({ live: 0, done, died, jobs, workers, info })
|
|
332
330
|
|
|
333
331
|
# summary
|