lbank 0.0.3 → 1.1.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/.github/workflows/main.yml +18 -0
- data/.github/workflows/publish.yml +21 -0
- data/.ruby-version +1 -0
- data/.travis.yml +2 -4
- data/Gemfile +3 -6
- data/README.md +4 -2
- data/lbank.gemspec +13 -5
- data/lib/lbank/errors.rb +4 -0
- data/lib/lbank/memory_cache.rb +21 -0
- data/lib/lbank/version.rb +1 -1
- data/lib/lbank.rb +48 -25
- data/spec/lbank_spec.rb +17 -18
- data/spec/spec_helper.rb +1 -0
- metadata +103 -18
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e42cbb5d1055bb80343d70d081956c326c8c155f614a37a7d578d20312fd7331
|
4
|
+
data.tar.gz: d00fa3314b87dc16a75c4ea993088e0551e6f9bcc254c89e3ab7afc3895b1936
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7494eea07bb8049fb3ded4845d54176df58803f97458295483ba760c4ff0b74e1a6ec68266ceccaf3d14f96eabfcf2c55a44ba8faeb3b3504e75b73280c07485
|
7
|
+
data.tar.gz: 8702c03fe0f58083025262832af803d80331d2ea1fa131a134353fb683a4373d70a50be9e700c0813012e18c7e5382c54d04a4a6a9c3ada1dc3c572dc8533794
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: Build
|
2
|
+
on: [push,pull_request]
|
3
|
+
jobs:
|
4
|
+
build:
|
5
|
+
runs-on: ubuntu-latest
|
6
|
+
strategy:
|
7
|
+
matrix:
|
8
|
+
ruby-version:
|
9
|
+
- 3.0
|
10
|
+
- 3.4
|
11
|
+
name: Ruby ${{ matrix.ruby-version }} sample
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v4
|
14
|
+
- uses: ruby/setup-ruby@v1
|
15
|
+
with:
|
16
|
+
ruby-version: ${{ matrix.ruby-version }}
|
17
|
+
- run: bundle install
|
18
|
+
- run: bundle exec rake spec
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name: Publish gem to rubygems
|
2
|
+
on:
|
3
|
+
release:
|
4
|
+
types: [published]
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v4
|
10
|
+
- uses: ruby/setup-ruby@v1
|
11
|
+
|
12
|
+
# setup .gem/credentials
|
13
|
+
- run: mkdir -p ~/.gem
|
14
|
+
- env:
|
15
|
+
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
16
|
+
run: >-
|
17
|
+
echo -e "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}" > ~/.gem/credentials
|
18
|
+
- run: chmod 0600 ~/.gem/credentials
|
19
|
+
|
20
|
+
- run: gem build lbank.gemspec --output=release.gem
|
21
|
+
- run: gem push release.gem
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.3.5
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# Lbank
|
2
2
|
|
3
|
-
[](https://rubygems.org/gems/lbank)
|
4
|
+
[](https://github.com/laurynas/lbank/actions)
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
4
6
|
|
5
|
-
Fetches currency rates from Lithuanian Central Bank website
|
7
|
+
Fetches currency rates from Lithuanian Central Bank website https://lb.lt.
|
6
8
|
Does currency conversion.
|
7
9
|
Supports historic currency rates.
|
8
10
|
|
data/lbank.gemspec
CHANGED
@@ -2,16 +2,24 @@
|
|
2
2
|
require File.expand_path('../lib/lbank/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = [
|
6
|
-
gem.email = [
|
5
|
+
gem.authors = ['Laurynas Butkus']
|
6
|
+
gem.email = ['laurynas.butkus@gmail.com']
|
7
7
|
gem.description = %q{lbank.lt currency rates fetcher and converter}
|
8
8
|
gem.summary = %q{Fetches currency rates from Lithuanian Central Bank website. Does currency conversion. Supports historic currency rates.}
|
9
|
-
gem.homepage =
|
9
|
+
gem.homepage = 'https://github.com/laurynas/lbank'
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
13
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
14
|
+
gem.name = 'lbank'
|
15
|
+
gem.require_paths = ['lib']
|
16
16
|
gem.version = Lbank::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'faraday'
|
19
|
+
gem.add_dependency 'faraday_middleware'
|
20
|
+
gem.add_dependency 'activesupport'
|
21
|
+
gem.add_dependency 'multi_xml'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'rspec', '~> 3.5'
|
24
|
+
gem.add_development_dependency 'rspec-its', '~> 1.2'
|
17
25
|
end
|
data/lib/lbank/errors.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
class Lbank::MemoryCache
|
2
|
+
def initialize
|
3
|
+
@store = {}
|
4
|
+
end
|
5
|
+
|
6
|
+
def store(key, value)
|
7
|
+
@store[key] = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def read(key)
|
11
|
+
@store[key]
|
12
|
+
end
|
13
|
+
|
14
|
+
def fetch(key, &block)
|
15
|
+
return self[key] if self[key]
|
16
|
+
self[key] = block.call
|
17
|
+
end
|
18
|
+
|
19
|
+
alias :[]= :store
|
20
|
+
alias :[] :read
|
21
|
+
end
|
data/lib/lbank/version.rb
CHANGED
data/lib/lbank.rb
CHANGED
@@ -1,46 +1,69 @@
|
|
1
|
-
require
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'lbank/version'
|
2
|
+
require 'lbank/memory_cache'
|
3
|
+
require 'lbank/errors'
|
4
4
|
require 'active_support/time'
|
5
|
+
require 'faraday'
|
6
|
+
require 'faraday_middleware'
|
7
|
+
require 'bigdecimal'
|
5
8
|
|
6
9
|
module Lbank
|
10
|
+
RATE_TYPE = 'LT'
|
11
|
+
TIMEZONE = 'Europe/Vilnius'
|
12
|
+
URL = 'http://www.lb.lt/webservices/FxRates/FxRates.asmx/getFxRates'
|
13
|
+
LTL = 'LTL'
|
14
|
+
LTL_RATE = BigDecimal('3.45280')
|
7
15
|
|
8
|
-
|
9
|
-
TIMEZONE = 'Europe/Vilnius'
|
10
|
-
SOURCE = 'http://lbank.lt/exchange/Results.asp'
|
16
|
+
module_function
|
11
17
|
|
12
|
-
|
18
|
+
def cache
|
19
|
+
@cache ||= MemoryCache.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def cache=(store)
|
23
|
+
@cache = store
|
24
|
+
end
|
13
25
|
|
14
|
-
def
|
15
|
-
time
|
26
|
+
def currency_rates(time = nil)
|
27
|
+
time ||= Time.now
|
16
28
|
bank_time = time.to_time.in_time_zone(TIMEZONE)
|
17
|
-
date
|
29
|
+
date = bank_time.strftime('%Y-%m-%d')
|
18
30
|
|
19
|
-
|
20
|
-
|
21
|
-
|
31
|
+
cache.fetch(cache_key(date)) do
|
32
|
+
response = connection.post(URL, tp: RATE_TYPE, dt: date)
|
33
|
+
error = response.body['FxRates']['OprlErr']
|
22
34
|
|
23
|
-
|
35
|
+
raise ResponseError.new(error['Desc']) if error
|
24
36
|
|
25
|
-
|
26
|
-
rates[row[1]] = row[2].to_i / row[3].to_f
|
27
|
-
end
|
37
|
+
fx_rates = response.body['FxRates']['FxRate']
|
28
38
|
|
29
|
-
rates[
|
39
|
+
rates = { fx_rates[0]['CcyAmt'][0]['Ccy'] => 1 }
|
40
|
+
rates[LTL] ||= LTL_RATE
|
30
41
|
|
31
|
-
|
42
|
+
fx_rates.each_with_object(rates) do |rate, result|
|
43
|
+
base, foreign = rate['CcyAmt']
|
44
|
+
result[foreign['Ccy']] = BigDecimal(foreign['Amt']) / BigDecimal(base['Amt'])
|
45
|
+
end
|
32
46
|
end
|
33
|
-
|
34
|
-
@@cache[date]
|
35
47
|
end
|
36
48
|
|
37
|
-
def
|
38
|
-
rates
|
39
|
-
|
49
|
+
def convert_currency(amount, from_currency, to_currency, time = nil)
|
50
|
+
rates = currency_rates(time)
|
40
51
|
from_rate = rates[from_currency.to_s]
|
41
|
-
to_rate
|
52
|
+
to_rate = rates[to_currency.to_s]
|
42
53
|
|
43
54
|
amount / from_rate * to_rate
|
44
55
|
end
|
45
56
|
|
57
|
+
def cache_key(date)
|
58
|
+
"lbank-#{date}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def connection
|
62
|
+
@connection ||= Faraday.new do |builder|
|
63
|
+
builder.request :url_encoded
|
64
|
+
builder.response :raise_error
|
65
|
+
builder.response :xml, content_type: /\bxml$/
|
66
|
+
builder.adapter Faraday.default_adapter
|
67
|
+
end
|
68
|
+
end
|
46
69
|
end
|
data/spec/lbank_spec.rb
CHANGED
@@ -1,28 +1,27 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Lbank do
|
4
|
+
let(:date) { Date.new(2012, 8, 4) }
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
describe '#currency_rates' do
|
7
|
+
subject { described_class.currency_rates(date) }
|
7
8
|
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should convert currency" do
|
12
|
-
subject.convert_currency(10, 'LTL', 'EUR').should be > 0
|
9
|
+
its(['USD']) { is_expected.to be > 0 }
|
13
10
|
|
14
|
-
|
11
|
+
context 'when invalid time' do
|
12
|
+
let(:date) { Time.now + 1.week }
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
it 'raises error' do
|
15
|
+
expect { subject }.to raise_error(Lbank::ResponseError, /No data/)
|
16
|
+
end
|
17
|
+
end
|
20
18
|
end
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
describe '#convert_currency' do
|
21
|
+
it 'converts currency' do
|
22
|
+
expect(subject.convert_currency(10, 'EUR', 'LTL', date).round(2)).to eq 34.53
|
23
|
+
expect(subject.convert_currency(1, 'USD', 'EUR', date).round(2)).to eq 0.82
|
24
|
+
expect(subject.convert_currency(100, 'RUB', 'USD', date).round(2)).to eq 3.08
|
25
|
+
end
|
26
26
|
end
|
27
|
-
|
28
|
-
end
|
27
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lbank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Laurynas Butkus
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
11
|
+
date: 2025-02-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday_middleware
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: multi_xml
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.5'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.5'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-its
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.2'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.2'
|
14
97
|
description: lbank.lt currency rates fetcher and converter
|
15
98
|
email:
|
16
99
|
- laurynas.butkus@gmail.com
|
@@ -18,44 +101,46 @@ executables: []
|
|
18
101
|
extensions: []
|
19
102
|
extra_rdoc_files: []
|
20
103
|
files:
|
21
|
-
- .
|
22
|
-
- .
|
23
|
-
- .
|
104
|
+
- ".github/workflows/main.yml"
|
105
|
+
- ".github/workflows/publish.yml"
|
106
|
+
- ".gitignore"
|
107
|
+
- ".rspec"
|
108
|
+
- ".ruby-version"
|
109
|
+
- ".travis.yml"
|
24
110
|
- Gemfile
|
25
111
|
- LICENSE
|
26
112
|
- README.md
|
27
113
|
- Rakefile
|
28
114
|
- lbank.gemspec
|
29
115
|
- lib/lbank.rb
|
116
|
+
- lib/lbank/errors.rb
|
117
|
+
- lib/lbank/memory_cache.rb
|
30
118
|
- lib/lbank/version.rb
|
31
119
|
- spec/lbank_spec.rb
|
32
120
|
- spec/spec_helper.rb
|
33
121
|
homepage: https://github.com/laurynas/lbank
|
34
122
|
licenses: []
|
35
|
-
|
123
|
+
metadata: {}
|
124
|
+
post_install_message:
|
36
125
|
rdoc_options: []
|
37
126
|
require_paths:
|
38
127
|
- lib
|
39
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
129
|
requirements:
|
42
|
-
- -
|
130
|
+
- - ">="
|
43
131
|
- !ruby/object:Gem::Version
|
44
132
|
version: '0'
|
45
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
46
|
-
none: false
|
47
134
|
requirements:
|
48
|
-
- -
|
135
|
+
- - ">="
|
49
136
|
- !ruby/object:Gem::Version
|
50
137
|
version: '0'
|
51
138
|
requirements: []
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
specification_version: 3
|
139
|
+
rubygems_version: 3.5.16
|
140
|
+
signing_key:
|
141
|
+
specification_version: 4
|
56
142
|
summary: Fetches currency rates from Lithuanian Central Bank website. Does currency
|
57
143
|
conversion. Supports historic currency rates.
|
58
144
|
test_files:
|
59
145
|
- spec/lbank_spec.rb
|
60
146
|
- spec/spec_helper.rb
|
61
|
-
has_rdoc:
|