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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0a443bf7faed2df357231993215ff3573ec0aa5
4
- data.tar.gz: 270e148b8e7058f6de567e5109e3dbf701327515
3
+ metadata.gz: 70f3a7855b4d29274f4393cdc84bac75792dad94
4
+ data.tar.gz: 191c65ca1e5f3d7067629d2c167bdcfd495d8885
5
5
  SHA512:
6
- metadata.gz: 44a48cabb57cb8de5b753b5d6475fda1c9820ce82f3bb088a62cce1c90ff274b67373d7189d8b7f67855e3e7c25c8880a53eb669878d8e94fa350d9cfa57ddef
7
- data.tar.gz: c3c1609f08f1d0da32a27799e02deb1a4c4e3e56437bc71b9a4e3249ea68a1d04198d36216f2d9fea30ea4815e7a5a17c5ed616b81b15390c09f76417ea1fef7
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
@@ -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 {|m| m.gsub("0", "O") }
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
@@ -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
 
@@ -49,9 +49,34 @@ module PGN
49
49
 
50
50
  rule(:element) do |r|
51
51
  r[:move_number_indication].as { nil }
52
- r[:san_move]
53
- #r[:numeric_annotation_glyph]
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+ # dollar sign followed by an integer from 0 to 255
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
@@ -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 = 0)
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
@@ -1,3 +1,3 @@
1
1
  module PGN
2
- VERSION = "0.0.6"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -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
@@ -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,9 @@
1
+ [White "Fool"]
2
+ [Black "Somebody else"]
3
+
4
+ 1. f3 e5 2. g4 $4 Qh4# 0-1
5
+
6
+ [White "Fool"]
7
+ [Black "Somebody else"]
8
+
9
+ 1. f3 e5 2. g4 ?? Qh4# 0-1
@@ -0,0 +1,8 @@
1
+ [White "Scholar"]
2
+ [Black "Somebody else"]
3
+
4
+ { This is a multi-line commment,
5
+ where a comment spans in multiple lines. }
6
+
7
+ 1. e4 e5 2. Qh5 Nc6 3. {White about to move} Bc4 {White
8
+ moves} Nf6 {I pity the fool!} 4. Qxf7# 1-0
@@ -0,0 +1,5 @@
1
+ [White "Scholar"]
2
+ [Black "Somebody else"]
3
+
4
+ 1. e4 e5 2. Qh5 Nc6 3. Bc4 Nf6 {I pity
5
+ the fool!} 4. Qxf7# 1-0
@@ -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
@@ -0,0 +1,4 @@
1
+ [White "Somebody"]
2
+ [Black "Petrov"]
3
+
4
+ 1. e4 e5 2. Nf3 {comment} (2. Nc3 {other} d5 (2... f5) 3. exd5) (2. f4 exf4 {final variation}) 2... Nf6 *
@@ -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.6
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: 2013-10-10 00:00:00.000000000 Z
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.6
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: