From 3777b46aeeb57466199b44813f79b9b43ad2ddbe Mon Sep 17 00:00:00 2001 From: Kenneth Kipkoech Date: Sun, 2 Mar 2025 22:23:00 +0300 Subject: [PATCH 1/2] Code challenge completed --- lib/__pycache__/models.cpython-312.pyc | Bin 0 -> 4019 bytes lib/debug.py | 39 ++++++++++-- lib/freebies.db | Bin 20480 -> 24576 bytes lib/models.py | 81 +++++++++++++++++++------ lib/seed.py | 79 +++++++++++++++++++++++- 5 files changed, 176 insertions(+), 23 deletions(-) create mode 100644 lib/__pycache__/models.cpython-312.pyc diff --git a/lib/__pycache__/models.cpython-312.pyc b/lib/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90c44a30c356eaf8727591dd1da4c52be7156364 GIT binary patch literal 4019 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 CFj`*# literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..b349c108b 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,40 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie -from models import Company, Dev +# Connect to the database +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() +# Enter the interactive debugger +import ipdb; ipdb.set_trace() + +# Create some sample data to test +company = Company(name="TechCorp", founding_year=2005) +dev1 = Dev(name="Alice") +dev2 = Dev(name="Bob") + +# Add company and devs to the session +session.add(company) +session.add(dev1) +session.add(dev2) +session.commit() + +# Give a freebie to Alice +company.give_freebie(dev1, "T-Shirt", 10) + +# Check if the freebie was added correctly +freebie = session.query(Freebie).first() +print(freebie.print_details()) # Should print: Alice owns a T-Shirt from TechCorp + +# Test if Alice has received a T-Shirt +print(dev1.received_one("T-Shirt")) # Should return True + +# Give Alice's T-Shirt to Bob +dev1.give_away(dev2, freebie) + +# Verify if the freebie was given away +print(freebie.dev.name) # Should print: Bob diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..b2ebfd030ccdd3d3fe3d4267a907bf35880a5aed 100644 GIT binary patch delta 635 zcmZozz}Rqrae}m2e~?ixGID=I{CONKt(4z@@cp!`1yw@ z_=WoT=qPY;7M3RFm1LGwDtP*ZxVpOrp-3j@=N2U9RmNwgz@$N1Qc}x+B9q_q$<%|m zZvH{8p6-4M-mZ}v2o0JFL9TADL9TwzuE7crVW8s_G%`~((KSKLL(u>ff~e)vY&2(K z7Z(*}YzhQ>6C?w|tRU}AHsv!B$Khg-`yA1&BFcS0J7t;K#pUH0n>Z(T@`ZB3ZJ2zI zPZGh~{GE?ik%Ni<4g>!O{yUom1upO#2{ExSs4}^vmIdeMl$K=X=M}Tx;$viCkYx%< zP0n!6FDhWazzd9GX8wB&{9pOs@ZSULGvHxnVUT8Y&PXiE$xLNp2bv6D+u3Dhdi z>6nw5oC?u(hykeQ2LBCns2?PhvqyegP{0{oAWQ delta 144 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaT-& zW?>f>6=iJHoV=IUZL$)d2oINLBR4a' class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + + # Foreign key to the company that the developer works for + company_id = Column(Integer, ForeignKey('companies.id')) + + # Relationship: A dev belongs to a company + company = relationship('Company', back_populates='devs') + + # Relationship: A dev can receive many freebies + freebies = relationship('Freebie', back_populates='dev') + + # No need to manually define __init__ since SQLAlchemy handles it automatically + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + quantity = Column(Integer, nullable=False) + + # Foreign keys to associate the freebie with a company and dev + company_id = Column(Integer, ForeignKey('companies.id')) + dev_id = Column(Integer, ForeignKey('devs.id')) + + # Relationships: A freebie belongs to a company and a developer + company = relationship('Company', back_populates='freebies') + dev = relationship('Dev', back_populates='freebies') + + def __init__(self, name, quantity, company, dev): + self.name = name + self.quantity = quantity + self.company = company + self.dev = dev + + +# Create an SQLite database in memory for testing (or you can specify a file path) +engine = create_engine('sqlite:///freebies.db', echo=True) - def __repr__(self): - return f'' +# Create the tables in the database +Base.metadata.create_all(engine) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..51b09f4b6 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,78 @@ -#!/usr/bin/env python3 +from models import Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -# Script goes here! +# Set up the database connection +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +# Enable foreign key support for SQLite +engine.execute("PRAGMA foreign_keys = ON") + +# Create some sample data for companies, developers, and freebies + +# Check if companies already exist in the database +company1 = session.query(Company).filter_by(name="TechCorp").first() +if not company1: + company1 = Company(name="TechCorp", founding_year=2000) + session.add(company1) + +company2 = session.query(Company).filter_by(name="DevSolutions").first() +if not company2: + company2 = Company(name="DevSolutions", founding_year=2010) + session.add(company2) + +session.commit() # Commit to ensure companies are inserted or found + +# Check if devs already exist in the database +dev1 = session.query(Dev).filter_by(name="Alice").first() +if not dev1: + dev1 = Dev(name="Alice", company=company1) + session.add(dev1) + +dev2 = session.query(Dev).filter_by(name="Bob").first() +if not dev2: + dev2 = Dev(name="Bob", company=company1) + session.add(dev2) + +dev3 = session.query(Dev).filter_by(name="Charlie").first() +if not dev3: + dev3 = Dev(name="Charlie", company_id=company2.id) + session.add(dev3) + +session.commit() # Commit to ensure devs are inserted or found + +# Check if freebies already exist in the database +freebie1 = session.query(Freebie).filter_by(name="Free Laptop", dev=dev1).first() +if not freebie1: + freebie1 = Freebie(name="Free Laptop", quantity=5, company=company1, dev=dev1) + session.add(freebie1) + +freebie2 = session.query(Freebie).filter_by(name="Free Phone", dev=dev2).first() +if not freebie2: + freebie2 = Freebie(name="Free Phone", quantity=10, company=company1, dev=dev2) + session.add(freebie2) + +freebie3 = session.query(Freebie).filter_by(name="Free Tablet", dev=dev3).first() +if not freebie3: + freebie3 = Freebie(name="Free Tablet", quantity=15, company=company2, dev=dev3) + session.add(freebie3) + +session.commit() # Commit to ensure freebies are inserted or found + +# Print out the data inserted to verify +print("Companies:") +for company in session.query(Company).all(): + print(f"{company.name} ({company.founding_year})") + +print("\nDevelopers:") +for dev in session.query(Dev).all(): + print(f"{dev.name} from {dev.company.name}") + +print("\nFreebies:") +for freebie in session.query(Freebie).all(): + print(f"{freebie.name} - {freebie.quantity} - {freebie.dev.name} - {freebie.company.name}") + +# Close session +session.close() From 33c784b56647dc344f32393c2bd7f2502a2126da Mon Sep 17 00:00:00 2001 From: Kenneth Kipkoech Date: Sun, 2 Mar 2025 22:27:13 +0300 Subject: [PATCH 2/2] Code challenge completed --- lib/debug.py | 22 +++++++++++----------- lib/models.py | 26 +++++++++++++------------- lib/seed.py | 20 ++++++++++---------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index b349c108b..0b8986eeb 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -9,32 +9,32 @@ Session = sessionmaker(bind=engine) session = Session() -# Enter the interactive debugger + import ipdb; ipdb.set_trace() -# Create some sample data to test + company = Company(name="TechCorp", founding_year=2005) dev1 = Dev(name="Alice") dev2 = Dev(name="Bob") -# Add company and devs to the session + session.add(company) session.add(dev1) session.add(dev2) session.commit() -# Give a freebie to Alice + company.give_freebie(dev1, "T-Shirt", 10) -# Check if the freebie was added correctly + freebie = session.query(Freebie).first() -print(freebie.print_details()) # Should print: Alice owns a T-Shirt from TechCorp +print(freebie.print_details()) + + +print(dev1.received_one("T-Shirt")) -# Test if Alice has received a T-Shirt -print(dev1.received_one("T-Shirt")) # Should return True -# Give Alice's T-Shirt to Bob dev1.give_away(dev2, freebie) -# Verify if the freebie was given away -print(freebie.dev.name) # Should print: Bob + +print(freebie.dev.name) diff --git a/lib/models.py b/lib/models.py index d097d7298..06add1e15 100644 --- a/lib/models.py +++ b/lib/models.py @@ -11,10 +11,10 @@ class Company(Base): name = Column(String, nullable=False) founding_year = Column(Integer, nullable=False) - # Relationship: A company can have many developers + devs = relationship('Dev', back_populates='company', cascade='all, delete-orphan') - # Relationship: A company can give many freebies + freebies = relationship('Freebie', back_populates='company', cascade='all, delete-orphan') def __init__(self, name, founding_year): @@ -22,10 +22,10 @@ def __init__(self, name, founding_year): self.founding_year = founding_year def give_freebie(self, dev, freebie_name, quantity): - # Create a new freebie and associate it with the company and dev + freebie = Freebie(name=freebie_name, quantity=quantity, company=self, dev=dev) - self.freebies.append(freebie) # Add to company's freebies - dev.freebies.append(freebie) # Add to dev's freebies + self.freebies.append(freebie) + dev.freebies.append(freebie) return freebie @@ -35,16 +35,16 @@ class Dev(Base): id = Column(Integer, primary_key=True) name = Column(String, nullable=False) - # Foreign key to the company that the developer works for + company_id = Column(Integer, ForeignKey('companies.id')) - # Relationship: A dev belongs to a company + company = relationship('Company', back_populates='devs') - # Relationship: A dev can receive many freebies + freebies = relationship('Freebie', back_populates='dev') - # No need to manually define __init__ since SQLAlchemy handles it automatically + class Freebie(Base): @@ -54,11 +54,11 @@ class Freebie(Base): name = Column(String, nullable=False) quantity = Column(Integer, nullable=False) - # Foreign keys to associate the freebie with a company and dev + company_id = Column(Integer, ForeignKey('companies.id')) dev_id = Column(Integer, ForeignKey('devs.id')) - # Relationships: A freebie belongs to a company and a developer + company = relationship('Company', back_populates='freebies') dev = relationship('Dev', back_populates='freebies') @@ -69,8 +69,8 @@ def __init__(self, name, quantity, company, dev): self.dev = dev -# Create an SQLite database in memory for testing (or you can specify a file path) + engine = create_engine('sqlite:///freebies.db', echo=True) -# Create the tables in the database + Base.metadata.create_all(engine) diff --git a/lib/seed.py b/lib/seed.py index 51b09f4b6..9cd5a9a3d 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -2,17 +2,17 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -# Set up the database connection + engine = create_engine('sqlite:///freebies.db') Session = sessionmaker(bind=engine) session = Session() -# Enable foreign key support for SQLite + engine.execute("PRAGMA foreign_keys = ON") -# Create some sample data for companies, developers, and freebies -# Check if companies already exist in the database + + company1 = session.query(Company).filter_by(name="TechCorp").first() if not company1: company1 = Company(name="TechCorp", founding_year=2000) @@ -23,9 +23,9 @@ company2 = Company(name="DevSolutions", founding_year=2010) session.add(company2) -session.commit() # Commit to ensure companies are inserted or found +session.commit() + -# Check if devs already exist in the database dev1 = session.query(Dev).filter_by(name="Alice").first() if not dev1: dev1 = Dev(name="Alice", company=company1) @@ -41,9 +41,9 @@ dev3 = Dev(name="Charlie", company_id=company2.id) session.add(dev3) -session.commit() # Commit to ensure devs are inserted or found +session.commit() + -# Check if freebies already exist in the database freebie1 = session.query(Freebie).filter_by(name="Free Laptop", dev=dev1).first() if not freebie1: freebie1 = Freebie(name="Free Laptop", quantity=5, company=company1, dev=dev1) @@ -59,9 +59,9 @@ freebie3 = Freebie(name="Free Tablet", quantity=15, company=company2, dev=dev3) session.add(freebie3) -session.commit() # Commit to ensure freebies are inserted or found +session.commit() + -# Print out the data inserted to verify print("Companies:") for company in session.query(Company).all(): print(f"{company.name} ({company.founding_year})")