pypy / pypy / module / micronumpy / tool / numready /

Full commit
Alex Gaynor 578b2ef 

Alex Gaynor 8276de5 

Alex Gaynor 578b2ef 

Alex Gaynor 8276de5 

Alex Gaynor 578b2ef 

Maciej Fijalkows… 534391d 
Alex Gaynor 8276de5 

Alex Gaynor 578b2ef 

Alex Gaynor 457e216 
Alex Gaynor 578b2ef 
#!/usr/bin/env python
# -*- coding: utf-8 -*-

This should be run under PyPy.

import os
import platform
import subprocess
import tempfile
import webbrowser
from collections import OrderedDict

import jinja2

from .kinds import KINDS

class SearchableSet(object):
    def __init__(self, items=()):
        self._items = {}
        for item in items:

    def __iter__(self):
        return iter(self._items)

    def __contains__(self, other):
        return other in self._items

    def __getitem__(self, idx):
        return self._items[idx]

    def add(self, item):
        self._items[item] = item

    def __len__(self):
        return len(self._items)

class Item(object):
    def __init__(self, name, kind, subitems=None): = name
        self.kind = kind
        self.subitems = subitems

    def __hash__(self):
        return hash(

    def __eq__(self, other):
        if isinstance(other, str):
            return == other
        return ==

class ItemStatus(object):
    def __init__(self, name, pypy_exists): = name
        self.cls = 'exists' if pypy_exists else ''
        self.symbol = u"✔" if pypy_exists else u'✖'

    def __lt__(self, other):
        return <

def find_numpy_items(python, modname="numpy", attr=None):
    args = [
        python, os.path.join(os.path.dirname(__file__), ""), modname
    if attr is not None:
    lines = subprocess.check_output(args).splitlines()
    items = SearchableSet()
    for line in lines:
        kind, name = line.split(" : ", 1)
        subitems = None
        if kind == KINDS["TYPE"] and name in SPECIAL_NAMES and attr is None:
            subitems = find_numpy_items(python, modname, name)
        items.add(Item(name, kind, subitems))
    return items

def split(lst):
    SPLIT = 5
    lgt = len(lst) // SPLIT + 1
    l = [[] for i in range(lgt)]
    for i in range(lgt):
        for k in range(SPLIT):
            if k * lgt + i < len(lst):
                l[i].append(lst[k * lgt + i])
    return l

SPECIAL_NAMES = ["ndarray", "dtype", "generic"]

def main(argv):
    cpy_items = find_numpy_items("/usr/bin/python")
    pypy_items = find_numpy_items(argv[1], "numpypy")
    all_items = []

    msg = "{:d}/{:d} names".format(len(pypy_items), len(cpy_items)) + " "
    msg += ", ".join(
        "{:d}/{:d} {} attributes".format(
            len(pypy_items[name].subitems), len(cpy_items[name].subitems), name
        for name in SPECIAL_NAMES
    for item in cpy_items:
        pypy_exists = item in pypy_items
        if item.subitems:
            for sub in item.subitems:
                    ItemStatus( + "." +, pypy_exists=pypy_exists and pypy_items[item].subitems and sub in pypy_items[item].subitems)
        all_items.append(ItemStatus(, pypy_exists=item in pypy_items))
    env = jinja2.Environment(
    html = env.get_template("page.html").render(all_items=split(sorted(all_items)), msg=msg)
    if len(argv) > 2:
        with open(argv[2], 'w') as f:
        with tempfile.NamedTemporaryFile(delete=False, suffix=".html") as f:
        print "Saved in: %s" %