コード例 #1
0
 def test_parse_game_variations_2o_multi(self):
     moves = "[Site \"help\"]\n1. e4 (1. d4 d5 2. c4 e6) (1. c4 c5 2. g3 e6) e5 1-0"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.movetext[0].white.variations[1][0].white.san == "c4"
     assert parsed.movetext[0].white.variations[1][0].black.san == "c5"
     assert parsed.movetext[0].white.variations[1][1].white.san == "g3"
     assert parsed.movetext[0].white.variations[1][1].black.san == "e6"
コード例 #2
0
 def test_parse_game(self):
     moves = "[Site \"help\"]\n1. e4 e5 1-0"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.tag_pairs['Site'] == "help"
     assert parsed.movetext[0].white.san == "e4"
     assert parsed.movetext[0].black.san == "e5"
     assert parsed.score.result == "1-0"
コード例 #3
0
 def test_parse_move_comment_after_white(self):
     moves = "[Site \"tst\"]\n1. e4 $1 {a comment} {move one} 0-1"
     game = parser.parse(moves, actions=Actions())
     m1 = game.move(1)
     assert m1.white.san == "e4"
     assert m1.white.comment == "a comment"
     assert m1.comment == "move one"
コード例 #4
0
 def test_parse_full_move(self):
     moves = "[Site \"tst\"]\n1. e4 $1 {a comment} (1.d5) 0-1"
     game = parser.parse(moves, actions=Actions())
     m1 = game.move(1)
     assert m1.white.san == "e4"
     assert m1.white.comment == "a comment"
     assert m1.white.nags[0] == "$1"
     assert m1.white.variations[0].move(1).white.san == "d5"
コード例 #5
0
 def test_parse_movetexts_nag_multiple(self):
     moves = '1. e4 $0 $19 e5 $19 $139 $0'
     movetext = parser.parse(moves, actions=Actions()).movetext
     assert movetext[0].move_number == 1
     assert movetext[0].white.san == "e4"
     assert movetext[0].white.nags == ["$0", "$19"]
     assert movetext[0].black.san == "e5"
     assert movetext[0].black.nags == ["$19", "$139", "$0"]
コード例 #6
0
 def test_parse_game_variations_3o(self):
     moves = "[Site \"help\"]\n1. e4 (1. d4 d5) (1. c4 e5) (1. a4 h5) e5 1-0"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.movetext[0].white.variations[0][0].white.san == "d4"
     assert parsed.movetext[0].white.variations[0][0].black.san == "d5"
     assert parsed.movetext[0].white.variations[1][0].white.san == "c4"
     assert parsed.movetext[0].white.variations[1][0].black.san == "e5"
     assert parsed.movetext[0].white.variations[2][0].white.san == "a4"
     assert parsed.movetext[0].white.variations[2][0].black.san == "h5"
コード例 #7
0
 def test_parse_movetexts_simple_newline_mid(self):
     moves = '1. e4 e5 2. d4\nd5'
     movetext = parser.parse(moves, actions=Actions()).movetext
     assert movetext[0].move_number == 1
     assert movetext[0].white.san == "e4"
     assert movetext[0].black.san == "e5"
     assert movetext[1].move_number == 2
     assert movetext[1].white.san == "d4"
     assert movetext[1].black.san == "d5"
コード例 #8
0
 def test_parse_movetexts_comment(self):
     moves = '1. e4 e5 {comment 1...} 2. d4 {comment 2.} d5'
     movetext = parser.parse(moves, actions=Actions()).movetext
     assert movetext[0].move_number == 1
     assert movetext[0].white.san == "e4"
     assert movetext[0].black.san == "e5"
     assert movetext[0].black.comment == "comment 1..."
     assert movetext[1].move_number == 2
     assert movetext[1].white.san == "d4"
     assert movetext[1].white.comment == "comment 2."
     assert movetext[1].black.san == "d5"
コード例 #9
0
 def test_parse_movetexts_nags(self):
     moves = '1. e4 $0 e5 $1 $139 {comment 1...} 2. d4 $3 {comment 2.} d5 $19 $21 $139 $0'
     movetext = parser.parse(moves, actions=Actions()).movetext
     assert movetext[0].move_number == 1
     assert movetext[0].white.san == "e4"
     assert movetext[0].white.nags == ["$0"]
     assert movetext[0].black.san == "e5"
     assert movetext[0].black.nags == ["$1", "$139"]
     assert movetext[0].black.comment == "comment 1..."
     assert movetext[1].move_number == 2
     assert movetext[1].white.san == "d4"
     assert movetext[1].white.nags == ["$3"]
     assert movetext[1].white.comment == "comment 2."
     assert movetext[1].black.san == "d5"
     assert movetext[1].black.nags == ["$19", "$21", "$139", "$0"]
コード例 #10
0
    def parseAndEvaluateMonthlyData(self, user, game_list):
        for game in game_list:
            game_pgn = game["pgn"] if "pgn" in game else None
            skip = True if "pgn" not in game or "Variant" in game[
                "pgn"] else False

            if skip:
                continue

            parsed_game = parser.parse(game_pgn, actions=pgn.Actions())
            self.get_game_kill_stats(parsed_game.movetext,
                                     parsed_game.tag_pairs["White"] == user)
            self.get_game_move_stats(parsed_game.movetext,
                                     parsed_game.tag_pairs["White"] == user)
            self.get_game_death_stats(parsed_game, parsed_game.movetext,
                                      parsed_game.tag_pairs["White"] == user)
コード例 #11
0
def parseMonthlyArchiveJson(gameData):
    games = gameData["games"]
    parsed_data = []
    pgn_missing_counter = 0
    variant_game_counter = 0
    for game in games:
        if "pgn" not in game:
            pgn_missing_counter = pgn_missing_counter + 1
            continue
        game_pgn = game["pgn"]
        if "Variant" in game_pgn:
            variant_game_counter = variant_game_counter + 1
            continue
        parsed_game = parser.parse(game_pgn, actions=pgn.Actions())
        tags = parsed_game.tag_pairs

        num_moves = int(len(parsed_game.movetext) / 2) + int(
            len(parsed_game.movetext) % 2)
        #import code
        #code.interact(local=locals())
        termination = tags.get("Termination", "NA")
        winner = termination.split(
            " ")[0] if "Game" not in termination else "Draw"
        win_type = " ".join(termination.split(" ")
                            [2:]) if "Game" not in termination else termination

        parsed_data.append([
            game["url"].split("/")[-1],
            tags.get("Date", "NA"),
            tags.get("TimeControl", "NA"),
            tags.get("ECOUrl", "NA").split("/")[-1], num_moves,
            tags.get("White", "NA"),
            tags.get("WhiteElo", "NA"),
            tags.get("Black", "NA"),
            tags.get("BlackElo", "NA"),
            tags.get("Termination", "NA"), winner, win_type,
            tags.get("StartTime", "NA"),
            tags.get("EndTime", "NA"),
            tags.get("Link", "NA"),
            tags.get("ECOUrl", "NA")
        ])

    print("Total games : ", len(parsed_data), ", Pgn missing :",
          pgn_missing_counter, ", Variant games : ", variant_game_counter)
    return pd.DataFrame(parsed_data, columns=columns)
コード例 #12
0
 def test_parse_san_pawn_takes(self):
     moves = '1. exd5 cxd5'
     movetext = parser.parse(moves, actions=Actions()).movetext[0]
     assert movetext.move_number == 1
     assert movetext.white.san == "exd5"
     assert movetext.black.san == "cxd5"
コード例 #13
0
 def test_get_move(self):
     """Given a move number retrieve that move"""
     input = '[Site "bmb.io"]\n{game comment} 35. e4 e5 36. d4 d5 37. c4 c5 {white wins} 1-0'
     g = parser.parse(input, actions=Actions())
     assert str(g.move(35)) == "35. e4 e5"
コード例 #14
0
 def test_parse_movetext_single_ply_blacksp(self):
     moves = '1... e5'
     movetext = parser.parse(moves, actions=Actions()).movetext[0]
     assert movetext.move_number == 1
     assert movetext.white.san == ""
     assert movetext.black.san == "e5"
コード例 #15
0
 def test_parse_san_piece_takes(self):
     moves = '1. Nxd5 Bxd5'
     movetext = parser.parse(moves, actions=Actions()).movetext[0]
     assert movetext.move_number == 1
     assert movetext.white.san == "Nxd5"
     assert movetext.black.san == "Bxd5"
コード例 #16
0
 def test_parse_score_no_tp_single_ply_unknown_white(self):
     moves = "11. Kxc4 *"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.score.result == "*"
コード例 #17
0
 def test_parse_movetext_simple(self):
     moves = '1. e4 e5'
     movetext = parser.parse(moves, actions=Actions()).movetext[0]
     assert movetext.move_number == 1
     assert movetext.white.san == "e4"
     assert movetext.black.san == "e5"
コード例 #18
0
 def test_parse_game_variations(self):
     moves = "[Site \"help\"]\n1. e4 (1. d4 d5) e5 1-0"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.movetext[0].white.variations[0][0].white.san == "d4"
     assert parsed.movetext[0].white.variations[0][0].black.san == "d5"
コード例 #19
0
def step_we_parse_it(context):
    context.pgn = parser.parse(context.pgn_str, actions=Actions())
コード例 #20
0
 def test_parse_arbitrary_space_any(self):
     moves = "[Site \"tst\"]\n1. Kxh2\nQxf4+ 0-1\n \n\t    \n"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.score.result == "0-1"
コード例 #21
0
 def test_parse_game_variations_multi_black(self):
     moves = "[Site \"help\"]\n1. e4 e5 (1...d5 2. c4 c5) 1-0"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.movetext[0].black.variations[0][0].white.san == ""
     assert parsed.movetext[0].black.variations[0][0].black.san == "d5"
     assert parsed.movetext[0].black.variations[0][1].black.san == "c5"
コード例 #22
0
 def test_parse_score_single_ply_white(self):
     moves = "[Site \"help\"]\n1. e4 1-0"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.score.result == "1-0"
コード例 #23
0
 def test_parse_newline_sore(self):
     moves = "[Site \"tst\"]\n1. Kxh2\nQxf4+ 0-1"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.score.result == "0-1"
コード例 #24
0
 def test_parse_score_single_ply_unknown_black(self):
     moves = "[Site \"tst\"]\n1...e4 *"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.score.result == "*"
コード例 #25
0
 def test_get_move_too_high(self):
     """Given a move number retrieve that move"""
     input = '[Site "bmb.io"]\n{game comment} 35. e4 e5 36. d4 d5 37. c4 c5 {white wins} 1-0'
     g = parser.parse(input, actions=Actions())
     with pytest.raises(PGNGameException):
         g.move(39)
コード例 #26
0
 def test_parse_tag_pair_newline(self):
     tag_pair = '[Site "chess.com"]\n'
     tag_pairs = parser.parse(tag_pair, actions=Actions()).tag_pairs
     assert tag_pairs['Site'] == "chess.com"
コード例 #27
0
 def test_str_extra(self):
     """Given a set of tag pairs, ensure an ordered STR"""
     input =  '[Extra "tp"]\n[Date "now"]\n[Site "bmb.io"]\n[Event "here"]\n{game comment} 1. e4 e5 {white wins} 1-0'
     expect = '[Event "here"]\n[Site "bmb.io"]\n[Date "now"]\n[Extra "tp"]\n\n{game comment} 1. e4 e5 {white wins} 1-0'
     actual = str(parser.parse(input, actions=Actions()))
     assert actual == expect
コード例 #28
0
 def test_parse_tag_pairs_space(self):
     tag_pairs = '[Event "Let\'s Play!"] [Site "chess.com"]'
     tag_pairs = parser.parse(tag_pairs, actions=Actions()).tag_pairs
     assert tag_pairs['Site'] == "chess.com"
     assert tag_pairs['Event'] == "Let\'s Play!"
コード例 #29
0
 def test_parse_tag_pair_3ws(self):
     tag_pair = '[ Site\n"chess.com"\t]'
     tag_pairs = parser.parse(tag_pair, actions=Actions()).tag_pairs
     assert tag_pairs['Site'] == "chess.com"
コード例 #30
0
 def test_parse_score_single_ply_black(self):
     moves = "[Site \"help\"]\n1...e5 0-1"
     parsed = parser.parse(moves, actions=Actions())
     assert parsed.score.result == "0-1"