pgn 0.0.6 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|