chess_data 1.0.6
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/LICENSE.rdoc +22 -0
- data/README.rdoc +115 -0
- data/lib/chess_data/board.rb +324 -0
- data/lib/chess_data/database.rb +83 -0
- data/lib/chess_data/game.rb +190 -0
- data/lib/chess_data/moves.rb +512 -0
- data/lib/chess_data/position-definition.rb +106 -0
- data/lib/chess_data.rb +7 -0
- metadata +80 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
module ChessData
|
2
|
+
|
3
|
+
# A PositionDefinition is a collection of criteria (matchers) which define
|
4
|
+
# a valid type of position.
|
5
|
+
#
|
6
|
+
# e.g. some kind of Rook endings.
|
7
|
+
#
|
8
|
+
# database.select do
|
9
|
+
# at_least 5, "P"
|
10
|
+
# exactly 1, "R"
|
11
|
+
# at_most 4, "p"
|
12
|
+
# exactly 1, "r"
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
class PositionDefinition
|
16
|
+
|
17
|
+
# The constructor evaluates the provided _block_, to set up the user's
|
18
|
+
# board criteria. It then sets up some default criteria for the king's and
|
19
|
+
# pieces not covered by the block.
|
20
|
+
def initialize(&block)
|
21
|
+
@matchers = []
|
22
|
+
instance_eval(&block)
|
23
|
+
|
24
|
+
# fill in a default matcher for any not present
|
25
|
+
["K", "k"].each do |piece|
|
26
|
+
unless @matchers.any? {|matcher| matcher.piece == piece}
|
27
|
+
exactly 1, piece
|
28
|
+
end
|
29
|
+
end
|
30
|
+
["P", "p", "N", "n", "B", "b", "R", "r", "Q", "q"].each do |piece|
|
31
|
+
unless @matchers.any? {|matcher| matcher.piece == piece}
|
32
|
+
exactly 0, piece
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Checks that all the criteria are matched by the given board.
|
38
|
+
def check board
|
39
|
+
@matchers.all? do |matcher|
|
40
|
+
matcher.check board
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# following methods used in block to constructor as DSL
|
47
|
+
# for a pattern definition
|
48
|
+
|
49
|
+
def exactly n, *pieces
|
50
|
+
pieces.each do |piece|
|
51
|
+
@matchers << ExactCount.new(n, piece)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def at_least n, *pieces
|
56
|
+
pieces.each do |piece|
|
57
|
+
@matchers << AtLeastCount.new(n, piece)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def at_most n, *pieces
|
62
|
+
pieces.each do |piece|
|
63
|
+
@matchers << AtMostCount.new(n, piece)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# parent class for the different types of count comparators
|
69
|
+
class Counter
|
70
|
+
attr_reader :piece
|
71
|
+
|
72
|
+
# Each counter has a target _piece_ and reference number _n_.
|
73
|
+
def initialize n, piece
|
74
|
+
@n = n
|
75
|
+
@piece = piece
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# The ExactCount class checks that there are exactly _n_ of the
|
80
|
+
# named piece on the board.
|
81
|
+
class ExactCount < Counter
|
82
|
+
# Returns true if board contains _n_ of _piece_
|
83
|
+
def check board
|
84
|
+
board.count(@piece) == @n
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# The AtLeastCount class checks that there are at least _n_ of the
|
89
|
+
# named piece on the board.
|
90
|
+
class AtLeastCount < Counter
|
91
|
+
# Returns true if board contains at least _n_ of _piece_
|
92
|
+
def check board
|
93
|
+
board.count(@piece) >= @n
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# The AtMostCount class checks that there are at most _n_ of the
|
98
|
+
# named piece on the board.
|
99
|
+
class AtMostCount < Counter
|
100
|
+
# Returns true if board contains at most _n_ of _piece_
|
101
|
+
def check board
|
102
|
+
board.count(@piece) <= @n
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
data/lib/chess_data.rb
ADDED
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: chess_data
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Peter Lane
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-02-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: word_wrap
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.0.0
|
33
|
+
description: "For searching/filtering datasets of chess games. This gem allows you
|
34
|
+
to read \ncollections of games from PGN files, select games which reach positions\nmatching
|
35
|
+
specific combinations of pieces, and save these games back in PGN\nformat.\n"
|
36
|
+
email: peterlane@gmx.com
|
37
|
+
executables: []
|
38
|
+
extensions: []
|
39
|
+
extra_rdoc_files:
|
40
|
+
- README.rdoc
|
41
|
+
- LICENSE.rdoc
|
42
|
+
files:
|
43
|
+
- LICENSE.rdoc
|
44
|
+
- README.rdoc
|
45
|
+
- lib/chess_data.rb
|
46
|
+
- lib/chess_data/board.rb
|
47
|
+
- lib/chess_data/database.rb
|
48
|
+
- lib/chess_data/game.rb
|
49
|
+
- lib/chess_data/moves.rb
|
50
|
+
- lib/chess_data/position-definition.rb
|
51
|
+
homepage:
|
52
|
+
licenses:
|
53
|
+
- MIT
|
54
|
+
metadata: {}
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options:
|
57
|
+
- "-m"
|
58
|
+
- README.rdoc
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '2.5'
|
66
|
+
- - "<"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '4.0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubygems_version: 3.4.5
|
76
|
+
signing_key:
|
77
|
+
specification_version: 4
|
78
|
+
summary: For searching/filtering datasets of chess games based on combinations of
|
79
|
+
pieces.
|
80
|
+
test_files: []
|