[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kajongg/sid] src: Tile: only accept bytes, not string or unicode
From:       Wolfgang Rohdewald <wolfgang () rohdewald ! de>
Date:       2013-10-31 21:21:11
Message-ID: E1Vbzfz-0002lj-Nm () scm ! kde ! org
[Download RAW message or body]

Git commit 1cb13391aca7bf3f19ee9671d1b6a0597874a29c by Wolfgang Rohdewald.
Committed on 31/10/2013 at 11:10.
Pushed by wrohdewald into branch 'sid'.

Tile: only accept bytes, not string or unicode

makes it faster: For python3, string/unicode would explicitly have to be converted to \
bytes other parts of kajongg might still use str instead of bytes, probably Hand

M  +1    -1    src/board.py
M  +1    -1    src/game.py
M  +2    -2    src/hand.py
M  +5    -5    src/handboard.py
M  +1    -1    src/meld.py
M  +3    -3    src/player.py
M  +2    -2    src/server.py
M  +25   -20   src/tile.py
M  +2    -2    src/uitile.py
M  +1    -1    src/uiwall.py
M  +2    -2    src/visible.py
M  +1    -1    src/wall.py

http://commits.kde.org/kajongg/1cb13391aca7bf3f19ee9671d1b6a0597874a29c

diff --git a/src/board.py b/src/board.py
index 3c86a4b..f0ad453 100644
--- a/src/board.py
+++ b/src/board.py
@@ -222,7 +222,7 @@ class Board(QGraphicsRectItem):
         if uiTile is self._focusTile:
             return
         if uiTile:
-            assert uiTile.tile != 'Xy', uiTile
+            assert uiTile.tile != b'Xy', uiTile
             if not isinstance(uiTile.board, DiscardBoard):
                 assert uiTile.focusable, uiTile
             self.__prevPos = uiTile.sortKey()
diff --git a/src/game.py b/src/game.py
index 687cfe7..ac5b9e9 100644
--- a/src/game.py
+++ b/src/game.py
@@ -756,7 +756,7 @@ class PlayingGame(Game):
             # we are human and server tells us another player discarded a tile. In \
                our
             # game instance, tiles in handBoards of other players are unknown
             player.makeTileKnown(tileName)
-            result = 'Xy'
+            result = b'Xy'
         else:
             result = tileName
         if not tileName in player.concealedTileNames:
diff --git a/src/hand.py b/src/hand.py
index 6907006..7527637 100644
--- a/src/hand.py
+++ b/src/hand.py
@@ -246,7 +246,7 @@ class Hand(object):
         self.score = self.__totalScore()
 
         # do the rest only if we know all tiles of the hand
-        if 'Xy' in self.string:
+        if b'Xy' in self.string:
             self.won = False    # we do not know better
             return
         if self.won:
@@ -522,7 +522,7 @@ class Hand(object):
         Adds melds to self.melds.
         only one special mjRule may try to rearrange melds.
         A rest will be rearranged by standard rules."""
-        if 'Xy' in rest:
+        if b'Xy' in rest:
             # hidden tiles of other players:
             self.melds.extend(self.splitRegex(rest))
             return
diff --git a/src/handboard.py b/src/handboard.py
index d21d4dd..b6a6994 100644
--- a/src/handboard.py
+++ b/src/handboard.py
@@ -49,13 +49,13 @@ class TileAttr(object):
             if yoffset == 0:
                 self.dark = self.tile.istitle()
             else:
-                self.dark = self.tile == 'Xy' or scoring
+                self.dark = self.tile == b'Xy' or scoring
             self.focusable = True
             if scoring:
                 self.focusable = idx == 0
             else:
                 self.focusable = (not self.tile.isBonus()
-                    and self.tile != 'Xy'
+                    and self.tile != b'Xy'
                     and player == player.game.activePlayer
                     and player == player.game.myself
                     and (meld.state == CONCEALED
@@ -213,8 +213,8 @@ class HandBoard(Board):
             assert isinstance(newPosition.tile, Tile)
             matches = oldTiles.get(newPosition.tile) \
                 or oldTiles.get(newPosition.tile.swapTitle()) \
-                or oldTiles.get('Xy')
-            if not matches and newPosition.tile == 'Xy':
+                or oldTiles.get(b'Xy')
+            if not matches and newPosition.tile == b'Xy':
                 matches = oldTiles.values()[0]
             if matches:
                 # no matches happen when we move a uiTile within a board,
@@ -527,7 +527,7 @@ class PlayingHandBoard(HandBoard):
             result = list(Meld(x) for x in content.sortedMeldsContent.split())
             if result:
                 if self.rearrangeMelds:
-                    if result[0][0] == 'Xy':
+                    if result[0][0] == b'Xy':
                         result = sorted(result, key=len, reverse=True)
                 else:
                     # generate one meld with all sorted tiles
diff --git a/src/meld.py b/src/meld.py
index 03557bc..e65077f 100644
--- a/src/meld.py
+++ b/src/meld.py
@@ -191,7 +191,7 @@ class Meld(list):
         """compute meld type. Except knitting melds."""
         # pylint: disable=too-many-branches, R0911
         # too many branches, too many returns
-        if 'Xy' in self:
+        if b'Xy' in self:
             return REST
         length = len(self)
         if not length:
diff --git a/src/player.py b/src/player.py
index 89ced5f..6ba0085 100644
--- a/src/player.py
+++ b/src/player.py
@@ -360,7 +360,7 @@ class Player(object):
 
     def makeTileKnown(self, tileName):
         """used when somebody else discards a tile"""
-        assert self._concealedTileNames[0] == 'Xy'
+        assert self._concealedTileNames[0] == b'Xy'
         self._concealedTileNames[0] = tileName
         self._hand = None
 
@@ -615,7 +615,7 @@ class PlayingPlayer(Player):
             assert len(tileNames) <= len(self._concealedTileNames), \
                 '%s: showConcealedTiles %s, we have only %s' % (self, tileNames, \
self._concealedTileNames)  for tileName in tileNames:
-                src, dst = ('Xy', tileName) if show else (tileName, 'Xy')
+                src, dst = (b'Xy', tileName) if show else (tileName, b'Xy')
                 assert src != dst, (self, src, dst, tileNames, \
self._concealedTileNames)  if not src in self._concealedTileNames:
                     logException( '%s: showConcealedTiles(%s): %s not in %s.' % \
@@ -673,7 +673,7 @@ class PlayingPlayer(Player):
         """do we compute the same score as the server does?"""
         if score is None:
             return True
-        if 'Xy' in self._concealedTileNames:
+        if b'Xy' in self._concealedTileNames:
             return True
         if str(self.hand) == score:
             return True
diff --git a/src/server.py b/src/server.py
index 3c610d6..c57132b 100644
--- a/src/server.py
+++ b/src/server.py
@@ -474,7 +474,7 @@ class ServerTable(Table):
             if tile.isBonus() or self.game.playOpen:
                 block.tellOthers(player, Message.PickedTile, tile=tile, \
deadEnd=deadEnd)  else:
-                block.tellOthers(player, Message.PickedTile, tile= 'Xy', \
deadEnd=deadEnd) +                block.tellOthers(player, Message.PickedTile, tile= \
b'Xy', deadEnd=deadEnd)  block.callback(self.moved)
 
     def pickKongReplacement(self, requests=None):
@@ -561,7 +561,7 @@ class ServerTable(Table):
                 if player == clientPlayer or self.game.playOpen:
                     tileNames = player.concealedTileNames
                 else:
-                    tileNames = tuple(Tile('Xy') for x in range(0, 13))
+                    tileNames = tuple(Tile(b'Xy') for x in range(0, 13))
                 block.tell(player, clientPlayer, Message.SetConcealedTiles,
                     tiles=tileNames + player.bonusTiles)
         block.callback(self.dealt)
diff --git a/src/tile.py b/src/tile.py
index 1ba4271..9b0105e 100644
--- a/src/tile.py
+++ b/src/tile.py
@@ -31,13 +31,19 @@ class Tile(bytes):
     """a single tile"""
     # pylint: disable=too-many-public-methods, abstract-class-not-used
 
-    def __new__(cls, element):
-        if element.__class__.__name__ == 'UITile':
-            element = element.tile
-        if len(element) == 1 and isinstance(element[0], Tile):
-            element = element[0]
-        assert len(element) == 2, '%s:%s' % (type(element), element)
-        return bytes.__new__(cls, element.encode('utf-8'))
+    def __new__(cls, *args):
+        arg0 = args[0]
+        if len(args) == 1:
+            if arg0.__class__.__name__ == 'UITile':
+                return bytes.__new__(cls, arg0.tile)
+            elif len(arg0) == 1 and isinstance(arg0[0], Tile):
+                return bytes.__new__(cls, arg0[0])
+            else:
+                assert len(arg0) == 2, '%s:%s' % (type(arg0), arg0)
+                return bytes.__new__(cls, arg0)
+        else:
+            assert len(args) == 2, args
+            return bytes.__new__(cls, arg0 + args[1])
 
     def group(self):
         """group as string"""
@@ -126,29 +132,28 @@ class Elements(object):
     # too many attributes
     def __init__(self):
         self.occurrence = IntDict() # key: db, s3 etc. value: occurrence
-        self.winds = Tileset(['we', 'ws', 'ww', 'wn'])
-        self.wINDS = Tileset(['We', 'Ws', 'Ww', 'Wn'])
-        self.dragons = Tileset(['db', 'dg', 'dr'])
-        self.dRAGONS = Tileset(['Db', 'Dg', 'Dr'])
+        self.winds = Tileset([b'we', b'ws', b'ww', b'wn'])
+        self.wINDS = Tileset([b'We', b'Ws', b'Ww', b'Wn'])
+        self.dragons = Tileset([b'db', b'dg', b'dr'])
+        self.dRAGONS = Tileset([b'Db', b'Dg', b'Dr'])
         self.honors = self.winds | self.dragons
         self.hONORS = self.wINDS | self.dRAGONS
-        self.terminals = Tileset(['s1', 's9', 'b1', 'b9', 'c1', 'c9'])
-        self.tERMINALS = Tileset(['S1', 'S9', 'B1', 'B9', 'C1', 'C9'])
+        self.terminals = Tileset([b's1', b's9', b'b1', b'b9', b'c1', b'c9'])
+        self.tERMINALS = Tileset([b'S1', b'S9', b'B1', b'B9', b'C1', b'C9'])
         self.majors = self.honors | self.terminals
         self.mAJORS = self.hONORS | self.tERMINALS
         self.minors = Tileset()
         self.mINORS = Tileset()
-        self.greenHandTiles = Tileset(['dg', 'b2', 'b3', 'b4', 'b6', 'b8'])
-        for group in 'sbc':
-            for value in '2345678':
-                self.minors.add(Tile('%s%s' % (group, value)))
+        self.greenHandTiles = Tileset([b'dg', b'b2', b'b3', b'b4', b'b6', b'b8'])
+        for group in b'sbc':
+            for value in b'2345678':
+                self.minors.add(Tile(group, value))
         for tile in self.majors:
             self.occurrence[tile] = 4
         for tile in self.minors:
             self.occurrence[tile] = 4
-        for bonus in 'fy':
-            for wind in 'eswn':
-                self.occurrence[Tile('%s%s' % (bonus, wind))] = 1
+        for bonus in b'fe', b'fs', b'fw', b'fn', b'ye', b'ys', b'yw', b'yn':
+            self.occurrence[Tile(bonus)] = 1
 
     def __filter(self, ruleset):
         """returns element names"""
diff --git a/src/uitile.py b/src/uitile.py
index ff52b82..96ce58d 100644
--- a/src/uitile.py
+++ b/src/uitile.py
@@ -118,7 +118,7 @@ class UITile(QGraphicsObject):
                 moving += ZValues.moving
         self.setZValue(moving + \
             boardLevel + \
-            (self.level+(2 if self.tile != 'Xy' else 1))*ZValues.itemLevelFactor + \
+            (self.level+(2 if self.tile != b'Xy' else 1))*ZValues.itemLevelFactor + \
\  self.__lightDistance())
 
     def boundingRect(self):
@@ -135,7 +135,7 @@ class UITile(QGraphicsObject):
 
     def showFace(self):
         """should we show face for this tile?"""
-        return self.tile != 'Xy'
+        return self.tile != b'Xy'
 
     def __elementId(self):
         """returns the SVG element id of the tile"""
diff --git a/src/uiwall.py b/src/uiwall.py
index 8afe6a4..4d6f3c6 100644
--- a/src/uiwall.py
+++ b/src/uiwall.py
@@ -158,7 +158,7 @@ class UIWall(Wall):
         """builds the wall without dividing"""
         # recycle used tiles
         for uiTile in self.tiles:
-            uiTile.tile = Tile('Xy')
+            uiTile.tile = Tile(b'Xy')
             uiTile.dark = True
 #        field = Internal.field
 #        animateBuild = not field.game.isScoringGame() and not \
                self.game.isFirstHand()
diff --git a/src/visible.py b/src/visible.py
index 0d211b2..0b4bb0f 100644
--- a/src/visible.py
+++ b/src/visible.py
@@ -161,8 +161,8 @@ class VisiblePlayingPlayer(PlayingPlayer):
     def makeTileKnown(self, tile):
         """give an Xy tileItem a name"""
         PlayingPlayer.makeTileKnown(self, tile)
-        assert tile != 'Xy'
-        matchingTiles = sorted(self.handBoard.tilesByElement('Xy'), key=lambda \
x:x.xoffset) +        assert tile != b'Xy'
+        matchingTiles = sorted(self.handBoard.tilesByElement(b'Xy'), key=lambda \
x:x.xoffset)  matchingTiles[-1].tile = tile
 
     def exposeMeld(self, meldTiles, calledTile=None):
diff --git a/src/wall.py b/src/wall.py
index 8dceca3..9fb28bf 100644
--- a/src/wall.py
+++ b/src/wall.py
@@ -60,7 +60,7 @@ class Wall(object):
     def __init__(self, game):
         """init and position the wall"""
         self._game = weakref.ref(game)  # avoid cycles for garbage collection
-        self.tiles = [self.tileClass('Xy') for _ in \
range(elements.count(game.ruleset))] +        self.tiles = [self.tileClass(b'Xy') for \
_ in range(elements.count(game.ruleset))]  self.living = None
         self.kongBox = self.kongBoxClass()
         assert len(self.tiles) % 8 == 0


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic