From 1d687abdc99235ada8e1fd9c3af8dd7273a089ea Mon Sep 17 00:00:00 2001 From: Ale Almuna Date: Sun, 20 Dec 2015 18:30:56 -0300 Subject: [PATCH 1/4] Return a list with test results speedest() returns a list with three values: download speed, upload speed and ping time. --- speedtest_cli.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/speedtest_cli.py b/speedtest_cli.py index d93d5c3..d0a98fd 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -784,6 +784,14 @@ def speedtest(): print_('Share results: %s://www.speedtest.net/result/%s.png' % (scheme, resultid[0])) + results = [ + (dlspeed / 1000 / 1000) * args.units[1], + (ulspeed / 1000 / 1000) * args.units[1], + best['latency'] + ] + + return results + def main(): try: From 8730705515848c205e7120855f67a3b278b1b34c Mon Sep 17 00:00:00 2001 From: Ale Almuna Date: Sun, 20 Dec 2015 19:55:36 -0300 Subject: [PATCH 2/4] Allow passing options to speedtest() in arguments The same options available for the cli interface are available for passing as function arguments. --- speedtest_cli.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/speedtest_cli.py b/speedtest_cli.py index d0a98fd..1b27d50 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -547,7 +547,7 @@ def version(): raise SystemExit(__version__) -def speedtest(): +def speedtest(**kwargs): """Run the full speedtest.net test""" global shutdown_event, source, scheme @@ -593,12 +593,30 @@ def speedtest(): parser.add_argument('--version', action='store_true', help='Show the version number and exit') - options = parser.parse_args() - if isinstance(options, tuple): - args = options[0] + if kwargs == {}: + options = parser.parse_args() + if isinstance(options, tuple): + args = options[0] + else: + args = options + del options else: - args = options - del options + opts_dict = {} + opts_dict['units'] = ('byte', 1) if 'bytes' in kwargs else ( + 'bit', 8) + opts_dict['share'] = kwargs['share'] if 'share' in kwargs else False + opts_dict['list'] = kwargs['list'] if 'list' in kwargs else False + opts_dict['server'] = str( + kwargs['server']) if 'server' in kwargs else None + opts_dict['mini'] = kwargs['mini'] if 'mini' in kwargs else None + opts_dict['source'] = kwargs['source'] if 'source' in kwargs else None + opts_dict['timeout'] = kwargs['timeout'] if 'timeout' in kwargs else 10 + opts_dict['secure'] = True if 'secure' in kwargs else False + opts_dict['version'] = True if 'version' in kwargs else False + opts_dict['simple'] = kwargs['simple'] if 'simple' in kwargs else False + + # Object to access dictionary values by attribute lookup + args = type('TestOptions', (object,), opts_dict) # Print the version and exit if args.version: From a2d3d72858b7feeda63cc2b381b04b5014ef1a45 Mon Sep 17 00:00:00 2001 From: Ale Almuna Date: Sun, 20 Dec 2015 20:43:08 -0300 Subject: [PATCH 3/4] Allow silent mode using 'verbose' parameter If a verbose=False parameter is passed to the speedtest function, the test doesn't print any message, but returns the results list. --- speedtest_cli.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/speedtest_cli.py b/speedtest_cli.py index 1b27d50..2e0120f 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -614,10 +614,19 @@ def speedtest(**kwargs): opts_dict['secure'] = True if 'secure' in kwargs else False opts_dict['version'] = True if 'version' in kwargs else False opts_dict['simple'] = kwargs['simple'] if 'simple' in kwargs else False + opts_dict['verbose'] = kwargs[ + 'verbose'] if 'verbose' in kwargs else True if opts_dict[ + 'simple'] else False + if not opts_dict['verbose']: + opts_dict['simple'] = True # Object to access dictionary values by attribute lookup args = type('TestOptions', (object,), opts_dict) + try: + args.verbose + except: + args.verbose = True # Print the version and exit if args.version: version() @@ -723,7 +732,7 @@ def speedtest(**kwargs): if not args.simple: print_(('Hosted by %(sponsor)s (%(name)s) [%(d)0.2f km]: ' '%(latency)s ms' % best).encode('utf-8', 'ignore')) - else: + elif args.verbose: print_('Ping: %(latency)s ms' % best) sizes = [350, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000] @@ -737,8 +746,9 @@ def speedtest(**kwargs): dlspeed = downloadSpeed(urls, args.simple) if not args.simple: print_() - print_('Download: %0.2f M%s/s' % - ((dlspeed / 1000 / 1000) * args.units[1], args.units[0])) + if args.verbose: + print_('Download: %0.2f M%s/s' % + ((dlspeed / 1000 / 1000) * args.units[1], args.units[0])) sizesizes = [int(.25 * 1000 * 1000), int(.5 * 1000 * 1000)] sizes = [] @@ -750,8 +760,9 @@ def speedtest(**kwargs): ulspeed = uploadSpeed(best['url'], sizes, args.simple) if not args.simple: print_() - print_('Upload: %0.2f M%s/s' % - ((ulspeed / 1000 / 1000) * args.units[1], args.units[0])) + if args.verbose: + print_('Upload: %0.2f M%s/s' % + ((ulspeed / 1000 / 1000) * args.units[1], args.units[0])) if args.share and args.mini: print_('Cannot generate a speedtest.net share results image while ' From 271e9d34c1b77199302e6fe0f45f5abda07a6edc Mon Sep 17 00:00:00 2001 From: Ale Almuna Date: Mon, 21 Dec 2015 16:31:49 -0300 Subject: [PATCH 4/4] Make it python2.4 compatible --- speedtest_cli.py | 81 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/speedtest_cli.py b/speedtest_cli.py index 2e0120f..86b1196 100755 --- a/speedtest_cli.py +++ b/speedtest_cli.py @@ -547,6 +547,65 @@ def version(): raise SystemExit(__version__) +def parse_args(kwargs): + """Receives a dictionary with the arguments passed to speedtest function + and returns an object which has one accesible attribute for each available + option. + """ + + opts_dict = {} + if 'bytes' in kwargs: + opts_dict['units'] = ('byte', 1) + else: + opts_dict['units'] = ('bit', 8) + if 'share' in kwargs: + opts_dict['share'] = kwargs['share'] + else: + opts_dict['share'] = False + if 'list' in kwargs: + opts_dict['list'] = kwargs['list'] + else: + opts_dict['list'] = False + if 'server' in kwargs: + opts_dict['server'] = str(kwargs['server']) + else: + opts_dict['server'] = None + if 'mini' in kwargs: + opts_dict['mini'] = kwargs['mini'] + else: + opts_dict['mini'] = None + if 'source' in kwargs: + opts_dict['source'] = kwargs['source'] + else: + opts_dict['source'] = None + if 'timeout' in kwargs: + opts_dict['timeout'] = kwargs['timeout'] + else: + opts_dict['timeout'] = 10 + if 'secure' in kwargs: + opts_dict['secure'] = True + else: + opts_dict['secure'] = False + if 'version' in kwargs: + opts_dict['version'] = True + else: + opts_dict['version'] = False + if 'simple' in kwargs: + opts_dict['simple'] = kwargs['simple'] + else: + opts_dict['simple'] = False + if 'verbose' in kwargs: + opts_dict['verbose'] = kwargs['verbose'] + elif opts_dict['simple']: + opts_dict['verbose'] = True + else: + opts_dict['verbose'] = False + if not opts_dict['verbose']: + opts_dict['simple'] = True + + return type('TestOptions', (object,), opts_dict) + + def speedtest(**kwargs): """Run the full speedtest.net test""" @@ -601,27 +660,7 @@ def speedtest(**kwargs): args = options del options else: - opts_dict = {} - opts_dict['units'] = ('byte', 1) if 'bytes' in kwargs else ( - 'bit', 8) - opts_dict['share'] = kwargs['share'] if 'share' in kwargs else False - opts_dict['list'] = kwargs['list'] if 'list' in kwargs else False - opts_dict['server'] = str( - kwargs['server']) if 'server' in kwargs else None - opts_dict['mini'] = kwargs['mini'] if 'mini' in kwargs else None - opts_dict['source'] = kwargs['source'] if 'source' in kwargs else None - opts_dict['timeout'] = kwargs['timeout'] if 'timeout' in kwargs else 10 - opts_dict['secure'] = True if 'secure' in kwargs else False - opts_dict['version'] = True if 'version' in kwargs else False - opts_dict['simple'] = kwargs['simple'] if 'simple' in kwargs else False - opts_dict['verbose'] = kwargs[ - 'verbose'] if 'verbose' in kwargs else True if opts_dict[ - 'simple'] else False - if not opts_dict['verbose']: - opts_dict['simple'] = True - - # Object to access dictionary values by attribute lookup - args = type('TestOptions', (object,), opts_dict) + args = parse_args(kwargs) try: args.verbose