1 from sqlalchemy
import types
2 from time
import mktime
3 from datetime
import datetime
8 class RankInitExc(Exception):
12 KEYS
={'k': lambda x
: x
, # 1kyu -> 1, 30kyu -> 30
13 'd': lambda x
: -x
+ 1, # 1dan -> 0, 10dan -> -9
14 'p': lambda x
: -x
- 9} # 1pro -> -10, 10pro -> -19
16 DOMAIN_MAX
= { 'k' : 30,
22 ranks
= list(Rank
.iter_all())
23 dists
= [ abs(number
- r
.key()) for r
in ranks
]
24 return misc
.argmin( zip(ranks
, dists
) )
27 def from_string(string
):
28 mo
= re
.match('^([1-9][0-9]?) ?([kdp]).*', string
)
32 return Rank(int(mo
.group(1)), mo
.group(2))
33 except (ValueError, RankInitExc
):
38 for key
, domain
in Rank
.DOMAIN_MAX
.iteritems():
39 for x
in xrange(domain
):
40 yield Rank( x
+ 1, key
)
42 def __init__(self
, number
, kdp
):
43 self
.number
, self
.kdp
= number
, kdp
45 if not self
.kdp
in self
.KEYS
:
46 raise RankInitExc("kdp must be either 'k' for kyu players,"
47 " 'd' for dan players or 'p' for proffesionals")
49 def check_domain(bottom
, val
, up
):
51 if not( bottom
<= val
<= up
):
52 raise RankInitExc("Must be %d <= %d <= %d.")
54 check_domain(1, self
.number
, self
.DOMAIN_MAX
[self
.kdp
])
57 return self
.number
, self
.kdp
60 return self
.KEYS
[self
.kdp
](self
.number
)
63 return "%d%s"%(self
.number
, self
.kdp
)
66 return "Rank(%s, key=%d)"%(self
, self
.key())
69 return self
.key().__hash
__()
71 def __cmp__(self
, other
):
72 if not isinstance(other
, Rank
):
74 return ( - self
.key()).__cmp
__( - other
.key())
77 if __name__
== "__main__":
79 assert Rank(6, 'd') > Rank(2, 'd') > Rank(1, 'k') > Rank(10, 'k')
83 for rank
in Rank
.iter_all():
86 print '{"value" : "%s", "text" : "%s"},' % (value
, text
)