Ejemplo n.º 1
0
def main(root):
    pluck_paths = compose(lambda x: join_paths(*x), itemgetter(0, 2))
    files = fnmatch.filter(imapcat(pluck_paths, os.walk(root)), '*.d.ts')

    for fpath in files:
        with open(fpath) as fp:
            parse(fp)
Ejemplo n.º 2
0
def split_into_lines(triples):
    """Split a bunch of (key, mapping, extent) triples into more triples
    than those, with each one contained in a line.

    """
    def _split_one((key, mapping, extent)):
        """Split a single triple into one or more, each spanning at most one
        line.

        """
        if extent.end.row == extent.start.row:
            yield key, mapping, extent
        elif extent.end.row < extent.start.row:
            # This indicates a bug in an indexer plugin.
            warn('Bad extent: end.row < start.row: %s < %s' %
                 (extent.end.row, extent.start.row))
        else:
            # TODO: There are a lot of Nones used as slice bounds below. Do we
            # ever translate them back into char offsets? If not, does the
            # highlighter or anything else choke on them?
            yield key, mapping, Extent(
                Position(row=extent.start.row, col=extent.start.col),
                Position(row=extent.start.row, col=None))

            # Really wish we could use yield from
            for row in xrange(extent.start.row + 1, extent.end.row):
                yield key, mapping, Extent(Position(row=row, col=0),
                                           Position(row=row, col=None))

            yield key, mapping, Extent(
                Position(row=extent.end.row, col=0),
                Position(row=extent.end.row, col=extent.end.col))

    return imapcat(_split_one, triples)
Ejemplo n.º 3
0
def main(root):
    pluck_paths = compose(lambda x: join_paths(*x), itemgetter(0, 2))
    files = fnmatch.filter(imapcat(pluck_paths, os.walk(root)), '*.d.ts')

    for fpath in files:
        with open(fpath) as fp:
            parse(fp)
Ejemplo n.º 4
0
def by_line(span_needles):
    """Transform [(_, span:Extent)] into [(_, line:int)].

    Converts spans to lines. The resulting iter will have len' >= len.

    """
    return ((key_object_pair(*kv_start_end), line_number) for
            kv_start_end, line_number in imapcat(span_to_lines, span_needles))
Ejemplo n.º 5
0
def by_line(span_needles):
    """Transform [(_, span:Extent)] into [(_, line:int)].

    Converts spans to lines. The resulting iter will have len' >= len.

    """
    return (
        (key_object_pair(*kv_start_end), line_number)
        for kv_start_end, line_number in imapcat(span_to_lines, span_needles))
Ejemplo n.º 6
0
def split_into_lines(triples):
    """Split a bunch of (key, mapping, extent) triples into more triples
    than those, with each one contained in a line.

    """
    def _split_one((key, mapping, extent)):
        """Split a single triple into one or more, each spanning at most one
        line.

        """
        if extent.end.row == extent.start.row:
            yield key, mapping, extent
        elif extent.end.row < extent.start.row:
            # This indicates a bug in an indexer plugin.
            warn('Bad extent: end.row < start.row: %s < %s' %
                 (extent.end.row, extent.start.row))
        else:
            num_rows = extent.end.row - extent.start.row

            # TODO: There are a lot of Nones used as slice bounds below. Do we
            # ever translate them back into char offsets? If not, does the
            # highlighter or anything else choke on them?
            yield key, mapping, Extent(Position(row=extent.start.row,
                                                col=extent.start.col),
                                       Position(row=extent.start.row,
                                                col=None))

            # Really wish we could use yield from
            for row in xrange(extent.start.row + 1, extent.end.row):
                yield key, mapping, Extent(Position(row=row,
                                                    col=0),
                                           Position(row=row,
                                                    col=None))

            yield key, mapping, Extent(Position(row=extent.end.row,
                                                col=0),
                                       Position(row=extent.end.row,
                                                col=extent.end.col))

    return imapcat(_split_one, triples)
Ejemplo n.º 7
0
def search(request):
    q = request.GET.get('q')
    if not q:
        return {'series': None}

    exclude_tags = keep(silent(int), request.GET.getlist('exclude_tags'))
    serie_tags, tag_series, tag_ids = series_tags_data()

    q_string, q_tags = _parse_query(q)
    q_tags, wrong_tags = split(lambda t: t.lower() in tag_ids, q_tags)
    if wrong_tags:
        message = 'Unknown tag%s %s.' % ('s' if len(wrong_tags) > 1 else '', ', '.join(wrong_tags))
        messages.warning(request, message)
    if not q_string and not q_tags:
        return {'series': None}

    qs = search_series_qs(q_string)
    if q_tags:
        q_tag_ids = keep(tag_ids.get(t.lower()) for t in q_tags)
        include_series = reduce(set.intersection, (tag_series[t] for t in q_tag_ids))
        if include_series:
            qs = qs.filter(id__in=include_series)
        else:
            message = 'No series annotated with %s.' \
                % (q_tags[0] if len(q_tags) == 1 else 'all these tags simultaneously')
            messages.warning(request, message)
            return {'series': []}
    if exclude_tags:
        exclude_series = join(tag_series[t] for t in exclude_tags)
        qs = qs.exclude(id__in=exclude_series)

    series_ids = qs.values_list('id', flat=True)
    tags = distinct(imapcat(serie_tags, series_ids), key=itemgetter('id'))
    # TODO: do not hide excluded tags

    return {
        'series': qs,
        'tags': tags,
        'serie_tags': serie_tags,
    }