tcmb_exchanger 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/tcmb_exchanger.rb +123 -0
  3. 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: []