From 057c6fd66f916c81d71bd02796e2c0427a5c012f Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 24 Jul 2024 21:27:00 +0100 Subject: [PATCH] updated the code --- alembic.ini | 102 ++++++++++++++++++++++++ alembic/README | 1 + alembic/__pycache__/env.cpython-310.pyc | Bin 0 -> 1729 bytes alembic/env.py | 73 +++++++++++++++++ alembic/script.py.mako | 24 ++++++ lib/debug.py | 26 ++++-- lib/models.py | 70 ++++++++++++---- lib/seed.py | 28 ++++++- 8 files changed, 299 insertions(+), 25 deletions(-) create mode 100644 alembic.ini create mode 100644 alembic/README create mode 100644 alembic/__pycache__/env.cpython-310.pyc create mode 100644 alembic/env.py create mode 100644 alembic/script.py.mako diff --git a/alembic.ini b/alembic.ini new file mode 100644 index 000000000..cd10212e7 --- /dev/null +++ b/alembic.ini @@ -0,0 +1,102 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# Database URL - update this to point to your SQLite database +sqlalchemy.url = sqlite:///freebies.db + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/alembic/README b/alembic/README new file mode 100644 index 000000000..98e4f9c44 --- /dev/null +++ b/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/alembic/__pycache__/env.cpython-310.pyc b/alembic/__pycache__/env.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b745e14c2e072d030ba990bfc26457fb4a1f1d9 GIT binary patch literal 1729 zcmZvc&2QT_6u?PYmTmbXX|eXO0R`7fW^}Pz^fnB`nyiNcLlCqbhWTR9(z8vMqCAq$ zN0IE3U3MsX*?Dk|`zQ8?=(^MXg%v~gNZE~>O@gS$NAi7;zsJ1YjtM^EkKe}4Iw60$ z&gK(f=WG1TPuQd+rIKWHK&g`h8Dy0~#mg0x!$IifP*$^O5K#irtTw0th1#rsQLd@V zMiviZ9E)eoK`V{Y+RtRrPU~p{{~d^yTbD$C0qqNdw&E8AI%}!h{0n0sU0TFrAz?pP zV==+rZBP@TU^v!!HcZyqaGvK9M{B6DaAHvm_qc(?*;qdm1_*(tcL3!fbeJ7u$lv5d3t zo`37-bCoicqeii(eh)s!CHZ19z1A?a$dd%-mX9R(Ra4NwxM9a2WsmKhGV@Bz=R!@q zztRv(H27fsieq4Du68VgBT!5Mq!`3EdruCZF`KgyT07!GItQyn_PLZ8e!h;r2Pcp$ zEPU2w-aBN%dT$fqEE=o5``qcgN0VqVw=7@S`NFP@zV4VGC6~z*veVu|%a`3sQNe$) zWx1Y!9cEy8$}KP2QdrPj4o5s>M2g4N~pP+fu!6t5nG@{W}9LDtimA-|l4^Vc6 z+Q84F{3{BUSh@@>omDOoX&cU}Y4E0UPR_^@@qPR7oLVf)Gins|>iT}+$&fnjhUzWq`U;eKa)PG9hnL-wjU6X*~TI5J;37&(>v5C;FsefM! z+?YHOe$0`lz@J@NIvcgL=Bc^CQ#UB0xrVVgDH`tPNF*9VWqfVNvvJUE=?dZ|9y{G~b{ufJ?HYH==&`x-=*mfdX3m5te`AD0F|1%)P75yP$gio&Ff79CWvfj?5' + freebies = relationship('Freebie', backref='company', lazy=True) + + @property + def devs(self): + return list(set([freebie.dev for freebie in self.freebies])) + + def give_freebie(self, dev, item_name, value): + new_freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + session.add(new_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, nullable=False) + + freebies = relationship('Freebie', backref='dev', lazy=True) + + @property + def companies(self): + return list(set([freebie.company for freebie in self.freebies])) + + 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 + session.commit() + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + item_name = Column(String, nullable=False) + value = Column(Integer, nullable=False) + dev_id = Column(Integer, ForeignKey('devs.id'), nullable=False) + company_id = Column(Integer, ForeignKey('companies.id'), nullable=False) + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" - def __repr__(self): - return f'' +Base.metadata.create_all(engine) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..1c4a67e1f 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,27 @@ -#!/usr/bin/env python3 +# seed.py -# Script goes here! +from models import session, Company, Dev, Freebie + +def seed_data(): + session.query(Freebie).delete() + session.query(Company).delete() + session.query(Dev).delete() + session.commit() + + google = Company(name="Google", founding_year=1998) + amazon = Company(name="Amazon", founding_year=1994) + facebook = Company(name="Facebook", founding_year=2004) + + dev1 = Dev(name="Alice") + dev2 = Dev(name="Bob") + dev3 = Dev(name="Charlie") + + session.add_all([google, amazon, facebook, dev1, dev2, dev3]) + session.commit() + + freebie1 = Freebie(item_name="T-shirt", value=10, dev=dev1, company=google) + freebie2 = Freebie(item_name="Mug", value=5, dev=dev2, company=amazon) + freebie3 = Freebie(item_name="Sticker", value=1, dev=dev3, company=facebook) + + session.add_all([freebie1, freebie2, freebie3]) + session