def collect_new_events(self): for product in self.products.seen: while product.events: yield product.events.pop(0) @abc.abstractmethod def _commit(self): raise NotImplementedError @abc.abstractmethod def rollback(self): raise NotImplementedError DEFAULT_SESSION_FACTORY = sessionmaker(bind=create_engine( config.get_postgres_uri(), isolation_level="REPEATABLE READ", )) class SqlAlchemyUnitOfWork(AbstractUnitOfWork): def __init__(self, session_factory=DEFAULT_SESSION_FACTORY): self.session_factory = session_factory def __enter__(self): self.session = self.session_factory() # type: Session self.products = repository.SqlAlchemyRepository(self.session) return super().__enter__() def __exit__(self, *args): super().__exit__(*args)
def postgres_db(): engine = create_engine(config.get_postgres_uri()) wait_for_postgres_to_come_up(engine) metadata.create_all(engine) return engine
import datetime from flask import Flask, jsonify, request from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from src.allocation import config from src.allocation.adapters import orm, repository from src.allocation.domain import model from src.allocation.service_layer import services orm.start_mappers() get_session = sessionmaker(bind=create_engine(config.get_postgres_uri())) app = Flask(__name__) def is_valid_sku(sku, batches): return sku in {b.sku for b in batches} @app.route("/allocate", methods=['POST']) def allocate_endpoint(): session = get_session() repo = repository.SqlAlchemyRepository(session) line = model.OrderLine(request.json['orderid'], request.json['sku'], request.json['qty']) try: batchref = services.allocate(line, repo, session) except (model.OutOfStock, services.InvalidSku) as e: return jsonify({'message': str(e)}), 400
return self def __exit__(self, *args): self.rollback() @abc.abstractmethod def commit(self): raise NotImplementedError @abc.abstractmethod def rollback(self): raise NotImplementedError DEFAULT_SESSION_FACTORY = sessionmaker( bind=create_engine(config.get_postgres_uri())) class SqlAlchemyUnitOfWork(AbstractUnitOfWork): def __init__(self, session_factory=DEFAULT_SESSION_FACTORY): self.session_factory = session_factory def __enter__(self): self.session: Session = self.session_factory() self.batches = repository.SqlAlchemyRepository(self.session) return super().__enter__() def __exit__(self, *args): super().__exit__(*args) self.session.close()
def postgres_db(): engine = create_engine(config.get_postgres_uri(), isolation_level='SERIALIZABLE') wait_for_postgres_to_come_up(engine) metadata.create_all(engine) return engine