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)
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)
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))
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))
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)
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, }