Compare commits

..
6 Commits
Author SHA1 Message Date
cmallwitz 520d2441cb Refresh Yahoo cookies 2022-06-02 21:19:49 +01:00
cmallwitz 8b370dfc73 Updated version 2022-01-07 21:42:07 +00:00
cmallwitz af82f16740 Updated Yahoo EU consent 2022-01-07 21:33:55 +00:00
cmallwitz 4e626c272e Add shares outstanding and free float information 2021-09-28 20:28:00 +01:00
cmallwitz e22dc7448f Fix SSL issue on MacOS 2021-09-11 23:46:42 +01:00
cmallwitz ab34a246e3 Update Readme 2021-08-19 19:50:41 +01:00
10 changed files with 115 additions and 44 deletions
+17 -2
View File
@@ -12,16 +12,19 @@ Additionally, starting with version 3 of the extension, it contains all non-stan
### Feedback requested:
Please provide feedback about using the extension here: https://github.com/cmallwitz/Financials-Extension/issues/10
Please provide feedback about using the extension [here](https://github.com/cmallwitz/Financials-Extension/issues/10)
### Usage:
Under 'Releases' on GitHub there is downloadable **Financials-Extension.oxt** file - load it into Calc
Under 'Releases' on GitHub [there](https://github.com/cmallwitz/Financials-Extension/releases) is a downloadable **Financials-Extension.oxt** file - load it into Calc
under menu item: Tools, Extension Manager...
Please make sure, not to rename the OXT file when downloading and before installing: LO will mess up the installation otherwise and the extension won't work.
Getting data should be a simple as having this in a cell:
- `=GETREALTIME("IBM",21,"YAHOO")`
- `=GETREALTIME("IBM:NYQ",21,"FT")`
- `=GETREALTIME("EURUSD","LAST_PRICE","FT")`
- `=GETHISTORIC("IBM",90,"2020-12-01","YAHOO")`
Codes 21 and 90 stand for "last price" and "close" (see below), respectively.
@@ -36,6 +39,15 @@ assets in other regions, drop me a line (best to include full URLs and possibly
site for comparison). While data for last price is most likely consistent across sites, they may differ for other data
points.
List of example URLs for checking symbols. You can start from these and search for other symbols. If you think some data
is available on the website but not from the extension, a good place to start when raising an issue is to include a similar
URL to compare results.
|Website|Symbol|Example URL for Vodafone Group Plc UK |
| :--- | :--- | :--- |
|YAHOO|VOD.L|https://finance.yahoo.com/quote/VOD.L|
|FT|VOD:LSE|https://markets.ft.com/data/equities/tearsheet/summary?s=VOD:LSE|
### LibreOffice: using , (comma) vs ; (semicolon) to separate arguments in formula
There is a setting in "Tools" / "Options..." / "LibreOffice Calc" / "Formula" called "Functions". Here the user can specify the character used to separate arguments in formula.
@@ -76,6 +88,8 @@ You can either specify numbers or names (lower or upper case) - not all bits are
|EX_DIV_DATE|72|Yes|Yes| |yyyy-mm-dd|
|PAYOUT_RATIO|73|Yes|No|||
|EXPIRY_DATE|74|Yes (on options)|No| |yyyy-mm-dd|
|SHARES_OUT|75|Yes|Yes| ||
|FREE_FLOAT|76|Yes|Yes| ||
|CLOSE|90|No|No|Yes||
|ADJ_CLOSE|91|No|No|Yes||
|SECTOR|98|Yes|Yes|||
@@ -120,6 +134,7 @@ python3 -m unittest discover src
### Tested with:
- Windows 10 / LibreOffice Calc 7.1.2.2 / Python 3.8.8
- Ubuntu 20.04 / LibreOffice Calc 6.4.3.2 / Python 3.8.2
- MacOS 10.15.7 / LibeOffice Calc 7.2.0.4 / Python 3.8.10
(Previous versions)
- Debian 10.3 / LibreOffice Calc 6.1.5.2 / Python 3.7.3
BIN
View File
Binary file not shown.
+16 -12
View File
@@ -48,18 +48,14 @@ class BaseClient:
os.makedirs(self.basedir, exist_ok=True)
user_agents = [
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0',
'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0',
'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:93.0) Gecko/20100101 Firefox/93.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
@@ -195,6 +191,7 @@ class BaseClient:
tick[Datacode.EXCHANGE] = None
tick[Datacode.EXPIRY_DATE] = None
tick[Datacode.EX_DIV_DATE] = None
tick[Datacode.FREE_FLOAT] = None
tick[Datacode.HIGH] = None
tick[Datacode.HIGH_52_WEEK] = None
tick[Datacode.INDUSTRY] = None
@@ -210,6 +207,7 @@ class BaseClient:
tick[Datacode.PE_RATIO] = None
tick[Datacode.PREV_CLOSE] = None
tick[Datacode.SECTOR] = None
tick[Datacode.SHARES_OUT] = None
tick[Datacode.TICKER] = None
tick[Datacode.TIMEZONE] = None
tick[Datacode.VOLUME] = None
@@ -320,6 +318,12 @@ class BaseClient:
else:
return data[Datacode.EXPIRY_DATE]
elif datacode == Datacode.FREE_FLOAT.value and Datacode.FREE_FLOAT in data:
return data[Datacode.FREE_FLOAT]
elif datacode == Datacode.SHARES_OUT.value and Datacode.SHARES_OUT in data:
return data[Datacode.SHARES_OUT]
elif datacode == Datacode.CLOSE.value and Datacode.CLOSE in data:
return data[Datacode.CLOSE]
+2
View File
@@ -44,6 +44,8 @@ class Datacode(Enum):
EX_DIV_DATE = 72
PAYOUT_RATIO = 73
EXPIRY_DATE = 74
SHARES_OUT = 75
FREE_FLOAT = 76
CLOSE = 90
ADJ_CLOSE = 91
+13 -1
View File
@@ -14,6 +14,7 @@ import logging
import os
import pathlib
import platform
import ssl
import sys
import time
from functools import wraps
@@ -60,6 +61,16 @@ import financials_ft as ft
implementation_name = "com.financials.getinfo.python.FinancialsImpl" # as defined in Financials.xcu
implementation_services = ("com.sun.star.sheet.AddIn",)
# Disabling SSL certificate validation as Python setup on MacOS seems to be broken
# Only reading public data so this should be safe
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
pass
else:
ssl._create_default_https_context = _create_unverified_https_context
def profile(fn):
@wraps(fn)
@@ -230,7 +241,7 @@ class FinancialsImpl(unohelper.Base, Financials):
if e.tag.endswith('version'):
version = e.attrib['value']
s = 'ctx={}\nid(self)={}\nversion={}\nfile={}\ncwd={}\nhome={}\nuname={}\npid={}\nsys.executable={}\nsys.version={}\nlocale={}\ndefaultlocale={}\ndateutil={}\npytz={}\npyparsing={}\nsix={}'.format(
s = 'ctx={}\nid(self)={}\nversion={}\nfile={}\ncwd={}\nhome={}\nuname={}\npid={}\nsys.executable={}\nsys.version={}\nsys.path={}\nlocale={}\ndefaultlocale={}\ndateutil={}\npytz={}\npyparsing={}\nsix={}'.format(
self.ctx,
id(self),
version,
@@ -241,6 +252,7 @@ class FinancialsImpl(unohelper.Base, Financials):
os.getpid(),
sys.executable,
sys.version.replace("\n", " "),
sys.path,
locale.getlocale(),
locale.getdefaultlocale(),
dateutil.__version__,
+12
View File
@@ -241,6 +241,18 @@ class FT(BaseClient):
tick[Datacode.AVG_DAILY_VOL_3MONTH] = self.save_wrapper(
lambda: handle_abbreviations(html.unescape(match.group(1))))
r = r'<th>\s*Shares outstanding\s*</th><td>\s*([0-9,\.btnmk]+)\s*</td>'
match = re.compile(r, flags=re.DOTALL).search(text, start)
if match:
tick[Datacode.SHARES_OUT] = self.save_wrapper(
lambda: handle_abbreviations(html.unescape(match.group(1))))
r = r'<th>\s*Free float\s*</th><td>\s*([0-9,\.btnmk]+)\s*</td>'
match = re.compile(r, flags=re.DOTALL).search(text, start)
if match:
tick[Datacode.FREE_FLOAT] = self.save_wrapper(
lambda: handle_abbreviations(html.unescape(match.group(1))))
r = r'<th>\s*P/E.*?</th><td>\s*([0-9,\.\-]+)\s*<'
match = re.compile(r, flags=re.DOTALL).search(text, start)
if match:
+19 -12
View File
@@ -50,6 +50,13 @@ def fmt(m, key, default=0.0):
return default
def cookie(name, value):
return cookiejar.Cookie(version=0, name=name, value=value,
port=None, port_specified=False, domain=".yahoo.com", domain_specified=True,
domain_initial_dot=True, path="/", path_specified=True, secure=True, expires=None,
discard=False, comment=None, comment_url=None, rest=dict())
class Yahoo(BaseClient):
def __init__(self, ctx):
super().__init__()
@@ -111,18 +118,15 @@ class Yahoo(BaseClient):
url = 'https://finance.yahoo.com/quote/{}?p={}'.format(ticker, ticker)
cookies = [cookiejar.Cookie(version=0,
name="B",
value="er7g22lg35od5&b=3&s=8p",
port=None, port_specified=False,
domain=".yahoo.com", domain_specified=True, domain_initial_dot=True,
path="/", path_specified=True,
secure=True,
expires=None,
discard=False,
comment=None,
comment_url=None,
rest=dict())
cookies = [cookie("maex","%7B%22v2%22%3A%7B%7D%7D"),
cookie("EuConsent", "CPZ7-cAPZ7-cAAOACBENCRCoAP_AAH_AACiQIlNd_X__bX9n-_7_7ft0cY1f9_r3r-QzjgfNs-8F3L_W_L0X32E7NF36pq4KuR4ku3bBIQFtHMnUTUmxaolVrzHsak2cpyNKI7LkknsZe2dYGH9Pn9lD-YKZ7_5___f53T___9_-39z3_9f___d9_-__-vjfV599n_v9fV_7_9nf_____-_-___4IQQ_AJMNS8gC7EscGTSMIoQQIwrCQqAUAFFAMLRFYAODgp2VgEuoIWACAVARgRAgxBRgwCAAACAJCIgJACwQCIAiAQAAgARAIQAETAILACwMAgAFANCxACgAECQgyICI5TAgIkSiglsrEEoK9jTCAOssAKBRGRUACJAAASAgJCwcxwBICXCyQJMULwAw0AGAAIIlCIAMAAQRKFQAYAAgiUA"),
cookie("GUCS", "AR0nzQVM"),
cookie("GUC", "AQABBwFimlxjZUIcxQRM"),
cookie("PRF","t%3DVFIAX"),
cookie("thamba","1"),
cookie("A1", "d=AQABBNAVmWICEEFBM1xh-RmAmPpJJIsAz3YFEgABBwFcmmJlY_bPb2UB9iMAAAcIzhWZYm7SAIg&S=AQAAAucqV1HMdCsRf6key1gdaFs"),
cookie("A1S", "d=AQABBNAVmWICEEFBM1xh-RmAmPpJJIsAz3YFEgABBwFcmmJlY_bPb2UB9iMAAAcIzhWZYm7SAIg&S=AQAAAucqV1HMdCsRf6key1gdaFs&j=GDPR"),
cookie("A3", "d=AQABBNAVmWICEEFBM1xh-RmAmPpJJIsAz3YFEgABBwFcmmJlY_bPb2UB9iMAAAcIzhWZYm7SAIg&S=AQAAAucqV1HMdCsRf6key1gdaFs")
]
try:
@@ -176,6 +180,7 @@ class Yahoo(BaseClient):
price = results['price']
quoteType = results['quoteType']
summaryDetail = results['summaryDetail']
defaultKeyStatistics = results['defaultKeyStatistics'] if 'defaultKeyStatistics' in results else dict()
if not price:
return 'Could not find price for \'{}\''.format(ticker)
@@ -203,6 +208,8 @@ class Yahoo(BaseClient):
tick[Datacode.DIV_YIELD] = float(raw(summaryDetail, 'dividendYield'))
tick[Datacode.EX_DIV_DATE] = self.save_wrapper(
lambda: dateutil.parser.parse(str(fmt(summaryDetail, 'exDividendDate')), yearfirst=True, dayfirst=False).date())
tick[Datacode.SHARES_OUT] = float(raw(defaultKeyStatistics, 'sharesOutstanding'))
tick[Datacode.FREE_FLOAT] = float(raw(defaultKeyStatistics, 'floatShares'))
tick[Datacode.PAYOUT_RATIO] = float(raw(summaryDetail, 'payoutRatio'))
tick[Datacode.LOW_52_WEEK] = float(raw(summaryDetail, 'fiftyTwoWeekLow'))
+1 -1
View File
@@ -14,7 +14,7 @@ import os
cur_dir = os.getcwd()
addin_id = "com.financials.getinfo"
addin_version = "3.0.3"
addin_version = "3.0.7"
addin_displayname = "Financial Market Extension"
addin_publisher_link = "https://github.com/cmallwitz/Financials-Extension"
addin_publisher_name = "The Publisher"
+17 -5
View File
@@ -70,6 +70,12 @@ class Test(unittest.TestCase):
s = financials.getRealtime('IBM:NYQ', 'EPS', 'FT')
self.assertEqual(float, type(s), 'test_US_equity EPS {}'.format(s))
s = financials.getRealtime('IBM:NYQ', 'SHARES_OUT', 'FT')
self.assertEqual(float, type(s), 'test_US_equity SHARES_OUT {}'.format(s))
s = financials.getRealtime('IBM:NYQ', 'FREE_FLOAT', 'FT')
self.assertEqual(float, type(s), 'test_US_equity FREE_FLOAT {}'.format(s))
s = financials.getRealtime('IBM:NYQ', 'PE_RATIO', 'FT')
self.assertEqual(float, type(s), 'test_US_equity PE_RATIO {}'.format(s))
@@ -96,7 +102,7 @@ class Test(unittest.TestCase):
s = financials.getRealtime('IBM:NYQ', 'INDUSTRY', 'FT')
self.assertEqual(str, type(s), 'test_US_equity INDUSTRY {}'.format(s))
self.assertEqual(s, 'Software & Computer Services', 'test_US_equity INDUSTRY {}'.format(s))
self.assertEqual(s, 'Software and Computer Services', 'test_US_equity INDUSTRY {}'.format(s))
# may fail (s is None) on weekends when date/time displayed doesn't have time component with TZ
s = financials.getRealtime('IBM:NYQ', 'TIMEZONE', 'FT')
@@ -202,7 +208,7 @@ class Test(unittest.TestCase):
s = financials.getRealtime('SAPX:GER', 'INDUSTRY', 'FT')
self.assertEqual(str, type(s), 'test_DE_equity INDUSTRY {}'.format(s))
self.assertEqual('Software & Computer Services', s, 'test_DE_equity INDUSTRY {}'.format(s))
self.assertEqual('Software and Computer Services', s, 'test_DE_equity INDUSTRY {}'.format(s))
s = financials.getRealtime('SAPX:GER', 'LAST_PRICE_DATE', 'FT')
self.assertEqual(str, type(s), 'test_DE_equity LAST_PRICE_DATE {}'.format(s))
@@ -217,6 +223,12 @@ class Test(unittest.TestCase):
s = financials.getRealtime('SAPX:GER', 'EPS', 'FT')
self.assertEqual(float, type(s), 'test_DE_equity EPS {}'.format(s))
s = financials.getRealtime('SAPX:GER', 'SHARES_OUT', 'FT')
self.assertEqual(float, type(s), 'test_DE_equity SHARES_OUT {}'.format(s))
s = financials.getRealtime('SAPX:GER', 'FREE_FLOAT', 'FT')
self.assertEqual(float, type(s), 'test_DE_equity FREE_FLOAT {}'.format(s))
s = financials.getRealtime('SAPX:GER', 'PE_RATIO', 'FT')
self.assertEqual(float, type(s), 'test_DE_equity PE_RATIO {}'.format(s))
@@ -231,7 +243,7 @@ class Test(unittest.TestCase):
self.assertTrue(testutils.is_date(s), 'test_DE_equity EX_DIV_DATE {}'.format(s))
s = financials.getRealtime('ISHAX:GER', 'NAME', 'FT')
self.assertEqual('Intershop Communications AG', s, 'test_DE_equity NAME {}'.format(s))
self.assertEqual('INTERSHOP Communications AG', s, 'test_DE_equity NAME {}'.format(s))
s = financials.getRealtime('ISHAX:GER', 'BETA', 'FT')
self.assertTrue(testutils.is_positive_float(s), 'test_DE_equity BETA {}'.format(s))
@@ -263,7 +275,7 @@ class Test(unittest.TestCase):
s = financials.getRealtime('NOVO B:CPH', 'industry', 'FT')
self.assertEqual(str, type(s), 'test_DK_equity INDUSTRY {}'.format(s))
self.assertEqual('Pharmaceuticals & Biotechnology', s, 'test_DK_equity INDUSTRY {}'.format(s))
self.assertEqual('Pharmaceuticals and Biotechnology', s, 'test_DK_equity INDUSTRY {}'.format(s))
def test_TY_equity(self):
s = financials.getRealtime('6503:TYO', 'OPEN', 'FT')
@@ -328,7 +340,7 @@ class Test(unittest.TestCase):
s = financials.getRealtime('DELT:TLV', 'SECTOR', 'FT')
self.assertEqual(str, type(s), 'test_TlV_equity SECTOR {}'.format(s))
self.assertEqual('Consumer Goods', s, 'test_TY_equity SECTOR {}'.format(s))
self.assertEqual('Consumer Discretionary', s, 'test_TY_equity SECTOR {}'.format(s))
s = financials.getRealtime('DELT:TLV', 'INDUSTRY', 'FT')
self.assertEqual(str, type(s), 'test_TlV_equity INDUSTRY {}'.format(s))
+18 -11
View File
@@ -106,6 +106,12 @@ class Test(unittest.TestCase):
s = financials.getRealtime('IBM', Datacode.PAYOUT_RATIO.value, 'YAHOO')
self.assertTrue(testutils.is_positive_float(s), 'test_realtime_US_equity PAYOUT_RATIO {}'.format(s))
s = financials.getRealtime('IBM', Datacode.SHARES_OUT.value, 'YAHOO')
self.assertTrue(testutils.is_positive_float(s), 'test_realtime_US_equity SHARES_OUT {}'.format(s))
s = financials.getRealtime('IBM', Datacode.FREE_FLOAT.value, 'YAHOO')
self.assertTrue(testutils.is_positive_float(s), 'test_realtime_US_equity FREE_FLOAT {}'.format(s))
s = financials.getRealtime('IBM', Datacode.EXCHANGE.value, 'YAHOO')
self.assertEqual(s, 'NYQ', 'test_realtime_US_equity EXCHANGE')
@@ -169,12 +175,11 @@ class Test(unittest.TestCase):
self.assertEqual(float, type(s), 'test_realtime_UK_ETF LAST_PRICE {}'.format(s))
s = financials.getRealtime('VERX.L', Datacode.TIMEZONE.value, 'YAHOO')
self.assertEqual(s, 'Europe/London', 'test_realtime_UK_ETF TIMEZONE {}'.format(s))
self.assertEqual('Europe/London', s, 'test_realtime_UK_ETF TIMEZONE {}'.format(s))
s = financials.getRealtime('CSP1.L', Datacode.NAME.value, 'YAHOO')
self.assertEqual(str, type(s), 'test_realtime_UK_ETF NAME {}'.format(s))
self.assertEqual(s, 'iShares VII Public Limited Company - iShares Core S&P 500 UCITS ETF',
'test_realtime_UK_ETF NAME {}'.format(s))
self.assertEqual('iShares Core S&P 500 UCITS ETF USD (Acc)', s, 'test_realtime_UK_ETF NAME {}'.format(s))
def test_realtime_DE_equity(self):
@@ -182,11 +187,11 @@ class Test(unittest.TestCase):
self.assertEqual(float, type(s), 'test_realtime_DE_equity LAST_PRICE {}'.format(s))
s = financials.getRealtime('SAP.DE', Datacode.TIMEZONE.value, 'YAHOO')
self.assertEqual(s, 'Europe/Berlin', 'test_realtime_DE_equity TIMEZONE {}'.format(s))
self.assertEqual('Europe/Berlin', s, 'test_realtime_DE_equity TIMEZONE {}'.format(s))
s = financials.getRealtime('SAP.DE', Datacode.SECTOR.value, 'YAHOO')
self.assertEqual(str, type(s), 'test_realtime_DE_equity SECTOR {}'.format(s))
self.assertEqual(s, 'Technology', 'test_realtime_DE_equity SECTOR {}'.format(s))
self.assertEqual('Technology', s, 'test_realtime_DE_equity SECTOR {}'.format(s))
s = financials.getRealtime('SAP.DE', Datacode.INDUSTRY.value, 'YAHOO')
self.assertEqual(str, type(s), 'test_realtime_DE_equity INDUSTRY {}'.format(s))
@@ -199,6 +204,9 @@ class Test(unittest.TestCase):
self.assertEqual(s, 'GER', 'test_realtime_DE_equity EXCHANGE')
def test_DK_equity(self):
s = financials.getRealtime('NOVO-B.CO', 'last_price', 'YAHOO')
self.assertEqual(float, type(s), 'test_DK_equity LAST_PRICE {}'.format(s))
s = financials.getRealtime('NOVO-B.CO', 'name', 'YAHOO')
self.assertEqual('Novo Nordisk A/S', s, 'test_DK_equity NAME {}'.format(s))
@@ -254,12 +262,12 @@ class Test(unittest.TestCase):
self.assertIsNone(s, 'test_historic_US_equity LAST_PRICE {}'.format(s))
s = financials.getHistoric('IBM', Datacode.CLOSE.value, '2017-01-03', 'YAHOO')
self.assertEqual(167.190002, s, 'test_historic_US_equity CLOSE {}'.format(s))
self.assertEqual(159.837479, s, 'test_historic_US_equity CLOSE {}'.format(s))
financials.yahoo.historicdata = {}
s = financials.getHistoric('IBM', Datacode.CLOSE.value, '2017-01-03', 'YAHOO')
self.assertEqual(167.190002, s, 'test_historic_US_equity CLOSE {}'.format(s))
self.assertEqual(159.837479, s, 'test_historic_US_equity CLOSE {}'.format(s))
directory = os.path.join(str(pathlib.Path.home()), '.financials-extension')
ibm = os.path.join(directory, 'yahoo-IBM.csv')
@@ -271,11 +279,10 @@ class Test(unittest.TestCase):
financials.yahoo.historicdata = {}
s = financials.getHistoric('IBM', Datacode.CLOSE.value, '2017-01-03', 'YAHOO')
self.assertEqual(167.190002, s, 'test_historic_US_equity CLOSE {}'.format(s))
self.assertEqual(159.837479, s, 'test_historic_US_equity CLOSE {}'.format(s))
# Note: quarterly dividend and splits will change past adjusted prices - will fail after the next dividend
s = financials.getHistoric('IBM', Datacode.ADJ_CLOSE.value, '2017-01-03', 'YAHOO')
self.assertEqual(136.249847, s, 'test_historic_US_equity ADJ_CLOSE {}'.format(s))
self.assertEqual(float, type(s), 'test_historic_US_equity ADJ_CLOSE {}'.format(s))
def test_historic_UK_ETF(self):
@@ -323,7 +330,7 @@ class Test(unittest.TestCase):
self.assertEqual(s, 82.889999, 'test_historic_DE_equity CLOSE {}'.format(s))
s = financials.getHistoric('C060.DE', Datacode.CLOSE.value, '2017-01-03', 'YAHOO')
self.assertEqual(s, 68.209999, 'test_historic_DE_equity CLOSE {}'.format(s))
self.assertEqual(s, 72.870003, 'test_historic_DE_equity CLOSE {}'.format(s))
def test_realtime_errors(self):