unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [ELPA] New package: progress-bar
@ 2024-10-29 13:42 Mariano Montone
  2024-10-29 14:47 ` Mariano Montone
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 13:42 UTC (permalink / raw)
  To: emacs-devel

Hello,

I would like to propose adding this package to ELPA: 
https://github.com/mmontone/emacs-progress-bar/

progress-bar is a progress bar that is displayed in the echo area.

Please let me know if you accept, and what would be the next steps.

Thank you,

      Mariano




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 13:42 [ELPA] New package: progress-bar Mariano Montone
@ 2024-10-29 14:47 ` Mariano Montone
  2024-10-29 14:50   ` Mariano Montone
  2024-10-29 14:49 ` Eli Zaretskii
  2024-10-29 15:03 ` Philip Kaludercic
  2 siblings, 1 reply; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 14:47 UTC (permalink / raw)
  To: emacs-devel

Btw, I have several usage of with-slots on a cl-structure object. That 
works in my local Emacs version 31, but when I try on older, 27 and 28, 
that is not supported.

Do you have suggestion of what to do? Use a class instead of a 
structure? Is there an alternative?

Thanks,

     Mariano

El 29/10/24 a las 10:42, Mariano Montone escribió:
> Hello,
>
> I would like to propose adding this package to ELPA: 
> https://github.com/mmontone/emacs-progress-bar/
>
> progress-bar is a progress bar that is displayed in the echo area.
>
> Please let me know if you accept, and what would be the next steps.
>
> Thank you,
>
>      Mariano
>



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 13:42 [ELPA] New package: progress-bar Mariano Montone
  2024-10-29 14:47 ` Mariano Montone
@ 2024-10-29 14:49 ` Eli Zaretskii
  2024-10-29 14:53   ` Mariano Montone
  2024-10-29 15:03 ` Philip Kaludercic
  2 siblings, 1 reply; 10+ messages in thread
From: Eli Zaretskii @ 2024-10-29 14:49 UTC (permalink / raw)
  To: Mariano Montone; +Cc: emacs-devel

> Date: Tue, 29 Oct 2024 10:42:28 -0300
> From: Mariano Montone <marianomontone@gmail.com>
> 
> I would like to propose adding this package to ELPA: 
> https://github.com/mmontone/emacs-progress-bar/
> 
> progress-bar is a progress bar that is displayed in the echo area.

Can you tell how is it different from the built-in
make-progress-reporter and friends?



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 14:47 ` Mariano Montone
@ 2024-10-29 14:50   ` Mariano Montone
  0 siblings, 0 replies; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 14:50 UTC (permalink / raw)
  To: emacs-devel


El 29/10/24 a las 11:47, Mariano Montone escribió:
> Btw, I have several usage of with-slots on a cl-structure object. That 
> works in my local Emacs version 31, but when I try on older, 27 and 
> 28, that is not supported.
>
> Do you have suggestion of what to do? Use a class instead of a 
> structure? Is there an alternative?
Nevermind. Using a class solves the problem in an easy way.



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 14:49 ` Eli Zaretskii
@ 2024-10-29 14:53   ` Mariano Montone
  0 siblings, 0 replies; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 14:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel


El 29/10/24 a las 11:49, Eli Zaretskii escribió:
>> Date: Tue, 29 Oct 2024 10:42:28 -0300
>> From: Mariano Montone <marianomontone@gmail.com>
>>
>> I would like to propose adding this package to ELPA:
>> https://github.com/mmontone/emacs-progress-bar/
>>
>> progress-bar is a progress bar that is displayed in the echo area.
> Can you tell how is it different from the built-in
> make-progress-reporter and friends?

It is visually different, you can observe here: 
https://github.com/mmontone/emacs-progress-bar/raw/master/progress-bar.gif

Also, it is more detailed in the process. make-progress-reporter uses a 
fixed string to inform the status of the operation; the progress bar 
allows a lambda that returns a string based on the current operation status.

        Mariano




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 13:42 [ELPA] New package: progress-bar Mariano Montone
  2024-10-29 14:47 ` Mariano Montone
  2024-10-29 14:49 ` Eli Zaretskii
@ 2024-10-29 15:03 ` Philip Kaludercic
  2024-10-29 15:06   ` Mariano Montone
  2 siblings, 1 reply; 10+ messages in thread
From: Philip Kaludercic @ 2024-10-29 15:03 UTC (permalink / raw)
  To: Mariano Montone; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 211 bytes --]

Mariano Montone <marianomontone@gmail.com> writes:

> Hello,

Hi,

> I would like to propose adding this package to ELPA:
> https://github.com/mmontone/emacs-progress-bar/

Here are a few comments on the code:


[-- Attachment #2: Type: text/plain, Size: 9601 bytes --]

diff --git a/progress-bar.el b/progress-bar.el
index ab49ca9..f385f5a 100644
--- a/progress-bar.el
+++ b/progress-bar.el
@@ -24,15 +24,17 @@
 
 ;; A progress bar in the echo area.
 ;;
-;; This package contains the basic implementation.  For integration of progress-bar
-;; into common Emacs commands and behaviors, install progress-bar-integrations package.
+;; This package contains the basic implementation.  For integration of
+;; progress-bar into common Emacs commands and behaviors, install
+;; progress-bar-integrations package.
 ;; 
-;; Usage:
+;;;; Usage:
 ;;
-;; The preferred method for using a progress-bar is via the utility functions:
-;; `dolist-with-progress-bar', `dotimes-with-progress-bar' and `mapc-with-progress-bar'.
+;; The preferred method for using a progress-bar is via the utility
+;; functions: `dolist-with-progress-bar', `dotimes-with-progress-bar'
+;; and `mapc-with-progress-bar'.
 ;;
-;; Example:
+;;;; Example:
 ;;
 ;; (dolist-with-progress-bar (x (cl-loop for i from 1 to 10 collect i)
 ;;                              :status-message (list "Started ..."
@@ -40,11 +42,15 @@
 ;;                                                      (format "Processing %s..." (progress-bar-data pb)))
 ;;                                                    "Completed!"))
 ;;     (sit-for (seq-random-elt '(0.3 0.4 0.5))))
-;;
-;; TODO:
-;; - Consider putting event notification in call-with-progress-bar instead of in the utilities.
-;; - Consider implementing progress-bars with no total-steps specified.
-;; - Consider an option for hiding the progress-bar display after N seconds after completion.
+
+;;; TODO:
+
+;; - Consider putting event notification in call-with-progress-bar
+;;   instead of in the utilities.
+;; - Consider implementing progress-bars with no total-steps
+;;   specified.
+;; - Consider an option for hiding the progress-bar display after N
+;;   seconds after completion.
 
 ;;; Code:
 
@@ -57,48 +63,41 @@
 
 ;; Chosen from https://en.wikipedia.org/wiki/Block_Elements and inserted using `insert-char' command:
 
-(defcustom progress-bar-char ?▓
+(defcustom progress-bar-char
+  (eval-when-compile (char-from-name "DARK SHADE")) ;as a suggetion
   "Character for drawing progress bars."
-  :type 'character
-  :group 'progress-bar)
+  :type 'character)			;not necessary, :group default to the last `defgroup'
 
 (defcustom progress-bar-background-char ?░
   "Character for drawing progress bars background."
-  :type 'character
-  :group 'progress-bar)
+  :type 'character)
 
 (defcustom progress-bar-width 35
   "Standard width for progress bars."
-  :type 'integer
-  :group 'progress-bar)
+  :type 'natnum)
 
 (defcustom progress-bar-min-steps 0
   "Minimum number of steps for progress bars to be displayed."
-  :type 'integer
-  :group 'progress-bar)
+  :type 'natnum)
 
 (defcustom progress-bar-display-after-seconds 0
   "Display progress bars only after this number of seconds have passed."
-  :type 'float
-  :group 'progress-bar)
+  :type 'number)			;this was a type mismatch, 0 is not a flonum
 
-(defcustom progress-bar-format-string " [%d of %d](%d%%%%)"
+(defcustom progress-bar-format-string " [%d of %d](%d%%%%)" ;how about using `format-spec'?
   "String for formatting the progress bar.
 Arguments passed are current-step, total-steps and completed percentage.
 Consider using field number arguments for more flexibility.
 See `format' documentation."
-  :type 'string
-  :group 'progress-bar)
+  :type 'string)
 
 (defcustom progress-bar-min-time 0.2
   "The minimum time interval between progress bar displays."
-  :type 'float
-  :group 'progress-bar)
+  :type 'number)
 
 (defcustom progress-bar-min-change 1
   "The minimum percentage change required between progress bar displays."
-  :type 'integer
-  :group 'progress-bar)
+  :type 'number)
 
 (defcustom progress-bar-message-display-layout
   'concatenate
@@ -109,15 +108,14 @@ If `dynamic', the message is either concatenated or inserted after a new line
 depending on its length."
   :type '(choice (const concatenate)
                  (const newline)
-                 (const dynamic))
-  :group 'progress-bar)
+                 (const dynamic)))
 
 (defvar progress-bar-update-functions '()
   "An abnormal hook for getting notified of progress bar updates.
 Functions get called with a progress bar event, and a progress-bar instance.
 Progress bar events can be either `started', `updated' or `completed'")
 
-(cl-defstruct progress-bar
+(cl-defstruct progress-bar		;please address the `checkdoc' messages!
   (status-message nil
                   :documentation "The status-message can be either a status-formatter or a list of three status-formatters, the first applied when the progress-bar starts, the second applied for each element processed, the third when the progress-bar completes.
 A status-formatter is either a string or a function that takes a progress-bar instance and returns a string.")
@@ -159,7 +157,7 @@ See `progress-bar-update-functions' hook."
 ARGS is a property-list of slot-name and value.
 
 Example:
-(progress-bar-update pg 'current-step 2 'data 'foo)"
+\(progress-bar-update pg \\='current-step 2 \\='data \\='foo)"
   (cl-loop for (slot value) on args by 'cddr
            do (setf (slot-value progress-bar slot) value))
   (progress-bar--display progress-bar)
@@ -168,11 +166,12 @@ Example:
     (progress-bar-notify 'updated progress-bar)))
 
 (defun progress-bar-incf (progress-bar &optional increment display)
-  "Increment step in PROGRESS-BAR."
+  "Increment step by STEP in PROGRESS-BAR.
+If DISPLAY is non-nil, ..."
   (let ((inc (or increment 1)))
     (with-slots (current-step total-steps) progress-bar
       (when (and total-steps (> (+ current-step inc) total-steps))
-        (error "current-step > total-steps"))
+        (error "current-step > total-steps")) ;please rephrase this error message to be understandable on its own
       (cl-incf current-step inc)
       (when display
         (progress-bar--display progress-bar))
@@ -185,7 +184,7 @@ Example:
   (if (progress-bar-completed-p progress-bar)
       100
     (with-slots (current-step total-steps) progress-bar
-      (truncate (* (/ current-step (float total-steps)) 100)))))
+      (truncate (* current-step 100.0) total-steps))))
 
 (defun progress-bar--display (progress-bar)
   "Display PROGRESS-BAR in echo-area."
@@ -207,7 +206,7 @@ Example:
 
 (defun progress-bar--format-status-message (progress-bar message)
   (cl-etypecase message
-    ((or symbol function)
+    (function ;; you don't need to check symbols separately: (cl-typep 'insert 'function) ;=> t
      (funcall message progress-bar))
     (string message)))
 
@@ -256,7 +255,7 @@ evaluating FUNC, so that messages are displayed together with the progress bar."
       (funcall func progress-bar)
     ;; Replace the implementation of `message' temporarily, so that
     ;; messages sent by FUNC are shown together with the progress bar.
-    (let ((emacs-message (symbol-function 'message)))
+    (let ((emacs-message (symbol-function #'message)))
       (cl-flet ((pb-message (msg &rest args)
                   ;; This is only for logging. Can we log the message
                   ;; without calling `message' ?
@@ -286,10 +285,10 @@ evaluating FUNC, so that messages are displayed together with the progress bar."
 
 (defmacro with-progress-bar (spec &rest body)
   "Create a PROGRESS-BAR binding SPEC in BODY scope.
-SPEC has either the form (VAR PROGRESS-BAR-INSTANCE) or (VAR &rest INITARGS), with
-INITARGS used for creating a `progress-bar'.
-This macros sets up special treatment for calls to MESSAGE that may ocurr in BODY,
-so that messages are displayed together with the progress bar."
+SPEC has either the form (VAR PROGRESS-BAR-INSTANCE) or (VAR &rest
+INITARGS), with INITARGS used for creating a `progress-bar'.  This
+macros sets up special treatment for calls to MESSAGE that may ocurr in
+BODY, so that messages are displayed together with the progress bar."
   (declare (indent 2))
   (cl-destructuring-bind (var &rest initargs) spec
     (if (= (length initargs) 1)
@@ -298,9 +297,9 @@ so that messages are displayed together with the progress bar."
       `(let ((,var (make-progress-bar ,@initargs)))
          (call-with-progress-bar ,var (lambda (,var) ,@body))))))
 
-;; Utilities
+;;;; Utilities
 
-(defun mapc-with-progress-bar (func sequence &rest args)
+(defun progress-bar-mapc (func sequence &rest args)
   "Like `mapc' but using a progress-bar."
   (let ((progress-bar (if (= (length args) 1)
                           (car args)
@@ -318,7 +317,7 @@ so that messages are displayed together with the progress bar."
       (progress-bar--display progress-bar)
       (progress-bar-notify 'completed progress-bar))))
 
-(defmacro dolist-with-progress-bar (spec &rest body)
+(defmacro progress-bar-dolist- (spec &rest body)
   "Like DOLIST but displaying a progress-bar as items in the list are processed.
 ARGS are arguments for `make-progress-bar'.
 
@@ -334,7 +333,7 @@ Example:
   (cl-destructuring-bind (var list &rest args) spec
     `(mapc-with-progress-bar (lambda (,var) ,@body) ,list ,@args)))
 
-(defmacro dotimes-with-progress-bar (spec &rest body)
+(defmacro progress-bar-dotimes (spec &rest body)
   "Like `dotimes' but with a progress bar."
   (declare (indent 2))
   (let ((progress-bar (gensym "progress-bar-")))

[-- Attachment #3: Type: text/plain, Size: 713 bytes --]



> progress-bar is a progress bar that is displayed in the echo area.
>
> Please let me know if you accept, and what would be the next steps.

My main question, which I realised too late when reading the code, is if
you could rework this to integrate into existing instances of
`make-progress-reporter', just replacing the UI.  It seems like it would
be more effective and consistent, and avoid hard dependencies of
programs that want to use `dotimes-with-progress-bar' (or as I renamed
it `progress-bar-dotimes' to avoid namespace clashes), when
`dotimes-with-progress-reporter' already exists and is being used.

> Thank you,
>
>      Mariano
>
>
>

-- 
	Philip Kaludercic on siskin

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 15:03 ` Philip Kaludercic
@ 2024-10-29 15:06   ` Mariano Montone
  2024-10-29 15:24     ` Philip Kaludercic
  0 siblings, 1 reply; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 15:06 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel


El 29/10/24 a las 12:03, Philip Kaludercic escribió:
> My main question, which I realised too late when reading the code, is if
> you could rework this to integrate into existing instances of
> `make-progress-reporter', just replacing the UI.  It seems like it would
> be more effective and consistent, and avoid hard dependencies of
> programs that want to use `dotimes-with-progress-bar' (or as I renamed
> it `progress-bar-dotimes' to avoid namespace clashes), when
> `dotimes-with-progress-reporter' already exists and is being used.

Oh. Thanks for the patch! I'll look at it.

The integration part is in progress-bar-integrations.el. How does it 
looks to you?

     Mariano




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 15:06   ` Mariano Montone
@ 2024-10-29 15:24     ` Philip Kaludercic
  2024-10-29 15:48       ` Mariano Montone
  0 siblings, 1 reply; 10+ messages in thread
From: Philip Kaludercic @ 2024-10-29 15:24 UTC (permalink / raw)
  To: Mariano Montone; +Cc: emacs-devel

Mariano Montone <marianomontone@gmail.com> writes:

> El 29/10/24 a las 12:03, Philip Kaludercic escribió:
>> My main question, which I realised too late when reading the code, is if
>> you could rework this to integrate into existing instances of
>> `make-progress-reporter', just replacing the UI.  It seems like it would
>> be more effective and consistent, and avoid hard dependencies of
>> programs that want to use `dotimes-with-progress-bar' (or as I renamed
>> it `progress-bar-dotimes' to avoid namespace clashes), when
>> `dotimes-with-progress-reporter' already exists and is being used.
>
> Oh. Thanks for the patch! I'll look at it.

Just keep in mind that it is not a patch, it is just a convenient way to
suggest changes and add comments.

> The integration part is in progress-bar-integrations.el. How does it
> looks to you?

Oh, I missed that.  My main issue is that this mixes both the
`progress-reporter-do-update' integration with other advice on functions
like `package-upgrade-all'.  I think having a global minor mode would be
the right approach, instead of advising on the top-level.

Generally it would be neat if we could find a solution that would avoid
the need for advice, but I don't see a clean way to do that right now.
Would you be interested in preparing a patch for subr.el that would make
progress-reporters more flexible?

>     Mariano
>

-- 
	Philip Kaludercic on siskin



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 15:24     ` Philip Kaludercic
@ 2024-10-29 15:48       ` Mariano Montone
  2024-10-29 16:19         ` Mariano Montone
  0 siblings, 1 reply; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 15:48 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1564 bytes --]


El 29/10/24 a las 12:24, Philip Kaludercic escribió:
> Mariano Montone<marianomontone@gmail.com> writes:
>
>> El 29/10/24 a las 12:03, Philip Kaludercic escribió:
>>> My main question, which I realised too late when reading the code, is if
>>> you could rework this to integrate into existing instances of
>>> `make-progress-reporter', just replacing the UI.  It seems like it would
>>> be more effective and consistent, and avoid hard dependencies of
>>> programs that want to use `dotimes-with-progress-bar' (or as I renamed
>>> it `progress-bar-dotimes' to avoid namespace clashes), when
>>> `dotimes-with-progress-reporter' already exists and is being used.
>> Oh. Thanks for the patch! I'll look at it.
> Just keep in mind that it is not a patch, it is just a convenient way to
> suggest changes and add comments.
Yes.
>> The integration part is in progress-bar-integrations.el. How does it
>> looks to you?
> Oh, I missed that.  My main issue is that this mixes both the
> `progress-reporter-do-update' integration with other advice on functions
> like `package-upgrade-all'.  I think having a global minor mode would be
> the right approach, instead of advising on the top-level.
>
> Generally it would be neat if we could find a solution that would avoid
> the need for advice, but I don't see a clean way to do that right now.
> Would you be interested in preparing a patch for subr.el that would make
> progress-reporters more flexible?

Yes, but I would need more precise explanations from you on your idea of 
how to do it.

         Mariano

[-- Attachment #2: Type: text/html, Size: 2542 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ELPA] New package: progress-bar
  2024-10-29 15:48       ` Mariano Montone
@ 2024-10-29 16:19         ` Mariano Montone
  0 siblings, 0 replies; 10+ messages in thread
From: Mariano Montone @ 2024-10-29 16:19 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: emacs-devel


El 29/10/24 a las 12:48, Mariano Montone escribió:
>> Generally it would be neat if we could find a solution that would avoid
>> the need for advice, but I don't see a clean way to do that right now.
>> Would you be interested in preparing a patch for subr.el that would make
>> progress-reporters more flexible?
>
> Yes, but I would need more precise explanations from you on your idea 
> of how to do it.
>
Ideally, in my opinion, it would be good to make the progress-report 
object a bit more complex, contain more information.

Probably switch from its list representation to a struct or class, and 
make it more similar to what I have in the progress-bar class.

Keep backwards compatibility in the process.

Then divide model from user interface representation, and make it 
pluggable. So those new objects could be displayed via a progress-bar, 
or with current progress-reporters ui, or something else.

       Mariano




^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-10-29 16:19 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-29 13:42 [ELPA] New package: progress-bar Mariano Montone
2024-10-29 14:47 ` Mariano Montone
2024-10-29 14:50   ` Mariano Montone
2024-10-29 14:49 ` Eli Zaretskii
2024-10-29 14:53   ` Mariano Montone
2024-10-29 15:03 ` Philip Kaludercic
2024-10-29 15:06   ` Mariano Montone
2024-10-29 15:24     ` Philip Kaludercic
2024-10-29 15:48       ` Mariano Montone
2024-10-29 16:19         ` Mariano Montone

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).