├── .gitignore
├── .travis.yml
├── LICENSE
├── Makefile
├── README.md
├── fabfile.py
├── generate.py
├── index.html
├── requirements.txt
├── results.json
├── src
├── __init__.py
├── flags.py
├── storage.py
├── svg_wheel.py
└── utils.py
├── wheel.css
└── wheel.svg
/.gitignore:
--------------------------------------------------------------------------------
1 | *.py[cod]
2 | data.json
3 | pip-selfcheck.json
4 | .Python
5 | include/
6 | bin/
7 | lib/
8 | .idea/
9 | .DS_Store
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: python
2 |
3 | # Supported CPython versions:
4 | # https://en.wikipedia.org/wiki/CPython#Version_history
5 | python:
6 | - 2.7
7 | - 3.6
8 |
9 | sudo: false
10 |
11 | install:
12 | - pip install flake8
13 | - pip install -r requirements.txt
14 |
15 | script:
16 | # Static analysis
17 | - flake8 --statistics --count .
18 |
19 | # Test run
20 | - make generate
21 |
22 | matrix:
23 | fast_finish: true
24 |
25 | notifications:
26 | email: false
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2013, Charlie Denton
2 | All rights reserved.
3 |
4 | Redistribution and use in source and binary forms, with or without modification,
5 | are permitted provided that the following conditions are met:
6 |
7 | 1. Redistributions of source code must retain the above copyright notice,
8 | this list of conditions and the following disclaimer.
9 |
10 | 2. Redistributions in binary form must reproduce the above copyright notice,
11 | this list of conditions and the following disclaimer in the documentation
12 | and/or other materials provided with the distribution.
13 |
14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
18 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | help:
2 | @echo "make help -- print this help"
3 | @echo "make generate -- regenerate the json"
4 | @echo "make update -- upload the json and index.html to s3"
5 |
6 | generate:
7 | wget https://hugovk.github.io/top-pypi-packages/top-pypi-packages-365-days.min.json -O data.json
8 | python generate.py
9 |
10 | update:
11 | /usr/local/bin/s3cmd put index.html s3://wheelpackages/index.html --cf-invalidate \
12 | --add-header='Cache-Control: max-age=30' \
13 | --add-header='Date: `date -u +"%a, %d %b %Y %H:%M:%S GMT"`'
14 | /usr/local/bin/s3cmd put results.json s3://wheelpackages/results.json --cf-invalidate \
15 | --add-header='Cache-Control: max-age=30' \
16 | --add-header='Date: `date -u +"%a, %d %b %Y %H:%M:%S GMT"`'
17 | /usr/local/bin/s3cmd put wheel.svg s3://wheelpackages/wheel.svg --cf-invalidate \
18 | --add-header='Cache-Control: max-age=30' \
19 | --add-header='Date: `date -u +"%a, %d %b %Y %H:%M:%S GMT"`'
20 | /usr/local/bin/s3cmd put wheel.css s3://wheelpackages/wheel.css --cf-invalidate \
21 | --add-header='Cache-Control: max-age=30' \
22 | --add-header='Date: `date -u +"%a, %d %b %Y %H:%M:%S GMT"`'
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Python 3 readiness
2 | ==================
3 |
4 | Python 3 support graph for most popular Python libraries and packages http://chhantyal.net/py3readiness
5 |
6 |
7 | ## How do you identify Python 3 support?
8 |
9 | This site utilizes little tool, [caniusepython3](https://github.com/brettcannon/caniusepython3) created by Brett Cannon.
10 |
11 | Throw your `requirements.txt` file at it and it will tell you which packages support Python 3, and list out which don't.
12 |
13 | ## Contribute
14 |
15 | Please use issue tracker for issues, suggestions, feature requests and further enhancements.
16 |
17 |
18 | ## How does the site work?
19 |
20 | The site works by checking PyPi periodically (currently daily).
21 | Script `generate.py` is run daily which generates JSON and updates date and time.
22 |
23 | For almost a year, the site was running on very low resource VPS with nginx as web server.
24 | Daily update was done via cron job in same machine.
25 |
26 | Currently, `generate.py` function is run on AWS Lambda.
27 | It saves output JSON file to S3 which is used to build graph. Site itself is hosted on GitHub Pages.
28 |
29 | ## Local
30 |
31 | Output (`results.json`, `wheel.svg`, `wheel.css`) are uploaded to S3. You need to configure `aws-cli`
32 |
33 | 1. `aws configure`
34 | 2. `python generate.py`
35 |
36 | ## Deploy
37 |
38 | AWS Lambda needs all dependencies as zip file along with codebase.
39 |
40 | 1. `zip -r app.zip generate.py src/`
41 | 2. `cd path/to/site-packages/`
42 | 3. `zip -r app.zip *`
43 |
44 | Finally, upload the app.zip file and update version.
45 |
46 | ## Credits
47 |
48 | This is derivative work from [Python Wheels](https://pythonwheels.com), a site that tracks progress in new Python package distribution standard called [Wheels](https://pypi.org/project/wheel/). All the credits goes to [meshy](https://github.com/meshy).
49 |
--------------------------------------------------------------------------------
/fabfile.py:
--------------------------------------------------------------------------------
1 | import os
2 | from contextlib import contextmanager
3 | from fabric.api import env, run, prefix
4 |
5 |
6 | def live():
7 | """Connects to the server."""
8 | env.hosts = ['py3readiness.org']
9 | env.user = os.environ.get('py3_user', '')
10 | env.cwd = '/var/www/py3readiness.org'
11 | env.connect_to = '{0}@{1}:{2}'.format(env.user, env.hosts[0], env.cwd)
12 |
13 |
14 | def gitpull(tag=None):
15 | """Pulls upstream brunch on the server."""
16 | if tag is not None:
17 | run('git pull')
18 | run('git checkout %s' % tag)
19 | else:
20 | run('git pull')
21 |
22 |
23 | @contextmanager
24 | def source_env():
25 | """Actives embedded virtual env"""
26 | with prefix('source env/bin/activate'):
27 | yield
28 |
29 |
30 | def install_requirements():
31 | """Installs requirements inside vertualenv"""
32 | with source_env():
33 | run('pip install --force-reinstall -Ur requirements.txt')
34 |
35 |
36 | def generate():
37 | """Generates updates using generate.py script"""
38 | with source_env():
39 | run('python generate.py')
40 |
41 |
42 | def update(tag=None):
43 | """Updates changes in server (might restart webserver)"""
44 | gitpull()
45 | install_requirements()
46 | generate()
47 |
--------------------------------------------------------------------------------
/generate.py:
--------------------------------------------------------------------------------
1 | from src.svg_wheel import generate_svg_wheel
2 | from src.utils import (
3 | annotate_wheels,
4 | get_top_packages,
5 | remove_irrelevant_packages,
6 | save_to_file,
7 | )
8 |
9 |
10 | TO_CHART = 360
11 |
12 |
13 | def main(*args):
14 | packages = remove_irrelevant_packages(get_top_packages(), TO_CHART)
15 | annotate_wheels(packages)
16 | save_to_file(packages)
17 | generate_svg_wheel(packages, TO_CHART)
18 |
19 |
20 | if __name__ == '__main__':
21 | main()
22 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
77 |
78 |
89 | Python 3 Readiness - Python 3 support table for most popular Python packages
90 |
91 |
92 |
93 |
94 |
95 |
Python 3 Readiness
96 |
Python 3 support graph for the 360 most popular Python packages!
97 |
98 |
What is this about?
99 |
This site shows Python 3 support for the 360 most downloaded packages on PyPI :
100 |
101 | Green packages support Python 3 (or have a drop-in replacement package which supports Python 3);
102 | White packages don't support Python 3 yet.
103 |
104 |
Package 'x' is white. What can I do?
105 |
There can be many reasons why a package still does not support Python 3.
106 |
107 |
108 |
109 | If you are package maintainer, it's time to start porting (if you haven't already).
110 | Here is an in-depth guide Porting to Python 3
111 | and the official porting HOWTO .
112 | If you are not able to give the time needed, please seek for help from the community
113 | by announcing your need for help on blogs, IRC, mailing lists, etc.
114 |
115 |
116 |
117 |
118 | If you are user of the package, send a friendly note to the package maintainer.
119 | Or fork it, and send a pull request to help move the project towards Python 3 support.
120 |
121 |
122 |
123 |
How do you identify Python 3 support?
124 |
125 | This site utilizes a little tool, caniusepython3 , created by Brett Cannon.
126 | Throw your requirements.txt file at it and it will tell you which packages support Python 3, and list out which don't.
127 | If you want to know how the site works, see README .
128 |
129 |
130 |
131 |
132 |
137 |
138 |
139 |
140 |
141 |
142 |
Top 120
143 |
144 |
145 |
py3readiness.org requires javascript to be enabled to display the list of packages.
146 |
147 |
148 |
149 |
150 |
Top 120 - 240
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
Top 240 - 360
159 |
160 |
161 |
162 |
163 |
164 |
Thanks
165 |
166 | This is derivative work from Python Wheels ,
167 | a site that tracks progress in new Python package distribution standard called Wheels .
168 | All the credits goes to meshy .
169 |
170 |
171 |
172 |
176 |
177 |
199 |
200 |
209 |
210 |
211 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | boto3
2 | caniusepython3
3 | requests
4 |
--------------------------------------------------------------------------------
/results.json:
--------------------------------------------------------------------------------
1 | {"data": [{"downloads": 640549346, "name": "urllib3", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 614202074, "name": "pip", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 530046750, "name": "six", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 508485038, "name": "botocore", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 460222302, "name": "python-dateutil", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 442475488, "name": "s3transfer", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 411685795, "name": "requests", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 399099733, "name": "pyyaml", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 382951071, "name": "pyasn1", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 374567882, "name": "docutils", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 373979523, "name": "certifi", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 361003864, "name": "jmespath", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 353184579, "name": "idna", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 351656343, "name": "rsa", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 325177813, "name": "chardet", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 322533351, "name": "awscli", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 321338351, "name": "setuptools", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 312080442, "name": "futures", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 296611498, "name": "colorama", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 272324986, "name": "simplejson", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 264369430, "name": "wheel", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 242953676, "name": "pytz", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 226976561, "name": "boto3", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 177232985, "name": "markupsafe", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 176164722, "name": "numpy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 163988009, "name": "cffi", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 161644440, "name": "protobuf", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 151960166, "name": "cryptography", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 151358016, "name": "jinja2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 139609195, "name": "enum34", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 125965800, "name": "awscli-cwlogs", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 121738402, "name": "pyasn1-modules", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 114656157, "name": "pycparser", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 113300132, "name": "attrs", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 112609094, "name": "asn1crypto", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 109642923, "name": "click", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 106306150, "name": "google-api-core", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 101917895, "name": "pytest", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 101796181, "name": "future", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 100003292, "name": "pandas", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 95664610, "name": "cachetools", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 94501878, "name": "ipaddress", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 93815960, "name": "werkzeug", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 93277133, "name": "grpcio", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 92655259, "name": "decorator", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 90988567, "name": "google-cloud-core", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 88906167, "name": "google-auth", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 87622390, "name": "pyparsing", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 85461667, "name": "flask", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 81857979, "name": "itsdangerous", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 80433505, "name": "pbr", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 79361470, "name": "psutil", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 78108694, "name": "virtualenv", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 77953775, "name": "pluggy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 75359909, "name": "scipy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 75298943, "name": "googleapis-common-protos", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 72614749, "name": "py", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 70121702, "name": "coverage", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 69450021, "name": "mock", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 67011575, "name": "scikit-learn", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 66843451, "name": "pyopenssl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 66510836, "name": "boto", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 66194280, "name": "jsonschema", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 65519688, "name": "more-itertools", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 64314724, "name": "pygments", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 59653926, "name": "websocket-client", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 58780138, "name": "oauthlib", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 58343739, "name": "argparse", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 58092483, "name": "matplotlib", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 57825867, "name": "pillow", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 57782920, "name": "multidict", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 57681916, "name": "httplib2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 56840215, "name": "pyjwt", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 55692810, "name": "prompt-toolkit", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 54775858, "name": "ipython", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 54733976, "name": "requests-oauthlib", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 54647001, "name": "psycopg2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 54005079, "name": "google-api-python-client", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 52341463, "name": "docker", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 52212798, "name": "oauth2client", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 52033756, "name": "google-cloud-storage", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 52018622, "name": "lxml", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 51735561, "name": "paramiko", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 51455591, "name": "wrapt", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 51282044, "name": "tornado", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 50907709, "name": "google-resumable-media", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 50693826, "name": "aiohttp", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 50688102, "name": "funcsigs", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 50169781, "name": "docopt", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 49039298, "name": "mccabe", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 48671001, "name": "atomicwrites", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 48389561, "name": "sqlalchemy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 47778176, "name": "wcwidth", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 47661325, "name": "bcrypt", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 47203479, "name": "markdown", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 45833430, "name": "tqdm", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 45163222, "name": "docker-pycreds", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 44200577, "name": "backports-functools-lru-cache", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 44005760, "name": "uritemplate", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 43864394, "name": "google-cloud-bigquery", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 43781534, "name": "pynacl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 43684672, "name": "ptyprocess", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 43590816, "name": "pycodestyle", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 43299706, "name": "pexpect", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 42399992, "name": "absl-py", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 41792082, "name": "redis", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 41740236, "name": "beautifulsoup4", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 41183935, "name": "typing", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 41175911, "name": "kiwisolver", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 40724366, "name": "configparser", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 39822898, "name": "packaging", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 38764267, "name": "gunicorn", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 37758206, "name": "pathlib2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 37528076, "name": "functools32", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 37329550, "name": "ipython-genutils", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 37228733, "name": "lazy-object-proxy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 37175440, "name": "traitlets", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 37078882, "name": "elasticsearch", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 36495577, "name": "pyflakes", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 36407926, "name": "gevent", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 36229070, "name": "async-timeout", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 35850309, "name": "networkx", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 34776577, "name": "termcolor", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 34271254, "name": "requests-toolbelt", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 33644617, "name": "cycler", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 33587052, "name": "pickleshare", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 33513113, "name": "greenlet", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 33291943, "name": "sklearn", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32799384, "name": "toolz", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32777347, "name": "scikit-image", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32664551, "name": "google-auth-httplib2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32338068, "name": "babel", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32335451, "name": "scandir", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32155473, "name": "opencv-python", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 32153082, "name": "django", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 31811550, "name": "tabulate", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 31535692, "name": "h5py", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 31290738, "name": "flake8", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 31285763, "name": "pymysql", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 31032291, "name": "azure-common", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 30784005, "name": "isort", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 30658927, "name": "defusedxml", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 30595045, "name": "ujson", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 30302217, "name": "tensorflow", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 30252079, "name": "tensorboard", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 30214976, "name": "isodate", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 29393571, "name": "pymongo", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 29248735, "name": "webencodings", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 29231757, "name": "pylint", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 29098134, "name": "bleach", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 29076741, "name": "entrypoints", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 28971208, "name": "pycryptodome", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 28951622, "name": "astroid", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 28132755, "name": "subprocess32", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 27866337, "name": "websockets", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 27718601, "name": "datadog", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 27416482, "name": "dask", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 27407233, "name": "dill", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 27366302, "name": "zope-interface", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 27119290, "name": "retrying", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26918483, "name": "gitpython", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26753048, "name": "pytest-cov", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26698712, "name": "psycopg2-binary", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26497319, "name": "pyzmq", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26414260, "name": "cached-property", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26331358, "name": "astor", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 26089635, "name": "docker-compose", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25813607, "name": "yarl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25737949, "name": "html5lib", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25692366, "name": "keras-applications", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25668316, "name": "gast", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25598613, "name": "keras-preprocessing", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25597223, "name": "typed-ast", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25447118, "name": "selenium", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25382880, "name": "pymemcache", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25172756, "name": "gitdb2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25168948, "name": "smmap2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25123473, "name": "pywavelets", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 25006264, "name": "nose", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 24936752, "name": "singledispatch", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 24712310, "name": "contextlib2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 24269111, "name": "jsonpickle", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 23735888, "name": "backports-ssl-match-hostname", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 23683732, "name": "discord-py", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 23458515, "name": "apache-beam", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 23391352, "name": "azure-nspkg", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 23222426, "name": "simplegeneric", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 23075233, "name": "ordereddict", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 22774106, "name": "xmltodict", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 22706882, "name": "parso", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 22507637, "name": "jedi", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 22447375, "name": "trueskill", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 22137297, "name": "jupyter-core", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 21745587, "name": "nbformat", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 21681722, "name": "appdirs", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 21610459, "name": "pykube", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 21058099, "name": "sortedcontainers", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 20590123, "name": "monotonic", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 20530693, "name": "xlrd", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 20393113, "name": "tzlocal", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 20336154, "name": "hdfs", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 20082768, "name": "grpc-google-iam-v1", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19804344, "name": "azure-storage-common", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19765660, "name": "unidecode", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19756095, "name": "cython", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19754719, "name": "amqp", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19627267, "name": "pyrsistent", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19599890, "name": "google-cloud-firestore", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19583483, "name": "soupsieve", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19475838, "name": "raven", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19386938, "name": "kombu", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19331776, "name": "ansible", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 19305362, "name": "msgpack", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18838907, "name": "azure-storage-blob", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18773749, "name": "msrest", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18662826, "name": "dnspython", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18600277, "name": "hiredis", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18557474, "name": "elasticsearch-dsl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18525438, "name": "toml", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18399507, "name": "backports-weakref", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18316368, "name": "prettytable", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18260997, "name": "mako", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18151733, "name": "adal", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18088995, "name": "snowballstemmer", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18056408, "name": "keras", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 18018594, "name": "prometheus-client", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17929094, "name": "croniter", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17799870, "name": "arrow", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17772599, "name": "py4j", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17755977, "name": "lockfile", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17570398, "name": "celery", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17561348, "name": "pycrypto", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17524116, "name": "dockerpty", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17465876, "name": "texttable", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17440823, "name": "importlib-metadata", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17349795, "name": "alabaster", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17212881, "name": "ply", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17069333, "name": "billiard", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 17039900, "name": "sqlparse", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16771384, "name": "pycryptodomex", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16691973, "name": "sphinx", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16551988, "name": "thrift", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16389889, "name": "zipp", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16356302, "name": "nvidia-ml-py3", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16350150, "name": "backcall", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 16056154, "name": "regex", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15950423, "name": "nltk", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15919759, "name": "netaddr", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15856282, "name": "unicodecsv", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15781531, "name": "ruamel-yaml", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15690856, "name": "ecdsa", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15669775, "name": "slackclient", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15650010, "name": "imagesize", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15644458, "name": "alembic", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15521353, "name": "backports-shutil-get-terminal-size", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15462729, "name": "mistune", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15461731, "name": "ipykernel", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15303922, "name": "jupyter-client", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15122912, "name": "python-editor", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 15044176, "name": "djangorestframework", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14892079, "name": "backports-abc", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14863972, "name": "vine", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14680087, "name": "google-cloud-datastore", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14462957, "name": "openpyxl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14419673, "name": "tox", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14320339, "name": "manhole", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14222991, "name": "notebook", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14185500, "name": "typing-extensions", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14156383, "name": "google-cloud-logging", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14124653, "name": "gym", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14123721, "name": "nbconvert", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 14064401, "name": "xlsxwriter", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13957684, "name": "joblib", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13933829, "name": "statsd", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13909337, "name": "mysqlclient", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13738374, "name": "cloudpickle", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13678420, "name": "testpath", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13663179, "name": "terminado", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13495627, "name": "ijson", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13484248, "name": "pypng", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13465635, "name": "pyserial", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13410551, "name": "msrestazure", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13408445, "name": "jdcal", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13393310, "name": "send2trash", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13318448, "name": "pandocfilters", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13281281, "name": "pyhamcrest", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13250144, "name": "smart-open", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13179764, "name": "sphinxcontrib-websupport", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13164488, "name": "google-auth-oauthlib", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13042414, "name": "idna-ssl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 13016080, "name": "ipywidgets", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12923686, "name": "widgetsnbextension", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12920411, "name": "iso8601", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12573234, "name": "uvloop", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12409771, "name": "statsmodels", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12389646, "name": "pyarrow", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12388170, "name": "et-xmlfile", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12383921, "name": "xgboost", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12344077, "name": "linecache2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12298246, "name": "bz2file", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12244131, "name": "s3fs", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12226913, "name": "traceback2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12171985, "name": "ndg-httpsclient", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12107938, "name": "snowflake-connector-python", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 12096599, "name": "twisted", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11992763, "name": "unittest2", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11955749, "name": "google-cloud-pubsub", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11942973, "name": "filelock", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11846492, "name": "aniso8601", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11680678, "name": "plotly", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11631681, "name": "stevedore", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11526097, "name": "qtconsole", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11413256, "name": "virtualenv-clone", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11292191, "name": "flask-cors", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11183517, "name": "text-unidecode", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11035718, "name": "incremental", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 11000056, "name": "azure-storage-nspkg", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10953476, "name": "jupyter-console", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10871679, "name": "python-jose", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10853357, "name": "constantly", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10737709, "name": "automat", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10712294, "name": "patsy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10704268, "name": "jupyter", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10656981, "name": "flask-sqlalchemy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10626939, "name": "hyperlink", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10625711, "name": "inflection", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10587769, "name": "faker", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10574765, "name": "python-magic", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10490362, "name": "azure-mgmt-resource", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10485520, "name": "configobj", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10365896, "name": "python-daemon", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10354670, "name": "marshmallow", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10289270, "name": "netifaces", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10065277, "name": "uwsgi", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10062565, "name": "tensorflow-estimator", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10061729, "name": "shapely", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10057640, "name": "ua-parser", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10030036, "name": "humanfriendly", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 10022314, "name": "libtmux", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9939824, "name": "bs4", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9935392, "name": "pycurl", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9932424, "name": "pipenv", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9899884, "name": "apipkg", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9793085, "name": "azure-mgmt-storage", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9755432, "name": "argcomplete", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9709666, "name": "newrelic", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9702287, "name": "fuzzywuzzy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9671574, "name": "execnet", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9648077, "name": "azure-mgmt-nspkg", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9587993, "name": "cherrypy", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9517970, "name": "applicationinsights", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9502986, "name": "webob", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9499941, "name": "fasteners", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9418382, "name": "seaborn", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9397288, "name": "autopep8", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9343773, "name": "pathspec", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9341476, "name": "service-identity", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9336050, "name": "wtforms", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9276296, "name": "pep8", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}, {"downloads": 9259558, "name": "pydot", "value": 1, "py3support": true, "css_class": "success", "icon": "\u2713", "title": "This package supports Python 3 :)"}], "last_update": "Tuesday, 06 August 2019, 10:47:26 "}
--------------------------------------------------------------------------------
/src/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
--------------------------------------------------------------------------------
/src/flags.py:
--------------------------------------------------------------------------------
1 | """
2 | It contains all the projects that can be ignored in graph. For example, there
3 | are many Mozilla libs with large download stat which are not really used by
4 | community. See issue #22
5 | """
6 |
7 | FLAGS = {
8 | "rackspace-novaclient":
9 | "https://github.com/rackerlabs/rackspace-novaclient",
10 | "manifestparser": "https://pypi.org/project/manifestparser",
11 | "mozrunner": "https://pypi.org/project/mozrunner",
12 | "moznetwork": "https://pypi.org/project/moznetwork",
13 | "mozdevice": "https://pypi.org/project/mozdevice",
14 | "mozprofile": "https://pypi.org/project/mozprofile",
15 | "mozprocess": "https://pypi.org/project/mozprocess",
16 | "mozfile": "https://pypi.org/project/mozfile",
17 | "mozinfo": "https://pypi.org/project/mozinfo",
18 | "mozlog": "https://pypi.org/project/mozlog",
19 | "mozcrash": "https://pypi.org/project/mozcrash",
20 | "mozhttpd": "https://pypi.org/project/mozhttpd",
21 | "moztest": "https://pypi.org/project/moztest",
22 | "mozversion": "https://pypi.org/project/mozversion",
23 | "marionette_client": "https://pypi.org/project/marionette_client",
24 | "marionette-transport": "https://pypi.org/project/marionette-transport",
25 | }
26 |
--------------------------------------------------------------------------------
/src/storage.py:
--------------------------------------------------------------------------------
1 | import boto3
2 |
3 | s3_client = boto3.client('s3')
4 |
5 | bucket = 'py3readiness'
6 |
7 | metadata = {
8 | "CacheControl": "max-age=21600, public" # 6 hours
9 | }
10 |
--------------------------------------------------------------------------------
/src/svg_wheel.py:
--------------------------------------------------------------------------------
1 | import math
2 | import copy
3 | import xml.etree.ElementTree as et
4 |
5 | from src.storage import s3_client, bucket, metadata
6 |
7 | HEADERS = b'''
8 |
9 |
11 | '''
12 |
13 | PATH_TEMPLATE = '''
14 | M {start_outer_x},{start_outer_y}
15 | A{outer_radius},{outer_radius} 0 0 1 {end_outer_x},{end_outer_y}
16 | L {start_inner_x},{start_inner_y}
17 | A{inner_radius},{inner_radius} 0 0 0 {end_inner_x},{end_inner_y}
18 | Z
19 | '''
20 |
21 | FRACTION_LINE = 80
22 | OFFSET = 20
23 | PADDING = 10
24 | RADIUS = 180
25 | CENTER = PADDING + RADIUS
26 | TAU = 2 * math.pi
27 |
28 |
29 | def annular_sector_path(
30 | center_x, center_y, inner_radius, outer_radius, start, stop):
31 | points = {
32 | 'inner_radius': inner_radius,
33 | 'outer_radius': outer_radius,
34 | 'start_outer_x': center_x + outer_radius * math.cos(start),
35 | 'start_outer_y': center_y + outer_radius * math.sin(start),
36 | 'end_outer_x': center_x + outer_radius * math.cos(stop),
37 | 'end_outer_y': center_y + outer_radius * math.sin(stop),
38 | 'start_inner_x': center_x + inner_radius * math.cos(stop),
39 | 'start_inner_y': center_y + inner_radius * math.sin(stop),
40 | 'end_inner_x': center_x + inner_radius * math.cos(start),
41 | 'end_inner_y': center_y + inner_radius * math.sin(start),
42 | }
43 |
44 | return PATH_TEMPLATE.format(**points)
45 |
46 |
47 | def add_annular_sector(
48 | wheel, center, inner_radius, outer_radius, start, stop, style_class):
49 | return et.SubElement(
50 | wheel, 'path',
51 | d=annular_sector_path(
52 | center_x=center[0], center_y=center[1],
53 | inner_radius=inner_radius, outer_radius=outer_radius,
54 | start=start, stop=stop,
55 | ),
56 | attrib={'class': style_class},
57 | )
58 |
59 |
60 | def angles(index, total):
61 | start = index * TAU / total
62 | stop = (index + 1) * TAU / total
63 |
64 | return (start - TAU / 4, stop - TAU / 4)
65 |
66 |
67 | def add_fraction(wheel, packages, total):
68 | text_attributes = {
69 | 'text-anchor': 'middle',
70 | 'dominant-baseline': 'central',
71 | 'font-size': str(2 * OFFSET),
72 | 'font-family': '"Helvetica Neue",Helvetica,Arial,sans-serif',
73 | 'fill': '#333333',
74 | }
75 |
76 | # Packages with some sort of wheel
77 | wheel_packages = sum(package['py3support'] for package in packages)
78 |
79 | packages_with_wheels = et.SubElement(
80 | wheel, 'text',
81 | x=str(CENTER), y=str(CENTER - OFFSET),
82 | attrib=text_attributes,
83 | )
84 | packages_with_wheels.text = '{0}'.format(wheel_packages)
85 |
86 | # Dividing line
87 | et.SubElement(
88 | wheel, 'line',
89 | x1=str(CENTER - FRACTION_LINE // 2), y1=str(CENTER),
90 | x2=str(CENTER + FRACTION_LINE // 2), y2=str(CENTER),
91 | attrib={'stroke': '#333333', 'stroke-width': '2'},
92 | )
93 |
94 | # Total packages
95 | total_packages = et.SubElement(
96 | wheel, 'text',
97 | x=str(CENTER), y=str(CENTER + OFFSET),
98 | attrib=text_attributes,
99 | )
100 | total_packages.text = '{0}'.format(total)
101 |
102 |
103 | def generate_svg_wheel(packages, total):
104 | wheel = et.Element(
105 | 'svg',
106 | viewBox='0 0 {0} {0}'.format(2 * CENTER),
107 | version='1.1',
108 | xmlns='http://www.w3.org/2000/svg',
109 | )
110 |
111 | for index, result in enumerate(packages):
112 | start, stop = angles(index, total)
113 | sector = add_annular_sector(
114 | wheel,
115 | center=(CENTER, CENTER),
116 | inner_radius=RADIUS // 2,
117 | outer_radius=RADIUS,
118 | start=start,
119 | stop=stop,
120 | style_class=result['css_class'],
121 | )
122 | title = et.SubElement(sector, 'title')
123 | title.text = u'{0} {1}'.format(result['name'], result['icon'])
124 |
125 | add_fraction(wheel, packages, total)
126 |
127 | tmp_wheel_path = './wheel.svg'
128 | with open(tmp_wheel_path, 'wb') as svg:
129 | svg.write(HEADERS)
130 | svg.write(et.tostring(wheel))
131 |
132 | key = 'wheel.svg'
133 | extra_args = copy.deepcopy(metadata)
134 | extra_args["ContentType"] = "image/svg+xml"
135 |
136 | try:
137 | s3_client.upload_file(tmp_wheel_path, bucket, key,
138 | ExtraArgs=extra_args)
139 | except Exception as e:
140 | print(e)
141 |
--------------------------------------------------------------------------------
/src/utils.py:
--------------------------------------------------------------------------------
1 | import copy
2 | import datetime
3 | import json
4 |
5 | import caniusepython3
6 |
7 | from src.storage import bucket, metadata, s3_client
8 | from src.flags import FLAGS
9 |
10 | BASE_URL = 'https://pypi.org/pypi'
11 |
12 |
13 | def get_json_url(package_name):
14 | return BASE_URL + '/' + package_name + '/json'
15 |
16 |
17 | def annotate_wheels(packages):
18 | print('Getting package data...')
19 | num_packages = len(packages)
20 | for index, package in enumerate(packages):
21 | print(index + 1, num_packages, package['name'])
22 |
23 | package['value'] = 1
24 | if caniusepython3.check(projects=[package['name']]):
25 | package['py3support'] = True
26 | package['css_class'] = 'success'
27 | package['icon'] = u'\u2713' # Check mark
28 | package['title'] = 'This package supports Python 3 :)'
29 | else:
30 | package['py3support'] = False
31 | package['css_class'] = 'default'
32 | package['icon'] = u'\u2717' # Ballot X
33 | package['title'] = 'This package does not support Python 3 (yet!).'
34 |
35 |
36 | def get_top_packages():
37 | print('Getting packages...')
38 |
39 | with open('data.json') as data_file:
40 | packages = json.load(data_file)['rows']
41 |
42 | # Rename keys
43 | for package in packages:
44 | package['downloads'] = package.pop('download_count')
45 | package['name'] = package.pop('project')
46 |
47 | return packages
48 |
49 |
50 | def remove_irrelevant_packages(packages, limit):
51 | print('Removing cruft...')
52 | added_limit = limit + len(FLAGS)
53 | packages = packages[:added_limit]
54 |
55 | packages = [package for package in packages
56 | if package.get('name') not in FLAGS.keys()]
57 |
58 | return packages[:limit]
59 |
60 |
61 | def save_to_file(packages):
62 | now = datetime.datetime.now()
63 | key = 'results.json'
64 | tmp_path = './{0}'.format(key)
65 | with open(tmp_path, 'w') as f:
66 | f.write(json.dumps({
67 | 'data': packages,
68 | 'last_update': now.strftime('%A, %d %B %Y, %X %Z'),
69 | }))
70 |
71 | extra_args = copy.deepcopy(metadata)
72 | extra_args["ContentType"] = "application/json"
73 |
74 | try:
75 | s3_client.upload_file(tmp_path, bucket, key, ExtraArgs=extra_args)
76 | except Exception as e:
77 | print(e)
78 |
--------------------------------------------------------------------------------
/wheel.css:
--------------------------------------------------------------------------------
1 | .success {
2 | stroke: #4CAE4C;
3 | stroke-width: 1;
4 | fill: #5CB85C;
5 | }
6 |
7 | .default {
8 | stroke: #cccccc;
9 | stroke-width: 1;
10 | fill: #ffffff;
11 | }
12 |
--------------------------------------------------------------------------------
/wheel.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 | urllib3 ✓ pip ✓ six ✓ botocore ✓ python-dateutil ✓ s3transfer ✓ requests ✓ pyyaml ✓ pyasn1 ✓ docutils ✓ certifi ✓ jmespath ✓ idna ✓ rsa ✓ chardet ✓ awscli ✓ setuptools ✓ futures ✓ colorama ✓ simplejson ✓ wheel ✓ pytz ✓ boto3 ✓ markupsafe ✓ numpy ✓ cffi ✓ protobuf ✓ cryptography ✓ jinja2 ✓ enum34 ✓ awscli-cwlogs ✓ pyasn1-modules ✓ pycparser ✓ attrs ✓ asn1crypto ✓ click ✓ google-api-core ✓ pytest ✓ future ✓ pandas ✓ cachetools ✓ ipaddress ✓ werkzeug ✓ grpcio ✓ decorator ✓ google-cloud-core ✓ google-auth ✓ pyparsing ✓ flask ✓ itsdangerous ✓ pbr ✓ psutil ✓ virtualenv ✓ pluggy ✓ scipy ✓ googleapis-common-protos ✓ py ✓ coverage ✓ mock ✓ scikit-learn ✓ pyopenssl ✓ boto ✓ jsonschema ✓ more-itertools ✓ pygments ✓ websocket-client ✓ oauthlib ✓ argparse ✓ matplotlib ✓ pillow ✓ multidict ✓ httplib2 ✓ pyjwt ✓ prompt-toolkit ✓ ipython ✓ requests-oauthlib ✓ psycopg2 ✓ google-api-python-client ✓ docker ✓ oauth2client ✓ google-cloud-storage ✓ lxml ✓ paramiko ✓ wrapt ✓ tornado ✓ google-resumable-media ✓ aiohttp ✓ funcsigs ✓ docopt ✓ mccabe ✓ atomicwrites ✓ sqlalchemy ✓ wcwidth ✓ bcrypt ✓ markdown ✓ tqdm ✓ docker-pycreds ✓ backports-functools-lru-cache ✓ uritemplate ✓ google-cloud-bigquery ✓ pynacl ✓ ptyprocess ✓ pycodestyle ✓ pexpect ✓ absl-py ✓ redis ✓ beautifulsoup4 ✓ typing ✓ kiwisolver ✓ configparser ✓ packaging ✓ gunicorn ✓ pathlib2 ✓ functools32 ✓ ipython-genutils ✓ lazy-object-proxy ✓ traitlets ✓ elasticsearch ✓ pyflakes ✓ gevent ✓ async-timeout ✓ networkx ✓ termcolor ✓ requests-toolbelt ✓ cycler ✓ pickleshare ✓ greenlet ✓ sklearn ✓ toolz ✓ scikit-image ✓ google-auth-httplib2 ✓ babel ✓ scandir ✓ opencv-python ✓ django ✓ tabulate ✓ h5py ✓ flake8 ✓ pymysql ✓ azure-common ✓ isort ✓ defusedxml ✓ ujson ✓ tensorflow ✓ tensorboard ✓ isodate ✓ pymongo ✓ webencodings ✓ pylint ✓ bleach ✓ entrypoints ✓ pycryptodome ✓ astroid ✓ subprocess32 ✓ websockets ✓ datadog ✓ dask ✓ dill ✓ zope-interface ✓ retrying ✓ gitpython ✓ pytest-cov ✓ psycopg2-binary ✓ pyzmq ✓ cached-property ✓ astor ✓ docker-compose ✓ yarl ✓ html5lib ✓ keras-applications ✓ gast ✓ keras-preprocessing ✓ typed-ast ✓ selenium ✓ pymemcache ✓ gitdb2 ✓ smmap2 ✓ pywavelets ✓ nose ✓ singledispatch ✓ contextlib2 ✓ jsonpickle ✓ backports-ssl-match-hostname ✓ discord-py ✓ apache-beam ✓ azure-nspkg ✓ simplegeneric ✓ ordereddict ✓ xmltodict ✓ parso ✓ jedi ✓ trueskill ✓ jupyter-core ✓ nbformat ✓ appdirs ✓ pykube ✓ sortedcontainers ✓ monotonic ✓ xlrd ✓ tzlocal ✓ hdfs ✓ grpc-google-iam-v1 ✓ azure-storage-common ✓ unidecode ✓ cython ✓ amqp ✓ pyrsistent ✓ google-cloud-firestore ✓ soupsieve ✓ raven ✓ kombu ✓ ansible ✓ msgpack ✓ azure-storage-blob ✓ msrest ✓ dnspython ✓ hiredis ✓ elasticsearch-dsl ✓ toml ✓ backports-weakref ✓ prettytable ✓ mako ✓ adal ✓ snowballstemmer ✓ keras ✓ prometheus-client ✓ croniter ✓ arrow ✓ py4j ✓ lockfile ✓ celery ✓ pycrypto ✓ dockerpty ✓ texttable ✓ importlib-metadata ✓ alabaster ✓ ply ✓ billiard ✓ sqlparse ✓ pycryptodomex ✓ sphinx ✓ thrift ✓ zipp ✓ nvidia-ml-py3 ✓ backcall ✓ regex ✓ nltk ✓ netaddr ✓ unicodecsv ✓ ruamel-yaml ✓ ecdsa ✓ slackclient ✓ imagesize ✓ alembic ✓ backports-shutil-get-terminal-size ✓ mistune ✓ ipykernel ✓ jupyter-client ✓ python-editor ✓ djangorestframework ✓ backports-abc ✓ vine ✓ google-cloud-datastore ✓ openpyxl ✓ tox ✓ manhole ✓ notebook ✓ typing-extensions ✓ google-cloud-logging ✓ gym ✓ nbconvert ✓ xlsxwriter ✓ joblib ✓ statsd ✓ mysqlclient ✓ cloudpickle ✓ testpath ✓ terminado ✓ ijson ✓ pypng ✓ pyserial ✓ msrestazure ✓ jdcal ✓ send2trash ✓ pandocfilters ✓ pyhamcrest ✓ smart-open ✓ sphinxcontrib-websupport ✓ google-auth-oauthlib ✓ idna-ssl ✓ ipywidgets ✓ widgetsnbextension ✓ iso8601 ✓ uvloop ✓ statsmodels ✓ pyarrow ✓ et-xmlfile ✓ xgboost ✓ linecache2 ✓ bz2file ✓ s3fs ✓ traceback2 ✓ ndg-httpsclient ✓ snowflake-connector-python ✓ twisted ✓ unittest2 ✓ google-cloud-pubsub ✓ filelock ✓ aniso8601 ✓ plotly ✓ stevedore ✓ qtconsole ✓ virtualenv-clone ✓ flask-cors ✓ text-unidecode ✓ incremental ✓ azure-storage-nspkg ✓ jupyter-console ✓ python-jose ✓ constantly ✓ automat ✓ patsy ✓ jupyter ✓ flask-sqlalchemy ✓ hyperlink ✓ inflection ✓ faker ✓ python-magic ✓ azure-mgmt-resource ✓ configobj ✓ python-daemon ✓ marshmallow ✓ netifaces ✓ uwsgi ✓ tensorflow-estimator ✓ shapely ✓ ua-parser ✓ humanfriendly ✓ libtmux ✓ bs4 ✓ pycurl ✓ pipenv ✓ apipkg ✓ azure-mgmt-storage ✓ argcomplete ✓ newrelic ✓ fuzzywuzzy ✓ execnet ✓ azure-mgmt-nspkg ✓ cherrypy ✓ applicationinsights ✓ webob ✓ fasteners ✓ seaborn ✓ autopep8 ✓ pathspec ✓ service-identity ✓ wtforms ✓ pep8 ✓ pydot ✓ 360 360
--------------------------------------------------------------------------------