Repository: benbusby/whoogle-search
File: app/utils/results.py (Python)

Code before:
        ref_element.insert_before(ip_tag)
    return html_soup


def check_currency(response: str):
    """Check whether the results have currency conversion

    Args:
        response: Search query Result

    Returns:
        list

    """
    soup = BeautifulSoup(response, 'html.parser')
    a = soup.find(class_='ZINbbc xpd O9g5cc uUPGi')
    tag = a.find('a')
    if tag and tag['href'] == 'https://g.co/gfd':
        currency1 = soup.find(class_="xUrNXd UMOHqf")
        currency2 = soup.select_one('.kCrYT'
                                    ' .BNeawe.iBp4i.AP7Wnd '
                                    '.BNeawe.iBp4i.AP7Wnd')
        currency1 = currency1.text.rstrip('=').split(' ', 1)
        currency2 = currency2.text.split(' ', 1)
        return [float(currency1[0]), currency1[1],
                float(currency2[0]), currency2[1]]
    return None


def add_currency_b(soup: BeautifulSoup,
                   conversion_details: list) -> BeautifulSoup:
    """Adds the currency conversion boxes
    to response of the search query

    Args:
        soup: Parsed search result
        conversion_details: list of currency
        related information

    Returns:
        BeautifulSoup
    """
    # Element before which the code will be changed
    # (This is the 'disclaimer' link)
    element1 = soup.select_one('[class="nXE3Ob"]')

    # Creating the conversion factor
    conversion_factor = conversion_details[0]/conversion_details[2]

    # Creating a new div for the input boxes
    conversion_box = soup.new_tag('div')

Review comment (suggestion):
Could be better as a dict, so that these at least can be referenced by name:

```suggestion
        return {
            'currencyValue1': float(currency1[0]),
            'currencyLabel1': currency1[1],
            ...
        }
```

or something like that. I generally try to make variable names as descriptive as possible in cases like these.

Code after:
        ref_element.insert_before(ip_tag)
    return html_soup


def check_currency(response: str) -> dict:
    """Check whether the results have currency conversion

    Args:
        response: Search query Result

    Returns:
        dict: Consists of currency names and values

    """
    soup = BeautifulSoup(response, 'html.parser')
    currency_link = soup.find('a', {'href': 'https://g.co/gfd'})
    if currency_link:
        while 'class' not in currency_link.attrs or \
                'ZINbbc' not in currency_link.attrs['class']:
            currency_link = currency_link.parent
        currency_link = currency_link.find_all(class_='BNeawe')
        currency1 = currency_link[0].text
        currency2 = currency_link[1].text
        currency1 = currency1.rstrip('=').split(' ', 1)
        currency2 = currency2.split(' ', 1)
        if currency2[0][-3] == ',':
            currency1[0] = currency1[0].replace('.', '')
            currency1[0] = currency1[0].replace(',', '.')
            currency2[0] = currency2[0].replace('.', '')
            currency2[0] = currency2[0].replace(',', '.')
        else:
            currency1[0] = currency1[0].replace(',', '')
            currency2[0] = currency2[0].replace(',', '')
        return {'currencyValue1': float(currency1[0]),
                'currencyLabel1': currency1[1],
                'currencyValue2': float(currency2[0]),
                'currencyLabel2': currency2[1]
                }
    return {}


def add_currency_card(soup: BeautifulSoup,
                      conversion_details: dict) -> BeautifulSoup:
    """Adds the currency conversion boxes
    to response of the search query

    Args:
        soup: Parsed search result
        conversion_details: Dictionary of currency
        related information