pgn2fen 0.9.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 +7 -0
- data/Gemfile +4 -0
- data/LICENSE +63 -0
- data/README.md +42 -0
- data/Rakefile +14 -0
- data/TODO +4 -0
- data/VERSION +1 -0
- data/lib/pgn2fen.rb +1053 -0
- data/pgn2fen.gemspec +24 -0
- data/test/pgn2fen_test.rb +143 -0
- metadata +58 -0
data/pgn2fen.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'pgn2fen'
|
5
|
+
s.version = '0.9.0'
|
6
|
+
s.summary = %q{Converts a single game chess PGN to an array of FEN strings}
|
7
|
+
s.description = <<-EOS
|
8
|
+
Converts a single game chess PGN to an array of FEN strings.
|
9
|
+
The FEN follows the specification as listed on [Forsyth–Edwards Notation](http://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation).
|
10
|
+
EOS
|
11
|
+
s.authors = ["Vinay Doma"]
|
12
|
+
s.email = %q{vinay.doma@gmail.com}
|
13
|
+
s.license = "Ruby"
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"LICENSE",
|
16
|
+
"README.md",
|
17
|
+
"TODO",
|
18
|
+
"VERSION"
|
19
|
+
]
|
20
|
+
s.files = Dir["**/*"] - Dir["*.gem"] - ["Gemfile.lock"]
|
21
|
+
s.homepage = %q{http://github.com/nivyatech/pgn2fen}
|
22
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
$: << File.join( File.dirname( __FILE__ ), '../lib/')
|
2
|
+
require 'pgn2fen'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class Pgn2FenTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_simple
|
8
|
+
pgn = %{
|
9
|
+
[Event "Rapperswil, Switzerland"]
|
10
|
+
[Site "Rapperswil, Switzerland"]
|
11
|
+
[Date "1955.??.??"]
|
12
|
+
[EventDate "?"]
|
13
|
+
[Round "?"]
|
14
|
+
[Result "1-0"]
|
15
|
+
[White "Martin"]
|
16
|
+
[Black "Pompei"]
|
17
|
+
[ECO "C45"]
|
18
|
+
[WhiteElo "?"]
|
19
|
+
[BlackElo "?"]
|
20
|
+
[PlyCount "41"]
|
21
|
+
|
22
|
+
1. e4 e5 2. Nf3 Nc6 3. d4 exd4 4. Bc4 Bc5 5. O-O d6 6. c3 dxc3
|
23
|
+
7. Nxc3 Be6 8. Nd5 Qd7 9. a3 Ne5 10. Nxe5 dxe5 11. Qb3 c6
|
24
|
+
12. Rd1 Bd4 13. Be3 O-O-O 14. Rac1 Kb8 15. Rxd4 exd4 16. Bf4+
|
25
|
+
Kc8 17. Qa4 Bxd5 18. exd5 Qg4 19. g3 Ne7 20. dxc6 Nxc6 21. Ba6
|
26
|
+
1-0
|
27
|
+
}
|
28
|
+
validate_fen_array(Pgn2Fen::Game.new(pgn).parse_pgn().fen_array)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_pawn_capture_two_ways
|
32
|
+
pgn = %{
|
33
|
+
[Event "Enpassent Test"]
|
34
|
+
[Site ""]
|
35
|
+
[Date ""]
|
36
|
+
[Round ""]
|
37
|
+
[White ""]
|
38
|
+
[Black ""]
|
39
|
+
[Result "0-1"]
|
40
|
+
[WhiteElo ""]
|
41
|
+
[BlackElo ""]
|
42
|
+
|
43
|
+
1.e4 c5 2.Nf3 Nc6 3.Bb5 e6 4.Bxc6 bxc6 5.b3 Ne7 6.Bb2 Ng6 7.h4 h5 8.e5 Be7
|
44
|
+
9.Nc3 d5 0-1
|
45
|
+
}
|
46
|
+
validate_fen_array(Pgn2Fen::Game.new(pgn).parse_pgn().fen_array)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_promotion_via_capture
|
50
|
+
pgn = %{
|
51
|
+
[Event "Enpassent Test"]
|
52
|
+
[Site ""]
|
53
|
+
[Date ""]
|
54
|
+
[Round ""]
|
55
|
+
[White ""]
|
56
|
+
[Black ""]
|
57
|
+
[Result "0-1"]
|
58
|
+
[WhiteElo ""]
|
59
|
+
[BlackElo ""]
|
60
|
+
|
61
|
+
1.e4 f5 2.exf5 e6 3.fxe6 Ke7 4.exd7 Qe8 5.dxc8=Q 0-1
|
62
|
+
}
|
63
|
+
validate_fen_array(Pgn2Fen::Game.new(pgn).parse_pgn().fen_array)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_promotion
|
67
|
+
pgn = %{
|
68
|
+
[Event "Enpassent Test"]
|
69
|
+
[Site ""]
|
70
|
+
[Date ""]
|
71
|
+
[Round ""]
|
72
|
+
[White ""]
|
73
|
+
[Black ""]
|
74
|
+
[Result "0-1"]
|
75
|
+
[WhiteElo ""]
|
76
|
+
[BlackElo ""]
|
77
|
+
|
78
|
+
1.e4 f5 2.exf5 g6 3.fxg6 Nf6 4.g7 h6 5.g8=Q 0-1
|
79
|
+
}
|
80
|
+
validate_fen_array(Pgn2Fen::Game.new(pgn).parse_pgn().fen_array)
|
81
|
+
end
|
82
|
+
|
83
|
+
def validate_fen_array(fen_array)
|
84
|
+
fen_array.each {|fen|
|
85
|
+
assert_equal true, validate_fen(fen)
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
# borrowed some ideas/code from the excellent https://github.com/jhlywa/chess.js
|
90
|
+
def validate_fen fen
|
91
|
+
tokens = fen.split
|
92
|
+
# check has required fields
|
93
|
+
unless tokens.length == 6
|
94
|
+
raise 'FEN string must contain six space-delimited fields.'
|
95
|
+
end
|
96
|
+
# check board layout
|
97
|
+
board_rows = tokens[0].split('/')
|
98
|
+
unless board_rows.length == 8
|
99
|
+
raise 'numbers of rows in piece placement field must be 8.'
|
100
|
+
end
|
101
|
+
board_rows.each {|row|
|
102
|
+
sum = 0
|
103
|
+
atoms = row.split("");
|
104
|
+
atoms.each {|atom|
|
105
|
+
if atom =~ /\b[0-8]\b/
|
106
|
+
sum += atom.to_i
|
107
|
+
elsif atom =~ /\b[a-z]|[A-Z]\b/
|
108
|
+
sum += 1
|
109
|
+
else
|
110
|
+
raise "invalid character #{atom} in piece placement row."
|
111
|
+
end
|
112
|
+
}
|
113
|
+
unless sum == 8
|
114
|
+
raise "row #{row} too large in piece placement field."
|
115
|
+
end
|
116
|
+
}
|
117
|
+
# check active color field is "w" or "b"
|
118
|
+
unless tokens[1] =~ /^(w|b)$/
|
119
|
+
raise "active color field needs to be w or b."
|
120
|
+
end
|
121
|
+
# check castling availability field
|
122
|
+
unless tokens[2] =~ /^(KQ?k?q?|Qk?q?|kq?|q|-)$/
|
123
|
+
raise "castling availability field is incorrect."
|
124
|
+
end
|
125
|
+
# check enpassent field
|
126
|
+
unless tokens[3] =~ /^(-|[abcdefgh][36])$/
|
127
|
+
raise "enpassent field is incorrect."
|
128
|
+
end
|
129
|
+
# check halfmove clock field is >= 0
|
130
|
+
unless tokens[4] =~ /\b[0-9]+\b/
|
131
|
+
raise "halfmove clock field is incorrect."
|
132
|
+
end
|
133
|
+
# check fullmove number field is > 0
|
134
|
+
unless tokens[5] =~ /\b[0-9]+\b/
|
135
|
+
raise "fullmove number field is incorrect."
|
136
|
+
end
|
137
|
+
if tokens[5].to_i == 0
|
138
|
+
raise "fullmove number field cannot be zero."
|
139
|
+
end
|
140
|
+
true
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pgn2fen
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vinay Doma
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: "Converts a single game chess PGN to an array of FEN strings. \nThe FEN
|
14
|
+
follows the specification as listed on [Forsyth–Edwards Notation](http://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation).\n"
|
15
|
+
email: vinay.doma@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files:
|
19
|
+
- LICENSE
|
20
|
+
- README.md
|
21
|
+
- TODO
|
22
|
+
- VERSION
|
23
|
+
files:
|
24
|
+
- Gemfile
|
25
|
+
- LICENSE
|
26
|
+
- README.md
|
27
|
+
- Rakefile
|
28
|
+
- TODO
|
29
|
+
- VERSION
|
30
|
+
- lib/pgn2fen.rb
|
31
|
+
- pgn2fen.gemspec
|
32
|
+
- test/pgn2fen_test.rb
|
33
|
+
homepage: http://github.com/nivyatech/pgn2fen
|
34
|
+
licenses:
|
35
|
+
- Ruby
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options:
|
39
|
+
- "--charset=UTF-8"
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements: []
|
53
|
+
rubyforge_project:
|
54
|
+
rubygems_version: 2.4.6
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: Converts a single game chess PGN to an array of FEN strings
|
58
|
+
test_files: []
|