From 614a558588ac3ed00e8b0bae297a295c086983f7 Mon Sep 17 00:00:00 2001 From: Elisha Date: Sat, 6 Jan 2024 23:34:13 +0300 Subject: [PATCH 1/7] Generate sample data --- lib/seed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..63f8e58c7 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,3 @@ #!/usr/bin/env python3 -# Script goes here! +# Generating sample data \ No newline at end of file From b9d8ce09a34ab5ab9b576550785dd76308cc60bd Mon Sep 17 00:00:00 2001 From: Elisha Date: Sun, 7 Jan 2024 07:33:38 +0300 Subject: [PATCH 2/7] creating freebie model --- lib/models.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/models.py b/lib/models.py index 2681bee5a..85a8492ae 100644 --- a/lib/models.py +++ b/lib/models.py @@ -27,3 +27,16 @@ class Dev(Base): def __repr__(self): return f'' + +class Freebie(Base): + __tablename__= 'freebies' + + id = Column(Integer(), primary_key=True) + name = Column(String()) + value = Column(Integer()) + + def __repr__(self) -> str: + return f'Freebie(id={self.id}, ' + \ + f'name={self.name}, ' + \ + f'value={self.value})' + From 8c2df33b46fab523c347cfd44dde122876313fc7 Mon Sep 17 00:00:00 2001 From: Elisha Date: Sun, 7 Jan 2024 07:46:22 +0300 Subject: [PATCH 3/7] creating freebie model --- lib/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/models.py b/lib/models.py index 85a8492ae..5a1273558 100644 --- a/lib/models.py +++ b/lib/models.py @@ -16,6 +16,8 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref=backref('companies')) + def __repr__(self): return f'' @@ -34,6 +36,7 @@ class Freebie(Base): id = Column(Integer(), primary_key=True) name = Column(String()) value = Column(Integer()) + company_id = Column(Integer(), ForeignKey('companies.id')) def __repr__(self) -> str: return f'Freebie(id={self.id}, ' + \ From 267b8d332a7db192d4e2aaf2f856d54d822de904 Mon Sep 17 00:00:00 2001 From: Elisha Date: Sun, 7 Jan 2024 07:53:14 +0300 Subject: [PATCH 4/7] migration for freebie model --- lib/freebies.db | Bin 20480 -> 24576 bytes .../8b8cc2e88779_add_freebie_model.py | 35 ++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 lib/migrations/versions/8b8cc2e88779_add_freebie_model.py diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..9b100f2f22862b4206231a3c77afd1f4dcff9bae 100644 GIT binary patch delta 287 zcmZozz}Rqrae}lUI|Bm)8xX?)%S0Vxadrm1a4%l|9}KL#3JmC5jyj>$T5DGLEf?VBPgIxWbU4s=M!XU*OnJJoFnwzEgZVB>OBv~XU8>L!U Un44Q}QuxA;BCyCnVUdFX0HaS+&j0`b 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/versions/8b8cc2e88779_add_freebie_model.py b/lib/migrations/versions/8b8cc2e88779_add_freebie_model.py new file mode 100644 index 000000000..12f7c17cc --- /dev/null +++ b/lib/migrations/versions/8b8cc2e88779_add_freebie_model.py @@ -0,0 +1,35 @@ +"""Add Freebie model + +Revision ID: 8b8cc2e88779 +Revises: 5f72c58bf48c +Create Date: 2024-01-07 07:52:12.904907 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8b8cc2e88779' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('value', 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.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') + # ### end Alembic commands ### From c80af2ced16052728894f5cecd17bc32676b2ae8 Mon Sep 17 00:00:00 2001 From: Elisha Date: Sun, 7 Jan 2024 11:14:07 +0300 Subject: [PATCH 5/7] pupolating smaple data --- lib/seed.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/seed.py b/lib/seed.py index 63f8e58c7..b14b244bf 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,49 @@ #!/usr/bin/env python3 -# Generating sample data \ No newline at end of file +from faker import Faker +from datetime import datetime +import random + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Company, Freebie + +if __name__== '__main__': + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + session.query(Company).delete() + session.query(Freebie).delete() + + fake = Faker() + + companies = [] + for i in range(50): + company = Company( + name=fake.unique.name(), + founding_year= fake.date_between_dates(date_start=datetime(2002, 1, 1), date_end=datetime(2015, 12, 31)).year + ) + + # add and commit individually to get IDs back + session.add(company) + session.commit() + + companies.append(company) + + + freebies = [] + for company in companies: + for i in range(random.randint(1,5)): + freebie = Freebie( + name = fake.name(), + value = random.randint(100, 1000), + company_id = company.id, + ) + + freebies.append(freebie) + + session.bulk_save_objects(freebies) + session.commit() + session.close() From c574af6380199d912449bab030d53c55174c044d Mon Sep 17 00:00:00 2001 From: Elisha Date: Sun, 7 Jan 2024 11:14:37 +0300 Subject: [PATCH 6/7] add data to the db --- lib/freebies.db | Bin 24576 -> 24576 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/freebies.db b/lib/freebies.db index 9b100f2f22862b4206231a3c77afd1f4dcff9bae..e43483278f2517af436f66bb59041c31ea04d002 100644 GIT binary patch literal 24576 zcmeHPeQX=&dA|>mM^YqDBJX&VzjTT%TeAEmyJ_5HPC`+#Y<*dwR4Yl_DJSw3c@}vm z-yJ1W>*}%z0(mFLxv&UT*qb>`U-skzf&-=X3{hkx&ADA{hqOaIa-SG5dTsOz_-2J-F zaopW_NAT{vLij-6ofqHv@IU;#n>(~PnUp`^!bzQzlk(S77gO8tF?aBP$Le%O-I=ZdFi^2LYrsqu&OL9;wW+X`o9=NF23%%ZQXE_LQ!x*?$b5$ftE&lJZ`Pt4Ns zgEu-1>BaGrhgw~t zr1kajEy8Bm(qZdE=$84mntzH(SL}vWHm%B1lNip;NdGt54DpgSJj{PC#w-FA`c*B-WHHR_!eA3Sz+=oWXlX$^0au(Y;X(r;1mCV5z%6GB9L zV3_Ajt4uDq=WDo&Uosk=&3<3HUD(KN4I(yLly0^p-n{$+4*!BzfIxsifIxsifIxsi zfIxsifIxsifIxsifIxu2hXjEXFAN-CK3*yvCC887b=Sw@uq(L#|Bx(hU`BvIfIxsi zfIxsifIxsifIxsifIxsifIxsi8v$7yh~0euPwW3jyHNjsSN>c1PvmFiC*`JGmKWrE zU@qXe;;?ELaP5f%&Gl^=Vn7B8wKaov@F-hl5#5=I?#Z0e^B$DyO&QV!78 zDT4X*3ESGl^T@RCFl`;Lo3*AsV>q5^kxl7sWk2g{)-eYzoOEp0lith>QO##a&9F?O z7md2@O5e^5(#AAJQz#2pq+5yPvZ`4n+1 zXo%@9cMpWPeqqLRJ*qF1y{hb?0*XedN^1JNXIP$XNpGfiQ)8)>Wqs6eRsq1(o;yO^ zZeiMV4SkmW3AF{4`l(7|reP6%%x+X_hAUl>b&4?S$ENspx{o0TFo~fTYA{^7rtG5A zw$0E-9kWt#rEm4@q*E*q$7$-5wguQOYdfeZd8?Q9yOfhC$U>(Ui< zTZkJL3Qa&`8hX(NqMj?gmFZ=$krn*a0Hjj*q_;CU+Bju2Yjn|9R;V@K%4oEaLSaxW zn7_Q;ou!E7%kUuI5nfNJA#NuicWq0bCemveg$`S+nx2ITe9yS9W~eg068aqR@K`-? zy^>B-D5l7|X#szWwp~?vC=>;os&~>cNtr5hS?#6*X3dgaBR8ymBP~+_%ysoS+ksr^ zawf$rw9BU6c6ONEouqoxrGW<u)d$Ca+8q6`c`F<&({;1LoX>Kiy|SA7fB2(_g%$xNwK zGfaSy4TrdctQp&eKme&R=j#bkFTfsIh2|9tCSJ>kRP4M*)`^8iY&1A&R-ohC5IxW^ zElVFeJ0o4q^0a-@cB>6TKe^@n-=X*a_@n>e6(A5G5FijB5FijB5FijB5FijB5FijB z5FijB@F7Nk-v9pw|9wt=2lf9K<*&$}mtFZ0c}o6>yhDzr{v~xa^^MdYq<$UMe=~J9 zbx&${D#2?1f02AH`Q_x}NjrHqd2ezkDJT9T@ehet62F)DmBgnLW?~_6BC#)#>iVGT z@4NoG>-nxPcRk+abbYd`&~>=0H~!=JcjMoTe=Yu0{PFl&{K5EW{9rs2`(f-KW3R@Z zk3AK8EVdSVI5r+T9Lq(25`8E7&FD+fXQG#)&8QKbh#raNqP+C3^s4lt^px~@$&ntG z^3tG`j{G?C-N@fX{y6fxktZVSkw+qvk)shUB8J}&UkU$d_}TC;hBw2@;fe6!@V0O$ z^iQGJLobD%4t*hXK6Ey8e`sGQE&i+cruee>Rq;u2LwrO$Eslse;YY&vgja;;h2IiB zCsc(w;kcj+5vWmuSzj_F~hZY#!xaF~L0} zT1#b97b&ael=T8AJaBsa@sV6h34@yA!A+61sy@>Mho;X}$AqyFrIiVT+2adUh-vd) z+}DnzTj?-(JboVEoH7b-*IpAAkMy>B!XQQcz95nf(3()yw#566D6MWLr%j777L&h< zAu<~>jql8GjV31W&|jY!6Zym0R*C^KV^Sg;NP#vsT~RxvwvxVqV8BZy12nC@VTtDs zDXoOBtKm|{lhg?87SP<~PmS?Fn){3$#ltI)B4c1;Y>f*=&wIwl?CW%A9;rmn|Upk<)B5ZD-vR(wA zT=lr;5A0}#!`z(!+$f!IfI$XN{jgcD6G~rm&kUzqAs=1P$lv1a`8`9uKhG|mb`7HhmY7h7qMpNjaVY(1 zX2WSTOdA_mRqo9p?dKSN^F|$3Gq%>ox9@O&HKc4ZnDRC1t3I{My+4>~GQ${WKi05H zh9%Sovlp216UH(~=^EJP4S1{YiNW3trV1RaYJ>3CCmeHS1+@;bIhb8%LnaM}l()EO z;o4xP!Q_KHwwmZqh$Rm0(>#BT>9ViDFJ@4vArANF`!X);op-!y!_h~v>%>d@REI&< zrhtnkz9GgCukTgPGkYd&rwseC)36C%-m9%K(KDt;%NjMkz?Mds-J7-opb^&X!24@E%EJ6y; z_GceqIBmJasBL>y;mLk=iRnFK)4+)`7EIsdexNHq%cf=SRzTduW#M~z_ESvA6yhJM zQ|$@^|B9}Dk_lL78yRID@`B(eY zhnS>MI2zRP3q<_C^<^Jq6ZXU=HUw!-?~ z?C5!bi9n&tFN_KDj_e$p4K=$GqVPPznvHn-#E$G4*50XmjygD=JmEigXtVyZQhZT< zYQrM*Z&zoSoq1Y=?BLG5yG@y9isa#Q9gpFj+m@MPo71mjvKpQESg$h4x^^PwT%%Iu zAJ3&vv(2`(H!twZx!zN3v$0dov)5>O(idXnG80U)UzD4`QRIo9mOIICLfQ2k)Ih1P zNa*SbPiWb3-+YKbwGf9;#VFfizm^$eV%p^+ddi94(6R;AnK}z1Jx&4C@|J}kX}M9~ zi8}SywvY0cvY9*+!_IcJ;-C}Ov&#L<&Pf~bu;W%{HhUiv-Z}2uy-#PAd)vJc59q!_ z5mq>+YA4t-OyX>z1n`t

VQT z`79o#>J#J9SYBfea}@&{;bS2)+L9%hL6weV3O zOFU2bLbrOzcjQ`=#=dr52N?&Mj47N-mOf!P$Ogs3-P(aIq-eQ!+%4J5h9h2+m0{MM z?H@P_l0jFf$m)J3dz7H4&+;IoD*Oj>W~l9LEMuG{IAni8?ipm8l|E!JO*TxIPsr*% zHhj8)Rp7n+i>cfm z=Cunrck%UkTNwxUQYyWh0lt7{q-z)=o=IizVD33aa0sFnY+AG!%~z7SekKJD*h!7p zsUU79GdeTMKgL;MmH(qewvUO)y9l>U9Y@9*0)zNqm$r+UfCdN8Idm@Yf7qq&WG0W1 zW!o{T?QK34&+K5r+tG#=*@Y+K%69bS`Lkxp!_kbYEza``@ibC+5$lLpQ9K!Tj30i5dNIB%} z&~XgAqya<>2bnKG7oL_fNZgS@j^U9IdP71iThtV??p05*wM9Z&LXw` zOOYOA>NxS)$+>8{gzt@L$kB11(|-Jd-iLTt7``{GAxX!D!dA>XS+kpEu@FilO$V%} z*r|;FJ@G&&8)t^IsJWFP^CeM5ijG?%AE)+{5@KG=AU~&>FpC4z_8N}$cf=l~=2SWM zNCu4;yF?|z!1ohBpod!peoEAkltZ&gc9i2;7WyawqR2%dgLHgAi1}*;d~j5W^BU6e vgF>uxoEMDx+A?ArcS#kf&aqD1_0JjpF^%QpG0e7(oXs$)yW+V3aqYhV^Z`oT delta 32 lcmZoTz}Rqrae_1>`$QRMM)r*fOY|4BI0%67W)_D(`~a!D3IYHC From c8a5a56467bd651bc8f8ed0b708ca41590acf763 Mon Sep 17 00:00:00 2001 From: Elisha Date: Sun, 7 Jan 2024 12:53:39 +0300 Subject: [PATCH 7/7] complete many-to-many relationships --- lib/freebies.db | Bin 24576 -> 40960 bytes .../712044114a04_add_company_dev_model.py | 34 ++++++++++++++++++ ...79cf00b_create_dev_freebie_relationship.py | 34 ++++++++++++++++++ lib/models.py | 21 ++++++++++- lib/seed.py | 22 +++++++++++- 5 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 lib/migrations/versions/712044114a04_add_company_dev_model.py create mode 100644 lib/migrations/versions/cc50d79cf00b_create_dev_freebie_relationship.py diff --git a/lib/freebies.db b/lib/freebies.db index e43483278f2517af436f66bb59041c31ea04d002..c151eaa1696b3ee5861119fdd0a25c9b982faff1 100644 GIT binary patch literal 40960 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

VQT z`79o#>J#J9SYBfea}@&{;bS2)+L9%hL6weV3O zOFU2bLbrOzcjQ`=#=dr52N?&Mj47N-mOf!P$Ogs3-P(aIq-eQ!+%4J5h9h2+m0{MM z?H@P_l0jFf$m)J3dz7H4&+;IoD*Oj>W~l9LEMuG{IAni8?ipm8l|E!JO*TxIPsr*% zHhj8)Rp7n+i>cfm z=Cunrck%UkTNwxUQYyWh0lt7{q-z)=o=IizVD33aa0sFnY+AG!%~z7SekKJD*h!7p zsUU79GdeTMKgL;MmH(qewvUO)y9l>U9Y@9*0)zNqm$r+UfCdN8Idm@Yf7qq&WG0W1 zW!o{T?QK34&+K5r+tG#=*@Y+K%69bS`Lkxp!_kbYEza``@ibC+5$lLpQ9K!Tj30i5dNIB%} z&~XgAqya<>2bnKG7oL_fNZgS@j^U9IdP71iThtV??p05*wM9Z&LXw` zOOYOA>NxS)$+>8{gzt@L$kB11(|-Jd-iLTt7``{GAxX!D!dA>XS+kpEu@FilO$V%} z*r|;FJ@G&&8)t^IsJWFP^CeM5ijG?%AE)+{5@KG=AU~&>FpC4z_8N}$cf=l~=2SWM zNCu4;yF?|z!1ohBpod!peoEAkltZ&gc9i2;7WyawqR2%dgLHgAi1}*;d~j5W^BU6e vgF>uxoEMDx+A?ArcS#kf&aqD1_0JjpF^%QpG0e7(oXs$)yW+V3aqYhV^Z`oT diff --git a/lib/migrations/versions/712044114a04_add_company_dev_model.py b/lib/migrations/versions/712044114a04_add_company_dev_model.py new file mode 100644 index 000000000..94f4f0200 --- /dev/null +++ b/lib/migrations/versions/712044114a04_add_company_dev_model.py @@ -0,0 +1,34 @@ +"""Add company_dev model + +Revision ID: 712044114a04 +Revises: cc50d79cf00b +Create Date: 2024-01-07 12:14:53.457383 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '712044114a04' +down_revision = 'cc50d79cf00b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('company_devs', + sa.Column('company_id', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_company_devs_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_company_devs_dev_id_devs')), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('company_devs') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/cc50d79cf00b_create_dev_freebie_relationship.py b/lib/migrations/versions/cc50d79cf00b_create_dev_freebie_relationship.py new file mode 100644 index 000000000..f82b30590 --- /dev/null +++ b/lib/migrations/versions/cc50d79cf00b_create_dev_freebie_relationship.py @@ -0,0 +1,34 @@ +"""Create dev-freebie relationship + +Revision ID: cc50d79cf00b +Revises: 8b8cc2e88779 +Create Date: 2024-01-07 11:15:40.538800 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'cc50d79cf00b' +down_revision = '8b8cc2e88779' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.add_column(sa.Column('dev_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key(batch_op.f('fk_freebies_dev_id_devs'), 'devs', ['dev_id'], ['id']) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_freebies_dev_id_devs'), type_='foreignkey') + batch_op.drop_column('dev_id') + + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 5a1273558..5b83c0081 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, Table, DateTime from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base @@ -9,6 +9,15 @@ Base = declarative_base(metadata=metadata) +# company-freebie (many-many) relationship +company_dev = Table( + 'company_devs', + Base.metadata, + Column('company_id', ForeignKey('companies.id'), primary_key=True), + Column('dev_id', ForeignKey('devs.id'), primary_key=True), + extend_existing=True, +) + class Company(Base): __tablename__ = 'companies' @@ -16,7 +25,9 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + # establishing company-freebie (one-to-many) relationship freebies = relationship('Freebie', backref=backref('companies')) + devs = relationship('Dev', secondary=company_dev, back_populates='companies') def __repr__(self): return f'' @@ -27,6 +38,10 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + # establishing dev-freebie (one-to-many) relationship + freebies = relationship('Freebie', backref=backref('devs')) + companies = relationship('Company', secondary=company_dev, back_populates='devs') + def __repr__(self): return f'' @@ -36,7 +51,11 @@ class Freebie(Base): id = Column(Integer(), primary_key=True) name = Column(String()) value = Column(Integer()) + # creating foreign foreign keys for relationships (company-freebie) company_id = Column(Integer(), ForeignKey('companies.id')) + #creating foreign foreign keys for relationships (dev-freebie) + dev_id = Column(Integer(), ForeignKey('devs.id')) + def __repr__(self) -> str: return f'Freebie(id={self.id}, ' + \ diff --git a/lib/seed.py b/lib/seed.py index b14b244bf..0fe399f62 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -7,7 +7,7 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from models import Company, Freebie +from models import Company, Freebie, Dev, company_dev if __name__== '__main__': engine = create_engine('sqlite:///freebies.db') @@ -16,6 +16,8 @@ session.query(Company).delete() session.query(Freebie).delete() + session.query(Dev).delete() + session.query(company_dev).delete() fake = Faker() @@ -32,14 +34,32 @@ companies.append(company) + + devs = [] + for i in range(25): + dev = Dev( + name = fake.name(), + ) + + session.add(dev) + session.commit() + + devs.append(dev) freebies = [] for company in companies: for i in range(random.randint(1,5)): + dev = random.choice(devs) + if company not in dev.companies: + dev.companies.append(company) + session.add(dev) + session.commit() + freebie = Freebie( name = fake.name(), value = random.randint(100, 1000), company_id = company.id, + dev_id = dev.id, ) freebies.append(freebie)