def _retrieve(cls, fn, **params): op = Operation(schema.Query) fields = dict(getattr(schema.Query, fn).args) for p in params: if p != 'select' and p not in fields: raise ValueError("%s does not support the '%s' parameter" % (fn, p)) if 'filter' in dict(getattr(schema.Query, fn).args): filter_fields = dict(getattr( schema.Query, fn).args)['filter'].type.__field_names__ for f in params.get('filter', {}): if f not in filter_fields: raise ValueError("%s does not support filtering on '%s'." % (fn, f)) update_subfields(op, fn, params, query=schema.Query) logger.debug(op.__to_graphql__(auto_select_depth=1)) from mage import endpoint result = endpoint(op.__to_graphql__(auto_select_depth=1)) if 'errors' in result: for e in result['errors']: logger.error(e['message']) if e['message'] == 'Token has expired': raise RuntimeError( 'Token expired. Call mage.connect() again.') if 'data' in result and result['data']: data = getattr((op + result), fn) if getattr(schema.Query, fn).type == schema.AWSJSON: data = json.loads(data) items = data.get('items', [data]) else: items = getattr(data, 'items', None) if items is None: if hasattr(data, 'next_token'): raise RuntimeError( "'next_token' is present but 'items' is missing.") else: # usually results are like {'data': {'items': [something]}} # but sometimes it is {'data': something} # that case is covered here items = [data] items = list(filter(None, items)) next_token = getattr(data, 'next_token', None) if next_token: logger.debug("More data available") else: logger.debug("No More data") return ListObject(cls=cls, fn=fn, params=params, items=items, next_token=next_token)
def mutate(cls, fn, **params): """ The generic method for sending mutation requests to the server. """ op = Operation(schema.Mutation) update_subfields(op, fn, params, query=schema.Mutation) logger.debug(op.__to_graphql__(auto_select_depth=1)) from mage import endpoint result = endpoint(op.__to_graphql__(auto_select_depth=1)) if 'errors' in result: for e in result['errors']: logger.error(e['message']) if 'data' in result and result['data']: data = getattr((op + result), fn) return data return None
def _query_for_init(): """ 返回某些类型合约的 query todo: 为了兼容旧版提供给用户的 api._data["quote"].items() 类似用法,应该限制交易所 ["SHFE", "DCE", "CZCE", "INE", "CFFEX", "KQ"] """ op = Operation(ins_schema.rootQuery) query = op.multi_symbol_info( class_=["FUTURE", "INDEX", "OPTION", "COMBINE", "CONT"], exchange_id=["SHFE", "DCE", "CZCE", "INE", "CFFEX", "KQ"]) _add_all_frags(query) return op.__to_graphql__()
def get_full_repository_list(self, org): # query { # organization(login: "******") { # repositories(first: 100) { # nodes { # name # isArchived # isDisabled # isPrivate # licenseInfo { # name # } # } # pageInfo { # hasNextPage # endCursor # } # } # } # } cursor = None last = False repository_list = [] while not last: op = Operation(schema.Query) # note 'schema.' if cursor: repositories = op.organization(login=org).repositories(first=100, after=cursor) else: repositories = op.organization(login=org).repositories(first=100) repositories.nodes.name() repositories.nodes.is_archived() repositories.nodes.is_disabled() repositories.nodes.is_private() repositories.nodes.license_info.__fields__('name') repositories.page_info.__fields__('has_next_page') repositories.page_info.__fields__(end_cursor=True) query = op.__to_graphql__() # print(query) page_results = self.post(query) # print(type(page_results)) # print(json.dumps(page_results)) page = page_results.organization.repositories.nodes repository_list.extend(page) last = not page_results.organization.repositories.pageInfo.hasNextPage cursor = page_results.organization.repositories.pageInfo.endCursor # print(f"Cursor: {cursor}") return repository_list
def _query_for_quote(symbol): """ 返回请求某个合约的合约信息的 query_pack 调用次函数应该全部都是sdk的代码主动请求合约信息 用户请求合约信息一定是 PYSDK_api 开头的请求,因为用户请求的合约信息在回测时带有 timestamp 参数,是不应该调用此函数的 """ symbol_list = symbol if isinstance(symbol, list) else [symbol] op = Operation(ins_schema.rootQuery) query = op.multi_symbol_info(instrument_id=symbol_list) _add_all_frags(query) return { "aid": "ins_query", "query_id": _generate_uuid(prefix='PYSDK_quote_'), "query": op.__to_graphql__() }
async def async_update(self): query_id = _generate_uuid("PYSDK_api") op = Operation(ins_schema.rootQuery) variables = {"instrument_id": self.__dict__["_symbol_list"]} if self.__dict__["_backtest_timestamp"]: variables["timestamp"] = self.__dict__["_backtest_timestamp"] query = op.multi_symbol_info(**variables) _add_all_frags(query) self.__dict__["_api"]._send_pack({ "aid": "ins_query", "query_id": query_id, "query": op.__to_graphql__() }) symbols = _get_obj(self.__dict__["_api"]._data, ["symbols"]) async with self.__dict__["_api"].register_update_notify( symbols) as update_chan: async for _ in update_chan: query_result = symbols.get(query_id, {}) if query_result: all_keys = set(self.__dict__["_columns"]) all_keys.add('trading_time') quotes = self.__dict__["_api"]._symbols_to_quotes( query_result, keys=all_keys) self._quotes_to_dataframe(quotes) if self.__dict__["_backtest_timestamp"]: # 回测时这些字段应该为 nan self.loc[:, [ "upper_limit", "lower_limit", "pre_settlement", "pre_open_interest", "pre_close" ]] = float('nan') # 回测时清空请求,不缓存请求内容 self.__dict__["_api"]._send_pack({ "aid": "ins_query", "query_id": query_id, "query": "" }) return self
def get_active_vulnerable(self, org): # query { # organization(login: "******") { # repositories(first: 100) { # nodes { # name # vulnerabilityAlerts(first:100) { # edges { # node { # id # packageName # vulnerableManifestPath # vulnerableRequirements # dismissReason # dismissedAt # securityAdvisory { # id # summary # vulnerabilities(first:10) { # edges { # node { # package { # name # } # advisory { # description # } # severity # firstPatchedVersion{ # identifier # } # } # } # pageInfo { # hasNextPage # endCursor # } # } # } # } cursor = None last = False repository_list = [] while not last: op = Operation(schema.Query) # note 'schema.' if cursor: repositories = op.organization(login=org).repositories(first=100, after=cursor) else: repositories = op.organization(login=org).repositories(first=100) repositories.nodes.name() alerts = repositories.nodes.vulnerability_alerts(first=10) alerts.edges.node.__fields__( 'id', 'package_name', 'vulnerable_manifest_path', 'vulnerable_requirements', 'dismiss_reason', 'dismissed_at', ) alerts.edges.node.security_advisory.__fields__( 'id', 'summary' ) vulns = alerts.edges.node.security_advisory.vulnerabilities(first=10) vulns.edges.node.package.__fields__('name') vulns.edges.node.advisory.__fields__('description') vulns.edges.node.__fields__('severity') vulns.edges.node.first_patched_version.__fields__('identifier') repositories.page_info.__fields__('has_next_page') repositories.page_info.__fields__(end_cursor=True) query = op.__to_graphql__() # print(query) page_results = self.post(query) # print(type(page_results)) # print(json.dumps(page_results)) page = page_results.organization.repositories.nodes repository_list.extend(page) last = not page_results.organization.repositories.pageInfo.hasNextPage cursor = page_results.organization.repositories.pageInfo.endCursor # print(f"Cursor: {cursor}") vulnerable_nodes = [ node for node in repository_list if node.vulnerabilityAlerts.edges] return vulnerable_nodes
class Viewer(Type): login = str avatar_url = str isSiteAdmin = bool email = str updatedAt = str name = str company = str class Query(Type): # GraphQL's root user = Field(User, args={'login': str}) viewer = Field(Viewer) op = Operation(Query) viewer = op.viewer() viewer.login() viewer.isSiteAdmin() viewer.email() viewer.name() viewer.updatedAt() viewer.company() user = op.user(login="******") print(op.__to_graphql__()) # print(json.dumps(op)) # print(str(op, encoding='utf-8'))