Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mapping._parse_header_selector error under python 3.8 #711

Closed
jdavies-st opened this issue Oct 28, 2019 · 4 comments
Closed

Mapping._parse_header_selector error under python 3.8 #711

jdavies-st opened this issue Oct 28, 2019 · 4 comments

Comments

@jdavies-st
Copy link
Contributor

Python 3.7.4:

In [1]: from crds.core import rmap

In [2]: rmap.Mapping.from_file(basename='jwst_0558.pmap')
Out[2]: Mapping('jwst_0558.pmap')

Python 3.8.0

In [1]: %xmode Verbose
Exception reporting mode: Verbose

In [2]: from crds.core import rmap

In [3]: rmap.Mapping.from_file(basename='jwst_0558.pmap')
---------------------------------------------------------------------------
MappingFormatError                        Traceback (most recent call last)
~/venv/test/lib/python3.8/site-packages/crds/core/log.py in func_on_exception(*args=("Can't load file jwst_0558.pmap",), **keys={'end': ''})
    365         try:
--> 366             yield
    367         except Exception as exc:

~/venv/test/lib/python3.8/site-packages/crds/core/rmap.py in _parse_header_selector(cls=<class 'crds.core.rmap.Mapping'>, text="header = {\n    'derived_from' : 'jwst_0557.pmap'...imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n", where='jwst_0558.pmap')
    291                                    exception_class=crexc.MappingError):
--> 292             code = MAPPING_VERIFIER.compile_and_check(text)
        code = undefined
        global MAPPING_VERIFIER.compile_and_check = <bound method MappingVerifier.compile_and_check of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        text = "header = {\n    'derived_from' : 'jwst_0557.pmap',\n    'description' : 'Hand edited to add FGS, MIRI, NIRCAM, NIRISS PATHLOSS as N/A',\n    'mapping' : 'PIPELINE',\n    'name' : 'jwst_0558.pmap',\n    'observatory' : 'JWST',\n    'parkey' : ('META.INSTRUMENT.NAME',),\n    'sha1sum' : '0ee26a826da4643bddcd7466dd75240228f227e7',\n}\n\nselector = {\n    'FGS' : 'jwst_fgs_0075.imap',\n    'MIRI' : 'jwst_miri_0185.imap',\n    'NIRCAM' : 'jwst_nircam_0122.imap',\n    'NIRISS' : 'jwst_niriss_0121.imap',\n    'NIRSPEC' : 'jwst_nirspec_0193.imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n"
    293             header, selector, comment = cls._interpret(code)

~/venv/test/lib/python3.8/site-packages/crds/core/mapping_verifier.py in compile_and_check(self=<crds.core.mapping_verifier.MappingVerifier object>, text="header = {\n    'derived_from' : 'jwst_0557.pmap'...imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n", source='<ast>', mode='exec')
    121         if sys.version_info >= (2, 7, 0):
--> 122             self.visit(ast.parse(text))
        self.visit = <bound method NodeVisitor.visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        global ast.parse = <function parse at 0x1018d2dc0>
        text = "header = {\n    'derived_from' : 'jwst_0557.pmap',\n    'description' : 'Hand edited to add FGS, MIRI, NIRCAM, NIRISS PATHLOSS as N/A',\n    'mapping' : 'PIPELINE',\n    'name' : 'jwst_0558.pmap',\n    'observatory' : 'JWST',\n    'parkey' : ('META.INSTRUMENT.NAME',),\n    'sha1sum' : '0ee26a826da4643bddcd7466dd75240228f227e7',\n}\n\nselector = {\n    'FGS' : 'jwst_fgs_0075.imap',\n    'MIRI' : 'jwst_miri_0185.imap',\n    'NIRCAM' : 'jwst_nircam_0122.imap',\n    'NIRISS' : 'jwst_niriss_0121.imap',\n    'NIRSPEC' : 'jwst_nirspec_0193.imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n"
    123         return compile(text, source, mode)

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Module object>)
    359         visitor = getattr(self, method, self.generic_visit)
--> 360         return visitor(node)
        visitor = <bound method NodeVisitor.generic_visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        node = <_ast.Module object at 0x110175490>
    361 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in generic_visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Module object>)
    367                     if isinstance(item, AST):
--> 368                         self.visit(item)
        self.visit = <bound method NodeVisitor.visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        item = <_ast.Assign object at 0x1101753a0>
    369             elif isinstance(value, AST):

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Assign object>)
    359         visitor = getattr(self, method, self.generic_visit)
--> 360         return visitor(node)
        visitor = <bound method MappingVerifier.visit_Assign of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        node = <_ast.Assign object at 0x1101753a0>
    361 

~/venv/test/lib/python3.8/site-packages/crds/core/mapping_verifier.py in visit_Assign(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Assign object>)
    167                      "Section value must be a selector call or dictionary or string")
--> 168         self.generic_visit(node)
        self.generic_visit = <bound method NodeVisitor.generic_visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        node = <_ast.Assign object at 0x1101753a0>
    169 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in generic_visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Assign object>)
    369             elif isinstance(value, AST):
--> 370                 self.visit(value)
        self.visit = <bound method NodeVisitor.visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        value = <_ast.Dict object at 0x110175640>
    371 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Dict object>)
    359         visitor = getattr(self, method, self.generic_visit)
--> 360         return visitor(node)
        visitor = <bound method NodeVisitor.generic_visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        node = <_ast.Dict object at 0x110175640>
    361 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in generic_visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Dict object>)
    367                     if isinstance(item, AST):
--> 368                         self.visit(item)
        self.visit = <bound method NodeVisitor.visit of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        item = <_ast.Constant object at 0x110170ee0>
    369             elif isinstance(value, AST):

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/ast.py in visit(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Constant object>)
    359         visitor = getattr(self, method, self.generic_visit)
--> 360         return visitor(node)
        visitor = <bound method MappingVerifier.visit_Unknown of <crds.core.mapping_verifier.MappingVerifier object at 0x1032930d0>>
        node = <_ast.Constant object at 0x110170ee0>
    361 

~/venv/test/lib/python3.8/site-packages/crds/core/mapping_verifier.py in visit_Unknown(self=<crds.core.mapping_verifier.MappingVerifier object>, node=<_ast.Constant object>)
    151         """Handle new / unforseen node types."""
--> 152         self.assert_(node, False, "Unknown node type in mapping " + repr(node))
        self.assert_ = <bound method MappingVerifier.assert_ of <class 'crds.core.mapping_verifier.MappingVerifier'>>
        node = <_ast.Constant object at 0x110170ee0>
        global repr = undefined
    153 

~/venv/test/lib/python3.8/site-packages/crds/core/mapping_verifier.py in assert_(cls=<class 'crds.core.mapping_verifier.MappingVerifier'>, node=<_ast.Constant object>, flag=False, message='Unknown node type in mapping <_ast.Constant object at 0x110170ee0>')
    141             if hasattr(node, "lineno"):
--> 142                 raise crexc.MappingFormatError(message + " at line " + str(node.lineno))
        global crexc.MappingFormatError = <class 'crds.core.exceptions.MappingFormatError'>
        message = 'Unknown node type in mapping <_ast.Constant object at 0x110170ee0>'
        global str = undefined
        node.lineno = 2
    143             else:

MappingFormatError: Unknown node type in mapping <_ast.Constant object at 0x110170ee0> at line 2

The above exception was the direct cause of the following exception:

MappingError                              Traceback (most recent call last)
<ipython-input-3-929d75afc3b6> in <module>
----> 1 rmap.Mapping.from_file(basename='jwst_0558.pmap')
        global rmap.Mapping.from_file = <bound method Mapping.from_file of <class 'crds.core.rmap.Mapping'>>
        global basename = undefined

~/venv/test/lib/python3.8/site-packages/crds/core/rmap.py in from_file(cls=<class 'crds.core.rmap.Mapping'>, basename='jwst_0558.pmap', *args=(), **keys={})
    263             filename = config.locate_mapping(basename)
    264         text = utils.get_uri_content(filename)
--> 265         return cls.from_string(text, basename, *args, **keys)
        cls.from_string = <bound method Mapping.from_string of <class 'crds.core.rmap.Mapping'>>
        text = "header = {\n    'derived_from' : 'jwst_0557.pmap',\n    'description' : 'Hand edited to add FGS, MIRI, NIRCAM, NIRISS PATHLOSS as N/A',\n    'mapping' : 'PIPELINE',\n    'name' : 'jwst_0558.pmap',\n    'observatory' : 'JWST',\n    'parkey' : ('META.INSTRUMENT.NAME',),\n    'sha1sum' : '0ee26a826da4643bddcd7466dd75240228f227e7',\n}\n\nselector = {\n    'FGS' : 'jwst_fgs_0075.imap',\n    'MIRI' : 'jwst_miri_0185.imap',\n    'NIRCAM' : 'jwst_nircam_0122.imap',\n    'NIRISS' : 'jwst_niriss_0121.imap',\n    'NIRSPEC' : 'jwst_nirspec_0193.imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n"
        basename = 'jwst_0558.pmap'
        args = ()
        keys = {}
    266 
    267     @classmethod

~/venv/test/lib/python3.8/site-packages/crds/core/rmap.py in from_string(cls=<class 'crds.core.rmap.Mapping'>, text="header = {\n    'derived_from' : 'jwst_0557.pmap'...imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n", basename='jwst_0558.pmap', *args=(), **keys={})
    269         """Construct a mapping from string `text` nominally named `basename`."""
    270         keys.pop("comment", None) #  discard comment if defined
--> 271         header, selector, comment = cls._parse_header_selector(text, basename)
        header = undefined
        selector = undefined
        comment = undefined
        cls._parse_header_selector = <bound method Mapping._parse_header_selector of <class 'crds.core.rmap.Mapping'>>
        text = "header = {\n    'derived_from' : 'jwst_0557.pmap',\n    'description' : 'Hand edited to add FGS, MIRI, NIRCAM, NIRISS PATHLOSS as N/A',\n    'mapping' : 'PIPELINE',\n    'name' : 'jwst_0558.pmap',\n    'observatory' : 'JWST',\n    'parkey' : ('META.INSTRUMENT.NAME',),\n    'sha1sum' : '0ee26a826da4643bddcd7466dd75240228f227e7',\n}\n\nselector = {\n    'FGS' : 'jwst_fgs_0075.imap',\n    'MIRI' : 'jwst_miri_0185.imap',\n    'NIRCAM' : 'jwst_nircam_0122.imap',\n    'NIRISS' : 'jwst_niriss_0121.imap',\n    'NIRSPEC' : 'jwst_nirspec_0193.imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n"
        basename = 'jwst_0558.pmap'
    272         mapping = cls(basename, header, selector, comment=comment, **keys)
    273         try:

~/venv/test/lib/python3.8/site-packages/crds/core/rmap.py in _parse_header_selector(cls=<class 'crds.core.rmap.Mapping'>, text="header = {\n    'derived_from' : 'jwst_0557.pmap'...imap',\n    'SYSTEM' : 'jwst_system_0019.imap',\n}\n", where='jwst_0558.pmap')
    291                                    exception_class=crexc.MappingError):
    292             code = MAPPING_VERIFIER.compile_and_check(text)
--> 293             header, selector, comment = cls._interpret(code)
        header = undefined
        selector = undefined
        comment = undefined
        cls._interpret = <bound method Mapping._interpret of <class 'crds.core.rmap.Mapping'>>
        code = undefined
    294         return LowerCaseDict(header), selector, comment
    295 

/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py in __exit__(self=<contextlib._GeneratorContextManager object>, type=<class 'crds.core.exceptions.MappingFormatError'>, value=MappingFormatError('Unknown node type in mapping <_ast.Constant object at 0x110170ee0> at line 2'), traceback=<traceback object>)
    129                 value = type()
    130             try:
--> 131                 self.gen.throw(type, value, traceback)
        self.gen.throw = <built-in method throw of generator object at 0x1031494a0>
        type = <class 'crds.core.exceptions.MappingFormatError'>
        value = MappingFormatError('Unknown node type in mapping <_ast.Constant object at 0x110170ee0> at line 2')
        traceback = <traceback object at 0x11014f2c0>
    132             except StopIteration as exc:
    133                 # Suppress StopIteration *unless* it's the same exception that

~/venv/test/lib/python3.8/site-packages/crds/core/log.py in func_on_exception(*args=("Can't load file jwst_0558.pmap",), **keys={'end': ''})
    375                 exc_class = keys.pop("exception_class", exc.__class__)
    376                 keys["end"] = ""
--> 377                 raise exc_class(format(*args + (":", str(exc)), **keys)) from exc
        exc_class = <class 'crds.core.exceptions.MappingError'>
        global format = <bound method CrdsLogger.format of <crds.core.log.CrdsLogger object at 0x1031c2370>>
        args = ("Can't load file jwst_0558.pmap",)
        global str = undefined
        exc = undefined
        keys = {'end': ''}
    378             else:
    379                 pass # snuff the exception,  func() probably issued a log message.

MappingError: Can't load file jwst_0558.pmap : Unknown node type in mapping <_ast.Constant object at 0x110170ee0> at line 2
@jdavies-st jdavies-st changed the title _parse_header_selector error under python 3.8 Mapping._parse_header_selector error under python 3.8 Oct 28, 2019
@jdavies-st
Copy link
Contributor Author

Here's a test run for jwst under python==3.8.0 showing the traceback.

https://travis-ci.org/spacetelescope/jwst/jobs/604540983

@jaytmiller
Copy link
Collaborator

I added 'visit_Constant' to the list of valid AST nodes for CRDS mappings and merged it to master. That solved this particular 3.8 issue, but broader testing remains to be done.

@jdavies-st
Copy link
Contributor Author

Great. I'll update this issue when we get some fresh unit test runs in jwst under python 3.8.

@jdavies-st
Copy link
Contributor Author

So this fixes the problem we see in jwst unit tests. They all pass now using this crds bugfix #712 under python 3.8. Thanks! Closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants