@@ -5,6 +5,7 @@ module ProgressLogging
5
5
6
6
export @progress , @withprogress , @logprogress
7
7
8
+ using Base. Meta: isexpr
8
9
using Logging: Logging, @logmsg , LogLevel
9
10
10
11
const ProgressLevel = LogLevel (- 1 )
@@ -45,19 +46,21 @@ function progress(f; name = "")
45
46
end
46
47
end
47
48
48
- const _id_name = gensym (:progress_id )
49
+ const _id_var = gensym (:progress_id )
50
+ const _name_var = gensym (:progress_name )
49
51
50
52
"""
51
53
@withprogress [name=""] ex
52
54
53
55
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).
55
58
56
59
```julia
57
- @withprogress begin
60
+ @withprogress name="iterating" begin
58
61
for i = 1:10
59
62
sleep(0.5)
60
- @logprogress "iterating" progress= i/10
63
+ @logprogress i/10
61
64
end
62
65
end
63
66
```
@@ -73,29 +76,47 @@ function _withprogress(kwarg, ex)
73
76
end
74
77
name = kwarg. args[2 ]
75
78
76
- @gensym name_var
77
79
m = @__MODULE__
78
80
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
82
84
try
83
85
$ ex
84
86
finally
85
- $ m. @logprogress $ name_var progress = " done"
87
+ $ m. @logprogress " done"
86
88
end
87
89
end
88
90
end |> esc
89
91
end
90
92
91
93
"""
92
- @logprogress name progress=value ...
94
+ @logprogress [ name] progress [key1=val1 [key2=val2 ...]]
93
95
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`.
95
104
"""
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
97
118
quote
98
- $ Logging. @logmsg ($ ProgressLevel, $ name, _id = $ _id_name , $ (args ... ))
119
+ $ Logging. @logmsg ($ ProgressLevel, $ name, _id = $ _id_var , $ (kwargs ... ))
99
120
end |> esc
100
121
end
101
122
0 commit comments