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"
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"
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"
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"
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"]
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"
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"
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"
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"]
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)
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)
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"
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"
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"
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"
def test_parse_score_no_tp_single_ply_unknown_white(self): moves = "11. Kxc4 *" parsed = parser.parse(moves, actions=Actions()) assert parsed.score.result == "*"
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"
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"
def step_we_parse_it(context): context.pgn = parser.parse(context.pgn_str, actions=Actions())
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"
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"
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"
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"
def test_parse_score_single_ply_unknown_black(self): moves = "[Site \"tst\"]\n1...e4 *" parsed = parser.parse(moves, actions=Actions()) assert parsed.score.result == "*"
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)
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"
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
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!"
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"
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"