nbp_exchange_rate 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
@@ -0,0 +1,3 @@
1
+ module NBP
2
+ VERSION = '1.2.0'
3
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ require 'nbp/version'
2
+ require 'nbp/exchange_rate.rb'
3
+ require 'nbp/xml_files_list.rb'
4
+
5
+ module NBP
6
+ def self.root
7
+ File.dirname __dir__
8
+ end
9
+ 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: []