From b82e41ffcbefd9f3b37102824be57da40667f555 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Mon, 23 Sep 2024 10:51:48 -0700 Subject: [PATCH 01/30] Message added in README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba28bf2ab..1b774bd70 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Viewing Party ## Skills Assessed - +# Hi Anh :) --> --> Solving problems with... - Conditional logic From 6eabeb8873a2a325ab4951761332a73c5f0a71ea Mon Sep 17 00:00:00 2001 From: anhtran Date: Mon, 23 Sep 2024 10:54:50 -0700 Subject: [PATCH 02/30] Updated message in README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1b774bd70..3cdc50cd6 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ ## Skills Assessed # Hi Anh :) --> --> +### Hi Jenny. It's so great to work with you! Solving problems with... - Conditional logic From 23a67e3d184f305477a56e76ed7927c7d850d8f5 Mon Sep 17 00:00:00 2001 From: anhtran Date: Mon, 23 Sep 2024 13:20:21 -0700 Subject: [PATCH 03/30] Update on function create_movie --- README.md | 3 +-- tests/test_wave_01.py | 22 +++++++++++----------- viewing_party/party.py | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 3cdc50cd6..ba28bf2ab 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # Viewing Party ## Skills Assessed -# Hi Anh :) --> --> -### Hi Jenny. It's so great to work with you! + Solving problems with... - Conditional logic diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 669efee6a..e63e69247 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -4,7 +4,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() def test_create_successful_movie(): # Arrange movie_title = MOVIE_TITLE_1 @@ -19,7 +19,7 @@ def test_create_successful_movie(): assert new_movie["genre"] == GENRE_1 assert new_movie["rating"] == pytest.approx(RATING_1) -@pytest.mark.skip() +# @pytest.mark.skip() def test_create_no_title_movie(): # Arrange movie_title = None @@ -32,7 +32,7 @@ def test_create_no_title_movie(): # Assert assert new_movie is None -@pytest.mark.skip() +# @pytest.mark.skip() def test_create_no_genre_movie(): # Arrange movie_title = "Title A" @@ -45,7 +45,7 @@ def test_create_no_genre_movie(): # Assert assert new_movie is None -@pytest.mark.skip() +#@pytest.mark.skip() def test_create_no_rating_movie(): # Arrange movie_title = "Title A" @@ -58,7 +58,7 @@ def test_create_no_rating_movie(): # Assert assert new_movie is None -@pytest.mark.skip() +#@pytest.mark.skip() def test_adds_movie_to_user_watched(): # Arrange movie = { @@ -79,7 +79,7 @@ def test_adds_movie_to_user_watched(): assert updated_data["watched"][0]["genre"] == GENRE_1 assert updated_data["watched"][0]["rating"] == RATING_1 -@pytest.mark.skip() +#@pytest.mark.skip() def test_adds_movie_to_non_empty_user_watched(): # Arrange movie = { @@ -99,7 +99,7 @@ def test_adds_movie_to_non_empty_user_watched(): assert movie in updated_data["watched"] assert FANTASY_2 in updated_data["watched"] -@pytest.mark.skip() +#@pytest.mark.skip() def test_adds_movie_to_user_watchlist(): # Arrange movie = { @@ -120,7 +120,7 @@ def test_adds_movie_to_user_watchlist(): assert updated_data["watchlist"][0]["genre"] == GENRE_1 assert updated_data["watchlist"][0]["rating"] == RATING_1 -@pytest.mark.skip() +#@pytest.mark.skip() def test_adds_movie_to_non_empty_user_watchlist(): # Arrange movie = { @@ -140,7 +140,7 @@ def test_adds_movie_to_non_empty_user_watchlist(): assert movie in updated_data["watchlist"] assert FANTASY_2 in updated_data["watchlist"] -@pytest.mark.skip() +#@pytest.mark.skip() def test_moves_movie_from_watchlist_to_empty_watched(): # Arrange janes_data = { @@ -164,7 +164,7 @@ def test_moves_movie_from_watchlist_to_empty_watched(): # ****** Add assertions here to test that the correct movie was added to "watched" ********** # ******************************************************************************************* -@pytest.mark.skip() +#@pytest.mark.skip() def test_moves_movie_from_watchlist_to_watched(): # Arrange movie_to_watch = HORROR_1 @@ -188,7 +188,7 @@ def test_moves_movie_from_watchlist_to_watched(): # ****** Add assertions here to test that the correct movie was added to "watched" ********** # ******************************************************************************************* -@pytest.mark.skip() +#@pytest.mark.skip() def test_does_nothing_if_movie_not_in_watchlist(): # Arrange movie_to_watch = HORROR_1 diff --git a/viewing_party/party.py b/viewing_party/party.py index 6d34a6b5f..4147a01c5 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -1,12 +1,43 @@ # ------------- WAVE 1 -------------------- def create_movie(title, genre, rating): - pass + """ + Create a dictionary representing a movie + + Parameters: + title(str): the title of movie + genre (str): the genre of movie + rating (float): the rating of movie + + Returns: + dict: with keys "title", "genre", "rating" if all arguments are truthy + None: if any of arguments are falsy + """ + # Psuedocode: + + try: + # Checking if user inputs on these parameters are all valid. + title = str(title) + genre = str(genre) + rating = float(rating) + + # Need to check the type of tittle and genre are string and rating are int + if title and genre and rating: + return {"title": title, "genre": genre, "rating": rating} + + except ValueError and TypeError as e: + print(e) + return None + +print(create_movie(None, "Horror", 3.5)) + + + # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- - + # ----------------------------------------- # ------------- WAVE 3 -------------------- From 6ef016bbdd2d84a7dc7f5355a527640c84b196d9 Mon Sep 17 00:00:00 2001 From: anhtran Date: Mon, 23 Sep 2024 13:50:18 -0700 Subject: [PATCH 04/30] change the logic to check the None first --- viewing_party/party.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 4147a01c5..95bf95f40 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -15,22 +15,22 @@ def create_movie(title, genre, rating): """ # Psuedocode: - + if title or genre or rating is None: + return None + try: # Checking if user inputs on these parameters are all valid. title = str(title) genre = str(genre) rating = float(rating) - # Need to check the type of tittle and genre are string and rating are int - if title and genre and rating: - return {"title": title, "genre": genre, "rating": rating} + return {"title": title, "genre": genre, "rating": rating} except ValueError and TypeError as e: print(e) return None -print(create_movie(None, "Horror", 3.5)) +print(create_movie(None,"None", 3.5)) From 6cb7c4b4331282a4ceb3d5c138768a4771317b39 Mon Sep 17 00:00:00 2001 From: anhtran Date: Mon, 23 Sep 2024 23:13:28 -0700 Subject: [PATCH 05/30] Update Wave1 and Test_wave_01 --- tests/test_wave_01.py | 14 +++++-- viewing_party/party.py | 92 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 89 insertions(+), 17 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index e63e69247..8516d85ba 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -159,11 +159,16 @@ def test_moves_movie_from_watchlist_to_empty_watched(): assert len(updated_data["watchlist"]) == 0 assert len(updated_data["watched"]) == 1 - raise Exception("Test needs to be completed.") + # raise Exception("Test needs to be completed.") # ******************************************************************************************* # ****** Add assertions here to test that the correct movie was added to "watched" ********** # ******************************************************************************************* - + assert updated_data["watched"] == [{ + "title": MOVIE_TITLE_1, + "genre": GENRE_1, + "rating": RATING_1 + }] + #@pytest.mark.skip() def test_moves_movie_from_watchlist_to_watched(): # Arrange @@ -181,12 +186,13 @@ def test_moves_movie_from_watchlist_to_watched(): # Assert assert len(updated_data["watchlist"]) == 1 - assert len(updated_data["watched"]) == 2 + assert len(updated_data["watched"]) == 2 - raise Exception("Test needs to be completed.") + # raise Exception("Test needs to be completed.") # ******************************************************************************************* # ****** Add assertions here to test that the correct movie was added to "watched" ********** # ******************************************************************************************* + assert updated_data["watched"] == [FANTASY_2, HORROR_1] #@pytest.mark.skip() def test_does_nothing_if_movie_not_in_watchlist(): diff --git a/viewing_party/party.py b/viewing_party/party.py index 95bf95f40..253648b50 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -13,31 +13,97 @@ def create_movie(title, genre, rating): dict: with keys "title", "genre", "rating" if all arguments are truthy None: if any of arguments are falsy """ - - # Psuedocode: - if title or genre or rating is None: + + if not title or not genre or not rating: return None try: # Checking if user inputs on these parameters are all valid. - title = str(title) - genre = str(genre) - rating = float(rating) + if not isinstance(title, str) or not isinstance(genre, str) \ + or not isinstance(rating, float): + return None + else: + return {"title": title, "genre": genre, "rating": rating} - return {"title": title, "genre": genre, "rating": rating} - - except ValueError and TypeError as e: + except Exception as e: print(e) return None -print(create_movie(None,"None", 3.5)) - - +def add_to_watched(user_data, movie): + """ + Add a movie to user's watched list + + Parameters: + user_data (dict): with a key "watched" + and values is a list of dictionaries movies they have watched + or empty list represent no movies have watched + movie (dict): { + "title": "Title A", + "genre": "Horror", + "rating": 3.5 + } + + Return: + user_data ("watched" list of movies) + """ + + try: + + user_data["watched"].append(movie) + return user_data + + except Exception as e: + print(e) + +def add_to_watchlist(user_data, movies): + """ + Add a movie to user's watchlist + + Parameters: + user_data (dict): with a key "watchlist" + and values is a list of dictionaries movies user wants to watch + or empty list represent no movies in watchlist + movie (dict): { + "title": "Title A", + "genre": "Horror", + "rating": 3.5 + } + + Return: + user_data (watchlist of movies) + """ + try: + user_data["watchlist"].append(movies) + return user_data + except Exception as e: + print (e) + +def watch_movie(user_data, title): + """ + Parameters: + user_data (dict): with two keys "watchlist" and "watched" + + title (str): represent title of movie user has watched + Return: + if title is in a movie in user's watchlist: + remove from watchlist + add to watched + return user_data + if not in watchlist: + return user_data + """ + for movie in user_data["watchlist"]: + if title == movie["title"]: + user_data["watchlist"].remove(movie) + user_data["watched"].append(movie) + + return user_data + # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- - + # ----------------------------------------- # ------------- WAVE 3 -------------------- From 1abda1dd1e37fdb5c765ae631124801852acaefc Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 08:11:35 -0700 Subject: [PATCH 06/30] Updated wave2 abd passed 2 tests --- tests/test_wave_02.py | 4 ++-- viewing_party/party.py | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index 19f045c79..acd7c877c 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() def test_calculates_watched_average_rating(): # Arrange janes_data = clean_wave_2_data() @@ -14,7 +14,7 @@ def test_calculates_watched_average_rating(): assert average == pytest.approx(3.58333) assert janes_data == clean_wave_2_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_empty_watched_average_rating_is_zero(): # Arrange janes_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index 253648b50..ff0ec2fa6 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -25,6 +25,7 @@ def create_movie(title, genre, rating): else: return {"title": title, "genre": genre, "rating": rating} + # very general and we dont intend to reading except Exception as e: print(e) return None @@ -103,8 +104,31 @@ def watch_movie(user_data, title): # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- +def get_watched_avg_rating(user_data): + """ + function calculate and return average rating + + Parameters: + user_data (dict): "watched" list of movie dictionaries. + + Notes: + if average rating of empty watched list if 0.0 + + Returns: + Average rating (float) + """ + total_rating = 0 + movies = 0 + for movie in user_data["watched"]: + movies += 1 + total_rating += movie["rating"] + + if movies > 0: + average_rating = total_rating/movies + else: + average_rating = 0.0 - + return average_rating # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- From 26fd9d6251c42ec147d62fab80095184755faf29 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 08:12:44 -0700 Subject: [PATCH 07/30] Function added in wave 2 part one. --- viewing_party/party.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 253648b50..651134bc1 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -99,11 +99,27 @@ def watch_movie(user_data, title): user_data["watched"].append(movie) return user_data - -# ----------------------------------------- + + # ------------- WAVE 2 -------------------- -# ----------------------------------------- +def get_watched_avg_rating(user_data): + + # user_data_copy = user_data.copy() + rate_sum = 0 + index = 0 + + # Loop through each item and sum the ratings + for item in user_data["raiting"]: + rate_sum += item["raiting"] + index += 1 + # Calculate average rating + if user_data["raiting"] > 0: + average_rating = rate_sum / index + else: + average_rating = 0.0 + + return average_rating # ----------------------------------------- # ------------- WAVE 3 -------------------- From 8684737c493ea8c94feda6f69c3338b172efb1bf Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 09:11:26 -0700 Subject: [PATCH 08/30] Remove all try except block --- viewing_party/party.py | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index ff0ec2fa6..4ceed053b 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -17,18 +17,13 @@ def create_movie(title, genre, rating): if not title or not genre or not rating: return None - try: - # Checking if user inputs on these parameters are all valid. - if not isinstance(title, str) or not isinstance(genre, str) \ - or not isinstance(rating, float): - return None - else: - return {"title": title, "genre": genre, "rating": rating} - - # very general and we dont intend to reading - except Exception as e: - print(e) + # Checking if user inputs on these parameters are all valid. + if not isinstance(title, str) or not isinstance(genre, str) \ + or not isinstance(rating, float): return None + else: + return {"title": title, "genre": genre, "rating": rating} + def add_to_watched(user_data, movie): """ @@ -47,15 +42,10 @@ def add_to_watched(user_data, movie): Return: user_data ("watched" list of movies) """ - - try: - - user_data["watched"].append(movie) - return user_data - - except Exception as e: - print(e) - + + user_data["watched"].append(movie) + return user_data + def add_to_watchlist(user_data, movies): """ Add a movie to user's watchlist @@ -73,13 +63,9 @@ def add_to_watchlist(user_data, movies): Return: user_data (watchlist of movies) """ - try: - user_data["watchlist"].append(movies) - return user_data + user_data["watchlist"].append(movies) + return user_data - except Exception as e: - print (e) - def watch_movie(user_data, title): """ Parameters: From c95ba32dc7e57951054fc05d6f9647aa94438696 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 09:33:14 -0700 Subject: [PATCH 09/30] Part 2 of wave 2 in progress. --- viewing_party/party.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/viewing_party/party.py b/viewing_party/party.py index c1a1f3eb4..58e6104cf 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -115,6 +115,20 @@ def get_watched_avg_rating(user_data): average_rating = 0.0 return average_rating + +""" +Part two +""" +def get_most_watched_genre(user_data): + genres ={} + + # Return None if there is no value in "watched." + if user_data["watched"] == []: + return None + # Add and count the genres found. + for movie in user_data["watched"]: + genres[movie["genre"]] += 1 + # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- From 020fd7caedccdea37d76985ddfd2f5075790bda9 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 12:50:29 -0700 Subject: [PATCH 10/30] Update to secong part of wave 2. --- viewing_party/party.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/viewing_party/party.py b/viewing_party/party.py index 58e6104cf..67c3e97f8 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -129,6 +129,17 @@ def get_most_watched_genre(user_data): for movie in user_data["watched"]: genres[movie["genre"]] += 1 + max_rate = 0 + genre = None + + for key, rate in genres.items(): + if rate > max_rate: + genre = key + max_rate = rate + + return genre + + # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- From 4ff691d34b188286a2ad62066a18661e23087da6 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 12:53:17 -0700 Subject: [PATCH 11/30] Update to secong part of wave 2. --- viewing_party/party.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 67c3e97f8..712fc3083 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -129,9 +129,10 @@ def get_most_watched_genre(user_data): for movie in user_data["watched"]: genres[movie["genre"]] += 1 + max_rate = 0 genre = None - + # Comparing the rates and returning the most frequenty genre. for key, rate in genres.items(): if rate > max_rate: genre = key From 2ce4f0de2e18d4da10997c196a1555e0c564b9fe Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 13:51:39 -0700 Subject: [PATCH 12/30] Fixing wave 2 together and passed the test --- tests/test_wave_02.py | 6 +++--- viewing_party/party.py | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index acd7c877c..64b62729d 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -27,7 +27,7 @@ def test_empty_watched_average_rating_is_zero(): # Assert assert average == pytest.approx(0.0) -@pytest.mark.skip() +# @pytest.mark.skip() def test_most_watched_genre(): # Arrange janes_data = clean_wave_2_data() @@ -39,7 +39,7 @@ def test_most_watched_genre(): assert popular_genre == "Fantasy" assert janes_data == clean_wave_2_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_most_watched_genre_order_mixed(): # Arrange janes_data = clean_wave_2b_data() @@ -51,7 +51,7 @@ def test_most_watched_genre_order_mixed(): assert popular_genre == "Fantasy" assert janes_data == clean_wave_2b_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_genre_is_None_if_empty_watched(): # Arrange janes_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index 712fc3083..0b1d6aacf 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -120,16 +120,25 @@ def get_watched_avg_rating(user_data): Part two """ def get_most_watched_genre(user_data): - genres ={} + genres = {} # Return None if there is no value in "watched." if user_data["watched"] == []: return None # Add and count the genres found. for movie in user_data["watched"]: - genres[movie["genre"]] += 1 - + genre = movie["genre"] + if genre not in genres: + genres[genre] = 1 + else: + genres[genre] += 1 + + Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} + Keymax = max(zip(Tv.values(), Tv.keys()))[1] + print(Keymax) + + max_rate = 0 genre = None # Comparing the rates and returning the most frequenty genre. @@ -144,7 +153,8 @@ def get_most_watched_genre(user_data): # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- - +def get_unique_watched (user_data): + # ----------------------------------------- # ------------- WAVE 4 -------------------- From 7dc56f792cc26de1161e3dc97e9311bd6990c484 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 14:36:02 -0700 Subject: [PATCH 13/30] Function for wage 4 added. --- viewing_party/party.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 0b1d6aacf..6a863c0b1 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -133,12 +133,11 @@ def get_most_watched_genre(user_data): else: genres[genre] += 1 - Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} + # Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} - Keymax = max(zip(Tv.values(), Tv.keys()))[1] - print(Keymax) + # Keymax = max(zip(Tv.values(), Tv.keys()))[1] + # print(Keymax) - max_rate = 0 genre = None # Comparing the rates and returning the most frequenty genre. @@ -154,8 +153,15 @@ def get_most_watched_genre(user_data): # ------------- WAVE 3 -------------------- # ----------------------------------------- def get_unique_watched (user_data): - - + + user_watched = user_data["watched"] + friends_watched = [] + + for friends in user_data["friends"]: + for movie in friends["watched"]: + friends_watched.append(movie["title"]) + + # ----------------------------------------- # ------------- WAVE 4 -------------------- # ----------------------------------------- From 1f3d02af19abadfc9e0bff840204446d96f4fcde Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 14:37:07 -0700 Subject: [PATCH 14/30] Nothing changes on my side --- viewing_party/party.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 0b1d6aacf..3f5532005 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -120,6 +120,17 @@ def get_watched_avg_rating(user_data): Part two """ def get_most_watched_genre(user_data): + """ + Get the most frequently watched genre from user's watched movies + + Parameter: + user_data (dict): + the key "watched" is a list of dictionaries, where each dictionary represent a movie + each movie dict contains a key "genre" (str) + Returns: + str: the genre that user watched frequently + None: if "watched" list is empty + """ genres = {} # Return None if there is no value in "watched." @@ -133,10 +144,10 @@ def get_most_watched_genre(user_data): else: genres[genre] += 1 - Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} + # Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} - Keymax = max(zip(Tv.values(), Tv.keys()))[1] - print(Keymax) + # Keymax = max(zip(Tv.values(), Tv.keys()))[1] + # print(Keymax) max_rate = 0 @@ -153,7 +164,7 @@ def get_most_watched_genre(user_data): # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- -def get_unique_watched (user_data): + # ----------------------------------------- From fda08259d1a19697e1781ac7d901c2ad25e7f373 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 15:18:01 -0700 Subject: [PATCH 15/30] Second part of wave 3 added. --- tests/test_wave_03.py | 14 ++++++++------ viewing_party/party.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index 046429360..f7a035217 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() def test_my_unique_movies(): # Arrange amandas_data = clean_wave_3_data() @@ -16,7 +16,7 @@ def test_my_unique_movies(): assert INTRIGUE_2 in amandas_unique_movies assert amandas_data == clean_wave_3_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_my_not_unique_movies(): # Arrange amandas_data = clean_wave_3_data() @@ -28,7 +28,7 @@ def test_my_not_unique_movies(): # Assert assert len(amandas_unique_movies) == 0 -@pytest.mark.skip() +# @pytest.mark.skip() def test_friends_unique_movies(): # Arrange amandas_data = clean_wave_3_data() @@ -43,7 +43,7 @@ def test_friends_unique_movies(): assert FANTASY_4 in friends_unique_movies assert amandas_data == clean_wave_3_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_friends_unique_movies_not_duplicated(): # Arrange amandas_data = clean_wave_3_data() @@ -55,12 +55,14 @@ def test_friends_unique_movies_not_duplicated(): # Assert assert len(friends_unique_movies) == 3 - raise Exception("Test needs to be completed.") + # raise Exception("Test needs to be completed.") # ************************************************************************************************* # ****** Add assertions here to test that the correct movies are in friends_unique_movies ********** # ************************************************************************************************** -@pytest.mark.skip() + assert friends_unique_movies == [INTRIGUE_1] + +# @pytest.mark.skip() def test_friends_not_unique_movies(): # Arrange amandas_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index b37283847..3a5ee9fd4 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -165,13 +165,40 @@ def get_most_watched_genre(user_data): # ------------- WAVE 3 -------------------- # ----------------------------------------- - +def get_unique_watched(user_data): user_watched = user_data["watched"] friends_watched = [] for friends in user_data["friends"]: for movie in friends["watched"]: friends_watched.append(movie["title"]) + + unique_watched = [] + + for movie in user_watched: + if movie ["title"] not in friends_watched: + unique_watched.append(movie) + + return unique_watched + +def get_friends_unique_watched(user_data): + user_watched_title = [] + friends_watched_title = [] + + for movie in user_data["watched"]: + user_watched_title.append(movie["title"]) + + for friends in user_data["friends"]: + for movie in friends["watched"]: + friends_watched_title.append(movie["title"]) + + unique_friends_watched = [] + + for title in friends_watched_title: + if title not in user_watched_title: + unique_friends_watched.append(title) + + return unique_friends_watched # ----------------------------------------- From e9db33c2aebc8311798762eb3ab51cd464316bcf Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 15:36:10 -0700 Subject: [PATCH 16/30] Assert added in wave 3. --- viewing_party/party.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 3a5ee9fd4..66f0dc7a1 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -190,13 +190,13 @@ def get_friends_unique_watched(user_data): for friends in user_data["friends"]: for movie in friends["watched"]: - friends_watched_title.append(movie["title"]) + friends_watched_title.append(movie) unique_friends_watched = [] - for title in friends_watched_title: - if title not in user_watched_title: - unique_friends_watched.append(title) + for movie in friends_watched_title: + if movie["title"] not in user_watched_title and movie not in unique_friends_watched: + unique_friends_watched.append(movie) return unique_friends_watched From dd97dc3c3b1615cfe20ea66f5ccfac48ea748185 Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 19:37:48 -0700 Subject: [PATCH 17/30] remove title as a key and fix line 63 for test wave 3 --- tests/test_wave_03.py | 2 +- viewing_party/party.py | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index f7a035217..7fbb684fe 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -60,7 +60,7 @@ def test_friends_unique_movies_not_duplicated(): # ****** Add assertions here to test that the correct movies are in friends_unique_movies ********** # ************************************************************************************************** - assert friends_unique_movies == [INTRIGUE_1] + assert friends_unique_movies == [FANTASY_4, HORROR_1, INTRIGUE_3] # @pytest.mark.skip() def test_friends_not_unique_movies(): diff --git a/viewing_party/party.py b/viewing_party/party.py index 66f0dc7a1..f2c301eef 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -169,33 +169,32 @@ def get_unique_watched(user_data): user_watched = user_data["watched"] friends_watched = [] - for friends in user_data["friends"]: - for movie in friends["watched"]: - friends_watched.append(movie["title"]) + for friend in user_data["friends"]: + # for movie in friend["watched"]: + friends_watched.extend(friend["watched"]) unique_watched = [] for movie in user_watched: - if movie ["title"] not in friends_watched: + if movie not in friends_watched: unique_watched.append(movie) return unique_watched def get_friends_unique_watched(user_data): - user_watched_title = [] - friends_watched_title = [] + user_watched = [] + friends_watched= [] for movie in user_data["watched"]: - user_watched_title.append(movie["title"]) + user_watched.append(movie) - for friends in user_data["friends"]: - for movie in friends["watched"]: - friends_watched_title.append(movie) + for friend in user_data["friends"]: + friends_watched.extend(friend["watched"]) unique_friends_watched = [] - for movie in friends_watched_title: - if movie["title"] not in user_watched_title and movie not in unique_friends_watched: + for movie in friends_watched: + if movie not in user_watched and movie not in unique_friends_watched: unique_friends_watched.append(movie) return unique_friends_watched From 7b53c0f8c62f891da09321d6daa64fddfc519106 Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 20:08:30 -0700 Subject: [PATCH 18/30] create helper function and fix code in wave 3 and 4 --- tests/test_wave_04.py | 6 +++--- viewing_party/party.py | 38 ++++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/tests/test_wave_04.py b/tests/test_wave_04.py index 499669077..0b0b3c7e2 100644 --- a/tests/test_wave_04.py +++ b/tests/test_wave_04.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() def test_get_available_friend_rec(): # Arrange amandas_data = clean_wave_4_data() @@ -16,7 +16,7 @@ def test_get_available_friend_rec(): assert FANTASY_4b in recommendations assert amandas_data == clean_wave_4_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_no_available_friend_recs(): # Arrange amandas_data = { @@ -38,7 +38,7 @@ def test_no_available_friend_recs(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +# @pytest.mark.skip() def test_no_available_friend_recs_watched_all(): # Arrange amandas_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index f2c301eef..e389d0f2e 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -164,14 +164,17 @@ def get_most_watched_genre(user_data): # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- +def get_friends_watched(user_data): + friends_watched= [] + + for friend in user_data["friends"]: + friends_watched.extend(friend["watched"]) + + return friends_watched def get_unique_watched(user_data): user_watched = user_data["watched"] - friends_watched = [] - - for friend in user_data["friends"]: - # for movie in friend["watched"]: - friends_watched.extend(friend["watched"]) + friends_watched = get_friends_watched(user_data) unique_watched = [] @@ -182,14 +185,8 @@ def get_unique_watched(user_data): return unique_watched def get_friends_unique_watched(user_data): - user_watched = [] - friends_watched= [] - - for movie in user_data["watched"]: - user_watched.append(movie) - - for friend in user_data["friends"]: - friends_watched.extend(friend["watched"]) + user_watched = user_data["watched"] + friends_watched = get_friends_watched(user_data) unique_friends_watched = [] @@ -203,7 +200,20 @@ def get_friends_unique_watched(user_data): # ----------------------------------------- # ------------- WAVE 4 -------------------- # ----------------------------------------- - +def get_available_recs (user_data): + user_watched = user_data["watched"] + friends_watched = get_friends_watched(user_data) + ### loop through friends' values, find each friend's movie who has the movie that user has not watched and host in user_data["subscription"] + + recommended_movies = [] + for movie in friends_watched: + if movie not in user_watched and movie["host"] in user_data["subscriptions"] \ + and movie not in recommended_movies: + recommended_movies.append(movie) + + return recommended_movies + + # ----------------------------------------- # ------------- WAVE 5 -------------------- # ----------------------------------------- From 60271599b368db3fa9390ccd2e9b427e9b7db41b Mon Sep 17 00:00:00 2001 From: anhtran Date: Tue, 24 Sep 2024 21:27:43 -0700 Subject: [PATCH 19/30] Updated wave 5 and the test --- tests/test_wave_05.py | 22 +++++++----- viewing_party/party.py | 81 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 10 deletions(-) diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index b2ba9ad33..b17db57b4 100644 --- a/tests/test_wave_05.py +++ b/tests/test_wave_05.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# #@pytest.mark.skip() def test_new_genre_rec(): # Arrange sonyas_data = clean_wave_5_data() @@ -17,7 +17,7 @@ def test_new_genre_rec(): assert FANTASY_4b in recommendations assert sonyas_data == clean_wave_5_data() -@pytest.mark.skip() +# #@pytest.mark.skip() def test_new_genre_rec_from_empty_watched(): # Arrange sonyas_data = { @@ -38,7 +38,7 @@ def test_new_genre_rec_from_empty_watched(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +#@pytest.mark.skip() def test_new_genre_rec_from_empty_friends(): # Arrange sonyas_data = { @@ -52,13 +52,17 @@ def test_new_genre_rec_from_empty_friends(): } ] } - - raise Exception("Test needs to be completed.") + # Act + recommendations = get_new_rec_by_genre(sonyas_data) + + # raise Exception("Test needs to be completed.") # ********************************************************************* # ****** Complete the Act and Assert Portions of these tests ********** # ********************************************************************* - -@pytest.mark.skip() + assert recommendations == [] + + +# #@pytest.mark.skip() def test_unique_rec_from_favorites(): # Arrange sonyas_data = clean_wave_5_data() @@ -72,7 +76,7 @@ def test_unique_rec_from_favorites(): assert INTRIGUE_2b in recommendations assert sonyas_data == clean_wave_5_data() -@pytest.mark.skip() +#@pytest.mark.skip() def test_unique_from_empty_favorites(): # Arrange sonyas_data = { @@ -94,7 +98,7 @@ def test_unique_from_empty_favorites(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +#@pytest.mark.skip() def test_new_rec_from_empty_friends(): # Arrange sonyas_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index e389d0f2e..c7809b362 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -164,6 +164,7 @@ def get_most_watched_genre(user_data): # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- + def get_friends_watched(user_data): friends_watched= [] @@ -201,9 +202,12 @@ def get_friends_unique_watched(user_data): # ------------- WAVE 4 -------------------- # ----------------------------------------- def get_available_recs (user_data): + user_watched = user_data["watched"] friends_watched = get_friends_watched(user_data) - ### loop through friends' values, find each friend's movie who has the movie that user has not watched and host in user_data["subscription"] + # loop through friends' values, + # find each friend's movie who has the movie that user has not watched and + # host in user_data["subscription"] recommended_movies = [] for movie in friends_watched: @@ -218,3 +222,78 @@ def get_available_recs (user_data): # ------------- WAVE 5 -------------------- # ----------------------------------------- +def get_new_rec_by_genre(user_data): + """ + Determine a list of recommended movies + + Parameter: + user_data (dict) + Notes: + user has not watched that movie + at leats one of user's friends has watched it + "genre" == user's frequent genre + Return: + recomemded movies (list) + """ + #loop through all watched movies of user_data + # in order to get most frequently watched genre and store as a string + # get friend's movies + #create empty recoomend movie . Loop through movies of friends and + # if movies user has not watched and genre == user most frequentlt watched genre + #add to recommended list + + count_frequent_genre = {} + + for movie in user_data["watched"]: + if movie["genre"] not in count_frequent_genre: + count_frequent_genre[movie["genre"]] = 1 + else: + count_frequent_genre[movie["genre"]] += 1 + + max_genre_count = 0 + max_frequent_genre = "" + + for genre, count in count_frequent_genre.items(): + if count > max_genre_count: + max_genre_count = count + max_frequent_genre = genre + + recommended_movies = [] + user_watched = user_data["watched"] + friends_watched = get_friends_watched(user_data) + + for movie in friends_watched: + if movie not in user_watched and movie["genre"] == max_frequent_genre \ + and movie not in recommended_movies: + recommended_movies.append(movie) + + return recommended_movies + + +def get_rec_from_favorites(user_data): + """ + Determine a list of recommended movies + + Parameter: + user_data (dict): "favorites" field contain a favorite list of movie dictionaries of user + Notes: + movie in user's "favorites" + non of user's friends have watched it + Return: + recomemded movies (list) + """ + + # got all favorites movies of user + # loop through user_data and get a list of all movies that friends have watched + # compare the movies in favorites to friends'list and add the movie that has in favorite + # but not in friends' watched to recommended list + + user_favorites = user_data["favorites"] + friends_watched = get_friends_watched(user_data) + + recommended_movies = [] + for movie in user_favorites: + if movie not in friends_watched: + recommended_movies.append(movie) + + return recommended_movies \ No newline at end of file From 2bc9a2f5c78ce1035d1f4e20e083798922eb3226 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 21:34:54 -0700 Subject: [PATCH 20/30] Part one of wave 5 added. --- tests/test_wave_05.py | 20 +++++++++++++------- viewing_party/party.py | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index b2ba9ad33..91d38cefa 100644 --- a/tests/test_wave_05.py +++ b/tests/test_wave_05.py @@ -2,7 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -@pytest.mark.skip() +# @pytest.mark.skip() def test_new_genre_rec(): # Arrange sonyas_data = clean_wave_5_data() @@ -17,7 +17,7 @@ def test_new_genre_rec(): assert FANTASY_4b in recommendations assert sonyas_data == clean_wave_5_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_new_genre_rec_from_empty_watched(): # Arrange sonyas_data = { @@ -38,7 +38,7 @@ def test_new_genre_rec_from_empty_watched(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +# @pytest.mark.skip() def test_new_genre_rec_from_empty_friends(): # Arrange sonyas_data = { @@ -52,13 +52,19 @@ def test_new_genre_rec_from_empty_friends(): } ] } + # Act + + empty_list = get_new_rec_by_genre(sonyas_data) + + # Assert + assert empty_list == [] - raise Exception("Test needs to be completed.") + # raise Exception("Test needs to be completed.") # ********************************************************************* # ****** Complete the Act and Assert Portions of these tests ********** # ********************************************************************* -@pytest.mark.skip() +# @pytest.mark.skip() def test_unique_rec_from_favorites(): # Arrange sonyas_data = clean_wave_5_data() @@ -72,7 +78,7 @@ def test_unique_rec_from_favorites(): assert INTRIGUE_2b in recommendations assert sonyas_data == clean_wave_5_data() -@pytest.mark.skip() +# @pytest.mark.skip() def test_unique_from_empty_favorites(): # Arrange sonyas_data = { @@ -94,7 +100,7 @@ def test_unique_from_empty_favorites(): # Assert assert len(recommendations) == 0 -@pytest.mark.skip() +# @pytest.mark.skip() def test_new_rec_from_empty_friends(): # Arrange sonyas_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index e389d0f2e..ede9cd629 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -200,6 +200,8 @@ def get_friends_unique_watched(user_data): # ----------------------------------------- # ------------- WAVE 4 -------------------- # ----------------------------------------- + + def get_available_recs (user_data): user_watched = user_data["watched"] friends_watched = get_friends_watched(user_data) @@ -218,3 +220,23 @@ def get_available_recs (user_data): # ------------- WAVE 5 -------------------- # ----------------------------------------- +""" +Part one +""" + +def get_new_rec_by_genre(user_data): + + user_watched = user_data["watched"] + friends_watched = get_friends_watched(user_data) + most_frequenty_genre = get_most_watched_genre(user_data) + + + recommended_movies = [] + for movie in friends_watched: + if movie not in user_watched and \ + movie["genre"] == most_frequenty_genre and\ + movie not in recommended_movies: + + recommended_movies.append(movie) + + return recommended_movies \ No newline at end of file From de81018a4094d695fdbbdecb9f0b773cc1c41680 Mon Sep 17 00:00:00 2001 From: Jenny Massari Date: Tue, 24 Sep 2024 22:06:58 -0700 Subject: [PATCH 21/30] Part two of wave 5 addded. --- viewing_party/party.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index ede9cd629..730c370a7 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -230,7 +230,7 @@ def get_new_rec_by_genre(user_data): friends_watched = get_friends_watched(user_data) most_frequenty_genre = get_most_watched_genre(user_data) - + # Returns a list of recommended movies based in user's most frequently watched genre. recommended_movies = [] for movie in friends_watched: if movie not in user_watched and \ @@ -239,4 +239,25 @@ def get_new_rec_by_genre(user_data): recommended_movies.append(movie) - return recommended_movies \ No newline at end of file + return recommended_movies + +""" +Part two +""" + +def get_rec_from_favorites(user_data): + user_watched = user_data["watched"] + friends_watched = get_friends_watched(user_data) + + # Loop through user favorites movies and creates a list of recommended movies. + recommended_movies = [] + + for movie in user_watched: + if movie in user_data["favorites"] and\ + movie not in friends_watched: + recommended_movies.append(movie) + + return recommended_movies + + + \ No newline at end of file From 58a9eca92c0428a539901cddd69ec2621f693ce8 Mon Sep 17 00:00:00 2001 From: anhtran Date: Wed, 25 Sep 2024 14:58:25 -0700 Subject: [PATCH 22/30] Update wave 5 and the test --- viewing_party/party.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index c7809b362..28a4e932f 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -167,6 +167,7 @@ def get_most_watched_genre(user_data): def get_friends_watched(user_data): friends_watched= [] + #[HORROR_1,FANTASY_1] for friend in user_data["friends"]: friends_watched.extend(friend["watched"]) @@ -202,13 +203,13 @@ def get_friends_unique_watched(user_data): # ------------- WAVE 4 -------------------- # ----------------------------------------- def get_available_recs (user_data): - - user_watched = user_data["watched"] - friends_watched = get_friends_watched(user_data) # loop through friends' values, # find each friend's movie who has the movie that user has not watched and # host in user_data["subscription"] + user_watched = user_data["watched"] + friends_watched = get_friends_watched(user_data) + recommended_movies = [] for movie in friends_watched: if movie not in user_watched and movie["host"] in user_data["subscriptions"] \ From ff12375e7ab147de5bd932afc16103c5de02f1ca Mon Sep 17 00:00:00 2001 From: anhtran Date: Wed, 25 Sep 2024 15:07:00 -0700 Subject: [PATCH 23/30] Resolve the conflict in test wave 5 --- tests/test_wave_05.py | 32 -------------------------------- viewing_party/party.py | 1 - 2 files changed, 33 deletions(-) diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index dec478a6f..0f7c3bc4c 100644 --- a/tests/test_wave_05.py +++ b/tests/test_wave_05.py @@ -2,11 +2,7 @@ from viewing_party.party import * from tests.test_constants import * -<<<<<<< HEAD -# #@pytest.mark.skip() -======= # @pytest.mark.skip() ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 def test_new_genre_rec(): # Arrange sonyas_data = clean_wave_5_data() @@ -21,11 +17,7 @@ def test_new_genre_rec(): assert FANTASY_4b in recommendations assert sonyas_data == clean_wave_5_data() -<<<<<<< HEAD -# #@pytest.mark.skip() -======= # @pytest.mark.skip() ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 def test_new_genre_rec_from_empty_watched(): # Arrange sonyas_data = { @@ -46,11 +38,7 @@ def test_new_genre_rec_from_empty_watched(): # Assert assert len(recommendations) == 0 -<<<<<<< HEAD #@pytest.mark.skip() -======= -# @pytest.mark.skip() ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 def test_new_genre_rec_from_empty_friends(): # Arrange sonyas_data = { @@ -65,30 +53,18 @@ def test_new_genre_rec_from_empty_friends(): ] } # Act -<<<<<<< HEAD - recommendations = get_new_rec_by_genre(sonyas_data) - -======= empty_list = get_new_rec_by_genre(sonyas_data) # Assert assert empty_list == [] ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 # raise Exception("Test needs to be completed.") # ********************************************************************* # ****** Complete the Act and Assert Portions of these tests ********** # ********************************************************************* -<<<<<<< HEAD - assert recommendations == [] - - -# #@pytest.mark.skip() -======= # @pytest.mark.skip() ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 def test_unique_rec_from_favorites(): # Arrange sonyas_data = clean_wave_5_data() @@ -102,11 +78,7 @@ def test_unique_rec_from_favorites(): assert INTRIGUE_2b in recommendations assert sonyas_data == clean_wave_5_data() -<<<<<<< HEAD -#@pytest.mark.skip() -======= # @pytest.mark.skip() ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 def test_unique_from_empty_favorites(): # Arrange sonyas_data = { @@ -128,11 +100,7 @@ def test_unique_from_empty_favorites(): # Assert assert len(recommendations) == 0 -<<<<<<< HEAD -#@pytest.mark.skip() -======= # @pytest.mark.skip() ->>>>>>> de81018a4094d695fdbbdecb9f0b773cc1c41680 def test_new_rec_from_empty_friends(): # Arrange sonyas_data = { diff --git a/viewing_party/party.py b/viewing_party/party.py index d6b2b5ed1..f003b1c31 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -167,7 +167,6 @@ def get_most_watched_genre(user_data): def get_friends_watched(user_data): friends_watched= [] - #[HORROR_1,FANTASY_1] for friend in user_data["friends"]: friends_watched.extend(friend["watched"]) From aff4e3cec957ce029f6b8650514e6553970f44f5 Mon Sep 17 00:00:00 2001 From: anhtran Date: Thu, 26 Sep 2024 15:49:56 -0700 Subject: [PATCH 24/30] Change the name in wave 2 and update docstring for all function --- viewing_party/party.py | 94 ++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index f003b1c31..9699ade47 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -116,9 +116,6 @@ def get_watched_avg_rating(user_data): return average_rating -""" -Part two -""" def get_most_watched_genre(user_data): """ Get the most frequently watched genre from user's watched movies @@ -131,34 +128,32 @@ def get_most_watched_genre(user_data): str: the genre that user watched frequently None: if "watched" list is empty """ - genres = {} + genres_count = {} # map from genre to count # Return None if there is no value in "watched." if user_data["watched"] == []: return None + # Add and count the genres found. for movie in user_data["watched"]: genre = movie["genre"] - if genre not in genres: - genres[genre] = 1 + if genre not in genres_count: + genres_count[genre] = 1 else: - genres[genre] += 1 - - # Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} - # Tv = {'BreakingBad':100, 'GameOfThrones':1292, 'TMKUC' : 88} - - # Keymax = max(zip(Tv.values(), Tv.keys()))[1] - # print(Keymax) + genres_count[genre] += 1 + + #using lamda function to get the max count and most frequent genre + # most_frequent_genre = max(genres_count, key=genres_count.get) max_rate = 0 - genre = None + most_frequent_genre = None # Comparing the rates and returning the most frequenty genre. - for key, rate in genres.items(): + for key, rate in genres_count.items(): if rate > max_rate: - genre = key - max_rate = rate + most_frequent_genre = key + max_rate = rate - return genre + return most_frequent_genre # ----------------------------------------- @@ -166,6 +161,7 @@ def get_most_watched_genre(user_data): # ----------------------------------------- def get_friends_watched(user_data): + friends_watched= [] for friend in user_data["friends"]: @@ -174,6 +170,19 @@ def get_friends_watched(user_data): return friends_watched def get_unique_watched(user_data): + """ + This function determines which movies the user has watched + but none of the friends have watched. + + Parameters: + user_data(dict): has two keys: + "watched": List of movie dictionaries the user has watched, each with a "title". + "friends": List of friends, each having a "watched" list of movie dictionaries. + + Returns: + list of dict of movies. + """ + user_watched = user_data["watched"] friends_watched = get_friends_watched(user_data) @@ -186,6 +195,19 @@ def get_unique_watched(user_data): return unique_watched def get_friends_unique_watched(user_data): + """ + This function determines which movies the user has not watched + but at least one of the friends have watched. + + Parameters: + user_data(dict): has two keys: + "watched": List of movie dictionaries the user has watched, each with a "title". + "friends": List of friends, each having a "watched" list of movie dictionaries. + + Returns: + list of dict of unique movies. + """ + user_watched = user_data["watched"] friends_watched = get_friends_watched(user_data) @@ -204,9 +226,19 @@ def get_friends_unique_watched(user_data): def get_available_recs (user_data): - # loop through friends' values, - # find each friend's movie who has the movie that user has not watched and - # host in user_data["subscription"] + """ + Return a list of recommended movies based on the user's subscriptions + and their's friends watched movies + + Parameters: + user_data (dict): has two keys: + "subscriptions": List of streaming services the user has access to + "friends": List of friends, each having a "watched" list of movie dictionaries, + each movie has a "host" + + Returns: + list of dict of movies + """ user_watched = user_data["watched"] friends_watched = get_friends_watched(user_data) @@ -218,27 +250,22 @@ def get_available_recs (user_data): recommended_movies.append(movie) return recommended_movies - - + # ----------------------------------------- # ------------- WAVE 5 -------------------- # ----------------------------------------- -""" -Part one -""" - def get_new_rec_by_genre(user_data): """ Determine a list of recommended movies - Parameter: + Parameters: user_data (dict) Notes: user has not watched that movie at leats one of user's friends has watched it "genre" == user's frequent genre - Return: + Returns: recomemded movies (list) """ @@ -257,20 +284,17 @@ def get_new_rec_by_genre(user_data): return recommended_movies -""" -Part two -""" - def get_rec_from_favorites(user_data): """ Determine a list of recommended movies - Parameter: + Parameters: user_data (dict): "favorites" field contain a favorite list of movie dictionaries of user Notes: movie in user's "favorites" non of user's friends have watched it - Return: + + Returns: recomemded movies (list) """ user_watched = user_data["watched"] From 1d7e4f8e6d8974f8e600ac232720e88bb2b73d73 Mon Sep 17 00:00:00 2001 From: anhtran Date: Thu, 26 Sep 2024 15:53:00 -0700 Subject: [PATCH 25/30] Update get max() by using Lambda functions as the key argument for next Learn purposes --- viewing_party/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 9699ade47..3bd0590e7 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -142,7 +142,7 @@ def get_most_watched_genre(user_data): else: genres_count[genre] += 1 - #using lamda function to get the max count and most frequent genre + # using lamblda function to get the max count and most frequent genre in genere_count dictionary # most_frequent_genre = max(genres_count, key=genres_count.get) max_rate = 0 From 574c6b27c52996e4a48177b9a8a7b3b6dc93c40a Mon Sep 17 00:00:00 2001 From: anhtran Date: Thu, 26 Sep 2024 15:59:02 -0700 Subject: [PATCH 26/30] Update docstring for helper function get_friends_watched --- viewing_party/party.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 3bd0590e7..16071e075 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -46,6 +46,7 @@ def add_to_watched(user_data, movie): user_data["watched"].append(movie) return user_data + def add_to_watchlist(user_data, movies): """ Add a movie to user's watchlist @@ -65,6 +66,7 @@ def add_to_watchlist(user_data, movies): """ user_data["watchlist"].append(movies) return user_data + def watch_movie(user_data, title): """ @@ -161,7 +163,9 @@ def get_most_watched_genre(user_data): # ----------------------------------------- def get_friends_watched(user_data): - + """ + Helper function to get list of all movies that friends have watched + """ friends_watched= [] for friend in user_data["friends"]: @@ -169,6 +173,7 @@ def get_friends_watched(user_data): return friends_watched + def get_unique_watched(user_data): """ This function determines which movies the user has watched @@ -194,6 +199,7 @@ def get_unique_watched(user_data): return unique_watched + def get_friends_unique_watched(user_data): """ This function determines which movies the user has not watched @@ -284,6 +290,7 @@ def get_new_rec_by_genre(user_data): return recommended_movies + def get_rec_from_favorites(user_data): """ Determine a list of recommended movies From b03f348e25b127681dfb17c6e45fea1f0fa9072e Mon Sep 17 00:00:00 2001 From: anhtran Date: Thu, 26 Sep 2024 21:57:05 -0700 Subject: [PATCH 27/30] update wave 1 accept rating is 0 and int --- viewing_party/party.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 16071e075..4f6466521 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -14,12 +14,12 @@ def create_movie(title, genre, rating): None: if any of arguments are falsy """ - if not title or not genre or not rating: + if not title or not genre or rating is None: return None # Checking if user inputs on these parameters are all valid. if not isinstance(title, str) or not isinstance(genre, str) \ - or not isinstance(rating, float): + or not isinstance(rating, float) or not isinstance(rating, int): return None else: return {"title": title, "genre": genre, "rating": rating} @@ -144,7 +144,7 @@ def get_most_watched_genre(user_data): else: genres_count[genre] += 1 - # using lamblda function to get the max count and most frequent genre in genere_count dictionary + # using lambda function to get the max count and most frequent genre in genere_count dictionary # most_frequent_genre = max(genres_count, key=genres_count.get) max_rate = 0 From 900f438c83dc49d7f96d934dd06a6171cedb57f3 Mon Sep 17 00:00:00 2001 From: anhtran Date: Fri, 27 Sep 2024 09:05:50 -0700 Subject: [PATCH 28/30] Update some comments for learning purposes --- viewing_party/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 4f6466521..c9a61ba3a 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -144,7 +144,7 @@ def get_most_watched_genre(user_data): else: genres_count[genre] += 1 - # using lambda function to get the max count and most frequent genre in genere_count dictionary + # using max() to get the max count and most frequent genre in genere_count dictionary # most_frequent_genre = max(genres_count, key=genres_count.get) max_rate = 0 From 14a89aaf3526713a5b2487607425a48875c3b7ad Mon Sep 17 00:00:00 2001 From: anhtran Date: Fri, 27 Sep 2024 09:18:23 -0700 Subject: [PATCH 29/30] Update comments for learning purposes --- viewing_party/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index c9a61ba3a..fa7f8a422 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -144,7 +144,7 @@ def get_most_watched_genre(user_data): else: genres_count[genre] += 1 - # using max() to get the max count and most frequent genre in genere_count dictionary + # using max() to get the max count in genere_count dictionary # most_frequent_genre = max(genres_count, key=genres_count.get) max_rate = 0 From fdd18b817139552903c0243da039dc6fac0648ce Mon Sep 17 00:00:00 2001 From: anhtran Date: Fri, 27 Sep 2024 09:26:50 -0700 Subject: [PATCH 30/30] Update comments for study purposes --- viewing_party/party.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index fa7f8a422..e8c836156 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -144,9 +144,6 @@ def get_most_watched_genre(user_data): else: genres_count[genre] += 1 - # using max() to get the max count in genere_count dictionary - # most_frequent_genre = max(genres_count, key=genres_count.get) - max_rate = 0 most_frequent_genre = None # Comparing the rates and returning the most frequenty genre. @@ -155,6 +152,11 @@ def get_most_watched_genre(user_data): most_frequent_genre = key max_rate = rate + # using max() to get the max count in genere_count dictionary + # most_frequent_genre = max(genres_count, key=genres_count.get) + # If use max(dictionary), max() looks only at the keys of the dictionary, not the values. + # If the keys are strings, max() will return the key that comes last alphabetically + return most_frequent_genre