deck_of_cards_handler 0.1.7 → 0.1.9

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
  SHA256:
3
- metadata.gz: d6a1a1dd5335b11ff724511d5d322b9d50f2d58dd3397b02eefdc9cef3f5a552
4
- data.tar.gz: 79619874720f88fc3828ba1562e9171c2ab0d9d6a955bae07e3bed0dd2681453
3
+ metadata.gz: d23ec5d3f1b6987a939dfa98561a8734766fa09b7f1b74d3130225a7df36b5dc
4
+ data.tar.gz: fb7a36ff97dc5080186bdcf318f15cc9595fe3c188506d22cc2545297db789fd
5
5
  SHA512:
6
- metadata.gz: 775cde0e2b4948b4052c7e1abb21a377212821016f390942c5cae7a739195f2efcd74b7b7b64f2bd9ced44e0a637fc05f5797faa282850bd1bdf8187854d515e
7
- data.tar.gz: b40aef85c522e65bcd590ed920c9113d16e4a64750d8a6b534fa72be150e01743d46631d3ec8eff434275089d73b2ba1820975dcef958e81a18485e45b6b3336
6
+ metadata.gz: 9d3130deeeb5baa744e0f94b7896692d5ed2d322ccdd11c6398b9f19a35c1f0923a699c17862ddf2051e97236967db5073a3cafe029818dad06ffe674e94406e
7
+ data.tar.gz: 8433c0d0036299acfcf593b46ef5f17610c49d067a4243d7e617a9d9adc6d410853e9710759a06fa509b98fb02d5cc65ad4e21007c5447573367a6a7b838d764
data/.rubocop.yml CHANGED
@@ -1,5 +1,12 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 3.1
3
+ NewCops: enable
4
+
5
+ Gemspec/DevelopmentDependencies:
6
+ Enabled: false
7
+
8
+ Gemspec/RequireMFA:
9
+ Enabled: false
3
10
 
4
11
  Metrics/AbcSize:
5
12
  Enabled: false
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/deck_of_cards_handler.svg)](https://badge.fury.io/rb/deck_of_cards_handler) [![Test suite](https://github.com/simonbernard2/deck_of_cards/actions/workflows/ruby.yml/badge.svg)](https://github.com/simonbernard2/deck_of_cards/actions/workflows/ruby.yml)
2
+
1
3
  # Deck of cards handler
2
4
 
3
5
  A ruby gem for simulating real-world deck handling: shuffle, cut, deal, cull
@@ -40,6 +40,46 @@ class Card
40
40
  Card.black_suits.include?(suit)
41
41
  end
42
42
 
43
+ sig { returns(T::Boolean) }
44
+ def clubs?
45
+ suit == "C"
46
+ end
47
+
48
+ sig { returns(T::Boolean) }
49
+ def hearts?
50
+ suit == "H"
51
+ end
52
+
53
+ sig { returns(T::Boolean) }
54
+ def spades?
55
+ suit == "S"
56
+ end
57
+
58
+ sig { returns(T::Boolean) }
59
+ def diamonds?
60
+ suit == "D"
61
+ end
62
+
63
+ sig { returns(T::Boolean) }
64
+ def even?
65
+ Card.even_values.include?(value)
66
+ end
67
+
68
+ sig { returns(T::Boolean) }
69
+ def odd?
70
+ Card.odd_values.include?(value)
71
+ end
72
+
73
+ sig { returns(T::Boolean) }
74
+ def spot?
75
+ Card.spot_values.include?(value)
76
+ end
77
+
78
+ sig { returns(T::Boolean) }
79
+ def court?
80
+ Card.court_values.include?(value)
81
+ end
82
+
43
83
  sig { returns(String) }
44
84
  def to_s
45
85
  "#{value} of #{suit}"
@@ -68,6 +108,7 @@ class Card
68
108
 
69
109
  class << self
70
110
  extend T::Sig
111
+
71
112
  sig { returns(T::Array[String]) }
72
113
  def suits
73
114
  %w[C H S D].freeze
@@ -87,5 +128,25 @@ class Card
87
128
  def values
88
129
  %w[A 2 3 4 5 6 7 8 9 10 J Q K].freeze
89
130
  end
131
+
132
+ sig { returns(T::Array[String]) }
133
+ def odd_values
134
+ %w[A 3 5 7 9 J K].freeze
135
+ end
136
+
137
+ sig { returns(T::Array[String]) }
138
+ def even_values
139
+ %w[2 4 6 8 10 Q].freeze
140
+ end
141
+
142
+ sig { returns(T::Array[String]) }
143
+ def court_values
144
+ %w[J Q K].freeze
145
+ end
146
+
147
+ sig { returns(T::Array[String]) }
148
+ def spot_values
149
+ %w[A 2 3 4 5 6 7 8 9 10].freeze
150
+ end
90
151
  end
91
152
  end
@@ -5,6 +5,7 @@
5
5
  module Cuts
6
6
  extend T::Helpers
7
7
  extend T::Sig
8
+
8
9
  requires_ancestor { Packet }
9
10
 
10
11
  sig { params(number: Integer).returns(Packet) }
@@ -21,13 +22,43 @@ module Cuts
21
22
  self.cards = [cards, top_half.cards].flatten
22
23
  end
23
24
 
25
+ sig { params(piles: T::Array[Packet]).void }
26
+ def reassemble_left_to_right_on_top(piles)
27
+ assembled = reassemble_cards(piles)
28
+ self.cards = assembled + cards
29
+ end
30
+
31
+ sig { params(piles: T::Array[Packet]).void }
32
+ def reassemble_left_to_right_on_bottom(piles)
33
+ assembled = reassemble_cards(piles)
34
+ self.cards += assembled
35
+ end
36
+
37
+ sig { params(piles: T::Array[Packet]).void }
38
+ def reassemble_right_to_left_on_top(piles)
39
+ assembled = reassemble_cards(piles, reverse: true)
40
+ self.cards = assembled + cards
41
+ end
42
+
43
+ sig { params(piles: T::Array[Packet]).void }
44
+ def reassemble_right_to_left_on_bottom(piles)
45
+ assembled = reassemble_cards(piles, reverse: true)
46
+ self.cards += assembled
47
+ end
48
+
24
49
  private
25
50
 
51
+ sig { params(piles: T::Array[Packet], reverse: T::Boolean).returns(T::Array[Card]) }
52
+ def reassemble_cards(piles, reverse: false)
53
+ piles.reverse! if reverse
54
+ piles.reduce([]) { |acc, pile| acc << pile.cut(number: pile.size).cards }.flatten
55
+ end
56
+
26
57
  sig { params(number: Integer).returns(T::Boolean) }
27
58
  def invalid_number_to_cut_to?(number)
28
59
  return true if number.negative?
29
60
  return true if number.zero?
30
- return true if number >= cards.size
61
+ return true if number > cards.size
31
62
 
32
63
  false
33
64
  end
@@ -4,6 +4,7 @@
4
4
  # This represents a packet of cards
5
5
  class Packet
6
6
  extend T::Sig
7
+
7
8
  require "deck_of_cards_handler/packet/shuffles"
8
9
  require "deck_of_cards_handler/packet/deals"
9
10
  require "deck_of_cards_handler/packet/cuts"
@@ -14,9 +15,7 @@ class Packet
14
15
  attr_accessor :cards
15
16
 
16
17
  sig { params(cards: T::Array[Card]).void }
17
- def initialize(cards:)
18
- raise ArgumentError if cards.empty?
19
-
18
+ def initialize(cards: [])
20
19
  @cards = T.let(cards, T::Array[Card])
21
20
  end
22
21
 
@@ -105,4 +104,23 @@ class Packet
105
104
  def to_s
106
105
  cards.map(&:to_s)
107
106
  end
107
+
108
+ sig do
109
+ returns(
110
+ T.any(
111
+ PokerHands::HighCard,
112
+ PokerHands::OnePair,
113
+ PokerHands::TwoPairs,
114
+ PokerHands::ThreeOfAKind,
115
+ PokerHands::Straight,
116
+ PokerHands::Flush,
117
+ PokerHands::FullHouse,
118
+ PokerHands::FourOfAKind,
119
+ PokerHands::StraightFlush
120
+ )
121
+ )
122
+ end
123
+ def to_poker_hand
124
+ PokerHands::PokerHand.create(cards:)
125
+ end
108
126
  end
@@ -4,6 +4,7 @@
4
4
  module Shuffles
5
5
  class << self
6
6
  extend T::Sig
7
+
7
8
  sig { params(left_half: Packet, right_half: Packet).returns(T::Array[Card]) }
8
9
  def riffle_shuffle(left_half:, right_half:)
9
10
  shuffled_cards = []
@@ -7,6 +7,7 @@ module PokerHands
7
7
  extend T::Sig
8
8
  extend T::Helpers
9
9
  include Comparable
10
+
10
11
  abstract!
11
12
 
12
13
  sig { returns(T::Array[Card]) }
@@ -29,6 +30,7 @@ module PokerHands
29
30
 
30
31
  class << self
31
32
  extend T::Sig
33
+
32
34
  sig { params(string: String).returns(PokerHand) }
33
35
  def build_from_string(string:)
34
36
  cards = Packet.build_from_string(string:).cards
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DeckOfCardsHandler
4
- VERSION = "0.1.7"
4
+ VERSION = "0.1.9"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deck_of_cards_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Bernard
@@ -52,7 +52,7 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.17.7
54
54
  description: |2
55
- It provides all the moves one could do with a deck of cards.
55
+ It provides all the moves one could do with a deck of playing cards.
56
56
  Such as shuffling, cutting, dealing, culling, etc.
57
57
  email:
58
58
  - simonbernard@gmail.com
@@ -158,5 +158,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  requirements: []
159
159
  rubygems_version: 3.6.9
160
160
  specification_version: 4
161
- summary: A gem that simulates the handling of a deck of cards
161
+ summary: A gem that simulates the handling of a deck of playing cards
162
162
  test_files: []