View difference between Paste ID: 5UxM87EN and KdyHgTeY
SHOW: | | - or go back to the newest paste.
1-
#!/usr/bin/env python3.2
1+
package main
2
3-
import logging, urllib.request, urllib.parse, re, concurrent.futures, itertools
3+
import (
4
	"http"
5-
def language_popularity(lang):
5+
	"io/ioutil"
6-
    qlang = urllib.parse.quote(lang)
6+
	"regexp"
7-
    try:
7+
    "url"
8-
        sub = urllib.request.urlopen("http://github.com/languages/" + qlang).read()
8+
    "strconv"
9-
    except:
9+
)
10-
        logging.exception('Error fetching %r', lang)
10+
11-
        return
11+
var langre = regexp.MustCompile("/languages/([^/\"]+)")
12-
    match = re.search(b'is the #(\\d+)', sub)
12+
13-
    if match:
13+
func languages() (langs []string) {
14-
        rank = int(match.group(1))
14+
	resp, err := http.Get("http://github.com/languages")
15-
    else:
15+
	if err != nil {
16-
        rank = 1
16+
		panic(err)
17-
    return rank, lang
17+
	}
18
	body, err := ioutil.ReadAll(resp.Body)
19-
def languages():
19+
	if err != nil {
20-
    for match in re.finditer(b'/languages/([^/]+?)"', urllib.request.urlopen('http://github.com/languages').read()):
20+
		panic(err)
21-
        yield urllib.parse.unquote(match.group(1).decode())
21+
	}
22
    seen := make(map[string]bool)
23-
def main():
23+
	for _, subm := range langre.FindAllStringSubmatch(string(body), -1) {
24-
    futures = []
24+
        unlang, err := url.QueryUnescape(subm[1])
25-
    with concurrent.futures.ThreadPoolExecutor(45) as pool:
25+
        if err != nil { panic(err) }
26-
        for lang in languages():
26+
        if !seen[unlang] {
27-
            futures.append(pool.submit(language_popularity, lang))
27+
            seen[unlang] = true
28-
        ranks = {}
28+
            langs = append(langs, subm[1])
29-
        completed = concurrent.futures.as_completed(futures)
29+
        }
30-
        for rank in itertools.count(1):
30+
	}
31-
            while rank not in ranks:
31+
    return
32-
                try:
32+
}
33-
                    result = next(completed).result()
33+
34-
                except StopIteration:
34+
var rankre = regexp.MustCompile("is the #([0-9]+)")
35-
                    break
35+
var mostpop = regexp.MustCompile("is <strong>the most")
36-
                if result is None:
36+
37-
                    continue
37+
func popularity(lang string) int {
38-
                new_rank, lang = result
38+
    url := "http://github.com/languages/" + lang
39-
                ranks[new_rank] = lang
39+
    //~ println(url)
40-
            if rank not in ranks:
40+
    resp, err := http.Get(url)
41
    if err != nil {panic(err)}
42-
            print(rank, ranks[rank])
42+
    body, err := ioutil.ReadAll(resp.Body)
43-
        for rank1 in sorted(r for r in ranks if r >= rank):
43+
    if err != nil {
44-
            print(rank1, ranks[rank1])
44+
        panic(err)
45
    }
46-
if __name__ == '__main__':
46+
    subm := rankre.FindSubmatch(body)
47-
    main()
47+
    if subm == nil {
48
        if mostpop.Find(body) != nil {
49
            return 1
50
        }
51
        return 0
52
    }
53
    rank, err := strconv.Atoi(string(subm[1]))
54
    if err != nil {panic(err)}
55
    return rank
56
}
57
58
type langpop struct { Lang string; Rank int }
59
60
func main() {
61
    rankch := make(chan langpop)
62
    nlangs := 0
63
	for _, lang := range languages() {
64
		go func(lang string) {
65
            rankch<-langpop{lang, popularity(lang)}
66
        }(lang)
67
        nlangs++
68
	}
69
    ranks := make(map[int]string)
70
    for r := 1; ; r++ {
71
        for {
72
            if _, ok := ranks[r]; ok {
73
                break
74
            } else if nlangs == 0 {
75
                return
76
            }
77
            lp := <-rankch
78
            //~ println(lp.Rank, lp.Lang)
79
            ranks[lp.Rank] = lp.Lang
80
            nlangs--
81
        }
82
        plang, err := url.QueryUnescape(ranks[r])
83
        if err != nil {
84
            panic(err)
85
        }
86
        println(r, plang)
87
    }
88
}