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 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
@@ -1,7 +1,5 @@
1
1
  rvm:
2
- - 1.9.3
3
- - 1.9.2
4
- - jruby
5
- - rbx
2
+ - ruby-head
3
+ - 2.2.2
6
4
  script: "bundle exec rake spec"
7
5
 
data/Gemfile CHANGED
@@ -2,10 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rake'
6
- gem 'tzinfo'
7
- gem 'activesupport'
8
-
9
5
  group :test do
10
- gem "rspec"
11
- end
6
+ gem 'rake'
7
+ gem 'nokogiri'
8
+ end
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # Lbank
2
2
 
3
- [![Build Status](http://travis-ci.org/laurynas/lbank.png)](http://travis-ci.org/laurynas/lbank)
3
+ [![Gem](https://img.shields.io/gem/v/lbank.svg)](https://rubygems.org/gems/lbank)
4
+ [![Build Status](https://github.com/laurynas/lbank/actions/workflows/main.yml/badge.svg)](https://github.com/laurynas/lbank/actions)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
4
6
 
5
- Fetches currency rates from Lithuanian Central Bank website http://lbank.lt.
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 = ["Laurynas Butkus"]
6
- gem.email = ["laurynas.butkus@gmail.com"]
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 = "https://github.com/laurynas/lbank"
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 = "lbank"
15
- gem.require_paths = ["lib"]
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
@@ -0,0 +1,4 @@
1
+ module Lbank
2
+ class Error < StandardError; end
3
+ class ResponseError < Error; end
4
+ end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Lbank
2
- VERSION = "0.0.3"
2
+ VERSION = '1.1.0'
3
3
  end
data/lib/lbank.rb CHANGED
@@ -1,46 +1,69 @@
1
- require "lbank/version"
2
- require 'open-uri'
3
- require 'csv'
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
- BASE_CURRENCY = 'LTL'
9
- TIMEZONE = 'Europe/Vilnius'
10
- SOURCE = 'http://lbank.lt/exchange/Results.asp'
16
+ module_function
11
17
 
12
- @@cache = {}
18
+ def cache
19
+ @cache ||= MemoryCache.new
20
+ end
21
+
22
+ def cache=(store)
23
+ @cache = store
24
+ end
13
25
 
14
- def self.currency_rates(time = nil)
15
- time ||= Time.now
26
+ def currency_rates(time = nil)
27
+ time ||= Time.now
16
28
  bank_time = time.to_time.in_time_zone(TIMEZONE)
17
- date = [ bank_time.year, bank_time.month, bank_time.day ]
29
+ date = bank_time.strftime('%Y-%m-%d')
18
30
 
19
- if @@cache[date].nil?
20
- url = "#{SOURCE}?Y=%i&M=%i&D=%i&S=csv" % date
21
- rates = {}
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
- data = open(url).read
35
+ raise ResponseError.new(error['Desc']) if error
24
36
 
25
- CSV.parse(data).each do |row|
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[BASE_CURRENCY] = 1.0
39
+ rates = { fx_rates[0]['CcyAmt'][0]['Ccy'] => 1 }
40
+ rates[LTL] ||= LTL_RATE
30
41
 
31
- @@cache[date] = rates
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 self.convert_currency(amount, from_currency, to_currency, date = nil)
38
- rates = self.currency_rates(date)
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 = rates[to_currency.to_s]
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
- it "should return currency rates" do
6
- currency_rates = subject.currency_rates
6
+ describe '#currency_rates' do
7
+ subject { described_class.currency_rates(date) }
7
8
 
8
- currency_rates['USD'].should be > 0
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
- date = Date.new(2012, 8, 4)
11
+ context 'when invalid time' do
12
+ let(:date) { Time.now + 1.week }
15
13
 
16
- round(subject.convert_currency(10, 'LTL', 'EUR', date)).should == 2.90
17
- round(subject.convert_currency(10, 'LTL', 'USD', date)).should == 3.55
18
- round(subject.convert_currency(100, 'RUB', 'LTL', date)).should == 8.68
19
- round(subject.convert_currency(100, 'RUB', 'USD', date)).should == 3.08
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
- private
23
-
24
- def round(number, precision = 2)
25
- ("%.#{precision}f" % number).to_f
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
@@ -1,5 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
+ require 'rspec/its'
3
4
  require 'lbank'
4
5
 
5
6
  RSpec.configure do |config|
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: 0.0.3
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: 2012-08-04 00:00:00.000000000 Z
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
- - .gitignore
22
- - .rspec
23
- - .travis.yml
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
- post_install_message:
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
- rubyforge_project:
53
- rubygems_version: 1.8.24
54
- signing_key:
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: