oscar-movies 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0a06ccb41fc1dd3b43bb95bcecccc1913101c978
4
+ data.tar.gz: ff0fdf4e5ed68ec8fe36cfe217a128995580824d
5
+ SHA512:
6
+ metadata.gz: 3054a4214ab1af1e1c15d8c4c5c3b7e0dfb1159d16b95e92d99067732d6e1547cacf6c0bd88dc35801a4cc526a889467156da815fa3de2937ac0a11544ccf231
7
+ data.tar.gz: b31510cfe51650a3fd6b69ff3ca277c4cb54e48fa1c24e6cd83197ce2e8489e1fb36ca9c5b0cbee7ec84f43dee0b4d3fb3c25081e95835ab1fe5e2e673edcd40
data/LICENSE ADDED
@@ -0,0 +1,4 @@
1
+ Copyright (c) 2014 Ahmed Nadar
2
+
3
+ Permission is hereby granted and free of charge.
4
+ Happy Coding :)
data/README ADDED
@@ -0,0 +1,3 @@
1
+ This is an application used to cover lost of aras in Ruby.
2
+
3
+ You can contact me here http://twitter.com/ahmedandar.
data/bin/movies.csv ADDED
@@ -0,0 +1,5 @@
1
+ Gravity,20
2
+ Godfather,15
3
+ Frozen,10
4
+ Batman,7
5
+ Muppets,9
data/bin/oscar ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/oscar/playlist"
4
+
5
+ playlist = Oscar::Playlist.new("Kermit")
6
+ # stor command line argument in ARGF
7
+ default_movie_file = File.join(File.dirname(__FILE__), 'movies.csv')
8
+ playlist.load(ARGV.shift || default_movie_file)
9
+
10
+ loop do
11
+ puts "\nHow many viewings you want to see? ('quit' to exit)"
12
+ answer = gets.chomp.downcase
13
+ case answer
14
+ when /^\d+$/
15
+ playlist.play(answer.to_i)
16
+ when 'quit', 'exit'
17
+ playlist.print_stats
18
+ break
19
+ else
20
+ puts "Please enter a number or 'quit'"
21
+ end
22
+ end
23
+ playlist.save
24
+
@@ -0,0 +1,63 @@
1
+ require_relative "snack_bar"
2
+ require_relative "rankable"
3
+
4
+ module Oscar
5
+ class Movie
6
+ include Rankable
7
+
8
+ attr_accessor :title, :rank
9
+
10
+ def initialize(title, rank=0)
11
+ @title = title.capitalize
12
+ @rank = rank
13
+ @snack_carbs = Hash.new(0)
14
+ end
15
+
16
+ def each_snack
17
+ @snack_carbs.each do |name, carbs|
18
+ snack = Snack.new(name, carbs)
19
+ yield snack
20
+ end
21
+ end
22
+
23
+ def carbs_consumed
24
+ @snack_carbs.values.reduce(0, :+)
25
+ end
26
+
27
+ def self.from_csv(line)
28
+ title, rank = line.split(',')
29
+ Movie.new(title, Integer(rank))
30
+ end
31
+
32
+ def to_csv
33
+ "#{@title}, #{@rank}"
34
+ end
35
+
36
+ def ate_snack(snack)
37
+ @snack_carbs[snack.name] += snack.carbs
38
+ puts "#{@title} let to (#{snack.carbs}) #{snack.name} carbs being consumed"
39
+ puts "#{@title}'s snack: #{@snack_carbs}"
40
+ end
41
+
42
+ def to_s # meta programming
43
+ "#{@title} has a rank of #{@rank} (#{status})"
44
+ end
45
+ end
46
+
47
+ if __FILE__ == $0
48
+ movie1 = Movie.new("gravity", 20)
49
+ puts movie1.thumbs_up
50
+ puts movie1.title
51
+ puts movie1
52
+
53
+ movie2 = Movie.new("wall street", 3)
54
+ puts movie2.thumbs_down
55
+ puts movie2.rank
56
+ puts movie2
57
+
58
+ movie3 = Movie.new("frozen", 3)
59
+ puts movie3.thumbs_up
60
+ puts movie3.rank
61
+ puts movie3
62
+ end
63
+ end
@@ -0,0 +1,29 @@
1
+ require_relative "movie"
2
+
3
+ module Oscar
4
+ class Movie3D < Movie
5
+
6
+ def initialize(title, rank, wow_factor)
7
+ super(title, rank)
8
+ @wow_factor = wow_factor
9
+ end
10
+
11
+ def thumbs_up
12
+ @wow_factor.times {super}
13
+ end
14
+
15
+ def show_effect
16
+ puts "Wow!" * @wow_factor
17
+ end
18
+ end
19
+
20
+ if __FILE__ == $0
21
+ movie3d = Movie3D.new("gravity", 5, 20)
22
+ puts "3D movie: #{movie3d.title}"
23
+ puts "Initial rank: #{movie3d.rank}"
24
+ movie3d.thumbs_up
25
+ puts "Rank after thumbs up: #{movie3d.rank}"
26
+ puts movie3d
27
+ movie3d.show_effect
28
+ end
29
+ end
@@ -0,0 +1,83 @@
1
+ require_relative "movie"
2
+ require_relative "reviewer"
3
+ require_relative "snack_bar"
4
+
5
+ module Oscar
6
+ class Playlist
7
+ attr_reader :name
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ @movies = [ ]
12
+ end
13
+
14
+ def load(from_file)
15
+ File.readlines(from_file).each do |line|
16
+ add_movie(Movie.from_csv(line))
17
+ end
18
+ end
19
+
20
+ def save(to_file="movie_rankings.csv" )
21
+ File.open(to_file, "w") do |file| # w mode for writing
22
+ file.puts @movies.sort.map { |movie| movie.to_csv }
23
+ # @movies.sort.each do |movie|
24
+ # file.puts movie.to_csv
25
+ # end
26
+ end
27
+ end
28
+
29
+ def add_movie(movie)
30
+ @movies << movie
31
+ end
32
+
33
+ def play(viewings)
34
+ puts "\n*** #{@name}'s playlist:"
35
+ puts @movies.sort
36
+
37
+ snacks = SnackBar::SNACKS
38
+ puts "\nThere are #{snacks.size} snacks available in the snack bar."
39
+
40
+ snacks.each do |snack|
41
+ puts "#{snack.name.capitalize} has (#{snack.carbs}) carbs."
42
+ end
43
+
44
+ 1.upto(viewings) do |count|
45
+ puts "\nViewing #{count}:"
46
+ @movies.each do |movie|
47
+ Reviewer.review(movie)
48
+
49
+ snack = SnackBar.random
50
+ movie.ate_snack(snack)
51
+ puts movie
52
+ end
53
+ end
54
+ end
55
+
56
+ def total_carbs_consumed
57
+ @movies.reduce(0) do |sum, movie|
58
+ sum + movie.carbs_consumed
59
+ end
60
+ end
61
+
62
+ def print_stats
63
+ puts "\n#{@name}'s Stats:"
64
+
65
+ winners, losers = @movies.partition { |movie| movie.winner? }
66
+
67
+ puts "\nWinners:"
68
+ puts winners.sort
69
+
70
+ puts "\nLosers:"
71
+ puts losers.sort
72
+
73
+ puts "#{total_carbs_consumed} total carbs consumed"
74
+ @movies.sort.each do |movie|
75
+ puts "\n#{movie.title}'s snack totals:"
76
+ movie.each_snack do |snack|
77
+ puts "#{snack.carbs} totla #{snack.name.capitalize}"
78
+ end
79
+ puts "#{movie.carbs_consumed} grand total carbs."
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,23 @@
1
+ module Oscar
2
+ module Rankable
3
+ def thumbs_up
4
+ self.rank += 1
5
+ end
6
+
7
+ def thumbs_down
8
+ self.rank -= 1
9
+ end
10
+
11
+ def winner?
12
+ self.rank >= 20
13
+ end
14
+
15
+ def status
16
+ winner? ? "Winner!" : "Loser!"
17
+ end
18
+
19
+ def <=>(other)
20
+ other.rank <=> self.rank
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module Oscar
2
+ module Reviewer
3
+ def self.roll_die
4
+ rand(1..20)
5
+ end
6
+
7
+ def self.review(movie)
8
+ case roll_die
9
+ when 1..9
10
+ movie.thumbs_down
11
+ puts "#{movie.title} got a thumbs down."
12
+ when 10..17
13
+ puts "#{movie.title} was skipped."
14
+ else
15
+ movie.thumbs_up
16
+ puts "#{movie.title} got a thumbs up."
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ Snack = Struct.new(:name, :carbs)
2
+
3
+ module Oscar
4
+ module SnackBar
5
+ SNACKS = [
6
+ Snack.new(:popcorn, 10),
7
+ Snack.new(:juice, 20),
8
+ Snack.new(:candy, 30),
9
+ Snack.new(:pretzel, 40),
10
+ Snack.new(:nachos, 50)
11
+ ]
12
+
13
+ def self.random
14
+ SNACKS.sample
15
+ end
16
+ end
17
+ if __FILE__ == $0
18
+ puts SnackBar::SNACKS
19
+ puts SnackBar.random
20
+ end
21
+ end
data/lib/oscar/song.rb ADDED
@@ -0,0 +1,26 @@
1
+ require_relative "rankable"
2
+
3
+ module Oscar
4
+ class Song
5
+ include Rankable
6
+
7
+ attr_accessor :title, :rank
8
+
9
+ def initialize(title, rank)
10
+ @title = title
11
+ @rank = rank
12
+ end
13
+
14
+ def to_s
15
+ "#{@title} has a rank of #{@rank} (#{status}"
16
+ end
17
+ end
18
+
19
+ if __FILE__ == $0
20
+ song.Song.new("Mamamia", 30)
21
+ song.thumbs_down
22
+ puts song
23
+ song.thumbs_up
24
+ puts song
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ require "oscar/movie3d"
2
+
3
+ module Oscar
4
+ describe "Movie3D" do
5
+ let(:initial_rank) { 20 }
6
+ let(:wow_factor) { 5 }
7
+ let(:movie) { Movie3D.new("hobbit", initial_rank, wow_factor) }
8
+
9
+ it "has a title" do
10
+ expect(movie.title).to eql("Hobbit")
11
+ end
12
+
13
+ it "has a rank" do
14
+ expect(movie.rank).to eql(20)
15
+ end
16
+
17
+ xit "has a wow factor" do
18
+ expect(movie.wow_factor).to eql(5)
19
+ end
20
+
21
+ it "increases rank by 1 times the wow factor when given a thumbs up" do
22
+ movie.thumbs_up
23
+ expect(movie.rank).to eql(initial_rank + (1 * wow_factor))
24
+ end
25
+
26
+ it "decreases rank by 1 when given a thumbs down" do
27
+ movie.thumbs_down
28
+ expect(movie.rank).to eql(initial_rank - 1)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,102 @@
1
+ require "oscar/movie"
2
+
3
+ module Oscar
4
+ describe Movie do
5
+ let(:initial_rank) { 20 }
6
+ let(:movie) { Movie.new("gravity", initial_rank) }
7
+
8
+ it "has a capitalized title" do
9
+ # movie.title.should == "Gravity"
10
+ expect(movie.title).to eql("Gravity")
11
+ end
12
+
13
+ it "GET #rank" do
14
+ # movie.rank.should == 20
15
+ expect(movie.rank).to eql(initial_rank)
16
+ end
17
+
18
+ it "has a description" do
19
+ expect(movie.to_s).to eql("Gravity has a rank of 20 (Winner!)")
20
+ end
21
+
22
+ it "GET #thumbs_up" do
23
+ expect(movie.thumbs_up).to eql(initial_rank+1)
24
+ end
25
+
26
+ it "decreases rank by 1 when given a thumbs down" do
27
+ expect(movie.thumbs_down).to eql(initial_rank-1)
28
+ end
29
+
30
+ context 'with a default rank' do
31
+ let(:movie) { Movie.new("godfather") }
32
+ it "has a value of 0" do
33
+ expect(movie.rank).to eql(0)
34
+ end
35
+ end
36
+
37
+ context 'with a rank of 20 or more' do
38
+ it "is a winner" do
39
+ expect(movie.winner?).to eql(true)
40
+ end
41
+
42
+ it "has a winner status" do
43
+ expect(movie.status).to eql("Winner!")
44
+ end
45
+ end
46
+
47
+ context 'with a rank of less than 20' do
48
+ let(:movie) { Movie.new("gravity", 19) }
49
+ it "is a loser" do
50
+ expect(movie.winner?).to eql(false)
51
+ end
52
+
53
+ it "has a loser status" do
54
+ expect(movie.status).to eql("Loser!")
55
+ end
56
+ end
57
+
58
+ it "is sorted by decreasing rank" do
59
+ movie1 = Movie.new("gravity", 100)
60
+ movie2 = Movie.new("madacascar", 200)
61
+ movie3 = Movie.new("godfather", 300)
62
+
63
+ movies = [movie1, movie2, movie3]
64
+ expect(movies.sort).to eql([movie3, movie2, movie1])
65
+ end
66
+
67
+ it "computes carbs consumed as the sum of all snack carbs consumed" do
68
+ expect(movie.carbs_consumed).to eql(0)
69
+
70
+ movie.ate_snack(Snack.new(:popcorn, 10))
71
+ expect(movie.carbs_consumed).to eql(10)
72
+
73
+ movie.ate_snack(Snack.new(:popcorn, 10))
74
+ expect(movie.carbs_consumed).to eql(20)
75
+
76
+ movie.ate_snack(Snack.new(:juice, 5))
77
+ expect(movie.carbs_consumed).to eql(25)
78
+ end
79
+
80
+ it "yields each snack" do
81
+ movie.ate_snack(Snack.new(:popcorn, 10))
82
+ movie.ate_snack(Snack.new(:popcorn, 10))
83
+ movie.ate_snack(Snack.new(:juice, 5))
84
+
85
+ yielded = []
86
+ movie.each_snack do |snack|
87
+ yielded << snack
88
+ end
89
+ expect(yielded).to eql([Snack.new(:popcorn, 20), Snack.new(:juice, 5)])
90
+ end
91
+
92
+ it "can be instantiated from a CSV file" do
93
+ movie = Movie.from_csv("gravity,10")
94
+ expect(movie.title).to eql("Gravity")
95
+ expect(movie.rank).to eql(10)
96
+ end
97
+
98
+ it "can be serialized to a CSV file" do
99
+ expect(movie.to_csv).to eql("Gravity, 20")
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,65 @@
1
+ require "oscar/playlist"
2
+
3
+ module Oscar
4
+ describe Playlist do
5
+ let(:playlist) { Playlist.new("Oscar") }
6
+
7
+ it "has a name" do
8
+ expect(playlist.name).to eql("Oscar")
9
+ end
10
+
11
+ context 'being played with one movie' do
12
+ let(:initial_rank) { 20 }
13
+ let(:movie) { Movie.new("gravity", initial_rank) }
14
+ before {playlist.add_movie(movie)}
15
+
16
+ it "gives the movie thumbs up if a high number is rolled" do
17
+ Reviewer.stub(:roll_die).and_return(20)
18
+ playlist.play(2)
19
+ expect(movie.rank).to eql(initial_rank+2)
20
+
21
+ Reviewer.stub(:roll_die).and_return(19)
22
+ playlist.play(2)
23
+ expect(movie.rank).to eql(initial_rank+4)
24
+ end
25
+
26
+ it "skips the movie if a medium number is rolled" do
27
+ Reviewer.stub(:roll_die).and_return(10)
28
+ playlist.play(2)
29
+ expect(movie.rank).to eql(initial_rank)
30
+
31
+ Reviewer.stub(:roll_die).and_return(13)
32
+ playlist.play(2)
33
+ expect(movie.rank).to eql(initial_rank)
34
+ end
35
+
36
+ it "gives the movie thumbs down if a lower number is rolled" do
37
+ Reviewer.stub(:roll_die).and_return(2)
38
+ playlist.play(2)
39
+ expect(movie.rank).to eql(initial_rank-2)
40
+
41
+ Reviewer.stub(:roll_die).and_return(4)
42
+ playlist.play(2)
43
+ expect(movie.rank).to eql(initial_rank-4)
44
+ end
45
+ end
46
+
47
+ context 'with movies that have casued snacks to be consumed' do
48
+ before do
49
+ movie1 = Movie.new("gravity")
50
+ movie2 = Movie.new("godfather")
51
+
52
+ playlist.add_movie(movie1)
53
+ playlist.add_movie(movie2)
54
+
55
+ movie1.ate_snack(Snack.new(:popcorn, 10))
56
+ movie1.ate_snack(Snack.new(:popcorn, 10))
57
+ movie2.ate_snack(Snack.new(:juice, 5))
58
+ end
59
+
60
+ it "computes total carbs consumed as the sum of all mocies carbs consumed" do
61
+ expect(playlist.total_carbs_consumed).to eql(25)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,25 @@
1
+ require "oscar/snack_bar"
2
+
3
+ module Oscar
4
+ describe Snack do
5
+ let(:snack) { Snack.new(:popcorn, 10) }
6
+
7
+ it "has a name attribute" do
8
+ expect(snack.name).to eql(:popcorn)
9
+ end
10
+
11
+ it "has a carbs attribute" do
12
+ expect(snack.carbs).to eql(10)
13
+ end
14
+
15
+ describe SnackBar do
16
+ it "has a full yummy bar" do
17
+ expect(SnackBar::SNACKS).to_not be_nil
18
+ end
19
+
20
+ it "returns a random yummy snack" do
21
+ expect(SnackBar::SNACKS).to include(snack)
22
+ end
23
+ end
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oscar-movies
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ahmed Nadar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
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'
27
+ description: |-
28
+ This is an application used to cover lost of aras in Ruby.
29
+
30
+ You can contact me here http://twitter.com/ahmedandar.
31
+ email: ahmednadar@gmail.com
32
+ executables:
33
+ - oscar
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - bin/movies.csv
38
+ - bin/oscar
39
+ - lib/oscar/movie.rb
40
+ - lib/oscar/movie3d.rb
41
+ - lib/oscar/playlist.rb
42
+ - lib/oscar/rankable.rb
43
+ - lib/oscar/reviewer.rb
44
+ - lib/oscar/snack_bar.rb
45
+ - lib/oscar/song.rb
46
+ - spec/oscar/movie3d_spec.rb
47
+ - spec/oscar/movie_spec.rb
48
+ - spec/oscar/playlist_spec.rb
49
+ - spec/oscar/snack_bar_spec.rb
50
+ - LICENSE
51
+ - README
52
+ homepage: http://ahmednadar.github.io
53
+ licenses: []
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '1.9'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.1.11
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: Plays and reviews movies
75
+ test_files:
76
+ - spec/oscar/movie3d_spec.rb
77
+ - spec/oscar/movie_spec.rb
78
+ - spec/oscar/playlist_spec.rb
79
+ - spec/oscar/snack_bar_spec.rb
80
+ has_rdoc: