diff --git a/__pycache__/models.cpython-311.pyc b/__pycache__/models.cpython-311.pyc new file mode 100644 index 000000000..f6303adaf Binary files /dev/null and b/__pycache__/models.cpython-311.pyc differ diff --git a/create_db.py b/create_db.py new file mode 100644 index 000000000..9c313a4fb --- /dev/null +++ b/create_db.py @@ -0,0 +1,10 @@ +from models import Base + +from sqlalchemy import create_engine + +engine = create_engine('sqlite:///freebies.db') + + +Base.metadata.create_all(engine) + +print("✅ freebies.db created and tables initialized!") \ No newline at end of file diff --git a/debug.py b/debug.py new file mode 100644 index 000000000..a35519f6e --- /dev/null +++ b/debug.py @@ -0,0 +1,103 @@ +# debug.py - Alternative testing script + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie, Base + +def display_data(session): + """Helper function to display current data""" + print("\n=== CURRENT DATABASE STATE ===") + companies = session.query(Company).all() + devs = session.query(Dev).all() + freebies = session.query(Freebie).all() + + print("Companies:") + for company in companies: + print(f"- {company.name} (founded {company.founding_year})") + + print("\nDevelopers:") + for dev in devs: + print(f"- {dev.name}") + + print("\nFreebies:") + for freebie in freebies: + print(f"- {freebie.print_details()}") + +def test_relationships(session): + """Test all relationship properties""" + print("\n=== TESTING RELATIONSHIPS ===") + + # Test company.devs + for company in session.query(Company): + dev_names = [dev.name for dev in company.devs] + print(f"{company.name} has developers: {', '.join(dev_names) if dev_names else 'None'}") + + # Test dev.companies + for dev in session.query(Dev): + company_names = [company.name for company in dev.companies] + print(f"{dev.name} has freebies from: {', '.join(company_names) if company_names else 'None'}") + +def test_methods(session): + """Test all class methods""" + print("\n=== TESTING METHODS ===") + + # Test oldest_company + oldest = Company.oldest_company(session) + print(f"Oldest company is {oldest.name} (founded {oldest.founding_year})") + + # Test received_one + dev = session.query(Dev).filter_by(name="Musk").first() + print(f"Does Musk have a T-shirt? {dev.received_one('T-shirt')}") + print(f"Does Musk have a Mug? {dev.received_one('Mug')}") + + # Test give_away + freebie = session.query(Freebie).filter_by(item_name="T-shirt").first() + print(f"\nBefore give_away: {freebie.print_details()}") + dev.give_away(dev=session.query(Dev).filter_by(name="Louis").first(), + freebie=freebie, + session=session) + print(f"After give_away: {freebie.print_details()}") + +def add_new_data(session): + """Add new test data""" + print("\n=== ADDING NEW TEST DATA ===") + + # Add new company + new_company = Company(name="Nvidia", founding_year=1993) + session.add(new_company) + + # Add new dev + new_dev = Dev(name="Linus") + session.add(new_dev) + + session.commit() + + # Give new freebies + company = session.query(Company).filter_by(name="Nvidia").first() + dev = session.query(Dev).filter_by(name="Linus").first() + company.give_freebie(session, dev, "GPU", 1500) + + print("Added Nvidia company, Linus developer, and a GPU freebie") + +if __name__ == '__main__': + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + # Display initial data + display_data(session) + + # Test relationships + test_relationships(session) + + # Test methods + test_methods(session) + + # Add and test new data + add_new_data(session) + + # Display final state + display_data(session) + + session.close() + print("\nDebugging complete!") diff --git a/lib/freebies.db b/freebies.db similarity index 79% rename from lib/freebies.db rename to freebies.db index 12beb1c96..8d77755b7 100644 Binary files a/lib/freebies.db and b/freebies.db differ diff --git a/lib/__pycache__/models.cpython-311.pyc b/lib/__pycache__/models.cpython-311.pyc new file mode 100644 index 000000000..1a71ee455 Binary files /dev/null and b/lib/__pycache__/models.cpython-311.pyc differ diff --git a/lib/debug.py b/lib/debug.py deleted file mode 100644 index 4f922eb69..000000000 --- a/lib/debug.py +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env python3 - -from sqlalchemy import create_engine - -from models import Company, Dev - -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() diff --git a/lib/models.py b/lib/models.py deleted file mode 100644 index 2681bee5a..000000000 --- a/lib/models.py +++ /dev/null @@ -1,29 +0,0 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base - -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) - -Base = declarative_base(metadata=metadata) - -class Company(Base): - __tablename__ = 'companies' - - id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) - - def __repr__(self): - return f'' - -class Dev(Base): - __tablename__ = 'devs' - - id = Column(Integer(), primary_key=True) - name= Column(String()) - - def __repr__(self): - return f'' diff --git a/lib/seed.py b/lib/seed.py deleted file mode 100644 index b16becbbb..000000000 --- a/lib/seed.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python3 - -# Script goes here! diff --git a/models.py b/models.py new file mode 100644 index 000000000..8b4d16ea4 --- /dev/null +++ b/models.py @@ -0,0 +1,96 @@ +from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, MetaData +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship + +convention = { + "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", +} + +metadata = MetaData(naming_convention=convention) + +Base = declarative_base(metadata=metadata) + +class Dev(Base): + __tablename__ = "devs" + + id = Column(Integer, primary_key=True) + name = Column(String()) + + freebies = relationship("Freebie", back_populates="dev") + + + def __repr__(self): + return f"" + + + def _repr_(self): + return f"" + + @property + def companies(self): + """Return a list of companies that have given freebies to this dev""" + return list(set(freebie.company for freebie in self.freebies)) + + def received_one(self, item_name): + """Check if dev has received a freebie with given item_name""" + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie, session): + """Transfer a freebie to another dev if it belongs to this dev""" + if freebie in self.freebies: + freebie.dev = dev + session.commit() + + +class Company(Base): + __tablename__ = "companies" + + id = Column(Integer(), primary_key=True) + name = Column(String()) + founding_year = Column(Integer()) + + freebies = relationship("Freebie", back_populates="company") + + + def __repr__(self): + return f"" + + @property + def devs(self): + return list(set(freebie.dev for freebie in self.freebies)) + + + def give_freebie(self, session, dev, item_name, value): + """Create and return a new freebie for this company and dev""" + freebie = Freebie( + item_name=item_name, + value=value, + dev=dev, + company=self + ) + session.add(freebie) + session.commit() + + @classmethod + def oldest_company(cls, session): + """Return the company with the earliest founding year""" + return session.query(cls).order_by(cls.founding_year).first() + +class Freebie(Base): + __tablename__ = "freebies" + + id = Column(Integer, primary_key=True) + item_name = Column(String()) + value = Column(Integer) + dev_id = Column(Integer, ForeignKey("devs.id")) + company_id = Column(Integer, ForeignKey("companies.id")) + + dev = relationship("Dev", back_populates="freebies") + company = relationship("Company", back_populates="freebies") + + def __repr__(self): + return f"" + + def print_details(self): + """Return a formatted string with freebie details""" + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" diff --git a/seed.py b/seed.py new file mode 100644 index 000000000..cbbf038b8 --- /dev/null +++ b/seed.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +# Script goes here! +from models import Base, Dev, Company, Freebie +from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine + +engine = create_engine('sqlite:///freebies.db') + +Session = sessionmaker(bind=engine) +session = Session() + +# Create devs +dev1 = Dev(name="Musk") +dev2 = Dev(name="Louis") +dev3 = Dev(name="Ada") +dev4 = Dev(name="Grace") + +# Create companies +company1 = Company(name="Grok", founding_year=2023) +company2 = Company(name="OpenAI", founding_year=2015) +company3 = Company(name="Microsoft", founding_year=1975) +company4 = Company(name="Apple", founding_year=1976) + +# Create freebies with relationships +freebie1 = Freebie(item_name="T-shirt", value=20, dev=dev1, company=company2) +freebie2 = Freebie(item_name="Laptop", value=2000, dev=dev2, company=company1) +freebie3 = Freebie(item_name="Stickers", value=5, dev=dev3, company=company4) +freebie4 = Freebie(item_name="Water Bottle", value=15, dev=dev4, company=company3) +freebie5 = Freebie(item_name="Hoodie", value=45, dev=dev1, company=company1) # Changed dev5 to dev1 since we only have 4 devs + +session.add_all([company1, company2, company3, company4, dev1, dev2, dev3, dev4, freebie1, freebie2, freebie3, freebie4, freebie5]) +session.commit() + +print("Database created successfully!")