real fix for broken Entering logs
the port from javascript didn't translate the javascript `map` into the python world properly
Fixes #10
diff --git a/src/composer/composer.py b/src/composer/composer.py
index ba35e92..324694b 100644
--- a/src/composer/composer.py
+++ b/src/composer/composer.py
@@ -74,12 +74,12 @@
combinator = combinators[getattr(self, 'type')]
if 'components' in combinator:
- self.components = tuple(map(lambda c: f(c, None), self.components))
+ self.components = [f(c, str(idx), True) for idx,c in enumerate(self.components)]
if 'args' in combinator:
for arg in combinator['args']:
if 'type' not in arg:
- setattr(self, arg['_'], f(getattr(self, arg['_']), arg['_']))
+ setattr(self, arg['_'], f(getattr(self, arg['_']), arg['_'], False))
def get_value(env, args):
@@ -315,7 +315,7 @@
''' recursively deserialize composition '''
composition = Composition(composition)
- composition.visit(lambda composition, name: self.deserialize(composition))
+ composition.visit(lambda composition, name, ignore=False: self.deserialize(composition))
return composition
def label(self, composition):
@@ -325,13 +325,12 @@
raise ComposerError('Invalid argument', composition)
def label(path):
-
- def labeler(composition, name, array=None) :
+ def labeler(composition, name, array=False):
nonlocal path
composition = Composition(composition)
segment = ''
if name is not None:
- if array is not None:
+ if array:
segment = '['+name+']'
else:
segment = '.'+name
@@ -362,7 +361,7 @@
# if isinstance(combinators, str): # lower to combinators of specific composer version
# combinators = Object.keys(this.combinators).filter(key => semver.gte(combinators, this.combinators[key].since))
- def lower(composition, name):
+ def lower(composition, name, ignore=False):
composition = Composition(composition) # copy
# repeatedly lower root combinator
@@ -525,7 +524,7 @@
def escape(str):
return re.sub(r'(\n|\t|\r|\f|\v|\\|\')', lambda m:{'\n':'\\n','\t':'\\t','\r':'\\r','^\f':'\\f','\v':'\\v','\\':'\\\\','\'':'\\\''}[m.group()], str)
- def encode(composition, name):
+ def encode(composition, name, ignore=False):
composition = Composition(composition)
composition.visit(encode)
if composition.type == 'composition':
diff --git a/src/composer/conductor.py b/src/composer/conductor.py
index eb11bd8..c9fd247 100644
--- a/src/composer/conductor.py
+++ b/src/composer/conductor.py
@@ -100,10 +100,16 @@
isObject = lambda x: isinstance(x, dict)
def encodeError(error):
- return {
- 'code': error['code'] if isinstance(error['code'], int) else 500,
- 'error': error['error'] if isinstance(error['error'], str) else (error['message'] if 'message' in error else (error if isinstance(error, str) else 'An internal error occurred'))
- }
+ if isinstance(error, str) or not hasattr(error, "__getitem__"):
+ return {
+ 'code': 500,
+ 'error': error
+ }
+ else:
+ return {
+ 'code': error['code'] if isinstance(error['code'], int) else 500,
+ 'error': error['error'] if isinstance(error['error'], str) else (error['message'] if 'message' in error else 'An internal error occurred')
+ }
# error status codes
badRequest = lambda error: { 'code': 400, 'error': error }
@@ -214,8 +220,8 @@
# process one state
jsonv = fsm[state] # jsonv definition for current state
- if hasattr(jsonv, 'path'):
- print('Entering composition'+jsonv.path)
+ if 'path' in jsonv:
+ print('Entering composition'+jsonv['path'])
current = state
state = current + jsonv['next'] if 'next' in jsonv else None # default next state
if jsonv['type'] == 'choice':