psutil

Форк
0
/
print_downloads.py 
175 строк · 4.0 Кб
1
#!/usr/bin/env python3
2

3
# Copyright (c) 2009 Giampaolo Rodola'. All rights reserved.
4
# Use of this source code is governed by a BSD-style license that can be
5
# found in the LICENSE file.
6

7
"""Print PYPI statistics in MarkDown format.
8
Useful sites:
9
* https://pepy.tech/project/psutil
10
* https://pypistats.org/packages/psutil
11
* https://hugovk.github.io/top-pypi-packages/.
12
"""
13

14
from __future__ import print_function
15

16
import json
17
import os
18
import shlex
19
import subprocess
20
import sys
21

22
import pypinfo  # NOQA
23

24
from psutil._common import memoize
25

26

27
AUTH_FILE = os.path.expanduser("~/.pypinfo.json")
28
PKGNAME = 'psutil'
29
DAYS = 30
30
LIMIT = 100
31
GITHUB_SCRIPT_URL = (
32
    "https://github.com/giampaolo/psutil/blob/master/"
33
    "scripts/internal/pypistats.py"
34
)
35
LAST_UPDATE = None
36
bytes_billed = 0
37

38

39
# --- get
40

41

42
@memoize
43
def sh(cmd):
44
    assert os.path.exists(AUTH_FILE)
45
    env = os.environ.copy()
46
    env['GOOGLE_APPLICATION_CREDENTIALS'] = AUTH_FILE
47
    p = subprocess.Popen(
48
        shlex.split(cmd),
49
        stdout=subprocess.PIPE,
50
        stderr=subprocess.PIPE,
51
        universal_newlines=True,
52
        env=env,
53
    )
54
    stdout, stderr = p.communicate()
55
    if p.returncode != 0:
56
        raise RuntimeError(stderr)
57
    assert not stderr, stderr
58
    return stdout.strip()
59

60

61
@memoize
62
def query(cmd):
63
    global bytes_billed
64
    ret = json.loads(sh(cmd))
65
    bytes_billed += ret['query']['bytes_billed']
66
    return ret
67

68

69
def top_packages():
70
    global LAST_UPDATE
71
    ret = query(
72
        "pypinfo --all --json --days %s --limit %s '' project" % (DAYS, LIMIT)
73
    )
74
    LAST_UPDATE = ret['last_update']
75
    return [(x['project'], x['download_count']) for x in ret['rows']]
76

77

78
def ranking():
79
    data = top_packages()
80
    i = 1
81
    for name, downloads in data:
82
        if name == PKGNAME:
83
            return i
84
        i += 1
85
    raise ValueError("can't find %s" % PKGNAME)
86

87

88
def downloads():
89
    data = top_packages()
90
    for name, downloads in data:
91
        if name == PKGNAME:
92
            return downloads
93
    raise ValueError("can't find %s" % PKGNAME)
94

95

96
def downloads_pyver():
97
    return query("pypinfo --json --days %s %s pyversion" % (DAYS, PKGNAME))
98

99

100
def downloads_by_country():
101
    return query("pypinfo --json --days %s %s country" % (DAYS, PKGNAME))
102

103

104
def downloads_by_system():
105
    return query("pypinfo --json --days %s %s system" % (DAYS, PKGNAME))
106

107

108
def downloads_by_distro():
109
    return query("pypinfo --json --days %s %s distro" % (DAYS, PKGNAME))
110

111

112
# --- print
113

114

115
templ = "| %-30s | %15s |"
116

117

118
def print_row(left, right):
119
    if isinstance(right, int):
120
        right = '{:,}'.format(right)
121
    print(templ % (left, right))
122

123

124
def print_header(left, right="Downloads"):
125
    print_row(left, right)
126
    s = templ % ("-" * 30, "-" * 15)
127
    print("|:" + s[2:-2] + ":|")
128

129

130
def print_markdown_table(title, left, rows):
131
    pleft = left.replace('_', ' ').capitalize()
132
    print("### " + title)
133
    print()
134
    print_header(pleft)
135
    for row in rows:
136
        lval = row[left]
137
        print_row(lval, row['download_count'])
138
    print()
139

140

141
def main():
142
    downs = downloads()
143

144
    print("# Download stats")
145
    print()
146
    s = "psutil download statistics of the last %s days (last update " % DAYS
147
    s += "*%s*).\n" % LAST_UPDATE
148
    s += "Generated via [pypistats.py](%s) script.\n" % GITHUB_SCRIPT_URL
149
    print(s)
150

151
    data = [
152
        {'what': 'Per month', 'download_count': downs},
153
        {'what': 'Per day', 'download_count': int(downs / 30)},
154
        {'what': 'PYPI ranking', 'download_count': ranking()},
155
    ]
156
    print_markdown_table('Overview', 'what', data)
157
    print_markdown_table(
158
        'Operating systems', 'system_name', downloads_by_system()['rows']
159
    )
160
    print_markdown_table(
161
        'Distros', 'distro_name', downloads_by_distro()['rows']
162
    )
163
    print_markdown_table(
164
        'Python versions', 'python_version', downloads_pyver()['rows']
165
    )
166
    print_markdown_table(
167
        'Countries', 'country', downloads_by_country()['rows']
168
    )
169

170

171
if __name__ == '__main__':
172
    try:
173
        main()
174
    finally:
175
        print("bytes billed: %s" % bytes_billed, file=sys.stderr)
176

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.