├── .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 |
  1. Green packages support Python 3 (or have a drop-in replacement package which supports Python 3);
  2. 102 |
  3. White packages don't support Python 3 yet.
  4. 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 |
133 |
134 | Hide Python 3 Ready 135 |
136 |
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 | Fork me on GitHub 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 ✓360360 --------------------------------------------------------------------------------