spotify_rec 1.1 → 1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9daf63ceb4fca531e3c229176858b08e361a967f5e4659e8e4148986ea674f9b
4
- data.tar.gz: 74a1726add037202ce570f14395ea81938883c1fee44d322a26668dccb6effe1
3
+ metadata.gz: 832dfdbb67807131538f45562b49208797c83e0b11604cbbaa72891af354daab
4
+ data.tar.gz: cc7abdbdc29cda735fb491e2eb30c35957dd60be465f30f9e253d6c4fe8f294a
5
5
  SHA512:
6
- metadata.gz: 3646d4d9de7e2af452e6b63d73beb92018855ae502fc5cfbc7dd27de11c8887a2f4a83001430166a92d540ea548b8b348fbf89f595a22a0674afac01812a94f0
7
- data.tar.gz: b1d72a64347e2670f80b46284e4b1426f089d2f6311a24fa1a41dc71c718a0bcb6f5f50e3110d9fba0687ba366a79e6df6352c36f38c267aab94f71a92bd443e
6
+ metadata.gz: bc61791f2c2d5065b66010f991f5c625db257209562648f917f05832e8dcadb4545fe452e9c75eb30e9ff021a54e4e1be2dc97fd7f99bba0826cd65f5afb33fb
7
+ data.tar.gz: 528555fb05397d6d5106f724324d56da3e2eed96a003eed0a3ce9270640beba67f6dfb8d46724202007df0d6d059dab152945a396d2d82281523a3662f289a11
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  # gems
4
5
  require 'rspotify'
@@ -15,12 +16,14 @@ require_relative '../lib/login'
15
16
  require_relative '../lib/rec'
16
17
  require_relative '../lib/menu'
17
18
  require_relative '../lib/my_list'
19
+ require_relative '../lib/tutorial'
20
+ require_relative '../lib/error'
18
21
 
19
- #modules
22
+ # modules
20
23
  include Login
24
+ include Tutorial
21
25
 
22
- RSpotify.authenticate("712ff89a218a4e6dbe1f169e06f949b9", "e9e0517f405b4a01a1be8823126459b7")
23
- $prompt = TTY::Prompt.new
26
+ RSpotify.authenticate('712ff89a218a4e6dbe1f169e06f949b9', 'e9e0517f405b4a01a1be8823126459b7')
24
27
 
25
28
  VERSION = 1.0
26
29
 
@@ -28,27 +31,31 @@ ARGV << '--run' if ARGV.empty?
28
31
 
29
32
  options = {}
30
33
  parser = OptionParser.new do |opts|
31
- opts.banner = "Welcome to Spotify Recommendations! Usage: spotifyrec [options]".colorize(:light_green)
32
-
33
- opts.on("-v", "--version", "Display the version") do
34
- puts "Spotify Recommendations version #{VERSION}".colorize(:light_green)
35
- end
36
-
37
- opts.on("-h", "--help", "Display the help message") do
38
- puts opts
39
- exit
40
- end
41
-
42
- opts.on("-qGENRE", "--quick=GENRE", "Generate a quick recommendation with the chosen genre") do |genre|
43
- recommendations = RSpotify::Recommendations.generate(limit: 5, seed_genres: [genre])
44
- cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
45
- puts "》 RECOMMENDATIONS 《".colorize(:light_green)
46
- cleaned_recs.each { |track| puts track }
47
- end
48
-
49
- opts.on("-r", "--run", "Run the application") do
50
- Login::login
51
- end
34
+ opts.banner = 'Welcome to Spotify Recommendations! Usage: spotify_rec [options]'.colorize(:light_green)
35
+
36
+ opts.on('-v', '--version', 'Display the version') do
37
+ puts "Spotify Recommendations version #{VERSION}".colorize(:light_green)
38
+ end
39
+
40
+ opts.on('-h', '--help', 'Display the help message') do
41
+ puts opts
42
+ exit
43
+ end
44
+
45
+ opts.on('-t', '--tutorial', 'View a brief tutorial') do
46
+ Tutorial.start
47
+ end
48
+
49
+ opts.on('-qGENRE', '--quick=GENRE', 'Generate a quick recommendation with the chosen genre') do |genre|
50
+ recommendations = RSpotify::Recommendations.generate(limit: 5, seed_genres: [genre])
51
+ cleaned_recs = recommendations.tracks.map { |t| "#{t.name} by #{t.artists[0].name}" }
52
+ puts '》 RECOMMENDATIONS 《'.colorize(:light_green)
53
+ cleaned_recs.each { |track| puts track }
54
+ end
55
+
56
+ opts.on('-r', '--run', 'Run the application') do
57
+ Login.login
58
+ end
52
59
  end
53
60
 
54
- parser.parse!
61
+ parser.parse!
@@ -1,117 +1,151 @@
1
- require_relative 'menu'
2
-
3
- module Login
4
-
5
- def user
6
- return @user
7
- end
8
-
9
- def userdata
10
- path = File.join(File.dirname(File.dirname(File.absolute_path(__FILE__))))
11
- userfile = "#{path}/public/users.json"
12
- return userfile
13
- end
14
-
15
- def clear
16
- system("clear")
17
- end
18
-
19
- def initial_login
20
- clear
21
- puts " ;;;;;;;;;;;;;;;;;;;
22
- ;;;;;;;;;;;;;;;;;;;
23
- ; ;
24
- ; ;
25
- ; ;
26
- ; ;
27
- ; ;
28
- ; ;
29
- ,;;;;; ,;;;;;
30
- ;;;;;; ;;;;;;
31
- `;;;;' `;;;;'
32
- ".colorize(:light_green)
33
- puts "》 Welcome to the Spotify Recommendations App! 《".colorize(:light_green)
34
- puts
35
- return $prompt.select("Are you a new or returning user? \n", %w(New Returning))
36
- end
37
-
38
- def load_data
39
- file = File.read(userdata)
40
- return JSON.parse(file)
41
- end
42
-
43
- def gen_uid
44
- return load_data.length + 1
45
- end
46
-
47
- def store_user
48
- data = load_data
49
- user_details = {
50
- "id" => "#{@user.uid}",
51
- "username" => @user.username,
52
- "password" => @user.password,
53
- "playlist" => @user.playlist,
54
- "mylist" => @user.mylist
55
- }
56
- data << user_details
57
- File.open(userdata,"w") do |f|
58
- f.puts JSON.pretty_generate(data)
59
- end
60
- puts "You're now registered! Logging you in..".colorize(:light_green)
61
- sleep(1)
62
- @menu = Menu.new(@user)
63
- @menu.menu_router
64
- end
65
-
66
- def new_user
67
- system("clear")
68
- puts "Welcome! Please register for an account to continue.".colorize(:light_green)
69
- username = $prompt.ask("Username >") { |u| u.validate(/\A[0-9a-zA-Z'-]*\z/, "Username must only contain letters and numbers")}
70
- password = $prompt.mask("Password >")
71
- @user = User.new(username, password, gen_uid)
72
- @user_playlist = Playlist.new(@user)
73
- store_user
74
- end
75
-
76
- def returning_user
77
- system("clear")
78
- puts "Welcome back! Please login to continue.".colorize(:light_green)
79
- username = $prompt.ask("Username >")
80
- password= $prompt.mask("Password >")
81
- authenticate(username, password)
82
- end
83
-
84
- def authenticate(username, password)
85
- data = load_data
86
- auth = false
87
- data.each do |hash|
88
- if hash["username"].downcase == username.downcase
89
- if hash["password"] == password
90
- auth = true
91
- @user = User.new(username, password, hash["id"], hash["playlist"], hash["mylist"])
92
- @user_playlist = Playlist.new(@user)
93
- puts "Success! Logging you in..".colorize(:light_green)
94
- sleep(1)
95
- @menu = Menu.new(@user)
96
- @menu.menu_router
97
- end
98
- end
99
- end
100
- unless auth
101
- puts "Incorrect username or password!".colorize(:red)
102
- sleep(1)
103
- returning_user
104
- end
105
- end
106
-
107
- def login
108
- new_returning = initial_login.downcase
109
- if new_returning == "new"
110
- new_user
111
- end
112
- if new_returning == "returning"
113
- returning_user
114
- end
115
- end
116
-
117
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'menu'
4
+
5
+ module Login
6
+ @prompt = TTY::Prompt.new
7
+ @count = 0
8
+
9
+ # Login Logic Section
10
+ def initial_login
11
+ clear
12
+ ascii_art
13
+ puts '》 Welcome to the Spotify Recommendations App! 《'.colorize(:light_green)
14
+ puts
15
+ @prompt.select("Are you a new or returning user? \n", %w[New Returning])
16
+ end
17
+
18
+ def login
19
+ new_returning = initial_login.downcase
20
+ new_user if new_returning == 'new'
21
+ returning_user if new_returning == 'returning'
22
+ end
23
+
24
+ # New user
25
+
26
+ def new_user
27
+ system('clear')
28
+ File.open(userdata, 'w') { |f| f.write([].to_json) } unless File.exist?(userdata)
29
+ puts 'Welcome! Please register for an account to continue.'.colorize(:light_green)
30
+ username = @prompt.ask('Username >')
31
+ raise RequirementError.new, 'Requirements not met' if username.match?(/[!@#$%^&*(),.?":{}|<>]/)
32
+
33
+ new_user_password(username)
34
+ rescue RequirementError
35
+ puts 'Username cannot contain special characters. Please try again!'.colorize(:light_red)
36
+ new_user
37
+ end
38
+
39
+ def new_user_password(username)
40
+ password = @prompt.mask('Password >')
41
+ raise RequirementError.new, 'Requirements not met' if password.match?(/[!@#$%^&*(),.?":{}|<>]/)
42
+
43
+ @user = User.new(username, password, gen_uid)
44
+ @user_playlist = Playlist.new(@user)
45
+ store_user
46
+ rescue RequirementError
47
+ puts 'Password cannot contain special characters. Please try again!'.colorize(:light_red)
48
+ end
49
+
50
+ def store_user
51
+ data = load_data
52
+ user_details = {
53
+ 'id' => @user.uid.to_s,
54
+ 'username' => @user.username,
55
+ 'password' => @user.password,
56
+ 'playlist' => @user.playlist,
57
+ 'mylist' => @user.mylist
58
+ }
59
+ data << user_details
60
+ write_user(data)
61
+ end
62
+
63
+ def write_user(data)
64
+ File.open(userdata, 'w') do |f|
65
+ f.puts JSON.pretty_generate(data)
66
+ end
67
+ puts "You're now registered! Logging you in..".colorize(:light_green)
68
+ sleep(1)
69
+ go_to_menu
70
+ end
71
+
72
+ # Returning user
73
+
74
+ def returning_user
75
+ system('clear')
76
+ File.open(userdata, 'w') { |f| f.write([].to_json) } unless File.exist?(userdata)
77
+ puts 'Welcome back! Please login to continue.'.colorize(:light_green)
78
+ username = @prompt.ask('Username >')
79
+ user_password = @prompt.mask('Password >')
80
+ authenticate(username, user_password)
81
+ end
82
+
83
+ def authenticate(username, user_password)
84
+ data_arr = load_data
85
+ user_data(data_arr, username, user_password)
86
+ end
87
+
88
+ def user_data(data, username, user_password)
89
+ data.each do |hash|
90
+ next unless hash['username'].downcase == username.downcase
91
+
92
+ next unless hash['password'] == user_password
93
+
94
+ @user = User.new(username, user_password, hash['id'], hash['playlist'], hash['mylist'])
95
+ go_to_menu
96
+ end
97
+ @count += 1
98
+ no_auth
99
+ end
100
+
101
+ def no_auth
102
+ puts 'Incorrect username or password!'.colorize(:red)
103
+ sleep(1)
104
+ if @count >= 3
105
+ puts 'You have tried too many times! The application will now close..'.colorize(:light_red)
106
+ exit
107
+ end
108
+ returning_user
109
+ end
110
+
111
+ # Helper Module Methods
112
+
113
+ def user
114
+ @user
115
+ end
116
+
117
+ def gen_uid
118
+ load_data.length + 1
119
+ end
120
+
121
+ def userdata
122
+ path = File.join(File.dirname(File.dirname(File.absolute_path(__FILE__))))
123
+ "#{path}/public/users.json"
124
+ end
125
+
126
+ def load_data
127
+ file = File.read(userdata)
128
+ JSON.parse(file)
129
+ end
130
+
131
+ def clear
132
+ system('clear')
133
+ end
134
+
135
+ def go_to_menu
136
+ menu = Menu.new(@user)
137
+ menu.menu_router
138
+ end
139
+
140
+ def ascii_art
141
+ puts " ;;;;;;;;;;;;;;;;;;;
142
+ ; ;
143
+ ; ;
144
+ ; ;
145
+ ; ;
146
+ ; ;
147
+ ,;;;;; ,;;;;;
148
+ ;;;;;; ;;;;;;
149
+ `;;;;' `;;;;'\n".colorize(:light_green)
150
+ end
151
+ end
@@ -1,67 +1,90 @@
1
- class Menu
2
-
3
- def initialize(user)
4
- @user = user
5
- @prompt = prompt = TTY::Prompt.new
6
- @playlist = Playlist.new(@user)
7
- end
8
-
9
- def display_menu
10
- system("clear")
11
- return @prompt.select("》 MAIN MENU 《\n".colorize(:light_green), (["My List", "Recommendations", "Playlist", "Account Details", "Exit"]))
12
- end
13
-
14
- def my_list
15
- system("clear")
16
- selection = @prompt.select("》 MY LIST 《\n".colorize(:light_green), (["Display", "Add", "Remove", "Back"]))
17
- mylist = MyList.new(@user)
18
- case selection
19
- when "Display"
20
- mylist.list
21
- when "Add"
22
- mylist.add_to_list
23
- when "Remove"
24
- mylist.remove_from_list
25
- when "Back"
26
- menu_router
27
- end
28
- end
29
-
30
- def account_details
31
- system("clear")
32
- selection = @prompt.select("》 ACCOUNT MENU 《 \n".colorize(:light_green), (["View Details", "Change Username", "Change Password", "Delete Account", "Back"]))
33
- case selection
34
- when "View Details"
35
- @user.details
36
- when "Change Username"
37
- username = @prompt.ask("Please enter your new username >") { |u| u.validate(/\A[0-9a-zA-Z'-]*\z/, "Username must only contain letters and numbers")}
38
- @user.change_username(username)
39
- when "Change Password"
40
- password = @prompt.ask("Please enter your new password >")
41
- @user.change_password(password)
42
- when "Delete Account"
43
- @user.delete_account
44
- when "Back"
45
- menu_router
46
- end
47
- end
48
-
49
- def menu_router
50
- selection = display_menu
51
- case selection
52
- when "My List"
53
- system("clear")
54
- my_list
55
- when "Recommendations"
56
- recommendation = Rec.new(@user)
57
- recommendation.amount_of_suggestions
58
- when "Playlist"
59
- @playlist.menu
60
- when "Account Details"
61
- account_details
62
- when "Exit"
63
- exit
64
- end
65
- end
66
-
67
- end
1
+ # frozen_string_literal: true
2
+
3
+ class Menu
4
+ def initialize(user)
5
+ @user = user
6
+ @prompt = TTY::Prompt.new
7
+ @playlist = Playlist.new(@user)
8
+ end
9
+
10
+ def display_menu
11
+ system('clear')
12
+ arr = ['My List', 'Recommendations', 'Playlist', 'Account Details', 'Exit']
13
+ @prompt.select("》 MAIN MENU 《\n".colorize(:light_green), arr)
14
+ end
15
+
16
+ def menu_router
17
+ selection = display_menu
18
+ case selection
19
+ when 'My List'
20
+ my_list
21
+ when 'Recommendations'
22
+ recommendation = Rec.new(@user)
23
+ recommendation.amount_of_suggestions
24
+ else
25
+ case_menu(selection)
26
+ end
27
+ end
28
+
29
+ def case_menu(selection)
30
+ case selection
31
+ when 'Playlist'
32
+ @playlist.menu
33
+ when 'Account Details'
34
+ account_details
35
+ when 'Exit'
36
+ exit
37
+ end
38
+ end
39
+
40
+ def my_list
41
+ system('clear')
42
+ selection = @prompt.select("》 MY LIST 《\n".colorize(:light_green), %w[Display Add Remove Back])
43
+ mylist = MyList.new(@user)
44
+ case_my_list(selection, mylist)
45
+ end
46
+
47
+ def case_my_list(selection, mylist)
48
+ case selection
49
+ when 'Display'
50
+ mylist.list
51
+ when 'Add'
52
+ mylist.add_to_list
53
+ when 'Remove'
54
+ mylist.remove_from_list
55
+ when 'Back'
56
+ menu_router
57
+ end
58
+ end
59
+
60
+ def account_details_select
61
+ system('clear')
62
+ arr = ['View Details', 'Change Username', 'Change Password', 'Delete Account', 'Back']
63
+ @prompt.select('》 ACCOUNT DETAILS 《\n'.colorize(:light_green), arr)
64
+ end
65
+
66
+ def account_details
67
+ selection = account_details_select
68
+ case selection
69
+ when 'View Details'
70
+ @user.details
71
+ when 'Change Username'
72
+ username = @prompt.ask('Please enter your new username >')
73
+ @user.change_username(username)
74
+ else
75
+ case_account_details(selection)
76
+ end
77
+ end
78
+
79
+ def case_account_details(selection)
80
+ case selection
81
+ when 'Change Password'
82
+ password = @prompt.ask('Please enter your new password >')
83
+ @user.change_password(password)
84
+ when 'Delete Account'
85
+ @user.delete_account
86
+ when 'Back'
87
+ menu_router
88
+ end
89
+ end
90
+ end