@@ -5,6 +5,7 @@ module ProgressLogging
55
66export @progress , @withprogress , @logprogress
77
8+ using Base. Meta: isexpr
89using Logging: Logging, @logmsg , LogLevel
910
1011const ProgressLevel = LogLevel (- 1 )
@@ -45,19 +46,21 @@ function progress(f; name = "")
4546 end
4647end
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
5355Create 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
6265end
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
8991end
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
100121end
101122
0 commit comments