From 8d3e946f2d588179ccd92ad8563d1dc6d07b332b Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 16:42:28 -0500 Subject: [PATCH 01/11] 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 b4124b7219..8e954592ad 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 7664065a454bed6f426688f35b561ecb7e299d5f Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 17:09:01 -0500 Subject: [PATCH 02/11] 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 8e954592ad..15cf862dd7 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 ea61719edf8ae4dddd6c73265125289119c3a598 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 19:07:46 -0500 Subject: [PATCH 03/11] 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 15cf862dd7..a98627a67c 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 246cd57243924f3c3a1793e1fc329b6cb399c605 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 14 Oct 2018 19:09:38 -0500 Subject: [PATCH 04/11] 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 a98627a67c..ac26fe40aa 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 7c11d5a64c38a56194135b9f3b8c1727fc1719c5 Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sat, 20 Oct 2018 22:39:53 -0500 Subject: [PATCH 05/11] 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 ac26fe40aa..a42e394b78 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 d408a7e8ad0488d16dd456949f9be3495d39454e Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 21 Oct 2018 09:21:58 -0500 Subject: [PATCH 06/11] 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 a42e394b78..c044d776fb 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 0a7bb5b92612f12a462360c22579fc3f7e7b710b Mon Sep 17 00:00:00 2001 From: Henddher Pedroza Date: Sun, 21 Oct 2018 20:13:31 -0500 Subject: [PATCH 07/11] 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 c044d776fb..3981ea1476 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 6ca5b83802bf3b230f774ea5f8e1f3af1d4519ac Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 27 Oct 2018 19:08:31 +0200 Subject: [PATCH 08/11] 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 36db7e5a60..ae7e867f27 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 fcda53cdfd..54b0ac33d2 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 3981ea1476..b4124b7219 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 0000000000..2d5b1eeaf0 --- /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 de52251d28d3c064c50592bf7c7088320b987a55 Mon Sep 17 00:00:00 2001 From: Jerry Aldrich Date: Sat, 27 Oct 2018 11:23:02 -0700 Subject: [PATCH 09/11] 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 0000000000..fec8895136 --- /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 1fedea563b6fcca122075aadec22ea1159e967b3 Mon Sep 17 00:00:00 2001 From: Jerry Aldrich Date: Sat, 27 Oct 2018 11:59:03 -0700 Subject: [PATCH 10/11] 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 d74fbaa86e..2b616f2ce1 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 9efbb6314b..d868898861 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 672d02a0484b4134069f9d5586f6690a52bccc02 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 27 Oct 2018 21:19:41 +0200 Subject: [PATCH 11/11] Minor adjustments to text --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fec8895136..0d1917c4e4 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).