flicks_alec 1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f8e67c8ce3f1fd7a97e86db5b4ac259b16ce4221f63d46c8dbbc2569963c7497
4
+ data.tar.gz: 184b2f52cd09ffaa73c38d5f21cc90337b71f869513175ca9c4903040af1a019
5
+ SHA512:
6
+ metadata.gz: c2eeb669c8a819b2df5683834c3a6f7427f8ee9b054aca3f5fff2a956be70a54db1f240620bde1f769b4f2e7e82db9f01f91a9c03c0a971cbe713bac00bb2520
7
+ data.tar.gz: 6820fe70ea0438cd372633590700e2a8713f5d73c6f8f0dec6ea93debab2e17a2c7d643fde7bd0a44094f91f87af4b7151748bf145eef95b1a13274b94f5f280
data/LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Alec
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # Flicks
2
+
3
+ Command-line app/gem to play and review movies.
4
+
5
+ ## Run from source
6
+ ruby bin/flicks
7
+
8
+ ## Features
9
+ - Load movies from CSV
10
+ - Review system (thumbs up/down)
11
+ - Snacks & carbs tracking
12
+ - 3D movie with wow factor
data/bin/flicks ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require 'flicks/movies'
7
+ require 'flicks/playlist'
8
+ require 'flicks/reviewers' # mantenha igual ao nome do arquivo (reviewrs.rb)
9
+ require 'flicks/movie3d'
10
+ require 'flicks/snack_bar'
11
+
12
+ #movie1= Movie.new("goonies", 10) #Criando um objeto da classe e chamando os métodos de instância
13
+ #movie2= Movie.new("ghostbusters", 9)
14
+ #movie3= Movie.new("Goldfingers")
15
+
16
+
17
+ #movies = [movie1, movie2, movie3]
18
+
19
+ playlist1= Flicks::Playlist.new("Kermit")
20
+ default_movie_file =
21
+ File.join(File.dirname(__FILE__), 'movies.csv')
22
+ playlist1.load(ARGV.shift || default_movie_file)
23
+ movie3d = Flicks::Movie3D.new('glee', 5, 20)
24
+ playlist1.add_movie(movie3d)
25
+
26
+
27
+ loop do
28
+
29
+ puts "How many viewings? ('quit' to exit)"
30
+ answer = gets.chomp.downcase
31
+ case answer
32
+ when /^\d+$/
33
+ puts "Enjoy your #{answer} viewings.."
34
+ playlist1.play(answer.to_i)
35
+ when 'quit', 'exit'
36
+ playlist1.print_stats
37
+ break
38
+ else
39
+ puts "Please enter a number or 'quit'"
40
+ end
41
+
42
+ end
43
+ playlist1.save
44
+
45
+
46
+ puts "--------------------------------"
47
+ =begin
48
+ playlist2 = Playlist.new("Fozzie")
49
+ playlist2.add_movie(movie3)
50
+
51
+ movie4= Movie.new("avengers", 15)
52
+ playlist2.add_movie(movie4)
53
+ playlist2.play(2)
54
+ =end
data/bin/flicks.rb ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'flicks/movies'
5
+ require 'flicks/playlist'
6
+ require 'flicks/reviewers' # mantenha o mesmo nome do arquivo
7
+ require 'flicks/movie3d'
8
+ require 'flicks/snack_bar'
9
+ rescue LoadError
10
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
11
+ retry
12
+ end
13
+
14
+
15
+
16
+ playlist1= Flicks::Playlist.new("Kermit")
17
+ default_movie_file =
18
+ File.join(File.dirname(__FILE__), 'movies.csv')
19
+ playlist1.load(ARGV.shift || default_movie_file)
20
+ movie3d = Flicks::Movie3D.new('glee', 5, 20)
21
+ playlist1.add_movie(movie3d)
22
+
23
+
24
+ loop do
25
+
26
+ puts "How many viewings? ('quit' to exit)"
27
+ answer = gets.chomp.downcase
28
+ case answer
29
+ when /^\d+$/
30
+ puts "Enjoy your #{answer} viewings.."
31
+ playlist1.play(answer.to_i)
32
+ when 'quit', 'exit'
33
+ playlist1.print_stats
34
+ break
35
+ else
36
+ puts "Please enter a number or 'quit'"
37
+ end
38
+
39
+ end
40
+ playlist1.save
41
+
42
+
43
+ puts "--------------------------------"
44
+ =begin
45
+ playlist2 = Playlist.new("Fozzie")
46
+ playlist2.add_movie(movie3)
47
+
48
+ movie4= Movie.new("avengers", 15)
49
+ playlist2.add_movie(movie4)
50
+ playlist2.play(2)
51
+ =end
52
+ #movie1= Movie.new("goonies", 10) #Criando um objeto da classe e chamando os métodos de instância
53
+ #movie2= Movie.new("ghostbusters", 9)
54
+ #movie3= Movie.new("Goldfingers")
55
+
56
+
57
+ #movies = [movie1, movie2, movie3]
@@ -0,0 +1,4 @@
1
+ Glee, 22
2
+ Goonies, 12
3
+ Ghostbusters, 11
4
+ Goldfinger, -1
data/bin/movies.csv ADDED
@@ -0,0 +1,3 @@
1
+ Goonies, 10
2
+ Ghostbusters, 9
3
+ Goldfinger, 0
@@ -0,0 +1,3 @@
1
+ Batman, 10
2
+ Spiderman, 9
3
+ Superman, 8
@@ -0,0 +1,32 @@
1
+ require_relative 'movies'
2
+ module Flicks
3
+ class Movie3D < Movie
4
+
5
+ def initialize(title, rank,wow_factor)
6
+ super(title, rank)
7
+ @wow_factor = wow_factor
8
+ end
9
+
10
+ def show_effect
11
+ puts "Wow! " * @wow_factor
12
+ end
13
+
14
+ def thumbs_up
15
+ @wow_factor.times {super }
16
+
17
+ end
18
+ end
19
+ end
20
+
21
+ if __FILE__ == $0
22
+ movie3d= Movie3D.new('glee', 5, 20)
23
+ puts movie3d.title
24
+ puts movie3d.rank
25
+
26
+ movie3d.thumbs_up
27
+ puts movie3d.rank
28
+ #puts movie3d
29
+
30
+ movie3d.show_effect
31
+
32
+ end
@@ -0,0 +1,89 @@
1
+
2
+ =begin
3
+ (((
4
+ attr_reader :title é a mesma coisa que:
5
+ def title
6
+ @reader
7
+ end
8
+ )))
9
+ (((
10
+ attr_writer :title é a mesma coisa que:
11
+ def title=(new_title)
12
+ @title = new_title
13
+ )))
14
+ (((
15
+ attr_accessor :title é a mesma coisa que:
16
+ def title
17
+ @reader
18
+ end
19
+ def title=(new_title)
20
+ @title = new_title
21
+ Ou seja, a união dos dois
22
+ )))
23
+ =end
24
+ require_relative 'rankable'
25
+ module Flicks
26
+ class Movie
27
+ include Rankable
28
+
29
+ #attr_reader :rank
30
+ attr_accessor :title, :rank
31
+ def initialize(title, rank=0) #ESTADO armazena a variáveis de instância
32
+ @title = title.capitalize
33
+ @rank= rank
34
+ @snack_carbs = Hash.new(0)
35
+ #puts "Created a movie object with object with title #{title} and a rank #{rank}"
36
+ end
37
+
38
+ #INPUT(LEITURA DE DADOS EXTERNOS)
39
+ def self.from_csv(line) #método de class
40
+ title, rank = line.split(',') # se a linha é "Goonies, 10", o split(',') vira: ["Goonies", "10"]
41
+ Movie.new(title, Integer(rank)) #não precisa de um objeto já criado #Movie.new cria realmente o objeto completo com os atributos certos: Movie.new("Goonies", 10)
42
+ # Integer(health) Converte a String "10" para inteiro, isso é importante porque vindo de arquivo tudo é texto
43
+ #AGORA VOCÊ CONSEGUE POPULAR SUA APLICAÇÃO INTEIRA LENDO UM ARQUIVO .csv EM VEZ DE CRIAR TUDO "NA MÃO" NO CÓDIGO.
44
+ end
45
+
46
+
47
+ def to_csv
48
+ "#{@title}, #{@rank}"
49
+ end
50
+
51
+
52
+ def each_snack
53
+ @snack_carbs.each do |name, carbs|
54
+ sna = Snack.new(name, carbs)
55
+ yield sna
56
+ end
57
+ end
58
+
59
+ def carbs_consumed
60
+ @snack_carbs.values.reduce(0, :+)
61
+ end
62
+
63
+
64
+ def ate_snack(snack)
65
+ @snack_carbs[snack.name] += snack.carbs # += serve para acumular
66
+ puts "#{@title} led to #{snack.carbs} #{snack.name} carbs being consumed"
67
+ puts "#{@title}'s snacks: #{@snack_carbs}"
68
+ end
69
+
70
+
71
+
72
+ def to_s
73
+ "#{@title} has a rank of #{@rank} (#{status})"
74
+ end
75
+
76
+
77
+
78
+ end
79
+ end
80
+ if __FILE__ == $0
81
+ movie = Movie.new("Filme teste",10)
82
+ puts movie.title
83
+ puts movie.rank
84
+
85
+ puts movie.thumbs_down
86
+ puts movie.thumbs_up
87
+ puts movie.thumbs_up
88
+ puts movie
89
+ end
@@ -0,0 +1,81 @@
1
+ require_relative 'movies'
2
+ require_relative 'reviewers'
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 load(from_file)
12
+ File.readlines(from_file).each do |line| #abre um arquivo de texto e lê todas as linhas e devolve um array de strings
13
+ add_movie(Movie.from_csv(line)) #cria um objeto (Movie) A PARTIR do texto do arquivo
14
+ end
15
+ end
16
+
17
+ def save(to_file="movie_rankings.csv")
18
+ File.open(to_file, "w") do |file|
19
+ @movies.sort.each do |movie|
20
+ file.puts movie.to_csv
21
+ end
22
+ end
23
+ end
24
+
25
+ def add_movie(movie)
26
+ @movies << movie # sinal de << append Significa literalmente: Pega o array @movies e adicione o objeto movie ao final dele
27
+ end
28
+
29
+
30
+ def play(viewings=1)
31
+ puts "#{@name}'s playlist: "
32
+
33
+ puts @movies.sort
34
+ snacks = SnackBar::SNACKS
35
+ puts "\nThere are #{snacks.size} snacks available in the snack bar."
36
+
37
+ snacks.each do |snakc|
38
+ puts "#{snakc.name} has #{snakc.carbs} carbs."
39
+ end
40
+
41
+ 1.upto(viewings) do |count|
42
+ puts "\nViewing #{count}"
43
+ @movies.each do |m|
44
+ Reviewer.review(m)
45
+ snack = SnackBar.random
46
+ m.ate_snack(snack)
47
+ puts m
48
+ end
49
+ end
50
+ puts "----------"
51
+ end
52
+
53
+ def total_carbs_consumed
54
+ @movies.reduce(0) do |sum, movie|
55
+ sum + movie.carbs_consumed
56
+ end
57
+ end
58
+
59
+ def print_stats
60
+ puts "\n#{@name}'s Stats:"
61
+
62
+ puts "#{total_carbs_consumed} total carbs consumed"
63
+ @movies.sort.each do |mov|
64
+ puts "\n#{mov.title}'s snack totals:"
65
+ mov.each_snack do |snac|
66
+ puts "#{snac.carbs} total #{snac.name} carbs"
67
+ end
68
+ puts "\n#{mov.carbs_consumed} grand total carbs"
69
+ end
70
+
71
+ hits, flops = @movies.partition do |movie| movie.hit? end
72
+
73
+ puts "\nHits:"
74
+ puts hits.sort
75
+
76
+ puts "\nFlops:"
77
+ puts flops.sort
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,35 @@
1
+ module Flicks
2
+ module Rankable
3
+ def thumbs_up
4
+ self.rank += 1
5
+ "#{@title} get's a thumbs up!"
6
+
7
+ end
8
+ def thumbs_down #COMPORTAMENTO expresso como método de instância
9
+ self.rank -= 1
10
+ "#{@title} get's a thumbs down!"
11
+ end
12
+
13
+ def status
14
+ hit? ? "Hit" : "Flop" #if hit? "Hit" else "Flop"
15
+ end
16
+
17
+ def hit?
18
+ self.rank >= 10
19
+ end
20
+
21
+ def <=>(other)
22
+ =begin
23
+ O .sort funciona porque o Ruby depende do método <=> para comparar objeto.Se você não implementa <=>, ele não sabe o que fazer e dá erro.
24
+ O Ruby precisa comparar os elementos do array para decidir em que ordem colocá-los.
25
+ Mas o Ruby não sabe como comparar objetos que você mesmo criou (no caso, instâncias da classe Movie).
26
+ Ele só sabe comparar números, strings, etc., que já têm <=> implementado.
27
+ =end
28
+ other.rank <=> self.rank
29
+ end
30
+
31
+ def normalized_rank
32
+ self.rank/10
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ module Flicks
2
+ module Reviewer
3
+ def self.roll_die #sorteia um número de 1 a 6
4
+ rand(1..6)
5
+ end
6
+ def self.review(movie)
7
+ number_rolled= roll_die
8
+ case number_rolled
9
+ when 1..2
10
+ movie.thumbs_down
11
+ puts "#{movie.title} got a thumbs down"
12
+ when 3..4
13
+ puts "#{movie.title} was skipped"
14
+ else
15
+ movie.thumbs_up
16
+ puts "#{movie.title} got a thumbs_up"
17
+ end
18
+ puts movie
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,40 @@
1
+ =begin
2
+ class Snack
3
+ attr_reader :name, :carbs
4
+ def initialize (name, carbs)
5
+ @name = name
6
+ @carbs = carbs
7
+ end
8
+ end
9
+ =end
10
+ module Flicks
11
+ Snack = Struct.new(:name, :carbs)
12
+
13
+
14
+ module SnackBar
15
+ SNACKS = [
16
+ Snack.new(:popcorn, 20),
17
+ Snack.new(:candy, 15),
18
+ Snack.new(:nacho, 40),
19
+ Snack.new(:pretzel, 30),
20
+ Snack.new(:soda, 5)
21
+ ]
22
+ def self.random
23
+ SNACKS.sample
24
+ end
25
+ end
26
+ end
27
+ if __FILE__ == $0
28
+ puts SnackBar::SNACKS
29
+ snack = SnackBar.random
30
+ puts "Enjoy your #{snack.name} (#{snack.carbs} carbs)"
31
+ end
32
+ =begin
33
+ popcorn = Snack.new("popcorn", 20)
34
+ puts popcorn.name
35
+ puts popcorn.carbs
36
+
37
+ candy = Snack.new("candy", 15)
38
+ puts candy.name
39
+ puts candy.carbs
40
+ =end
@@ -0,0 +1,4 @@
1
+ Glee, 25
2
+ Goonies, 9
3
+ Ghostbusters, 8
4
+ Goldfinger, 1
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flicks_alec
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - LucioAlec
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rspec
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3'
26
+ description: "\uFEFF# Flicks\n\nCommand-line app/gem to play and review movies.\n\n##
27
+ Run from source\nruby bin/flicks\n\n## Features\n- Load movies from CSV\n- Review
28
+ system (thumbs up/down)\n- Snacks & carbs tracking\n- 3D movie with wow factor\n"
29
+ email: lucioalec@gmail.com
30
+ executables:
31
+ - flicks
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - LICENSE
36
+ - README.md
37
+ - bin/flicks
38
+ - bin/flicks.rb
39
+ - bin/movie_rankings.csv
40
+ - bin/movies.csv
41
+ - bin/superhero_movies.csv
42
+ - lib/flicks/movie3d.rb
43
+ - lib/flicks/movies.rb
44
+ - lib/flicks/playlist.rb
45
+ - lib/flicks/rankable.rb
46
+ - lib/flicks/reviewers.rb
47
+ - lib/flicks/snack_bar.rb
48
+ - lib/movie_rankings.csv
49
+ licenses:
50
+ - MIT
51
+ metadata: {}
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '2.5'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubygems_version: 3.6.9
67
+ specification_version: 4
68
+ summary: Plays and reviews movies
69
+ test_files: []