tcmb_exchanger 1.0.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/tcmb_exchanger.rb +123 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 958fa2f21838a97e5cd54cf52b10f4f0da2f914ed6a0af29d8eaefcd997ee3f2
|
4
|
+
data.tar.gz: 0b32e390f0da1853af08d09c0b6cf793a4b36317119ec8fcd45926204afdd6c7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f7c26df9b1d1e40a9b619739412680ddfda81edb9f7f7bf0fe7de80be62e256fbffda4de6f82f95c3f07e9a46bcceea1057f584bc05c0009d6866aee3f195c84
|
7
|
+
data.tar.gz: 692c79c7f98238dd26847e3daf75391e246680f8378060370bcbe1345bfc6b298f50f9b47b24fd783e138a070ea5ebfd635211d42ebcaa1f49d065c7d89cc57d
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# get, parse and show exchanges from tcmb
|
2
|
+
class TCMB_exchanger
|
3
|
+
require 'json'
|
4
|
+
require 'crack'
|
5
|
+
require 'ostruct'
|
6
|
+
require 'net/http'
|
7
|
+
|
8
|
+
attr_reader :exchanges
|
9
|
+
|
10
|
+
LINK = 'https://www.tcmb.gov.tr/kurlar/today.xml'.freeze
|
11
|
+
Hierarcy = ['Tarih_Date', 'Currency'].freeze
|
12
|
+
|
13
|
+
VAR_NAMES = {
|
14
|
+
'Isim' => 'isim',
|
15
|
+
'CurrencyName' => 'name',
|
16
|
+
'ForexBuying' => 'for_buy',
|
17
|
+
'ForexSelling' => 'for_sel',
|
18
|
+
'BanknoteBuying' => 'bank_buy',
|
19
|
+
'BanknoteSelling' => 'bank_sell',
|
20
|
+
'CrossRateUSD' => 'cross_usd',
|
21
|
+
'CrossRateOther' => 'cross_other',
|
22
|
+
'CrossOrder' => 'order',
|
23
|
+
'Kod' => 'kod',
|
24
|
+
'CurrencyCode' => 'code'
|
25
|
+
}.freeze
|
26
|
+
|
27
|
+
def initialize(
|
28
|
+
function_names: VAR_NAMES,
|
29
|
+
write_cache: false,
|
30
|
+
cache_folder: nil
|
31
|
+
)
|
32
|
+
@var_names = function_names
|
33
|
+
@write_cache = write_cache
|
34
|
+
@cache_folder = cache_folder
|
35
|
+
|
36
|
+
@cache_file = set_cache_file_name
|
37
|
+
@exchanges = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
def process
|
41
|
+
# get exchanges or read the cache file
|
42
|
+
get_body
|
43
|
+
cache
|
44
|
+
rename_param
|
45
|
+
xml2obj
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# write @body to cache file
|
51
|
+
def cache
|
52
|
+
return false unless @write_cache
|
53
|
+
|
54
|
+
return false unless @body
|
55
|
+
|
56
|
+
return true if File.exists? @cache_file
|
57
|
+
|
58
|
+
File.open(@cache_file, 'w') { |cache| cache.write @body }
|
59
|
+
end
|
60
|
+
|
61
|
+
# make new cache file name
|
62
|
+
def set_cache_file_name
|
63
|
+
@cache_file = (@cache_folder ? @cache_folder + '/' : '') + "today_#{Time.new.strftime '%y.%m.%d'}.xml"
|
64
|
+
end
|
65
|
+
|
66
|
+
# parse xml to object
|
67
|
+
def xml2obj
|
68
|
+
xml_content = parse_exchanges
|
69
|
+
data = get_pure_data(xml_content)
|
70
|
+
|
71
|
+
kod_name = @var_names ? @var_names['Kod'] : 'Kod'
|
72
|
+
|
73
|
+
data.each do |line|
|
74
|
+
name = line[kod_name]
|
75
|
+
@exchanges[name] = line
|
76
|
+
set_ins(name, str2obj(line))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# rename exchange values and functions names
|
81
|
+
def rename_param
|
82
|
+
return unless @var_names
|
83
|
+
@var_names.each { |old_val, new_val| @body.gsub!(old_val, new_val) }
|
84
|
+
true
|
85
|
+
end
|
86
|
+
|
87
|
+
# convert string to open struct object
|
88
|
+
def str2obj(obj_str)
|
89
|
+
JSON.parse(obj_str.to_json, object_class: OpenStruct)
|
90
|
+
end
|
91
|
+
|
92
|
+
# set variables as instance variable
|
93
|
+
def set_ins(name, obj)
|
94
|
+
name = name.dup.downcase
|
95
|
+
self.class.__send__(:attr_reader, name)
|
96
|
+
instance_variable_set('@' + name, obj)
|
97
|
+
end
|
98
|
+
|
99
|
+
# dig xml hierarchy into hash
|
100
|
+
def get_pure_data(data)
|
101
|
+
Hierarcy.each { |str| data = data[str] }
|
102
|
+
return data
|
103
|
+
rescue
|
104
|
+
throw 'Unknowing exchange type'
|
105
|
+
end
|
106
|
+
|
107
|
+
# convert @body to xml hash
|
108
|
+
def parse_exchanges
|
109
|
+
Crack::XML.parse(@body)
|
110
|
+
rescue
|
111
|
+
throw 'XML parse error!'
|
112
|
+
end
|
113
|
+
|
114
|
+
# select body source and get
|
115
|
+
def get_body
|
116
|
+
@body =
|
117
|
+
if File.exist? @cache_file
|
118
|
+
File.read @cache_file # get @body from file
|
119
|
+
else
|
120
|
+
Net::HTTP.get(URI.parse(LINK)) # get @body from url link
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tcmb_exchanger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- tayak
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-08-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: crack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.4.5
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.4.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ostruct
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.5.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.5.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: net-http
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.1.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.1.1
|
69
|
+
description: Currency calculator that receives exchange rates through the TCMB daily
|
70
|
+
foreign exchange connection. Exchange rates can be called as functions or hash value.
|
71
|
+
email: yasir.kiroglu@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/tcmb_exchanger.rb
|
77
|
+
homepage: https://github.com/taiak/tcmb_exchanger
|
78
|
+
licenses:
|
79
|
+
- Apache-2.0
|
80
|
+
metadata: {}
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubygems_version: 3.2.29
|
97
|
+
signing_key:
|
98
|
+
specification_version: 4
|
99
|
+
summary: The exchange calculator which is get exchange rates over TCMB daily exchange
|
100
|
+
link.
|
101
|
+
test_files: []
|