Merge PR92: use 'humanize' to abbreviate filesizes
This commit is contained in:
		
						commit
						6b0ebef559
					
				
							
								
								
									
										1
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								setup.py
									
									
									
									
									
								
							| 
						 | 
					@ -33,6 +33,7 @@ setup(name="magic-wormhole",
 | 
				
			||||||
          "autobahn[twisted] >= 0.14.1",
 | 
					          "autobahn[twisted] >= 0.14.1",
 | 
				
			||||||
          "hkdf", "tqdm",
 | 
					          "hkdf", "tqdm",
 | 
				
			||||||
          "click",
 | 
					          "click",
 | 
				
			||||||
 | 
					          "humanize",
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
      extras_require={
 | 
					      extras_require={
 | 
				
			||||||
          ':sys_platform=="win32"': ["pypiwin32"],
 | 
					          ':sys_platform=="win32"': ["pypiwin32"],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
from __future__ import print_function
 | 
					from __future__ import print_function
 | 
				
			||||||
import os, sys, six, tempfile, zipfile, hashlib
 | 
					import os, sys, six, tempfile, zipfile, hashlib
 | 
				
			||||||
from tqdm import tqdm
 | 
					from tqdm import tqdm
 | 
				
			||||||
 | 
					from humanize import naturalsize
 | 
				
			||||||
from twisted.internet import reactor
 | 
					from twisted.internet import reactor
 | 
				
			||||||
from twisted.internet.defer import inlineCallbacks, returnValue
 | 
					from twisted.internet.defer import inlineCallbacks, returnValue
 | 
				
			||||||
from twisted.python import log
 | 
					from twisted.python import log
 | 
				
			||||||
| 
						 | 
					@ -194,8 +195,8 @@ class TwistedReceiver:
 | 
				
			||||||
                                                  file_data["filename"])
 | 
					                                                  file_data["filename"])
 | 
				
			||||||
        self.xfersize = file_data["filesize"]
 | 
					        self.xfersize = file_data["filesize"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._msg(u"Receiving file (%d bytes) into: %s" %
 | 
					        self._msg(u"Receiving file (%s) into: %s" %
 | 
				
			||||||
                  (self.xfersize, os.path.basename(self.abs_destname)))
 | 
					                  (naturalsize(self.xfersize), os.path.basename(self.abs_destname)))
 | 
				
			||||||
        self._ask_permission()
 | 
					        self._ask_permission()
 | 
				
			||||||
        tmp_destname = self.abs_destname + ".tmp"
 | 
					        tmp_destname = self.abs_destname + ".tmp"
 | 
				
			||||||
        return open(tmp_destname, "wb")
 | 
					        return open(tmp_destname, "wb")
 | 
				
			||||||
| 
						 | 
					@ -210,10 +211,10 @@ class TwistedReceiver:
 | 
				
			||||||
                                                  file_data["dirname"])
 | 
					                                                  file_data["dirname"])
 | 
				
			||||||
        self.xfersize = file_data["zipsize"]
 | 
					        self.xfersize = file_data["zipsize"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._msg(u"Receiving directory (%d bytes) into: %s/" %
 | 
					        self._msg(u"Receiving directory (%s) into: %s/" %
 | 
				
			||||||
                  (self.xfersize, os.path.basename(self.abs_destname)))
 | 
					                  (naturalsize(self.xfersize), os.path.basename(self.abs_destname)))
 | 
				
			||||||
        self._msg(u"%d files, %d bytes (uncompressed)" %
 | 
					        self._msg(u"%d files, %s (uncompressed)" %
 | 
				
			||||||
                  (file_data["numfiles"], file_data["numbytes"]))
 | 
					                  (file_data["numfiles"], naturalsize(file_data["numbytes"])))
 | 
				
			||||||
        self._ask_permission()
 | 
					        self._ask_permission()
 | 
				
			||||||
        return tempfile.SpooledTemporaryFile()
 | 
					        return tempfile.SpooledTemporaryFile()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
from __future__ import print_function
 | 
					from __future__ import print_function
 | 
				
			||||||
import os, sys, six, tempfile, zipfile, hashlib
 | 
					import os, sys, six, tempfile, zipfile, hashlib
 | 
				
			||||||
from tqdm import tqdm
 | 
					from tqdm import tqdm
 | 
				
			||||||
 | 
					from humanize import naturalsize
 | 
				
			||||||
from twisted.python import log
 | 
					from twisted.python import log
 | 
				
			||||||
from twisted.protocols import basic
 | 
					from twisted.protocols import basic
 | 
				
			||||||
from twisted.internet import reactor
 | 
					from twisted.internet import reactor
 | 
				
			||||||
| 
						 | 
					@ -167,7 +168,7 @@ class Sender:
 | 
				
			||||||
            text = six.moves.input("Text to send: ")
 | 
					            text = six.moves.input("Text to send: ")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if text is not None:
 | 
					        if text is not None:
 | 
				
			||||||
            print(u"Sending text message (%d bytes)" % len(text),
 | 
					            print(u"Sending text message (%s)" % naturalsize(len(text)),
 | 
				
			||||||
                  file=args.stdout)
 | 
					                  file=args.stdout)
 | 
				
			||||||
            offer = { "message": text }
 | 
					            offer = { "message": text }
 | 
				
			||||||
            fd_to_send = None
 | 
					            fd_to_send = None
 | 
				
			||||||
| 
						 | 
					@ -187,7 +188,8 @@ class Sender:
 | 
				
			||||||
                "filename": basename,
 | 
					                "filename": basename,
 | 
				
			||||||
                "filesize": filesize,
 | 
					                "filesize": filesize,
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            print(u"Sending %d byte file named '%s'" % (filesize, basename),
 | 
					            print(u"Sending %s file named '%s'"
 | 
				
			||||||
 | 
					                  % (naturalsize(filesize), basename),
 | 
				
			||||||
                  file=args.stdout)
 | 
					                  file=args.stdout)
 | 
				
			||||||
            fd_to_send = open(what, "rb")
 | 
					            fd_to_send = open(what, "rb")
 | 
				
			||||||
            return offer, fd_to_send
 | 
					            return offer, fd_to_send
 | 
				
			||||||
| 
						 | 
					@ -222,8 +224,8 @@ class Sender:
 | 
				
			||||||
                "numbytes": num_bytes,
 | 
					                "numbytes": num_bytes,
 | 
				
			||||||
                "numfiles": num_files,
 | 
					                "numfiles": num_files,
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            print(u"Sending directory (%d bytes compressed) named '%s'"
 | 
					            print(u"Sending directory (%s compressed) named '%s'"
 | 
				
			||||||
                  % (filesize, basename), file=args.stdout)
 | 
					                  % (naturalsize(filesize), basename), file=args.stdout)
 | 
				
			||||||
            return offer, fd_to_send
 | 
					            return offer, fd_to_send
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        raise TypeError("'%s' is neither file nor directory" % args.what)
 | 
					        raise TypeError("'%s' is neither file nor directory" % args.what)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@ from __future__ import print_function, unicode_literals
 | 
				
			||||||
import os, time, json
 | 
					import os, time, json
 | 
				
			||||||
from collections import defaultdict
 | 
					from collections import defaultdict
 | 
				
			||||||
import click
 | 
					import click
 | 
				
			||||||
 | 
					from humanize import naturalsize
 | 
				
			||||||
from .database import get_db
 | 
					from .database import get_db
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def abbrev(t):
 | 
					def abbrev(t):
 | 
				
			||||||
| 
						 | 
					@ -13,31 +14,6 @@ def abbrev(t):
 | 
				
			||||||
        return "%.1fms" % (t*1e3)
 | 
					        return "%.1fms" % (t*1e3)
 | 
				
			||||||
    return "%.1fus" % (t*1e6)
 | 
					    return "%.1fus" % (t*1e6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def abbreviate_space(s, SI=True):
 | 
					 | 
				
			||||||
    if s is None:
 | 
					 | 
				
			||||||
        return "-"
 | 
					 | 
				
			||||||
    if SI:
 | 
					 | 
				
			||||||
        U = 1000.0
 | 
					 | 
				
			||||||
        isuffix = "B"
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        U = 1024.0
 | 
					 | 
				
			||||||
        isuffix = "iB"
 | 
					 | 
				
			||||||
    def r(count, suffix):
 | 
					 | 
				
			||||||
        return "%.2f %s%s" % (count, suffix, isuffix)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if s < 1024: # 1000-1023 get emitted as bytes, even in SI mode
 | 
					 | 
				
			||||||
        return "%d B" % s
 | 
					 | 
				
			||||||
    if s < U*U:
 | 
					 | 
				
			||||||
        return r(s/U, "k")
 | 
					 | 
				
			||||||
    if s < U*U*U:
 | 
					 | 
				
			||||||
        return r(s/(U*U), "M")
 | 
					 | 
				
			||||||
    if s < U*U*U*U:
 | 
					 | 
				
			||||||
        return r(s/(U*U*U), "G")
 | 
					 | 
				
			||||||
    if s < U*U*U*U*U:
 | 
					 | 
				
			||||||
        return r(s/(U*U*U*U), "T")
 | 
					 | 
				
			||||||
    if s < U*U*U*U*U*U:
 | 
					 | 
				
			||||||
        return r(s/(U*U*U*U*U), "P")
 | 
					 | 
				
			||||||
    return r(s/(U*U*U*U*U*U), "E")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
def print_event(event):
 | 
					def print_event(event):
 | 
				
			||||||
    event_type, started, result, total_bytes, waiting_time, total_time = event
 | 
					    event_type, started, result, total_bytes, waiting_time, total_time = event
 | 
				
			||||||
| 
						 | 
					@ -49,7 +25,7 @@ def print_event(event):
 | 
				
			||||||
           abbrev(total_time),
 | 
					           abbrev(total_time),
 | 
				
			||||||
           abbrev(waiting_time),
 | 
					           abbrev(waiting_time),
 | 
				
			||||||
           abbrev(followthrough),
 | 
					           abbrev(followthrough),
 | 
				
			||||||
           abbreviate_space(total_bytes),
 | 
					           naturalsize(total_bytes),
 | 
				
			||||||
           time.ctime(started),
 | 
					           time.ctime(started),
 | 
				
			||||||
          ))
 | 
					          ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,8 +84,8 @@ def show_usage(args):
 | 
				
			||||||
        print(" %d events in %s (%.2f per hour)" % (total, abbrev(elapsed),
 | 
					        print(" %d events in %s (%.2f per hour)" % (total, abbrev(elapsed),
 | 
				
			||||||
                                                    (3600 * total / elapsed)))
 | 
					                                                    (3600 * total / elapsed)))
 | 
				
			||||||
        rate = total_transit_bytes / elapsed
 | 
					        rate = total_transit_bytes / elapsed
 | 
				
			||||||
        print(" %s total bytes, %sps" % (abbreviate_space(total_transit_bytes),
 | 
					        print(" %s total bytes, %sps" % (naturalsize(total_transit_bytes),
 | 
				
			||||||
                                         abbreviate_space(rate)))
 | 
					                                         naturalsize(rate)))
 | 
				
			||||||
        print("", ", ".join(["%s=%d (%d%%)" %
 | 
					        print("", ", ".join(["%s=%d (%d%%)" %
 | 
				
			||||||
                             (k, counters[k], (100.0 * counters[k] / total))
 | 
					                             (k, counters[k], (100.0 * counters[k] / total))
 | 
				
			||||||
                             for k in sorted(counters)
 | 
					                             for k in sorted(counters)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
from __future__ import print_function, unicode_literals
 | 
					from __future__ import print_function, unicode_literals
 | 
				
			||||||
import os, sys, re, io, zipfile, six, stat
 | 
					import os, sys, re, io, zipfile, six, stat
 | 
				
			||||||
 | 
					from humanize import naturalsize
 | 
				
			||||||
import mock
 | 
					import mock
 | 
				
			||||||
from twisted.trial import unittest
 | 
					from twisted.trial import unittest
 | 
				
			||||||
from twisted.python import procutils, log
 | 
					from twisted.python import procutils, log
 | 
				
			||||||
| 
						 | 
					@ -367,7 +368,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # check sender
 | 
					        # check sender
 | 
				
			||||||
        if mode == "text":
 | 
					        if mode == "text":
 | 
				
			||||||
            expected = ("Sending text message ({bytes:d} bytes){NL}"
 | 
					            expected = ("Sending text message ({bytes:d} Bytes){NL}"
 | 
				
			||||||
                        "On the other computer, please run: "
 | 
					                        "On the other computer, please run: "
 | 
				
			||||||
                        "wormhole receive{NL}"
 | 
					                        "wormhole receive{NL}"
 | 
				
			||||||
                        "Wormhole code is: {code}{NL}{NL}"
 | 
					                        "Wormhole code is: {code}{NL}{NL}"
 | 
				
			||||||
| 
						 | 
					@ -376,8 +377,9 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
 | 
				
			||||||
                                                        NL=NL)
 | 
					                                                        NL=NL)
 | 
				
			||||||
            self.failUnlessEqual(send_stdout, expected)
 | 
					            self.failUnlessEqual(send_stdout, expected)
 | 
				
			||||||
        elif mode == "file":
 | 
					        elif mode == "file":
 | 
				
			||||||
            self.failUnlessIn("Sending {bytes:d} byte file named '{name}'{NL}"
 | 
					            self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
 | 
				
			||||||
                              .format(bytes=len(message), name=send_filename,
 | 
					                              .format(size=naturalsize(len(message)),
 | 
				
			||||||
 | 
					                                      name=send_filename,
 | 
				
			||||||
                                      NL=NL), send_stdout)
 | 
					                                      NL=NL), send_stdout)
 | 
				
			||||||
            self.failUnlessIn("On the other computer, please run: "
 | 
					            self.failUnlessIn("On the other computer, please run: "
 | 
				
			||||||
                              "wormhole receive{NL}"
 | 
					                              "wormhole receive{NL}"
 | 
				
			||||||
| 
						 | 
					@ -402,8 +404,8 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
 | 
				
			||||||
        if mode == "text":
 | 
					        if mode == "text":
 | 
				
			||||||
            self.failUnlessEqual(receive_stdout, message+NL)
 | 
					            self.failUnlessEqual(receive_stdout, message+NL)
 | 
				
			||||||
        elif mode == "file":
 | 
					        elif mode == "file":
 | 
				
			||||||
            self.failUnlessIn("Receiving file ({bytes:d} bytes) into: {name}"
 | 
					            self.failUnlessIn("Receiving file ({size:s}) into: {name}"
 | 
				
			||||||
                              .format(bytes=len(message),
 | 
					                              .format(size=naturalsize(len(message)),
 | 
				
			||||||
                                      name=receive_filename), receive_stdout)
 | 
					                                      name=receive_filename), receive_stdout)
 | 
				
			||||||
            self.failUnlessIn("Received file written to ", receive_stdout)
 | 
					            self.failUnlessIn("Received file written to ", receive_stdout)
 | 
				
			||||||
            fn = os.path.join(receive_dir, receive_filename)
 | 
					            fn = os.path.join(receive_dir, receive_filename)
 | 
				
			||||||
| 
						 | 
					@ -411,7 +413,7 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
 | 
				
			||||||
            with open(fn, "r") as f:
 | 
					            with open(fn, "r") as f:
 | 
				
			||||||
                self.failUnlessEqual(f.read(), message)
 | 
					                self.failUnlessEqual(f.read(), message)
 | 
				
			||||||
        elif mode == "directory":
 | 
					        elif mode == "directory":
 | 
				
			||||||
            want = (r"Receiving directory \(\d+ bytes\) into: {name}/"
 | 
					            want = (r"Receiving directory \(\d+ \w+\) into: {name}/"
 | 
				
			||||||
                    .format(name=receive_dirname))
 | 
					                    .format(name=receive_dirname))
 | 
				
			||||||
            self.failUnless(re.search(want, receive_stdout),
 | 
					            self.failUnless(re.search(want, receive_stdout),
 | 
				
			||||||
                            (want, receive_stdout))
 | 
					                            (want, receive_stdout))
 | 
				
			||||||
| 
						 | 
					@ -511,8 +513,9 @@ class PregeneratedCode(ServerBase, ScriptsBase, unittest.TestCase):
 | 
				
			||||||
                             (receive_stdout, receive_stderr))
 | 
					                             (receive_stdout, receive_stderr))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # check sender
 | 
					        # check sender
 | 
				
			||||||
        self.failUnlessIn("Sending {bytes:d} byte file named '{name}'{NL}"
 | 
					        self.failUnlessIn("Sending {size:s} file named '{name}'{NL}"
 | 
				
			||||||
                          .format(bytes=len(message), name=send_filename,
 | 
					                          .format(size=naturalsize(len(message)),
 | 
				
			||||||
 | 
					                                  name=send_filename,
 | 
				
			||||||
                                  NL=NL), send_stdout)
 | 
					                                  NL=NL), send_stdout)
 | 
				
			||||||
        self.failUnlessIn("On the other computer, please run: "
 | 
					        self.failUnlessIn("On the other computer, please run: "
 | 
				
			||||||
                          "wormhole receive{NL}"
 | 
					                          "wormhole receive{NL}"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user