From 143a0daf631dfc19c47b0bd9ea5de4dca315aafd Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 16:42:28 -0500 Subject: [PATCH 01/12] test evennia.utils.create.create_script --- evennia/utils/test_resources.py | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index b4124b721..8e954592a 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -66,3 +66,38 @@ class EvenniaTest(TestCase): self.account.delete() self.account2.delete() super(EvenniaTest, self).tearDown() + + +import unittest + +class TestScript(DefaultScript): + + # script test params + call_super = None + interval = 1 + + def at_script_creation(self): + if self.call_super: + super(TestScript, self).at_script_creation() + self.key = 'testing_script' + # self.interval = 10 + # self.repeats = 1 + self.persistent = False + +class TestCreateScript(EvenniaTest): + + def setUp(self): + super(EvenniaTest, self).setUp() + + def tearDown(self): + super(EvenniaTest, self).tearDown() + + @unittest.expectedFailure + def test_create_script(self): + TestScript.call_super = True + + script = create.create_script(TestScript, key="TestScript") + assert script is not None + assert script.interval == 1 + assert script.repeats == 0 + assert script.key == 'testing_script' From 1625a8f7d1418dfb39554d1f30418f27d67573bd Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 17:09:01 -0500 Subject: [PATCH 02/12] Refactoring. Test to reproduce #1663 --- evennia/utils/test_resources.py | 42 ++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index 8e954592a..15cf862dd 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -70,20 +70,6 @@ class EvenniaTest(TestCase): import unittest -class TestScript(DefaultScript): - - # script test params - call_super = None - interval = 1 - - def at_script_creation(self): - if self.call_super: - super(TestScript, self).at_script_creation() - self.key = 'testing_script' - # self.interval = 10 - # self.repeats = 1 - self.persistent = False - class TestCreateScript(EvenniaTest): def setUp(self): @@ -92,12 +78,30 @@ class TestCreateScript(EvenniaTest): def tearDown(self): super(EvenniaTest, self).tearDown() - @unittest.expectedFailure def test_create_script(self): - TestScript.call_super = True + class TestScript(DefaultScript): + def at_script_creation(self): + self.key = 'testing_script' + self.interval = 10 + self.persistent = False - script = create.create_script(TestScript, key="TestScript") + script = create.create_script(TestScript) assert script is not None - assert script.interval == 1 - assert script.repeats == 0 + assert script.interval == 10 assert script.key == 'testing_script' + + # @unittest.expectedFailure + def test_create_script_w_one_repeat(self): + class TestScript(DefaultScript): + def at_script_creation(self): + self.key = 'testing_script' + self.interval = 10 + self.repeats = 1 + self.persistent = False + + with self.assertRaises(TypeError): + script = create.create_script(TestScript) + # assert script is not None + # assert script.interval == 10 + # assert script.repeats == 1 + # assert script.key == 'testing_script' From b510bc12f470e6b733aaae2242714029199c17e5 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 19:07:46 -0500 Subject: [PATCH 03/12] Must use different classes for each test so the django RuntimeWarning doesn't occur --- evennia/utils/test_resources.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index 15cf862dd..a98627a67 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -69,6 +69,7 @@ class EvenniaTest(TestCase): import unittest +import inspect class TestCreateScript(EvenniaTest): @@ -79,29 +80,29 @@ class TestCreateScript(EvenniaTest): super(EvenniaTest, self).tearDown() def test_create_script(self): - class TestScript(DefaultScript): + class TestScriptA(DefaultScript): def at_script_creation(self): - self.key = 'testing_script' + self.key = 'test_script' self.interval = 10 self.persistent = False - script = create.create_script(TestScript) + script = create.create_script(TestScriptA, key='test_script') assert script is not None assert script.interval == 10 - assert script.key == 'testing_script' + assert script.key == 'test_script' # @unittest.expectedFailure def test_create_script_w_one_repeat(self): - class TestScript(DefaultScript): + class TestScriptB(DefaultScript): def at_script_creation(self): - self.key = 'testing_script' + self.key = 'test_script' self.interval = 10 self.repeats = 1 self.persistent = False with self.assertRaises(TypeError): - script = create.create_script(TestScript) + script = create.create_script(TestScriptB, key='test_script') # assert script is not None # assert script.interval == 10 # assert script.repeats == 1 - # assert script.key == 'testing_script' + # assert script.key == 'test_script' From 9871aa615623eedb07f2e92f81e1ade16d442459 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 19:09:38 -0500 Subject: [PATCH 04/12] Use unittest.expectFailure decoration --- evennia/utils/test_resources.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index a98627a67..ac26fe40a 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -91,7 +91,7 @@ class TestCreateScript(EvenniaTest): assert script.interval == 10 assert script.key == 'test_script' - # @unittest.expectedFailure + @unittest.expectedFailure def test_create_script_w_one_repeat(self): class TestScriptB(DefaultScript): def at_script_creation(self): @@ -100,9 +100,8 @@ class TestCreateScript(EvenniaTest): self.repeats = 1 self.persistent = False - with self.assertRaises(TypeError): - script = create.create_script(TestScriptB, key='test_script') - # assert script is not None - # assert script.interval == 10 - # assert script.repeats == 1 - # assert script.key == 'test_script' + script = create.create_script(TestScriptB, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.repeats == 1 + assert script.key == 'test_script' From 7e7ffbe3abecd5a8275ece30f5df792bb7a753ff Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sat, 20 Oct 2018 22:39:53 -0500 Subject: [PATCH 05/12] Another control-group test (repeats = 2) - it passes --- evennia/utils/test_resources.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index ac26fe40a..a42e394b7 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -73,12 +73,6 @@ import inspect class TestCreateScript(EvenniaTest): - def setUp(self): - super(EvenniaTest, self).setUp() - - def tearDown(self): - super(EvenniaTest, self).tearDown() - def test_create_script(self): class TestScriptA(DefaultScript): def at_script_creation(self): @@ -92,7 +86,7 @@ class TestCreateScript(EvenniaTest): assert script.key == 'test_script' @unittest.expectedFailure - def test_create_script_w_one_repeat(self): + def test_create_script_w_repeats_equal_1(self): class TestScriptB(DefaultScript): def at_script_creation(self): self.key = 'test_script' @@ -100,8 +94,28 @@ class TestCreateScript(EvenniaTest): self.repeats = 1 self.persistent = False + # import ipdb + # ipdb.set_trace() + script = create.create_script(TestScriptB, key='test_script') assert script is not None assert script.interval == 10 assert script.repeats == 1 assert script.key == 'test_script' + + def test_create_script_w_repeats_equal_2(self): + class TestScriptC(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.repeats = 2 + self.persistent = False + + # import ipdb + # ipdb.set_trace() + + script = create.create_script(TestScriptC, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.repeats == 2 + assert script.key == 'test_script' From 68e93bbe9a3fa63aeff88679bf0323954d392b50 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 21 Oct 2018 09:21:58 -0500 Subject: [PATCH 06/12] Add Script test with repeats=1 and start_delay=True --- evennia/utils/test_resources.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index a42e394b7..c044d776f 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -84,6 +84,7 @@ class TestCreateScript(EvenniaTest): assert script is not None assert script.interval == 10 assert script.key == 'test_script' + script.stop() @unittest.expectedFailure def test_create_script_w_repeats_equal_1(self): @@ -94,14 +95,12 @@ class TestCreateScript(EvenniaTest): self.repeats = 1 self.persistent = False - # import ipdb - # ipdb.set_trace() - script = create.create_script(TestScriptB, key='test_script') assert script is not None assert script.interval == 10 assert script.repeats == 1 assert script.key == 'test_script' + script.stop() def test_create_script_w_repeats_equal_2(self): class TestScriptC(DefaultScript): @@ -111,11 +110,25 @@ class TestCreateScript(EvenniaTest): self.repeats = 2 self.persistent = False - # import ipdb - # ipdb.set_trace() - script = create.create_script(TestScriptC, key='test_script') assert script is not None assert script.interval == 10 assert script.repeats == 2 assert script.key == 'test_script' + script.stop() + + def test_create_script_w_repeats_equal_1_and_delayed(self): + class TestScriptD(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.start_delay = True + self.repeats = 1 + self.persistent = False + + script = create.create_script(TestScriptD, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.repeats == 1 + assert script.key == 'test_script' + script.stop() From 99c798e834795dd9d71e438193f52bf761515ce5 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 21 Oct 2018 20:13:31 -0500 Subject: [PATCH 07/12] Test create_script() repeats=1 and persisted=True --- evennia/utils/test_resources.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index c044d776f..3981ea147 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -102,6 +102,22 @@ class TestCreateScript(EvenniaTest): assert script.key == 'test_script' script.stop() + def test_create_script_w_repeats_equal_1_persisted(self): + class TestScriptB1(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.repeats = 1 + self.persistent = True + + script = create.create_script(TestScriptB1, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.repeats == 1 + assert script.key == 'test_script' + assert self.persistent == True + script.stop() + def test_create_script_w_repeats_equal_2(self): class TestScriptC(DefaultScript): def at_script_creation(self): From cc6c12b8bef00bf625b50864b86f5f8bbfd3da94 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 27 Oct 2018 19:08:31 +0200 Subject: [PATCH 08/12] Make create_script return None if script set up to immediately fire/stop. Resolves #1663. --- evennia/utils/create.py | 6 ++ evennia/utils/idmapper/models.py | 6 ++ evennia/utils/test_resources.py | 82 -------------------- evennia/utils/tests/test_create_functions.py | 79 +++++++++++++++++++ 4 files changed, 91 insertions(+), 82 deletions(-) create mode 100644 evennia/utils/tests/test_create_functions.py diff --git a/evennia/utils/create.py b/evennia/utils/create.py index 36db7e5a6..ae7e867f2 100644 --- a/evennia/utils/create.py +++ b/evennia/utils/create.py @@ -229,6 +229,12 @@ def create_script(typeclass=None, key=None, obj=None, account=None, locks=None, # at_first_save hook on the typeclass, where the _createdict # can be used. new_script.save() + + if not new_script.id: + # this happens in the case of having a repeating script with `repeats=1` and + # `start_delay=False` - the script will run once and immediately stop before save is over. + return None + return new_script diff --git a/evennia/utils/idmapper/models.py b/evennia/utils/idmapper/models.py index fcda53cdf..54b0ac33d 100644 --- a/evennia/utils/idmapper/models.py +++ b/evennia/utils/idmapper/models.py @@ -397,6 +397,11 @@ class SharedMemoryModel(with_metaclass(SharedMemoryModelBase, Model)): super(SharedMemoryModel, cls).save(*args, **kwargs) callFromThread(_save_callback, self, *args, **kwargs) + if not self.pk: + # this can happen if some of the startup methods immediately + # delete the object (an example are Scripts that start and die immediately) + return + # update field-update hooks and eventual OOB watchers new = False if "update_fields" in kwargs and kwargs["update_fields"]: @@ -421,6 +426,7 @@ class SharedMemoryModel(with_metaclass(SharedMemoryModelBase, Model)): # fieldtracker = "_oob_at_%s_postsave" % fieldname # if hasattr(self, fieldtracker): # _GA(self, fieldtracker)(fieldname) + pass class WeakSharedMemoryModelBase(SharedMemoryModelBase): diff --git a/evennia/utils/test_resources.py b/evennia/utils/test_resources.py index 3981ea147..b4124b721 100644 --- a/evennia/utils/test_resources.py +++ b/evennia/utils/test_resources.py @@ -66,85 +66,3 @@ class EvenniaTest(TestCase): self.account.delete() self.account2.delete() super(EvenniaTest, self).tearDown() - - -import unittest -import inspect - -class TestCreateScript(EvenniaTest): - - def test_create_script(self): - class TestScriptA(DefaultScript): - def at_script_creation(self): - self.key = 'test_script' - self.interval = 10 - self.persistent = False - - script = create.create_script(TestScriptA, key='test_script') - assert script is not None - assert script.interval == 10 - assert script.key == 'test_script' - script.stop() - - @unittest.expectedFailure - def test_create_script_w_repeats_equal_1(self): - class TestScriptB(DefaultScript): - def at_script_creation(self): - self.key = 'test_script' - self.interval = 10 - self.repeats = 1 - self.persistent = False - - script = create.create_script(TestScriptB, key='test_script') - assert script is not None - assert script.interval == 10 - assert script.repeats == 1 - assert script.key == 'test_script' - script.stop() - - def test_create_script_w_repeats_equal_1_persisted(self): - class TestScriptB1(DefaultScript): - def at_script_creation(self): - self.key = 'test_script' - self.interval = 10 - self.repeats = 1 - self.persistent = True - - script = create.create_script(TestScriptB1, key='test_script') - assert script is not None - assert script.interval == 10 - assert script.repeats == 1 - assert script.key == 'test_script' - assert self.persistent == True - script.stop() - - def test_create_script_w_repeats_equal_2(self): - class TestScriptC(DefaultScript): - def at_script_creation(self): - self.key = 'test_script' - self.interval = 10 - self.repeats = 2 - self.persistent = False - - script = create.create_script(TestScriptC, key='test_script') - assert script is not None - assert script.interval == 10 - assert script.repeats == 2 - assert script.key == 'test_script' - script.stop() - - def test_create_script_w_repeats_equal_1_and_delayed(self): - class TestScriptD(DefaultScript): - def at_script_creation(self): - self.key = 'test_script' - self.interval = 10 - self.start_delay = True - self.repeats = 1 - self.persistent = False - - script = create.create_script(TestScriptD, key='test_script') - assert script is not None - assert script.interval == 10 - assert script.repeats == 1 - assert script.key == 'test_script' - script.stop() diff --git a/evennia/utils/tests/test_create_functions.py b/evennia/utils/tests/test_create_functions.py new file mode 100644 index 000000000..2d5b1eeaf --- /dev/null +++ b/evennia/utils/tests/test_create_functions.py @@ -0,0 +1,79 @@ +""" +Tests of create functions + +""" + +from evennia.utils.test_resources import EvenniaTest +from evennia.scripts.scripts import DefaultScript +from evennia.utils import create + + +class TestCreateScript(EvenniaTest): + + def test_create_script(self): + class TestScriptA(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.persistent = False + + script = create.create_script(TestScriptA, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.key == 'test_script' + script.stop() + + def test_create_script_w_repeats_equal_1(self): + class TestScriptB(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.repeats = 1 + self.persistent = False + + # script is already stopped (interval=1, start_delay=False) + script = create.create_script(TestScriptB, key='test_script') + assert script is None + + def test_create_script_w_repeats_equal_1_persisted(self): + class TestScriptB1(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.repeats = 1 + self.persistent = True + + # script is already stopped (interval=1, start_delay=False) + script = create.create_script(TestScriptB1, key='test_script') + assert script is None + + def test_create_script_w_repeats_equal_2(self): + class TestScriptC(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.repeats = 2 + self.persistent = False + + script = create.create_script(TestScriptC, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.repeats == 2 + assert script.key == 'test_script' + script.stop() + + def test_create_script_w_repeats_equal_1_and_delayed(self): + class TestScriptD(DefaultScript): + def at_script_creation(self): + self.key = 'test_script' + self.interval = 10 + self.start_delay = True + self.repeats = 1 + self.persistent = False + + script = create.create_script(TestScriptD, key='test_script') + assert script is not None + assert script.interval == 10 + assert script.repeats == 1 + assert script.key == 'test_script' + script.stop() From 873ac96fcbf7fac1c0f1a9c4bf0b19b4cb843ee5 Mon Sep 17 00:00:00 2001 From: Jerry Aldrich Date: Sat, 27 Oct 2018 11:23:02 -0700 Subject: [PATCH 09/12] Add a CONTRIBUTING.md --- CONTRIBUTING.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..fec889513 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing to Evennia + +Evennia utilizes GitHub for issue tracking and contributions: + + - Reporting issues/bugs or making feature requests can be done [here](https://github.com/evennia/evennia/issues) + - Evennia also has a [wiki](https://github.com/evennia/evennia/wiki) that contains a guide to contributing [here](https://github.com/evennia/evennia/wiki/Contributing) From 4681025ef5ca6d57b2391d522bd300fb0ec00011 Mon Sep 17 00:00:00 2001 From: Jerry Aldrich Date: Sat, 27 Oct 2018 11:59:03 -0700 Subject: [PATCH 10/12] Change loose to lose where appropriate --- evennia/server/portal/irc.py | 2 +- evennia/settings_default.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/evennia/server/portal/irc.py b/evennia/server/portal/irc.py index d74fbaa86..2b616f2ce 100644 --- a/evennia/server/portal/irc.py +++ b/evennia/server/portal/irc.py @@ -421,7 +421,7 @@ class IRCBotFactory(protocol.ReconnectingClientFactory): def clientConnectionLost(self, connector, reason): """ - Called when Client looses connection. + Called when Client loses connection. Args: connector (Connection): Represents the connection. diff --git a/evennia/settings_default.py b/evennia/settings_default.py index 9efbb6314..d86889886 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -138,7 +138,7 @@ HTTP_LOG_FILE = os.path.join(LOG_DIR, 'http_requests.log') LOCKWARNING_LOG_FILE = os.path.join(LOG_DIR, 'lockwarnings.log') # Rotate log files when server and/or portal stops. This will keep log # file sizes down. Turn off to get ever growing log files and never -# loose log info. +# lose log info. CYCLE_LOGFILES = True # Number of lines to append to rotating channel logs when they rotate CHANNEL_LOG_NUM_TAIL_LINES = 20 From 139174ada53c016d64b2a7f72190f1c1efe7d75f Mon Sep 17 00:00:00 2001 From: Jerry Aldrich Date: Sat, 27 Oct 2018 12:18:12 -0700 Subject: [PATCH 11/12] Correct a few spelling errors in tutorial build.ev --- evennia/contrib/tutorial_world/build.ev | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/evennia/contrib/tutorial_world/build.ev b/evennia/contrib/tutorial_world/build.ev index 118486500..ce1bbe4bc 100644 --- a/evennia/contrib/tutorial_world/build.ev +++ b/evennia/contrib/tutorial_world/build.ev @@ -744,7 +744,7 @@ hole the remains of the castle. There is also a standing archway offering passage to a path along the old |wsouth|nern inner wall. # -@detail portoculis;fall;fallen;grating = +@detail portcullis;fall;fallen;grating = This heavy iron grating used to block off the inner part of the gate house, now it has fallen to the ground together with the stone archway that once help it up. # @@ -786,7 +786,7 @@ archway The buildings make a half-circle along the main wall, here and there broken by falling stone and rubble. At one end (the |wnorth|nern) of this half-circle is the entrance to the castle, the ruined - gatehoue. |wEast|nwards from here is some sort of open courtyard. + gatehouse. |wEast|nwards from here is some sort of open courtyard. #------------------------------------------------------------ # @@ -808,7 +808,7 @@ archway Previously one could probably continue past the obelisk and eastward into the castle keep itself, but that way is now completely blocked by fallen rubble. To the |wwest|n is the gatehouse and entrance to - the castle, whereas |wsouth|nwards the collumns make way for a wide + the castle, whereas |wsouth|nwards the columns make way for a wide open courtyard. # @set here/tutorial_info = From fb32521d5b27e03ad0ef0a76b224f8be31df8e15 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 27 Oct 2018 21:19:41 +0200 Subject: [PATCH 12/12] Minor adjustments to text --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fec889513..0d1917c4e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,5 +2,6 @@ Evennia utilizes GitHub for issue tracking and contributions: - - Reporting issues/bugs or making feature requests can be done [here](https://github.com/evennia/evennia/issues) - - Evennia also has a [wiki](https://github.com/evennia/evennia/wiki) that contains a guide to contributing [here](https://github.com/evennia/evennia/wiki/Contributing) + - Reporting Issues issues/bugs and making feature requests can be done [in the issue tracker](https://github.com/evennia/evennia/issues). + - Evennia's documentation is a [wiki](https://github.com/evennia/evennia/wiki) that everyone can contribute to. Further + instructions and details about contributing is found [here](https://github.com/evennia/evennia/wiki/Contributing).