addtunnel now can't update locations with existing tunnels. Also several other fixes

doc_update
Joey Hines 2018-07-29 08:59:11 -05:00
parent d0e6c02feb
commit 04ccf94d1a
7 changed files with 60 additions and 31 deletions

View File

@ -8,6 +8,8 @@ class LocationInitError(DataBaseError):
class TunnelInitError(DataBaseError): class TunnelInitError(DataBaseError):
'''Error in initializing Tunnel''' '''Error in initializing Tunnel'''
class NoMatchFoundError(DataBaseError):
'''No matches were found in the database'''
class LocationLookUpError(DataBaseError): class LocationLookUpError(DataBaseError):
'''Error in finding location in database''' '''Error in finding location in database'''
@ -42,4 +44,7 @@ class InvalidTunnelError(DataBaseError):
class PlayerInDB(DataBaseError): class PlayerInDB(DataBaseError):
"""Player already registered in database""" """Player already registered in database"""
class LocationHasTunnelError(DataBaseError):
"""That location already has a tunnel"""

View File

@ -27,6 +27,7 @@ class Commands:
except PlayerNotFound: except PlayerNotFound:
player = self.interface.add_player(session, player_name, discord_uuid) player = self.interface.add_player(session, player_name, discord_uuid)
player_name = player.name player_name = player.name
finally: finally:
session.close() session.close()
@ -140,6 +141,9 @@ class Commands:
try: try:
shop_list = self.interface.find_shop_selling_item(session, item_name) shop_list = self.interface.find_shop_selling_item(session, item_name)
if len(shop_list) == 0:
raise ItemNotFound
finally: finally:
session.close() session.close()

View File

@ -17,20 +17,25 @@ class DatabaseInterface:
return shop return shop
def add_tunnel(self, session, owner, color, number, location_name): def add_tunnel(self, session, owner, color, number, location_name):
tunnels = self.find_tunnel_by_owner(session, owner)
if location_name is None: if location_name is None:
if len(self.find_tunnel_by_owner(session, owner)): if len(tunnels):
raise EntryNameNotUniqueError raise EntryNameNotUniqueError
else: else:
location = None location = None
else: else:
try: try:
location = self.find_location_by_name_and_owner(session, owner, location_name)[0] location = self.find_location_by_name_and_owner(session, owner, location_name)[0]
if location.tunnel is not None:
raise LocationHasTunnelError
except IndexError: except IndexError:
raise LocationLookUpError raise LocationLookUpError
tunnel = Tunnel(owner, color, number, location) tunnel = Tunnel(owner, color, number, location)
self.database.add_object(session, tunnel) self.database.add_object(session, tunnel)
return tunnel return tunnel
def add_item(self, session, owner, shop_name, item_name, price, amount): def add_item(self, session, owner, shop_name, item_name, price, amount):
@ -135,8 +140,7 @@ class DatabaseInterface:
try: try:
player = self.database.query_by_filter(session, Player, expr)[0] player = self.database.query_by_filter(session, Player, expr)[0]
player.name = grab_playername(player.mc_uuid)
session.commit()
except IndexError: except IndexError:
raise PlayerNotFound raise PlayerNotFound
return player return player

View File

@ -38,13 +38,15 @@ class GeoffreyDatabase:
def add_object(self, session, obj): def add_object(self, session, obj):
try: try:
ret = not session.query(exists().where(type(obj).id == obj.id)) ret = session.query(exists().where(type(obj).id == obj.id))
if not ret: if ret:
session.add(obj) session.add(obj)
session.commit() session.commit()
except IntegrityError: except IntegrityError:
session.rollback()
raise EntryNameNotUniqueError raise EntryNameNotUniqueError
except DataError: except DataError:
session.rollback()
raise DatabaseValueError raise DatabaseValueError
except: except:
session.rollback() session.rollback()
@ -60,11 +62,10 @@ class GeoffreyDatabase:
if entry.first() is not None: if entry.first() is not None:
entry.delete() entry.delete()
session.commit()
else: else:
raise DeleteEntryError raise DeleteEntryError
session.close() session.commit()
def print_database(self, session, obj_type): def print_database(self, session, obj_type):
obj_list = session.query(obj_type).all() obj_list = session.query(obj_type).all()
@ -123,8 +124,9 @@ class Player(SQL_Base):
mc_uuid = Column(String(128)) mc_uuid = Column(String(128))
discord_uuid = Column(String(128)) discord_uuid = Column(String(128))
name = Column(String(128)) name = Column(String(128))
locations = relationship("Location", back_populates="owner", lazy='dynamic', locations = relationship("Location", back_populates="owner", lazy='dynamic',
cascade="save-update, merge, delete, delete-orphan") cascade="save-update, merge, delete, delete-orphan", single_parent=True)
tunnels = relationship("Tunnel", back_populates="owner", lazy='dynamic', tunnels = relationship("Tunnel", back_populates="owner", lazy='dynamic',
cascade="save-update, merge, delete, delete-orphan") cascade="save-update, merge, delete, delete-orphan")
@ -143,7 +145,7 @@ class Tunnel(SQL_Base):
owner_id = Column(Integer, ForeignKey('Players.id')) owner_id = Column(Integer, ForeignKey('Players.id'))
owner = relationship("Player", back_populates="tunnels", cascade="save-update, merge, delete") owner = relationship("Player", back_populates="tunnels", cascade="save-update, merge, delete")
location_id = Column(Integer, ForeignKey('Locations.id', ondelete='CASCADE')) location_id = Column(Integer, ForeignKey('Locations.id', ondelete='CASCADE'))
location = relationship("Location", back_populates="tunnel",) location = relationship("Location", back_populates="tunnel", lazy="joined")
def __init__(self, owner, tunnel_color, tunnel_number, location=None): def __init__(self, owner, tunnel_color, tunnel_number, location=None):
try: try:
@ -165,7 +167,7 @@ class Location(SQL_Base):
__tablename__ = 'Locations' __tablename__ = 'Locations'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
name = Column(String(128), unique=True, ) name = Column(String(128), unique=True)
x = Column(Integer) x = Column(Integer)
z = Column(Integer) z = Column(Integer)

View File

@ -132,7 +132,7 @@ async def addshop(ctx, x_pos: int, z_pos: int, *args):
async def addtunnel(ctx, tunnel_color: str, tunnel_number: int, *args): async def addtunnel(ctx, tunnel_color: str, tunnel_number: int, *args):
''' '''
Adds your tunnel to the database. Adds your tunnel to the database.
The location name is optional. If the location has a tunnel, it is updated. The location name is optional.
?tunnel [Tunnel Color] [Tunnel Number] [Location Name] ?tunnel [Tunnel Color] [Tunnel Number] [Location Name]
''' '''
try: try:
@ -147,6 +147,8 @@ async def addtunnel(ctx, tunnel_color: str, tunnel_number: int, *args):
except LocationLookUpError: except LocationLookUpError:
await bot.say('{}, you do not have a location called **{}**.'.format( await bot.say('{}, you do not have a location called **{}**.'.format(
ctx.message.author.mention, args[0])) ctx.message.author.mention, args[0]))
except LocationHasTunnelError:
await bot.say('{}, **{}** already has a tunnel.'.format(ctx.message.author.mention, args[0]))
except TunnelInitError: except TunnelInitError:
await bot.say('{}, invalid tunnel color.'.format(ctx.message.author.mention)) await bot.say('{}, invalid tunnel color.'.format(ctx.message.author.mention))
except InvalidTunnelError: except InvalidTunnelError:
@ -197,10 +199,10 @@ async def delete(ctx, * args):
if loc is None: if loc is None:
raise commands.UserInputError raise commands.UserInputError
bot_commands.delete(name, discord_uuid=ctx.message.author.id) bot_commands.delete(loc, discord_uuid=ctx.message.author.id)
await bot.say('{}, your location named **{}** has been deleted.'.format(ctx.message.author.mention, name)) await bot.say('{}, your location named **{}** has been deleted.'.format(ctx.message.author.mention, loc))
except (DeleteEntryError, PlayerNotFound): except (DeleteEntryError, PlayerNotFound):
await bot.say('{}, you do not have a location named **{}**.'.format(ctx.message.author.mention, name)) await bot.say('{}, you do not have a location named **{}**.'.format(ctx.message.author.mention, loc))
@bot.command(pass_context=True) @bot.command(pass_context=True)
@ -278,7 +280,7 @@ async def selling(ctx, item_name: str):
result = bot_commands.selling(item_name) result = bot_commands.selling(item_name)
await bot.say('{}, the following shops sell **{}**: \n{}'.format(ctx.message.author.mention, item_name, result)) await bot.say('{}, the following shops sell **{}**: \n{}'.format(ctx.message.author.mention, item_name, result))
except ItemNotFound: except ItemNotFound:
await bot.say('{}, bo shops sell {}'.format(ctx.message.author.mention, item_name)) await bot.say('{}, no shops sell **{}**'.format(ctx.message.author.mention, item_name))
@bot.command(pass_context=True) @bot.command(pass_context=True)

View File

@ -61,8 +61,9 @@ class TestCommands(TestCase):
if 'Green' not in tunnel2: if 'Green' not in tunnel2:
self.fail() self.fail()
else:
pass self.assertRaises(LocationHasTunnelError, self.commands.addtunnel, 'Blue', 50, location_name='test_shop',
discord_uuid='143072699567177728')
def test_find(self): def test_find(self):
self.commands.register('ZeroHD', '143072699567177728') self.commands.register('ZeroHD', '143072699567177728')
@ -84,7 +85,6 @@ class TestCommands(TestCase):
self.assertRaises(LocationLookUpError, self.commands.find, 'zerohd') self.assertRaises(LocationLookUpError, self.commands.find, 'zerohd')
def test_findaround(self): def test_findaround(self):
self.commands.register('ZeroHD', '143072699567177728') self.commands.register('ZeroHD', '143072699567177728')
self.commands.addshop(0, 0, shop_str='frick', discord_uuid='143072699567177728') self.commands.addshop(0, 0, shop_str='frick', discord_uuid='143072699567177728')
@ -154,3 +154,5 @@ class TestCommands(TestCase):
pass pass
else: else:
self.fail() self.fail()

View File

@ -11,24 +11,28 @@ class TestGeoffreyDatabase(TestCase):
engine_arg = config['SQL']['test_args'] engine_arg = config['SQL']['test_args']
self.commands = Commands(engine_arg) self.commands = Commands(engine_arg)
self.session = self.commands.interface.database.Session()
self.commands.interface.database.clear_all(self.session)
self.owner = Player('ZeroHD', '143072699567177728') self.owner = Player('ZeroHD', '143072699567177728')
self.loc = Location('test', 1, 3, self.owner, dimension='Nether') self.loc = Location('test', 1, 3, self.owner, dimension='Nether')
self.tunnel = Tunnel(self.owner, 'Green', 105, self.loc) self.tunnel = Tunnel(self.owner, 'Green', 105, self.loc)
self.session = self.commands.interface.database.Session()
self.commands.interface.database.clear_all(self.session)
def tearDown(self): def tearDown(self):
self.session.commit()
self.session.close() self.session.close()
def add_shop(self, player): def add_shop(self, player):
return self.commands.interface.add_shop(self.session, player, 'test', 1, 3, "nether") shop = self.commands.interface.add_shop(self.session, player, 'test', 1, 3, "nether")
return shop
def add_player(self): def add_player(self):
return self.commands.interface.add_player(self.session, 'ZeroHD', discord_uuid='143072699567177728') player = self.commands.interface.add_player(self.session, 'ZeroHD', discord_uuid='143072699567177728')
return player
def add_loc(self, player): def add_loc(self, player):
return self.commands.interface.add_location(self.session, player, 'test', 0, 0) loc = self.commands.interface.add_location(self.session, player, 'test', 0, 0)
return loc
def test_add_object(self): def test_add_object(self):
self.commands.interface.database.add_object(self.session, self.loc) self.commands.interface.database.add_object(self.session, self.loc)
@ -54,10 +58,17 @@ class TestGeoffreyDatabase(TestCase):
def test_delete_entry(self): def test_delete_entry(self):
self.commands.interface.database.add_object(self.session, self.loc) self.commands.interface.database.add_object(self.session, self.loc)
self.commands.interface.database.add_object(self.session, self.owner) self.commands.interface.database.add_object(self.session, self.owner)
self.session.commit()
id = self.loc.owner_id
expr = Location.owner == self.owner expr = Location.owner == self.owner
self.commands.interface.database.delete_entry(self.session, Location, expr) self.commands.interface.database.delete_entry(self.session, Location, expr)
expr = Player.name == 'ZeroHD'
player = self.commands.interface.database.query_by_filter(self.session, Player, expr)[0]
self.assertEqual(player.name, 'ZeroHD')
expr = Location.owner == player
loc2 = self.commands.interface.database.query_by_filter(self.session, Location, expr) loc2 = self.commands.interface.database.query_by_filter(self.session, Location, expr)
self.assertEqual(len(loc2), 0) self.assertEqual(len(loc2), 0)
@ -83,13 +94,14 @@ class TestGeoffreyDatabase(TestCase):
self.assertEqual(loc_list[1].id, shop2.id) self.assertEqual(loc_list[1].id, shop2.id)
def test_add_tunnel(self): def test_add_tunnel(self):
self.session = self.commands.interface.database.Session()
player = self.add_player() player = self.add_player()
tunnel1 = self.commands.interface.add_tunnel(self.session, player, 'green', 155, None) tunnel1 = self.commands.interface.add_tunnel(self.session, player, 'green', 155, None)
tunnel2 = self.commands.interface.find_tunnel_by_owner_name(self.session, 'ZeroHD')[0] tunnel2 = self.commands.interface.find_tunnel_by_owner_name(self.session, 'ZeroHD')[0]
self.assertEqual(tunnel1, tunnel2) self.assertEqual(tunnel1, tunnel2)
def test_add_item(self): def test_add_item(self):
owner = self.add_player() owner = self.add_player()
self.add_shop(owner) self.add_shop(owner)
@ -115,16 +127,14 @@ class TestGeoffreyDatabase(TestCase):
self.assertEqual(loc_list[0].id, shop.id) self.assertEqual(loc_list[0].id, shop.id)
def test_delete_base(self): def test_delete_base(self):
self.session = self.commands.interface.database.Session()
owner = self.add_player() owner = self.add_player()
self.add_loc(owner) self.add_loc(owner)
self.commands.interface.delete_location(self.session, owner, 'test') self.commands.interface.delete_location(self.session, owner, 'test')
loc_list = self.commands.interface.find_location_by_name_and_owner(self.session, owner, 'test') loc_list = self.commands.interface.find_location_by_name(self.session, 'test')
self.assertEqual(len(loc_list), 0) self.assertEqual(len(loc_list), 0)
self.session.close()
def test_find_location_around(self): def test_find_location_around(self):
owner = self.add_player() owner = self.add_player()
@ -195,7 +205,7 @@ class TestGeoffreyDatabase(TestCase):
def test_big_input(self): def test_big_input(self):
owner = self.add_player() owner = self.add_player()
self.assertRaises(StringTooLong, self.commands.interface.add_location, self.session, owner, self.assertRaises(DatabaseValueError, self.commands.interface.add_location, self.session, owner,
'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT' 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'
'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT' 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'
'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', 0, 0,) 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', 0, 0,)