class ProgramyConfiguration(object): def __init__(self, client_configuration, brain_config=None, bot_config=None): if brain_config is None: self._brain_config = BrainConfiguration() else: self._brain_config = brain_config if bot_config is None: self._bot_config = BotConfiguration() else: self._bot_config = bot_config self._client_config = client_configuration @property def brain_configuration(self): return self._brain_config @property def bot_configuration(self): return self._bot_config @property def client_configuration(self): return self._client_config def load_config_data(self, config_file, bot_root): self._brain_config.load_config_section(config_file, bot_root) self._bot_config.load_config_section(config_file, bot_root) self._client_config.load_config_section(config_file, bot_root)
def test_oob_processing(self): yaml = YamlConfigurationFile() yaml.load_from_file(os.path.dirname(__file__)+"/test_brain.yaml", ConsoleConfiguration(), os.path.dirname(__file__)) brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) self.assertEqual("", brain.process_oob(None, "console", "<oob></oob>"))
def test_oob_processing(self): yaml = YamlConfigurationFile() self.load_os_specific_configuration(yaml, "test_brain.yaml", "test_brain.windows.yaml") brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) self.assertEqual("", brain.process_oob(None, "console", "<oob></oob>"))
def test_brain_init_with_config(self): yaml = YamlConfigurationFile() self.load_os_specific_configuration(yaml, "test_brain.yaml", "test_brain.windows.yaml") brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) self.assertIsNotNone(brain) self.assertIsNotNone(brain.aiml_parser) self.assertIsNotNone(brain.denormals) self.assertIsNotNone(brain.normals) self.assertIsNotNone(brain.genders) self.assertIsNotNone(brain.persons) self.assertIsNotNone(brain.person2s) self.assertIsNotNone(brain.properties) self.assertIsNotNone(brain.rdf) self.assertIsNotNone(brain.sets) self.assertIsNotNone(brain.maps) self.assertIsNotNone(brain.preprocessors) self.assertIsNotNone(brain.postprocessors) self.assertIsNotNone(brain.authentication) self.assertIsNotNone(brain.authorisation) self.assertIsNotNone(brain.default_oob) self.assertIsNotNone(brain.oobs) if os.path.exists(brain_config.binaries.binary_filename): os.remove(brain_config.binaries.binary_filename) self.assertFalse(os.path.exists(brain_config.binaries.binary_filename)) brain.save_binary(brain_config) self.assertTrue(os.path.exists(brain_config.binaries.binary_filename)) brain.load_binary(brain_config) self.assertTrue(brain.authentication.authenticate("console")) self.assertTrue(brain.authentication.authenticate("someone")) self.assertTrue(brain.authorisation.authorise("console", "somthing")) self.assertTrue(brain.authorisation.authorise("someone", "other")) oob_content = ET.fromstring("<oob><something>other</something></oob>") self.assertEqual( "", brain.default_oob.process_out_of_bounds(None, "console", oob_content)) oob_content = ET.fromstring("<oob><dial>07777777777</dial></oob>") self.assertEqual( "", brain.oobs['dial'].process_out_of_bounds(None, "console", oob_content))
def test_oob_loading(self): yaml = YamlConfigurationFile() yaml.load_from_file(os.path.dirname(__file__)+"/test_brain.yaml", ConsoleConfiguration(), os.path.dirname(__file__)) brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) self.assertIsInstance(brain.default_oob, DefaultOutOfBoundsProcessor) self.assertIsInstance(brain.oobs['dial'], DialOutOfBoundsProcessor) self.assertIsInstance(brain.oobs['email'], EmailOutOfBoundsProcessor)
def test_oob_loading(self): yaml = YamlConfigurationFile() self.load_os_specific_configuration(yaml, "test_brain.yaml", "test_brain.windows.yaml") brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) self.assertIsInstance(brain.default_oob, DefaultOutOfBandProcessor) self.assertIsInstance(brain.oobs['dial'], DialOutOfBandProcessor) self.assertIsInstance(brain.oobs['email'], EmailOutOfBandProcessor)
def test_brain_init_with_secure_config(self): yaml = YamlConfigurationFile() yaml.load_from_file(os.path.dirname(__file__)+ os.sep + "test_secure_brain.yaml", ConsoleConfiguration(), os.path.dirname(__file__)) brain_config = BrainConfiguration() brain_config.load_config_section(yaml, os.path.dirname(__file__)) brain = Brain(brain_config) self.assertIsNotNone(brain) self.assertTrue(brain.authentication.authenticate("console")) self.assertFalse(brain.authentication.authenticate("someone")) self.assertTrue(brain.authorisation.authorise("console", "root")) self.assertFalse(brain.authorisation.authorise("console", "unknown")) with self.assertRaises(AuthorisationException): brain.authorisation.authorise("someone", "root")
def test_oob_stripping(self): yaml = YamlConfigurationFile() yaml.load_from_file(os.path.dirname(__file__)+"/test_brain.yaml", ConsoleConfiguration(), os.path.dirname(__file__)) brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) response, oob = brain.strip_oob("<oob>command</oob>") self.assertEqual("", response) self.assertEqual("<oob>command</oob>", oob) response, oob = brain.strip_oob("This <oob>command</oob>") self.assertEqual("This ", response) self.assertEqual("<oob>command</oob>", oob) response, oob = brain.strip_oob("This <oob>command</oob> That") self.assertEqual("This That", response) self.assertEqual("<oob>command</oob>", oob)
def test_oob_stripping(self): yaml = YamlConfigurationFile() self.load_os_specific_configuration(yaml, "test_brain.yaml", "test_brain.windows.yaml") brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") brain = Brain(brain_config) response, oob = brain.strip_oob("<oob>command</oob>") self.assertEqual("", response) self.assertEqual("<oob>command</oob>", oob) response, oob = brain.strip_oob("This <oob>command</oob>") self.assertEqual("This ", response) self.assertEqual("<oob>command</oob>", oob) response, oob = brain.strip_oob("This <oob>command</oob> That") self.assertEqual("This That", response) self.assertEqual("<oob>command</oob>", oob)
def test_with_data(self): yaml = YamlConfigurationFile() self.assertIsNotNone(yaml) yaml.load_from_text( """ brain: overrides: allow_system_aiml: true allow_learn_aiml: true allow_learnf_aiml: true defaults: default-get: unknown default-property: unknown default-map: unknown learn-filename: y-bot-learn.aiml nodes: pattern_nodes: $BOT_ROOT/config/pattern_nodes.conf template_nodes: $BOT_ROOT/config/template_nodes.conf binaries: save_binary: false load_binary: false binary_filename: /tmp/y-bot.brain load_aiml_on_binary_fail: false braintree: file: /tmp/braintree.xml content: xml files: aiml: files: $BOT_ROOT/aiml extension: .aiml directories: true errors: /tmp/y-bot_errors.txt duplicates: /tmp/y-bot_duplicates.txt conversation: /tmp/y-bot_conversation.txt sets: files: $BOT_ROOT/sets extension: .txt directories: false maps: files: $BOT_ROOT/maps extension: .txt directories: false denormal: $BOT_ROOT/config/denormal.txt normal: $BOT_ROOT/config/normal.txt gender: $BOT_ROOT/config/gender.txt person: $BOT_ROOT/config/person.txt person2: $BOT_ROOT/config/person2.txt properties: $BOT_ROOT/config/properties.txt triples: $BOT_ROOT/config/triples.txt preprocessors: $BOT_ROOT/config/preprocessors.conf postprocessors: $BOT_ROOT/config/postprocessors.conf regex_templates: $BOT_ROOT/config/regex-templates.txt security: authentication: classname: programy.utils.security.authenticate.passthrough.PassThroughAuthenticationService denied_srai: AUTHENTICATION_FAILED authorisation: classname: programy.utils.security.authorise.passthrough.PassThroughAuthorisationService denied_srai: AUTHORISATION_FAILED oob: default: classname: programy.utils.oob.default.DefaultOutOfBandProcessor dial: classname: programy.utils.oob.dial.DialOutOfBandProcessor email: classname: programy.utils.oob.email.EmailOutOfBandProcessor dynamic: variables: gettime: programy.dynamic.variables.datetime.GetTime sets: number: programy.dynamic.sets.numeric.IsNumeric roman: programy.dynamic.sets.roman.IsRomanNumeral maps: romantodec: programy.dynamic.maps.roman.MapRomanToDecimal dectoroman: programy.dynamic.maps.roman.MapDecimalToRoman services: REST: classname: programy.utils.services.rest.GenericRESTService method: GET host: 0.0.0.0 Pannous: classname: programy.utils.services.pannous.PannousService url: http://weannie.pannous.com/api Pandora: classname: programy.utils.services.pandora.PandoraService url: http://www.pandorabots.com/pandora/talk-xml Wikipedia: classname: programy.utils.services.wikipediaservice.WikipediaService """, ConsoleConfiguration(), ".") brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") self.assertIsNotNone(brain_config.overrides) self.assertTrue(brain_config.overrides.allow_system_aiml) self.assertTrue(brain_config.overrides.allow_learn_aiml) self.assertTrue(brain_config.overrides.allow_learnf_aiml) self.assertIsNotNone(brain_config.defaults) self.assertEqual("unknown", brain_config.defaults.default_get) self.assertEqual("unknown", brain_config.defaults.default_property) self.assertEqual("unknown", brain_config.defaults.default_map) self.assertEqual("y-bot-learn.aiml", brain_config.defaults.learn_filename) self.assertIsNotNone(brain_config.nodes) self.assertEquals("./config/pattern_nodes.conf", brain_config.nodes.pattern_nodes) self.assertEquals("./config/template_nodes.conf", brain_config.nodes.template_nodes) self.assertIsNotNone(brain_config.binaries) self.assertFalse(brain_config.binaries.save_binary) self.assertFalse(brain_config.binaries.load_binary) self.assertEquals("/tmp/y-bot.brain", brain_config.binaries.binary_filename) self.assertFalse(brain_config.binaries.load_aiml_on_binary_fail) self.assertIsNotNone(brain_config.braintree) self.assertEquals("/tmp/braintree.xml", brain_config.braintree.file) self.assertEquals("xml", brain_config.braintree.content) self.assertIsNotNone(brain_config.files) self.assertIsNotNone(brain_config.files.aiml_files) self.assertEqual("./aiml", brain_config.files.aiml_files.files) self.assertEqual(".aiml", brain_config.files.aiml_files.extension) self.assertTrue(brain_config.files.aiml_files.directories) self.assertEqual("/tmp/y-bot_errors.txt", brain_config.files.aiml_files.errors) self.assertEqual("/tmp/y-bot_duplicates.txt", brain_config.files.aiml_files.duplicates) self.assertEqual("/tmp/y-bot_conversation.txt", brain_config.files.aiml_files.conversation) self.assertIsNotNone(brain_config.files.set_files) self.assertEqual("./sets", brain_config.files.set_files.files) self.assertEqual(".txt", brain_config.files.set_files.extension) self.assertFalse(brain_config.files.set_files.directories) self.assertIsNotNone(brain_config.files.map_files) self.assertEqual("./maps", brain_config.files.map_files.files) self.assertEqual(".txt", brain_config.files.map_files.extension) self.assertFalse(brain_config.files.map_files.directories) self.assertEqual(brain_config.files.denormal, "./config/denormal.txt") self.assertEqual(brain_config.files.normal, "./config/normal.txt") self.assertEqual(brain_config.files.gender, "./config/gender.txt") self.assertEqual(brain_config.files.person, "./config/person.txt") self.assertEqual(brain_config.files.person2, "./config/person2.txt") self.assertEqual(brain_config.files.properties, "./config/properties.txt") self.assertEqual(brain_config.files.triples, "./config/triples.txt") self.assertEqual(brain_config.files.preprocessors, "./config/preprocessors.conf") self.assertEqual(brain_config.files.postprocessors, "./config/postprocessors.conf") self.assertEqual(brain_config.files.regex_templates, "./config/regex-templates.txt") self.assertIsNotNone(brain_config.security) self.assertIsNotNone(brain_config.security.authorisation) self.assertIsNotNone(brain_config.security.authentication) self.assertIsNotNone(brain_config.services) self.assertTrue(brain_config.services.exists("REST")) self.assertTrue(brain_config.services.exists("Pannous")) self.assertTrue(brain_config.services.exists("Pandora")) self.assertTrue(brain_config.services.exists("Wikipedia")) self.assertFalse(brain_config.services.exists("Other")) self.assertIsNotNone(brain_config.oob) self.assertIsNotNone(brain_config.oob.oobs()) self.assertIsNotNone(brain_config.oob.default()) self.assertIsNotNone(brain_config.oob.oob("dial")) self.assertIsNotNone(brain_config.oob.oob("email")) self.assertIsNotNone(brain_config.dynamics) self.assertIsNotNone(brain_config.dynamics.dynamic_sets) self.assertTrue("NUMBER" in brain_config.dynamics.dynamic_sets) self.assertTrue("ROMAN" in brain_config.dynamics.dynamic_sets) self.assertIsNotNone(brain_config.dynamics.dynamic_maps) self.assertTrue("ROMANTODEC" in brain_config.dynamics.dynamic_maps) self.assertTrue("DECTOROMAN" in brain_config.dynamics.dynamic_maps) self.assertIsNotNone(brain_config.dynamics.dynamic_vars) self.assertTrue("GETTIME" in brain_config.dynamics.dynamic_vars)
def test_with_data(self): yaml = YamlConfigurationFile() self.assertIsNotNone(yaml) yaml.load_from_text(""" brain: overrides: allow_system_aiml: true allow_learn_aiml: true allow_learnf_aiml: true defaults: default-get: unknown default-property: unknown default-map: unknown learn-filename: y-bot-learn.aiml nodes: pattern_nodes: $BOT_ROOT/config/pattern_nodes.conf template_nodes: $BOT_ROOT/config/template_nodes.conf binaries: save_binary: false load_binary: false binary_filename: $BOT_ROOT/output/y-bot.brain load_aiml_on_binary_fail: false dump_to_file: $BOT_ROOT/output/braintree.txt files: aiml: files: $BOT_ROOT/aiml extension: .aiml directories: true errors: $BOT_ROOT/output/y-bot_errors.txt duplicates: $BOT_ROOT/output/y-bot_duplicates.txt sets: files: $BOT_ROOT/sets extension: .txt directories: false maps: files: $BOT_ROOT/maps extension: .txt directories: false denormal: $BOT_ROOT/config/denormal.txt normal: $BOT_ROOT/config/normal.txt gender: $BOT_ROOT/config/gender.txt person: $BOT_ROOT/config/person.txt person2: $BOT_ROOT/config/person2.txt predicates: $BOT_ROOT/config/predicates.txt pronouns: $BOT_ROOT/config/pronouns.txt properties: $BOT_ROOT/config/properties.txt triples: $BOT_ROOT/config/triples.txt preprocessors: $BOT_ROOT/config/preprocessors.conf postprocessors: $BOT_ROOT/config/postprocessors.conf security: authentication: classname: programy.utils.security.authenticate.passthrough.PassThroughAuthenticationService denied_srai: AUTHENTICATION_FAILED authorisation: classname: programy.utils.security.authorise.passthrough.PassThroughAuthorisationService denied_srai: AUTHORISATION_FAILED oob: default: classname: programy.utils.oob.default.DefaultOutOfBoundsProcessor dial: classname: programy.utils.oob.dial.DialOutOfBoundsProcessor email: classname: programy.utils.oob.email.EmailOutOfBoundsProcessor services: REST: classname: programy.utils.services.rest.GenericRESTService method: GET host: 0.0.0.0 Pannous: classname: programy.utils.services.pannous.PannousService url: http://weannie.pannous.com/api Pandora: classname: programy.utils.services.pandora.PandoraService url: http://www.pandorabots.com/pandora/talk-xml Wikipedia: classname: programy.utils.services.wikipediaservice.WikipediaService """, ConsoleConfiguration(), ".") brain_config = BrainConfiguration() brain_config.load_config_section(yaml, ".") self.assertIsNotNone(brain_config.overrides) self.assertTrue(brain_config.overrides.allow_system_aiml) self.assertTrue(brain_config.overrides.allow_learn_aiml) self.assertTrue(brain_config.overrides.allow_learnf_aiml) self.assertIsNotNone(brain_config.defaults) self.assertEqual("unknown", brain_config.defaults.default_get) self.assertEqual("unknown", brain_config.defaults.default_property) self.assertEqual("unknown", brain_config.defaults.default_map) self.assertEqual("y-bot-learn.aiml", brain_config.defaults.learn_filename) self.assertIsNotNone(brain_config.nodes) self.assertEquals("./config/pattern_nodes.conf", brain_config.nodes.pattern_nodes) self.assertEquals("./config/template_nodes.conf", brain_config.nodes.template_nodes) self.assertIsNotNone(brain_config.binaries) self.assertFalse(brain_config.binaries.save_binary) self.assertFalse(brain_config.binaries.load_binary) self.assertEquals("./output/y-bot.brain", brain_config.binaries.binary_filename) self.assertFalse(brain_config.binaries.load_aiml_on_binary_fail) self.assertEquals("./output/braintree.txt", brain_config.binaries.dump_to_file) self.assertIsNotNone(brain_config.files) self.assertIsNotNone(brain_config.files.aiml_files) self.assertEqual("./aiml", brain_config.files.aiml_files.files) self.assertEqual(".aiml", brain_config.files.aiml_files.extension) self.assertTrue(brain_config.files.aiml_files.directories) self.assertEqual("./output/y-bot_errors.txt", brain_config.files.aiml_files.errors) self.assertEqual("./output/y-bot_duplicates.txt", brain_config.files.aiml_files.duplicates) self.assertIsNotNone(brain_config.files.set_files) self.assertEqual("./sets", brain_config.files.set_files.files) self.assertEqual(".txt", brain_config.files.set_files.extension) self.assertFalse(brain_config.files.set_files.directories) self.assertIsNotNone(brain_config.files.map_files) self.assertEqual("./maps", brain_config.files.map_files.files) self.assertEqual(".txt", brain_config.files.map_files.extension) self.assertFalse(brain_config.files.map_files.directories) self.assertEqual(brain_config.files.denormal, "./config/denormal.txt") self.assertEqual(brain_config.files.normal, "./config/normal.txt") self.assertEqual(brain_config.files.gender, "./config/gender.txt") self.assertEqual(brain_config.files.person, "./config/person.txt") self.assertEqual(brain_config.files.person2, "./config/person2.txt") self.assertEqual(brain_config.files.predicates, "./config/predicates.txt") self.assertEqual(brain_config.files.pronouns, "./config/pronouns.txt") self.assertEqual(brain_config.files.properties, "./config/properties.txt") self.assertEqual(brain_config.files.triples, "./config/triples.txt") self.assertEqual(brain_config.files.preprocessors, "./config/preprocessors.conf") self.assertEqual(brain_config.files.postprocessors, "./config/postprocessors.conf") self.assertIsNotNone(brain_config.security) self.assertIsNotNone(brain_config.security.authorisation) self.assertIsNotNone(brain_config.security.authentication) self.assertIsNotNone(brain_config.oob) self.assertIsNotNone(brain_config.oob.oobs()) self.assertIsNotNone(brain_config.oob.default()) self.assertIsNotNone(brain_config.oob.oob("dial")) self.assertIsNotNone(brain_config.oob.oob("email")) self.assertIsNotNone(brain_config.services) self.assertTrue(brain_config.services.exists("REST")) self.assertTrue(brain_config.services.exists("Pannous")) self.assertTrue(brain_config.services.exists("Pandora")) self.assertTrue(brain_config.services.exists("Wikipedia")) self.assertFalse(brain_config.services.exists("Other"))