Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Kamil Dudka
cc78d99296 Resolves: #1507782 - update units_cur script from units-2.15 2017-10-31 12:20:24 +01:00
2 changed files with 345 additions and 1 deletions

336
units-2.15-units_cur Normal file
View file

@ -0,0 +1,336 @@
#!/usr/bin/python
#
# Version 4
# 2 October 2017
#
# Complete rewrite to use Yahoo YQL API due to removal of TimeGenie RSS feed.
# Switched to requests library using JSON. One program now runs under
# Python 2 or Python 3. Thanks to Ray Hamel for some help with this update.
# For Python 2 & 3 compatibility
from __future__ import absolute_import, division, print_function
# Normal imports
import requests
import codecs
from argparse import ArgumentParser
from collections import OrderedDict
from datetime import date
from os import linesep
from sys import exit, stderr, stdout
outfile_name = 'currency.units'
# The Yahoo API is excellent, but unfortunately requires we explicitly request
# each currency we want
#
currency = OrderedDict([
('ATS', ['austriaschilling', '1|13.7603 euro']),
('BEF', ['belgiumfranc', '1|40.3399 euro']),
('CYP', ['cypruspound', '1|0.585274 euro']),
('EEK', ['estoniakroon', '1|15.6466 euro # Equal to 1|8 germanymark']),
('FIM', ['finlandmarkka', '1|5.94573 euro']),
('FRF', ['francefranc', '1|6.55957 euro']),
('DEM', ['germanymark', '1|1.95583 euro']),
('GRD', ['greecedrachma', '1|340.75 euro']),
('IEP', ['irelandpunt', '1|0.787564 euro']),
('ITL', ['italylira', '1|1936.27 euro']),
('LVL', ['latvialats', '1|0.702804 euro']),
('LTL', ['lithuanialitas', '1|3.4528 euro']),
('LUF', ['luxembourgfranc', '1|40.3399 euro']),
('MTL', ['maltalira', '1|0.4293 euro']),
('SKK', ['slovakiakornua', '1|30.1260 euro']),
('SIT', ['sloveniatolar', '1|239.640 euro']),
('ESP', ['spainpeseta', '1|166.386 euro']),
('NLG', ['netherlandsguilder','1|2.20371 euro']),
('PTE', ['portugalescudo', '1|200.482 euro']),
('CVE', ['capeverdeescudo', '1|110.265 euro']),
('BGN', ['bulgarialev', '1|1.9558 euro']),
('BAM', ['bosniaconvertiblemark','germanymark']),
('KMF', ['comorosfranc', '1|491.96775 euro']),
('XOF', ['westafricanfranc', '1|655.957 euro']),
('XPF', ['cfpfranc', '1|119.33 euro']),
('XAF', ['centralafricancfafranc','1|655.957 euro']),
('AED', ['uaedirham','']),
('AFN', ['afghanafghani','']),
('ALL', ['albanialek','']),
('AMD', ['armeniadram','']),
('AOA', ['angolakwanza','']),
('ARS', ['argentinapeso','']),
('AUD', ['australiadollar','']),
('AWG', ['arubaflorin','']),
('AZN', ['azerbaijanmanat','']),
('BAM', ['bosniaconvertiblemark','']),
('BBD', ['barbadosdollar','']),
('BDT', ['bangladeshtaka','']),
('BGN', ['bulgarialev','']),
('BHD', ['bahraindinar','']),
('BIF', ['burundifranc','']),
('BMD', ['bermudadollar','']),
('BND', ['bruneidollar','']),
('BOB', ['boliviaboliviano','']),
('BRL', ['brazilreal','']),
('BSD', ['bahamasdollar','']),
('BTN', ['bhutanngultrum','']),
('BWP', ['botswanapula','']),
('BYN', ['belarusruble','']),
('BYR', ['oldbelarusruble','10000 BYN']),
('BZD', ['belizedollar','']),
('CAD', ['canadadollar','']),
('CDF', ['drcfranccongolais','']),
('CHF', ['swissfranc','']),
('CLP', ['chilepeso','']),
('CNY', ['chinayuan','']),
('COP', ['colombiapeso','']),
('CRC', ['costaricacolon','']),
('CUP', ['cubapeso','']),
('CVE', ['capeverdeescudo','']),
('CZK', ['czechkoruna','']),
('DJF', ['djiboutifranc','']),
('DKK', ['denmarkkrona','']),
('DOP', ['dominicanrepublicpeso','']),
('DZD', ['algeriadinar','']),
('EGP', ['egyptpound','']),
('ERN', ['eritreanakfa','']),
('ETB', ['ethiopianbirr','']),
('EUR', ['euro','']),
('FJD', ['fijidollar','']),
('FKP', ['falklandislandspound','']),
('GBP', ['ukpound','']),
('GEL', ['georgialari','']),
('GHS', ['ghanacedi','']),
('GIP', ['gibraltarpound','']),
('GMD', ['gambiadalasi','']),
('GNF', ['guineafranc','']),
('GTQ', ['guatemalaquetzal','']),
('GYD', ['guyanadollar','']),
('HKD', ['hongkongdollar','']),
('HNL', ['honduraslempira','']),
('HRK', ['croatiakuna','']),
('HTG', ['haitigourde','']),
('HUF', ['hungariaforint','']),
('IDR', ['indonesiarupiah','']),
('ILS', ['israelnewshekel','']),
('INR', ['indiarupee','']),
('IQD', ['iraqdinar','']),
('IRR', ['iranrial','']),
('ISK', ['icelandkrona','']),
('JMD', ['jamaicadollar','']),
('JOD', ['jordandinar','']),
('JPY', ['japanyen','']),
('KES', ['kenyaschilling','']),
('KGS', ['kyrgyzstansom','']),
('KHR', ['cambodiariel','']),
('KMF', ['comorosfranc','']),
('KPW', ['northkoreawon','']),
('KRW', ['southkoreawon','']),
('KWD', ['kuwaitdinar','']),
('KYD', ['caymanislandsdollar','']),
('KZT', ['kazakhstantenge','']),
('LAK', ['laokip','']),
('LBP', ['lebanonpound','']),
('LKR', ['srilankanrupee','']),
('LRD', ['liberiadollar','']),
('LTL', ['lithuanialita','']),
('LVL', ['latvialat','']),
('LYD', ['libyadinar','']),
('MAD', ['moroccodirham','']),
('MDL', ['moldovaleu','']),
('MGA', ['madagascarariary','']),
('MKD', ['macedoniadenar','']),
('MMK', ['myanmarkyat','']),
('MNT', ['mongoliatugrik','']),
('MOP', ['macaupataca','']),
('MRO', ['mauritaniaouguiya','']),
('MUR', ['mauritiusrupee','']),
('MVR', ['maldiverufiyaa','']),
('MWK', ['malawikwacha','']),
('MXN', ['mexicopeso','']),
('MYR', ['malaysiaringgit','']),
('MZN', ['mozambicanmetical','']),
('NAD', ['namibiadollar','']),
('NGN', ['nigerianaira','']),
('NIO', ['nicaraguacordobaoro','']),
('NOK', ['norwaykrone','']),
('NPR', ['nepalrupee','']),
('NZD', ['newzealanddollar','']),
('OMR', ['omanrial','']),
('PAB', ['panamabalboa','']),
('PEN', ['perunuevosol','']),
('PGK', ['papuanewguineakina','']),
('PHP', ['philippinepeso','']),
('PKR', ['pakistanrupee','']),
('PLN', ['polandzloty','']),
('PYG', ['paraguayguarani','']),
('QAR', ['qatarrial','']),
('RON', ['romanianewlei','']),
('RSD', ['serbiadinar','']),
('RUB', ['russiaruble','']),
('RWF', ['rwandafranc','']),
('SAR', ['saudiarabiariyal','']),
('SBD', ['solomonislandsdollar','']),
('SCR', ['seychellesrupee','']),
('SDG', ['sudanpound','']),
('SEK', ['swedenkrona','']),
('SGD', ['singaporedollar','']),
('SHP', ['sainthelenapound','']),
('SLL', ['sierraleoneleone','']),
('SOS', ['somaliaschilling','']),
('SRD', ['surinamedollar','']),
('STD', ['saotome&principedobra','']),
('SVC', ['elsalvadorcolon','']),
('SYP', ['syriapound','']),
('SZL', ['swazilandlilangeni','']),
('THB', ['thailandbaht','']),
('TJS', ['tajikistansomoni','']),
('TMT', ['turkmenistanmanat','']),
('TND', ['tunisiadinar','']),
('TOP', ["tongapa'anga",'']),
('TRY', ['turkeylira','']),
('TTD', ['trinidadandtobagodollar','']),
('TWD', ['taiwandollar','']),
('TZS', ['tanzaniashilling','']),
('UAH', ['ukrainehryvnia','']),
('UGX', ['ugandaschilling','']),
('UYU', ['uruguaypeso','']),
('UZS', ['uzbekistansum','']),
('VEF', ['venezuelabolivar','']),
('VEB', ['venezuelaoldbolivar', '1000 VEF']),
('VND', ['vietnamdong','']),
('VUV', ['vanuatuvatu','']),
('WST', ['samoatala','']),
('XAF', ['centralafricancfafranc','']),
('XCD', ['eastcaribbeandollar','']),
('XDR', ['specialdrawingrights','']),
('YER', ['yemenrial','']),
('ZAR', ['southafricarand','']),
('ZMW', ['zambiakwacha','']),
('ZWL', ['zimbabwedollar','']),
])
ap = ArgumentParser(
description="Update currency information for 'units' "
"into the specified filename or if no filename is "
"given, the default: '{}'. The special filename '-' "
"will send the currency data to stdout.".format(outfile_name),
)
ap.add_argument(
'output_file',
default=outfile_name,
help='the file to update',
metavar='filename',
nargs='?',
type=str,
)
ap.add_argument('-v','--verbose',
action='store_true',
help='display details when fetching currency data',
)
outfile_name = ap.parse_args().output_file
verbose = ap.parse_args().verbose
try:
res = requests.get('http://finance.yahoo.com/webservice/v1/symbols'
'/allcurrencies/quote?format=json')
res.raise_for_status()
webdata = res.json()['list']['resources']
except requests.exceptions.RequestException as e:
stderr.write('Error connecting to currency server:\n{}.\n'.
format(e))
exit(1)
rates = [ data['resource']['fields']['price'] for data in webdata]
codes = [ data['resource']['fields']['symbol'][0:3] for data in webdata]
rate_index = 1
for (code,rate) in zip(codes,rates):
if code not in currency.keys():
if (verbose):
stderr.write('Got unknown currency with code {}\n'.format(code))
else:
if not currency[code][rate_index]:
currency[code][rate_index] = '1|{} US$'.format(rate)
elif verbose:
stderr.write('Got value "{}" for currency "{}" but '
'it is already defined\n'.format(rate, code))
# Delete currencies where we have no rate data
for code in currency.keys():
if not currency[code][rate_index]:
if verbose:
stderr.write('No data for {}'.format(code))
del currency[code]
try:
req = requests.get('http://services.packetizer.com/spotprices/?f=json')
req.raise_for_status()
metals = req.json()
except requests.exceptions.RequestException as e:
stderr.write('Error connecting to spotprices server:\n{}\n'.format(e))
exit(1)
del metals['date']
try:
req = requests.get('http://services.packetizer.com/btc/?f=json')
req.raise_for_status()
bitcoin = req.json()
except requests.exceptions.RequestException as e:
stderr.write('Error connecting to bitcoin server:\n{}\n'.format(e))
exit(1)
cnames = [currency[code][0] for code in currency.keys()]
crates = [currency[code][1] for code in currency.keys()]
codestr = '\n'.join('{:23}{}'.
format(code, name) for (code,name) in zip(currency.keys(), cnames))
datestr = date.today().isoformat()
maxlen = max(len(name) for name in cnames) + 2
ratestr = '\n'.join(
'{:{}}{}'.format(name, maxlen, rate) for (name, rate) in zip(cnames, crates)
)
ozzystr = '\n'.join('{:19}{} US$/troyounce'.format(
metal + 'price',
price,
) for metal, price in metals.items())
bitcoinstr = '{:{}}{} US$ # From services.packetizer.com/btc\n'.format(
'bitcoin',maxlen,bitcoin['usd'])
outstr = (
"""# ISO Currency Codes
{codestr}
# Currency exchange rates from Yahoo Finance (finance.yahoo.com)
!message Currency exchange rates from finance.yahoo.com on {datestr}
{ratestr}
{bitcoinstr}
# Precious metals prices from Packetizer (services.packetizer.com/spotprices)
{ozzystr}
""".format(codestr=codestr, datestr=datestr, ratestr=ratestr, ozzystr=ozzystr,
bitcoinstr=bitcoinstr)
).replace('\n', linesep)
try:
if outfile_name == '-':
codecs.StreamReader(stdout, codecs.getreader('utf8')).write(outstr)
else:
with codecs.open(outfile_name, 'w', 'utf8') as of:
of.write(outstr)
except IOError as e:
stderr.write('Unable to write to output file:\n{}\n'.format(e))
exit(1)

View file

@ -1,7 +1,7 @@
Summary: A utility for converting amounts from one unit to another
Name: units
Version: 2.13
Release: 3%{?dist}
Release: 4%{?dist}
Source: ftp://ftp.gnu.org/gnu/units/%{name}-%{version}.tar.gz
URL: http://www.gnu.org/software/units/units.html
License: GPLv3+
@ -16,6 +16,9 @@ BuildRequires: readline-devel
# used by the units_cur script
Requires: python-unidecode
# units_cur script taken from units-2.15
Source1: units-2.15-units_cur
%description
Units converts an amount from one unit to another, or tells you what
mathematical operation you need to perform to convert from one unit to
@ -24,6 +27,8 @@ well as conversions such as Fahrenheit to Celsius.
%prep
%setup -q
install -p -m0755 %{SOURCE1} units_cur2
touch units_cur3
%build
%configure
@ -59,6 +64,9 @@ fi
%{_mandir}/man1/*
%changelog
* Tue Oct 31 2017 Kamil Dudka <kdudka@redhat.com> - 2.13-4
- update units_cur script from units-2.15 (#1507782)
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 2.13-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild