pprint_package()   F
last analyzed

Complexity

Conditions 16

Size

Total Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 1 Features 1
Metric Value
cc 16
c 4
b 1
f 1
dl 0
loc 26
rs 2.7326

How to fix   Complexity   

Complexity

Complex classes like pprint_package() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
'''
2
Created on Aug 8, 2013
3
4
@author: sean
5
'''
6
from __future__ import unicode_literals
7
from dateutil.parser import parse as parse_date
8
import logging
9
10
logger = logging.getLogger('binstar.pprint')
11
12
fmt_access = '     %(full_name)-25s | %(latest_version)8s | %(access)-12s | %(package_types)-15s | %(conda_platforms)-15s | %(builds)-10s'
13
fmt_no_access = '     %(full_name)-25s | %(latest_version)8s | %(package_types)-15s | %(conda_platforms)-15s | %(builds)-10s'
14
15
16
def pprint_orgs(orgs):
17
    logger.info('Organizations:')
18
    for org in orgs:
19
        logger.info('   + %(login)25s' % org)
20
21
22
def pprint_package_header(access=True, revisions=False):
23
    package_header = {
24
        'full_name': 'Name',
25
        'access': 'Access',
26
        'package_types': 'Package Types',
27
        'latest_version': 'Version',
28
        'conda_platforms': 'Platforms',
29
        'revision': 'Rev',
30
        'builds': 'Builds',
31
    }
32
33
    fmt = fmt_access if access else fmt_no_access
34
    if revisions:
35
        fmt = '%(revision)-6s | ' + fmt
36
37
    logger.info(fmt % package_header)
38
39
40
def pprint_package(package, access=True, full_name=True, revision=False):
41
    package = package.copy()
42
43
    package['access'] = 'published' if package.get('published') else 'public' if package['public'] else 'private'
44
45
    if package.get('conda_platforms'):
46
        package['conda_platforms'] = ', '.join(str(x) for x in package['conda_platforms'] if x is not None)
47
48
    if not full_name:
49
        package['full_name'] = package['name']
50
51
    if package.get('package_types'):
52
        package['package_types'] = ', '.join(str(x) for x in package['package_types'] if x is not None)
53
54
    if package.get('builds'):
55
        package['builds'] = ', '.join(str(x) for x in package['builds'] if x is not None)
56
    else:
57
        package['builds'] = ''
58
59
    fmt = fmt_access if access else fmt_no_access
60
    if revision:
61
        fmt = '%(revision)-6s | ' + fmt
62
63
    logger.info(fmt % package)
64
    if package.get('summary'):
65
        logger.info(' ' * 34 + '        : %s' % package.get('summary'))
66
67
68
def pprint_packages(packages, access=True, full_name=True, revisions=False):
69
    if packages:
70
        logger.info('Packages:')
71
    else:
72
        logger.info('No packages found')
73
74
    fmt = fmt_access if access else fmt_no_access
75
    if revisions:
76
        fmt = '%(revision)-6s | ' + fmt
77
    pprint_package_header(access, revisions=revisions)
78
79
    package_header = {
80
        'full_name': '-' * 25,
81
        'access': '-' * 12,
82
        'latest_version': '-' * 6,
83
        'conda_platforms': '-' * 15,
84
        'package_types': '-' * 15,
85
        'revision': '-' * 6,
86
        'builds': '-' * 10
87
    }
88
89
    logger.info(fmt % package_header)
90
91
    for package in sorted(packages, key=lambda pkg: pkg['full_name'] if full_name else pkg['name']):
92
        pprint_package(package, access, full_name, revision=revisions)
93
94
95
def pprint_user(user):
96
    user = user.copy()
97
    logger.info('Username: %s', user.pop('login'))
98
    logger.info('Member since: %s', parse_date(user.pop('created_at')).ctime())
99
100
    for key_value in user.items():
101
        logger.info('  +%s: %s' % key_value)
102
103
104
def pprint_collections(collections):
105
    if collections:
106
        logger.info('Collections:')
107
    for collection in collections:
108
        collection['permission'] = 'public' if collection['public'] else 'private'
109
        logger.info('   + %(name)25s: [%(permission)s] %(description)s' % collection)
110