Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C18 Cheetahs - Sarah Sanborn #25

Open
wants to merge 28 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
36d5563
Forgot to commit until now. Passed Wave 1 and 2. Passed 11th test of …
sarahsanborn Oct 4, 2022
92ef56e
Passed 12th test of Wave 3.
sarahsanborn Oct 4, 2022
1700634
Passed 13th test of Wave 3.
sarahsanborn Oct 4, 2022
8a44ef6
passed test 14 of Wave 3.
sarahsanborn Oct 4, 2022
638005f
passed first integration tests for waves 1, 2, and 3. Updated output …
sarahsanborn Oct 5, 2022
fe96f48
Created swap_first_item function from Wave 4.
sarahsanborn Oct 5, 2022
9d92db0
Passed test 16 in Wave 4. Moved vendor.add(self.inventory[0]) up one …
sarahsanborn Oct 5, 2022
82bb400
passed test 17 of Wave 4. No edits to code needed, just uncommented t…
sarahsanborn Oct 5, 2022
dd2a068
Passed test 18 of Wave 4. Uncommented test with no code changes neede…
sarahsanborn Oct 5, 2022
31e0e50
Passed test 18 in Wave 5. Created dunder init in Clothing class as we…
sarahsanborn Oct 5, 2022
0d557b3
Passed test 20 of Wave 5. Added dunder init constructor to Decor clas…
sarahsanborn Oct 5, 2022
64888fc
Passed test 21 of Wave 5. Added dunder init to Electronics class in e…
sarahsanborn Oct 5, 2022
6dcc516
Passed test 22 in Wave 5. Tried importing test for a later test, but …
sarahsanborn Oct 5, 2022
18e7270
Imported item to the Clothing, Decor, and Electronic classes. Also ad…
sarahsanborn Oct 6, 2022
cce24a0
Passed test 23 in Wave 5. Implemented Item as a parent class for Clot…
sarahsanborn Oct 6, 2022
fd4ad66
Implemented list comprehension in my get_by_category instance method …
sarahsanborn Oct 6, 2022
f23421a
Passed 24th test in Wave 6. Implemented best_by_category function usi…
sarahsanborn Oct 6, 2022
c8fc034
Passed 25th test in Wave 6. Added docstring to get_best_by_category. …
sarahsanborn Oct 6, 2022
23795d9
Passed test 26 of Wave 6. Uncommented test.
sarahsanborn Oct 6, 2022
aba2f2e
Passed test 27 of Wave 6. Added assert statements to test_swap_best_b…
sarahsanborn Oct 6, 2022
3975c2f
Passed test 28 of Wave 6. Added assert statements, commented test ski…
sarahsanborn Oct 6, 2022
f055e10
Passed test 29 of Wave 6. Commented out test skip decorator. Passed w…
sarahsanborn Oct 6, 2022
2d644aa
Passed test 30 of Wave 6. Commented test skip decorator. Passed witho…
sarahsanborn Oct 6, 2022
1af9f0f
Passed test 31 of Wave 6. Added assert statements to test_swap_best_b…
sarahsanborn Oct 6, 2022
4b3538d
Passed test 32 of Wave 6. Added assert statements to test.
sarahsanborn Oct 6, 2022
34ef29e
Passed final integration test. Commented out integration test decorator.
sarahsanborn Oct 6, 2022
608628f
Updated swap_first_item to DRY code.
sarahsanborn Oct 6, 2022
ca0636e
Updated swap_first_item method so my conditional checks if inventory …
sarahsanborn Oct 7, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions swap_meet/clothing.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
class Clothing:
pass
from swap_meet.item import Item

class Clothing(Item):

def __init__(self, category = "Clothing", condition = 0):
super().__init__(category = None, condition = 0)
self.category = category
self.condition = condition

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This constructor works but it's actually doing more work than is necessary.

Let's say a user calls your constructor and creates a new instance of the clothing class like this:

shirt = Clothing("shirt", 3)

The function now has the following variables: category = "shirt" and condition = 3

The next thing that happens is

super().__init__(category=None, condition=0)

This line calls super() which in this case is the Item class. And then it calls the Item class's __init__() method. Doing super().__init__() specifies that we want to take advantage of inheritance by using the code already written in the parent class here. So, under the hood, Python is going to grab that code, but run it here in the context of this class. So, it's going to pass category = None and condition = 0 into the function which will update shirt's attributes to be:

shirt.category = None
shirt.condition = 0

Next we have lines 7 & 8 which update shirt's attributes again, but this time with the arguments passed into the Clothing constructor and now stored in the category and condition variables. This gives us:

shirt.category = "shirt"
shirt.category = 3

To prevent your code from updating the attributes twice, we should either call super().__init__() and pass the variables in there or declare the attributes and bind them locally like you did on lines 7 and 8. I would recommend using super().__init__() because it ensures that attributes of Clothing and Item are being handled the same way.

Another thing to note is that I was able to update the category to be "shirt" even though it should have a category of "Clothing". To prevent changes to the Clothing class's category, you can remove category from the Clothing constructor's parameters and hardcode the value instead.

So, you could refactor this constructor to be:

def __init__(self, condition=0):
     super().__init__("Clothing", condition)

Now, users won't be able to change the category and the attributes will only be updated once. 😄


def __str__(self):
return "The finest clothing you could wear."
13 changes: 11 additions & 2 deletions swap_meet/decor.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
class Decor:
pass
from swap_meet.item import Item

class Decor(Item):

def __init__(self, category = "Decor", condition = 0):
super().__init__(category = None, condition = 0)
self.category = category
self.condition = condition

def __str__(self):
return "Something to decorate your space."
13 changes: 11 additions & 2 deletions swap_meet/electronics.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
class Electronics:
pass
from swap_meet.item import Item

class Electronics(Item):

def __init__(self, category = "Electronics", condition = 0):
super().__init__(category = None, condition = 0)
self.category = category
self.condition = condition

def __str__(self):
return "A gadget full of buttons and secrets."
25 changes: 24 additions & 1 deletion swap_meet/item.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,25 @@
class Item:
pass

def __init__(self, category = None, condition = 0):
if category is None:
category = ""

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Strings are an immutable data type so it's safe to set them as a default value in your constructor :)

self.category = category
self.condition = condition

def __str__(self):
return "Hello World!"

def condition_description(self):
if self.condition >= 5:
return "Perfect in every way!"
elif self.condition >= 4:
return "Not bad, not bad"
elif self.condition >= 3:
return "I've seen worse"
elif self.condition >= 2:
return "Well, at least it's free"
elif self.condition >= 1:
return "Better than a poke in the eye with a sharp stick"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lol love this condition 😆

Nice job with your Item class!

elif self.condition > 0:
return "Oof"

68 changes: 66 additions & 2 deletions swap_meet/vendor.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,66 @@
class Vendor:
pass
from operator import itemgetter
from swap_meet.item import Item


class Vendor(Item):
def __init__(self, inventory = None):
if inventory is None:
inventory = []
super().__init__(category = None, condition = 0)
self.inventory = inventory


def add(self, item):
self.inventory.append(item)
return item

def remove(self, item):
if item not in self.inventory:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This approach works, but consider how a try-except block could improve your time complexity. 🤔 💭 😌

return False
self.inventory.remove(item)
return item

def get_by_category(self, category):
items_list = [item for item in self.inventory if item.category == category]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice list comprehension 😎


if items_list == []:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider if this conditional is necessary. What would happen if this function only had the list comprehension and return items_list 🤔 💭 😌

Also! this is a small note but it's more Pythonic to write if items_list: or if not items_list: since lists are truthy/falsey

return []
return items_list

def swap_items(self, vendor, my_item, their_item):
if my_item not in self.inventory or their_item not in vendor.inventory:
return False

# I hard-coded this, but was curious about how this could be scaled-up.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what you mean by "hard coded". That usually refers to having hard coded data where it would be better to use a variable or something that would leave room for different values.

That said, this function looks great! You could probably use a try-except here too to make this more efficient though.

# What would happen if this swap-meet went viral?
self.add(their_item)
self.remove(my_item)
vendor.add(my_item)
vendor.remove(their_item)
return True

def swap_first_item(self, vendor):
if len(self.inventory) == 0 or len(vendor.inventory) == 0:
return False

self.swap_items(vendor, self.inventory[0], vendor.inventory[0])
return True

def get_best_by_category(self, category):
if self.get_by_category(category) == []:
return None
best_item = max(self.get_by_category(category), key = lambda i : i.condition)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ooo! Great usage of the max() function with a lambda function! 🤩

return best_item

def swap_best_by_category(self, other, my_priority, their_priority):
'''
Input: other (for other vendor), my_priority (category vendor prefers),and their_priority (category other vendor prefers)
Output: Returns True if swap is successful. Returns False if swap is unsuccessful
'''
vendor_best_item = self.get_best_by_category(their_priority)
other_best_item = other.get_best_by_category(my_priority)

if vendor_best_item is None or other_best_item is None:
return False
self.swap_items(other, vendor_best_item, other_best_item)
return True
2 changes: 1 addition & 1 deletion tests/integration_tests/test_wave_01_02_03.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from swap_meet.vendor import Vendor
from swap_meet.item import Item

@pytest.mark.skip
#@pytest.mark.skip
@pytest.mark.integration_test
def test_integration_wave_01_02_03():
# make a vendor
Expand Down
2 changes: 1 addition & 1 deletion tests/integration_tests/test_wave_04_05_06.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from swap_meet.decor import Decor
from swap_meet.electronics import Electronics

@pytest.mark.skip
#@pytest.mark.skip
@pytest.mark.integration_test
def test_integration_wave_04_05_06():
camila = Vendor()
Expand Down
13 changes: 7 additions & 6 deletions tests/unit_tests/test_wave_01.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
import pytest
from swap_meet.vendor import Vendor

@pytest.mark.skip
#@pytest.mark.skip
def test_vendor_has_inventory():
vendor = Vendor()
assert len(vendor.inventory) == 0

@pytest.mark.skip
#@pytest.mark.skip
def test_vendor_takes_optional_inventory():
inventory = ["a", "b", "c"]
vendor = Vendor(inventory=inventory)
Expand All @@ -16,7 +16,7 @@ def test_vendor_takes_optional_inventory():
assert "b" in vendor.inventory
assert "c" in vendor.inventory

@pytest.mark.skip
#@pytest.mark.skip
def test_adding_to_inventory():
vendor = Vendor()
item = "new item"
Expand All @@ -27,7 +27,7 @@ def test_adding_to_inventory():
assert item in vendor.inventory
assert result == item

@pytest.mark.skip
#@pytest.mark.skip
def test_removing_from_inventory_returns_item():
item = "item to remove"
vendor = Vendor(
Expand All @@ -40,7 +40,7 @@ def test_removing_from_inventory_returns_item():
assert item not in vendor.inventory
assert result == item

@pytest.mark.skip
#@pytest.mark.skip
def test_removing_not_found_is_false():
item = "item to remove"
vendor = Vendor(
Expand All @@ -49,7 +49,8 @@ def test_removing_not_found_is_false():

result = vendor.remove(item)

raise Exception("Complete this test according to comments below.")
#raise Exception("Complete this test according to comments below.")
# *********************************************************************
# ****** Complete Assert Portion of this test **********
# *********************************************************************
assert result == False
9 changes: 5 additions & 4 deletions tests/unit_tests/test_wave_02.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
from swap_meet.vendor import Vendor
from swap_meet.item import Item

@pytest.mark.skip
#@pytest.mark.skip
def test_items_have_blank_default_category():
item = Item()
assert item.category == ""

@pytest.mark.skip
#@pytest.mark.skip
def test_get_items_by_category():
item_a = Item(category="clothing")
item_b = Item(category="electronics")
Expand All @@ -23,7 +23,7 @@ def test_get_items_by_category():
assert item_c in items
assert item_b not in items

@pytest.mark.skip
# @pytest.mark.skip
def test_get_no_matching_items_by_category():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand All @@ -34,7 +34,8 @@ def test_get_no_matching_items_by_category():

items = vendor.get_by_category("electronics")

raise Exception("Complete this test according to comments below.")
# raise Exception("Complete this test according to comments below.")
# *********************************************************************
# ****** Complete Assert Portion of this test **********
# *********************************************************************
assert items == []
12 changes: 6 additions & 6 deletions tests/unit_tests/test_wave_03.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
from swap_meet.vendor import Vendor
from swap_meet.item import Item

@pytest.mark.skip
#@pytest.mark.skip
def test_item_overrides_to_string():
item = Item()

stringified_item = str(item)

assert stringified_item == "Hello World!"

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_items_returns_true():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand Down Expand Up @@ -38,7 +38,7 @@ def test_swap_items_returns_true():
assert item_b in jolie.inventory
assert result

@pytest.mark.skip
# @pytest.mark.skip
def test_swap_items_when_my_item_is_missing_returns_false():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand All @@ -65,7 +65,7 @@ def test_swap_items_when_my_item_is_missing_returns_false():
assert item_e in jolie.inventory
assert not result

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_items_when_their_item_is_missing_returns_false():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand All @@ -92,7 +92,7 @@ def test_swap_items_when_their_item_is_missing_returns_false():
assert item_e in jolie.inventory
assert not result

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_items_from_my_empty_returns_false():
fatimah = Vendor(
inventory=[]
Expand All @@ -112,7 +112,7 @@ def test_swap_items_from_my_empty_returns_false():
assert len(jolie.inventory) == 2
assert not result

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_items_from_their_empty_returns_false():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand Down
6 changes: 3 additions & 3 deletions tests/unit_tests/test_wave_04.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from swap_meet.vendor import Vendor
from swap_meet.item import Item

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_first_item_returns_true():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand Down Expand Up @@ -30,7 +30,7 @@ def test_swap_first_item_returns_true():
assert item_a in jolie.inventory
assert result

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_first_item_from_my_empty_returns_false():
fatimah = Vendor(
inventory=[]
Expand All @@ -48,7 +48,7 @@ def test_swap_first_item_from_my_empty_returns_false():
assert len(jolie.inventory) == 2
assert not result

@pytest.mark.skip
#@pytest.mark.skip
def test_swap_first_item_from_their_empty_returns_false():
item_a = Item(category="clothing")
item_b = Item(category="clothing")
Expand Down
10 changes: 5 additions & 5 deletions tests/unit_tests/test_wave_05.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,25 @@
from swap_meet.decor import Decor
from swap_meet.electronics import Electronics

@pytest.mark.skip
#@pytest.mark.skip
def test_clothing_has_default_category_and_to_str():
cloth = Clothing()
assert cloth.category == "Clothing"
assert str(cloth) == "The finest clothing you could wear."

@pytest.mark.skip
#@pytest.mark.skip
def test_decor_has_default_category_and_to_str():
decor = Decor()
assert decor.category == "Decor"
assert str(decor) == "Something to decorate your space."

@pytest.mark.skip
#@pytest.mark.skip
def test_electronics_has_default_category_and_to_str():
electronics = Electronics()
assert electronics.category == "Electronics"
assert str(electronics) == "A gadget full of buttons and secrets."

@pytest.mark.skip
#@pytest.mark.skip
def test_items_have_condition_as_float():
items = [
Clothing(condition=3.5),
Expand All @@ -31,7 +31,7 @@ def test_items_have_condition_as_float():
for item in items:
assert item.condition == pytest.approx(3.5)

@pytest.mark.skip
#@pytest.mark.skip
def test_items_have_condition_descriptions_that_are_the_same_regardless_of_type():
items = [
Clothing(condition=5),
Expand Down
Loading