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 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: