forked from aybabtme/pkgname
/
filters.go
101 lines (85 loc) · 2.47 KB
/
filters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package main
import (
"errors"
"fmt"
"github.com/grd/stat"
"strings"
"unicode"
)
func noHyphens(name string) error {
if strings.Contains(name, "-") {
return errors.New("Don't put hyphens, that's ugly.")
}
return nil
}
func noUnderscore(name string) error {
if strings.Contains(name, "_") {
return errors.New("Don't put underscores, that's ugly.")
}
return nil
}
func notCapitalized(name string) error {
for _, r := range []rune(name) {
if unicode.IsUpper(r) {
return errors.New("Don't put uppercase characters, it's too enterprisey.")
}
}
return nil
}
func noReferenceToGo(name string) error {
lowerName := strings.ToLower(name)
if strings.HasPrefix(lowerName, "go") || strings.HasSuffix(lowerName, "go") {
return errors.New("Don't mention 'go' in your package name. Go is implicit in any package. Go is absolute and infinitesimal. Other languages should rename their packages; for instance 'rails-ruby' and 'python-django' would remove any ambiguity.")
}
return nil
}
func noReferenceToGolang(name string) error {
if strings.Contains(strings.ToLower(name), "golang") {
return errors.New("The name of Go is Go, not Golang. You don't say Javalang, or Rubylang, or Pythonlang, do you?")
}
return nil
}
var errInvalidPackage = "That's not even a valid package name: %s!" +
" Read the spec: http://golang.org/ref/spec#Package_clause"
func validPackageNames(name string) error {
if len(name) < 1 {
return fmt.Errorf(errInvalidPackage, "the name can't be blank")
}
for i, r := range []rune(name) {
if i == 0 {
if !unicode.IsLetter(r) {
return fmt.Errorf(errInvalidPackage, "the first character must be a letter")
}
}
switch {
case unicode.IsLetter(r):
case unicode.IsDigit(r):
case r == '-':
case r == '_':
case r == '.':
// ok
default:
return fmt.Errorf(errInvalidPackage, "all the characters (but the first) must be either letters or digits")
}
}
return nil
}
func closeToMean(allnames []string, maxDist float64) (f Filter, mean, stdev float64) {
data := make(stat.IntSlice, len(allnames))
for i, name := range allnames {
data[i] = int64(len(name))
}
mean = stat.Mean(data)
stdev = stat.SdMean(data, mean)
maxMean := int(mean + stdev*maxDist)
f = func(name string) error {
diff := float64(len(name)) - mean
dist := diff / stdev
if dist > maxDist {
return fmt.Errorf("This package name is %.1f std.dev. longer than normal."+
" It should be at most %d characters long.", dist, maxMean)
}
return nil
}
return
}