pgn 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -26
- data/lib/pgn/game.rb +34 -2
- data/lib/pgn/move_calculator.rb +5 -0
- data/lib/pgn/parser.rb +43 -3
- data/lib/pgn/position.rb +1 -1
- data/lib/pgn/version.rb +1 -1
- data/spec/game_spec.rb +8 -0
- data/spec/parser_spec.rb +58 -0
- data/spec/pgn_files/annotations.pgn +9 -0
- data/spec/pgn_files/comments.pgn +8 -0
- data/spec/pgn_files/multiline_comments.pgn +5 -0
- data/spec/pgn_files/test.pgn +55 -0
- data/spec/pgn_files/variations.pgn +4 -0
- data/spec/position_spec.rb +10 -0
- metadata +25 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70f3a7855b4d29274f4393cdc84bac75792dad94
|
4
|
+
data.tar.gz: 191c65ca1e5f3d7067629d2c167bdcfd495d8885
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 475172b8b7b9b84031b0de1fc4010b5b63250ae586d1bc018e2d5e5bd59ffbc530f369989bea9406169d3f94be93ff67d0be88d1dcb535a28398538cb4e0d96e
|
7
|
+
data.tar.gz: 78cc6d760518aaad4b0fa1a0d758199a037c29dd17877583eefaa6242f831c4f55c91d41750a8dfea2454cb73b5c264770edabb6c2775fe1a65a95523b534f28
|
data/README.md
CHANGED
@@ -20,21 +20,21 @@ or right arrow to move forward. `q` or `^C` quits play mode.
|
|
20
20
|
|
21
21
|
♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
|
22
22
|
♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
_ _ _ _ _ _ _ _
|
24
|
+
_ _ _ _ _ _ _ _
|
25
|
+
_ _ _ _ _ _ _ _
|
26
|
+
_ _ _ _ _ _ _ _
|
27
27
|
♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
|
28
28
|
♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
|
29
29
|
|
30
30
|
♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
|
31
31
|
♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
♙ ♙ ♙ ♙
|
32
|
+
_ _ _ _ _ _ _ _
|
33
|
+
_ _ _ _ _ _ _ _
|
34
|
+
_ _ _ _ _ _ _ _
|
35
|
+
_ _ _ _ ♙ _ _ _
|
36
|
+
_ _ _ _ _ _ _ _
|
37
|
+
♙ ♙ ♙ ♙ _ ♙ ♙ ♙
|
38
38
|
♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
|
39
39
|
|
40
40
|
...
|
@@ -44,14 +44,14 @@ You can also access all of the information about a game.
|
|
44
44
|
```
|
45
45
|
> game.positions.last
|
46
46
|
=>
|
47
|
-
♜
|
48
|
-
♟
|
49
|
-
♞
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
♙
|
54
|
-
♛
|
47
|
+
♜ _ ♝ ♚ _ _ _ ♜
|
48
|
+
♟ _ _ ♟ ♗ ♟ ♘ ♟
|
49
|
+
♞ _ _ _ _ ♞ _ _
|
50
|
+
_ ♟ _ ♘ ♙ _ _ ♙
|
51
|
+
_ _ _ _ _ _ ♙ _
|
52
|
+
_ _ _ ♙ _ _ _ _
|
53
|
+
♙ _ ♙ _ ♔ _ _ _
|
54
|
+
♛ _ _ _ _ _ ♝ _
|
55
55
|
|
56
56
|
> game.positions.last.to_fen
|
57
57
|
=> r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1 b - - 1 22
|
@@ -86,14 +86,14 @@ position. It is easy to convert between FEN strings and chess positions.
|
|
86
86
|
> fen = PGN::FEN.new("r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1 b - - 1 22")
|
87
87
|
> position = fen.to_position
|
88
88
|
=>
|
89
|
-
♜
|
90
|
-
♟
|
91
|
-
♞
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
♙
|
96
|
-
♛
|
89
|
+
♜ _ ♝ ♚ _ _ _ ♜
|
90
|
+
♟ _ _ ♟ ♗ ♟ ♘ ♟
|
91
|
+
♞ _ _ _ _ ♞ _ _
|
92
|
+
_ ♟ _ ♘ ♙ _ _ ♙
|
93
|
+
_ _ _ _ _ _ ♙ _
|
94
|
+
_ _ _ ♙ _ _ _ _
|
95
|
+
♙ _ ♙ _ ♔ _ _ _
|
96
|
+
♛ _ _ _ _ _ ♝ _
|
97
97
|
|
98
98
|
> position.to_fen
|
99
99
|
=> r1bk3r/p2pBpNp/n4n2/1p1NP2P/6P1/3P4/P1P1K3/q5b1 b - - 1 22
|
data/lib/pgn/game.rb
CHANGED
@@ -1,6 +1,32 @@
|
|
1
1
|
require 'io/console'
|
2
2
|
|
3
3
|
module PGN
|
4
|
+
class MoveText
|
5
|
+
attr_accessor :notation, :annotation, :comment, :variations
|
6
|
+
|
7
|
+
def initialize(notation, annotation = nil, comment = nil, variations = nil)
|
8
|
+
@notation = notation
|
9
|
+
@annotation = annotation
|
10
|
+
@comment = comment
|
11
|
+
@variations = variations
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(m)
|
15
|
+
self.to_s == m.to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
def eql?(m)
|
19
|
+
self == m
|
20
|
+
end
|
21
|
+
|
22
|
+
def hash
|
23
|
+
@notation.hash
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
@notation
|
28
|
+
end
|
29
|
+
end
|
4
30
|
# {PGN::Game} holds all of the information about a game. It is either
|
5
31
|
# the result of parsing a PGN file, or created by hand.
|
6
32
|
#
|
@@ -45,7 +71,13 @@ module PGN
|
|
45
71
|
# Standardize castling moves to use O's instead of 0's
|
46
72
|
#
|
47
73
|
def moves=(moves)
|
48
|
-
@moves = moves.map
|
74
|
+
@moves = moves.map do |m|
|
75
|
+
if m.is_a? String
|
76
|
+
MoveText.new(m.gsub("0", "O"))
|
77
|
+
else
|
78
|
+
MoveText.new(m.notation.gsub("0", "O"), m.annotation, m.comment, m.variations)
|
79
|
+
end
|
80
|
+
end
|
49
81
|
end
|
50
82
|
|
51
83
|
# @return [Array<PGN::Position>] list of the {PGN::Position}s in the game
|
@@ -55,7 +87,7 @@ module PGN
|
|
55
87
|
position = PGN::Position.start
|
56
88
|
arr = [position]
|
57
89
|
self.moves.each do |move|
|
58
|
-
new_pos = position.move(move)
|
90
|
+
new_pos = position.move(move.notation)
|
59
91
|
arr << new_pos
|
60
92
|
position = new_pos
|
61
93
|
end
|
data/lib/pgn/move_calculator.rb
CHANGED
@@ -116,6 +116,11 @@ module PGN
|
|
116
116
|
|
117
117
|
restrict = "KQ" if ['K', 'Q'].include? move.castle
|
118
118
|
restrict = "kq" if ['k', 'q'].include? move.castle
|
119
|
+
|
120
|
+
restrict += 'Q' if self.move.destination == 'a1' && !restrict.include?('Q')
|
121
|
+
restrict += 'q' if self.move.destination == 'a8' && !restrict.include?('q')
|
122
|
+
restrict += 'K' if self.move.destination == 'h1' && !restrict.include?('K')
|
123
|
+
restrict += 'k' if self.move.destination == 'h8' && !restrict.include?('k')
|
119
124
|
|
120
125
|
restrict ||= ''
|
121
126
|
|
data/lib/pgn/parser.rb
CHANGED
@@ -49,9 +49,34 @@ module PGN
|
|
49
49
|
|
50
50
|
rule(:element) do |r|
|
51
51
|
r[:move_number_indication].as { nil }
|
52
|
-
r[:
|
53
|
-
|
52
|
+
r[:san_move_annotated]
|
53
|
+
r[:san_move_annotated, :variation_list].as do |move, variations|
|
54
|
+
move.variations = variations
|
55
|
+
move
|
56
|
+
end
|
57
|
+
r[:comment].as { nil }
|
54
58
|
end
|
59
|
+
|
60
|
+
rule(:san_move_annotated) do |r|
|
61
|
+
r[:san_move].as { |move| MoveText.new(move) }
|
62
|
+
r[:san_move, :comment].as { |move, comment| MoveText.new(move, nil, comment) }
|
63
|
+
r[:san_move, :numeric_annotation_glyph].as { |move, annotation| MoveText.new(move, annotation) }
|
64
|
+
r[:san_move, :numeric_annotation_glyph, :comment].as { |move, annotation, comment| MoveText.new(move, annotation, comment) }
|
65
|
+
end
|
66
|
+
|
67
|
+
rule(:variation_list) do |r|
|
68
|
+
r[:variation, :variation_list].as { |variation, sequence| sequence << variation }
|
69
|
+
r[:variation].as { |v| [v] }
|
70
|
+
end
|
71
|
+
|
72
|
+
rule(:variation) do |r|
|
73
|
+
r["(", :element_sequence, ")"].as { |_, sequence, _| sequence }
|
74
|
+
end
|
75
|
+
|
76
|
+
# rule(:variation_sequence) do |r|
|
77
|
+
# r[:element, :variation_sequence]
|
78
|
+
# r[].as { [] }
|
79
|
+
# end
|
55
80
|
|
56
81
|
#rule(:recursive_variation) do |r|
|
57
82
|
#r["(", :element_sequence, ")"]
|
@@ -69,6 +94,20 @@ module PGN
|
|
69
94
|
}x
|
70
95
|
)
|
71
96
|
|
97
|
+
rule(
|
98
|
+
:comment => %r{
|
99
|
+
\{ # beginning of comment
|
100
|
+
(
|
101
|
+
[[:print:]&&[^\\\}]] | # printing characters except closing brace and backslash
|
102
|
+
\n |
|
103
|
+
\\\\ | # escaped backslashes
|
104
|
+
\\\}|\\\} | # escaped braces
|
105
|
+
\n # newlines
|
106
|
+
)* # zero or more of the above
|
107
|
+
\} # end of comment
|
108
|
+
}x
|
109
|
+
)
|
110
|
+
|
72
111
|
rule(
|
73
112
|
:game_termination => %r{
|
74
113
|
1-0 | # white wins
|
@@ -112,7 +151,8 @@ module PGN
|
|
112
151
|
|
113
152
|
rule(
|
114
153
|
:numeric_annotation_glyph => %r{
|
115
|
-
\$\d+
|
154
|
+
\$\d+ | # dollar sign followed by an integer from 0 to 255
|
155
|
+
[\?!][\?!]? # support the most used annotations directly
|
116
156
|
}x
|
117
157
|
)
|
118
158
|
end
|
data/lib/pgn/position.rb
CHANGED
@@ -61,7 +61,7 @@ module PGN
|
|
61
61
|
# :white,
|
62
62
|
# )
|
63
63
|
#
|
64
|
-
def initialize(board, player, castling = CASTLING, en_passant = nil, halfmove = 0, fullmove =
|
64
|
+
def initialize(board, player, castling = CASTLING, en_passant = nil, halfmove = 0, fullmove = 1)
|
65
65
|
self.board = board
|
66
66
|
self.player = player
|
67
67
|
self.castling = castling
|
data/lib/pgn/version.rb
CHANGED
data/spec/game_spec.rb
CHANGED
@@ -9,5 +9,13 @@ describe PGN::Game do
|
|
9
9
|
game = PGN::Game.new(moves, tags, result)
|
10
10
|
lambda { game.positions }.should_not raise_error
|
11
11
|
end
|
12
|
+
|
13
|
+
it "should have fullmove 2 after 1.e4 c5" do
|
14
|
+
moves = %w{e4 c5}
|
15
|
+
game = PGN::Game.new(moves)
|
16
|
+
last_pos = game.positions.last
|
17
|
+
|
18
|
+
last_pos.fullmove.should == 2
|
19
|
+
end
|
12
20
|
end
|
13
21
|
end
|
data/spec/parser_spec.rb
CHANGED
@@ -23,4 +23,62 @@ describe PGN do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
context "annotations" do
|
28
|
+
describe "parsing a file" do
|
29
|
+
it "should return a list of games" do
|
30
|
+
games = PGN.parse(File.read("./spec/pgn_files/annotations.pgn"))
|
31
|
+
games.each do |game|
|
32
|
+
game.tags["White"].should == "Fool"
|
33
|
+
game.result.should == "0-1"
|
34
|
+
game.moves.last.should == "Qh4#"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "parsing a file" do
|
40
|
+
it "should work with comments" do
|
41
|
+
games = PGN.parse(File.read("./spec/pgn_files/comments.pgn"))
|
42
|
+
game = games.first
|
43
|
+
game.tags["White"].should == "Scholar"
|
44
|
+
game.result.should == "1-0"
|
45
|
+
game.moves.last.should == "Qxf7#"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should work with multiline comments" do
|
49
|
+
games = PGN.parse(File.read("./spec/pgn_files/multiline_comments.pgn"))
|
50
|
+
game = games.first
|
51
|
+
game.tags["White"].should == "Scholar"
|
52
|
+
game.result.should == "1-0"
|
53
|
+
game.moves.last.should == "Qxf7#"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "parsing a file" do
|
58
|
+
it "should return a list of games" do
|
59
|
+
games = PGN.parse(File.read("./spec/pgn_files/variations.pgn"))
|
60
|
+
game = games.first
|
61
|
+
game.tags["Black"].should == "Petrov"
|
62
|
+
game.result.should == "*"
|
63
|
+
game.moves.last.should == "Nf6"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "parsing a complex file" do
|
68
|
+
it "should return a list of games" do
|
69
|
+
games = PGN.parse(File.read("./spec/pgn_files/test.pgn"))
|
70
|
+
game = games.first
|
71
|
+
game.tags["Black"].should == "Gelfand, Boris"
|
72
|
+
game.result.should == "1-0"
|
73
|
+
game.moves[13].should == "Nfd7"
|
74
|
+
game.moves[34].should == "f3"
|
75
|
+
game.moves[35].annotation.should == "$6"
|
76
|
+
game.moves[35].comment.should == "{Gelfand\ndecide tomar medidas.}"
|
77
|
+
game.moves[35].variations.size.should == 1
|
78
|
+
variation = game.moves[35].variations[0]
|
79
|
+
variation.size.should == 2
|
80
|
+
variation[0].should == "Nxf3"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
26
84
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
[Event "Zurich Chess Challenge"]
|
2
|
+
[Site "Zurich"]
|
3
|
+
[Date "2014.01.30"]
|
4
|
+
[Round "1"]
|
5
|
+
[White "Carlsen, Magnus"]
|
6
|
+
[Black "Gelfand, Boris"]
|
7
|
+
[Result "1-0"]
|
8
|
+
[ECO "D78"]
|
9
|
+
[WhiteElo "2878"]
|
10
|
+
[BlackElo "2777"]
|
11
|
+
[Annotator "Iago Porto"]
|
12
|
+
[PlyCount "73"]
|
13
|
+
[EventDate "2014.01.30"]
|
14
|
+
[EventCountry "SUI"]
|
15
|
+
[SourceDate "2014.01.04"]
|
16
|
+
|
17
|
+
{Esta es la primera partida de Carlsen como campeón del mundo. La voy a
|
18
|
+
comentar para el blog porque me ha gustado una idea bastante inusual que
|
19
|
+
ejecuta el jugador noruego. El análisis no pretende ser exhaustivo ni en ideas
|
20
|
+
ni en variantes, sino tan sólo reflejar las ideas y posiciones que me han
|
21
|
+
llamado la atención. He visto el análisis de Daniel King y estoy claramente
|
22
|
+
influenciado por él. Sin embargo, cualquier error es mío.} 1. c4 g6 2. d4 Nf6
|
23
|
+
3. Nf3 Bg7 4. g3 c6 5. Bg2 d5 6. Qa4 O-O 7. O-O Nfd7 {No me voy a meter en la
|
24
|
+
apertura, no conozco nada de estas líneas, aunque es cierto que esta jugada
|
25
|
+
choca.} 8. Qc2 Nf6 9. Bf4 Bf5 10. Qb3 Qb6 11. Nbd2 Ne4 12. e3 {Hasta este
|
26
|
+
momento, la posición es bastante simétrica. El blanco tiene, en mi opinión,
|
27
|
+
una ligerísima ventaja gracias a tener más presión central, aunque la posición
|
28
|
+
no presenta ningún desbalance estratégico.} Qxb3 13. axb3 {Se ha creado un
|
29
|
+
desbalance en la posición. El blanco obtiene la columna a para su torre a
|
30
|
+
cambio de los peones doblados.} Na6 {Y ahora Carlsen debió de decir: "yo
|
31
|
+
quiero que mi alfil de g2 juegue" y sus siguientes jugadas son implacables
|
32
|
+
para lograr este objetivo.} 14. cxd5 cxd5 15. g4 $1 {Brillante sacrificio de
|
33
|
+
peón.} Bxg4 16. Nxe4 dxe4 17. Nd2 f5 18. f3 {Finalmente se consigue el
|
34
|
+
objetivo, el alfil de g2 juega y el blanco tiene una presión desagradable
|
35
|
+
sobre el ala de dama negra. Me recuerda a un gambito Benko.} e5 $6 {Gelfand
|
36
|
+
decide tomar medidas.} (18... exf3 19. Nxf3 {A pesar de tener un peón de menos,
|
37
|
+
todas las piezas del blanco están muy activas y son mejores que las de su
|
38
|
+
rival. El blanco debería estar mejor.}) 19. dxe5 exf3 20. Nxf3 {Con respecto a
|
39
|
+
la variante anterior, aquí Gelfand devuelve el peón para lograr que las piezas
|
40
|
+
blancas no están tan activas. Considero que el blanco está también mejor y no
|
41
|
+
hay que olvidar que el peón de e5 está pasado.} Rae8 21. Ra5 Nb4 {Tratando de
|
42
|
+
poner el caballo en juego vía c6, donde defenderá a7 y atacará e5.} 22. Nd4 {
|
43
|
+
Evita la amenaza negra de Cc6.} b6 {Gelfand cede ante la presión.} 23. Rxa7
|
44
|
+
Bxe5 {Se mantiene la igualdad de material, pero ahora el rey negro empieza a
|
45
|
+
parecer débil.} 24. Bh6 Rf6 (24... Rf7 25. Ra4 {y cuando el caballo se vaya,
|
46
|
+
Ad5 gana la torre de f7.}) 25. h3 Bh5 {Carlsen encierra un poco más el alfil
|
47
|
+
blanco de negras.} 26. Nc2 $1 {Otra bonita combinación.} g5 (26... Nxc2 27.
|
48
|
+
Bd5+ Kh8 28. Bg7# {En su análisis, Daniel King decía que la torre entra por la
|
49
|
+
banda, pase de la muerte hacia atrás al alfil blanco, el portero la detiene
|
50
|
+
pero queda muerta para que el alfil negro la empuje al jaque mate.}) 27. Bxg5
|
51
|
+
Rg6 28. Rxf5 h6 29. Bxh6 Rxh6 30. Nxb4 $18 {Con material de más, a partir de
|
52
|
+
ahora es cuestión de técnica.} Bxb2 31. Nd5 Kh8 32. Rb7 Bd1 33. b4 Rg8 34. Ne7
|
53
|
+
Rd8 35. Be4 {El alfil se suma al ataque. El rey negro sigue débil.} Bf6 36.
|
54
|
+
Rxb6 Kg7 37. Rf2 $1 {Preciso remate. El caballo de e7 no se puede comer porque}
|
55
|
+
(37. Rf2 Bxe7 38. Rg2+ {y cae la torre de h6.}) 1-0
|
data/spec/position_spec.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe PGN::Position do
|
4
|
+
|
5
|
+
describe "start" do
|
6
|
+
|
7
|
+
it "should have fullmove 1" do
|
8
|
+
pos = PGN::Position.start
|
9
|
+
pos.fullmove.should == 1
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
4
14
|
context "disambiguating moves" do
|
5
15
|
describe "using SAN square disambiguation" do
|
6
16
|
pos = PGN::FEN.new("r1bqkb1r/pp1p1ppp/2n1pn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - 3 6").to_position
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pgn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stacey Touset
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: whittle
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: A PGN parser and FEN generator for Ruby
|
@@ -73,8 +73,8 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .rspec
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
78
|
- Gemfile
|
79
79
|
- LICENSE.txt
|
80
80
|
- README.md
|
@@ -95,6 +95,11 @@ files:
|
|
95
95
|
- spec/game_spec.rb
|
96
96
|
- spec/parser_spec.rb
|
97
97
|
- spec/pgn_files/alternate_castling.pgn
|
98
|
+
- spec/pgn_files/annotations.pgn
|
99
|
+
- spec/pgn_files/comments.pgn
|
100
|
+
- spec/pgn_files/multiline_comments.pgn
|
101
|
+
- spec/pgn_files/test.pgn
|
102
|
+
- spec/pgn_files/variations.pgn
|
98
103
|
- spec/position_spec.rb
|
99
104
|
- spec/spec_helper.rb
|
100
105
|
homepage: https://github.com/capicue/pgn
|
@@ -107,17 +112,17 @@ require_paths:
|
|
107
112
|
- lib
|
108
113
|
required_ruby_version: !ruby/object:Gem::Requirement
|
109
114
|
requirements:
|
110
|
-
- -
|
115
|
+
- - ">="
|
111
116
|
- !ruby/object:Gem::Version
|
112
117
|
version: '0'
|
113
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
119
|
requirements:
|
115
|
-
- -
|
120
|
+
- - ">="
|
116
121
|
- !ruby/object:Gem::Version
|
117
122
|
version: '0'
|
118
123
|
requirements: []
|
119
124
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.1
|
125
|
+
rubygems_version: 2.5.1
|
121
126
|
signing_key:
|
122
127
|
specification_version: 4
|
123
128
|
summary: A PGN parser for Ruby
|
@@ -126,6 +131,10 @@ test_files:
|
|
126
131
|
- spec/game_spec.rb
|
127
132
|
- spec/parser_spec.rb
|
128
133
|
- spec/pgn_files/alternate_castling.pgn
|
134
|
+
- spec/pgn_files/annotations.pgn
|
135
|
+
- spec/pgn_files/comments.pgn
|
136
|
+
- spec/pgn_files/multiline_comments.pgn
|
137
|
+
- spec/pgn_files/test.pgn
|
138
|
+
- spec/pgn_files/variations.pgn
|
129
139
|
- spec/position_spec.rb
|
130
140
|
- spec/spec_helper.rb
|
131
|
-
has_rdoc:
|