playing_cards 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ gem 'rspec'
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 hollanddd
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # PlayingCards
2
+
3
+ Playing Cards. Not much else to see here.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'playing_cards'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install playing_cards
18
+
19
+ ## Usage
20
+
21
+ deck_of_cards = Deck.standard
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,76 @@
1
+ class Card
2
+ attr_accessor :rank, :suit
3
+
4
+ def initialize rank, suit
5
+ @rank = rank.to_s.capitalize
6
+ @suit = suit.downcase.sub(/s$/,'').capitalize
7
+ end
8
+
9
+ def == another_card
10
+ rank == another_card.rank && suit == another_card.suit
11
+ end
12
+
13
+ def > another_card
14
+ numberify > another_card.numberify
15
+ end
16
+
17
+ def < another_card
18
+ numberify < another_card.numberify
19
+ end
20
+
21
+ def equals? another_card
22
+ numberify == another_card.numberify
23
+ end
24
+
25
+ def numberify
26
+ convert = {
27
+ 'Two' => 2,
28
+ 'Three' => 3,
29
+ 'Four' => 4,
30
+ 'Five' => 5,
31
+ 'Six' => 6,
32
+ 'Seven' => 7,
33
+ 'Eight' => 8,
34
+ 'Nine' => 9,
35
+ 'Ten' => 10,
36
+ 'Jack' => 11,
37
+ 'Queen' => 12,
38
+ 'King' => 13,
39
+ 'Ace' => 14,
40
+ '2' => 2,
41
+ '3' => 3,
42
+ '4' => 4,
43
+ '5' => 5,
44
+ '6' => 6,
45
+ '7' => 7,
46
+ '8' => 8,
47
+ '9' => 9,
48
+ '10' => 10
49
+ }
50
+ convert[rank]
51
+ end
52
+
53
+ def name
54
+ "#{ rank } of #{ suit }s"
55
+ end
56
+
57
+ def inspect
58
+ "<Card: \"#{ name }\">"
59
+ end
60
+
61
+ alias to_s name
62
+
63
+ def self.parse name
64
+ name = name.to_s.sub(/^the()?/i, '').strip
65
+
66
+ if name =~ /^(\w+) of (\w+)$/i
67
+ Card.new $1, $2
68
+ elsif name =~ /^(\w+)of(\w+)$/i
69
+ Card.new $1, $2
70
+ end
71
+ end
72
+
73
+ class << self
74
+ alias [] parse
75
+ end
76
+ end
@@ -0,0 +1,11 @@
1
+ module CardConstant
2
+ def const_missing name
3
+ if card = Card.parse(name)
4
+ return card
5
+ else
6
+ Card
7
+ end
8
+ end
9
+ end
10
+
11
+ Object.send :extend, CardConstant
@@ -0,0 +1,51 @@
1
+ def Deck *cards
2
+ Deck[*cards]
3
+ end
4
+
5
+ class Deck < Array
6
+
7
+ module ArrayExtensions
8
+ def to_deck
9
+ Deck.new self
10
+ end
11
+ end
12
+
13
+ def self.standard
14
+ deck = Deck.new
15
+ %w{club diamond heart spade}.each do |suit|
16
+ %w{2 3 4 5 6 7 8 9 10 jack queen king ace}.each do |rank|
17
+ deck << CardWeb.new(rank, suit)
18
+ end
19
+ end
20
+ deck
21
+ end
22
+
23
+ def deal_from_top num = 1
24
+ _draw num, :shift
25
+ end
26
+
27
+ alias draw deal_from_top
28
+ alias burn deal_from_top
29
+
30
+ def deal_from_bottom num = 1
31
+ _draw num, :pop
32
+ end
33
+
34
+ private
35
+
36
+ def _draw num, operation
37
+ if num.is_a? Card
38
+ delete num
39
+ else
40
+ if num == 1
41
+ send(operation)
42
+ else
43
+ cards = []
44
+ num.times { cards << send(operation) }
45
+ cards
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ Array.send :include, Deck::ArrayExtensions
@@ -0,0 +1,3 @@
1
+ module PlayingCards
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+ require 'playing_cards/version'
3
+ require 'playing_cards/card'
4
+ require 'playing_cards/deck'
5
+ require 'playing_cards/card_constant'
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'playing_cards/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "playing_cards"
8
+ gem.version = PlayingCards::VERSION
9
+ gem.authors = ["hollanddd"]
10
+ gem.email = ["me@darrenholland.com"]
11
+ gem.description = %q{Standard deck of 52. No Jokers}
12
+ gem.summary = %q{Standard deck of 52. No Jokers}
13
+ gem.homepage = "https://github.com/hollanddd/playing_cards"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
data/spec/card_spec.rb ADDED
@@ -0,0 +1,81 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Card do
4
+
5
+ it 'has a rank and a suit' do
6
+ card = Card[TheAceOfHearts]
7
+ card.rank.should eq 'Ace'
8
+ card.suit.should eq 'Heart'
9
+ Card.new(8, 'heart').rank.should eq '8'
10
+ end
11
+
12
+ it 'can initailize cards with a plural suit' do
13
+ card = Card.new 3, 'Hearts'
14
+ card.suit.should eq 'Heart'
15
+ end
16
+
17
+ it 'can return a card given a name' do
18
+ card = Card.parse('3 of hearts')
19
+ card.rank.should eq '3'
20
+ card.suit.should eq 'Heart'
21
+ end
22
+
23
+ it 'aliases [] to parse' do
24
+ card = Card['3 of hearts']
25
+ card.rank.should eq '3'
26
+ card.suit.should eq 'Heart'
27
+ end
28
+
29
+ it 'can parse a card name with or without "the"' do
30
+ two_hearts = Card['2 of Hearts']
31
+ two_hearts.rank.should eq '2'
32
+
33
+ three_hearts = Card['the3ofHearts']
34
+ three_hearts.rank.should eq '3'
35
+
36
+ four_hearts = Card['the 4 of hearts']
37
+ four_hearts.rank.should eq '4'
38
+ end
39
+
40
+ it 'can parse itself regardless of the casing of the suit' do
41
+ card = Card.new 2, 'spades'
42
+ card.rank.should eq '2'
43
+ card.suit.should eq 'Spade'
44
+
45
+ another_card = Card.new 3, 'hEaRtS'
46
+ another_card.rank.should eq '3'
47
+ another_card.suit.should eq 'Heart'
48
+ end
49
+
50
+ it 'can parse itself from a constant' do
51
+ card = The2ofHearts
52
+ card.rank.should eq '2'
53
+ card.suit.should eq 'Heart'
54
+ end
55
+
56
+ it 'can compare cards' do
57
+ card = TheAceOfHearts
58
+ the_other_card = Card.new('ace', 'hearts')
59
+ card.object_id.should_not eq the_other_card.object_id
60
+ card.should eq the_other_card
61
+
62
+ the_other_card = TheKingOfHearts
63
+ card > the_other_card
64
+ card < the_other_card
65
+ end
66
+
67
+ context 'describes itself' do
68
+
69
+ it 'with a name' do
70
+ The3OfHearts.name.should eq '3 of Hearts'
71
+ end
72
+
73
+ it 'with .to_s alias' do
74
+ The3OfHearts.to_s.should eq '3 of Hearts'
75
+ end
76
+
77
+ it 'by inspecting itself' do
78
+ The3OfHearts.inspect.should eq '<Card: "3 of Hearts">'
79
+ end
80
+ end
81
+ end
data/spec/deck_spec.rb ADDED
@@ -0,0 +1,123 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Deck do
4
+
5
+ it 'can get an empty deck' do
6
+ deck = Deck.new
7
+ deck.length.should be 0
8
+ deck.should be_empty
9
+ end
10
+
11
+ it 'can get a standard deck of 52 cards' do
12
+ deck = Deck.standard
13
+ deck.length.should be 52
14
+ end
15
+
16
+ it 'can compare decks' do
17
+ deck = Deck.new
18
+ the_other_deck = Deck.new
19
+ deck.should == the_other_deck
20
+
21
+ deck << The2OfHearts
22
+ deck.equal?(the_other_deck).should eq false
23
+
24
+ the_other_deck << The2OfHearts
25
+ deck.equal?(the_other_deck).should eq false
26
+ end
27
+
28
+ it 'can shuffle a deck' do
29
+ deck = Deck.standard
30
+ shuffled_deck = deck.shuffle
31
+
32
+ deck.each do |card|
33
+ shuffled_deck.should include(card)
34
+ end
35
+
36
+ shuffled_deck.should_not == deck
37
+ end
38
+
39
+ it 'can shuffle! a deck' do
40
+ deck = Deck.standard
41
+ deck.shuffle!
42
+
43
+ deck.should_not == Deck.standard
44
+ end
45
+
46
+ it 'can draw a card' do
47
+ deck = Deck.standard
48
+ deck.length.should be 52
49
+
50
+ card = deck.draw
51
+ card.should eq The2OfClubs
52
+ deck.length.should be 51
53
+ end
54
+
55
+ it 'can convert cards to_deck' do
56
+ deck = Deck.standard
57
+ hand = deck.draw(7).to_deck
58
+ hand.class.should be Deck
59
+ end
60
+
61
+ context 'can deal' do
62
+
63
+ it 'cards from the top' do
64
+ deck = Deck.standard
65
+ deck.length.should be 52
66
+
67
+ deck.deal_from_top.should eq The2OfClubs
68
+ deck.length.should be 51
69
+ end
70
+
71
+ it 'cards from the bottom' do
72
+ deck = Deck.standard
73
+ deck.deal_from_bottom.should eq TheAceOfSpades
74
+ deck.length.should be 51
75
+ end
76
+
77
+ it 'a given number of cards' do
78
+ deck = Deck.standard
79
+ cards = deck.draw 2
80
+
81
+ deck.length.should be 50
82
+ cards.length.should be 2
83
+
84
+ cards[0].should eq The2OfClubs
85
+ cards[1].should eq The3OfClubs
86
+
87
+ cards = deck.deal_from_bottom 2
88
+
89
+ deck.length.should be 48
90
+ cards.length.should be 2
91
+
92
+ cards[0].should eq TheAceOfSpades
93
+ cards[1].should eq TheKingOfSpades
94
+ end
95
+
96
+ it 'a card by name' do
97
+ deck = Deck.standard
98
+
99
+ card = deck.draw The3OfClubs
100
+ deck.length.should be 51
101
+ deck[0].should eq The2OfClubs
102
+ deck[1].should eq The4OfClubs
103
+
104
+ deck.draw(The3OfClubs).should be_nil
105
+
106
+ card = deck.deal_from_bottom TheKingOfSpades
107
+ card.should eq TheKingOfSpades
108
+ deck.length.should be 50
109
+ deck[49].should eq TheAceOfSpades
110
+ deck[48].should eq TheQueenOfSpades
111
+
112
+ deck.deal_from_bottom(TheKingOfSpades).should be_nil
113
+ end
114
+
115
+ it 'a burn card' do
116
+ deck = Deck.standard
117
+ deck.length.should be 52
118
+ deck.burn
119
+ deck.length.should be 51
120
+ deck[0].should eq The3OfClubs
121
+ end
122
+ end
123
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/../lib/playing_cards'
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: playing_cards
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - hollanddd
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-20 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Standard deck of 52. No Jokers
15
+ email:
16
+ - me@darrenholland.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - LICENSE.txt
24
+ - README.md
25
+ - Rakefile
26
+ - lib/playing_cards.rb
27
+ - lib/playing_cards/card.rb
28
+ - lib/playing_cards/card_constant.rb
29
+ - lib/playing_cards/deck.rb
30
+ - lib/playing_cards/version.rb
31
+ - playing_cards.gemspec
32
+ - spec/card_spec.rb
33
+ - spec/deck_spec.rb
34
+ - spec/spec_helper.rb
35
+ homepage: https://github.com/hollanddd/playing_cards
36
+ licenses: []
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 1.8.24
56
+ signing_key:
57
+ specification_version: 3
58
+ summary: Standard deck of 52. No Jokers
59
+ test_files:
60
+ - spec/card_spec.rb
61
+ - spec/deck_spec.rb
62
+ - spec/spec_helper.rb