| 44 | |
| 45 | |
| 46 | class ConanFileParser(ast.NodeVisitor): |
| 47 | def __init__(self): |
| 48 | self.name = None |
| 49 | self.version = None |
| 50 | self.description = None |
| 51 | self.author = None |
| 52 | self.homepage_url = None |
| 53 | self.vcs_url = None |
| 54 | self.license = [] |
| 55 | self.keywords = [] |
| 56 | self.requires = [] |
| 57 | |
| 58 | def to_dict(self): |
| 59 | return { |
| 60 | "name": self.name, |
| 61 | "version": self.version, |
| 62 | "description": self.description, |
| 63 | "author": self.author, |
| 64 | "homepage_url": self.homepage_url, |
| 65 | "vcs_url": self.vcs_url, |
| 66 | "license": self.license, |
| 67 | "keywords": self.keywords, |
| 68 | "requires": self.requires, |
| 69 | } |
| 70 | |
| 71 | def visit_Assign(self, node): |
| 72 | if not node.targets or not isinstance(node.targets[0], ast.Name): |
| 73 | return |
| 74 | if not node.value or not ( |
| 75 | isinstance(node.value, ast.Constant) or isinstance(node.value, ast.Tuple) |
| 76 | ): |
| 77 | return |
| 78 | |
| 79 | attribute_mapping = { |
| 80 | "name": "name", |
| 81 | "version": "version", |
| 82 | "description": "description", |
| 83 | "author": "author", |
| 84 | "homepage": "homepage_url", |
| 85 | "url": "vcs_url", |
| 86 | "license": "license", |
| 87 | "topics": "keywords", |
| 88 | "requires": "requires", |
| 89 | } |
| 90 | variable_name = node.targets[0].id |
| 91 | values = node.value |
| 92 | |
| 93 | if variable_name in attribute_mapping: |
| 94 | attribute_name = attribute_mapping[variable_name] |
| 95 | if variable_name in ("topics", "requires", "license"): |
| 96 | current_list = getattr(self, attribute_name) |
| 97 | if isinstance(values, ast.Tuple): |
| 98 | current_list.extend( |
| 99 | [el.value for el in values.elts if isinstance(el, ast.Constant)] |
| 100 | ) |
| 101 | elif isinstance(values, ast.Constant): |
| 102 | current_list.append(values.value) |
| 103 | setattr(self, attribute_name, current_list) |