my_flicks 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/flicks +25 -0
- data/bin/flicks.rb +32 -0
- data/bin/movies.csv +3 -0
- data/bin/superhero_movies.csv +3 -0
- data/lib/flicks/die.rb +7 -0
- data/lib/flicks/movie.rb +67 -0
- data/lib/flicks/movie3d.rb +27 -0
- data/lib/flicks/playlist.rb +78 -0
- data/lib/flicks/rankable.rb +25 -0
- data/lib/flicks/reviewer.rb +20 -0
- data/lib/flicks/snack_bar.rb +21 -0
- data/spec/flicks/movie_spec.rb +79 -0
- data/spec/flicks/playlist_spec.rb +40 -0
- metadata +76 -0
data/bin/flicks
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require_relative '../lib/flicks/playlist'
|
3
|
+
require_relative '../lib/flicks/movie3d'
|
4
|
+
|
5
|
+
playlist1 = Flicks::Playlist.new "Kermit"
|
6
|
+
default_movie_file = File.join(File.dirname(__FILE__), 'movies.csv')
|
7
|
+
playlist1.load(ARGV.shift || default_movie_file)
|
8
|
+
|
9
|
+
playlist1.add_movie Movie3D.new 'glee',5,20
|
10
|
+
|
11
|
+
loop do
|
12
|
+
puts "\nHow many viewings? ('quit' to exit)"
|
13
|
+
answer = gets.chomp.downcase
|
14
|
+
case answer
|
15
|
+
when /^\d+$/
|
16
|
+
playlist1.play answer.to_i
|
17
|
+
when 'quit','exit'
|
18
|
+
playlist1.print_stats
|
19
|
+
break
|
20
|
+
else
|
21
|
+
puts "Please enter a number or 'quit'"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
playlist1.save
|
data/bin/flicks.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require_relative '../lib/flicks/playlist'
|
3
|
+
require_relative '../lib/flicks/movie3d'
|
4
|
+
|
5
|
+
playlist1 = Flicks::Playlist.new "Kermit"
|
6
|
+
default_movie_file = File.join(File.dirname(__FILE__), 'movies.csv'
|
7
|
+
playlist1.load(ARGV.shift || default_movie_file)
|
8
|
+
|
9
|
+
playlist1.add_movie Movie3D.new 'glee',5,20
|
10
|
+
|
11
|
+
loop do
|
12
|
+
puts "\nHow many viewings? ('quit' to exit)"
|
13
|
+
answer = gets.chomp.downcase
|
14
|
+
case answer
|
15
|
+
when /^\d+$/
|
16
|
+
playlist1.play answer.to_i
|
17
|
+
when 'quit','exit'
|
18
|
+
playlist1.print_stats
|
19
|
+
break
|
20
|
+
else
|
21
|
+
puts "Please enter a number or 'quit'"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
playlist1.save
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
#if you want to run this like bin/flicks
|
30
|
+
# chmod +x bin/flicks
|
31
|
+
# don't forget the shebang (!) at the top of this file
|
32
|
+
# make sure the env is not messed up or you might get errors
|
data/bin/movies.csv
ADDED
data/lib/flicks/die.rb
ADDED
data/lib/flicks/movie.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require_relative 'rankable'
|
2
|
+
|
3
|
+
module Flicks
|
4
|
+
class Movie
|
5
|
+
include Rankable
|
6
|
+
attr_accessor :title, :rank
|
7
|
+
def initialize title, rank=0
|
8
|
+
@title = title.capitalize
|
9
|
+
@rank = rank
|
10
|
+
@snack_carbs = Hash.new 0
|
11
|
+
#puts "Created a movie #{title} with a rank of #{rank}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.from_csv line
|
15
|
+
title, rank = line.split(',')
|
16
|
+
Movie.new title,Integer(rank)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_csv
|
20
|
+
"#{@title},#{@rank}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
listing
|
25
|
+
end
|
26
|
+
|
27
|
+
def weekday
|
28
|
+
current_time = Time.new
|
29
|
+
today = current_time.strftime("%A")
|
30
|
+
end
|
31
|
+
|
32
|
+
def listing
|
33
|
+
"#{@title} has a rank of #{@rank} (#{status})"
|
34
|
+
end
|
35
|
+
|
36
|
+
def carbs_consumed
|
37
|
+
@snack_carbs.values.reduce(0,:+)
|
38
|
+
end
|
39
|
+
|
40
|
+
def each_snack
|
41
|
+
@snack_carbs.each do |name, carbs|
|
42
|
+
snack = Snack.new name,carbs
|
43
|
+
yield snack
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def ate_snack snack
|
48
|
+
@snack_carbs[snack.name] += snack.carbs
|
49
|
+
puts "#{@title} led to the consumption of #{snack.carbs} carbs from #{snack.name}"
|
50
|
+
puts "#{@title}'s snacks: #{@snack_carbs}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#__FILE__ holds the current filename, $0 holds the current file being run
|
55
|
+
#so if this file is being run (ruby movie.rb), then this code will be executed
|
56
|
+
if __FILE__ == $0
|
57
|
+
movie = Movie.new "goonies", 10
|
58
|
+
puts movie
|
59
|
+
|
60
|
+
movie.thumbs_up
|
61
|
+
puts movie
|
62
|
+
puts movie.rank
|
63
|
+
|
64
|
+
movie.title="Tron"
|
65
|
+
puts movie
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative 'movie'
|
2
|
+
|
3
|
+
class Movie3D < Flicks::Movie
|
4
|
+
|
5
|
+
def initialize title,rank,wow_factor
|
6
|
+
@wow_factor = wow_factor
|
7
|
+
super title, rank
|
8
|
+
end
|
9
|
+
def show_effect
|
10
|
+
puts "WOW " * @wow_factor
|
11
|
+
end
|
12
|
+
|
13
|
+
def thumbs_up
|
14
|
+
@wow_factor.times { super }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
if __FILE__ == $0
|
19
|
+
movie3d = Movie3D.new 'glee',5,20
|
20
|
+
|
21
|
+
puts movie3d
|
22
|
+
|
23
|
+
movie3d.thumbs_up
|
24
|
+
movie3d.show_effect
|
25
|
+
|
26
|
+
puts movie3d
|
27
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative 'movie'
|
2
|
+
require_relative 'reviewer'
|
3
|
+
require_relative 'snack_bar'
|
4
|
+
module Flicks
|
5
|
+
class Playlist
|
6
|
+
def initialize name
|
7
|
+
@name = name
|
8
|
+
@movies = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_movie movie
|
12
|
+
#@movies << movie also works
|
13
|
+
@movies.push movie
|
14
|
+
end
|
15
|
+
|
16
|
+
def load from_file
|
17
|
+
File.readlines(from_file).each do |line|
|
18
|
+
add_movie Movie.from_csv(line)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def save to_file="movie_rankings.csv"
|
23
|
+
File.open(to_file,"w") do |file|
|
24
|
+
@movies.sort.each do |movie|
|
25
|
+
file.puts movie.to_csv
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def play viewings=1
|
31
|
+
puts "\n#{@name}'s playlist"
|
32
|
+
puts @movies.sort
|
33
|
+
|
34
|
+
snacks = SnackBar::SNACKS
|
35
|
+
puts "\nThere are #{snacks.size} snacks available in the snack bar"
|
36
|
+
|
37
|
+
snacks.each { |snack| puts "#{snack.name} has #{snack.carbs} carbs."}
|
38
|
+
|
39
|
+
viewings.times do |count|
|
40
|
+
puts "\nViewing #{count+1}"
|
41
|
+
@movies.each do |movie|
|
42
|
+
Reviewer.review movie
|
43
|
+
snack = SnackBar.random
|
44
|
+
movie.ate_snack snack
|
45
|
+
puts movie
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def total_carbs_consumed
|
51
|
+
@movies.reduce(0) { |sum, movie| sum + movie.carbs_consumed }
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_stats
|
55
|
+
puts "\n#{@name}'s Stats:"
|
56
|
+
|
57
|
+
puts "#{total_carbs_consumed} total carbs consumed"
|
58
|
+
|
59
|
+
@movies.sort.each do |movie|
|
60
|
+
puts "\n#{movie.title}'s snack totals:"
|
61
|
+
|
62
|
+
movie.each_snack do |snack|
|
63
|
+
puts "#{snack.carbs} total #{snack.name} carbs"
|
64
|
+
end
|
65
|
+
|
66
|
+
puts " #{movie.carbs_consumed} grand total carbs"
|
67
|
+
end
|
68
|
+
|
69
|
+
hits, flops = @movies.partition { |movie| movie.hit? }
|
70
|
+
|
71
|
+
puts "\nHits:"
|
72
|
+
puts hits.sort
|
73
|
+
|
74
|
+
puts "\nFlops:"
|
75
|
+
puts flops.sort
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rankable
|
2
|
+
def thumbs_up
|
3
|
+
self.rank+=1
|
4
|
+
end
|
5
|
+
|
6
|
+
def thumbs_down
|
7
|
+
self.rank-=1
|
8
|
+
end
|
9
|
+
|
10
|
+
def hit?
|
11
|
+
self.rank >= 10
|
12
|
+
end
|
13
|
+
|
14
|
+
def status
|
15
|
+
hit? ? "hit" : "flop"
|
16
|
+
end
|
17
|
+
|
18
|
+
def <=> other
|
19
|
+
other.rank <=> self.rank
|
20
|
+
end
|
21
|
+
|
22
|
+
def normalized_rank
|
23
|
+
self.rank/10
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Reviewer
|
2
|
+
|
3
|
+
def self.review movie
|
4
|
+
number_rolled = roll_die
|
5
|
+
case number_rolled
|
6
|
+
when 5..6
|
7
|
+
movie.thumbs_up
|
8
|
+
puts "#{movie.title} got a thumbs up"
|
9
|
+
when 3..4
|
10
|
+
puts "#{movie.title} was skipped"
|
11
|
+
else
|
12
|
+
movie.thumbs_down
|
13
|
+
puts "#{movie.title} got a thumbs down"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.roll_die
|
18
|
+
rand(1..6)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Snack = Struct.new(:name, :carbs)
|
2
|
+
|
3
|
+
module SnackBar
|
4
|
+
SNACKS = [
|
5
|
+
Snack.new(:popcorn, 20),
|
6
|
+
Snack.new(:candy, 15),
|
7
|
+
Snack.new(:nachos, 40),
|
8
|
+
Snack.new(:pretzel, 10),
|
9
|
+
Snack.new(:soda, 5)
|
10
|
+
]
|
11
|
+
|
12
|
+
def self.random
|
13
|
+
SNACKS.sample
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
if __FILE__ == $0
|
18
|
+
puts SnackBar::SNACKS
|
19
|
+
snack = SnackBar.random
|
20
|
+
puts "Enjoy your #{snack.name} "
|
21
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'flicks/movie'
|
2
|
+
#rspec movie_spec.rb --color --format doc
|
3
|
+
#rspec auto adds lib/spec/ directory to rubys loadpath used by require
|
4
|
+
|
5
|
+
#To avoid output from method invocations being displayed to console
|
6
|
+
$stdout = StringIO.new
|
7
|
+
|
8
|
+
module Flicks
|
9
|
+
describe Movie do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@initial_rank =10
|
13
|
+
@movie = Movie.new "goonies", @initial_rank
|
14
|
+
end
|
15
|
+
|
16
|
+
it "has a capitalized title" do
|
17
|
+
@movie.title.should == "Goonies"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "has an initial rank" do
|
21
|
+
@movie.rank.should == 10
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a string representation" do
|
25
|
+
@movie.to_s.should == "Goonies has a rank of 10 (hit)"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "increases rank by 1 when given a thumbs up" do
|
29
|
+
@movie.thumbs_up
|
30
|
+
|
31
|
+
@movie.rank.should == @initial_rank + 1
|
32
|
+
end
|
33
|
+
|
34
|
+
it "decreases rank by 1 when given a thumbs down" do
|
35
|
+
@movie.thumbs_down
|
36
|
+
|
37
|
+
@movie.rank.should == @initial_rank - 1
|
38
|
+
end
|
39
|
+
|
40
|
+
context "created with a default rank" do
|
41
|
+
before do
|
42
|
+
@movie = Movie.new "goonies"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "has a rank of 0" do
|
46
|
+
@movie.rank.should == 0
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with a rank of atleast 10" do
|
51
|
+
before do
|
52
|
+
@movie = Movie.new "goonies", 10
|
53
|
+
end
|
54
|
+
|
55
|
+
it "is a hit" do
|
56
|
+
@movie.hit?.should == true
|
57
|
+
end
|
58
|
+
|
59
|
+
it "has a hit status" do
|
60
|
+
@movie.status.should == "hit"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "with a rank of less than 10" do
|
65
|
+
before do
|
66
|
+
@movie = Movie.new "goonies", 9
|
67
|
+
end
|
68
|
+
|
69
|
+
it "is not a hit" do
|
70
|
+
@movie.hit?.should == false
|
71
|
+
end
|
72
|
+
|
73
|
+
it "has a flop status" do
|
74
|
+
@movie.status.should == "flop"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'flicks/playlist'
|
2
|
+
|
3
|
+
#To avoid output from method invocations being displayed to console
|
4
|
+
$stdout = StringIO.new
|
5
|
+
module Flicks
|
6
|
+
describe Playlist do
|
7
|
+
before do
|
8
|
+
@playlist = Playlist.new "mark"
|
9
|
+
end
|
10
|
+
|
11
|
+
context "being played with one movie" do
|
12
|
+
before do
|
13
|
+
@initial_rank = 10
|
14
|
+
@movie = Movie.new "goonies", @initial_rank
|
15
|
+
@playlist.add_movie @movie
|
16
|
+
end
|
17
|
+
|
18
|
+
it "gives the movie a thumbs up if a high number is rolled" do
|
19
|
+
Reviewer.stub(:roll_die).and_return(5)
|
20
|
+
@playlist.play
|
21
|
+
|
22
|
+
@movie.rank.should == @initial_rank + 1
|
23
|
+
end
|
24
|
+
|
25
|
+
it "skips the movie if a medium number is rolled" do
|
26
|
+
Reviewer.stub(:roll_die).and_return(3)
|
27
|
+
@playlist.play
|
28
|
+
|
29
|
+
@movie.rank.should == @initial_rank
|
30
|
+
end
|
31
|
+
|
32
|
+
it "gives the movie a thumbs down if a low number is rolled" do
|
33
|
+
Reviewer.stub(:roll_die).and_return(1)
|
34
|
+
@playlist.play
|
35
|
+
|
36
|
+
@movie.rank.should == @initial_rank - 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: my_flicks
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mark Yanaros
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: File.read(File.join(File.dirname(__FILE__), 'README'))
|
31
|
+
email: mark.yanaros@gmail.com
|
32
|
+
executables:
|
33
|
+
- flicks
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- bin/flicks
|
38
|
+
- bin/flicks.rb
|
39
|
+
- bin/movies.csv
|
40
|
+
- bin/superhero_movies.csv
|
41
|
+
- lib/flicks/die.rb
|
42
|
+
- lib/flicks/movie.rb
|
43
|
+
- lib/flicks/movie3d.rb
|
44
|
+
- lib/flicks/playlist.rb
|
45
|
+
- lib/flicks/rankable.rb
|
46
|
+
- lib/flicks/reviewer.rb
|
47
|
+
- lib/flicks/snack_bar.rb
|
48
|
+
- spec/flicks/movie_spec.rb
|
49
|
+
- spec/flicks/playlist_spec.rb
|
50
|
+
homepage: ''
|
51
|
+
licenses: []
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.9'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.8.25
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Plays and reviews movies
|
74
|
+
test_files:
|
75
|
+
- spec/flicks/movie_spec.rb
|
76
|
+
- spec/flicks/playlist_spec.rb
|