globality-corp / flake8-logging-format

Flake8 extension to validate (lack of) logging format strings
Apache License 2.0
134 stars 21 forks source link

Passing extras key as a variable causes crash #61

Open jonyscathe opened 1 year ago

jonyscathe commented 1 year ago

I know this is a bit of a weird edge case that isn't likely to come up too often, but things seem to go a bit wrong if an extras key is a variable.

I am using this in a test case for a custom logger class with code: test_logger.info('My test message', extra={id_type: id_value})

But flake8 crashes out with:

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/multiprocessing/pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
  File "/usr/local/lib/python3.10/site-packages/flake8/checker.py", line 621, in _run_checks
    return checker.run_checks()
  File "/usr/local/lib/python3.10/site-packages/flake8_noqa/noqa_filter.py", line 189, in run_checks
    result = super().run_checks(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/flake8/checker.py", line 531, in run_checks
    self.run_ast_checks()
  File "/usr/local/lib/python3.10/site-packages/flake8/checker.py", line 435, in run_ast_checks
    for (line_number, offset, text, _) in runner:
  File "/usr/local/lib/python3.10/site-packages/logging_format/api.py", line 35, in run
    visitor.visit(self.tree)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/ast.py", line 418, in generic_visit
    self.visit(item)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/ast.py", line 418, in generic_visit
    self.visit(item)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/ast.py", line 418, in generic_visit
    self.visit(item)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/ast.py", line 418, in generic_visit
    self.visit(item)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/ast.py", line 420, in generic_visit
    self.visit(value)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/site-packages/logging_format/visitor.py", line 114, in visit_Call
    super(LoggingVisitor, self).visit(child)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/site-packages/logging_format/visitor.py", line 187, in visit_keyword
    super(LoggingVisitor, self).generic_visit(node)
  File "/usr/local/lib/python3.10/ast.py", line 420, in generic_visit
    self.visit(value)
  File "/usr/local/lib/python3.10/ast.py", line 410, in visit
    return visitor(node)
  File "/usr/local/lib/python3.10/site-packages/logging_format/visitor.py", line 150, in visit_Dict
    if key is not None and key.s in RESERVED_ATTRS:
AttributeError: 'Name' object has no attribute 's'
"""

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

Traceback (most recent call last):
  File "/usr/local/bin/flake8", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/site-packages/flake8/main/cli.py", line 22, in main
    app.run(argv)
  File "/usr/local/lib/python3.10/site-packages/flake8/main/application.py", line 336, in run
    self._run(argv)
  File "/usr/local/lib/python3.10/site-packages/flake8/main/application.py", line 325, in _run
    self.run_checks()
  File "/usr/local/lib/python3.10/site-packages/flake8/main/application.py", line 229, in run_checks
    self.file_checker_manager.run()
  File "/usr/local/lib/python3.10/site-packages/flake8/checker.py", line 250, in run
    self.run_parallel()
  File "/usr/local/lib/python3.10/site-packages/flake8/checker.py", line 217, in run_parallel
    for ret in pool_map:
  File "/usr/local/lib/python3.10/multiprocessing/pool.py", line 873, in next
    raise value
AttributeError: 'Name' object has no attribute 's'
matiasrasmussen commented 1 year ago

I'm facing the same issue.

Check out my PR ☝️ maybe this is enough to solve the problem?