āĻĢāĻžāĻ‰āĻ¸ā§āĻŸā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋāĻ° āĻ•āĻžāĻœ, āĻĒāĻžāĻ°ā§āĻŸ II: āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻĻāĻ˛

āĻĢāĻžāĻ‰āĻ¸ā§āĻŸā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋāĻ° āĻ•āĻžāĻœ, āĻĒāĻžāĻ°ā§āĻŸ II: āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻĻāĻ˛

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ¸ā§‚āĻšāĻŋ

  1. āĻĒāĻ°ā§āĻŦ I: āĻ­ā§‚āĻŽāĻŋāĻ•āĻž

  2. āĻĒāĻžāĻ°ā§āĻŸ II: āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻĻāĻ˛

āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋ āĻ•āĻ°āĻ›āĻŋ?

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ¤āĻžāĻ‡, āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ…āĻ‚āĻļ. āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻ—ā§‡ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ—ā§āĻ˛āĻŋ āĻ•āĻ°āĻŦ:

  1. āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻļā§‡āĻˇ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ¸āĻš aiohttp-āĻ alphavantage-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ˛āĻŋāĻ–āĻŋāĨ¤

  2. āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ āĻ¯āĻžāĻ°āĻž āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻœ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ‰āĻĒāĻ° āĻŽā§‡āĻŸāĻž āĻ¤āĻĨā§āĻ¯ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻŦā§‡āĨ¤

āĻ•āĻŋāĻ¨ā§āĻ¤ā§, āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻŦ, āĻāĻŦāĻ‚ āĻĢāĻžāĻ¸ā§āĻŸ āĻ—āĻŦā§‡āĻˇāĻŖāĻžāĻ° āĻĒāĻ°āĻŋāĻĒā§āĻ°ā§‡āĻ•ā§āĻˇāĻŋāĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž āĻļāĻŋāĻ–āĻŦ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¯āĻž āĻ•āĻžāĻĢāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ āĻ•āĻ°ā§‡, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻ¯āĻŧ (āĻ•ā§āĻ˛āĻŋāĻ• āĻ°ā§āĻ¯āĻžāĻĒāĻžāĻ°), āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ - āĻāĻœā§‡āĻ¨ā§āĻŸ āĻ¯ā§‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ¨āĻœāĻ°āĻĻāĻžāĻ°āĻŋ āĻ•āĻ°āĻ›ā§‡ āĻ¸ā§‡āĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛ āĻĒā§āĻļ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤

āĻĒā§āĻ°āĻļāĻŋāĻ•ā§āĻˇāĻŖ

āĻ†āĻ˛āĻĢāĻžāĻ­ā§āĻ¯āĻžāĻ¨ā§āĻŸā§‡āĻœ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ

āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ…ā§āĻ¯āĻžāĻ˛āĻĢāĻžāĻ­āĻžāĻ¨ā§āĻŸā§‡āĻœā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ aiohttp āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ˛āĻŋāĻ–āĻŋāĨ¤

alphavantage.py

āĻ­āĻ•ā§āĻˇāĻ•

import urllib.parse as urlparse
from io import StringIO
from typing import Any, Dict, List, Union

import aiohttp
import pandas as pd
import stringcase
from loguru import logger

from horton.config import API_ENDPOINT


class AlphaVantageClient:
    def __init__(
        self,
        session: aiohttp.ClientSession,
        api_key: str,
        api_endpoint: str = API_ENDPOINT,
    ):
        self._query_params = {"datatype": "json", "apikey": api_key}
        self._api_endpoint = api_endpoint
        self._session = session

    @logger.catch
    def _format_fields(self, data: Dict[str, Any]) -> Dict[str, Any]:
        formatted_data = {}

        for field, item in data.items():
            formatted_data[stringcase.snakecase(field)] = item

        return formatted_data

    @logger.catch
    async def _construct_query(
        self, function: str, to_json: bool = True, **kwargs
    ) -> Union[Dict[str, Any], str]:
        path = "query/"

        async with self._session.get(
            urlparse.urljoin(self._api_endpoint, path),
            params={"function": function, **kwargs, **self._query_params},
        ) as response:
            data = (await response.json()) if to_json else (await response.text())

            if to_json:
                data = self._format_fields(data)

        return data

    @logger.catch
    async def get_securities(self, state: str = "active") -> List[Dict[str, str]]:
        data = await self._construct_query("LISTING_STATUS", state=state, to_json=False)

        data = pd.read_csv(StringIO(data))

        securities = data.to_dict("records")

        for index, security in enumerate(securities):
            security = self._format_fields(security)
            security["_type"] = "physical"

            securities[index] = security

        return securities

    @logger.catch
    async def get_security_overview(self, symbol: str) -> Dict[str, str]:
        return await self._construct_query("OVERVIEW", symbol=symbol)

    @logger.catch
    async def get_historical_data(self, symbol: str) -> Dict[str, Any]:
        return await self._construct_query(
            "TIME_SERIES_DAILY_ADJUSTED", symbol=symbol, outputsize="full"
        )

    @logger.catch
    async def get_last_price_data(self, symbol: str) -> Dict[str, Any]:
        return await self._construct_query("GLOBAL_QUOTE", symbol=symbol)

    @logger.catch
    async def get_indicator_data(
        self, symbol: str, indicator: str, **indicator_options
    ) -> Dict[str, Any]:
        return await self._construct_query(
            indicator, symbol=symbol, **indicator_options
        )

āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡, āĻāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°:

  1. AlphaVantage API āĻŦā§‡āĻļ āĻ¸āĻšāĻœ āĻāĻŦāĻ‚ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ construct_query āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ˜ā§āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ http āĻ•āĻ˛ āĻ†āĻ›ā§‡āĨ¤

  2. āĻ†āĻŽāĻŋ āĻ¸āĻŦ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻ†āĻ¨āĻž snake_case āĻ†āĻ°āĻžāĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯

  3. āĻ­āĻžāĻ˛, āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻāĻŦāĻ‚ āĻ¤āĻĨā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ āĻŸā§āĻ°ā§‡āĻ¸āĻŦā§āĻ¯āĻžāĻ• āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻœāĻ¨ā§āĻ¯ logger.catch āĻ¸āĻœā§āĻœāĻž.

PS config.yml-āĻ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ alphavantage āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛āĻŦā§‡āĻ¨ āĻ¨āĻž, āĻ…āĻĨāĻŦāĻž āĻāĻ¨āĻ­āĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§‡āĻ¨ā§āĻŸ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻāĻ•ā§āĻ¸āĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻ­ā§āĻ˛āĻŦā§‡āĻ¨ āĻ¨āĻž HORTON_SERVICE_APIKEY. āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻŋ āĻāĻ–āĻžāĻ¨ā§‡.

CRUD āĻ•ā§āĻ˛āĻžāĻ¸

āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻœ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻŽā§‡āĻŸāĻž āĻ¤āĻĨā§āĻ¯ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻœ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻĨāĻžāĻ•āĻŦā§‡āĨ¤

database/security.py

āĻ†āĻŽāĻžāĻ° āĻŽāĻ¤ā§‡, āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋāĻ›ā§ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡, āĻāĻŦāĻ‚ āĻŦā§‡āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ āĻ¨āĻŋāĻœā§‡āĻ‡ āĻŦā§‡āĻļ āĻ¸āĻšāĻœāĨ¤

āĻ…ā§āĻ¯āĻžāĻĒ āĻŸāĻŋ āĻ¨āĻŋāĻ¨()

āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻ¯āĻžāĻ• app.py

āĻ­āĻ•ā§āĻˇāĻ•

import faust

from horton.config import KAFKA_BROKERS


def get_app():
    return faust.App("horton", broker=KAFKA_BROKERS)

āĻ†āĻĒāĻžāĻ¤āĻ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ¸āĻšāĻœāĻ¤āĻŽ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻšāĻŦā§‡, āĻāĻ•āĻŸā§ āĻĒāĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ•ā§‡ āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻŦ, āĻ¤āĻŦā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻ–āĻžāĻ¨ā§‡ āĻ¤āĻĨā§āĻ¯āĻ¸ā§‚āĻ¤ā§āĻ° āĻ…ā§āĻ¯āĻžāĻĒ-āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸āĻŸāĻŋ āĻāĻ•āĻŦāĻžāĻ° āĻĻā§‡āĻ–āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāĻšā§āĻ›āĻŋ, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤

āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ…āĻ‚āĻļ

āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻœā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ“ āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻœā§‡āĻ¨ā§āĻŸ

app = get_app()

collect_securities_topic = app.topic("collect_securities", internal=True)

@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
	pass

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ†āĻŽāĻ°āĻž āĻĢāĻžāĻ¸ā§āĻŸ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻŸāĻŋ āĻĒāĻžāĻ‡ - āĻāĻŸāĻŋ āĻŦā§‡āĻļ āĻ¸āĻšāĻœāĨ¤ āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻ˜ā§‹āĻˇāĻŖāĻž āĻ•āĻ°āĻŋ... āĻāĻ–āĻžāĻ¨ā§‡ āĻāĻŸāĻŋ āĻ•ā§€, āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻ•ā§€ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ•ā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡ āĻ¸āĻžāĻœāĻžāĻ¨ā§‹ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¤āĻž āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻžāĻ° āĻŽāĻ¤ā§‹āĨ¤

  1. āĻ•āĻžāĻĢāĻ•āĻžāĻ° āĻŸāĻĒāĻŋāĻ•āĻ¸, āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻ°āĻž āĻ¸āĻ āĻŋāĻ• āĻ¸āĻ‚āĻœā§āĻžāĻž āĻœāĻžāĻ¨āĻ¤ā§‡ āĻšāĻžāĻ‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒāĻĄāĻŧāĻž āĻ­āĻžāĻ˛ā§‹ āĻŦāĻ¨ā§āĻ§ āĻ¨āĻĨāĻŋ, āĻ…āĻĨāĻŦāĻž āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻŦāĻŋāĻŽā§‚āĻ°ā§āĻ¤ āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻšāĻžāĻŦā§āĻ°ā§‡āĻ¤ā§‡, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻŦā§‡āĻļ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻĢāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧ :)

  2. āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°, faust āĻĄāĻ•-āĻ āĻŦā§‡āĻļ āĻ­āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ°āĻ•ā§‡ āĻ•ā§‹āĻĄā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ, āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻāĻ° āĻ…āĻ°ā§āĻĨ āĻĢāĻžāĻ¸ā§āĻŸ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°āĻĻā§‡āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋāĻ—ā§āĻ˛āĻŋ, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ: āĻ§āĻžāĻ°āĻŖ, āĻ§āĻžāĻ°āĻŖ āĻ¨ā§€āĻ¤āĻŋ (āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛ā§āĻ¨, āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¨āĻŋāĻšā§āĻ›āĻŋāĻĻā§āĻ°), āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻĒā§āĻ°āĻ¤āĻŋ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨āĻ•āĻ°āĻ¤ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻŽ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻ¤āĻžā§ŽāĻĒāĻ°ā§āĻ¯ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĢāĻžāĻ¸ā§āĻŸ)āĨ¤

  3. āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, āĻāĻœā§‡āĻ¨ā§āĻŸ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻŽāĻžāĻ¨ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻŋāĻ¤ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¤āĻŦā§‡, āĻ†āĻŽāĻŋ āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ­āĻžāĻŦā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ˜ā§‹āĻˇāĻŖāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡āĨ¤ āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻāĻœā§‡āĻ¨ā§āĻŸ āĻŦāĻŋāĻœā§āĻžāĻžāĻĒāĻ¨ā§‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻŦāĻž āĻ§āĻ°ā§‡ āĻ°āĻžāĻ–āĻžāĻ° āĻ¨ā§€āĻ¤āĻŋ) āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻžāĨ¤

    āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŸāĻŋ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ¨āĻž āĻ•āĻ°ā§‡ āĻāĻŸāĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻ•ā§‡āĻŽāĻ¨ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¤āĻž āĻāĻ–āĻžāĻ¨ā§‡:

app = get_app()

@app.agent()
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
	pass

āĻ†āĻšā§āĻ›āĻž, āĻāĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻœā§‡āĻ¨ā§āĻŸ āĻ•ā§€ āĻ•āĻ°āĻŦā§‡ āĻ¤āĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŋ :)

app = get_app()

collect_securities_topic = app.topic("collect_securities", internal=True)

@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
    async with aiohttp.ClientSession() as session:
        async for _ in stream:
            logger.info("Start collect securities")

            client = AlphaVantageClient(session, API_KEY)

            securities = await client.get_securities()

            for security in securities:
                await SecurityCRUD.update_one(
                    {"symbol": security["symbol"], "exchange": security["exchange"]}, security, upsert=True
                )

            yield True

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻļā§āĻ°ā§āĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ aiohttp āĻ¸ā§‡āĻļāĻ¨ āĻ–ā§āĻ˛āĻŋāĨ¤ āĻāĻ‡āĻ­āĻžāĻŦā§‡, āĻāĻ•āĻœāĻ¨ āĻ•āĻ°ā§āĻŽā§€ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻœā§‡āĻ¨ā§āĻŸ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻ–āĻ¨āĻ‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻļāĻ¨ āĻ–ā§‹āĻ˛āĻž āĻšāĻŦā§‡ - āĻāĻ•, āĻĒā§āĻ°ā§‹ āĻ¸āĻŽāĻ¯āĻŧ āĻ•āĻ°ā§āĻŽā§€ āĻšāĻ˛āĻ›ā§‡ (āĻ…āĻĨāĻŦāĻž āĻāĻ•āĻžāĻ§āĻŋāĻ•, āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§‡āĻ¨) āĻ¸āĻŽā§āĻĒāĻžāĻ¤āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻāĻ•āĻŸāĻŋ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ‡āĻ‰āĻ¨āĻŋāĻŸ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡)āĨ¤

āĻāĻ°āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻŸā§āĻ°ā§€āĻŽ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻŋ (āĻ†āĻŽāĻ°āĻž āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻ°āĻžāĻ–āĻŋ _, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž, āĻāĻ‡ āĻāĻœā§‡āĻ¨ā§āĻŸā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻĨā§‡āĻ•ā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ°āĻŋ āĻ¨āĻž, āĻ¯āĻĻāĻŋ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ…āĻĢāĻ¸ā§‡āĻŸā§‡ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻĨāĻžāĻ•ā§‡, āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻšāĻ•ā§āĻ° āĻ¤āĻžāĻĻā§‡āĻ° āĻ†āĻ—āĻŽāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡āĨ¤ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ˛ā§āĻĒā§‡āĻ° āĻ­āĻŋāĻ¤āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ°āĻ¸āĻŋāĻĻ āĻ˛āĻ— āĻ•āĻ°āĻŋ, āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒāĻžāĻ‡ (get_securities āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻšāĻ¯āĻŧ, āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ•ā§‹āĻĄ āĻĻā§‡āĻ–ā§āĻ¨) āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻœ āĻāĻŦāĻ‚ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŋ, āĻāĻ•āĻ‡ āĻŸāĻŋāĻ•āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ†āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻŦāĻŋāĻ¨āĻŋāĻŽāĻ¯āĻŧ, āĻ¯āĻĻāĻŋ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ (āĻ•āĻžāĻ—āĻœ) āĻ•ā§‡āĻŦāĻ˛ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸ā§ƒāĻˇā§āĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•!

> docker-compose up -d
... ЗаĐŋŅƒŅĐē ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€ĐžĐ˛ ...
> faust -A horton.agents worker --without-web -l info

āĻĒāĻŋāĻāĻ¸ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ†āĻŽāĻŋ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĢāĻžāĻ¸ā§āĻŸ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻŦ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻĒāĻ¤āĻžāĻ•āĻž āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ˛āĻžā§āĻš āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡, āĻ†āĻŽāĻ°āĻž āĻ¤āĻĨā§āĻ¯ āĻ˛āĻ— āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻŸāĻŋ āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ āĻ–ā§āĻāĻœāĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•ā§€ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻāĻ•āĻœāĻ¨ āĻ•āĻ°ā§āĻŽā§€ āĻ˛āĻžā§āĻš āĻ•āĻ°ā§āĻ¨) āĻŦāĻ˛ā§‡āĻ›āĻŋāĻ˛āĻžāĻŽāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻĒā§‡āĻ¤ā§‡:

āĻ­āĻ•ā§āĻˇāĻ•

ڟaÂĩS† v1.10.4â”Ŧ───────────────────────────────────────────────────┐
│ id          │ horton                                            │
│ transport   │ [URL('kafka://localhost:9092')]                   │
│ store       │ memory:                                           │
│ log         │ -stderr- (info)                                   │
│ pid         │ 1271262                                           │
│ hostname    │ host-name                                         │
│ platform    │ CPython 3.8.2 (Linux x86_64)                      │
│ drivers     │                                                   │
│   transport │ aiokafka=1.1.6                                    │
│   web       │ aiohttp=3.6.2                                     │
│ datadir     │ /path/to/project/horton-data                      │
│ appdir      │ /path/to/project/horton-data/v1                   │
└─────────────┴───────────────────────────────────────────────────┘
... ĐģĐžĐŗи, ĐģĐžĐŗи, ĐģĐžĐŗи ...

┌Topic Partition Set─────────â”Ŧ────────────┐
│ topic                      │ partitions │
├────────────────────────────â”ŧ────────────┤
│ collect_securities         │ {0-7}      │
│ horton-__assignor-__leader │ {0}        │
└────────────────────────────┴────────────┘ 

āĻāĻŸāĻž āĻœā§€āĻŦāĻŋāĻ¤!!!

āĻ†āĻ¸ā§āĻ¨ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻ¸ā§‡āĻŸāĻŸāĻŋ āĻĻā§‡āĻ–āĻŋāĨ¤ āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›āĻŋ, āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻ¯ā§‡ āĻ¨āĻžāĻŽāĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻ•ā§‹āĻĄā§‡ āĻŽāĻ¨ā§‹āĻ¨ā§€āĻ¤ āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ā§‡āĻ° āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž (8, āĻĨā§‡āĻ•ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž topic_partitions - āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°), āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻŽāĻžāĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻŋāĻ¨āĻŋ (āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡)āĨ¤ āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻžāĻ°ā§‡ āĻ˛āĻžā§āĻš āĻ•āĻ°āĻž āĻāĻœā§‡āĻ¨ā§āĻŸāĻ•ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ 8āĻŸāĻŋ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻŸāĻŋ āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ°, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°āĻŋāĻ‚ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ…āĻ‚āĻļā§‡ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤

āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ…āĻ¨ā§āĻ¯ āĻŸāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻ¤ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

> faust -A horton.agents send @collect_securities
{"topic": "collect_securities", "partition": 6, "topic_partition": ["collect_securities", 6], "offset": 0, "timestamp": ..., "timestamp_type": 0}

āĻĒāĻŋāĻāĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ @ āĻ†āĻŽāĻ°āĻž āĻĻā§‡āĻ–āĻžāĻ‡ āĻ¯ā§‡ āĻ†āĻŽāĻ°āĻž "collect_securities" āĻ¨āĻžāĻŽā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻšā§āĻ›āĻŋāĨ¤

āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ 6-āĻ āĻ—āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ - āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§āĻ¯āĻžāĻĢāĻĄā§āĻ°āĻĒ āĻ…āĻ¨-āĻ āĻ—āĻŋāĻ¯āĻŧā§‡ āĻāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ localhost:9000

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻ°ā§āĻŽā§€āĻ° āĻ¸āĻžāĻĨā§‡ āĻŸāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻ¤ā§‡ āĻ—āĻŋāĻ¯āĻŧā§‡, āĻ†āĻŽāĻ°āĻž loguru āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻāĻ•āĻŸāĻŋ āĻ–ā§āĻļāĻŋāĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦ:

2020-09-23 00:26:37.304 | INFO     | horton.agents:collect_securities:40 - Start collect securities

āĻ†āĻŽāĻ°āĻž āĻŽāĻ™ā§āĻ—ā§‹ (Robo3T āĻŦāĻž Studio3T āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡) āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻāĻŦāĻ‚ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§‡ āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻ—ā§āĻ˛āĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

āĻ†āĻŽāĻŋ āĻŦāĻŋāĻ˛āĻŋāĻ¯āĻŧāĻ¨ā§‡āĻ¯āĻŧāĻžāĻ° āĻ¨āĻ‡, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻĨāĻŽ āĻĻā§‡āĻ–āĻžāĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒā§‡ āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸāĨ¤

āĻĢāĻžāĻ‰āĻ¸ā§āĻŸā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋāĻ° āĻ•āĻžāĻœ, āĻĒāĻžāĻ°ā§āĻŸ II: āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻĻāĻ˛āĻĢāĻžāĻ‰āĻ¸ā§āĻŸā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋāĻ° āĻ•āĻžāĻœ, āĻĒāĻžāĻ°ā§āĻŸ II: āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻĻāĻ˛

āĻ¸ā§āĻ– āĻāĻŦāĻ‚ āĻ†āĻ¨āĻ¨ā§āĻĻ - āĻĒā§āĻ°āĻĨāĻŽ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ :)

āĻāĻœā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤, āĻ¨āĻ¤ā§āĻ¨ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻĻā§€āĻ°ā§āĻ˜āĻœā§€āĻŦā§€ āĻšā§‹āĻ•!

āĻšā§āĻ¯āĻžāĻ, āĻ­āĻĻā§āĻ°āĻ˛ā§‹āĻ•, āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻĒāĻĨā§‡āĻ° āĻŽāĻžāĻ¤ā§āĻ° 1/3 āĻ…āĻ‚āĻļ āĻ•āĻ­āĻžāĻ° āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ¤āĻŦā§‡ āĻ¨āĻŋāĻ°ā§ā§ŽāĻ¸āĻžāĻšāĻŋāĻ¤ āĻšāĻŦā§‡āĻ¨ āĻ¨āĻž, āĻ•āĻžāĻ°āĻŖ āĻāĻ–āĻ¨ āĻāĻŸāĻŋ āĻ†āĻ°āĻ“ āĻ¸āĻšāĻœ āĻšāĻŦā§‡āĨ¤

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚ āĻāĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻŽāĻ¨ āĻāĻ•āĻœāĻ¨ āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¯āĻž āĻŽā§‡āĻŸāĻž āĻ¤āĻĨā§āĻ¯ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ¨āĻĨāĻŋāĻ¤ā§‡ āĻ°āĻžāĻ–ā§‡:

collect_security_overview_topic = app.topic("collect_security_overview", internal=True)


@app.agent(collect_security_overview_topic)
async def collect_security_overview(
    stream: StreamT[?],
) -> AsyncIterable[bool]:
    async with aiohttp.ClientSession() as session:
        async for event in stream:
            ...

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻ‡ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻŦā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ¯āĻŧ āĻāĻ‡ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻžāĻ° āĻŸāĻŋāĻ•āĻžāĻ° (āĻĒā§āĻ°āĻ¤ā§€āĻ•) āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻ‡ āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ā§‡ āĻĢāĻžāĻ‰āĻ¸ā§āĻŸā§‡ āĻ†āĻ›ā§‡ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ¸ — āĻ•ā§āĻ˛āĻžāĻ¸ āĻ¯ā§‡āĻ—ā§āĻ˛āĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸ā§āĻ•āĻŋāĻŽ āĻ˜ā§‹āĻˇāĻŖāĻž āĻ•āĻ°ā§‡āĨ¤

āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻāĻ° āĻ¯āĻžāĻ¨ records.py āĻāĻŦāĻ‚ āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡āĻ° āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻ•ā§‡āĻŽāĻ¨ āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¤āĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§āĻ¨:

import faust


class CollectSecurityOverview(faust.Record):
    symbol: str
    exchange: str

āĻ†āĻĒāĻ¨āĻŋ āĻ…āĻ¨ā§āĻŽāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, faust āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻŸāĻžāĻ‡āĻĒ āĻŸā§€āĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ¯āĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 3.6.

āĻ†āĻ¸ā§āĻ¨ āĻāĻœā§‡āĻ¨ā§āĻŸā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯āĻžāĻ‡, āĻĒā§āĻ°āĻ•āĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨:

collect_security_overview_topic = app.topic(
    "collect_security_overview", internal=True, value_type=CollectSecurityOverview
)


@app.agent(collect_security_overview_topic)
async def collect_security_overview(
    stream: StreamT[CollectSecurityOverview],
) -> AsyncIterable[bool]:
    async with aiohttp.ClientSession() as session:
        async for event in stream:
            logger.info(
                "Start collect security [{symbol}] overview", symbol=event.symbol
            )

            client = AlphaVantageClient(session, API_KEY)

            security_overview = await client.get_security_overview(event.symbol)

            await SecurityCRUD.update_one({"symbol": event.symbol, "exchange": event.exchange}, security_overview)

            yield True

āĻ†āĻĒāĻ¨āĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›ā§‡āĻ¨, āĻ†āĻŽāĻ°āĻž āĻŸāĻĒāĻŋāĻ• āĻĒā§āĻ°āĻžāĻ°āĻŽā§āĻ­āĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ•āĻŋāĻŽ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻĒāĻžāĻ¸ āĻ•āĻ°āĻŋ - value_typeāĨ¤ āĻ†āĻ°āĻ“, āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻāĻ•āĻ‡ āĻ¸ā§āĻ•āĻŋāĻŽ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§āĻ¤ā§‡ āĻĨāĻžāĻ•āĻžāĻ° āĻ•ā§‹āĻ¨ āĻŦāĻŋāĻ¨ā§āĻĻā§ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›āĻŋ āĻ¨āĻžāĨ¤

āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸ā§āĻĒāĻ°ā§āĻļ āĻšāĻ˛ āĻŽā§‡āĻŸāĻž āĻ¤āĻĨā§āĻ¯ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ•āĻžāĻ°ā§€ āĻāĻœā§‡āĻ¨ā§āĻŸāĻ•ā§‡ collect_securitites āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž:

....
for security in securities:
    await SecurityCRUD.update_one({
            "symbol": security["symbol"],
            "exchange": security["exchange"]
        },
        security,
        upsert = True,
    )

    await collect_security_overview.cast(
        CollectSecurityOverview(symbol = security["symbol"], exchange = security["exchange"])
    )
....

āĻ†āĻŽāĻ°āĻž āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§‚āĻ°ā§āĻŦā§‡ āĻ˜ā§‹āĻˇāĻŋāĻ¤ āĻ¸ā§āĻ•āĻŋāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤ āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻŽāĻŋ .cast āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ›āĻŋ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻžāĻ° āĻŽāĻ¤ā§‹ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¨:

  1. cast - āĻŦā§āĻ˛āĻ• āĻ•āĻ°ā§‡ āĻ¨āĻž āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ†āĻļāĻž āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ…āĻ¨ā§āĻ¯ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĒāĻžāĻ āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž.

  2. send - āĻŦā§āĻ˛āĻ• āĻ•āĻ°ā§‡ āĻ¨āĻž āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ†āĻļāĻž āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯ā§‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¯āĻžāĻŦā§‡āĨ¤

  3. āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°ā§āĻ¨ - āĻĢāĻ˛āĻžāĻĢāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯ā§‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¯āĻžāĻŦā§‡āĨ¤

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ†āĻœāĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻœā§‡āĻ¨ā§āĻŸāĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‡ āĻ¸āĻŦ!

āĻ¸ā§āĻŦāĻĒā§āĻ¨ā§‡āĻ° āĻĻāĻ˛

āĻļā§‡āĻˇ āĻœāĻŋāĻ¨āĻŋāĻ¸āĻŸāĻŋ āĻ†āĻŽāĻŋ āĻāĻ‡ āĻ…āĻ‚āĻļā§‡ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋ āĻĻāĻŋāĻ¯āĻŧā§‡āĻ›āĻŋ āĻ¤āĻž āĻšāĻ˛ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĨ¤ āĻ†āĻ—ā§‡āĻ‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, faust-āĻ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻ•ā§āĻ˛āĻŋāĻ•ā§‡āĻ° āĻšāĻžāĻ°āĻĒāĻžāĻļā§‡ āĻāĻ•āĻŸāĻŋ āĻŽā§‹āĻĄāĻŧāĻ•āĨ¤ āĻ†āĻ¸āĻ˛ā§‡, faust -A āĻ•ā§€ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ•ā§‡ āĻāĻ° āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§‡

āĻ˜ā§‹āĻˇāĻŋāĻ¤ āĻāĻœā§‡āĻ¨ā§āĻŸāĻĻā§‡āĻ° āĻĒāĻ°ā§‡ agents.py āĻĄā§‡āĻ•ā§‹āĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ app.commandāĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ•āĻ˛āĻŋāĻ‚ āĻ¨āĻŋāĻ•ā§āĻˇā§‡āĻĒ Ņƒ āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻ¸ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°ā§āĻ¨:

@app.command()
async def start_collect_securities():
    """Collect securities and overview."""

    await collect_securities.cast()

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻ°āĻž āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ•āĻ˛ āĻ•āĻ°āĻŋ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻ¤ā§āĻ¨ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻāĻ¤ā§‡ āĻĨāĻžāĻ•āĻŦā§‡:

> faust -A horton.agents --help

....
Commands:
  agents                    List agents.
  clean-versions            Delete old version directories.
  completion                Output shell completion to be evaluated by the...
  livecheck                 Manage LiveCheck instances.
  model                     Show model detail.
  models                    List all available models as a tabulated list.
  reset                     Delete local table state.
  send                      Send message to agent/topic.
  start-collect-securities  Collect securities and overview.
  tables                    List available tables.
  worker                    Start worker instance for given app.

āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ•ā§‡ āĻ…āĻ¨ā§āĻ¯ āĻ•āĻžāĻ°āĻ“ āĻŽāĻ¤ā§‹ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻ¸ā§āĻ¨ āĻĢāĻžāĻ¸ā§āĻŸ āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻžāĻ°āĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻ°āĻŋāĻŸāĻŋāĻœā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ:

> faust -A horton.agents start-collect-securities

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€āĻ¤ā§‡ āĻ•ā§€ āĻšāĻŦā§‡?

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ…āĻ‚āĻļā§‡, āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ…āĻŦāĻļāĻŋāĻˇā§āĻŸ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻŦāĻ›āĻ°ā§‡āĻ° āĻŸā§āĻ°ā§‡āĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ•ā§āĻ°āĻ¨ āĻ˛āĻžā§āĻšā§‡āĻ° āĻāĻœā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ•ā§āĻ˛ā§‹āĻœāĻŋāĻ‚ āĻĒā§āĻ°āĻžāĻ‡āĻ¸ā§‡āĻ° āĻšāĻ°āĻŽāĻ¤āĻž āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŋāĻ™ā§āĻ• āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻŦāĨ¤

āĻ†āĻœ āĻ¯ā§‡ āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦ! āĻĒāĻĄāĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ :)

āĻāĻ‡ āĻ…āĻ‚āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻĄ

āĻĢāĻžāĻ‰āĻ¸ā§āĻŸā§‡āĻ° āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋāĻ° āĻ•āĻžāĻœ, āĻĒāĻžāĻ°ā§āĻŸ II: āĻāĻœā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻĻāĻ˛

āĻĒāĻŋāĻāĻ¸ āĻļā§‡āĻˇ āĻ…āĻ‚āĻļā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ†āĻŽāĻžāĻ•ā§‡ āĻĢāĻžāĻ¸ā§āĻŸ āĻāĻŦāĻ‚ āĻ¸āĻ™ā§āĻ—āĻŽ āĻ•āĻžāĻĢāĻ•āĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ (āĻ¸āĻ™ā§āĻ—āĻŽā§‡ āĻ•āĻŋ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ†āĻ›ā§‡?) āĻĻā§‡āĻ–ā§‡ āĻŽāĻ¨ā§‡ āĻšāĻšā§āĻ›ā§‡ āĻ¸āĻ™ā§āĻ—āĻŽāĻŸāĻŋ āĻ…āĻ¨ā§‡āĻ• āĻ‰āĻĒāĻžāĻ¯āĻŧā§‡ āĻ†āĻ°āĻ“ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ°ā§€, āĻ¤āĻŦā§‡ āĻ¸āĻ¤ā§āĻ¯āĻŸāĻŋ āĻšāĻ˛ āĻ¯ā§‡ āĻĢāĻžāĻ¸ā§āĻŸā§‡āĻ° āĻ¸āĻ™ā§āĻ—āĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ¨ā§‡āĻ‡ - āĻāĻŸāĻŋ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻ¨āĻĨāĻŋāĻ¤ā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻžāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž.

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨