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.
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: []