Skip to content

Commit

Permalink
improving getting all UnimacroGrammars (allGrammarXObjects), making i…
Browse files Browse the repository at this point in the history
…s a class variable instead of global.
  • Loading branch information
quintijn committed Jan 5, 2023
1 parent d7fd8f5 commit e7cfda4
Showing 1 changed file with 76 additions and 65 deletions.
141 changes: 76 additions & 65 deletions src/unimacro/natlinkutilsbj.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,56 +297,56 @@ def RegisterGrammarObject(GrammarObject):
allUnimacroGrammars[GrammarObject.GetName()] = GrammarObject
grammarsChanged = 1

def UnRegisterGrammarObject(GrammarObject):
"""unregisters a grammar object from the global variable
also sets the flag "grammarsChanged"
delete the item in the dictionary "allUnimacroGrammars"
"""
#pylint:disable=W0603
global allUnimacroGrammars, grammarsChanged
for k, v in list(allUnimacroGrammars.items()):
if v is GrammarObject:
del allUnimacroGrammars[k]
# print('UNregistering grammar object: %s: %s'% (GrammarObject.GetName(), GrammarObject))
grammarsChanged = 1
return

def CallAllGrammarObjects(funcName,args):
"""calls a function through all grammar objects
funcName should be a string with the function name
args should be a tuple of arguments, can be empty tuple ()
exits silently if function doesn't exist in a grammar
"""
if args and len(args) == 1 and isinstance(args[0], tuple):
args = args[0] # in order to be able to give arguments "loose" in the call instead of
# in a explicit tuple: CAGO(func, a, b, c) instead of
# CAGO(func, (a, b, c))
for name, grammar in list(allUnimacroGrammars.items()):
if not grammar.isLoaded():
# only loaded grammars...
continue
try:
func = getattr(grammar, funcName)
except AttributeError:
print('func not found for %s'% name)
func(*args)
# except AttributeError:
# print 'apply %s of %s fails'% (funcName, name)
# pass

def getRegisteredGrammarNames():
return list(allUnimacroGrammars.keys())
# def UnRegisterGrammarObject(GrammarObject):
# """unregisters a grammar object from the global variable
#
# also sets the flag "grammarsChanged"
# delete the item in the dictionary "allUnimacroGrammars"
#
# """
# #pylint:disable=W0603
# global allUnimacroGrammars, grammarsChanged
# for k, v in list(allUnimacroGrammars.items()):
# if v is GrammarObject:
# del allUnimacroGrammars[k]
# # print('UNregistering grammar object: %s: %s'% (GrammarObject.GetName(), GrammarObject))
# grammarsChanged = 1
# return

def GetGrammarObject(grammarName):
"""return the grammar object, if in correct dict, by user name
"""
if grammarName in allUnimacroGrammars:
return allUnimacroGrammars[grammarName]
return None
# def CallAllGrammarObjects(funcName,args):
# """calls a function through all grammar objects
#
# funcName should be a string with the function name
# args should be a tuple of arguments, can be empty tuple ()
# exits silently if function doesn't exist in a grammar
#
# """
# if args and len(args) == 1 and isinstance(args[0], tuple):
# args = args[0] # in order to be able to give arguments "loose" in the call instead of
# # in a explicit tuple: CAGO(func, a, b, c) instead of
# # CAGO(func, (a, b, c))
# for name, grammar in list(allUnimacroGrammars.items()):
# if not grammar.isLoaded():
# # only loaded grammars...
# continue
# try:
# func = getattr(grammar, funcName)
# except AttributeError:
# print('func not found for %s'% name)
# func(*args)
# # except AttributeError:
# # print 'apply %s of %s fails'% (funcName, name)
# # pass

# def getRegisteredGrammarNames():
# return list(allUnimacroGrammars.keys())
#
# def GetGrammarObject(grammarName):
# """return the grammar object, if in correct dict, by user name
# """
# if grammarName in allUnimacroGrammars:
# return allUnimacroGrammars[grammarName]
# return None

# Utility functions for displaying messages in the results box.
# The module _control registers these, and should be available.
Expand Down Expand Up @@ -499,12 +499,15 @@ class GrammarX(GrammarXAncestor):
"""
#pylint:disable=R0904, C0116
__inherited=GrammarXAncestor
# status = 'new'
try:
allGrammarXObjects
except NameError:
allGrammarXObjects = {}

def __init__(self):
self.__inherited.__init__(self)
# set in list of allUnimacroGrammars, also when not loaded into
RegisterGrammarObject(self)
self.RegisterGrammarObject()
self.inGotBegin = 1 # initialise behave like being there
self.mayBeSwitchedOn = 1
# self.isActive = 0 # now user isActive() from GrammarBase
Expand All @@ -516,6 +519,25 @@ def __init__(self):
self.hypothesis = 0
self.allResults = 0

def getUnimacroGrammars(self):
"""return the dict of (name, grammarobject) of GrammarX objects
"""
return copy.copy(self.allGrammarXObjects)

def RegisterGrammarObject(self):
self.__class__.allGrammarXObjects[self.name] = self

def GetGrammarObject(self, grammarName):
"""return the grammar object, if in correct dict, by user name
"""
if grammarName in self.allGrammarXObjects:
return self.allGrammarXObjects[grammarName]
return None

def getRegisteredGrammarNames(self):
return list(self.allGrammarXObjects.keys())


def getPrimaryAncestor(self):
# the default primary ancestor is the first baseclass
return self.__class__.__bases__[0]
Expand All @@ -524,16 +546,13 @@ def load(self,gramSpec,allResults=0,hypothesis=0, grammarName=None):

if gramSpec:
success = self.__inherited.load(self,gramSpec,allResults,hypothesis, grammarName=grammarName)
# if success:
# RegisterGrammarObject(self)
return success
return None

def __str__(self):
return '<grammarx: %s>'% self.GetName()

def unload(self):
UnRegisterGrammarObject(self)
self.__inherited.unload(self)

def beginCallback(self, moduleInfo):
Expand Down Expand Up @@ -1759,16 +1778,8 @@ def switchOn(self, **kw):

# try:
self.fillGrammarLists()
if self.DNSVersion:
print('IniGrammar switched on: %s (%s)'% (self.getName(), self.DNSVersion))
else:
print('IniGrammar switched on: %s'% self.getName())

# except:
# self.message('error switching on grammar %s, deactivate all rules\n\n (%s, %s)'%
# (self.getName(), sys.exc_info()[0], sys.exc_info()[1]))
# self.deactivateAll()
#
print(f'IniGrammar switched on: {self.getName()}')

def showInifile(self, body=None, grammarLists=None, ini=None,
showGramspec=1, prefix=None, commandExplanation=None,
postfix=None, lineLen=60, sort=1):
Expand Down Expand Up @@ -2150,7 +2161,7 @@ def setPunctuationList(self, name, puncts=None):
else:
spokenList = [i for i in puncts if i in allPunctsSpoken]

print('characters list "%s": %s'% (name, spokenList))
# print('characters list "%s": %s'% (name, spokenList))
self.setList(name, spokenList)
return spokenList

Expand Down

0 comments on commit e7cfda4

Please sign in to comment.