Spaces:
Runtime error
Runtime error
| import json | |
| import requests | |
| counter = 0 | |
| class Query: | |
| name: str | |
| mutations: () | |
| schema = "" | |
| url = "https://api.github.com/graphql" | |
| headers = { | |
| "Accept": "application/json", | |
| "Authorization": "Bearer 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", | |
| "Accept-Encoding": "gzip, deflate, br", | |
| "Content-Type": "application/json", | |
| "Connection": "keep-alive", | |
| "DNT": '1', | |
| "Origin": "file://" | |
| } | |
| def __init__(self, name): | |
| self.name = name | |
| self.schema = f"query {name}" + "{ <NEXT_VAL> }" | |
| self.path = [] | |
| self.to_save = [] | |
| self.to_iter = [] | |
| def mutation(self, _name, **kwargs): | |
| args = [] | |
| for k, v in kwargs.items(): | |
| if isinstance(v, str): | |
| args.append(f'{k}: \"{v}\"') | |
| else: | |
| args.append(f'{k}: {v}') | |
| args = ', '.join(args) | |
| if len(args): | |
| args = f'({args})' | |
| self.schema = self.schema.replace('<NEXT_VAL>', f"{_name}{args}" + "{ <NEXT_VAL> }") | |
| self.path += [_name] | |
| return self | |
| def iter(self, _name): | |
| self.path += [_name] | |
| to_replace = f"{_name} (<ITER {self.path}>)" + "{ totalCount pageInfo { endCursor hasNextPage} <NEXT_VAL> }" | |
| self.schema = self.schema.replace('<NEXT_VAL>', to_replace) | |
| self.to_iter.append([*self.path]) | |
| return self | |
| def save_result(self, _name): | |
| self.schema = self.schema.replace('<NEXT_VAL>', f"{_name} <NEXT_VAL>") | |
| self.to_save.append([*self.path, _name]) | |
| return self | |
| def nodes(self): | |
| self.path.append('nodes') | |
| self.schema = self.schema.replace('<NEXT_VAL>', 'nodes { <NEXT_VAL> }') | |
| return self | |
| def end_of_page(self, previous, iterable): | |
| if previous is None: | |
| return False | |
| for selector in iterable: | |
| previous = previous[selector] | |
| return previous['pageInfo']['hasNextPage'] | |
| def recursive_iterable(self, schema, iterables): | |
| if len(iterables) > 0: | |
| iterable = iterables[0] | |
| iterables = iterables[1:] | |
| else: | |
| return | |
| output = None | |
| while not self.end_of_page(output, iterable): | |
| if output is None: | |
| index = f'first: 20' | |
| else: | |
| index = f'after: {output}' | |
| new_schema = schema.replace(f'<ITER {str(iterable)}>', index) | |
| if 'ITER' not in new_schema: | |
| print('new schema', new_schema) | |
| res = requests.post(self.url, headers=self.headers, json={'query': new_schema}) | |
| output = res.json()['data'] | |
| out = self.recursive_iterable(new_schema, iterables) | |
| print('output', out) | |
| return output | |
| def call(self): | |
| schema = self.schema.replace('<NEXT_VAL>', '') | |
| self.recursive_iterable(schema, self.to_iter) | |
| # print(self.schema.replace('<NEXT_VAL>', '')) | |
| # print('will save', self.to_save) | |
| # print('will iterate over', self.to_iter) | |
| # # res = requests.post(self.url, headers=self.headers, json={'query': self.schema.replace('<NEXT_VAL>', '')}) | |
| # # output = res.json()['data'] | |
| # output = json.loads('{"repository": {"nameWithOwner": "huggingface/transformers", "issues": {"totalCount": 9843, "pageInfo": {"endCursor": "Y3Vyc29yOnYyOpHOFwK_Mw==", "hasNextPage": true}, "nodes": [{"number": 3}, {"number": 5}, {"number": 6}, {"number": 9}, {"number": 10}, {"number": 11}, {"number": 12}, {"number": 13}, {"number": 15}, {"number": 19}, {"number": 20}, {"number": 23}, {"number": 24}, {"number": 25}, {"number": 26}, {"number": 27}, {"number": 28}, {"number": 30}, {"number": 31}, {"number": 33}, {"number": 34}, {"number": 35}, {"number": 36}, {"number": 37}, {"number": 38}, {"number": 39}, {"number": 41}, {"number": 43}, {"number": 44}, {"number": 45}, {"number": 46}, {"number": 47}, {"number": 48}, {"number": 49}, {"number": 50}, {"number": 51}, {"number": 52}, {"number": 53}, {"number": 54}, {"number": 55}, {"number": 56}, {"number": 57}, {"number": 59}, {"number": 61}, {"number": 62}, {"number": 63}, {"number": 64}, {"number": 65}, {"number": 67}, {"number": 68}]}}}') | |
| # | |
| # for iterable in self.to_iter[::-1]: | |
| # for selector in iterable: | |
| # output = output[selector] | |
| # | |
| # page_info = output['pageInfo'] | |
| # | |
| # print('pageInfo', page_info) | |
| # # if page_info['hasNextPage']: | |
| # | |
| # return output | |
| query = Query('GetRepository') | |
| query.mutation('repository', owner='huggingface', name='transformers') | |
| query.save_result('nameWithOwner') | |
| query.iter('issues').nodes.save_result('number') | |
| query.mutation('comments', first=100).nodes.mutation('reactions') | |
| query.save_result('totalCount') | |
| print(query.call()) | |