blueberry 2.0.0
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 +7 -0
- data/README +1 -0
- data/bin/blue +47 -0
- data/bin/movies.csv +7 -0
- data/lib/dok2_and_quiet.rb +28 -0
- data/lib/mixins.rb +58 -0
- data/lib/movie.rb +59 -0
- data/lib/movie3d.rb +138 -0
- data/lib/namespaces.rb +30 -0
- data/lib/playlist.rb +111 -0
- data/lib/rankable.rb +26 -0
- data/lib/snack_bar.rb +27 -0
- data/spec/movie_spec.rb +81 -0
- data/spec/playlist_spec.rb +37 -0
- data/spec/spec_helper.rb +8 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 24490f20780296b37c98f69ffa36471bc7b77540
|
4
|
+
data.tar.gz: 14dfd7db95081fdf7708c79f35c6a9dbeeed03f2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a250a12f92cc83a891243a25c627f09c1e05455d4a514582fe6ad545663d1d38ff2bfd1329b62c06d8335f11059c9134b2d65ce4a41f02aa31eaee66ed69a8c9
|
7
|
+
data.tar.gz: b8076b29169f0bcb283f172068124b8f174f51f4395d333276b93ae12ff6693ea0f7ee51cb6b92ef3ff862a23ecf0fc9b7e07622b80f22c48fb9fd16e7b1c596
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
My blueberry gem ;)
|
data/bin/blue
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/playlist'
|
4
|
+
require_relative '../lib/movie3d'
|
5
|
+
|
6
|
+
playlist = Flicks::Playlist.new("Making knowledge MINE")
|
7
|
+
|
8
|
+
default_movies_file =
|
9
|
+
File.join(File.dirname(__FILE__),'movies.csv')
|
10
|
+
|
11
|
+
playlist.load_file(ARGV.shift || default_movies_file)
|
12
|
+
|
13
|
+
#Whenever you type a command that uses a file,
|
14
|
+
#the working directory(where you called the script from)
|
15
|
+
#will be the first place your shell looks to find the file.
|
16
|
+
#therefore, you need to provide absolute path for 'avengers'
|
17
|
+
|
18
|
+
#and we can call this script anywhere once gem is installed
|
19
|
+
#because gem loads bin/executable file on ruby's load path
|
20
|
+
#once it is installed
|
21
|
+
|
22
|
+
movie3d = Flicks::Movie3D.new('95%',5,10)
|
23
|
+
playlist.add_movie(movie3d)
|
24
|
+
|
25
|
+
loop do
|
26
|
+
puts "\nHow many viewings? ('quit' to exit)"
|
27
|
+
answer = gets.chomp.downcase #get string, gets next line from $stdin
|
28
|
+
#chomp removes any characters hanging onto end of string
|
29
|
+
case answer #answer is string because its from $stdin, you type in as string
|
30
|
+
when 'quit','exit'
|
31
|
+
playlist.print_stats
|
32
|
+
playlist.save_file
|
33
|
+
break
|
34
|
+
when /^\d*$/
|
35
|
+
puts "Enjoy your #{answer} viewings, achiever!"
|
36
|
+
playlist.play(answer.to_i)
|
37
|
+
else
|
38
|
+
puts "\nPlease enter a number or 'quit' to exit "
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
data/bin/movies.csv
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'movie'
|
2
|
+
|
3
|
+
module Dok2AndQuiet
|
4
|
+
|
5
|
+
def self.roll
|
6
|
+
@number = rand(1..6)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.review(movie)
|
10
|
+
|
11
|
+
case roll #or self.roll
|
12
|
+
|
13
|
+
when 1..2
|
14
|
+
movie.thumbs_down
|
15
|
+
puts "#{movie.title} got thumbs down"
|
16
|
+
when 3..4
|
17
|
+
puts "#{movie.title} got skipped"
|
18
|
+
when 5..6
|
19
|
+
movie.thumbs_up
|
20
|
+
puts "#{movie.title} got thumbs up!"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if __FILE__ == $0
|
26
|
+
movie = Movie.new("ironman")
|
27
|
+
puts Dok2AndQuiet::review(movie) #Dok2AndQuiet.review(movie)
|
28
|
+
end
|
data/lib/mixins.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
module Rankable
|
2
|
+
def thumbs_up
|
3
|
+
puts "#{self.title} got a thumbs_up"
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Movie
|
8
|
+
include Rankable
|
9
|
+
attr_accessor :title, :rank
|
10
|
+
def initialize(title,rank)
|
11
|
+
@title = title
|
12
|
+
@rank = rank
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Song
|
18
|
+
include Rankable
|
19
|
+
attr_accessor :title, :rank
|
20
|
+
|
21
|
+
def initialize(title,rank)
|
22
|
+
self.title = title
|
23
|
+
self.rank = rank
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if __FILE__ == $0
|
28
|
+
movie = Movie.new('goonies',10)
|
29
|
+
movie.thumbs_up
|
30
|
+
song = Song.new('Ruby baby',10)
|
31
|
+
song.thumbs_up
|
32
|
+
end
|
33
|
+
|
34
|
+
#mixins - simply a module that has methods
|
35
|
+
# and those methods gets mixed into other classes
|
36
|
+
|
37
|
+
#we want to share some common behaviors across
|
38
|
+
#these classes which arent in the same inheritance hierchy
|
39
|
+
#(they are not in same ancestors line, no child and parent)
|
40
|
+
|
41
|
+
#mixed in modules effectively behave like superclasses.
|
42
|
+
#it changes the method look-up hierchy
|
43
|
+
#module lives in between the class that includes the
|
44
|
+
#module and their direct superclass
|
45
|
+
#so when we call a method, it looks into the object's
|
46
|
+
#class then it looks in the module, then it looks in
|
47
|
+
#the superclass and then all the way into the top
|
48
|
+
|
49
|
+
# It generally considered better practice if
|
50
|
+
# a module depends on a method or an attribute in the
|
51
|
+
# hosting class(the class that it gets mixed into)
|
52
|
+
# as opposted to relying on the instance variable being present
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
|
data/lib/movie.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative 'rankable'
|
2
|
+
|
3
|
+
module Flicks
|
4
|
+
class Movie
|
5
|
+
include Rankable
|
6
|
+
|
7
|
+
attr_reader :snack_carbs,:title
|
8
|
+
attr_accessor :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 self.convert(line)
|
17
|
+
title,rank = line.split(',')
|
18
|
+
Movie.new(title,Integer(rank))
|
19
|
+
end
|
20
|
+
|
21
|
+
def expose_hash
|
22
|
+
@snack_carbs.each do |key,value|
|
23
|
+
snack = Snack.new(key,value.to_i)
|
24
|
+
yield(snack)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def carbs_consumed
|
29
|
+
@snack_carbs.values.reduce(0) {|sum,snack| sum + snack }
|
30
|
+
# @snacks_carbs.values.reduce(0,:+)
|
31
|
+
end
|
32
|
+
|
33
|
+
def ate_snack(snack)
|
34
|
+
@snack_carbs[snack.name] += snack.carbs
|
35
|
+
puts "Sold ~> #{snack.name.capitalize} - #{snack.carbs} carbs"
|
36
|
+
puts @snack_carbs
|
37
|
+
end
|
38
|
+
|
39
|
+
def title=(title)
|
40
|
+
@title = title.capitalize
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
"#{@title} with a rank of #{@rank} (#{status})"
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
if __FILE__ == $0
|
51
|
+
movie1 = Flicks::Movie.new("Amazing Spiderman",8)
|
52
|
+
puts movie1
|
53
|
+
puts movie1.normalized_rank
|
54
|
+
movie1.thumbs_up
|
55
|
+
movie1.thumbs_down
|
56
|
+
puts movie1.rank
|
57
|
+
movie1.title="crappy spiderman"
|
58
|
+
puts movie1.title
|
59
|
+
end
|
data/lib/movie3d.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
require_relative 'movie'
|
2
|
+
|
3
|
+
module Flicks
|
4
|
+
class Movie3D < Movie
|
5
|
+
attr_accessor :wow_factor
|
6
|
+
|
7
|
+
def initialize(title,rank,wow_factor)
|
8
|
+
super(title,rank)
|
9
|
+
|
10
|
+
@wow_factor = wow_factor
|
11
|
+
end
|
12
|
+
|
13
|
+
def thumbs_up
|
14
|
+
self.wow_factor.times { super }
|
15
|
+
end
|
16
|
+
|
17
|
+
def show_effect
|
18
|
+
puts "Wow " * self.wow_factor
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if __FILE__ == $0
|
24
|
+
movie3d = Flicks::Movie3D.new('90%',5,10)
|
25
|
+
end
|
26
|
+
|
27
|
+
# polymorphism - 3dmovie and movie is a kind of relationship
|
28
|
+
# we can use 3dmovie on anywhere we expect to use movie this is polymorphism where
|
29
|
+
# we can use object A as like, object b, because OBJECT A is kind of
|
30
|
+
# object B - inherited
|
31
|
+
|
32
|
+
|
33
|
+
# movie.show_effect
|
34
|
+
#above method that is defined in child class doesnt work on super class movie objects because
|
35
|
+
#class Movie doesnt have this method. Ruby can only search methods UP on
|
36
|
+
#inhertiance hicharchy. only upwards, superclass and ancestors, never travel down
|
37
|
+
#on inheritance. show_effect is a new unique method defined in child class.
|
38
|
+
|
39
|
+
#quickly show you how you can use
|
40
|
+
#reflection(act of reflecting casting back)
|
41
|
+
#to look at the class Hierarchy
|
42
|
+
#(system of things ranked one above another)
|
43
|
+
#Class.superclass || Class.ancestors
|
44
|
+
|
45
|
+
# *take away*
|
46
|
+
# when you call a method on an object, ruby first tries
|
47
|
+
# to find that method in the objects class. If that method
|
48
|
+
# isnt found,ruby looks in the objects super class or module defined inside
|
49
|
+
#of superclass
|
50
|
+
# and its super class and so on all the way up to the
|
51
|
+
# top of the chain
|
52
|
+
|
53
|
+
#subclasses inherit behavior(method) and
|
54
|
+
#attributes(instance variables) from parents class.
|
55
|
+
#subclasses can also define their own unique behavior
|
56
|
+
#that wont be available in their parent class.
|
57
|
+
|
58
|
+
|
59
|
+
#subclasses can specialize(modify) behaviors(methods) by overwriting
|
60
|
+
#methods that are already defined in the parent class.
|
61
|
+
#and by using Super, they can modify existing method.
|
62
|
+
|
63
|
+
#subclasses have access to parent class's @instance variables
|
64
|
+
|
65
|
+
#we can call parent class methods on child class
|
66
|
+
#by using something called super
|
67
|
+
|
68
|
+
# class Animal
|
69
|
+
# attr_accessor :name
|
70
|
+
|
71
|
+
# def initialize(name) #receives name attribute from super and invokes initialize method
|
72
|
+
# @name = name
|
73
|
+
# end
|
74
|
+
# end
|
75
|
+
|
76
|
+
# class BadDog < Animal
|
77
|
+
# def initialize(age, name)
|
78
|
+
# super(name) #super invokes the whole initialize method in parent class and sends name attribute
|
79
|
+
# @age = age
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
# BadDog.new(2, "bear") => #<BadDog:0x007fb40b2beb68 @age=2, @name="bear">
|
83
|
+
|
84
|
+
|
85
|
+
# class Animal
|
86
|
+
# attr_accessor :name, :speed
|
87
|
+
# def initialize(name,speed)
|
88
|
+
# self.name = name
|
89
|
+
# self.speed = speed
|
90
|
+
# end
|
91
|
+
|
92
|
+
# end
|
93
|
+
|
94
|
+
|
95
|
+
# module Runnable
|
96
|
+
# attr_accessor :name,:speed
|
97
|
+
|
98
|
+
# def initialize(name,speed)
|
99
|
+
# self.name = name
|
100
|
+
# self.speed = speed
|
101
|
+
# end
|
102
|
+
# end
|
103
|
+
|
104
|
+
# class Cheetah
|
105
|
+
# include Runnable
|
106
|
+
# attr_accessor :power
|
107
|
+
# def initialize(name,speed,power)
|
108
|
+
# super(name,speed)
|
109
|
+
|
110
|
+
# @power = power
|
111
|
+
# end
|
112
|
+
|
113
|
+
# def stats
|
114
|
+
# puts self.name
|
115
|
+
# puts self.speed
|
116
|
+
# end
|
117
|
+
|
118
|
+
# end
|
119
|
+
|
120
|
+
# cheetah = Cheetah.new('cheetah',50,70)
|
121
|
+
# puts cheetah.name = "howdy"
|
122
|
+
# puts cheetah.stats
|
123
|
+
|
124
|
+
# animal = Animal.new('rocky',50)
|
125
|
+
# puts animal.inspect
|
126
|
+
# puts animal.name
|
127
|
+
# cheetah = Cheetah.new('cheetah',50,9000)
|
128
|
+
# puts cheetah.name, cheetah.speed,cheetah.power
|
129
|
+
|
130
|
+
# When called with specific arguments, eg. super(a, b), the specified arguments will be sent up the method lookup chain. Let's see a quick example:
|
131
|
+
# #super invokes same method(this time initialize method) its called on, so it calls on initialize of class Animal.
|
132
|
+
|
133
|
+
# This is similar to our previous example, with the difference being that super takes an argument, hence(this time on) the passed in argument is sent to the superclass. Consequently(as a result,outcome,therefore),
|
134
|
+
#in this example when a BadDog class is created the passed in name argument ("bear") is passed to the superclass and set to the @name instance variable.
|
135
|
+
|
136
|
+
|
137
|
+
# When you call super from within a method, it will search the inheritance hierarchy for a method(that called super)by the same name and then invoke it.
|
138
|
+
|
data/lib/namespaces.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module MovieSystem
|
2
|
+
VERSION = 1.0
|
3
|
+
|
4
|
+
def self.info
|
5
|
+
puts "Movie system version #{VERSION}"
|
6
|
+
end
|
7
|
+
|
8
|
+
class Player
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
module GameSystem
|
14
|
+
VERSION = 2.0
|
15
|
+
|
16
|
+
def self.info
|
17
|
+
puts "Game system version #{VERSION}"
|
18
|
+
end
|
19
|
+
|
20
|
+
class Player
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
puts MovieSystem::VERSION
|
25
|
+
MovieSystem.info
|
26
|
+
puts MovieSystem::Player.new
|
27
|
+
|
28
|
+
puts GameSystem::VERSION
|
29
|
+
GameSystem.info
|
30
|
+
puts GameSystem::Player.new
|
data/lib/playlist.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative 'dok2_and_quiet'
|
2
|
+
require_relative 'snack_bar'
|
3
|
+
require_relative 'movie'
|
4
|
+
|
5
|
+
module Flicks
|
6
|
+
class Playlist
|
7
|
+
attr_reader :movies, :name
|
8
|
+
|
9
|
+
def initialize(name)
|
10
|
+
@name = name.capitalize
|
11
|
+
@movies = []
|
12
|
+
puts "\n***#{@name}'s Playlist has been created***"
|
13
|
+
end
|
14
|
+
|
15
|
+
def name=(title)
|
16
|
+
@name = title.capitalize
|
17
|
+
puts "Name of playlist has been modified to #{@name}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_file(from_file)
|
21
|
+
puts "\n::::Loding File #{from_file.capitalize}::::"
|
22
|
+
File.readlines(from_file).each do |line|
|
23
|
+
add_movie(Movie.convert(line))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def save_file(to_file="final_records")
|
28
|
+
puts "\n::::::Saving To File #{to_file.capitalize}::::::"
|
29
|
+
File.open(to_file,"a+") do |file|
|
30
|
+
@movies.sort.map.with_index(1) do |movie, i|
|
31
|
+
file.puts("\t#{i}.#{movie.title},#{movie.rank}")
|
32
|
+
end
|
33
|
+
time = Time.new
|
34
|
+
file.puts time.strftime("Printed on %m/%d/%Y at %I:%M%p")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_movie(movie)
|
39
|
+
@movies << movie
|
40
|
+
puts "::added #{movie.title}::"
|
41
|
+
end
|
42
|
+
|
43
|
+
def play(viewings)
|
44
|
+
|
45
|
+
puts "\n\n~~Playing #{@name}'s playlist:~~"
|
46
|
+
|
47
|
+
@movies.sort {|x,y| y.rank <=> x.rank}.each do |movie|
|
48
|
+
puts "\tTrack: #{movie}"
|
49
|
+
end
|
50
|
+
|
51
|
+
snacks = SnackBar::SNACKS
|
52
|
+
puts "\nThere are #{snacks.size} snacks available in the Snack Bar."
|
53
|
+
snacks.sort {|x,y| y.carbs <=> x.carbs }.map.with_index(1) {|snack,i| puts "\t#{i}. #{snack.name.capitalize} - #{snack.carbs} carbs"}
|
54
|
+
|
55
|
+
puts "\nStarting the Movie,Enjoy your show!!"
|
56
|
+
1.upto(viewings) do |counter|
|
57
|
+
puts "\nViewing: #{counter}"
|
58
|
+
@movies.sort.each do |movie|
|
59
|
+
Dok2AndQuiet.review(movie)
|
60
|
+
snack = SnackBar.random
|
61
|
+
movie.ate_snack(snack)
|
62
|
+
puts movie
|
63
|
+
puts "**************************************************"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def total_playlist_carbs
|
69
|
+
@movies.reduce(0) {|sum,movie| sum + movie.carbs_consumed}
|
70
|
+
end
|
71
|
+
|
72
|
+
def total_playlist_snacks
|
73
|
+
@movies.reduce(0) {|sum, movie| sum + movie.snack_carbs.keys.size}
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def print_stats
|
78
|
+
puts "\n\n\nPlayList #{@name.upcase!}'s Stats: #{total_playlist_carbs} carbs - #{total_playlist_snacks} snacks"
|
79
|
+
|
80
|
+
@movies.sort {|x,y| y.carbs_consumed <=> x.carbs_consumed }.map.with_index(1) do |movie,i|
|
81
|
+
puts "#{i}. #{movie.title} - #{movie.carbs_consumed} *total* grand carbs"
|
82
|
+
movie.expose_hash {|key| puts "\t #{key.name} - #{key.carbs} carbs"}
|
83
|
+
end
|
84
|
+
|
85
|
+
hits, flops = @movies.partition {|m| m.hit? }
|
86
|
+
|
87
|
+
puts "\nHits: "
|
88
|
+
hits.sort.each do |movie|
|
89
|
+
puts "\t#{movie}"
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
puts "\nFlops: "
|
94
|
+
flops.sort.each do |movie|
|
95
|
+
puts "\t#{movie}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
if __FILE__ == $0
|
102
|
+
playlist1 = Flicks::Playlist.new("Mastering Ruby 1")
|
103
|
+
movie1 = Flicks::Movie.new("Knowledge and Skill",10)
|
104
|
+
movie2 = Flicks::Movie.new("Focus",20)
|
105
|
+
playlist1.add_movie(movie1)
|
106
|
+
playlist1.add_movie(movie2)
|
107
|
+
# puts playlist1.movies
|
108
|
+
# puts playlist1.name
|
109
|
+
playlist1.play(3)
|
110
|
+
end
|
111
|
+
|
data/lib/rankable.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Rankable
|
2
|
+
|
3
|
+
def thumbs_up
|
4
|
+
self.rank += 1
|
5
|
+
end
|
6
|
+
|
7
|
+
def thumbs_down
|
8
|
+
self.rank -= 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def hit?
|
12
|
+
self.rank >= 10
|
13
|
+
end
|
14
|
+
|
15
|
+
def status
|
16
|
+
hit? ? "Hit" : "Flop"
|
17
|
+
end
|
18
|
+
|
19
|
+
def normalized_rank
|
20
|
+
self.rank / 2
|
21
|
+
end
|
22
|
+
|
23
|
+
def <=>(other)
|
24
|
+
other.rank <=> @rank
|
25
|
+
end
|
26
|
+
end
|
data/lib/snack_bar.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
Snack = Struct.new(:name,:carbs)
|
2
|
+
|
3
|
+
module SnackBar
|
4
|
+
#constant - identifier with value that cannot be altered(changed)
|
5
|
+
SNACKS = [
|
6
|
+
Snack.new(:popcorn,20),
|
7
|
+
Snack.new(:candy,15),
|
8
|
+
Snack.new(:nachos,40),#class Snack
|
9
|
+
Snack.new(:pretzel,10),
|
10
|
+
Snack.new(:pop,5) #instance object created by class Snack
|
11
|
+
]
|
12
|
+
|
13
|
+
def self.random
|
14
|
+
SNACKS.sample
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
if __FILE__ == $0
|
20
|
+
snacks = SnackBar::SNACKS
|
21
|
+
puts snacks
|
22
|
+
snack = SnackBar.random
|
23
|
+
puts "Enjoy your random #{snack.name} with #{snack.carbs} carbs"
|
24
|
+
end
|
25
|
+
|
26
|
+
#one snackbar in our program, so it is fit
|
27
|
+
#to make module instead of class
|
data/spec/movie_spec.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'movie'
|
2
|
+
require_relative 'spec_helper'
|
3
|
+
|
4
|
+
module Flicks
|
5
|
+
RSpec.describe Movie do
|
6
|
+
before do
|
7
|
+
$stdout = StringIO.new
|
8
|
+
end
|
9
|
+
|
10
|
+
context "Let's unit test Movie methods" do
|
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_not == "goonies"
|
18
|
+
@movie.title.should == "Goonies"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has an initial rank" do
|
22
|
+
@movie.rank.should == 10
|
23
|
+
end
|
24
|
+
|
25
|
+
it "has a string representation" do
|
26
|
+
@movie.to_s.should == "Goonies with a rank of 10 (Hit)"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "increases rank by 1 when given a thumbs up" do
|
30
|
+
@movie.thumbs_up
|
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
|
+
@movie.rank.should == @initial_rank - 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "can have default values" do
|
41
|
+
before do
|
42
|
+
@movie = Movie.new('goonies')
|
43
|
+
end
|
44
|
+
|
45
|
+
it "has a default rank of 0 if not initialized" do
|
46
|
+
@movie.rank.should == 0
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "with a rank of at least 10." do
|
51
|
+
before do
|
52
|
+
@movie = Movie.new('lawyer',10)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "is a Hit" do
|
56
|
+
expect(@movie).to be_hit
|
57
|
+
end
|
58
|
+
|
59
|
+
it "has a HIT status" do
|
60
|
+
expect(@movie.status).to eq("Hit")
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'with a rank less than 10.' do
|
67
|
+
before do
|
68
|
+
@movie = Movie.new('fantastic 4',5)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "is not a hit" do
|
72
|
+
expect(@movie).to_not be_hit
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'has a Flop status' do
|
76
|
+
expect(@movie.status).to eq('Flop')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'playlist'
|
2
|
+
|
3
|
+
module Flicks
|
4
|
+
RSpec.describe Playlist do
|
5
|
+
before do
|
6
|
+
$stdout = StringIO.new
|
7
|
+
@playlist = Playlist.new('show me the money')
|
8
|
+
end
|
9
|
+
|
10
|
+
context '*being played with one movie.' do
|
11
|
+
before do
|
12
|
+
@initial_rank = 10
|
13
|
+
@movie = Movie.new('L4L',@initial_rank)
|
14
|
+
@playlist.add_movie(@movie)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'gives the movie a thumbs up when high number is rolled' do
|
18
|
+
allow(Dok2AndQuiet).to receive(:roll).and_return(5)
|
19
|
+
@playlist.play(1)
|
20
|
+
|
21
|
+
expect(@movie.rank).to eq(@initial_rank + 1)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'skips the movie when medium number is rolled' do
|
25
|
+
allow(Dok2AndQuiet).to receive(:roll).and_return(3)
|
26
|
+
@playlist.play(1)
|
27
|
+
expect(@movie.rank).to eq(@initial_rank)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'gives the movie a thumbs down if lower number is rolled' do
|
31
|
+
allow(Dok2AndQuiet).to receive(:roll).and_return(1)
|
32
|
+
@playlist.play(1)
|
33
|
+
expect(@movie.rank).to eq(@initial_rank - 1)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.expect_with :rspec do |c|
|
3
|
+
c.syntax = [:should, :expect] # default, enables both `should` and `expect`
|
4
|
+
end
|
5
|
+
config.mock_with :rspec do |c|
|
6
|
+
c.syntax = [:should, :expect] # default, enables both `should` and `expect`
|
7
|
+
end
|
8
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: blueberry
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dany Han
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
executables:
|
16
|
+
- blue
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- README
|
21
|
+
- bin/blue
|
22
|
+
- bin/movies.csv
|
23
|
+
- lib/dok2_and_quiet.rb
|
24
|
+
- lib/mixins.rb
|
25
|
+
- lib/movie.rb
|
26
|
+
- lib/movie3d.rb
|
27
|
+
- lib/namespaces.rb
|
28
|
+
- lib/playlist.rb
|
29
|
+
- lib/rankable.rb
|
30
|
+
- lib/snack_bar.rb
|
31
|
+
- spec/movie_spec.rb
|
32
|
+
- spec/playlist_spec.rb
|
33
|
+
- spec/spec_helper.rb
|
34
|
+
homepage:
|
35
|
+
licenses: []
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 2.2.2
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: My blueberry gem ;)
|
57
|
+
test_files: []
|