nordea 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ doc/*
6
+ coverage/*
@@ -0,0 +1,5 @@
1
+ script: "bundle exec rake spec"
2
+ rvm:
3
+ - 1.9.2
4
+ notifications:
5
+ disable: true
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in nordea.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2011 by Matias Korhonen
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,94 @@
1
+ The Nordea Gem
2
+ ==============
3
+
4
+ _________________________________
5
+ < Exchange rates from Nordea Bank >
6
+ ---------------------------------
7
+ \ ^__^
8
+ \ (€€)\_______
9
+ (__)\ )\/\
10
+ ||----w |
11
+ || ||
12
+
13
+
14
+ Installation
15
+ ------------
16
+
17
+ Just like any other gem:
18
+
19
+ gem install nordea
20
+
21
+
22
+ Usage
23
+ -----
24
+
25
+ ### With the Money gem
26
+
27
+ The Money gem integration works in a similar way to the [eu\_central\_bank](https://github.com/RubyMoney/eu_central_bank) library, mostly because I referenced that gem while building this one. A couple of the methods in the Nordea::Bank class are pretty much identical to those in the eu\_central\_bank gem.
28
+
29
+ nordea_bank = Nordea::Bank.new
30
+ Money.default_bank = nordea_bank
31
+
32
+ # Exchange 100 EUR to USD
33
+ nordea_bank.exchange(100, "EUR", "USD")
34
+
35
+ # Exchange 100 USD to South African rands
36
+ Money.us_dollar(100).exchange_to("ZAR")
37
+
38
+ # Exchange 100 Canadian dollars to US dollars
39
+ nordea_bank.exchange_with(Money.new(100, "CAD"), "USD")
40
+
41
+ # Update the forex rates
42
+ nordea_bank.update_rates
43
+
44
+ ### Without the Money gem
45
+
46
+ exchange_rates = Nordea::ExchangeRates.new
47
+
48
+ exchange_rates.currencies
49
+ #=> returns a hash of currencies
50
+
51
+ exchange_rates.currencies(true)
52
+ #=> returns a hash of currencies, but forces a data update
53
+
54
+ exchange_rates.headers
55
+ #=> returns a hash of the data headers from Nordea
56
+
57
+ For more information, read the [documentation](http://rubydoc.info/gems/nordea).
58
+
59
+
60
+ Travis CI Build Status
61
+ ----------------------
62
+
63
+ Currently the gem only fully works with Ruby 1.9.2.
64
+
65
+ [![Build Status](http://travis-ci.org/k33l0r/nordea.png)](http://travis-ci.org/k33l0r/nordea)
66
+
67
+
68
+ About the data and data source
69
+ ------------------------------
70
+
71
+ Nordea quotes exchange rates on national banking days at least three times a day:
72
+
73
+ * in the morning at 8.00,
74
+ * at noon at 12.15 and
75
+ * in the afternoon at 16.15 (approximate times).
76
+
77
+ ### Useful links:
78
+
79
+ * [More information about Nordea exchange rates](http://j.mp/Nordea_exchange_rates)
80
+ * [More information about the data format](http://j.mp/Rates_for_electronic_processing) [PDF]
81
+
82
+ ### Disclaimer
83
+
84
+ * This is **not** an *official* gem from Nordea.
85
+ * I have **no affiliation** to any entity connected to Nordea Bank.
86
+ * I **do not** have any control over the exchange rate data provided, and you use
87
+ this gem entirely at **your own risk**.
88
+
89
+ License
90
+ -------
91
+
92
+ MIT License. Copyright 2011 Matias Korhonen.
93
+
94
+ See the LICENSE file for more details.
@@ -0,0 +1,12 @@
1
+ # encoding: UTF-8
2
+ require "bundler/gem_tasks"
3
+
4
+ require "rake"
5
+ require "rake/task"
6
+
7
+ require "rspec/core"
8
+ require "rspec/core/rake_task"
9
+
10
+ RSpec::Core::RakeTask.new(:spec)
11
+
12
+ task :default => :spec
@@ -0,0 +1,37 @@
1
+ require "nordea/bank"
2
+ require "nordea/exchange_rates"
3
+ require "nordea/version"
4
+
5
+ # Ruby interface to the Nordea Bank exchange rate data.
6
+ module Nordea
7
+ # Parses the datetime format used in the Nordea data.
8
+ #
9
+ # @example
10
+ # Nordea.parse_time("20150101120056") #=> 2015-01-01 12:00:05 +0200
11
+ #
12
+ # @param [String] the datetime string (YYYYMMDDHHmmSS)
13
+ # @return [Time] the string converted into a Time object
14
+ def self.parse_time(datetime)
15
+ Time.new(datetime[0..3].to_i,
16
+ datetime[4..5].to_i,
17
+ datetime[6..7].to_i,
18
+ datetime[8..9].to_i,
19
+ datetime[10..11].to_i,
20
+ datetime[11..12].to_i,
21
+ "+03:00")
22
+ rescue
23
+ nil
24
+ end
25
+
26
+ # Parses the date format used in the Nordea data.
27
+ #
28
+ # @param [String] the date string (YYYYMMDD)
29
+ # @return [Date] the string converted into a Date object
30
+ def self.parse_date(date)
31
+ Date.new(date[0..3].to_i,
32
+ date[4..5].to_i,
33
+ date[6..7].to_i)
34
+ rescue
35
+ nil
36
+ end
37
+ end
@@ -0,0 +1,95 @@
1
+ require "money"
2
+ require "nordea/exchange_rates"
3
+
4
+ module Nordea
5
+ # Bank implementation for use with the Money gem.
6
+ #
7
+ # @example
8
+ # nordea_bank = Nordea::Bank.new
9
+ # Money.default_bank = nordea_bank
10
+ # nordea_bank.exchange(100, "EUR", "USD")
11
+ # Money.us_dollar(100).exchange_to("ZAR")
12
+ # nordea_bank.exchange_with(Money.new(100, "CAD"), "USD")
13
+ class Bank < Money::Bank::VariableExchange
14
+ def initialize
15
+ super
16
+ update_rates
17
+ end
18
+
19
+ # Get updated rates from the Nordea server
20
+ #
21
+ # Forces an update of the exchange rates
22
+ #
23
+ # @return [Hash] rates available
24
+ def update_rates
25
+ currencies(true).each_pair do |currency, data|
26
+ rate = data[:middle_rate_for_commercial_transactions]
27
+ add_rate("EUR", currency, rate) if known_currencies.include?(currency)
28
+ end
29
+ rates
30
+ end
31
+
32
+ # Exchange from one currency to another
33
+ #
34
+ # @example
35
+ # nordea_bank = Nordea::Bank.new
36
+ # nordea_bank.exchange(100, "EUR", "USD")
37
+ #
38
+ # @param [Integer] cents the amount for the conversion in cents, or equivalent
39
+ # @param [String] from_currency the source currency
40
+ # @param [String] to_currency the target currency
41
+ # @return [Money] the result of the conversion
42
+ def exchange(cents, from_currency = "EUR", to_currency = "EUR")
43
+ exchange_with(Money.new(cents, from_currency), to_currency)
44
+ end
45
+
46
+ # Exchanges the given +Money+ object to a new +Money+ object in
47
+ # +to_currency+.
48
+ #
49
+ # @example
50
+ # nordea_bank = Nordea::Bank.new
51
+ # nordea_bank.exchange_with(Money.new(100, "CAD"), "USD")
52
+ #
53
+ # @param [Money] from the Money object from which to convert
54
+ # @param [String] to_currency the ISO code for the target currency
55
+ # @return [Money] the new Money object in the target currency
56
+ def exchange_with(from, to_currency)
57
+ rate = get_rate(from.currency, to_currency)
58
+ unless rate
59
+ from_base_rate = get_rate("EUR", from.currency)
60
+ to_base_rate = get_rate("EUR", to_currency)
61
+ rate = to_base_rate / from_base_rate
62
+ end
63
+ Money.new((from.cents * rate).round, to_currency)
64
+ end
65
+
66
+ # Initialize or use an existing Nordea::ExchangeRates object
67
+ #
68
+ # @return [ExchangeRates] an instance of Nordea::ExchangeRates
69
+ def exchange_rates
70
+ @exchange_rates ||= Nordea::ExchangeRates.new
71
+ end
72
+
73
+ # Get the currency data from Nordea
74
+ #
75
+ # @param [Boolean] force force an update of the currency data
76
+ # @return [Hash] Data for all the currencies and rates from Nordea
77
+ def currencies(force = false)
78
+ exchange_rates.currencies(force)
79
+ end
80
+
81
+ # List all currencies known to the money gem
82
+ #
83
+ # @return [Array<String>] ISO currency codes
84
+ def money_currencies
85
+ Money::Currency::TABLE.keys.map { |c| c.to_s.upcase }
86
+ end
87
+
88
+ # List currencies found in the Money gem *and* the Nordea currency data
89
+ #
90
+ # @return [Array<String>] ISO currency codes
91
+ def known_currencies
92
+ @known_currencies = money_currencies & exchange_rates.currencies.keys
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,213 @@
1
+ # encoding: UTF-8
2
+ require "net/http"
3
+ require "uri"
4
+ require "time"
5
+ require "date"
6
+
7
+ module Nordea
8
+ # Fetch and update Excahnge rates from Nordea Bank.
9
+ #
10
+ # Parses the custom dataformat used by Nordea into more useful Ruby types and
11
+ # objects.
12
+ class ExchangeRates
13
+ # URI to the machine readable data file.
14
+ DATA_URI = URI::HTTP.build({
15
+ :host => "service.nordea.com",
16
+ :path => "/nordea-openpages/fi/lists/currency/elelctronicExchangeFI.dat"
17
+ })
18
+
19
+ # Hash keys for key-value pairs that should be converted into floats.
20
+ FLOAT_KEYS = [
21
+ :middle_rate_for_commercial_transactions,
22
+ :buying_rate_for_commercial_transactions,
23
+ :selling_rate_for_commercial_transactions,
24
+ :buying_rate_for_cash,
25
+ :selling_rate_for_cash
26
+ ]
27
+
28
+ # Initialize a new Nordea::ExchangeRates object.
29
+ def initialize
30
+ end
31
+
32
+ # The batch headers
33
+ #
34
+ # @return [Hash] key-value pairs
35
+ # @param [Boolean] force force update
36
+ def headers(force = false)
37
+ header_line = lines(force).first
38
+
39
+ headers = {
40
+ :file_id => header_line[0..3], # File ID = VK01
41
+ :record_id => header_line[4..6], # Record ID = 000
42
+ :change_time => header_line[7..20], # Exchange rate change time
43
+ :notifications => header_line[21..140], # Notifications
44
+ :reserved => header_line[141..149] # Reserved
45
+ }
46
+
47
+ headers[:change_time] = Nordea.parse_time(headers[:change_time])
48
+ headers[:notifications].strip! if headers[:notifications].respond_to? :strip!
49
+ headers[:reserved].strip! if headers[:reserved].respond_to? :strip!
50
+ headers
51
+ end
52
+
53
+ # List all currencies as a hash. Uses the currencies' ISO codes as keys.
54
+ #
55
+ # @example
56
+ # e = Nordea::ExchangeRates.new #=> #<Nordea::ExchangeRates:0x00000102102888>
57
+ # e.currencies["USD"] #=> {
58
+ # # :file_id => "VK01",
59
+ # # :record_id => "001",
60
+ # # :quotation_time => 2011-06-17 15:50:01 +0300,
61
+ # # :rate_type => :list,
62
+ # # :currency_iso_code => "USD",
63
+ # # :counter_currency_iso_code => "EUR",
64
+ # # :middle_rate_for_commercial_transactions => 1.427,
65
+ # # :buying_rate_for_commercial_transactions => 1.442,
66
+ # # :selling_rate_for_commercial_transactions => 1.412,
67
+ # # :buying_rate_for_cash => 1.459,
68
+ # # :selling_rate_for_cash => 1.395,
69
+ # # :direction_of_change => "-",
70
+ # # :currency_convertability => true,
71
+ # # :euro_area => false,
72
+ # # :euro_adoption_date => nil,
73
+ # # :currency_expiry => false,
74
+ # # :reserved => ""
75
+ # # }
76
+ #
77
+ # @param [Boolean] force force update
78
+ # @return [Hash] a hash off all list currency rates and their properties
79
+ def currencies(force = false)
80
+ hash = {}
81
+
82
+ records_array(force).each do |record|
83
+ hash[record[:currency_iso_code]] = record
84
+ end
85
+
86
+ hash
87
+ end
88
+
89
+ private
90
+
91
+ # Fetches the latest machine readable currency data from the Nordea server.
92
+ #
93
+ # Nordea quotes exchange rates on national banking days at least three times a day:
94
+ # * in the morning at 8.00,
95
+ # * at noon at 12.15 and
96
+ # * in the afternoon at 16.15 (approximate times).
97
+ #
98
+ # @see http://j.mp/Nordea_exchange_rates More information about Nordea exchange rates
99
+ # @see http://j.mp/Rates_for_electronic_processing More information about the data format
100
+ #
101
+ # @return [String] the raw data string.
102
+ def fetch_data
103
+ res = Net::HTTP.start(DATA_URI.host, DATA_URI.port) do |http|
104
+ http.get(DATA_URI.path, { "USER_AGENT" => "Nordea::Bank gem" })
105
+ end
106
+
107
+ if res.code =~ /2\d\d/
108
+ res.body
109
+ else
110
+ raise ServerError, "The server did not respond in the manner in which we are accustomed to."
111
+ end
112
+ end
113
+
114
+ # The raw machine readable data split into lines.
115
+ #
116
+ # @return [Array<String>] the raw data split into lines
117
+ # @param [Boolean] force force update
118
+ # @see #raw_data
119
+ def lines(force = false)
120
+ raw_data(force).lines.to_a
121
+ end
122
+
123
+ # The raw machine readable data from Nordea.
124
+ #
125
+ # If the data has already been fetched, it will return it. If not, a call
126
+ # will be made to the Nordea server.
127
+ #
128
+ # @param [Boolean] force force update
129
+ # @return [String] the raw data string
130
+ # @see #fetch_data
131
+ def raw_data(force = false)
132
+ if force
133
+ @raw_data = fetch_data
134
+ else
135
+ @raw_data ||= fetch_data
136
+ end
137
+ end
138
+
139
+ # The data entries as an array of hashes with minimal processing.
140
+ #
141
+ # @return [Array<Hash>] Array of exchange rate records
142
+ # @param [Boolean] force force update
143
+ def records_array(force = false)
144
+ all = lines(force)[1..(lines.length - 1)].map do |line|
145
+ hash = {
146
+ :file_id => line[0..3], # File ID (= VK01)
147
+ :record_id => line[4..6], # Record ID (= 000)
148
+ :quotation_time => line[7..20], # Quotation date
149
+ :rate_type => line[21..24], # Rate type ( 0001 = list, 0002 = valuation)
150
+ :currency_iso_code => line[25..27], # Currency ISO code
151
+ :counter_currency_iso_code => line[28..30], # Counter currency ISO code (= EUR)
152
+ :middle_rate_for_commercial_transactions => line[31..43], # Middle rate for commercial transactions
153
+ :buying_rate_for_commercial_transactions => line[44..56], # Buying rate for commercial transactions
154
+ :selling_rate_for_commercial_transactions => line[57..69], # Selling rate for commercial transactions
155
+ :buying_rate_for_cash => line[70..82], # Buying rate for cash
156
+ :selling_rate_for_cash => line[83..95], # Selling rate for cash
157
+ :direction_of_change => line[96..96], # Direction of change from previous value ("+", "-" or blank)
158
+ :currency_convertability => line[97..97], # K = convertible, E = non-convertible
159
+ :euro_area => line[98..98], # 1 = euro area currency, 0 = non-euro area currency
160
+ :euro_adoption_date => line[99..99], # Euro adoption date
161
+ :currency_expiry => line[100..107], # K = in use, E = not in use
162
+ :reserved => line[108..149] # Reserved
163
+ }
164
+
165
+ line_postprocess(hash)
166
+ end
167
+
168
+ list_rates = all.select do |rate|
169
+ rate[:rate_type] == :list
170
+ end
171
+
172
+ list_rates
173
+ end
174
+
175
+ # Converts the string values from the Nordea data into Ruby objects where
176
+ # possible.
177
+ #
178
+ # @param [Hash] line a line from the data as a Hash
179
+ # @return [Hash] the same line with some values converted into the
180
+ # expected formats
181
+ def line_postprocess(line)
182
+ line[:quotation_time] = Nordea.parse_time(line[:quotation_time])
183
+ line[:reserved].strip! if line[:reserved].respond_to? :strip!
184
+ line[:rate_type] = if line[:rate_type] == "0001"
185
+ :list
186
+ elsif line[:rate_type] == "0002"
187
+ :valuation
188
+ end
189
+
190
+ line[:euro_area] = (line[:euro_area] == "1") ? true : false
191
+
192
+ if line[:euro_area]
193
+ line[:euro_adoption_date] = Nordea.parse_date(line[:euro_adoption_date])
194
+ else
195
+ line[:euro_adoption_date] = nil
196
+ end
197
+
198
+ line[:currency_expiry] = (line[:currency_expiry] == "K") ? true : false
199
+ line[:currency_convertability] = (line[:currency_convertability] == "K") ? true : false
200
+
201
+ FLOAT_KEYS.each do |key|
202
+ str = line[key]
203
+ float = "#{str[0,6]}.#{str[6,7]}".to_f
204
+ line[key] = float
205
+ end
206
+
207
+ line
208
+ end
209
+ end
210
+
211
+ # The exception that's raised if the server doesn't respond correctly.
212
+ class ServerError < StandardError; end
213
+ end
@@ -0,0 +1,5 @@
1
+ # @version 1.0.0
2
+ module Nordea
3
+ # The gem version
4
+ VERSION = "1.0.0"
5
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "nordea/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "nordea"
7
+ s.version = Nordea::VERSION
8
+ s.authors = ["Matias Korhonen"]
9
+ s.email = ["matias@kiskolabs.com"]
10
+ s.homepage = "http://github.com/k33l0r/nordea"
11
+ s.summary = %q{Exchange rates from Nordea Bank}
12
+ s.description = %q{A Money.gem compatible currency exchange rate implementation for Nordea Bank}
13
+
14
+ s.rubyforge_project = "nordea"
15
+
16
+ s.add_dependency "money", "~> 3.7.1"
17
+
18
+ s.add_development_dependency "yard"
19
+ s.add_development_dependency "rspec"
20
+ s.add_development_dependency "webmock"
21
+ s.add_development_dependency "awesome_print"
22
+ s.add_development_dependency "simplecov"
23
+ s.add_development_dependency "rake", "~> 0.9.2"
24
+
25
+ s.files = `git ls-files`.split("\n")
26
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
27
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
28
+ s.require_paths = ["lib"]
29
+ end
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe "Nordea::Bank" do
4
+ before(:each) do
5
+ stub_request(:get, "http://service.nordea.com/nordea-openpages/fi/lists/currency/elelctronicExchangeFI.dat").
6
+ to_return(:status => 200, :body => SampleData.raw)
7
+ @bank = Nordea::Bank.new
8
+ Money.default_bank = @bank
9
+ end
10
+
11
+ context "#exchange" do
12
+ it "returns the correct exchange rates" do
13
+ @bank.known_currencies.each do |currency|
14
+ @bank.exchange(100, "EUR", currency).cents.should == (SampleData.get_rate(currency) * 100).round
15
+ end
16
+ end
17
+ end
18
+
19
+ context "#exchange_with" do
20
+ it "returns the correct exchange rates" do
21
+ @bank.known_currencies.each do |currency|
22
+ @bank.exchange_with(Money.new(100, "EUR"), currency).cents.should == (SampleData.get_rate(currency) * 100).round
23
+ end
24
+ end
25
+ end
26
+
27
+ context "#exchange_rates" do
28
+ it "is an instance of Nordea::ExchangeRates" do
29
+ @bank.exchange_rates.should be_an_instance_of(Nordea::ExchangeRates)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,76 @@
1
+ require "spec_helper"
2
+
3
+ describe "Nordea::ExchangeRates" do
4
+ before(:each) do
5
+ stub_request(:get, "http://service.nordea.com/nordea-openpages/fi/lists/currency/elelctronicExchangeFI.dat").
6
+ to_return(:status => 200, :body => SampleData.raw)
7
+ @exchange_rates = Nordea::ExchangeRates.new
8
+ end
9
+
10
+ context "#lines" do
11
+ it "returns the raw data as an array of lines" do
12
+ @exchange_rates.send(:lines).should be_kind_of(Array)
13
+ end
14
+
15
+ it "returns the correct number of lines" do
16
+ @exchange_rates.send(:lines).count.should == 221
17
+ end
18
+ end
19
+
20
+ context "#records_array" do
21
+ before(:each) do
22
+ @records = @exchange_rates.send(:records_array)
23
+ end
24
+
25
+ it "returns an array of hashes" do
26
+ @records.should be_kind_of(Array)
27
+ @records.each do |record|
28
+ record.should be_kind_of(Hash)
29
+ end
30
+ end
31
+
32
+ it "has the correct number of records" do
33
+ @records.length.should == SampleData.currencies.length
34
+ end
35
+
36
+ it "has the correct data" do
37
+ @records.each do |record|
38
+ currency = record[:currency_iso_code]
39
+ sample = SampleData.currencies[currency]
40
+
41
+ record.each_pair do |key, value|
42
+ value.should == sample[key]
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ context "#headers" do
49
+ before(:each) do
50
+ @headers = @exchange_rates.headers
51
+ end
52
+
53
+ it "returns a hash" do
54
+ @headers.should be_kind_of(Hash)
55
+ end
56
+
57
+ it "has the correct data" do
58
+ @headers = @exchange_rates.headers
59
+ @headers.each_pair do |key,value|
60
+ value.should == SampleData.headers[key]
61
+ end
62
+ end
63
+ end
64
+
65
+ context "#fetch_data" do
66
+ it "returns the raw data from the server if the request is successful" do
67
+ @exchange_rates.send(:fetch_data).should == SampleData.raw.read
68
+ end
69
+
70
+ it "raises an exception if the request is not successful" do
71
+ stub_request(:get, "http://service.nordea.com/nordea-openpages/fi/lists/currency/elelctronicExchangeFI.dat").
72
+ to_return(:status => 404, :body => SampleData.raw)
73
+ expect { @exchange_rates.send(:fetch_data) }.to raise_error Nordea::ServerError
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,18 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+
4
+ require "nordea"
5
+ require "webmock/rspec"
6
+
7
+ # Load support files
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
9
+
10
+ RSpec.configure do |config|
11
+ # Remove this line if you don't want RSpec's should and should_not
12
+ # methods or matchers
13
+ require 'rspec/expectations'
14
+ config.include RSpec::Matchers
15
+
16
+ # == Mock Framework
17
+ config.mock_with :rspec
18
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ module SampleData
4
+ CURRENCIES = Marshal.load(File.open(File.expand_path("../sample_currencies.marshal", __FILE__), "r"))
5
+ HEADERS = Marshal.load(File.open(File.expand_path("../sample_headers.marshal", __FILE__), "r"))
6
+
7
+ def self.raw
8
+ File.open(File.expand_path("../sample_electronic.dat", __FILE__), "r")
9
+ end
10
+
11
+ def self.currencies
12
+ CURRENCIES
13
+ end
14
+
15
+ def self.get_rate(currency)
16
+ CURRENCIES[currency][:middle_rate_for_commercial_transactions]
17
+ end
18
+
19
+ def self.headers
20
+ HEADERS
21
+ end
22
+ end
@@ -0,0 +1,221 @@
1
+ VK0100020110614154727Listakurssit alle 40.000 eur maksuille 14.06.11 15:47
2
+ VK01001199901010730000001EUREUR00000100000000000010000000000001000000000000100000000000010000000+K000000000K
3
+ VK01001201106141547190001USDEUR00000144480000000014598000000001429800000000147680000000014128000-K000000000K
4
+ VK01001201106141547140001JPYEUR00011591000000001179100000000113910000000012001000000001118100000-K000000000K
5
+ VK01001201106141547190001GBPEUR00000088100000000008910000000000871000000000090100000000008610000-K000000000K
6
+ VK01001201106141547190001SEKEUR00000911830000000092183000000009018300000000932330000000089133000+K000000000K
7
+ VK01001201106141547170001NOKEUR00000779650000000078965000000007696500000000797650000000076165000-K000000000K
8
+ VK01001201106141547130001DKKEUR00000745900000000074915000000007426500000000761700000000073010000+K000000000K
9
+ VK01001201106141547150001CHFEUR00000121160000000012241000000001199100000000124160000000011816000-K000000000K
10
+ VK01001201101011123110001EEKEUR00001564660000000156466000000015646600000001564660000000156466000+K120110101E
11
+ VK01001201106141547140001LVLEUR00000070860000000007185000000000698700000000073060000000006866000-K000000000K
12
+ VK01001201106141547130001LTLEUR00000345280000000034768000000003428800000000356280000000033428000+K000000000K
13
+ VK01001201106141547170001CADEUR00000140740000000014224000000001392400000000144040000000013744000-K000000000K
14
+ VK01001201106141547150001HKDEUR00001124560000000114556000000011035600000001168560000000106656000-K000000000K
15
+ VK01001201106141547190001AUDEUR00000135730000000013773000000001337300000000141730000000012973000+K000000000K
16
+ VK01001201106141547160001NZDEUR00000176630000000017828000000001749800000000183630000000016563000+K000000000K
17
+ VK01001201106141547120001ZAREUR00000975400000000100340000000009474000000001015400000000092240000-K000000000K
18
+ VK01001200801011056450001MTLEUR00000042930000000004293000000000429300000000042930000000004293000-K120080101E
19
+ VK01001201106141547150001SAREUR00000541945000000054914500000005347450000000568945000000051444500-K000000000K
20
+ VK01001201106141547120001MADEUR00001133760000000116626000000011012600000000000000000000000000000-K000000000K
21
+ VK01001201106141547170001KWDEUR00000039635000000004013500000000391350000000000000000000000000000-K000000000K
22
+ VK01001201106141547120001AEDEUR00000530825000000053592500000005257250000000557025000000050232500-K000000000K
23
+ VK01001201106141547170001SGDEUR00000178040000000018104000000001750400000000185240000000016934000+K000000000K
24
+ VK01001201106141547140001MYREUR00000437920000000000000000000000000000000000000000000000000000000-K000000000K
25
+ VK01001201106141547170001INREUR00006463700000000686370000000060637000000000000000000000000000000-K000000000K
26
+ VK01001200801011056420001CYPEUR00000058527400000005852740000000585274000000058527400000005852740+K120080101E
27
+ VK01001201106141547150001RUBEUR00004028880000000427888000000037788800000004338880000000367888000-K000000000K
28
+ VK01001201106141547170001CZKEUR00002411800000000244780000000023758000000002516800000000230680000+K000000000K
29
+ VK01001200901010000010001SKKEUR00003012600000000301260000000030126000000000000000000000000000000+K120090101E
30
+ VK01001201106141547120001PLNEUR00000393020000000040302000000003830200000000410020000000037602000-K000000000K
31
+ VK01001201106141547140001HUFEUR00026451000000002685100000000260510000000027396000000002539600000-K000000000K
32
+ VK01001201106141547160001THBEUR00004400900000000450090000000043009000000004650900000000415090000+K000000000K
33
+ VK01001201106141547170001KRWEUR00156404000000015910400000001537040000000163604000000014650400000-K000000000K
34
+ VK01001201106141547150001TNDEUR00000197894300000019889430000001968943000000000000000000000000000-K000000000K
35
+ VK01001201106141547160001XAUEUR00000009515700000001061570000000084157000000000000000000000000000+K000000000K
36
+ VK01001201106141547150001XYPEUR00000487530000000048883000000004862300000000000000000000000000000-K000000000K
37
+ VK01001201106141547140001UBFEUR00000474550000000047585000000004732500000000000000000000000000000-K000000000K
38
+ VK01001201106141547140001KOREUR00000533010000000053461000000005314100000000000000000000000000000-K000000000K
39
+ VK01001201106141547190001KOXEUR00000465990000000046749000000004644900000000000000000000000000000-K000000000K
40
+ VK01001201106141547170001XDREUR00000089430000000008953000000000893300000000000000000000000000000-K000000000K
41
+ VK01001199901011114430001FIMEUR00000594573000000059457300000005945730000000594573000000059457300 K119990101E
42
+ VK01001199901011114430001DEMEUR00000195583000000019558300000001955830000000195583000000019558300+K119990101E
43
+ VK01001199901011114430001FRFEUR00000655957000000065595700000006559570000000655957000000065595700+K119990101E
44
+ VK01001199901011114440001NLGEUR00000220371000000022037100000002203710000000220371000000022037100+K119990101E
45
+ VK01001199901011114440001ITLEUR00193627000000019362700000001936270000000193627000000019362700000+K119990101E
46
+ VK01001199901011114440001ATSEUR00001376030000000137603000000013760300000001376030000000137603000+K119990101E
47
+ VK01001199901011114440001ESPEUR00016638600000001663860000000166386000000016638600000001663860000+K119990101E
48
+ VK01001199901011114440001IEPEUR00000078756400000007875640000000787564000000078756400000007875640+K119990101E
49
+ VK01001199901011114450001BEFEUR00004033990000000403399000000040339900000004033990000000403399000+K119990101E
50
+ VK01001199901011114450001LUFEUR00004033990000000403399000000040339900000004033990000000403399000+K119990101E
51
+ VK01001199901011114450001PTEEUR00020048200000002004820000000200482000000020048200000002004820000+K119990101E
52
+ VK01001200012300915000001GRDEUR00034075000000003407500000000340750000000034075000000003407500000-K120010101E
53
+ VK01001201106141553270001ALLEUR00014230000000001423000000000142300000000000000000000000000000000-E000000000K
54
+ VK01001201106141553260001ANGEUR00000252840000000025284000000002528400000000000000000000000000000+E000000000K
55
+ VK01001201106141553270001ARSEUR00000591000000000059100000000005910000000000000000000000000000000+E000000000K
56
+ VK01001201106141553270001AWGEUR00000257170000000025717000000002571700000000000000000000000000000+E000000000K
57
+ VK01001201106141553270001BBDEUR00000287520000000028752000000002875200000000000000000000000000000+E000000000K
58
+ VK01001201106141553270001BDTEUR00010677070000001067707000000106770700000000000000000000000000000+E000000000K
59
+ VK01001201106141547160001BGNEUR00000195580000000020058000000001905800000000203580000000018758000+K000000000K
60
+ VK01001201106141553270001BHDEUR00000054470000000005447000000000544700000000000000000000000000000+E000000000K
61
+ VK01001201106141553270001BIFEUR00174820800000017482080000001748208000000000000000000000000000000+E000000000K
62
+ VK01001201106141553270001BMDEUR00000144480000000014448000000001444800000000000000000000000000000+E000000000K
63
+ VK01001201106141553270001BNDEUR00000177970000000017797000000001779700000000000000000000000000000+E000000000K
64
+ VK01001201106141553270001BOBEUR00001005580000000100558000000010055800000000000000000000000000000+E000000000K
65
+ VK01001201106141553270001BAMEUR00000195470000000019547000000001954700000000000000000000000000000+E000000000K
66
+ VK01001201106141553270001BRLEUR00000228710000000022871000000002287100000000242200000000021580000+E000000000K
67
+ VK01001201106141553270001BSDEUR00000144480000000014448000000001444800000000000000000000000000000+E000000000K
68
+ VK01001201106141553270001BTNEUR00006462590000000646259000000064625900000000000000000000000000000+E000000000K
69
+ VK01001201106141553270001BWPEUR00000938180000000093818000000009381800000000000000000000000000000+E000000000K
70
+ VK01001201106141553270001BZDEUR00000281520000000028152000000002815200000000000000000000000000000+E000000000K
71
+ VK01001201106141553270001CLPEUR00067313230000006731323000000673132300000000000000000000000000000+E000000000K
72
+ VK01001201106141553270001CNYEUR00000936090000000093609000000009360900000000982130000000089213000+E000000000K
73
+ VK01001201106141553270001CNHEUR00000935360000000093536000000009353600000000000000000000000000000+E000000000K
74
+ VK01001201106141553270001COPEUR00256654270000025665427000002566542700000000000000000000000000000+E000000000K
75
+ VK01001201106141553270001CRCEUR00072630100000007263010000000726301000000000000000000000000000000+E000000000K
76
+ VK01001201106141553260001CUPEUR00000145390000000014539000000001453900000000000000000000000000000-E000000000K
77
+ VK01001201106141553270001CVEEUR00011031050000001103105000000110310500000000000000000000000000000+E000000000K
78
+ VK01001201106141553270001DJFEUR00025262330000002526233000000252623300000000000000000000000000000+E000000000K
79
+ VK01001201106141553270001DOPEUR00005432450000000543245000000054324500000000000000000000000000000+E000000000K
80
+ VK01001201106141553270001DZDEUR00010344320000001034432000000103443200000000000000000000000000000+E000000000K
81
+ VK01001201106141553270001EGPEUR00000858570000000085857000000008585700000000000000000000000000000+E000000000K
82
+ VK01001201106141553270001ETBEUR00002436940000000243694000000024369400000000000000000000000000000+E000000000K
83
+ VK01001201106141553270001FJDEUR00000251840000000025184000000002518400000000000000000000000000000+E000000000K
84
+ VK01001201106141553270001GHSEUR00000218810000000021881000000002188100000000000000000000000000000+E000000000K
85
+ VK01001201106141553270001GIPEUR00000237080000000023708000000002370800000000000000000000000000000+E000000000K
86
+ VK01001201106141553270001GMDEUR00003835940000000383594000000038359400000000000000000000000000000-E000000000K
87
+ VK01001201106141553270001GNFEUR00958624800000095862480000009586248000000000000000000000000000000+E000000000K
88
+ VK01001201106141553270001GTQEUR00001126370000000112637000000011263700000000000000000000000000000+E000000000K
89
+ VK01001201106141553270001GYDEUR00029400240000002940024000000294002400000000000000000000000000000+E000000000K
90
+ VK01001201106141553270001HNLEUR00002729950000000272995000000027299500000000000000000000000000000+E000000000K
91
+ VK01001201106141553270001HTGEUR00005829770000000582977000000058297700000000000000000000000000000+E000000000K
92
+ VK01001201106141547160001HRKEUR00000739950000000075995000000007199500000000763750000000071555000+K000000000K
93
+ VK01001201106141553270001IDREUR01233384000000123338400000012333840000000000000000000000000000000+E000000000K
94
+ VK01001201106141553270001ILSEUR00000490610000000049061000000004906100000000000000000000000000000-E000000000K
95
+ VK01001201106141553270001IQDEUR00168319200000016831920000001683192000000000000000000000000000000+E000000000K
96
+ VK01001201106141553270001IRREUR01676979360000167697936000016769793600000000000000000000000000000-E000000000K
97
+ VK01001201106141553270001JMDEUR00012244680000001224468000000122446800000000000000000000000000000+E000000000K
98
+ VK01001201106141553270001JODEUR00000102290000000010229000000001022900000000000000000000000000000+E000000000K
99
+ VK01001201106141553270001KESEUR00012909290000001290929000000129092900000000000000000000000000000+E000000000K
100
+ VK01001201106141553270001KHREUR00591645600000059164560000005916456000000000000000000000000000000+E000000000K
101
+ VK01001201106141553260001KMFEUR00049484400000004948440000000494844000000000000000000000000000000+E000000000K
102
+ VK01001201106141553270001KPWEUR00018782400000001878240000000187824000000000000000000000000000000+E000000000K
103
+ VK01001201106141553270001KYDEUR00000117030000000011703000000001170300000000000000000000000000000+E000000000K
104
+ VK01001201106141553260001LAKEUR01157140320000115714032000011571403200000000000000000000000000000+E000000000K
105
+ VK01001201106141553270001LBPEUR00216864480000021686448000002168644800000000000000000000000000000+E000000000K
106
+ VK01001201106141553260001LKREUR00015820560000001582056000000158205600000000000000000000000000000+E000000000K
107
+ VK01001201106141553270001LRDEUR00010402560000001040256000000104025600000000000000000000000000000+E000000000K
108
+ VK01001201106141553260001LSLEUR00000971630000000097163000000009716300000000000000000000000000000+E000000000K
109
+ VK01001201106141553270001LYDEUR00000173000000000017300000000001730000000000000000000000000000000+E000000000K
110
+ VK01001201106141553270001MMKEUR00000926120000000092612000000009261200000000000000000000000000000+E000000000K
111
+ VK01001201106141553270001MNTEUR00179155200000017915520000001791552000000000000000000000000000000+E000000000K
112
+ VK01001201106141553270001MOPEUR00001157000000000115700000000011570000000000000000000000000000000+E000000000K
113
+ VK01001201106141553270001MROEUR00039493610000003949361000000394936100000000000000000000000000000+E000000000K
114
+ VK01001201106141553270001MUREUR00003973200000000397320000000039732000000000000000000000000000000+E000000000K
115
+ VK01001201106141553270001MVREUR00002175870000000217587000000021758700000000000000000000000000000+E000000000K
116
+ VK01001201106141553260001MWKEUR00021672000000002167200000000216720000000000000000000000000000000+E000000000K
117
+ VK01001201106141547120001MXNEUR00001710140000000179014000000016301400000001786140000000159114000-K000000000K
118
+ VK01001201106141553270001MZNEUR00004045440000000404544000000040454400000000000000000000000000000-E000000000K
119
+ VK01001201106141553270001NADEUR00000975620000000097562000000009756200000000000000000000000000000+E000000000K
120
+ VK01001201106141553270001NGNEUR00022637130000002263713000000226371300000000000000000000000000000+E000000000K
121
+ VK01001201106141553270001NIOEUR00003231660000000323166000000032316600000000000000000000000000000+E000000000K
122
+ VK01001201106141553270001NPREUR00010343320000001034332000000103433200000000000000000000000000000+E000000000K
123
+ VK01001201106141553270001OMREUR00000055620000000005562000000000556200000000000000000000000000000+E000000000K
124
+ VK01001201106141553270001PABEUR00000144480000000014448000000001444800000000000000000000000000000+E000000000K
125
+ VK01001201106141553270001PENEUR00000399050000000039905000000003990500000000000000000000000000000+E000000000K
126
+ VK01001201106141553270001PGKEUR00000314020000000031402000000003140200000000000000000000000000000-E000000000K
127
+ VK01001201106141553270001PHPEUR00006249900000000624990000000062499000000000000000000000000000000+E000000000K
128
+ VK01001201106141553270001PKREUR00012389160000001238916000000123891600000000000000000000000000000+E000000000K
129
+ VK01001201106141553270001PYGEUR00573585600000057358560000005735856000000000000000000000000000000+E000000000K
130
+ VK01001201106141553270001QAREUR00000526070000000052607000000005260700000000000000000000000000000+E000000000K
131
+ VK01001201106141547160001RONEUR00000417250000000042725000000004072500000000000000000000000000000-K000000000K
132
+ VK01001201106141553260001SBDEUR00000985540000000098554000000009855400000000000000000000000000000-E000000000K
133
+ VK01001201106141547130001RSDEUR00010025500000001042550000000096255000000000000000000000000000000+K000000000K
134
+ VK01001201106141553270001SCREUR00001737700000000173770000000017377000000000000000000000000000000+E000000000K
135
+ VK01001201106141553260001SDGEUR00000385790000000038579000000003857900000000000000000000000000000+E000000000K
136
+ VK01001200701021605380001SITEUR00023964000000002396400000000239640000000000000000000000000000000-K120070101E
137
+ VK01001201106141553270001SLLEUR00614040000000061404000000006140400000000000000000000000000000000-E000000000K
138
+ VK01001201106141553270001SOSEUR00225388800000022538880000002253888000000000000000000000000000000+E000000000K
139
+ VK01001201106141553270001STDEUR02451103200000245110320000024511032000000000000000000000000000000-E000000000K
140
+ VK01001201106141553270001SVCEUR00001263120000000126312000000012631200000000000000000000000000000+E000000000K
141
+ VK01001201106141553270001SYPEUR00006855580000000685558000000068555800000000000000000000000000000+E000000000K
142
+ VK01001201106141553270001SZLEUR00000971920000000097192000000009719200000000000000000000000000000+E000000000K
143
+ VK01001201106141553270001TOPEUR00000239240000000023924000000002392400000000000000000000000000000+E000000000K
144
+ VK01001201106141547160001TRYEUR00000228200000000024320000000002132000000000245700000000020570000+K000000000K
145
+ VK01001201106141553260001TTDEUR00000917450000000091745000000009174500000000000000000000000000000+E000000000K
146
+ VK01001201106141553270001TWDEUR00004166080000000416608000000041660800000000000000000000000000000+E000000000K
147
+ VK01001201106141553260001TZSEUR00225677760000022567776000002256777600000000000000000000000000000+E000000000K
148
+ VK01001201106141553270001UAHEUR00001153670000000115367000000011536700000000000000000000000000000+E000000000K
149
+ VK01001201106141553270001UGXEUR00347474400000034747440000003474744000000000000000000000000000000+E000000000K
150
+ VK01001201106141553270001UYUEUR00002651210000000265121000000026512100000000000000000000000000000+E000000000K
151
+ VK01001201106141553270001VEFEUR00000619720000000061972000000006197200000000000000000000000000000+E000000000K
152
+ VK01001201106141553270001VNDEUR02967619200000296761920000029676192000000000000000000000000000000+E000000000K
153
+ VK01001201106141553270001VUVEUR00012629000000001262900000000126290000000000000000000000000000000-E000000000K
154
+ VK01001201106141553270001WSTEUR00000311650000000031165000000003116500000000000000000000000000000+E000000000K
155
+ VK01001201106141553260001XAFEUR00065609810000006560981000000656098100000000000000000000000000000+E000000000K
156
+ VK01001201106141553270001XCDEUR00000385760000000038576000000003857600000000000000000000000000000+E000000000K
157
+ VK01001201106141553270001XOFEUR00065878550000006587855000000658785500000000000000000000000000000+E000000000K
158
+ VK01001201106141553270001XPFEUR00011853140000001185314000000118531400000000000000000000000000000-E000000000K
159
+ VK01001201106141553270001YEREUR00030810360000003081036000000308103600000000000000000000000000000+E000000000K
160
+ VK01001201106141553270001ZMKEUR00694948800000069494880000006949488000000000000000000000000000000+E000000000K
161
+ VK01001201106141547130001KZTEUR00021082000000002178200000000203820000000000000000000000000000000-K000000000K
162
+ VK01001201106141553270001UZSEUR00245873170000024587317000002458731700000000000000000000000000000+E000000000K
163
+ VK01001199901010750000002EUREUR00000100000000000010000000000001000000000000000000000000000000000+K000000000K
164
+ VK01001201106141547190002USDEUR00000144480000000014598000000001429800000000000000000000000000000+K000000000K
165
+ VK01001201106141547140002JPYEUR00011591000000001179100000000113910000000000000000000000000000000+K000000000K
166
+ VK01001201106141547190002GBPEUR00000088100000000008910000000000871000000000000000000000000000000+K000000000K
167
+ VK01001201106141547190002SEKEUR00000911830000000092183000000009018300000000000000000000000000000-K000000000K
168
+ VK01001201106141547170002NOKEUR00000779650000000078965000000007696500000000000000000000000000000-K000000000K
169
+ VK01001201106141547130002DKKEUR00000745900000000074915000000007426500000000000000000000000000000+K000000000K
170
+ VK01001201106141547150002CHFEUR00000121160000000012241000000001199100000000000000000000000000000+K000000000K
171
+ VK01001201101011123110002EEKEUR00001564660000000156466000000015646600000000000000000000000000000 K120110101E
172
+ VK01001201106141547140002LVLEUR00000070860000000007185000000000698700000000000000000000000000000 K000000000K
173
+ VK01001201106141547130002LTLEUR00000345280000000034768000000003428800000000000000000000000000000 K000000000K
174
+ VK01001201106141547170002CADEUR00000140740000000014224000000001392400000000000000000000000000000+K000000000K
175
+ VK01001201106141547150002HKDEUR00001124560000000114556000000011035600000000000000000000000000000+K000000000K
176
+ VK01001201106141547190002AUDEUR00000135730000000013773000000001337300000000000000000000000000000-K000000000K
177
+ VK01001201106141547160002NZDEUR00000176630000000017828000000001749800000000000000000000000000000-K000000000K
178
+ VK01001201106141547120002ZAREUR00000975400000000100340000000009474000000000000000000000000000000-K000000000K
179
+ VK01001200801011056450002MTLEUR00000042930000000004293000000000429300000000000000000000000000000-K120080101E
180
+ VK01001201106141547150002SAREUR00000541945000000054914500000005347450000000000000000000000000000+K000000000K
181
+ VK01001201106141547120002MADEUR00001133760000000116626000000011012600000000000000000000000000000+K000000000K
182
+ VK01001201106141547170002KWDEUR00000039635000000004013500000000391350000000000000000000000000000+K000000000K
183
+ VK01001201106141547120002AEDEUR00000530825000000053592500000005257250000000000000000000000000000+K000000000K
184
+ VK01001201106141547170002SGDEUR00000178040000000018104000000001750400000000000000000000000000000+K000000000K
185
+ VK01001201106141547140002MYREUR00000437920000000000000000000000000000000000000000000000000000000+K000000000K
186
+ VK01001201106141547170002INREUR00006463700000000686370000000060637000000000000000000000000000000+K000000000K
187
+ VK01001200801011056420002CYPEUR00000058527400000005852740000000585274000000000000000000000000000+K120080101E
188
+ VK01001201106141547150002RUBEUR00004028880000000427888000000037788800000000000000000000000000000+K000000000K
189
+ VK01001201106141547170002CZKEUR00002411800000000244780000000023758000000000000000000000000000000-K000000000K
190
+ VK01001200901010000010002SKKEUR00003012600000000301260000000030126000000000000000000000000000000+K120090101E
191
+ VK01001201106141547120002PLNEUR00000393020000000040302000000003830200000000000000000000000000000-K000000000K
192
+ VK01001201106141547140002HUFEUR00026451000000002685100000000260510000000000000000000000000000000-K000000000K
193
+ VK01001201106141547160002THBEUR00004400900000000450090000000043009000000000000000000000000000000+K000000000K
194
+ VK01001201106141547170002KRWEUR00156404000000015910400000001537040000000000000000000000000000000+K000000000K
195
+ VK01001201106141547150002TNDEUR00000197894300000019889430000001968943000000000000000000000000000+K000000000K
196
+ VK01001201106141547160002XAUEUR00000009515700000001061570000000084157000000000000000000000000000+K000000000K
197
+ VK01001201106141547150002XYPEUR00000487530000000048883000000004862300000000000000000000000000000+K000000000K
198
+ VK01001201106141547140002UBFEUR00000474550000000047585000000004732500000000000000000000000000000+K000000000K
199
+ VK01001201106141547140002KOREUR00000533010000000053461000000005314100000000000000000000000000000+K000000000K
200
+ VK01001201106141547190002KOXEUR00000465990000000046749000000004644900000000000000000000000000000+K000000000K
201
+ VK01001201106141547170002XDREUR00000089430000000008953000000000893300000000000000000000000000000+K000000000K
202
+ VK01001199901011114430002FIMEUR00000594573000000059457300000005945730000000000000000000000000000+K119990101E
203
+ VK01001199901011114430002DEMEUR00000195583000000019558300000001955830000000000000000000000000000+K119990101E
204
+ VK01001199901011114430002FRFEUR00000655957000000065595700000006559570000000000000000000000000000+K119990101E
205
+ VK01001199901011114440002NLGEUR00000220371000000022037100000002203710000000000000000000000000000+K119990101E
206
+ VK01001199901011114440002ITLEUR00193627000000019362700000001936270000000000000000000000000000000+K119990101E
207
+ VK01001199901011114440002ATSEUR00001376030000000137603000000013760300000000000000000000000000000+K119990101E
208
+ VK01001199901011114440002ESPEUR00016638600000001663860000000166386000000000000000000000000000000+K119990101E
209
+ VK01001199901011114440002IEPEUR00000078756400000007875640000000787564000000000000000000000000000+K119990101E
210
+ VK01001199901011114450002BEFEUR00004033990000000403399000000040339900000000000000000000000000000+K119990101E
211
+ VK01001199901011114450002LUFEUR00004033990000000403399000000040339900000000000000000000000000000+K119990101E
212
+ VK01001199901011114450002PTEEUR00020048200000002004820000000200482000000000000000000000000000000+K119990101E
213
+ VK01001200012300915000002GRDEUR00034075000000003407500000000340750000000000000000000000000000000 K120010101E
214
+ VK01001201106141547160002BGNEUR00000195580000000020058000000001905800000000000000000000000000000 K000000000K
215
+ VK01001201106141547160002HRKEUR00000739950000000075995000000007199500000000000000000000000000000-K000000000K
216
+ VK01001201106141547120002MXNEUR00001710140000000179014000000016301400000000000000000000000000000+K000000000K
217
+ VK01001201106141547160002RONEUR00000417250000000042725000000004072500000000000000000000000000000-K000000000K
218
+ VK01001201106141547130002RSDEUR00010025500000001042550000000096255000000000000000000000000000000+K000000000K
219
+ VK01001200701021605380002SITEUR00023964000000002396400000000239640000000000000000000000000000000 K120070101E
220
+ VK01001201106141547160002TRYEUR00000228200000000024320000000002132000000000000000000000000000000+K000000000K
221
+ VK01001201106141547130002KZTEUR00021082000000002178200000000203820000000000000000000000000000000+K000000000K
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nordea
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matias Korhonen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-06-18 00:00:00.000000000 +03:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: money
17
+ requirement: &2157191160 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 3.7.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2157191160
26
+ - !ruby/object:Gem::Dependency
27
+ name: yard
28
+ requirement: &2157190040 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *2157190040
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ requirement: &2157188760 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *2157188760
48
+ - !ruby/object:Gem::Dependency
49
+ name: webmock
50
+ requirement: &2157187440 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *2157187440
59
+ - !ruby/object:Gem::Dependency
60
+ name: awesome_print
61
+ requirement: &2157185080 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *2157185080
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
72
+ requirement: &2157183780 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *2157183780
81
+ - !ruby/object:Gem::Dependency
82
+ name: rake
83
+ requirement: &2157182820 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: 0.9.2
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *2157182820
92
+ description: A Money.gem compatible currency exchange rate implementation for Nordea
93
+ Bank
94
+ email:
95
+ - matias@kiskolabs.com
96
+ executables: []
97
+ extensions: []
98
+ extra_rdoc_files: []
99
+ files:
100
+ - .gitignore
101
+ - .travis.yml
102
+ - Gemfile
103
+ - LICENSE
104
+ - README.md
105
+ - Rakefile
106
+ - lib/nordea.rb
107
+ - lib/nordea/bank.rb
108
+ - lib/nordea/exchange_rates.rb
109
+ - lib/nordea/version.rb
110
+ - nordea.gemspec
111
+ - spec/bank/bank_spec.rb
112
+ - spec/exchange_rates/exchange_rates_spec.rb
113
+ - spec/spec_helper.rb
114
+ - spec/support/sample_currencies.marshal
115
+ - spec/support/sample_data.rb
116
+ - spec/support/sample_electronic.dat
117
+ - spec/support/sample_headers.marshal
118
+ has_rdoc: true
119
+ homepage: http://github.com/k33l0r/nordea
120
+ licenses: []
121
+ post_install_message:
122
+ rdoc_options: []
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubyforge_project: nordea
139
+ rubygems_version: 1.6.2
140
+ signing_key:
141
+ specification_version: 3
142
+ summary: Exchange rates from Nordea Bank
143
+ test_files:
144
+ - spec/bank/bank_spec.rb
145
+ - spec/exchange_rates/exchange_rates_spec.rb
146
+ - spec/spec_helper.rb
147
+ - spec/support/sample_currencies.marshal
148
+ - spec/support/sample_data.rb
149
+ - spec/support/sample_electronic.dat
150
+ - spec/support/sample_headers.marshal