qi 5.1.0 → 6.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE.md +1 -1
- data/README.md +322 -32
- data/lib/qi.rb +4 -1
- data/lib/qi/position.rb +181 -0
- metadata +54 -57
- data/.gitignore +0 -10
- data/.travis.yml +0 -15
- data/.yardopts +0 -1
- data/CODE_OF_CONDUCT.md +0 -13
- data/Gemfile +0 -3
- data/Rakefile +0 -21
- data/VERSION.semver +0 -1
- data/bin/console +0 -7
- data/bin/setup +0 -5
- data/checksum/qi-3.0.0.gem.sha512 +0 -1
- data/checksum/qi-3.0.1.gem.sha512 +0 -1
- data/checksum/qi-3.0.2.gem.sha512 +0 -1
- data/checksum/qi-4.0.0.gem.sha512 +0 -1
- data/checksum/qi-5.0.0.gem.sha512 +0 -1
- data/fix/store_fix.rb +0 -53
- data/fix/support/coverage.rb +0 -3
- data/lib/qi/store.rb +0 -41
- data/pkg_checksum +0 -11
- data/qi.gemspec +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9def332500b0191148a3261cbf17fb9a1a737d46a54366e1f680ee9b924dd2f4
|
4
|
+
data.tar.gz: f9eabe8017a92934537d5a4763a74f0c18a0f3437f4e7a7e417ae18bf420eb8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 665e3b706f9b8652ff8280652c6ae808b9b968a1ea6e17603bdd27cbb8d43332b6ed532ebf153a192a5cd6049f8a1cbacdaaccd86824054a0583669e2903c127
|
7
|
+
data.tar.gz: e10b2f9376a1d8cd1706b4998f35cb0ef2f9180f9014ccf5193c69e8fbc11d40bfa5a61e9d27c0659c7447c032a884d231f51f92776c01d14a8ef5d6aa782605
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -1,24 +1,19 @@
|
|
1
|
-
# Qi
|
1
|
+
# Qi.rb
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/
|
4
|
-
[![Code Climate](https://codeclimate.com/github/cyril/qi.rb/badges/gpa.svg)][codeclimate]
|
3
|
+
[![Build Status](https://travis-ci.org/sashite/qi.rb.svg?branch=master)](https://travis-ci.org/sashite/qi.rb)
|
5
4
|
[![Gem Version](https://badge.fury.io/rb/qi.svg)][gem]
|
6
|
-
[![Inline docs](
|
7
|
-
[![Documentation](
|
5
|
+
[![Inline docs](https://inch-ci.org/github/sashite/qi.rb.svg?branch=master)][inchpages]
|
6
|
+
[![Documentation](https://img.shields.io/:yard-docs-38c800.svg)][rubydoc]
|
8
7
|
|
9
|
-
>
|
10
|
-
|
11
|
-
## Rubies
|
12
|
-
|
13
|
-
* [MRI](https://www.ruby-lang.org/)
|
14
|
-
* [Rubinius](http://rubini.us/)
|
15
|
-
* [JRuby](http://jruby.org/)
|
8
|
+
> `Qi` (棋) is an abstraction for initializing and updating positions of chess variants (including Chess, Janggi, Markruk, Shogi, Xiangqi).
|
16
9
|
|
17
10
|
## Installation
|
18
11
|
|
19
12
|
Add this line to your application's Gemfile:
|
20
13
|
|
21
|
-
|
14
|
+
```ruby
|
15
|
+
gem "qi"
|
16
|
+
```
|
22
17
|
|
23
18
|
And then execute:
|
24
19
|
|
@@ -28,36 +23,331 @@ Or install it yourself as:
|
|
28
23
|
|
29
24
|
$ gem install qi
|
30
25
|
|
31
|
-
##
|
26
|
+
## Examples
|
27
|
+
|
28
|
+
Let's replay [The Shortest Possible Game](https://userpages.monmouth.com/~colonel/shortshogi.html) of [Shogi](https://en.wikipedia.org/wiki/Shogi):
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
require "qi"
|
32
|
+
|
33
|
+
starting_position = Qi::Position.new(
|
34
|
+
"l", "n", "s", "g", "k", "g", "s", "n", "l",
|
35
|
+
nil, "r", nil, nil, nil, nil, nil, "b", nil,
|
36
|
+
"p", "p", "p", "p", "p", "p", "p", "p", "p",
|
37
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
38
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
39
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
40
|
+
"P", "P", "P", "P", "P", "P", "P", "P", "P",
|
41
|
+
nil, "B", nil, nil, nil, nil, nil, "R", nil,
|
42
|
+
"L", "N", "S", "G", "K", "G", "S", "N", "L"
|
43
|
+
)
|
44
|
+
|
45
|
+
starting_position.in_hand_pieces
|
46
|
+
# => []
|
47
|
+
|
48
|
+
starting_position.squares
|
49
|
+
# => ["l", "n", "s", "g", "k", "g", "s", "n", "l",
|
50
|
+
# nil, "r", nil, nil, nil, nil, nil, "b", nil,
|
51
|
+
# "p", "p", "p", "p", "p", "p", "p", "p", "p",
|
52
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
53
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
54
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
55
|
+
# "P", "P", "P", "P", "P", "P", "P", "P", "P",
|
56
|
+
# nil, "B", nil, nil, nil, nil, nil, "R", nil,
|
57
|
+
# "L", "N", "S", "G", "K", "G", "S", "N", "L"]
|
58
|
+
|
59
|
+
starting_position.pieces_in_hand_grouped_by_sides
|
60
|
+
# => [[], []]
|
61
|
+
|
62
|
+
starting_position.active_side_id
|
63
|
+
# => 0
|
64
|
+
|
65
|
+
# List of moves (see https://github.com/sashite/pmn.rb)
|
66
|
+
moves = [
|
67
|
+
[ 56, 47, "P" ],
|
68
|
+
[ 3, 11, "g" ],
|
69
|
+
[ 64, 24, "+B", "P" ],
|
70
|
+
[ 5, 14, "g" ],
|
71
|
+
[ 24, 14, "+B", "G" ],
|
72
|
+
[ 4, 3, "k" ],
|
73
|
+
[ nil, 13, "G" ]
|
74
|
+
]
|
75
|
+
|
76
|
+
last_position = moves.reduce(starting_position) do |position, move|
|
77
|
+
position.call(move)
|
78
|
+
end
|
79
|
+
|
80
|
+
last_position.in_hand_pieces
|
81
|
+
# => []
|
82
|
+
|
83
|
+
last_position.squares
|
84
|
+
# => ["l", "n", "s", "k", nil, nil, "s", "n", "l",
|
85
|
+
# nil, "r", "g", nil, "G", "+B", nil, "b", nil,
|
86
|
+
# "p", "p", "p", "p", "p", "p", nil, "p", "p",
|
87
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
88
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
89
|
+
# nil, nil, "P", nil, nil, nil, nil, nil, nil,
|
90
|
+
# "P", "P", nil, "P", "P", "P", "P", "P", "P",
|
91
|
+
# nil, nil, nil, nil, nil, nil, nil, "R", nil,
|
92
|
+
# "L", "N", "S", "G", "K", "G", "S", "N", "L"]
|
93
|
+
|
94
|
+
last_position.pieces_in_hand_grouped_by_sides
|
95
|
+
# => [["P"], []]
|
96
|
+
|
97
|
+
last_position.active_side_id
|
98
|
+
# => 1
|
99
|
+
```
|
100
|
+
|
101
|
+
A classic [Tsume Shogi](https://en.wikipedia.org/wiki/Tsume_shogi) problem:
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
require "qi"
|
105
|
+
|
106
|
+
starting_position = Qi::Position.new(
|
107
|
+
nil, nil, nil, "s", "k", "s", nil, nil, nil,
|
108
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
109
|
+
nil, nil, nil, nil, "+P", nil, nil, nil, nil,
|
110
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
111
|
+
nil, nil, nil, nil, nil, nil, nil, "+B", nil,
|
112
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
113
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
114
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
115
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
116
|
+
pieces_in_hand_grouped_by_sides: [
|
117
|
+
["S"],
|
118
|
+
["b", "g", "g", "g", "g", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "r", "r", "s"]
|
119
|
+
]
|
120
|
+
)
|
121
|
+
|
122
|
+
starting_position.in_hand_pieces
|
123
|
+
# => ["S"]
|
124
|
+
|
125
|
+
starting_position.squares
|
126
|
+
# => [nil, nil, nil, "s", "k", "s", nil, nil, nil,
|
127
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
128
|
+
# nil, nil, nil, nil, "+P", nil, nil, nil, nil,
|
129
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
130
|
+
# nil, nil, nil, nil, nil, nil, nil, "+B", nil,
|
131
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
132
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
133
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
134
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil]
|
135
|
+
|
136
|
+
starting_position.pieces_in_hand_grouped_by_sides
|
137
|
+
# => [["S"], ["b", "g", "g", "g", "g", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "r", "r", "s"]]
|
138
|
+
|
139
|
+
starting_position.active_side_id
|
140
|
+
# => 0
|
141
|
+
|
142
|
+
# List of moves (see https://github.com/sashite/pmn.rb)
|
143
|
+
moves = [
|
144
|
+
[ 43, 13, "+B" ], [ 5, 13, "s", "b" ],
|
145
|
+
[ nil, 14, "S" ]
|
146
|
+
]
|
147
|
+
|
148
|
+
last_position = moves.reduce(starting_position) do |position, move|
|
149
|
+
position.call(move)
|
150
|
+
end
|
151
|
+
|
152
|
+
last_position.in_hand_pieces
|
153
|
+
# => ["b", "g", "g", "g", "g", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "r", "r", "s", "b"]
|
154
|
+
|
155
|
+
last_position.squares
|
156
|
+
# => [nil, nil, nil, "s", "k", nil, nil, nil, nil,
|
157
|
+
# nil, nil, nil, nil, "s", "S", nil, nil, nil,
|
158
|
+
# nil, nil, nil, nil, "+P", nil, nil, nil, nil,
|
159
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
160
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
161
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
162
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
163
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
164
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil]
|
165
|
+
|
166
|
+
last_position.pieces_in_hand_grouped_by_sides
|
167
|
+
# => [[], ["b", "g", "g", "g", "g", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "r", "r", "s", "b"]]
|
168
|
+
|
169
|
+
last_position.active_side_id
|
170
|
+
# => 1
|
171
|
+
```
|
172
|
+
|
173
|
+
Another example with [Xiangqi](https://en.wikipedia.org/wiki/Xiangqi)'s Short Double Cannons Checkmate:
|
32
174
|
|
33
175
|
```ruby
|
34
|
-
require
|
176
|
+
require "qi"
|
177
|
+
|
178
|
+
starting_position = Qi::Position.new(
|
179
|
+
"車", "馬", "象", "士", "將", "士", "象", "馬", "車",
|
180
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
181
|
+
nil, "砲", nil, nil, nil, nil, nil, "砲", nil,
|
182
|
+
"卒", nil, "卒", nil, "卒", nil, "卒", nil, "卒",
|
183
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
184
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
185
|
+
"兵", nil, "兵", nil, "兵", nil, "兵", nil, "兵",
|
186
|
+
nil, "炮", nil, nil, nil, nil, nil, "炮", nil,
|
187
|
+
nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
188
|
+
"俥", "傌", "相", "仕", "帥", "仕", "相", "傌", "俥"
|
189
|
+
)
|
190
|
+
|
191
|
+
starting_position.in_hand_pieces
|
192
|
+
# => []
|
193
|
+
|
194
|
+
starting_position.squares
|
195
|
+
# => ["車", "馬", "象", "士", "將", "士", "象", "馬", "車",
|
196
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
197
|
+
# nil, "砲", nil, nil, nil, nil, nil, "砲", nil,
|
198
|
+
# "卒", nil, "卒", nil, "卒", nil, "卒", nil, "卒",
|
199
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
200
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
201
|
+
# "兵", nil, "兵", nil, "兵", nil, "兵", nil, "兵",
|
202
|
+
# nil, "炮", nil, nil, nil, nil, nil, "炮", nil,
|
203
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
204
|
+
# "俥", "傌", "相", "仕", "帥", "仕", "相", "傌", "俥"]
|
205
|
+
|
206
|
+
starting_position.pieces_in_hand_grouped_by_sides
|
207
|
+
# => [[], []]
|
208
|
+
|
209
|
+
starting_position.active_side_id
|
210
|
+
# => 0
|
211
|
+
|
212
|
+
# List of moves (see https://github.com/sashite/pmn.rb)
|
213
|
+
moves = [
|
214
|
+
[ 64, 67, "炮" ],
|
215
|
+
[ 25, 22, "砲" ],
|
216
|
+
[ 70, 52, "炮" ],
|
217
|
+
[ 19, 55, "砲" ],
|
218
|
+
[ 67, 31, "炮" ],
|
219
|
+
[ 22, 58, "砲" ],
|
220
|
+
[ 52, 49, "炮" ]
|
221
|
+
]
|
222
|
+
|
223
|
+
last_position = moves.reduce(starting_position) do |position, move|
|
224
|
+
position.call(move)
|
225
|
+
end
|
226
|
+
|
227
|
+
last_position.in_hand_pieces
|
228
|
+
# => []
|
229
|
+
|
230
|
+
last_position.squares
|
231
|
+
# => ["車", "馬", "象", "士", "將", "士", "象", "馬", "車",
|
232
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
233
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
234
|
+
# "卒", nil, "卒", nil, "炮", nil, "卒", nil, "卒",
|
235
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
236
|
+
# nil, nil, nil, nil, "炮", nil, nil, nil, nil,
|
237
|
+
# "兵", "砲", "兵", nil, "砲", nil, "兵", nil, "兵",
|
238
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
239
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
240
|
+
# "俥", "傌", "相", "仕", "帥", "仕", "相", "傌", "俥"]
|
35
241
|
|
36
|
-
|
242
|
+
last_position.pieces_in_hand_grouped_by_sides
|
243
|
+
# => [[], []]
|
37
244
|
|
38
|
-
|
39
|
-
|
40
|
-
result.captured # => nil
|
245
|
+
last_position.active_side_id
|
246
|
+
# => 1
|
41
247
|
```
|
42
248
|
|
43
|
-
|
249
|
+
Let's do some moves on a [Four-player chess](https://en.wikipedia.org/wiki/Four-player_chess) board:
|
44
250
|
|
45
|
-
|
251
|
+
```ruby
|
252
|
+
require "qi"
|
253
|
+
|
254
|
+
starting_position = Qi::Position.new(
|
255
|
+
nil , nil , nil , "yR", "yN", "yB", "yK", "yQ", "yB", "yN", "yR", nil , nil , nil ,
|
256
|
+
nil , nil , nil , "yP", "yP", "yP", "yP", "yP", "yP", "yP", "yP", nil , nil , nil ,
|
257
|
+
nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
258
|
+
"bR", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gR",
|
259
|
+
"bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
260
|
+
"bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
261
|
+
"bK", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gQ",
|
262
|
+
"bQ", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gK",
|
263
|
+
"bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
264
|
+
"bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
265
|
+
"bR", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gR",
|
266
|
+
nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
267
|
+
nil , nil , nil , "rP", "rP", "rP", "rP", "rP", "rP", "rP", "rP", nil , nil , nil ,
|
268
|
+
nil , nil , nil , "rR", "rN", "rB", "rQ", "rK", "rB", "rN", "rR", nil , nil , nil ,
|
269
|
+
pieces_in_hand_grouped_by_sides: [
|
270
|
+
[],
|
271
|
+
[],
|
272
|
+
[],
|
273
|
+
[]
|
274
|
+
]
|
275
|
+
)
|
276
|
+
|
277
|
+
starting_position.in_hand_pieces
|
278
|
+
# => []
|
279
|
+
|
280
|
+
starting_position.squares
|
281
|
+
# => [nil , nil , nil , "yR", "yN", "yB", "yK", "yQ", "yB", "yN", "yR", nil , nil , nil ,
|
282
|
+
# nil , nil , nil , "yP", "yP", "yP", "yP", "yP", "yP", "yP", "yP", nil , nil , nil ,
|
283
|
+
# nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
284
|
+
# "bR", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gR",
|
285
|
+
# "bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
286
|
+
# "bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
287
|
+
# "bK", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gQ",
|
288
|
+
# "bQ", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gK",
|
289
|
+
# "bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
290
|
+
# "bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
291
|
+
# "bR", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gR",
|
292
|
+
# nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
293
|
+
# nil , nil , nil , "rP", "rP", "rP", "rP", "rP", "rP", "rP", "rP", nil , nil , nil ,
|
294
|
+
# nil , nil , nil , "rR", "rN", "rB", "rQ", "rK", "rB", "rN", "rR", nil , nil , nil]
|
295
|
+
|
296
|
+
starting_position.pieces_in_hand_grouped_by_sides
|
297
|
+
# => [[], [], [], []]
|
298
|
+
|
299
|
+
starting_position.active_side_id
|
300
|
+
# => 0
|
301
|
+
|
302
|
+
# List of moves (see https://github.com/sashite/pmn.rb)
|
303
|
+
moves = [
|
304
|
+
[ 175, 147, "rP" ],
|
305
|
+
[ 85, 87, "bP" ],
|
306
|
+
[ 20, 48, "yP" ],
|
307
|
+
[ 110, 108, "gP" ],
|
308
|
+
[ 191, 162, "rN" ]
|
309
|
+
]
|
46
310
|
|
47
|
-
|
311
|
+
last_position = moves.reduce(starting_position) do |position, move|
|
312
|
+
position.call(move)
|
313
|
+
end
|
48
314
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
315
|
+
last_position.in_hand_pieces
|
316
|
+
# => []
|
317
|
+
|
318
|
+
last_position.squares
|
319
|
+
# => [nil , nil , nil , "yR", "yN", "yB", "yK", "yQ", "yB", "yN", "yR", nil , nil , nil ,
|
320
|
+
# nil , nil , nil , "yP", "yP", "yP", nil , "yP", "yP", "yP", "yP", nil , nil , nil ,
|
321
|
+
# nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
322
|
+
# "bR", "bP", nil , nil , nil , nil , "yP", nil , nil , nil , nil , nil , "gP", "gR",
|
323
|
+
# "bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
324
|
+
# "bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
325
|
+
# "bK", nil , nil , "bP", nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gQ",
|
326
|
+
# "bQ", "bP", nil , nil , nil , nil , nil , nil , nil , nil , "gP", nil , nil , "gK",
|
327
|
+
# "bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
328
|
+
# "bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
329
|
+
# "bR", "bP", nil , nil , nil , nil , nil , "rP", nil , nil , nil , nil , "gP", "gR",
|
330
|
+
# nil , nil , nil , nil , nil , nil , nil , nil , "rN", nil , nil , nil , nil , nil ,
|
331
|
+
# nil , nil , nil , "rP", "rP", "rP", "rP", nil , "rP", "rP", "rP", nil , nil , nil ,
|
332
|
+
# nil , nil , nil , "rR", "rN", "rB", "rQ", "rK", "rB", nil , "rR", nil , nil , nil]
|
333
|
+
|
334
|
+
last_position.pieces_in_hand_grouped_by_sides
|
335
|
+
# => [[], [], [], []]
|
336
|
+
|
337
|
+
last_position.active_side_id
|
338
|
+
# => 1
|
339
|
+
```
|
54
340
|
|
55
341
|
## License
|
56
342
|
|
57
|
-
|
343
|
+
The code is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
344
|
+
|
345
|
+
## About Sashite
|
346
|
+
|
347
|
+
This [gem](https://rubygems.org/gems/qi) is maintained by [Sashite](https://sashite.com/).
|
348
|
+
|
349
|
+
With some [lines of code](https://github.com/sashite/), let's share the beauty of Chinese, Japanese and Western cultures through the game of chess!
|
58
350
|
|
59
351
|
[gem]: https://rubygems.org/gems/qi
|
60
|
-
[
|
61
|
-
[
|
62
|
-
[inchpages]: http://inch-ci.org/github/cyril/qi.rb
|
63
|
-
[rubydoc]: http://rubydoc.info/gems/qi/frames
|
352
|
+
[inchpages]: https://inch-ci.org/github/sashite/qi.rb
|
353
|
+
[rubydoc]: https://rubydoc.info/gems/qi/frames
|
data/lib/qi.rb
CHANGED
data/lib/qi/position.rb
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Qi
|
4
|
+
# The position class.
|
5
|
+
#
|
6
|
+
# @see https://developer.sashite.com/specs/portable-chess-notation
|
7
|
+
class Position
|
8
|
+
# Players are identified by a number according to the order in which they
|
9
|
+
# traditionally play from the starting position.
|
10
|
+
#
|
11
|
+
# @!attribute [r] active_side_id
|
12
|
+
# @return [Integer] The identifier of the player who must play.
|
13
|
+
attr_reader :active_side_id
|
14
|
+
|
15
|
+
# The list of pieces in hand owned by players.
|
16
|
+
#
|
17
|
+
# @!attribute [r] pieces_in_hand_grouped_by_sides
|
18
|
+
# @return [Array] The list of pieces in hand for each side.
|
19
|
+
attr_reader :pieces_in_hand_grouped_by_sides
|
20
|
+
|
21
|
+
# The list of squares of on the board.
|
22
|
+
#
|
23
|
+
# @!attribute [r] squares
|
24
|
+
# @return [Array] The list of squares.
|
25
|
+
attr_reader :squares
|
26
|
+
|
27
|
+
# Initialize a position.
|
28
|
+
#
|
29
|
+
# @param squares [Array] The list of squares of on the board.
|
30
|
+
# @param active_side_id [Integer] The identifier of the player who must play.
|
31
|
+
# @param pieces_in_hand_grouped_by_sides [Array] The list of pieces in hand
|
32
|
+
# grouped by players.
|
33
|
+
#
|
34
|
+
# @example Chess's starting position
|
35
|
+
# Position.new(
|
36
|
+
# "♜", "♞", "♝", "♛", "♚", "♝", "♞", "♜",
|
37
|
+
# "♟", "♟", "♟", "♟", "♟", "♟", "♟", "♟",
|
38
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
39
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
40
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
41
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
42
|
+
# "♙", "♙", "♙", "♙", "♙", "♙", "♙", "♙",
|
43
|
+
# "♖", "♘", "♗", "♕", "♔", "♗", "♘", "♖"
|
44
|
+
# )
|
45
|
+
#
|
46
|
+
# @example Four-player chess's starting position
|
47
|
+
# Position.new(
|
48
|
+
# nil , nil , nil , "yR", "yN", "yB", "yK", "yQ", "yB", "yN", "yR", nil , nil , nil ,
|
49
|
+
# nil , nil , nil , "yP", "yP", "yP", "yP", "yP", "yP", "yP", "yP", nil , nil , nil ,
|
50
|
+
# nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
51
|
+
# "bR", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gR",
|
52
|
+
# "bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
53
|
+
# "bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
54
|
+
# "bK", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gQ",
|
55
|
+
# "bQ", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gK",
|
56
|
+
# "bB", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gB",
|
57
|
+
# "bN", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gN",
|
58
|
+
# "bR", "bP", nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , "gP", "gR",
|
59
|
+
# nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil , nil ,
|
60
|
+
# nil , nil , nil , "rP", "rP", "rP", "rP", "rP", "rP", "rP", "rP", nil , nil , nil ,
|
61
|
+
# nil , nil , nil , "rR", "rN", "rB", "rQ", "rK", "rB", "rN", "rR", nil , nil , nil ,
|
62
|
+
# pieces_in_hand_grouped_by_sides: [
|
63
|
+
# [],
|
64
|
+
# [],
|
65
|
+
# [],
|
66
|
+
# []
|
67
|
+
# ]
|
68
|
+
# )
|
69
|
+
#
|
70
|
+
# @example Makruk's starting position
|
71
|
+
# Position.new(
|
72
|
+
# "♜", "♞", "♝", "♛", "♚", "♝", "♞", "♜",
|
73
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
74
|
+
# "♟", "♟", "♟", "♟", "♟", "♟", "♟", "♟",
|
75
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
76
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
77
|
+
# "♙", "♙", "♙", "♙", "♙", "♙", "♙", "♙",
|
78
|
+
# nil, nil, nil, nil, nil, nil, nil, nil,
|
79
|
+
# "♖", "♘", "♗", "♔", "♕", "♗", "♘", "♖"
|
80
|
+
# )
|
81
|
+
#
|
82
|
+
# @example Shogi's starting position
|
83
|
+
# Position.new(
|
84
|
+
# "l", "n", "s", "g", "k", "g", "s", "n", "l",
|
85
|
+
# nil, "r", nil, nil, nil, nil, nil, "b", nil,
|
86
|
+
# "p", "p", "p", "p", "p", "p", "p", "p", "p",
|
87
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
88
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
89
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
90
|
+
# "P", "P", "P", "P", "P", "P", "P", "P", "P",
|
91
|
+
# nil, "B", nil, nil, nil, nil, nil, "R", nil,
|
92
|
+
# "L", "N", "S", "G", "K", "G", "S", "N", "L"
|
93
|
+
# )
|
94
|
+
#
|
95
|
+
# @example A classic Tsume Shogi problem
|
96
|
+
# Position.new(
|
97
|
+
# nil, nil, nil, "s", "k", "s", nil, nil, nil,
|
98
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
99
|
+
# nil, nil, nil, nil, "+P", nil, nil, nil, nil,
|
100
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
101
|
+
# nil, nil, nil, nil, nil, nil, nil, "+B", nil,
|
102
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
103
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
104
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
105
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
106
|
+
# pieces_in_hand_grouped_by_sides: [
|
107
|
+
# ["S"],
|
108
|
+
# ["b", "g", "g", "g", "g", "n", "n", "n", "n", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "r", "r", "s"]
|
109
|
+
# ]
|
110
|
+
# )
|
111
|
+
#
|
112
|
+
# @example Xiangqi's starting position
|
113
|
+
# Position.new(
|
114
|
+
# "車", "馬", "象", "士", "將", "士", "象", "馬", "車",
|
115
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
116
|
+
# nil, "砲", nil, nil, nil, nil, nil, "砲", nil,
|
117
|
+
# "卒", nil, "卒", nil, "卒", nil, "卒", nil, "卒",
|
118
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
119
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
120
|
+
# "兵", nil, "兵", nil, "兵", nil, "兵", nil, "兵",
|
121
|
+
# nil, "炮", nil, nil, nil, nil, nil, "炮", nil,
|
122
|
+
# nil, nil, nil, nil, nil, nil, nil, nil, nil,
|
123
|
+
# "俥", "傌", "相", "仕", "帥", "仕", "相", "傌", "俥"
|
124
|
+
# )
|
125
|
+
def initialize(*squares, active_side_id: 0, pieces_in_hand_grouped_by_sides: [[], []])
|
126
|
+
@squares = squares
|
127
|
+
@active_side_id = active_side_id % pieces_in_hand_grouped_by_sides.length
|
128
|
+
@pieces_in_hand_grouped_by_sides = pieces_in_hand_grouped_by_sides
|
129
|
+
|
130
|
+
freeze
|
131
|
+
end
|
132
|
+
|
133
|
+
# Apply a move in PMN (Portable Move Notation) format.
|
134
|
+
#
|
135
|
+
# @param move [Array] The move to play.
|
136
|
+
# @see https://developer.sashite.com/specs/portable-move-notation
|
137
|
+
# @return [Position] The new position.
|
138
|
+
def call(move)
|
139
|
+
updated_squares = squares.dup
|
140
|
+
updated_in_hand_pieces = in_hand_pieces.dup
|
141
|
+
|
142
|
+
actions = move.each_slice(4)
|
143
|
+
|
144
|
+
actions.each do |action|
|
145
|
+
src_square_id = action.fetch(0)
|
146
|
+
dst_square_id = action.fetch(1)
|
147
|
+
moved_piece_name = action.fetch(2)
|
148
|
+
captured_piece_name = action.fetch(3, nil)
|
149
|
+
|
150
|
+
if src_square_id.nil?
|
151
|
+
piece_in_hand_id = updated_in_hand_pieces.index(moved_piece_name)
|
152
|
+
updated_in_hand_pieces.delete_at(piece_in_hand_id)
|
153
|
+
else
|
154
|
+
updated_squares[src_square_id] = nil
|
155
|
+
end
|
156
|
+
|
157
|
+
updated_squares[dst_square_id] = moved_piece_name
|
158
|
+
|
159
|
+
unless captured_piece_name.nil?
|
160
|
+
updated_in_hand_pieces.push(captured_piece_name)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
updated_pieces_in_hand_grouped_by_sides = pieces_in_hand_grouped_by_sides.dup
|
165
|
+
updated_pieces_in_hand_grouped_by_sides[active_side_id] = updated_in_hand_pieces
|
166
|
+
|
167
|
+
self.class.new(*updated_squares,
|
168
|
+
active_side_id: active_side_id.next,
|
169
|
+
pieces_in_hand_grouped_by_sides: updated_pieces_in_hand_grouped_by_sides
|
170
|
+
)
|
171
|
+
end
|
172
|
+
|
173
|
+
# The list of pieces in hand owned by the current player.
|
174
|
+
#
|
175
|
+
# @return [Array] Topside's pieces in hand if turn to topside, bottomside's
|
176
|
+
# ones otherwise.
|
177
|
+
def in_hand_pieces
|
178
|
+
pieces_in_hand_grouped_by_sides.fetch(active_side_id)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
metadata
CHANGED
@@ -1,132 +1,130 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Kato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: brutal
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- - "
|
31
|
+
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
33
|
+
version: '0'
|
20
34
|
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- - "
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- - "
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
47
|
+
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- - "
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: rubocop-performance
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - "
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0
|
61
|
+
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - "
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: rubocop-thread_safety
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
75
|
+
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: simplecov
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
89
|
+
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: yard
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- - "
|
101
|
+
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0
|
103
|
+
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- - "
|
108
|
+
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0
|
97
|
-
description:
|
98
|
-
email:
|
99
|
-
- contact@cyril.email
|
110
|
+
version: '0'
|
111
|
+
description: Instantiate PCN's positions and apply PMN's moves.
|
112
|
+
email: contact@cyril.email
|
100
113
|
executables: []
|
101
114
|
extensions: []
|
102
115
|
extra_rdoc_files: []
|
103
116
|
files:
|
104
|
-
- ".gitignore"
|
105
|
-
- ".travis.yml"
|
106
|
-
- ".yardopts"
|
107
|
-
- CODE_OF_CONDUCT.md
|
108
|
-
- Gemfile
|
109
117
|
- LICENSE.md
|
110
118
|
- README.md
|
111
|
-
- Rakefile
|
112
|
-
- VERSION.semver
|
113
|
-
- bin/console
|
114
|
-
- bin/setup
|
115
|
-
- checksum/qi-3.0.0.gem.sha512
|
116
|
-
- checksum/qi-3.0.1.gem.sha512
|
117
|
-
- checksum/qi-3.0.2.gem.sha512
|
118
|
-
- checksum/qi-4.0.0.gem.sha512
|
119
|
-
- checksum/qi-5.0.0.gem.sha512
|
120
|
-
- fix/store_fix.rb
|
121
|
-
- fix/support/coverage.rb
|
122
119
|
- lib/qi.rb
|
123
|
-
- lib/qi/
|
124
|
-
|
125
|
-
- qi.gemspec
|
126
|
-
homepage: https://github.com/cyril/qi.rb
|
120
|
+
- lib/qi/position.rb
|
121
|
+
homepage: https://developer.sashite.com/specs/
|
127
122
|
licenses:
|
128
123
|
- MIT
|
129
|
-
metadata:
|
124
|
+
metadata:
|
125
|
+
bug_tracker_uri: https://github.com/sashite/qi.rb/issues
|
126
|
+
documentation_uri: https://rubydoc.info/gems/qi/index
|
127
|
+
source_code_uri: https://github.com/sashite/qi.rb
|
130
128
|
post_install_message:
|
131
129
|
rdoc_options: []
|
132
130
|
require_paths:
|
@@ -142,9 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
140
|
- !ruby/object:Gem::Version
|
143
141
|
version: '0'
|
144
142
|
requirements: []
|
145
|
-
|
146
|
-
rubygems_version: 2.6.11
|
143
|
+
rubygems_version: 3.1.2
|
147
144
|
signing_key:
|
148
145
|
specification_version: 4
|
149
|
-
summary:
|
146
|
+
summary: Represent positions and play moves.
|
150
147
|
test_files: []
|
data/.gitignore
DELETED
data/.travis.yml
DELETED
data/.yardopts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
- README.md
|
data/CODE_OF_CONDUCT.md
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# Contributor Code of Conduct
|
2
|
-
|
3
|
-
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
4
|
-
|
5
|
-
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
|
6
|
-
|
7
|
-
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
8
|
-
|
9
|
-
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
10
|
-
|
11
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
|
12
|
-
|
13
|
-
This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
data/Gemfile
DELETED
data/Rakefile
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'bundler/gem_tasks'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rubocop/rake_task'
|
4
|
-
|
5
|
-
RuboCop::RakeTask.new
|
6
|
-
|
7
|
-
Rake::TestTask.new do |t|
|
8
|
-
t.verbose = true
|
9
|
-
t.warning = true
|
10
|
-
t.pattern = File.join('fix', '**', '*_fix.rb')
|
11
|
-
end
|
12
|
-
|
13
|
-
namespace :test do
|
14
|
-
task :coverage do
|
15
|
-
ENV['COVERAGE'] = 'true'
|
16
|
-
Rake::Task['test'].invoke
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
task(:doc_stats) { ruby '-S yard stats' }
|
21
|
-
task default: %i[test doc_stats]
|
data/VERSION.semver
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
5.1.0
|
data/bin/console
DELETED
data/bin/setup
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
7a4d1c15b8214a9eb475ed919ac4fcaf4b3a9aab5936b1522cbb801b243a649f95d23f42584c0fbad7f4a2ab71efaab9e6b030496a2f7471c74f74986e0e620d
|
@@ -1 +0,0 @@
|
|
1
|
-
03a1a4eb9f239b817fcab338c15c652a47183c0d58a63c505df1f6a7011ef0d9f2c94bb51f25c5ac455536b5f649dcbaa7087c6033ffe35c4acf5265efa0f853
|
@@ -1 +0,0 @@
|
|
1
|
-
bacf809a9ee2de6656c3180bd7200503004cfd3017472501854a6e73cab84fc02f37c1190fabc15d3f1ff7cedbc1a0ff5bae2391f4766b2d27819a57c8713661
|
@@ -1 +0,0 @@
|
|
1
|
-
957cae1db3b9f904922f3081fb482802ec8dc6867e3fc6a7d5fd8ba9c892246a53da7a7c9950464b40bd7777ed64f70aee727713292b62cc090dd68db724dcf7
|
@@ -1 +0,0 @@
|
|
1
|
-
b4a7910e65556a19a74e0beffa3a00d05b38da150749ff73ea30df62aeaea2e6626a7680304a4bc62ccfd0850b6c948017e8ba4911b06adcd1162fa21b627a72
|
data/fix/store_fix.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
require_relative File.join 'support', 'coverage'
|
2
|
-
require_relative File.join '..', 'lib', 'qi'
|
3
|
-
require 'fix'
|
4
|
-
|
5
|
-
Fix.describe Qi::Store do
|
6
|
-
on :new, 8 do
|
7
|
-
on :to_a do
|
8
|
-
it { MUST eql [nil, nil, nil, nil, nil, nil, nil, nil] }
|
9
|
-
end
|
10
|
-
|
11
|
-
on :call, 44, 3, 'p' do
|
12
|
-
it { MUST raise_exception ArgumentError }
|
13
|
-
end
|
14
|
-
|
15
|
-
on :call, 2, 444, 'p' do
|
16
|
-
it { MUST raise_exception ArgumentError }
|
17
|
-
end
|
18
|
-
|
19
|
-
on :captured do
|
20
|
-
it { MUST be_nil }
|
21
|
-
end
|
22
|
-
|
23
|
-
on :call, 2, 3, 'p' do
|
24
|
-
on :to_a do
|
25
|
-
it { MUST eql [nil, nil, nil, 'p', nil, nil, nil, nil] }
|
26
|
-
end
|
27
|
-
|
28
|
-
on :captured do
|
29
|
-
it { MUST be_nil }
|
30
|
-
end
|
31
|
-
|
32
|
-
on :call, 2, 4, 'K' do
|
33
|
-
on :to_a do
|
34
|
-
it { MUST eql [nil, nil, nil, 'p', 'K', nil, nil, nil] }
|
35
|
-
end
|
36
|
-
|
37
|
-
on :captured do
|
38
|
-
it { MUST be_nil }
|
39
|
-
end
|
40
|
-
|
41
|
-
on :call, 3, 4, 'p' do
|
42
|
-
on :to_a do
|
43
|
-
it { MUST eql [nil, nil, nil, nil, 'p', nil, nil, nil] }
|
44
|
-
end
|
45
|
-
|
46
|
-
on :captured do
|
47
|
-
it { MUST eql 'K' }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
data/fix/support/coverage.rb
DELETED
data/lib/qi/store.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module Qi
|
2
|
-
class Store
|
3
|
-
attr_reader :size, :captured, :position
|
4
|
-
|
5
|
-
def initialize(size, captured = nil, position = {})
|
6
|
-
@size = Integer(size)
|
7
|
-
@captured = captured
|
8
|
-
@position = Hash(position).compact
|
9
|
-
end
|
10
|
-
|
11
|
-
def call(position_id, capture_position_id, content)
|
12
|
-
position_id = Integer(position_id)
|
13
|
-
capture_position_id = Integer(capture_position_id)
|
14
|
-
|
15
|
-
[position_id, capture_position_id].each do |id|
|
16
|
-
next if range.include?(id)
|
17
|
-
|
18
|
-
raise ArgumentError, "#{id} out of range"
|
19
|
-
end
|
20
|
-
|
21
|
-
self.class.new(
|
22
|
-
size,
|
23
|
-
position[capture_position_id],
|
24
|
-
position.merge(
|
25
|
-
position_id => nil,
|
26
|
-
capture_position_id => content
|
27
|
-
)
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
def to_a
|
32
|
-
range.map { |i| position[i] }
|
33
|
-
end
|
34
|
-
|
35
|
-
protected
|
36
|
-
|
37
|
-
def range
|
38
|
-
0...size
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/pkg_checksum
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'digest/sha2'
|
4
|
-
|
5
|
-
gemname = :qi
|
6
|
-
ARGV[0] = File.read('VERSION.semver').chomp if ARGV[0].nil?
|
7
|
-
built_gem_path = "pkg/#{gemname}-#{ARGV[0]}.gem"
|
8
|
-
checksum = Digest::SHA512.new.hexdigest(File.read(built_gem_path))
|
9
|
-
checksum_path = "checksum/#{gemname}-#{ARGV[0]}.gem.sha512"
|
10
|
-
|
11
|
-
File.open(checksum_path, 'w') { |f| f.write("#{checksum}\n") }
|
data/qi.gemspec
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
Gem::Specification.new do |spec|
|
2
|
-
spec.name = 'qi'
|
3
|
-
spec.version = File.read('VERSION.semver').chomp
|
4
|
-
spec.authors = ['Cyril Kato']
|
5
|
-
spec.email = ['contact@cyril.email']
|
6
|
-
|
7
|
-
spec.summary = 'Store to manage ordered stuff.'
|
8
|
-
spec.description = 'An ordered store of stuff to manage, for Ruby.'
|
9
|
-
spec.homepage = 'https://github.com/cyril/qi.rb'
|
10
|
-
spec.license = 'MIT'
|
11
|
-
|
12
|
-
spec.files =
|
13
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^test/}) }
|
14
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
15
|
-
spec.require_paths = ['lib']
|
16
|
-
|
17
|
-
spec.add_development_dependency 'bundler', '~> 1.15'
|
18
|
-
spec.add_development_dependency 'rake', '~> 12.0'
|
19
|
-
spec.add_development_dependency 'yard', '~> 0.9'
|
20
|
-
spec.add_development_dependency 'simplecov', '~> 0.14'
|
21
|
-
spec.add_development_dependency 'rubocop', '~> 0.49'
|
22
|
-
spec.add_development_dependency 'fix', '~> 0.17'
|
23
|
-
end
|