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)
Example #2
0
    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
Example #3
0
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
Example #5
0
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__()
    }
Example #6
0
 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
Example #8
0
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'))