nbp_exchange_rate 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/nbp/commons.rb +21 -0
- data/lib/nbp/exchange_rate.rb +66 -0
- data/lib/nbp/version.rb +3 -0
- data/lib/nbp/xml_files_list.rb +53 -0
- data/lib/nbp_exchange_rate.rb +9 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2403c978730df6e7aa5ac852eefb42af315bc170
|
4
|
+
data.tar.gz: 7be214654eef53408dc848c1b66a9fb5b36f94e4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65a75a73d47b4c02f8c53b695c9804627c686d0389759beb2eaa5cca1fd632c31a82a578ba92059fd9efe4770fff72c41fca6ea0d2a67a3a078d877c3b5cbe5f
|
7
|
+
data.tar.gz: fb417791d67fdb0ab732e5a1ccf42ef92e3f80ac3b035bfec167b973617838f6758b0d1fa1f6db2a633ae08ee38c403487ce4b091eb7ddff59523e02e2ba4ac5
|
data/lib/nbp/commons.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module NBP
|
2
|
+
module Commons
|
3
|
+
CORE_WEB_PATH = 'http://www.nbp.pl/kursy/xml/'
|
4
|
+
def self.extended(base)
|
5
|
+
base.private_class_method :normalize_time_period
|
6
|
+
end
|
7
|
+
|
8
|
+
def nbp_date_format_hash(date)
|
9
|
+
day = normalize_time_period date.day.to_s
|
10
|
+
month = normalize_time_period date.month.to_s
|
11
|
+
year = date.year.to_s[-2..-1]
|
12
|
+
{ day: day, month: month, year: year }
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def normalize_time_period(number_word)
|
18
|
+
number_word.size == 1 ? '0' + number_word : number_word
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'date'
|
3
|
+
require 'nori'
|
4
|
+
require_relative './commons.rb'
|
5
|
+
module NBP
|
6
|
+
ExchangeError = Class.new(StandardError)
|
7
|
+
class ExchangeRate
|
8
|
+
extend NBP::Commons
|
9
|
+
attr_accessor :nbp_file_name # you can pass nbp_file_name directly
|
10
|
+
attr_reader :data
|
11
|
+
|
12
|
+
class << self
|
13
|
+
%w(a b c).each do |suffix|
|
14
|
+
define_method("exchange_#{suffix}") { new "Last#{suffix.upcase}" }
|
15
|
+
alias_method "last_#{suffix}", "exchange_#{suffix}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_date(date, table_name:, table_number:)
|
19
|
+
new({ table_name: table_name, table_number: table_number }.merge nbp_date_format_hash(date))
|
20
|
+
end
|
21
|
+
|
22
|
+
def by_file(file_name)
|
23
|
+
new(file_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
def all_exchange_rates(date)
|
27
|
+
file_names = files_names_on_date(date)
|
28
|
+
mutex = Mutex.new
|
29
|
+
threads = []
|
30
|
+
data = file_names.each_with_object([]) do |file_name, arr|
|
31
|
+
threads << Thread.new do
|
32
|
+
mutex.synchronize { arr << new(file_name).fetch['tabela_kursow']['pozycja'] }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
threads.map(&:join)
|
36
|
+
data.flatten
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def files_names_on_date(date)
|
42
|
+
XMLFilesList.new(date).fetch_file_names
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(base_file_name = nil, constant_element = 'z', file_extension = '.xml', **fields)
|
47
|
+
if base_file_name
|
48
|
+
@nbp_file_name = base_file_name + file_extension
|
49
|
+
else
|
50
|
+
@nbp_file_name = fields[:table_name] + fields[:table_number] + constant_element +
|
51
|
+
fields[:year] + fields[:month] + fields[:day] + file_extension
|
52
|
+
end
|
53
|
+
rescue NoMethodError
|
54
|
+
raise ExchangeError, 'One or more fields are missing. Unable to build the object.'
|
55
|
+
end
|
56
|
+
|
57
|
+
def fetch
|
58
|
+
full_file_path = Commons::CORE_WEB_PATH + nbp_file_name
|
59
|
+
@data = ::Nori.new(parser: :rexml).parse open(full_file_path).read
|
60
|
+
fail ExchangeError, 'Missing field tabela_kursow in fetched data' unless @data.key?('tabela_kursow')
|
61
|
+
return @data
|
62
|
+
rescue OpenURI::HTTPError
|
63
|
+
raise ExchangeError, 'Problem with connection or requested information not found.'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/nbp/version.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'open-uri'
|
3
|
+
require_relative './commons.rb'
|
4
|
+
module NBP
|
5
|
+
class XMLFilesList
|
6
|
+
attr_reader :dir_name, :matched_base_file_names
|
7
|
+
|
8
|
+
BASE_NAME = 'dir'
|
9
|
+
|
10
|
+
include Commons
|
11
|
+
|
12
|
+
def initialize(date, file_extension = '.txt')
|
13
|
+
@dir_name = files_list_name(date) + file_extension
|
14
|
+
@formatted_date = nbp_date_format_string(date)
|
15
|
+
@matched_base_file_names = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def fetch_file_names
|
19
|
+
dir_file = open(Commons::CORE_WEB_PATH + dir_name, 'r')
|
20
|
+
@matched_base_file_names = dir_file.each_line.with_object([]) do |line, arr|
|
21
|
+
trim_line = line.strip
|
22
|
+
arr << trim_line if trim_line[-6..-1] == formatted_date
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def matched_file_names_as_hashes
|
27
|
+
matched_base_file_names.map do |name|
|
28
|
+
{ table_name: name[0],
|
29
|
+
table_number: name[1..3],
|
30
|
+
constant_element: name[4],
|
31
|
+
year: name[5..6],
|
32
|
+
month: name[7..8],
|
33
|
+
day: name[9..10],
|
34
|
+
extension: name[-4..-1] }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
attr_reader :formatted_date
|
41
|
+
|
42
|
+
def nbp_date_format_string(date)
|
43
|
+
date_hash = nbp_date_format_hash(date)
|
44
|
+
date_hash[:year] + date_hash[:month] + date_hash[:day]
|
45
|
+
end
|
46
|
+
|
47
|
+
def files_list_name(date)
|
48
|
+
year = date.year.to_s
|
49
|
+
return BASE_NAME if year[-2..-1] == DateTime.now.year.to_s[-2..-1]
|
50
|
+
BASE_NAME + year
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nbp_exchange_rate
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Maciej Kempin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.28.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.28.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: webmock
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.21'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.21'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-its
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.2.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.2.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: nori
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.4.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.4.0
|
97
|
+
description:
|
98
|
+
email:
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- lib/nbp/commons.rb
|
104
|
+
- lib/nbp/exchange_rate.rb
|
105
|
+
- lib/nbp/version.rb
|
106
|
+
- lib/nbp/xml_files_list.rb
|
107
|
+
- lib/nbp_exchange_rate.rb
|
108
|
+
homepage:
|
109
|
+
licenses:
|
110
|
+
- MIT
|
111
|
+
metadata: {}
|
112
|
+
post_install_message:
|
113
|
+
rdoc_options: []
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 2.5.1
|
129
|
+
signing_key:
|
130
|
+
specification_version: 4
|
131
|
+
summary: Handles Polish National Bank exchange rate API
|
132
|
+
test_files: []
|