def update_asset(managed_portfolio: portfolio.Portfolio,
                 managed_asset: asset.Asset,
                 asset_name: Optional[Text] = None,
                 asset_price: Optional[float] = None,
                 asset_currency: Optional[Text] = None) -> asset.Asset:
    """Updates an asset information.

  Args:
    managed_asset: Asset to update.
    asset_name: New name of the asset.
    asset_price: Price of the asset.
    asset_currency: Currency of the asset price.

  Returns:
    Asset updated.
  """
    if asset_name and asset_name != managed_asset.name:
        managed_asset.name = asset_name
    if asset_price and asset_price != managed_asset.current_price:
        managed_asset.current_price = asset_price
    if asset_currency and asset_currency != managed_asset.currency:
        managed_asset.currency = asset_currency

    portfolio_manager.store_portfolio(managed_portfolio)

    return managed_asset
def update_asset_stats(managed_asset: asset.Asset) -> stats.AssetStats:
    """Updates stats of given assets.

  Args:
    managed_asset: Asset for which to update stats.

  Returns:
    Stats of the given asset.
  """
    tracker = managed_asset.get_tracker()
    price = managed_asset.current_price

    if not tracker:
        return stats.StockStats(managed_asset=managed_asset, price=price)

    try:
        fetched_price = _parse_and_format_value(
            stock_info.get_live_price(tracker))
    except AssertionError:
        fetched_price = None

    if not fetched_price:
        return stats.StockStats(managed_asset=managed_asset, price=price)

    price = fetched_price
    managed_asset.current_price = price

    stock_data = stock_info.get_stats(tracker)
    if stock_data.empty:
        return stats.StockStats(managed_asset=managed_asset, price=price)

    try:  # TODO: handle all types of assets instead of only stocks.
        stock_stats = stats.StockStats(
            managed_asset=managed_asset,
            price=price,
            debt_to_equity=_get_stock_stat_value(
                stock_data, StockAttribute.DEBT_TO_EQUITY),
            dividend_yield=_get_stock_stat_value(
                stock_data, StockAttribute.DIVIDEND_YIELD),
            eps=_get_stock_stat_value(stock_data, StockAttribute.EPS),
            pe=_get_stock_stat_value(stock_data, StockAttribute.PE),
            profit_margin=_get_stock_stat_value(stock_data,
                                                StockAttribute.PROFIT_MARGIN),
            return_on_equity=_get_stock_stat_value(
                stock_data, StockAttribute.RETURN_ON_EQUITY),
            revenue_growth=_get_stock_stat_value(
                stock_data, StockAttribute.REVENUE_GROWTH),
            value_over_ebitda=_get_stock_stat_value(
                stock_data, StockAttribute.VALUE_OVER_EBITDA),
        )
        managed_asset.stats = stock_stats
        return stock_stats
    except Exception:
        return stats.StockStats(managed_asset=managed_asset, price=price)