From cda33de36444a06ff21d44e428baec0534e38365 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 11:25:46 -0700 Subject: [PATCH 01/23] Complete test_moves_movie_from_watchlist_to_watched function --- tests/test_wave_01.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 669efee6..932dbaa3 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -183,10 +183,7 @@ def test_moves_movie_from_watchlist_to_watched(): assert len(updated_data["watchlist"]) == 1 assert len(updated_data["watched"]) == 2 - raise Exception("Test needs to be completed.") - # ******************************************************************************************* - # ****** Add assertions here to test that the correct movie was added to "watched" ********** - # ******************************************************************************************* + assert updated_data == [FANTASY_2, movie_to_watch] @pytest.mark.skip() def test_does_nothing_if_movie_not_in_watchlist(): From 1258a6405b45976c830a0700319a9288e4e3975a Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 11:33:11 -0700 Subject: [PATCH 02/23] Fix a bug in test_moves_movie_from_watchlist_to_watched function --- tests/test_wave_01.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 932dbaa3..5eba55d0 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -182,8 +182,8 @@ def test_moves_movie_from_watchlist_to_watched(): # Assert assert len(updated_data["watchlist"]) == 1 assert len(updated_data["watched"]) == 2 - - assert updated_data == [FANTASY_2, movie_to_watch] + + assert updated_data["watched"] == [FANTASY_2, movie_to_watch] @pytest.mark.skip() def test_does_nothing_if_movie_not_in_watchlist(): From 13dd493400026085e3c1098ac29a76db9091a33c Mon Sep 17 00:00:00 2001 From: Charday Neal Date: Mon, 23 Sep 2024 12:00:22 -0700 Subject: [PATCH 03/23] Complete tests_moves_movie_from_watchlist_to_empty_watched function --- tests/test_wave_01.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 5eba55d0..5403a05e 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -159,10 +159,11 @@ 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.") - # ******************************************************************************************* - # ****** 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(): From 9c100336e9aa794ce4ebdcf86a67b6f30d15dae6 Mon Sep 17 00:00:00 2001 From: Charday Neal Date: Mon, 23 Sep 2024 12:10:55 -0700 Subject: [PATCH 04/23] Complete add_to_watched function --- tests/test_wave_01.py | 4 ++-- viewing_party/party.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 5403a05e..1c15b38d 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -58,7 +58,7 @@ def test_create_no_rating_movie(): # Assert assert new_movie is None -@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() + def test_adds_movie_to_non_empty_user_watched(): # Arrange movie = { diff --git a/viewing_party/party.py b/viewing_party/party.py index 6d34a6b5..4ba5c42d 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -3,6 +3,10 @@ def create_movie(title, genre, rating): pass +def add_to_watched(user_data, movie): + user_data["watched"].append(movie) + return user_data + # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- From 1fedd281efbfde096f346c49ca9dbc531b317d13 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 12:22:06 -0700 Subject: [PATCH 05/23] Complete create_movie function --- tests/test_wave_01.py | 8 ++++---- viewing_party/party.py | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 1c15b38d..c0425b1c 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" diff --git a/viewing_party/party.py b/viewing_party/party.py index 4ba5c42d..36ea4f8e 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -1,7 +1,12 @@ # ------------- WAVE 1 -------------------- def create_movie(title, genre, rating): - pass + if not title or not genre or not rating: + return None + + return {"title" : title, + "genre" : genre, + "rating" : rating} def add_to_watched(user_data, movie): user_data["watched"].append(movie) From c86b5d9beb381adc765446448cd38afb11e3e14c Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 12:27:16 -0700 Subject: [PATCH 06/23] Complete add_to_watchlist function --- tests/test_wave_01.py | 4 ++-- viewing_party/party.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index c0425b1c..8a5a9831 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -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 = { diff --git a/viewing_party/party.py b/viewing_party/party.py index 36ea4f8e..a1acc568 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -12,6 +12,11 @@ def add_to_watched(user_data, movie): user_data["watched"].append(movie) return user_data +def add_to_watchlist(user_data, movie): + user_data["watchlist"].append(movie) + return user_data + + # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- From ca3f6b0e0be1ec46f38290100fe011e2fa35856c Mon Sep 17 00:00:00 2001 From: Charday Neal Date: Mon, 23 Sep 2024 12:41:00 -0700 Subject: [PATCH 07/23] Complete watch_movie function --- tests/test_wave_01.py | 6 +++--- viewing_party/party.py | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index 1c15b38d..ee5ce0d3 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -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() + def test_moves_movie_from_watchlist_to_empty_watched(): # Arrange janes_data = { @@ -165,7 +165,7 @@ def test_moves_movie_from_watchlist_to_empty_watched(): "rating": RATING_1 }] -@pytest.mark.skip() + def test_moves_movie_from_watchlist_to_watched(): # Arrange movie_to_watch = HORROR_1 @@ -186,7 +186,7 @@ def test_moves_movie_from_watchlist_to_watched(): assert updated_data["watched"] == [FANTASY_2, movie_to_watch] -@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 4ba5c42d..930af78a 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -7,6 +7,15 @@ def add_to_watched(user_data, movie): user_data["watched"].append(movie) return user_data +def watch_movie(user_data, title): + movies = user_data["watchlist"] + + for movie in movies: + if title == movie["title"]: + movies.remove(movie) + return add_to_watched(user_data, movie) + + return user_data # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- From fb50d604815e4864ea6a320d425532d03e3324d6 Mon Sep 17 00:00:00 2001 From: Charday Neal Date: Mon, 23 Sep 2024 15:32:40 -0700 Subject: [PATCH 08/23] Complete get_watched_avg_rating function --- tests/test_wave_02.py | 4 ++-- viewing_party/party.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index 19f045c7..acd7c877 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 c3400d45..3f875cc5 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -29,6 +29,17 @@ def watch_movie(user_data, title): # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- +def get_watched_avg_rating(user_data): + total_rating = 0 + movies = user_data["watched"] + + if not movies: + return total_rating + + for movie in movies: + total_rating += movie["rating"] + + return total_rating / len(movies) # ----------------------------------------- From c9a3bcc566a79dcbf3373d82df4832af599061de Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 15:39:23 -0700 Subject: [PATCH 09/23] completed get_most_watched_genre function --- tests/test_wave_02.py | 6 +++--- viewing_party/party.py | 23 ++++++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index 19f045c7..fc701ad1 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 c3400d45..d06049f6 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -29,13 +29,31 @@ def watch_movie(user_data, title): # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- - +def get_most_watched_genre(user_data): + if not user_data["watched"]: + return None + genres = {} + for movie in user_data["watched"]: + if movie["genre"] not in genres: + genres[movie["genre"]] = 1 + else: + genres[movie["genre"]] +=1 + max_num = 0 + max_genre = "" + for genre, times_watched in genres.items(): + if times_watched > max_num: + max_num = times_watched + max_genre = genre + + return max_genre + + # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- - + # ----------------------------------------- # ------------- WAVE 4 -------------------- # ----------------------------------------- @@ -43,4 +61,3 @@ def watch_movie(user_data, title): # ----------------------------------------- # ------------- WAVE 5 -------------------- # ----------------------------------------- - From 831ca06048a37f22ed3b329addc3d22f904de6ea Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 15:43:03 -0700 Subject: [PATCH 10/23] organize wave 2 functions --- viewing_party/party.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index e6dae5ea..10226577 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -40,15 +40,18 @@ def get_watched_avg_rating(user_data): total_rating += movie["rating"] return total_rating / len(movies) + def get_most_watched_genre(user_data): if not user_data["watched"]: return None + genres = {} for movie in user_data["watched"]: if movie["genre"] not in genres: genres[movie["genre"]] = 1 else: genres[movie["genre"]] +=1 + max_num = 0 max_genre = "" for genre, times_watched in genres.items(): @@ -58,8 +61,6 @@ def get_most_watched_genre(user_data): return max_genre - - # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- From 075136459af6bd96256bf665f5b688bdf3e7af07 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Mon, 23 Sep 2024 20:15:53 -0700 Subject: [PATCH 11/23] refactored get_most_watched_genre func --- viewing_party/party.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 10226577..d700a3f3 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -45,21 +45,21 @@ def get_most_watched_genre(user_data): if not user_data["watched"]: return None - genres = {} + genre_count = {} for movie in user_data["watched"]: - if movie["genre"] not in genres: - genres[movie["genre"]] = 1 + if movie["genre"] not in genre_count: + genre_count[movie["genre"]] = 1 else: - genres[movie["genre"]] +=1 + genre_count[movie["genre"]] +=1 max_num = 0 - max_genre = "" - for genre, times_watched in genres.items(): - if times_watched > max_num: - max_num = times_watched - max_genre = genre + most_watched_genre = None + for genre in genre_count: + if genre_count[genre] > max_num: + max_num = genre_count[genre] + most_watched_genre = genre - return max_genre + return most_watched_genre # ----------------------------------------- # ------------- WAVE 3 -------------------- From aae79219d749db92452c942a07b41d098dc88177 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Tue, 24 Sep 2024 13:18:42 -0700 Subject: [PATCH 12/23] Complete wave 3 functions --- tests/test_wave_03.py | 18 +++++++----------- viewing_party/party.py | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index 04642936..f4125d73 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() @@ -54,13 +54,9 @@ def test_friends_unique_movies_not_duplicated(): # Assert assert len(friends_unique_movies) == 3 - - 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 INTRIGUE_3 in friends_unique_movies + +# @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 d700a3f3..84c48c9b 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -44,7 +44,7 @@ def get_watched_avg_rating(user_data): def get_most_watched_genre(user_data): if not user_data["watched"]: return None - + genre_count = {} for movie in user_data["watched"]: if movie["genre"] not in genre_count: @@ -58,12 +58,40 @@ def get_most_watched_genre(user_data): if genre_count[genre] > max_num: max_num = genre_count[genre] most_watched_genre = genre - + return most_watched_genre - + + # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- +def get_unique_watched(user_data): + + friends_movies = set() + for friend in user_data["friends"]: + friends_movies.update(movie["title"] for movie in friend["watched"]) + + unique_movies = [ + movie for movie in user_data["watched"] if movie["title"] not in friends_movies + ] + + return unique_movies + + +def get_friends_unique_watched(user_data): + + user_movie_titles = {movie["title"] for movie in user_data["watched"]} + + unique_friends_movies = [] + friends_movie_titles = set() + for friend in user_data["friends"]: + for movie in friend["watched"]: + title = movie["title"] + if title not in user_movie_titles: + if title not in friends_movie_titles: + friends_movie_titles.add(title) + unique_friends_movies.append(movie) + return unique_friends_movies # ----------------------------------------- From 99a144f938624936210eb8fd4a6450514eb3325d Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Tue, 24 Sep 2024 13:42:37 -0700 Subject: [PATCH 13/23] Complete wave 4 function --- tests/test_wave_04.py | 6 +++--- viewing_party/party.py | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/test_wave_04.py b/tests/test_wave_04.py index 49966907..0b0b3c7e 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 84c48c9b..ae0953b3 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -97,7 +97,16 @@ def get_friends_unique_watched(user_data): # ----------------------------------------- # ------------- WAVE 4 -------------------- # ----------------------------------------- +def get_available_recs(user_data): + unique_movies = get_friends_unique_watched(user_data) + + recommended_movies = [] + for movie in unique_movies: + host = movie["host"] + if host in user_data["subscriptions"]: + recommended_movies.append(movie) + return recommended_movies # ----------------------------------------- # ------------- WAVE 5 -------------------- # ----------------------------------------- From fc9a108c40ca25dba43aec4b28320262c24ee0e0 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Tue, 24 Sep 2024 13:59:21 -0700 Subject: [PATCH 14/23] Complete get_rec_from_favorites func --- tests/test_wave_05.py | 8 ++++---- viewing_party/party.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index b2ba9ad3..29427578 100644 --- a/tests/test_wave_05.py +++ b/tests/test_wave_05.py @@ -52,13 +52,13 @@ def test_new_genre_rec_from_empty_friends(): } ] } - + 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 +72,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 +94,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 ae0953b3..82bcfdac 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -110,3 +110,23 @@ def get_available_recs(user_data): # ----------------------------------------- # ------------- WAVE 5 -------------------- # ----------------------------------------- + +""" +- take one parameter: `user_data` + - `user_data` will have a field `"favorites"`. The value of `"favorites"` is a list of movie dictionaries + - This represents the user's favorite movies +- Determine a list of recommended movies. A movie should be added to this list if and only if: + - The movie is in the user's `"favorites"` + - None of the user's friends have watched it +- Return the list of recommended movies +""" +def get_rec_from_favorites(user_data): + friends_movies = set() + for friend in user_data["friends"]: + friends_movies.update(movie["title"] for movie in friend["watched"]) + + unique_movies = [ + movie for movie in user_data["favorites"] if movie["title"] not in friends_movies + ] + + return unique_movies \ No newline at end of file From 0d421edd696146d9f2f8040ca220518e677d018d Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Tue, 24 Sep 2024 14:00:39 -0700 Subject: [PATCH 15/23] remove unnecesary docstring added previously --- viewing_party/party.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 82bcfdac..9b0de1ca 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -111,15 +111,6 @@ def get_available_recs(user_data): # ------------- WAVE 5 -------------------- # ----------------------------------------- -""" -- take one parameter: `user_data` - - `user_data` will have a field `"favorites"`. The value of `"favorites"` is a list of movie dictionaries - - This represents the user's favorite movies -- Determine a list of recommended movies. A movie should be added to this list if and only if: - - The movie is in the user's `"favorites"` - - None of the user's friends have watched it -- Return the list of recommended movies -""" def get_rec_from_favorites(user_data): friends_movies = set() for friend in user_data["friends"]: @@ -128,5 +119,5 @@ def get_rec_from_favorites(user_data): unique_movies = [ movie for movie in user_data["favorites"] if movie["title"] not in friends_movies ] - + return unique_movies \ No newline at end of file From 9380f887b530a8924e37651ac96054b7302ed2de Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Tue, 24 Sep 2024 14:02:22 -0700 Subject: [PATCH 16/23] rename variable for readability in get_rec_from_favorites func --- viewing_party/party.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 9b0de1ca..cabe1c12 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -112,12 +112,13 @@ def get_available_recs(user_data): # ----------------------------------------- def get_rec_from_favorites(user_data): + friends_movies = set() for friend in user_data["friends"]: friends_movies.update(movie["title"] for movie in friend["watched"]) - unique_movies = [ + recommended_favorites = [ movie for movie in user_data["favorites"] if movie["title"] not in friends_movies ] - return unique_movies \ No newline at end of file + return recommended_favorites \ No newline at end of file From 86d6a73be00478de6c6317bb3c5544c5e18decc9 Mon Sep 17 00:00:00 2001 From: Charday Neal Date: Tue, 24 Sep 2024 14:31:25 -0700 Subject: [PATCH 17/23] Complete get_new_rec_by_genre function --- tests/test_wave_05.py | 12 +++++------- viewing_party/party.py | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index 29427578..46c50ccd 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 = { @@ -53,10 +53,8 @@ def test_new_genre_rec_from_empty_friends(): ] } - raise Exception("Test needs to be completed.") - # ********************************************************************* - # ****** Complete the Act and Assert Portions of these tests ********** - # ********************************************************************* + result = get_new_rec_by_genre(sonyas_data) + assert result == [] # @pytest.mark.skip() def test_unique_rec_from_favorites(): diff --git a/viewing_party/party.py b/viewing_party/party.py index 9b0de1ca..55e36014 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -111,6 +111,30 @@ def get_available_recs(user_data): # ------------- WAVE 5 -------------------- # ----------------------------------------- +def get_new_rec_by_genre(user_data): + + watched_genre_dict = {} + for movie in user_data["watched"]: + genre = movie["genre"] + if genre in watched_genre_dict: + watched_genre_dict[genre] += 1 + continue + watched_genre_dict[genre] = 1 + + frequent_genre = "" + genre_highest_count = 0 + for genre, count in watched_genre_dict.items(): + if count > genre_highest_count: + frequent_genre = genre + genre_highest_count = count + + not_watched = get_friends_unique_watched(user_data) + + recommended_movies = [movie for movie in not_watched if movie["genre"] == frequent_genre] + + return recommended_movies + + def get_rec_from_favorites(user_data): friends_movies = set() for friend in user_data["friends"]: From 0335ffc937adffb7e99617ad1a90ef9ab1cd4984 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Wed, 25 Sep 2024 10:29:01 -0700 Subject: [PATCH 18/23] Add comments to functions --- viewing_party/party.py | 64 +++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 917609b3..8d81695c 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -1,17 +1,18 @@ # ------------- WAVE 1 -------------------- +# Create movies def create_movie(title, genre, rating): if not title or not genre or not rating: return None - - return {"title" : title, - "genre" : genre, - "rating" : rating} + + return {"title": title, "genre": genre, "rating": rating} + def add_to_watched(user_data, movie): user_data["watched"].append(movie) return user_data +# Add movies to the watchlist def add_to_watchlist(user_data, movie): user_data["watchlist"].append(movie) return user_data @@ -26,6 +27,8 @@ def watch_movie(user_data, title): return add_to_watched(user_data, movie) return user_data + + # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- @@ -41,17 +44,21 @@ def get_watched_avg_rating(user_data): return total_rating / len(movies) +# Get most watched genre def get_most_watched_genre(user_data): + # Return None if list of "watched" is empty if not user_data["watched"]: return None + # Count watched genres genre_count = {} for movie in user_data["watched"]: if movie["genre"] not in genre_count: genre_count[movie["genre"]] = 1 else: - genre_count[movie["genre"]] +=1 + genre_count[movie["genre"]] += 1 + # Determine most watched genre max_num = 0 most_watched_genre = None for genre in genre_count: @@ -65,25 +72,39 @@ def get_most_watched_genre(user_data): # ----------------------------------------- # ------------- WAVE 3 -------------------- # ----------------------------------------- + +# Get all movies unique to user def get_unique_watched(user_data): + # Put titles that friends watched in a set friends_movies = set() for friend in user_data["friends"]: friends_movies.update(movie["title"] for movie in friend["watched"]) + # Create list of movies that only user watched unique_movies = [ movie for movie in user_data["watched"] if movie["title"] not in friends_movies ] return unique_movies - +# Get movies unique to friends that user hasn't watched def get_friends_unique_watched(user_data): + # Put movie titles user has watched in a set user_movie_titles = {movie["title"] for movie in user_data["watched"]} - + + # Create a list for movies only friends watched unique_friends_movies = [] + + # Put movies friends watched to a set friends_movie_titles = set() + + # Iterate through movies, if movie title is not in a set + # unique to a user and if movie title is not in friends movies + # add it to a set of titles unique to friends, so that we don't add + # duplicates to unique friend's movies. Append movies + # to a list of unique movies for friend in user_data["friends"]: for movie in friend["watched"]: title = movie["title"] @@ -91,22 +112,31 @@ def get_friends_unique_watched(user_data): if title not in friends_movie_titles: friends_movie_titles.add(title) unique_friends_movies.append(movie) + return unique_friends_movies # ----------------------------------------- # ------------- WAVE 4 -------------------- # ----------------------------------------- + +# Get friends' recommendations for user def get_available_recs(user_data): + # Get unique movies friends watched, but user hasn't unique_movies = get_friends_unique_watched(user_data) recommended_movies = [] + + # Append a movie to a list of recommended movies + # if a movie is hosted by a subscription user has acces to for movie in unique_movies: host = movie["host"] if host in user_data["subscriptions"]: recommended_movies.append(movie) return recommended_movies + + # ----------------------------------------- # ------------- WAVE 5 -------------------- # ----------------------------------------- @@ -120,7 +150,7 @@ def get_new_rec_by_genre(user_data): watched_genre_dict[genre] += 1 continue watched_genre_dict[genre] = 1 - + frequent_genre = "" genre_highest_count = 0 for genre, count in watched_genre_dict.items(): @@ -130,19 +160,27 @@ def get_new_rec_by_genre(user_data): not_watched = get_friends_unique_watched(user_data) - recommended_movies = [movie for movie in not_watched if movie["genre"] == frequent_genre] + recommended_movies = [ + movie for movie in not_watched + if movie["genre"] == frequent_genre + ] return recommended_movies - +# Recommend movies from user favorites def get_rec_from_favorites(user_data): - + + # Put titles that friends watched in a set friends_movies = set() for friend in user_data["friends"]: friends_movies.update(movie["title"] for movie in friend["watched"]) + # Create list of movies that only user watched + # and is in their favorites list recommended_favorites = [ - movie for movie in user_data["favorites"] if movie["title"] not in friends_movies + movie + for movie in user_data["favorites"] + if movie["title"] not in friends_movies ] - return recommended_favorites \ No newline at end of file + return recommended_favorites From 5ab7d8d6fee7f80a93a757ffed90a35f32dcab3f Mon Sep 17 00:00:00 2001 From: Charday Neal Date: Wed, 25 Sep 2024 14:24:57 -0700 Subject: [PATCH 19/23] Add context comments --- viewing_party/party.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 8d81695c..353ee17d 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -7,7 +7,7 @@ def create_movie(title, genre, rating): return {"title": title, "genre": genre, "rating": rating} - +# Add movie to "watched" list def add_to_watched(user_data, movie): user_data["watched"].append(movie) return user_data @@ -17,7 +17,7 @@ def add_to_watchlist(user_data, movie): user_data["watchlist"].append(movie) return user_data - +# Adds movie from watchlist to "watched" list def watch_movie(user_data, title): movies = user_data["watchlist"] @@ -32,13 +32,17 @@ def watch_movie(user_data, title): # ----------------------------------------- # ------------- WAVE 2 -------------------- # ----------------------------------------- + +# Get average rating of user "watched" movies def get_watched_avg_rating(user_data): total_rating = 0 movies = user_data["watched"] + # Return 0 if list of "watched" is empty if not movies: return total_rating + # Find sum of ratings for movie in movies: total_rating += movie["rating"] @@ -141,28 +145,17 @@ def get_available_recs(user_data): # ------------- WAVE 5 -------------------- # ----------------------------------------- +# Recommend movies from friends list based on user most frequent genre def get_new_rec_by_genre(user_data): - watched_genre_dict = {} - for movie in user_data["watched"]: - genre = movie["genre"] - if genre in watched_genre_dict: - watched_genre_dict[genre] += 1 - continue - watched_genre_dict[genre] = 1 - - frequent_genre = "" - genre_highest_count = 0 - for genre, count in watched_genre_dict.items(): - if count > genre_highest_count: - frequent_genre = genre - genre_highest_count = count + # Get user most frequent genre + most_frequent_genre = get_most_watched_genre(user_data) + # Create list of recommended movies with most frequent genre not_watched = get_friends_unique_watched(user_data) - recommended_movies = [ movie for movie in not_watched - if movie["genre"] == frequent_genre + if movie["genre"] == most_frequent_genre ] return recommended_movies From b2383c2f4712c10f0b13c89b2637a5c4965d9588 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Wed, 25 Sep 2024 14:41:33 -0700 Subject: [PATCH 20/23] refactored get_recs_from_favorites func --- viewing_party/party.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 353ee17d..ae8f48e4 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -131,7 +131,6 @@ def get_available_recs(user_data): unique_movies = get_friends_unique_watched(user_data) recommended_movies = [] - # Append a movie to a list of recommended movies # if a movie is hosted by a subscription user has acces to for movie in unique_movies: @@ -162,18 +161,13 @@ def get_new_rec_by_genre(user_data): # Recommend movies from user favorites def get_rec_from_favorites(user_data): + # Get the list of movies that only the user has watched + unique_movies = get_unique_watched(user_data) - # Put titles that friends watched in a set - friends_movies = set() - for friend in user_data["friends"]: - friends_movies.update(movie["title"] for movie in friend["watched"]) - - # Create list of movies that only user watched - # and is in their favorites list + # Filter the unique movies to only those that are in the user's favorites recommended_favorites = [ - movie - for movie in user_data["favorites"] - if movie["title"] not in friends_movies + movie for movie in unique_movies + if movie in user_data["favorites"] ] return recommended_favorites From 1d902af24a1e4c035747c8d6f4830beed8d81d69 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Wed, 25 Sep 2024 18:33:57 -0700 Subject: [PATCH 21/23] refactored get_rec_from_favorites func to compare titles --- 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 ae8f48e4..f8e44c4e 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -87,7 +87,8 @@ def get_unique_watched(user_data): # Create list of movies that only user watched unique_movies = [ - movie for movie in user_data["watched"] if movie["title"] not in friends_movies + movie for movie in user_data["watched"] + if movie["title"] not in friends_movies ] return unique_movies @@ -166,8 +167,9 @@ def get_rec_from_favorites(user_data): # Filter the unique movies to only those that are in the user's favorites recommended_favorites = [ - movie for movie in unique_movies - if movie in user_data["favorites"] + movie + for movie in unique_movies + if movie["title"] in {fav_movie["title"] for fav_movie in user_data["favorites"]} ] return recommended_favorites From 57a48b64c96ef8c0d0b276d803216fee6da8deca Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Wed, 25 Sep 2024 18:36:27 -0700 Subject: [PATCH 22/23] refactored get_rec_from_favorites --- viewing_party/party.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index f8e44c4e..25cb9da7 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -165,11 +165,14 @@ def get_rec_from_favorites(user_data): # Get the list of movies that only the user has watched unique_movies = get_unique_watched(user_data) + # Get a set of favorite movie titles + favorite_movies = {fav_movie["title"] for fav_movie in user_data["favorites"]} + # Filter the unique movies to only those that are in the user's favorites recommended_favorites = [ movie for movie in unique_movies - if movie["title"] in {fav_movie["title"] for fav_movie in user_data["favorites"]} + if movie["title"] in favorite_movies ] return recommended_favorites From afb5f0d730cd07c5c2cec0c0b430499343f7f977 Mon Sep 17 00:00:00 2001 From: Elzara Turakulova Date: Wed, 25 Sep 2024 18:58:52 -0700 Subject: [PATCH 23/23] added helper function to add titles --- viewing_party/party.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/viewing_party/party.py b/viewing_party/party.py index 25cb9da7..927ddfdc 100644 --- a/viewing_party/party.py +++ b/viewing_party/party.py @@ -77,13 +77,17 @@ def get_most_watched_genre(user_data): # ------------- WAVE 3 -------------------- # ----------------------------------------- +# Add helper function to get movie titles +def get_titles(list_of_dict): + return {item["title"] for item in list_of_dict} + # Get all movies unique to user def get_unique_watched(user_data): # Put titles that friends watched in a set friends_movies = set() for friend in user_data["friends"]: - friends_movies.update(movie["title"] for movie in friend["watched"]) + friends_movies.update(get_titles(friend["watched"])) # Create list of movies that only user watched unique_movies = [ @@ -97,7 +101,7 @@ def get_unique_watched(user_data): def get_friends_unique_watched(user_data): # Put movie titles user has watched in a set - user_movie_titles = {movie["title"] for movie in user_data["watched"]} + user_movie_titles = get_titles(user_data["watched"]) # Create a list for movies only friends watched unique_friends_movies = [] @@ -166,7 +170,7 @@ def get_rec_from_favorites(user_data): unique_movies = get_unique_watched(user_data) # Get a set of favorite movie titles - favorite_movies = {fav_movie["title"] for fav_movie in user_data["favorites"]} + favorite_movies = get_titles(user_data["favorites"]) # Filter the unique movies to only those that are in the user's favorites recommended_favorites = [