Skip to content

Commit 0eae8c6

Browse files
authored
Merge pull request #11 from tkf/logprogress
Simplify at-logprogress call signature
2 parents 339eb78 + b205966 commit 0eae8c6

File tree

2 files changed

+69
-19
lines changed

2 files changed

+69
-19
lines changed

src/ProgressLogging.jl

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module ProgressLogging
55

66
export @progress, @withprogress, @logprogress
77

8+
using Base.Meta: isexpr
89
using Logging: Logging, @logmsg, LogLevel
910

1011
const ProgressLevel = LogLevel(-1)
@@ -45,19 +46,21 @@ function progress(f; name = "")
4546
end
4647
end
4748

48-
const _id_name = gensym(:progress_id)
49+
const _id_var = gensym(:progress_id)
50+
const _name_var = gensym(:progress_name)
4951

5052
"""
5153
@withprogress [name=""] ex
5254
5355
Create a lexical environment in which [`@logprogress`](@ref) can be used to
54-
emit progress log events without manually specifying the log level and `_id`.
56+
emit progress log events without manually specifying the log level, `_id`,
57+
and name (log message).
5558
5659
```julia
57-
@withprogress begin
60+
@withprogress name="iterating" begin
5861
for i = 1:10
5962
sleep(0.5)
60-
@logprogress "iterating" progress=i/10
63+
@logprogress i/10
6164
end
6265
end
6366
```
@@ -73,29 +76,47 @@ function _withprogress(kwarg, ex)
7376
end
7477
name = kwarg.args[2]
7578

76-
@gensym name_var
7779
m = @__MODULE__
7880
quote
79-
let $_id_name = gensym(:progress_id),
80-
$name_var = $name
81-
$m.@logprogress $name_var progress = NaN
81+
let $_id_var = gensym(:progress_id),
82+
$_name_var = $name
83+
$m.@logprogress NaN
8284
try
8385
$ex
8486
finally
85-
$m.@logprogress $name_var progress = "done"
87+
$m.@logprogress "done"
8688
end
8789
end
8890
end |> esc
8991
end
9092

9193
"""
92-
@logprogress name progress=value ...
94+
@logprogress [name] progress [key1=val1 [key2=val2 ...]]
9395
94-
See [`@withprogress`](@ref).
96+
This macro must be used inside [`@withprogress`](@ref) macro.
97+
98+
Log a progress event with a value `progress`. The expression
99+
`progress` must be evaluated to be a real number between `0` and `1`
100+
(inclusive), a `NaN`, or a string `"done"`.
101+
102+
Optional first argument `name` can be used to change the name of the
103+
progress bar. Additional keyword arguments are passed to `@logmsg`.
95104
"""
96-
macro logprogress(name, args...)
105+
macro logprogress(name, progress = nothing, args...)
106+
if progress == nothing
107+
# Handle: @logprogress progress
108+
kwargs = (:(progress = $name), args...)
109+
name = _name_var
110+
elseif isexpr(progress, :(=)) && progress.args[1] isa Symbol
111+
# Handle: @logprogress progress key1=val1 ...
112+
kwargs = (:(progress = $name), progress, args...)
113+
name = _name_var
114+
else
115+
# Otherwise, it's: @logprogress name progress key1=val1 ...
116+
kwargs = (:(progress = $progress), args...)
117+
end
97118
quote
98-
$Logging.@logmsg($ProgressLevel, $name, _id = $_id_name, $(args...))
119+
$Logging.@logmsg($ProgressLevel, $name, _id = $_id_var, $(kwargs...))
99120
end |> esc
100121
end
101122

test/test_withprogress_macro.jl

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,49 @@ using ProgressLogging: ProgressLevel
66
using Test
77
using Test: collect_test_logs
88

9-
@testset "simple" begin
9+
@testset "specify name in `@logprogress`" begin
1010
logs, = collect_test_logs(min_level = ProgressLevel) do
11-
@withprogress @logprogress "hello" progress = 0.1
11+
@withprogress @logprogress "hello" 0.1
1212
end
1313
@test length(logs) == 3
1414
@test logs[1].kwargs[:progress] === NaN
1515
@test logs[2].kwargs[:progress] === 0.1
1616
@test logs[3].kwargs[:progress] === "done"
17+
@test logs[1].message === ""
18+
@test logs[2].message === "hello"
19+
@test logs[3].message === ""
20+
@test length(unique([l.id for l in logs])) == 1
21+
end
22+
23+
@testset "specify name in `@withprogress`" begin
24+
logs, = collect_test_logs(min_level = ProgressLevel) do
25+
@withprogress name = "hello" @logprogress 0.1
26+
end
27+
@test length(logs) == 3
28+
@test logs[1].kwargs[:progress] === NaN
29+
@test logs[2].kwargs[:progress] === 0.1
30+
@test logs[3].kwargs[:progress] === "done"
31+
@test logs[1].message === "hello"
32+
@test logs[2].message === "hello"
33+
@test logs[3].message === "hello"
34+
@test length(unique([l.id for l in logs])) == 1
35+
end
36+
37+
@testset "keyword argument when no name" begin
38+
logs, = collect_test_logs(min_level = ProgressLevel) do
39+
@withprogress @logprogress 0.1 message = "hello"
40+
end
41+
@test length(logs) == 3
42+
@test logs[1].kwargs[:progress] === NaN
43+
@test logs[2].kwargs[:progress] === 0.1
44+
@test logs[3].kwargs[:progress] === "done"
45+
@test logs[2].kwargs[:message] === "hello"
1746
@test length(unique([l.id for l in logs])) == 1
1847
end
1948

20-
@testset "with name" begin
49+
@testset "change name" begin
2150
logs, = collect_test_logs(min_level = ProgressLevel) do
22-
@withprogress name = "name" @logprogress "hello" progress = 0.1
51+
@withprogress name = "name" @logprogress "hello" 0.1
2352
end
2453
@test length(logs) == 3
2554
@test logs[1].kwargs[:progress] === NaN
@@ -34,9 +63,9 @@ end
3463
@testset "nested" begin
3564
logs, = collect_test_logs(min_level = ProgressLevel) do
3665
@withprogress begin
37-
@logprogress "hello" progress = 0.1
66+
@logprogress "hello" 0.1
3867
@withprogress begin
39-
@logprogress "world" progress = 0.2
68+
@logprogress "world" 0.2
4069
end
4170
end
4271
end

0 commit comments

Comments
 (0)