From 9d834467ff097e39c8cbbcd6bb3466d44b09902e Mon Sep 17 00:00:00 2001 From: +mitchellengetich <+mitchellngetich24@gmail.com> Date: Wed, 28 May 2025 15:46:29 +0300 Subject: [PATCH] add feebies --- lib/alembic.ini => alembic.ini | 0 lib/freebies.db => freebies.db | Bin 20480 -> 24576 bytes lib/__pycache__/config.cpython-38.pyc | Bin 0 -> 398 bytes lib/config.py | 7 ++ lib/debug.py | 41 +++++++- .../versions/7a71dbf71c64_create_db.py | 24 ----- lib/models.py | 52 ++++++++++- lib/seed.py | 16 ++++ {lib/migrations => migrations}/README | 0 {lib/migrations => migrations}/env.py | 4 +- {lib/migrations => migrations}/script.py.mako | 0 .../65141ab6eb37_create_initial_tables.py | 23 +++-- run.py | 88 ++++++++++++++++++ 13 files changed, 216 insertions(+), 39 deletions(-) rename lib/alembic.ini => alembic.ini (100%) rename lib/freebies.db => freebies.db (81%) create mode 100644 lib/__pycache__/config.cpython-38.pyc create mode 100644 lib/config.py delete mode 100644 lib/migrations/versions/7a71dbf71c64_create_db.py rename {lib/migrations => migrations}/README (100%) rename {lib/migrations => migrations}/env.py (97%) rename {lib/migrations => migrations}/script.py.mako (100%) rename lib/migrations/versions/5f72c58bf48c_create_companies_devs.py => migrations/versions/65141ab6eb37_create_initial_tables.py (54%) create mode 100644 run.py diff --git a/lib/alembic.ini b/alembic.ini similarity index 100% rename from lib/alembic.ini rename to alembic.ini diff --git a/lib/freebies.db b/freebies.db similarity index 81% rename from lib/freebies.db rename to freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..e219f91ff152193adc1c6ea62c8e50b61079005c 100644 GIT binary patch delta 709 zcmZozz}Rqrae}lU7Xt$W8xX?)%S0VxaV`eEa4%l|9}KKKyBPR+`FHZw^GWgS+SusA zW6~7M$}TP|%h<|Wl9-f}npTvWnv|JZ45QhcgIpa$TopnboqSvsprVr<`DC0jOHy;= z^AdAY6~Y{YoIMvb$LYY8!DY*Fuxq7<$DR{d^Y9JJ7Dg?Q@xdyrVIlBfc zK!ibxH8N8)@mK(KoH5WH@jx2YV2Gk$;r$^NWBzd0+|w$T3n*w3<*v4 z3qp*TVjx$r@SkPi|IGgk=#H}tn}r1S@H=y|Ff&Mk?MvlhW@eCw*^$c4#LOTIHr6Gz zjGGaO12JhM1OIFOEBpueHv)aLkl&w|g^fX!k&)3iGbdY;g++*&jX@sBbxg@fEzT@U kEtX?u7G+{%Pz8#CO${!|OwLX%;$mVFW&{aya-s+W0NI+xm;e9( delta 120 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaTlQ r#dk}P$285{DB08^Db2(pd6U8yej#K5UXW1&K-Ks8Cr*%NL*)VhkJ1_o diff --git a/lib/__pycache__/config.cpython-38.pyc b/lib/__pycache__/config.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76cd922582e9bec6f979f9e765e9377aa5e2ddfd GIT binary patch literal 398 zcmYjNu};G<5cMT#8mbm`;Uh969x5>)R3XHSDj^mxRT5tt3p)w6sZ`d^d!YJ~e%ld=P&!PAqAr&{2Zb=}S1kDTxfZ-nKz=R?+k%)jH z$nXGSgdvV(^adiv_`t*%Bf>fQRu2hv$p}ci1WXPytT#- zi`a;ukB_!u{BShw$0v6Y-ICcmv&q06;CsdE)*v^^leE^z?{J5@?F=@aSFJ?8s;MVi x@NVzxw#m9hcA7Brwy0`zq;TJnEZo>co literal 0 HcmV?d00001 diff --git a/lib/config.py b/lib/config.py new file mode 100644 index 000000000..890d365ad --- /dev/null +++ b/lib/config.py @@ -0,0 +1,7 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, declarative_base + +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() +Base = declarative_base() diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..546795866 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,40 @@ #!/usr/bin/env python3 -from sqlalchemy import create_engine -from models import Company, Dev +# debug.py -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() +from config import session, engine +from models import Dev, Company, Freebie +from sqlalchemy import create_engine, inspect +def show_tables(): + inspector = inspect(engine) + tables = inspector.get_table_names() + print("Tables in the database:", tables) + +def add_sample_data(): + print("Adding sample data...") + dev = Dev(name="Chance") + company = Company(name="Chancy Founders", founding_year=2024) + freebie = Freebie(item_name="Milk", value=25, dev=dev, company=company) + + session.add_all([dev, company, freebie]) + session.commit() + print("Yay!Sample data added!") + +def query_data(): + print("--------/n Querying data...--------------------/n") + devs = session.query(Dev).all() + companies = session.query(Company).all() + freebies = session.query(Freebie).all() + + print(f"Devs: {[d.name for d in devs]}") + print(f"Companies: {[c.name for c in companies]}") + print(f"Freebies: [{', '.join(f'{f.item_name} (value: {f.value})' for f in freebies)}]") + +def main(): + show_tables() + add_sample_data() + query_data() + +if __name__ == "__main__": + main() diff --git a/lib/migrations/versions/7a71dbf71c64_create_db.py b/lib/migrations/versions/7a71dbf71c64_create_db.py deleted file mode 100644 index 23e0a655b..000000000 --- a/lib/migrations/versions/7a71dbf71c64_create_db.py +++ /dev/null @@ -1,24 +0,0 @@ -"""create db - -Revision ID: 7a71dbf71c64 -Revises: -Create Date: 2023-03-15 15:05:55.516631 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '7a71dbf71c64' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade() -> None: - pass - - -def downgrade() -> None: - pass diff --git a/lib/models.py b/lib/models.py index 2681bee5a..398ea7225 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,8 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +from lib.config import session + convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", @@ -16,14 +18,60 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', back_populates='company') + devs = relationship('Dev', secondary='freebies', back_populates='companies', viewonly=True) + + def __repr__(self): return f'' + + + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + session.add(freebie) + session.commit() + + @classmethod + def oldest_company(cls): + return session.query(cls).order_by(cls.founding_year).first() + class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + id = Column(Integer, primary_key=True) + name = Column(String) + + freebies = relationship('Freebie', back_populates='dev') + companies = relationship('Company', secondary='freebies', back_populates='devs', viewonly=True) def __repr__(self): return f'' + + def received_one(self, item_name): + return any(f.item_name == item_name for f in self.freebies) + + def give_away(self, dev, freebie): + + if freebie in self.freebies: + freebie.dev = dev + session.commit() + + +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 f"{self.dev.name} owns a {self.item_name} from {self.company.name}" diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..e628fe357 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,19 @@ #!/usr/bin/env python3 # Script goes here! +from config import session +from models import Dev, Company, Freebie + +dev1 = Dev(name="Alice") +company1 = Company(name="Tech Corp", founding_year=2010) +freebie1 = Freebie(item_name="Sticker", value=5, dev=dev1, company=company1) + +session.add_all([dev1, company1, freebie1]) +session.commit() + +dev2 = Dev(name="Bob") +company2 = Company(name="Acme Corp", founding_year=2015) +freebie2 = Freebie(item_name="Sticker", value=5, dev=dev2, company=company2) + +session.add_all([dev2, company2, freebie2]) +session.commit() \ No newline at end of file diff --git a/lib/migrations/README b/migrations/README similarity index 100% rename from lib/migrations/README rename to migrations/README diff --git a/lib/migrations/env.py b/migrations/env.py similarity index 97% rename from lib/migrations/env.py rename to migrations/env.py index c7aab9656..793d3f959 100644 --- a/lib/migrations/env.py +++ b/migrations/env.py @@ -4,6 +4,7 @@ from sqlalchemy import pool from alembic import context +from lib.models import Base # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -18,7 +19,6 @@ # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata -from models import Base target_metadata = Base.metadata # other values from the config, defined by the needs of env.py, @@ -66,7 +66,7 @@ def run_migrations_online() -> None: with connectable.connect() as connection: context.configure( - connection=connection, target_metadata=target_metadata, render_as_batch=True, + connection=connection, target_metadata=target_metadata ) with context.begin_transaction(): diff --git a/lib/migrations/script.py.mako b/migrations/script.py.mako similarity index 100% rename from lib/migrations/script.py.mako rename to migrations/script.py.mako diff --git a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py b/migrations/versions/65141ab6eb37_create_initial_tables.py similarity index 54% rename from lib/migrations/versions/5f72c58bf48c_create_companies_devs.py rename to migrations/versions/65141ab6eb37_create_initial_tables.py index c191bb2f9..04d625db8 100644 --- a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py +++ b/migrations/versions/65141ab6eb37_create_initial_tables.py @@ -1,8 +1,8 @@ -"""create companies, devs +"""create initial tables -Revision ID: 5f72c58bf48c -Revises: 7a71dbf71c64 -Create Date: 2023-03-15 15:06:20.944586 +Revision ID: 65141ab6eb37 +Revises: +Create Date: 2025-05-28 15:16:07.627075 """ from alembic import op @@ -10,8 +10,8 @@ # revision identifiers, used by Alembic. -revision = '5f72c58bf48c' -down_revision = '7a71dbf71c64' +revision = '65141ab6eb37' +down_revision = None branch_labels = None depends_on = None @@ -29,11 +29,22 @@ def upgrade() -> None: sa.Column('name', sa.String(), nullable=True), sa.PrimaryKeyConstraint('id') ) + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.Column('company_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_freebies_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_freebies_dev_id_devs')), + sa.PrimaryKeyConstraint('id') + ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') op.drop_table('devs') op.drop_table('companies') # ### end Alembic commands ### diff --git a/run.py b/run.py new file mode 100644 index 000000000..5744d5d9e --- /dev/null +++ b/run.py @@ -0,0 +1,88 @@ +# run.py + +from lib.config import session +from lib.models import Company, Dev, Freebie + + +def add_company(): + name = input("Enter company name: ") + year = int(input("Enter founding year: ")) + company = Company(name=name, founding_year=year) + session.add(company) + session.commit() + print("āœ… Company added!") + + +def fetch_all_companies(): + companies = session.query(Company).all() + for company in companies: + print(company) + + +def add_dev(): + name = input("Enter developer name: ") + dev = Dev(name=name) + session.add(dev) + session.commit() + print("āœ… Developer added!") + + +def fetch_all_devs(): + devs = session.query(Dev).all() + for dev in devs: + print(dev) + + +def add_freebie(): + item = input("Enter freebie item name: ") + value = int(input("Enter value: ")) + dev_id = int(input("Enter Dev ID: ")) + company_id = int(input("Enter Company ID: ")) + freebie = Freebie(item_name=item, value=value, dev_id=dev_id, company_id=company_id) + session.add(freebie) + session.commit() + print("āœ… Freebie added!") + + +def fetch_all_freebies(): + freebies = session.query(Freebie).all() + for freebie in freebies: + print(freebie) + + +def main(): + actions = { + "1": add_company, + "2": fetch_all_companies, + "3": add_dev, + "4": fetch_all_devs, + "5": add_freebie, + "6": fetch_all_freebies, + } + + while True: + print("\n======= Freebie Tracker CLI =======") + print("1. Add a Company") + print("2. View all Companies") + print("3. Add a Developer") + print("4. View all Developers") + print("5. Add a Freebie") + print("6. View all Freebies") + print("0. Exit") + print("===================================") + + choice = input("Choose an option: ") + + if choice == "0": + print("\nšŸ‘‹ Goodbye! Thank you for using Freebie Tracker!") + break + + action = actions.get(choice) + if action: + action() + else: + print("Invalid option. Please try again.") + + +if __name__ == "__main__": + main()