From 73e7cb549e7c68d0f8b50ca47a8ea80cdb9442c6 Mon Sep 17 00:00:00 2001 From: Collins Kiaritha Date: Fri, 5 Dec 2025 11:12:38 +0300 Subject: [PATCH] all instances have been created --- lib/__pycache__/models.cpython-312.pyc | Bin 0 -> 4522 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 3053 bytes lib/debug.py | 2 +- lib/freebies.db | Bin 20480 -> 24576 bytes lib/migrations/__pycache__/env.cpython-38.pyc | Bin 0 -> 1691 bytes ...bf48c_create_companies_devs.cpython-38.pyc | Bin 0 -> 1069 bytes .../7a71dbf71c64_create_db.cpython-38.pyc | Bin 0 -> 704 bytes ...1b2c3d4e5f6_create_freebies.cpython-38.pyc | Bin 0 -> 1082 bytes .../versions/a1b2c3d4e5f6_create_freebies.py | 31 ++++++++++++ lib/models.py | 46 +++++++++++++++++- lib/seed.py | 24 ++++++++- 11 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 lib/__pycache__/models.cpython-312.pyc create mode 100644 lib/__pycache__/models.cpython-38.pyc create mode 100644 lib/migrations/__pycache__/env.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/a1b2c3d4e5f6_create_freebies.cpython-38.pyc create mode 100644 lib/migrations/versions/a1b2c3d4e5f6_create_freebies.py diff --git a/lib/__pycache__/models.cpython-312.pyc b/lib/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5c39b710501c60a7b5315074e16aad147f06eb1 GIT binary patch literal 4522 zcmcInU2Gf25#Brg9sk51{n%D4iHZCpI+kd|P8>Tno%*+mYsSd6wI?yVc-O4cuBH35s{oHiuZk@_-JI&(U6OBt{=F8CT=U|27%ks#BD2u;^BYd z!noV;ozoc2j^!`VlHoqBz+>0;UlW*AKusZ8@@ z**uLqi~ys#bTO;t_3>=M@QkE06O4`;0iEhPaMkn#WpTj>D>Rc!GmxC3@<>{zz>B1H zUCU(oYPrC)n1cjtTMMyco>`rvXVnaj`mmG_tIY_x1 zvmR^Kc8;`pojv1)8J~iC`W2VOU2@xd24E(rcofOzw4jqyA;kwYOd|?7*E%m1Ed}C1 z!*g0w3+a5x@Md@?OZBVw1;bxpSvAc{@&x$QbB<9ulBI^nlqua87>2kZjhYj>;ZW#Q zrV()bh8R@%TYn7*1iDZm*Z9Onat{LhW5+OwJ1&*I#~ZrDo(W0N!HJ&3f1Tz=b=*Am z?1zbQO{EENWiFf76AINQidrF|XqibBJf$ZtY8Y+l{vT*;B2gHJDCs|xD3prhTE4$< zsK23bf003uQI^PMM-r;0(40O{C>fG0Gg@G>Tn;x>8L&9p;CQ_qNR_NcI`16*_0hXW z@4P<$-CAgGP1?JTx5_w?HX6nSzyB`i%#osPn~GR*RKOZb!eT@Imb2mn3y7EEPQ#lm zQk4g&;hIY4CMoNL^$bss3#3W2}QgYE(dqU9jki-1Y|y_P#H zS8n8YgGTyQAXW1BNO!I0&3fd>wEI!Cd;Z)?^z~`aT6D*392^_jKG!wVbw{s9dLKsi zFGuz-3_t8oF83$vk&_Q2XO|;q>yh)*?o}!D%issW4@0Y=_URyxgiG;Od?@%hW!dn_ zGQ6Kjz**S{$ny2cbgnTIlucMQhYW+A;hhXIt1x^X40UDwNW4f8QrHe8=pn-ikfJk$ z57vicKY+ik0|<|63VQ=M_X*dB$2p6l91>isj{|w1thV)3FMj0>&3I}1ovMC&&A;89K$@2Hmc*HlQ3^Oio{l;V>|K0E+jobOsF^Aid&TfAY=pa0hF+SxZ`$lt~67+ zJux4tg?ejJFLy>p1R1Mg+;Jd&2Rc6&n$c=n7!?%ZeF^ZSc|~L885=b$WZ@wF!j%t! z{Q7YqzY;DG0bE@nKWZi9mQWG4%6K1$6A;cH33Gx#K5TcA68Wv;hHziF1W9!_>;mTJZk0_26=J=-)b;=w~~23gBu7lmh$>#ziyDph`Mg zC-xJr0Tye|k1U5bD}mO~F@oT@N1km(^iH-IGW&OL;# z1@nnpmkLvaNsu^2*-oV;FdjP#i$Gb98<@%B4pVWSAJK{p12*!ZmuJ58jdZCTMBVM- zn<$ElAi?{ix0N|{MqT#zu6A}!pZ~>$#|{$M#Z|u)4>OcyN07XQ z*ao3NOjLUpd*4BF0!c3t%-QUuMY#GyFhVTrd;!aR;hB!v?R8&g^^ApIlZ!uH2_*r( z!aMK0_h8>=-(Lw|tqvl9?Rw%CT$hD)fU$1#EIcLyKfBqGWqzFe-)q?o)v;OIT2IZc zU=h?_l(VZ}TP~ou0otJYMVKo|ajywz7#1eLl|2gNlYy*K4wxwvDqR@8@SJ%hz6Q%) zwrD+P*1!!EI|nPbMzL^1&_=S;AgW_YXO)!6yUAMTzJ*t7q5U;!KX=jw^)P#K^~%se zoY@Lrwt_OKva$Zg5Z%jwLo;{$n4R2psRXzE!aA9es=I~ zc_Ci!Ib09EQ9ZX7*>=}+&-V%K+{(?3&18u&nAJUPj3FjZI)|b zGV5cRg>jkl6nuP{bp!`AZmx|cd?pmxuOI|M=ak_+9o8P|T*;jQwb#50rrj@4z{+=F= Z2;I}Wo)Y+bx+f?M3)9NK2>x?h{s&qo=EeX3 literal 0 HcmV?d00001 diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08c30b3190ea57c6592c467af5fdd7f27e912d16 GIT binary patch literal 3053 zcma)8TW=dh6yDig-`1Bny+SEqC`dIBJE%y22vJ0;B7~Zk7LZoJYU3FvTkpl0S*Nv? zJ|z-;$uB^a+Q0&i+)dI|j;M*H?poONQ|` zb>@qW&IYP_2Eh%^LL*`>i%i#yEZ2%`*NzHqfzg~97Ne3|ipp+T_pPuJIj)1Y%?kl@ ztD+#Pym-vqns7vom(Z$zZ}2j&92vYK>W7xwK;Pk2^sBnRgno_J(XZ=%lQ$k1?WKQ! z#%LEZ=UyU3uoM3%##wPQ2}e)FjoE_Uw?E@RnGq>7yRtZuOX;;b$`+hhQnZ?Dvyo60{ zCYR|`kni9lKOpfwi55gwnxfV!$i=%fUfUrTo=(1v5v7r_CYxNDfu3LTW{c2!Q{x3d zzho~=SjNKFerY@~PS_UMS5iVLICWOo8wm+TC6Wv2ZI82hKN-cGTz@QlnHBnhR4IJl z>V@icyp1G;!BUV!J0QIwSF$;|Hp9EPWUGCNj6$B^d70yRu+<0*^|G4h?T!3!I#c&@ zLgrmbo+e2bnHg|NCX%Ecd7A`+pP`*uUPUXjVFM-KqrqF$uOc`o1?KK1Tz*Q!|d5gpi5@)*7 zY9h6Mf;!_;4SUXbqzQ&uD%2*6k?9njml}T@H&1A=9B^0V-{zO?PG+ z4~*ZMPuT%`WIQtl=FbK*_Dl{>mLFjS;u!G?`N8b0$`8?$v@yr6NmW_f5wUnOlD*SkDLayn(8=Auhx!on>`4)h)`Y@GcWSF0(%JEBZBF3x9(QZSGB&T`Akb5Zyo0Nm`wP@sdAw)!%OT5UTI z96F3@m!`CJ9_O<1zl}k{vW$ljx7KH literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..e0cca5d9f 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -2,7 +2,7 @@ from sqlalchemy import create_engine -from models import Company, Dev +from models import Company, Dev, Freebie if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..3ba31ddee329a0421064042dd2bd9002ffef70bd 100644 GIT binary patch delta 406 zcmZozz}Rqrae}lUI|Bm)8xX?)%S0Vxadrm1vQA$99}KKKyBPR+`FHZw^GWgS+SusA zW6~7M$}TP|%h<|Wl9-f}npTvWnv|JZ45QhcgIpa$TopnboqSvsprVr<`DC0jOHy;= z^AdAY6~Y{YoIMwp1f~aBzH~%14Pj^2BZ`Vi-h`6RgkgJ<(kgK1wYp?=X zjYejQCLZGu7RN)FKyNA-BO8oRfnqp9HOK}o&CODLw*+|-4U>$LjZ;igP1DRaDSY8a M5m;oPu*g9G09E*To&W#< delta 94 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaTlQ e#dk}P$285{DB08^Db2(pd6U8yeiVU41_}T{Q53rX diff --git a/lib/migrations/__pycache__/env.cpython-38.pyc b/lib/migrations/__pycache__/env.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e16a27afe59838afbb5de4f5ec349be3e0c7774 GIT binary patch literal 1691 zcmZvc&2J+$6u|A7$xJdy(+}8c#Q}UPkx)QLyC;N}7LXR9YAIcTBBYTsb`qx^Pq01x zShc6+0EcQN&K%Ms|I%DJ@h>0{JbRLD3rsZ5v!DGw{C;nqZ)~Ipo~_*v#7P^W-`wQx z6T;*Pyyj;Z7-CqW0*^3uav*~u9EDyEL5@a|mm}FK;!%tdkLSrK;mN$sS|=U-1;`Ld|QIEA)@(X5d*7+eCZLDS~>%y$h_#%?+_L?xrqs zawhDI%qwFFCC`t(^!uq|M3u0j$Y(zN_uxobO=q_&1T4}#=L<{6lKWFLt~sHGoN+0K zgzR4sb0QWCp{CwpV~OON`)K`k0#e*VM$rpMP*k;U-ZrQlFEF> zi;H2U<#C-ZsHTOn7n0X4MGMXbQ5}M+-n3Ltxy=f0DWjIw8&X)Vsm#VgF;n-Lppxe{ zD;L%r4w5=Ia)1J%+kz@YBDu8Quu`SzFtZkg3o8JfF&bzfI1yDjnnYu9MM zBK-#Z{jq(kd7rD(;o_p+y?-EE5%D%`H#;z(UWy|e_+R{IoTOMkfYp1z2C(4VcwoN+ z!6J*7fyMLi2Eet^yv2g+@Csd`CE)q$!z*l|BQLS-IE=5Mmu<34R|qG|?tO&s!0dW2 ze(}@)k*xj$@>2zc1oBMI71g2y)*5OY5e_UMX3gwtlBqFeF1*fRqo6u)uMPNjI$;e% z_YMq$ppF-sPsDlMaV?)qFm^l$>-5%8Q@Bmd72`UiCL2?m&khGY9m2ioJ`8o&72hz$_NnNVWArX#njeOO8P4BYtdii^`jqPLtKhlk#FgR3C~)?J0*xuD17 zp(g-+F&23fu+MpGm8ScgX0C@uvHK)Rqhn{Mz3!kUGe@BJTW<=pMmBQ??xf`t^trV^ h0#zmX$L`DO)9D303~%HTNaG%k+x>_A-8OCq{{SFA&h`KR literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6176bef9a9ea4e7c0a8b01a8a37fb5742c44c72 GIT binary patch literal 1069 zcma)5O>fgc5cS%Q?YIdlrK&ha;uMM0`D{vr5K<~cg{Tk(A^Bo$yqm_<-gS4KqHshU z;U92lj{K#)a^f!_5R5<6MuG!t?RaN)=XvM7@#|*O)nIJzb)(;grhUtu%>gm(F--Xs z4AFdzAfm@8(S04|Ya=#%lbC*u)O?E=z75kM2C=>%ViV`1>DMc-PF(O@Vw`I2t@jt9 zpg5zgkS8f-5ta8_gkDP5eMv7P8FAJ+KAN;f^Km~M9nR*%!?4_;a?%>(agWUA<6d|$ zbf+cG5r9ov{ceBI=?*%*QL8tabPp!|?*4<}aCCU!y5FGyt&Nn<(-Xh3iR?Ev5#fj> zXtoqA%riDePSq5q`~W7?t`I?){?;IRreB$B4GJ|s8%3lBks3s->xf;QsUlYv(bs5Q zLnV&$e>hc^3Dj#qWBo+cuL)FoM4rIq9kz^PJd3F^8BXXc)tvJsBN00bRul_m<~+A; zp+gO-QOXcxMS?D|vZg#3*k5GA@@zf(cTqcxd(tFNxB;0w!#krR*u%w-Vm#(q}XPtD=nF~s1 z5$ynUcus{EM>8*p&IHb&AEb9lMcx?F+te{r$jjSLSISOhHQhyG7vAkHWd{N96$Hx0F->MsSfR>`7{}p)CM&T8CzT_r|3o!& zz~IK63CzMp04+dcsa!%+%7_d&D=IC%^UsSp4--z7F@1ypU*@Wsb^|%4iHgU#wfzTe C=@ozg literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e801fe581094132ba799f572ce9ab2ed02048b56 GIT binary patch literal 704 zcmah`y>8nu5T<@?$!c5#DA2B2Jt(x|$_9j@D3A>8&;MT?8Q4rXQuMnmZPKmTE)WHPbv=(013YWfQfF=vHxFR6ObwD>qzGQ5CeV z?iA~=c}*X<>ZhRTP;`EnQx3&hyEERl#dP2=daX7Bv6PSa|Ay2E(~i9iA`cJD1mxFd zU-}i&f2AiF&z>1C&#}imHy#tbE~--XPn$sB3nt1nuXo1Q%=qf*AI-F{mLF-MSW~WZ x!3r+434ph}0iDZcFJAS}3U$f7}0$K1Fc76U%p9YrmZ5?q3*#rt$y) literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/a1b2c3d4e5f6_create_freebies.cpython-38.pyc b/lib/migrations/versions/__pycache__/a1b2c3d4e5f6_create_freebies.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93249f4e7481f0fe8a169a5c28c8603d9086fb66 GIT binary patch literal 1082 zcmZuwL2uJA6poWLNz)b~7@D*L>a~Y1-MX@=LI|nT#Dtg-10m%S(%5ay96Q))QFr2i zxbY7-tVjNmublV`JMofqv=TV-%X^>gFMi*9dDm+B28<88J-TBV#;+pS9)KCoVX7Bk zun`&eC>nxEZ z&PjVB2^mwO+Ic)?#P{Ej1yxk=_W9|s9UqJjlRiEogUOR>g{WbBFgZR<1}Edm(MjTu zDwM2u3i~7cjYTgD}d?j}|s_^Tu8okf;6KDv=r>H9(xdh`ZjiLA(k9>)`qdm3!^- zw7<2|*sR>R*j%BN3%VPiVe>+Jcj{@A;xo9p$LEX{Lh3rrNgDAuC2w_Y5wkhb4kn9; z;%gV)YM)~5CnC*azAV6Ix-8~} ztO43FD+zrpMOF#8$-nY;V4JRE@tK!*cnqN`WH*r91>0$8H;O=#DAI1sNIIs;np1sZ zF-vA7UCN>-wI|nqjcyfm(IybVAM0M@54(CGpa1{> literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/a1b2c3d4e5f6_create_freebies.py b/lib/migrations/versions/a1b2c3d4e5f6_create_freebies.py new file mode 100644 index 000000000..e2175755d --- /dev/null +++ b/lib/migrations/versions/a1b2c3d4e5f6_create_freebies.py @@ -0,0 +1,31 @@ +"""create freebies table + +Revision ID: a1b2c3d4e5f6 +Revises: 5f72c58bf48c +Create Date: 2023-03-15 15:07:00.000000 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a1b2c3d4e5f6' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + 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(), sa.ForeignKey('devs.id'), nullable=True), + sa.Column('company_id', sa.Integer(), sa.ForeignKey('companies.id'), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + + +def downgrade() -> None: + op.drop_table('freebies') diff --git a/lib/models.py b/lib/models.py index 2681bee5a..c95a83d09 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,7 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, create_engine +from sqlalchemy.orm import relationship, backref, sessionmaker from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.associationproxy import association_proxy convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", @@ -16,14 +17,55 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref=backref('company')) + devs = association_proxy('freebies', 'dev') + 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) + return freebie + + @classmethod + def oldest_company(cls): + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + result = session.query(cls).order_by(cls.founding_year).first() + session.close() + return result + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', backref=backref('dev')) + companies = association_proxy('freebies', 'company') + def __repr__(self): return f'' + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev = dev + +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')) + + 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..d7a9ffa59 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,25 @@ #!/usr/bin/env python3 -# Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie + +if __name__ == '__main__': + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + # Seed companies + google = Company(name="Google", founding_year=1998) + facebook = Company(name="Facebook", founding_year=2004) + + # Seed devs + rick = Dev(name="Rick") + morty = Dev(name="Morty") + + # Seed freebies + freebie1 = Freebie(item_name="Sticker", value=1, dev=rick, company=google) + freebie2 = Freebie(item_name="T-shirt", value=10, dev=morty, company=facebook) + + session.add_all([google, facebook, rick, morty, freebie1, freebie2]) + session.commit()