Пример #1
0
 def setUp(self):
     csv_importer = Importer(FIXTURES)
     transactions_df = csv_importer.import_csv()
     self.calculator = Calculator(
         transactions_df      
     )
     self.calculator.calculate()
Пример #2
0
class TestCalculator(unittest.TestCase):
    def setUp(self):
        csv_importer = Importer(FIXTURES)
        transactions_df = csv_importer.import_csv()
        self.calculator = Calculator(
            transactions_df      
        )
        self.calculator.calculate()
    
    def test_init(self):
        assert isinstance(self.calculator, Calculator)

    def test_get_gains(self):
        gains_ref = ('{"index":{"0":{"gain":{"2019":82.8801608579,"2020":49.4627604496,"2018":0},"queue":[]},"1":{"gain":{"2020":248.97,"2018":0,"2019":0},"queue":[]},"2":{"gain":{"2019":41.6666666667,"2020":-294.0870149755,"2018":0},"queue":[]},"3":"Grand Totals"},"2018":{"0":0.0,"1":0.0,"2":0.0,"3":0.0},"2019":{"0":82.8801608579,"1":0.0,"2":41.6666666667,"3":124.5468275246},"2020":{"0":49.4627604496,"1":248.97,"2":-294.0870149755,"3":4.3457454741},"Total":{"0":132.3429213075,"1":248.97,"2":-252.4203483088,"3":128.8925729987}}')
        assert self.calculator.get_gains().to_json() == gains_ref
Пример #3
0
class Face(GridLayout):

    __button_row_1 = ButtonRow()
    __button_row_2 = ButtonRow()
    __button_row_3 = ButtonRow()
    __button_row_4 = ButtonRow()
    __screen = Label()
    __calc = Calculator()
    __number = ""

    def __init__(self, **kwargs):
        super(Face, self).__init__(**kwargs)

        self.__button_row_1.set_button_texts("1", "2", "3", "+")
        self.__button_row_2.set_button_texts("4", "5", "6", "-")
        self.__button_row_3.set_button_texts("7", "8", "9", "x")
        self.__button_row_4.set_button_texts("C", "0", "C", "/")

        self.__button_row_1.add_event_listener(self.__handle_button_click)
        self.__button_row_2.add_event_listener(self.__handle_button_click)
        self.__button_row_3.add_event_listener(self.__handle_button_click)
        self.__button_row_4.add_event_listener(self.__handle_button_click)

        self.__screen.font_size = "100dp"

        self.cols = 1
        self.add_widget(self.__screen)
        self.add_widget(self.__button_row_1)
        self.add_widget(self.__button_row_2)
        self.add_widget(self.__button_row_3)
        self.add_widget(self.__button_row_4)

    def __handle_button_click(self, text: str):
        if text == "1" \
            or text == "2" \
            or text == "3" \
            or text == "4" \
            or text == "5" \
            or text == "6" \
            or text == "7" \
            or text == "8" \
            or text == "9" \
            or text == "0":
            self.__number = self.__number + text
            self.__screen.text = self.__number
        elif text == "+" \
            or text == "-" \
            or text == "x" \
            or text == "/":
            self.__calc.set_number(int(self.__number))
            self.__calc.set_operation(text)
            self.__number = ""
            self.__screen.text = str(self.__calc.get_result())
        elif text == "C":
            self.__number = ""
            self.__screen.text = ""
            self.__calc.clear()
Пример #4
0
 def __init__(self):
     self.builder = Gtk.Builder()
     self.builder.add_from_file("main.glade")
     self.builder.connect_signals(self)
     self.main_box = self.builder.get_object("main_box")
     self.window = self.builder.get_object("main_window")
     self.add_dialog = self.builder.get_object("add_dialog")
     self.gains_dialog = self.builder.get_object("gains_dialog")
     self.cgt_dialog = self.builder.get_object("cgt_dialog")
     self.cgt_results = self.builder.get_object("cgt_label")
     self.main_menu = self.builder.get_object("main_menu")
     self.menu_button = self.builder.get_object("menu_button")
     self.header = self.builder.get_object("header")
     self.gains_view = self.builder.get_object("gains_view")
     self.portfolio_view = self.builder.get_object("portfolio_view")
     self.transactions_view = self.builder.get_object("transactions_view")
     self.transactions_store = self.builder.get_object("transactions_store")
     self.portfolio_store = self.builder.get_object("portfolio_store")
     self._transactions_df = pd.DataFrame()
     self.calculator = Calculator(self.transactions_df)
     if os.path.isfile(STORE_FILE):
         self.load_csv()
     self.main_menu.show_all()
     self.window.show_all()
Пример #5
0
from lib.parser import Parser
from lib.calculator import Calculator
from lib.finder import Finder


def left_pad(string, length=2):
    if len(string) == length:
        return string

    return '{}{}'.format('0' * (length - len(string)), string)


if __name__ == '__main__':
    p = Parser().get_args()

    if p.test:
        print('\nRunning all tests...\n')
        suite = unittest.TestLoader().discover('.', pattern='*.py')
        unittest.TextTestRunner(verbosity=2).run(suite)
        exit(0)

    finder = Finder(p.hand)
    calculator = Calculator()
    words = [(word, calculator.calculate(word)) for word in finder.find()]

    # sort descending by t[1], the point value
    sorted_tuples = sorted(words, key=lambda t: t[1], reverse=True)
    for word, points in sorted_tuples:
        print('{} {}'.format(left_pad(str(points)), word))
Пример #6
0
def test_calculator_add_method_returns_correct_result():
    calc = Calculator()
    result = calc.add(2,2)
    assert result == 4
Пример #7
0
    def test_wwf(self):
        calc = Calculator(variant='words_with_friends')
        words = {'coccyx': 24, 'hello': 9, 'sister': 6, 'yoga': 8}

        for word, val in words.items():
            self.assertTrue(calc.calculate(word) == val)
Пример #8
0
    def test_scr(self):
        calc = Calculator(variant='scrabble')
        words = {'coccyx': 22, 'hello': 8, 'sister': 6, 'yoga': 8}

        for word, val in words.items():
            self.assertTrue(calc.calculate(word) == val)
 def setUp(self):
     self.calculator1 = Calculator()
     self.calculator2 = Calculator()
Пример #10
0
def test_add_db(tempdb):
    c = Calculator(reporter=DBReporter(tempdb))
    c.add(10, 20)
    [message,
     *_] = tempdb.cursor().execute("SELECT message FROM log").fetchone()
    assert message == "10 + 20 = 30"
Пример #11
0
def test_add(tempdir):
    c = Calculator('output.txt')
    c.add(10, 20)
    text_string = Path('output.txt').read_text()
    assert text_string == "10 + 20 = 30\n"
Пример #12
0
class Main(object):
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file("main.glade")
        self.builder.connect_signals(self)
        self.main_box = self.builder.get_object("main_box")
        self.window = self.builder.get_object("main_window")
        self.add_dialog = self.builder.get_object("add_dialog")
        self.gains_dialog = self.builder.get_object("gains_dialog")
        self.cgt_dialog = self.builder.get_object("cgt_dialog")
        self.cgt_results = self.builder.get_object("cgt_label")
        self.main_menu = self.builder.get_object("main_menu")
        self.menu_button = self.builder.get_object("menu_button")
        self.header = self.builder.get_object("header")
        self.gains_view = self.builder.get_object("gains_view")
        self.portfolio_view = self.builder.get_object("portfolio_view")
        self.transactions_view = self.builder.get_object("transactions_view")
        self.transactions_store = self.builder.get_object("transactions_store")
        self.portfolio_store = self.builder.get_object("portfolio_store")
        self._transactions_df = pd.DataFrame()
        self.calculator = Calculator(self.transactions_df)
        if os.path.isfile(STORE_FILE):
            self.load_csv()
        self.main_menu.show_all()
        self.window.show_all()

    @property
    def transactions_df(self):
        if self._transactions_df.empty:
            if os.path.exists(STORE_FILE):
                self._transactions_df = pd.read_csv(
                    STORE_FILE,
                    parse_dates=[0],
                    infer_datetime_format=True
                )
        return self._transactions_df

    @transactions_df.setter
    def transactions_df(self, dataframe):
        self._transactions_df = dataframe
        dataframe.to_csv(STORE_FILE, index=False)

    def on_destroy(self, *args):
        Gtk.main_quit()

    def on_calculate_clicked(self, button):
        self.calculator.calculate()
        self.gains = gains = self.calculator.get_gains()
        store = Gtk.ListStore(str, *([int] * (len(gains.columns) - 1)))
        for _, row in gains.iterrows():
            row["index"] = str(row["index"])  # convert Queue to str
            store.append(list(row))
        self.gains_view.set_model(store)
        renderer = Gtk.CellRendererText()
        # populate columns if not already
        if not self.gains_view.get_columns():
            self.gains_view.append_column(
                Gtk.TreeViewColumn("Product", renderer, text=0),
            )
            for index, year in enumerate(gains.columns[1:-1]):
                self.gains_view.append_column(
                Gtk.TreeViewColumn(year, renderer, text=index+1),
                )
            self.gains_view.append_column(
                Gtk.TreeViewColumn("Total", renderer, text=len(gains.columns)-1),
            )
        self.gains_dialog.run()
    
    def on_close_clicked(self, button, *args):
        self.gains_dialog.hide()
    
    def on_cgt_close_clicked(self, button, *args):
        self.cgt_dialog.hide()

    def on_add_clicked(self, button):
        #self.progress_bar.set_fraction(self.progress_bar.get_fraction() + 0.01)
        self.add_dialog.run()
    
    def on_remove_clicked(self, button):
        # TODO
        # get the selection
        # button only available for transactions
        # confirmation dialog
        # delete
        pass

    def on_calculate_cgt_clicked(self, button, *args):
        # calculates actual CGT
        cgt = self.calculator.get_cgt(self.gains)
        result = "\n".join(["{}: €{}".format(k, v) for k, v in cgt.items()])
        self.cgt_results.set_text(result)
        self.cgt_dialog.run()

    def on_cancel_clicked(self, button, *args):
        self.add_dialog.hide()

    def on_add_transaction_clicked(self, button):
        product_name = self.builder.get_object("add_product_name").get_text()
        isin = self.builder.get_object("add_isin").get_text()
        price = float(self.builder.get_object("add_price").get_text())
        number_of_items = int(self.builder.get_object("add_number_of_items").get_text())
        exchange_rate = float(self.builder.get_object("add_exchange_rate").get_text())
        fees = (float(self.builder.get_object("add_fees").get_text())) * -1
        stock_exchange = self.builder.get_object("add_stock_exchange").get_text()
        date_time = pd.to_datetime(
            self.builder.get_object("add_date_time").get_text(),
            infer_datetime_format=True
        )
        self.transactions_df = self.transactions_df.append(
            {
                "Date_Time": date_time,
                "Product": product_name,
                "ISIN": isin,
                "Price": price,
                "Quantity": number_of_items,
                "Reference exchange": stock_exchange,
                "Exchange rate": exchange_rate,
                "Local value": (price * number_of_items) * exchange_rate * -1,
                "Value": price * number_of_items * -1,
                "Transaction": fees,
                "Total": price * number_of_items * -1,
            }, ignore_index=True)
        self.load_csv()
        self.add_dialog.hide()

    def on_import_clicked(self, button):
        dialog = Gtk.FileChooserDialog(
            title="Please choose a file",
            parent=self.window,
            action=Gtk.FileChooserAction.OPEN,
        )
        dialog.add_buttons(
            Gtk.STOCK_CANCEL,
            Gtk.ResponseType.CANCEL,
            Gtk.STOCK_OPEN,
            Gtk.ResponseType.OK
        )
        filter_text = Gtk.FileFilter()
        filter_text.set_name("CSV files")
        filter_text.add_mime_type("text/csv")
        dialog.add_filter(filter_text)
        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            csv_file = dialog.get_filename()
            self.load_csv(csv_file)
        dialog.hide()

    def load_csv(self, filename=None):
        if filename:
            csv_importer = Importer(filename)
            self.transactions_df = csv_importer.import_csv()
        portfolio = Portfolio(self.transactions_df)
        portfolio_data = portfolio.plain_view()
        self.populate(
            self.transactions_view,
            self.transactions_df,
            self.transactions_store,
            [
                "Date_Time",  # move to settings
                "Product",
                "Reference exchange",
                "Quantity",
                "Price",
                "Local value",
                "Value",
                "Exchange rate",
                "Transaction",
                "Total",
            ],
        )
        self.populate(
            self.portfolio_view,
            portfolio_data,
            self.portfolio_store,
        )

    def populate(self, view, data, store, cols=None):
        """Populates given view with the data"""
        # TODO convert stores to properties to properly update
        if cols:
            data = data[cols]
        store.clear()
        for _, row in data.iterrows():
            row[0] = str(row[0])  # convert datetime to str
            store.append(list(row))
        view.set_model(store)
        if not view.get_columns():
            renderer = Gtk.CellRendererText()
            for index, column in enumerate(data.columns):
                view.append_column(
                    Gtk.TreeViewColumn(column, renderer, text=index),
                )