Skip to content

Commit 5ef0471

Browse files
authored
Merge pull request #2224 from sopel-irc/db-delete-channels-and-plugins
db: add `forget_channel()` and `forget_plugin()` methods
2 parents 36751c1 + d1fa1c9 commit 5ef0471

File tree

2 files changed

+78
-6
lines changed

2 files changed

+78
-6
lines changed

sopel/db.py

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from sqlalchemy.ext.declarative import declarative_base
1313
from sqlalchemy.orm import scoped_session, sessionmaker
1414

15-
from sopel.tools import Identifier
15+
from sopel.tools import deprecated, Identifier
1616

1717

1818
LOGGER = logging.getLogger(__name__)
@@ -273,7 +273,7 @@ def get_nick_id(self, nick, create=True):
273273
274274
Alias/group management functions: :meth:`alias_nick`,
275275
:meth:`unalias_nick`, :meth:`merge_nick_groups`, and
276-
:meth:`delete_nick_group`.
276+
:meth:`forget_nick_group`.
277277
278278
"""
279279
session = self.ssession()
@@ -476,7 +476,7 @@ def unalias_nick(self, alias):
476476
477477
.. seealso::
478478
479-
To delete an entire group, use :meth:`delete_nick_group`.
479+
To delete an entire group, use :meth:`forget_nick_group`.
480480
481481
To *add* an alias for a nick, use :meth:`alias_nick`.
482482
@@ -498,7 +498,7 @@ def unalias_nick(self, alias):
498498
finally:
499499
self.ssession.remove()
500500

501-
def delete_nick_group(self, nick):
501+
def forget_nick_group(self, nick):
502502
"""Remove a nickname, all of its aliases, and all of its stored values.
503503
504504
:param str nick: one of the nicknames in the group to be deleted
@@ -523,6 +523,14 @@ def delete_nick_group(self, nick):
523523
finally:
524524
self.ssession.remove()
525525

526+
@deprecated(
527+
version='8.0',
528+
removed_in='9.0',
529+
reason="Renamed to `forget_nick_group`",
530+
)
531+
def delete_nick_group(self, nick): # pragma: nocover
532+
self.forget_nick_group(nick)
533+
526534
def merge_nick_groups(self, first_nick, second_nick):
527535
"""Merge two nick groups.
528536
@@ -724,6 +732,28 @@ def get_channel_value(self, channel, key, default=None):
724732
finally:
725733
self.ssession.remove()
726734

735+
def forget_channel(self, channel):
736+
"""Remove all of a channel's stored values.
737+
738+
:param str channel: the name of the channel for which to delete values
739+
:raise ~sqlalchemy.exc.SQLAlchemyError: if there is a database error
740+
741+
.. important::
742+
743+
This is a Nuclear Option. Be *very* sure that you want to do it.
744+
745+
"""
746+
channel = self.get_channel_slug(channel)
747+
session = self.ssession()
748+
try:
749+
session.query(ChannelValues).filter(ChannelValues.channel == channel).delete()
750+
session.commit()
751+
except SQLAlchemyError:
752+
session.rollback()
753+
raise
754+
finally:
755+
self.ssession.remove()
756+
727757
# PLUGIN FUNCTIONS
728758

729759
def set_plugin_value(self, plugin, key, value):
@@ -842,6 +872,28 @@ def get_plugin_value(self, plugin, key, default=None):
842872
finally:
843873
self.ssession.remove()
844874

875+
def forget_plugin(self, plugin):
876+
"""Remove all of a plugin's stored values.
877+
878+
:param str plugin: the name of the plugin for which to delete values
879+
:raise ~sqlalchemy.exc.SQLAlchemyError: if there is a database error
880+
881+
.. important::
882+
883+
This is a Nuclear Option. Be *very* sure that you want to do it.
884+
885+
"""
886+
plugin = plugin.lower()
887+
session = self.ssession()
888+
try:
889+
session.query(PluginValues).filter(PluginValues.plugin == plugin).delete()
890+
session.commit()
891+
except SQLAlchemyError:
892+
session.rollback()
893+
raise
894+
finally:
895+
self.ssession.remove()
896+
845897
# NICK AND CHANNEL FUNCTIONS
846898

847899
def get_nick_or_channel_value(self, name, key, default=None):

test/test_db.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def test_unalias_nick(db):
183183
session.close()
184184

185185

186-
def test_delete_nick_group(db):
186+
def test_forget_nick_group(db):
187187
session = db.ssession()
188188
aliases = ['Embolalia', 'Embo']
189189
nick_id = 42
@@ -195,7 +195,7 @@ def test_delete_nick_group(db):
195195
db.set_nick_value(aliases[0], 'foo', 'bar')
196196
db.set_nick_value(aliases[1], 'spam', 'eggs')
197197

198-
db.delete_nick_group(aliases[0])
198+
db.forget_nick_group(aliases[0])
199199

200200
# Nothing else has created values, so we know the tables are empty
201201
nicks = session.query(Nicknames).all()
@@ -266,6 +266,16 @@ def test_get_channel_value(db):
266266
session.close()
267267

268268

269+
def test_forget_channel(db):
270+
db.set_channel_value('#testchan', 'wasd', 'uldr')
271+
db.set_channel_value('#testchan', 'asdf', 'hjkl')
272+
assert db.get_channel_value('#testchan', 'wasd') == 'uldr'
273+
assert db.get_channel_value('#testchan', 'asdf') == 'hjkl'
274+
db.forget_channel('#testchan')
275+
assert db.get_channel_value('#testchan', 'wasd') is None
276+
assert db.get_channel_value('#testchan', 'asdf') is None
277+
278+
269279
def test_get_channel_value_default(db):
270280
assert db.get_channel_value("TestChan", "DoesntExist") is None
271281
assert db.get_channel_value("TestChan", "DoesntExist", "MyDefault") == "MyDefault"
@@ -325,3 +335,13 @@ def test_delete_plugin_value(db):
325335
assert db.get_plugin_value('plugin', 'wasd') == 'uldr'
326336
db.delete_plugin_value('plugin', 'wasd')
327337
assert db.get_plugin_value('plugin', 'wasd') is None
338+
339+
340+
def test_forget_plugin(db):
341+
db.set_plugin_value('plugin', 'wasd', 'uldr')
342+
db.set_plugin_value('plugin', 'asdf', 'hjkl')
343+
assert db.get_plugin_value('plugin', 'wasd') == 'uldr'
344+
assert db.get_plugin_value('plugin', 'asdf') == 'hjkl'
345+
db.forget_plugin('plugin')
346+
assert db.get_plugin_value('plugin', 'wasd') is None
347+
assert db.get_plugin_value('plugin', 'asdf') is None

0 commit comments

Comments
 (0)