sashite-ggn 0.0.1

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.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE.md +22 -0
  7. data/README.md +566 -0
  8. data/Rakefile +7 -0
  9. data/VERSION.semver +1 -0
  10. data/lib/sashite-ggn.rb +1 -0
  11. data/lib/sashite/ggn.rb +9 -0
  12. data/lib/sashite/ggn/ability.rb +37 -0
  13. data/lib/sashite/ggn/actor.rb +28 -0
  14. data/lib/sashite/ggn/ally.rb +28 -0
  15. data/lib/sashite/ggn/area.rb +25 -0
  16. data/lib/sashite/ggn/attacked.rb +28 -0
  17. data/lib/sashite/ggn/boolean.rb +25 -0
  18. data/lib/sashite/ggn/digit.rb +28 -0
  19. data/lib/sashite/ggn/digit_excluding_zero.rb +25 -0
  20. data/lib/sashite/ggn/direction.rb +27 -0
  21. data/lib/sashite/ggn/gameplay.rb +40 -0
  22. data/lib/sashite/ggn/gameplay_into_base64.rb +28 -0
  23. data/lib/sashite/ggn/integer.rb +28 -0
  24. data/lib/sashite/ggn/last_moved_actor.rb +28 -0
  25. data/lib/sashite/ggn/maximum_magnitude.rb +28 -0
  26. data/lib/sashite/ggn/name.rb +25 -0
  27. data/lib/sashite/ggn/negative_integer.rb +27 -0
  28. data/lib/sashite/ggn/null.rb +23 -0
  29. data/lib/sashite/ggn/object.rb +36 -0
  30. data/lib/sashite/ggn/occupied.rb +37 -0
  31. data/lib/sashite/ggn/pattern.rb +29 -0
  32. data/lib/sashite/ggn/previous_moves_counter.rb +28 -0
  33. data/lib/sashite/ggn/promotable_into_actors.rb +32 -0
  34. data/lib/sashite/ggn/required.rb +27 -0
  35. data/lib/sashite/ggn/self.rb +23 -0
  36. data/lib/sashite/ggn/square.rb +37 -0
  37. data/lib/sashite/ggn/state.rb +34 -0
  38. data/lib/sashite/ggn/subject.rb +37 -0
  39. data/lib/sashite/ggn/unsigned_integer.rb +28 -0
  40. data/lib/sashite/ggn/unsigned_integer_excluding_zero.rb +28 -0
  41. data/lib/sashite/ggn/verb.rb +42 -0
  42. data/lib/sashite/ggn/zero.rb +23 -0
  43. data/sashite-ggn.gemspec +21 -0
  44. data/test/_test_helper.rb +2 -0
  45. data/test/test_ggn.rb +546 -0
  46. data/test/test_ggn_ability.rb +51 -0
  47. data/test/test_ggn_actor.rb +591 -0
  48. data/test/test_ggn_ally.rb +51 -0
  49. data/test/test_ggn_area.rb +79 -0
  50. data/test/test_ggn_attacked.rb +51 -0
  51. data/test/test_ggn_boolean.rb +37 -0
  52. data/test/test_ggn_digit.rb +21 -0
  53. data/test/test_ggn_digit_excluding_zero.rb +22 -0
  54. data/test/test_ggn_direction.rb +21 -0
  55. data/test/test_ggn_gameplay.rb +573 -0
  56. data/test/test_ggn_gameplay_into_base64.rb +545 -0
  57. data/test/test_ggn_integer.rb +41 -0
  58. data/test/test_ggn_last_moved_actor.rb +51 -0
  59. data/test/test_ggn_maximum_magnitude.rb +37 -0
  60. data/test/test_ggn_name.rb +51 -0
  61. data/test/test_ggn_negative_integer.rb +21 -0
  62. data/test/test_ggn_null.rb +21 -0
  63. data/test/test_ggn_object.rb +35 -0
  64. data/test/test_ggn_occupied.rb +102 -0
  65. data/test/test_ggn_pattern.rb +82 -0
  66. data/test/test_ggn_previous_moves_counter.rb +41 -0
  67. data/test/test_ggn_promotable_into_actors.rb +598 -0
  68. data/test/test_ggn_required.rb +37 -0
  69. data/test/test_ggn_self.rb +21 -0
  70. data/test/test_ggn_square.rb +27 -0
  71. data/test/test_ggn_state.rb +28 -0
  72. data/test/test_ggn_subject.rb +30 -0
  73. data/test/test_ggn_unsigned_integer.rb +21 -0
  74. data/test/test_ggn_unsigned_integer_excluding_zero.rb +21 -0
  75. data/test/test_ggn_verb.rb +26 -0
  76. data/test/test_ggn_zero.rb +21 -0
  77. metadata +208 -0
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ end
6
+
7
+ task default: :test
data/VERSION.semver ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1 @@
1
+ require 'sashite/ggn'
@@ -0,0 +1,9 @@
1
+ require_relative 'ggn/gameplay'
2
+
3
+ module Sashite
4
+ module GGN
5
+ def self.load str
6
+ Gameplay.new str
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'subject'
2
+ require_relative 'verb'
3
+ require_relative 'object'
4
+
5
+ module Sashite
6
+ module GGN
7
+ class Ability
8
+ PATTERN = /#{Subject::PATTERN}\^#{Verb::PATTERN}=#{Object::PATTERN}/
9
+
10
+ def self.valid? str
11
+ !!str.match("^#{PATTERN}$")
12
+ end
13
+
14
+ attr_reader :subject, :verb, :object
15
+
16
+ def initialize str
17
+ raise ArgumentError unless self.class.valid? str
18
+
19
+ @subject = Subject.new str.split('^').fetch 0
20
+ @verb = Verb.new str.split('^').fetch(1).split('=').fetch 0
21
+ @object = Object.new str.split('=').fetch 1
22
+ end
23
+
24
+ def as_json
25
+ {
26
+ subject: @subject.as_json,
27
+ verb: @verb.as_json,
28
+ object: @object.as_json
29
+ }
30
+ end
31
+
32
+ def to_s
33
+ "#{@subject}^#{@verb}=#{@object}"
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'gameplay_into_base64'
2
+ require_relative 'self'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class Actor
7
+ PATTERN = /(#{Self::PATTERN}|#{GameplayIntoBase64::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (Self.valid?(str) ? Self.instance : GameplayIntoBase64.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'boolean'
2
+ require_relative 'null'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class Ally
7
+ PATTERN = /(#{Boolean::PATTERN}|#{Null::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (Null.valid?(str) ? Null.instance : Boolean.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module Sashite
2
+ module GGN
3
+ class Area
4
+ PATTERN = /(all|furthest_rank|palace|furthest_one-third|nearest_two-thirds)/
5
+
6
+ def self.valid? str
7
+ !!str.match("^#{PATTERN}$")
8
+ end
9
+
10
+ def initialize str
11
+ raise ArgumentError unless self.class.valid? str
12
+
13
+ @value = str.to_sym
14
+ end
15
+
16
+ def as_json
17
+ @value
18
+ end
19
+
20
+ def to_s
21
+ @value.to_s
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'boolean'
2
+ require_relative 'null'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class Attacked
7
+ PATTERN = /(#{Boolean::PATTERN}|#{Null::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (Null.valid?(str) ? Null.instance : Boolean.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module Sashite
2
+ module GGN
3
+ class Boolean
4
+ PATTERN = /[ft]/
5
+
6
+ def self.valid? str
7
+ !!str.match("^#{PATTERN}$")
8
+ end
9
+
10
+ def initialize str
11
+ raise ArgumentError unless self.class.valid? str
12
+
13
+ @value = str.to_sym
14
+ end
15
+
16
+ def as_json
17
+ @value == :t
18
+ end
19
+
20
+ def to_s
21
+ @value.to_s
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'digit_excluding_zero'
2
+ require_relative 'zero'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class Digit
7
+ PATTERN = /(#{Zero::PATTERN}|#{DigitExcludingZero::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (Zero.valid?(str) ? Zero.instance : DigitExcludingZero.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module Sashite
2
+ module GGN
3
+ class DigitExcludingZero
4
+ PATTERN = /[1-9]/
5
+
6
+ def self.valid? str
7
+ !!str.match("^#{PATTERN}$")
8
+ end
9
+
10
+ def initialize str
11
+ raise ArgumentError unless self.class.valid? str
12
+
13
+ @value = str.to_i
14
+ end
15
+
16
+ def as_json
17
+ @value
18
+ end
19
+
20
+ def to_s
21
+ @value.to_s
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'integer'
2
+
3
+ module Sashite
4
+ module GGN
5
+ class Direction
6
+ PATTERN = /(#{Integer::PATTERN},)*#{Integer::PATTERN}/
7
+
8
+ def self.valid? str
9
+ !!str.match("^#{PATTERN}$")
10
+ end
11
+
12
+ def initialize str
13
+ raise ArgumentError unless self.class.valid? str
14
+
15
+ @integers = str.split(',').map { |i| Integer.new(i) }
16
+ end
17
+
18
+ def as_json
19
+ @integers.map &:as_json
20
+ end
21
+
22
+ def to_s
23
+ @integers.join ','
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ require 'sashite-cgh'
2
+ require_relative 'pattern'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class Gameplay
7
+ PATTERN = /#{Pattern::PATTERN}(\. #{Pattern::PATTERN})*\./
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$") && str.split('. ').sort.join('. ') == str
11
+ end
12
+
13
+ attr_reader :patterns
14
+
15
+ def initialize str
16
+ raise ArgumentError unless self.class.valid? str
17
+
18
+ @patterns = str[0..-2].split('. ').map { |pattern| Pattern.new pattern }
19
+ end
20
+
21
+ def as_json
22
+ @patterns.map &:as_json
23
+ end
24
+
25
+ def to_s
26
+ @patterns.map(&:to_s).join('. ') + '.'
27
+ end
28
+
29
+ def to_cgh
30
+ Sashite::CGH.parse to_s
31
+ end
32
+
33
+ def dimensions
34
+ first_pattern = @patterns.fetch 0
35
+ first_ability = first_pattern.abilities.fetch 0
36
+ first_ability.verb.dimensions
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ require 'base64'
2
+ require_relative 'gameplay'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class GameplayIntoBase64
7
+ PATTERN = /(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$") && Gameplay.valid?(Base64.strict_decode64(str))
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = Gameplay.new Base64.strict_decode64(str)
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ Base64.strict_encode64 @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'negative_integer'
2
+ require_relative 'unsigned_integer'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class Integer
7
+ PATTERN = /(#{NegativeInteger::PATTERN}|#{UnsignedInteger::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (NegativeInteger.valid?(str) ? NegativeInteger.new(str) : UnsignedInteger.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'boolean'
2
+ require_relative 'null'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class LastMovedActor
7
+ PATTERN = /(#{Boolean::PATTERN}|#{Null::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (Null.valid?(str) ? Null.instance : Boolean.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'null'
2
+ require_relative 'unsigned_integer_excluding_zero'
3
+
4
+ module Sashite
5
+ module GGN
6
+ class MaximumMagnitude
7
+ PATTERN = /(#{Null::PATTERN}|#{UnsignedIntegerExcludingZero::PATTERN})/
8
+
9
+ def self.valid? str
10
+ !!str.match("^#{PATTERN}$")
11
+ end
12
+
13
+ def initialize str
14
+ raise ArgumentError unless self.class.valid? str
15
+
16
+ @value = (Null.valid?(str) ? Null.instance : UnsignedIntegerExcludingZero.new(str))
17
+ end
18
+
19
+ def as_json
20
+ @value.as_json
21
+ end
22
+
23
+ def to_s
24
+ @value.to_s
25
+ end
26
+ end
27
+ end
28
+ end