bond_calculator 0.0.2
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/.gitignore +17 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +7 -0
- data/README.md +78 -0
- data/Rakefile +13 -0
- data/bin/console +10 -0
- data/bond_calculator.gemspec +30 -0
- data/doc/BondCalculator.html +140 -0
- data/doc/BondCalculator/BaseCalculator.html +480 -0
- data/doc/BondCalculator/Bond.html +693 -0
- data/doc/BondCalculator/SpreadToBenchmark.html +567 -0
- data/doc/BondCalculator/SpreadToCurve.html +475 -0
- data/doc/_index.html +143 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +492 -0
- data/doc/file.README.html +133 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +133 -0
- data/doc/js/app.js +248 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +155 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/bond_calculator.rb +7 -0
- data/lib/bond_calculator/base_calculator.rb +37 -0
- data/lib/bond_calculator/bond.rb +48 -0
- data/lib/bond_calculator/spread_to_benchmark.rb +77 -0
- data/lib/bond_calculator/spread_to_curve.rb +64 -0
- data/lib/bond_calculator/version.rb +5 -0
- data/test/bond_calculator/base_calculator_test.rb +31 -0
- data/test/bond_calculator/bond_calculator_test.rb +9 -0
- data/test/bond_calculator/bond_test.rb +24 -0
- data/test/bond_calculator/spread_to_benchmark_test.rb +33 -0
- data/test/bond_calculator/spread_to_curve_test.rb +37 -0
- data/test/fixtures/c1.csv +4 -0
- data/test/fixtures/c2.csv +14 -0
- data/test/test_helper.rb +7 -0
- metadata +191 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'csv'
|
4
|
+
|
5
|
+
# Namespace for classes and modules that handle Bond calculation
|
6
|
+
# @since 0.0.1
|
7
|
+
module BondCalculator
|
8
|
+
# Abstract base class for Bond Calculation. Provides some helper methods for
|
9
|
+
# convert the csv file to a bond map and a filter for the bonds collection
|
10
|
+
#
|
11
|
+
# @author Lucas Sant' Anna
|
12
|
+
# @since 0.0.1
|
13
|
+
class BaseCalculator
|
14
|
+
# convert a csv file to a Bond list
|
15
|
+
# @author Lucas Sant' Anna
|
16
|
+
# @param [file_path] csv_path Any file with the the bond's csv header structure
|
17
|
+
# @return [Array<Bond>]
|
18
|
+
def csv_to_bonds(csv_path)
|
19
|
+
csv = File.open(csv_path, 'r')
|
20
|
+
bonds_csv = CSV.parse(csv, headers: true).map(&:to_h)
|
21
|
+
csv.close
|
22
|
+
bonds_csv.map { |line| Bond.new(line) }
|
23
|
+
end
|
24
|
+
|
25
|
+
# filter bond list by type
|
26
|
+
# @author Lucas Sant' Anna
|
27
|
+
# @param [String] type it is possible to search by any type eg:'corporate' or 'government'
|
28
|
+
# @param [Array<Bond>] bonds Bond list
|
29
|
+
# @return [Array<Bond>] bond list with the filterd type
|
30
|
+
def bonds_by_type(type, bonds)
|
31
|
+
return nil if type.nil? || bonds.nil?
|
32
|
+
|
33
|
+
bonds.select { |bond| bond.type == type }
|
34
|
+
.sort_by { |bond| bond.term_years }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Namespace for classes and modules that handle Bond calculation
|
4
|
+
# @since 0.0.1
|
5
|
+
module BondCalculator
|
6
|
+
|
7
|
+
# Bond is a PORO that represent the structure of benchmark and curve cvs's header
|
8
|
+
#
|
9
|
+
# @author Lucas Sant' Anna
|
10
|
+
# @since 0.0.1
|
11
|
+
class Bond
|
12
|
+
attr_reader :name, :type, :term_years, :yield_percent
|
13
|
+
|
14
|
+
# @param [Hash] args The options to create a Bond with
|
15
|
+
#
|
16
|
+
# @option args [String] :type Type of the Bond currencty we
|
17
|
+
# implement the calculation for corporate and government only.
|
18
|
+
# @option args [String] :bond Name of the company who is offering the Bond.
|
19
|
+
# @option args [String] :term Number of years to pay.
|
20
|
+
# @option args [String] :yield The interest rate.
|
21
|
+
#
|
22
|
+
# @return [<void>]
|
23
|
+
def initialize(args)
|
24
|
+
@type = format_type(args['type'])
|
25
|
+
@name = format_bond(args['bond'])
|
26
|
+
@term_years = format_term(args['term'])
|
27
|
+
@yield_percent = format_yield(args['yield'])
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def format_type(type)
|
33
|
+
type
|
34
|
+
end
|
35
|
+
|
36
|
+
def format_bond(name)
|
37
|
+
name
|
38
|
+
end
|
39
|
+
|
40
|
+
def format_term(term)
|
41
|
+
term.split(' ').first.to_f unless term.nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def format_yield(yield_percent)
|
45
|
+
yield_percent&.delete('%').to_f
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Namespace for classes and modules that handle Bond calculation
|
4
|
+
# @since 0.0.1
|
5
|
+
module BondCalculator
|
6
|
+
# Class that handle the calculation of the spread to benchmark
|
7
|
+
# Calculate the yield spread (return) between a corporate bond
|
8
|
+
# and its government bond benchmark.
|
9
|
+
#
|
10
|
+
# A government bond is a good benchmark if it is as close as possible
|
11
|
+
# to the corporate bond in terms of years to maturity (term).
|
12
|
+
#
|
13
|
+
# @author Lucas Sant' Anna
|
14
|
+
# @since 0.0.1
|
15
|
+
class SpreadToBenchmark < BaseCalculator
|
16
|
+
attr_reader :bonds
|
17
|
+
|
18
|
+
# @param [File] bond_file_path Csv benchmark file path
|
19
|
+
#
|
20
|
+
# @return [<void>]
|
21
|
+
def initialize(bond_file_path)
|
22
|
+
@bonds = csv_to_bonds(bond_file_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Execute the bussines rule to calculate the spread to Benchmark
|
26
|
+
# @return [Hash] :bond_name
|
27
|
+
# @return [Hash] :benchmark_name
|
28
|
+
# @return [Hash] :spread_to_benchmark
|
29
|
+
def calculate
|
30
|
+
response = []
|
31
|
+
corps = bonds_by_type('corporate', @bonds)
|
32
|
+
govs = bonds_by_type('government', @bonds)
|
33
|
+
|
34
|
+
corps.each do |corp|
|
35
|
+
benchmark = nil
|
36
|
+
govs.each do |gov|
|
37
|
+
if benchmark.nil?
|
38
|
+
benchmark = best_benchmark(corp, gov)
|
39
|
+
next
|
40
|
+
end
|
41
|
+
if benchmark[:term_spread] > term_spread(corp, gov)
|
42
|
+
benchmark.merge(best_benchmark(corp, gov))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
response << { bond_name: corp.name,
|
47
|
+
benchmark_name: benchmark[:candidate].name,
|
48
|
+
spread_to_benchmark: spread_to_benchmark(benchmark, corp) }
|
49
|
+
end
|
50
|
+
print(response)
|
51
|
+
|
52
|
+
response
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def best_benchmark(corporate, government)
|
58
|
+
{ candidate: government,
|
59
|
+
term_spread: term_spread(corporate, government) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def spread_to_benchmark(benchmark, corporate)
|
63
|
+
(benchmark[:candidate].yield_percent - corporate.yield_percent).round(2).abs
|
64
|
+
end
|
65
|
+
|
66
|
+
def print(response)
|
67
|
+
puts ' bond, benchmark, spread_to_benchmark '
|
68
|
+
response.each do |r|
|
69
|
+
puts " #{r[:bond_name]}, #{r[:benchmark_name]}, #{r[:spread_to_benchmark]} "
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def term_spread(bond1, bond2)
|
74
|
+
(bond1.term_years - bond2.term_years).abs
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Namespace for classes and modules that handle Bond calculationP
|
4
|
+
# @since 0.0.1
|
5
|
+
module BondCalculator
|
6
|
+
|
7
|
+
# Class that handle the calculation of the spread to curve
|
8
|
+
#
|
9
|
+
# Since the corporate bond term is not exactly the same as
|
10
|
+
# its benchmark term, we use linear interpolation
|
11
|
+
# to calculate the spread to the curve.
|
12
|
+
class SpreadToCurve < BaseCalculator
|
13
|
+
attr_reader :bonds
|
14
|
+
|
15
|
+
# @param [File] bond_file_path Csv curve file path
|
16
|
+
#
|
17
|
+
# @return [<void>]
|
18
|
+
def initialize(bond_file_path)
|
19
|
+
@bonds = csv_to_bonds(bond_file_path)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Execute the bussines rule to calculate the spread to curve
|
23
|
+
# @return [Hash] :bond_name
|
24
|
+
# @return [Hash] :spread_to_curve
|
25
|
+
def calculate
|
26
|
+
response = []
|
27
|
+
corps = bonds_by_type('corporate', @bonds)
|
28
|
+
govs = bonds_by_type('government', @bonds)
|
29
|
+
|
30
|
+
corps.each do |corp|
|
31
|
+
upper_bond = nil
|
32
|
+
lower_bond = nil
|
33
|
+
|
34
|
+
govs.each do |gov|
|
35
|
+
if corp.term_years <= gov.term_years
|
36
|
+
lower_bond = gov
|
37
|
+
break
|
38
|
+
else
|
39
|
+
upper_bond = gov
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
spread_to_curve = (corp.yield_percent - yield_on_curve(corp, lower_bond, upper_bond)).round(2)
|
44
|
+
response << { bond_name: corp.name, spread_to_curve: spread_to_curve }
|
45
|
+
end
|
46
|
+
print_response(response)
|
47
|
+
|
48
|
+
response
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def print_response(response)
|
54
|
+
puts 'bond, spread to curve'
|
55
|
+
response.each do |r|
|
56
|
+
puts "#{r[:bond_name]}, #{r[:spread_to_curve]}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def yield_on_curve(bond, lower_bond, upper_bond)
|
61
|
+
lower_bond.yield_percent + (bond.term_years - lower_bond.term_years) * ((upper_bond.yield_percent - lower_bond.yield_percent) / (upper_bond.term_years - lower_bond.term_years))
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe 'BaseCalculator#csv_to_bonds' do
|
6
|
+
it 'return bonds when parse the bond csv' do
|
7
|
+
c1 = File.join(File.dirname(__FILE__), '../fixtures/c1.csv')
|
8
|
+
bonds = BondCalculator::BaseCalculator.new.csv_to_bonds(c1)
|
9
|
+
assert !bonds.nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'return error when file empty' do
|
13
|
+
assert_raises(Errno::ENOENT) { BondCalculator::BaseCalculator.new.csv_to_bonds('') }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'BaseCalculator#bond_by_type' do
|
18
|
+
c1 = File.join(File.dirname(__FILE__), '../fixtures/c1.csv')
|
19
|
+
let(:bonds) { BondCalculator::BaseCalculator.new.csv_to_bonds(c1) }
|
20
|
+
|
21
|
+
it 'return all bonds for an expecific type' do
|
22
|
+
gov = BondCalculator::BaseCalculator.new.bonds_by_type('government', bonds)
|
23
|
+
assert !gov.nil?
|
24
|
+
assert !gov.empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'return empty when type is null' do
|
28
|
+
gov = BondCalculator::BaseCalculator.new.bonds_by_type(nil, bonds)
|
29
|
+
assert gov.nil?
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe 'Bond#new' do
|
6
|
+
it 'create bond with all parameters passed' do
|
7
|
+
bond = BondCalculator::Bond.new(
|
8
|
+
'type' => 'corporate',
|
9
|
+
'bond' => 'c1',
|
10
|
+
'term' => '10.3 years',
|
11
|
+
'yield' => '5.3 %'
|
12
|
+
)
|
13
|
+
|
14
|
+
assert !bond.nil?
|
15
|
+
assert_equal bond.type, 'corporate'
|
16
|
+
assert_equal bond.name, 'c1'
|
17
|
+
assert_equal bond.term_years, 10.3
|
18
|
+
assert_equal bond.yield_percent, 5.3
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'thow ArgumentError parameters not passed' do
|
22
|
+
assert_raises(ArgumentError) { BondCalculator::Bond.new }
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe 'SpreadToBanchmark#new' do
|
6
|
+
it 'populate bonds when file is correct' do
|
7
|
+
c1 = File.join(File.dirname(__FILE__), '../fixtures/c1.csv')
|
8
|
+
spread_to_benchmark = BondCalculator::SpreadToBenchmark.new(c1)
|
9
|
+
|
10
|
+
assert !spread_to_benchmark.bonds.nil?
|
11
|
+
assert spread_to_benchmark.bonds.size > 1
|
12
|
+
end
|
13
|
+
it 'error when file is wrong' do
|
14
|
+
assert_raises(Errno::ENOENT) { BondCalculator::SpreadToBenchmark.new('') }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'SpreadToBanchmark#calculate' do
|
19
|
+
c1 = File.join(File.dirname(__FILE__), '../fixtures/c1.csv')
|
20
|
+
let(:spread_to_banchmark) { BondCalculator::SpreadToBenchmark.new(c1) }
|
21
|
+
|
22
|
+
it 'return list with bond_name and spread to curve' do
|
23
|
+
response = spread_to_banchmark.calculate
|
24
|
+
|
25
|
+
assert !response.nil?
|
26
|
+
assert !response.empty?
|
27
|
+
|
28
|
+
first = response.first
|
29
|
+
assert_equal first[:bond_name], 'C1'
|
30
|
+
assert_equal first[:benchmark_name], 'G1'
|
31
|
+
assert_equal first[:spread_to_benchmark], 1.6
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
describe 'SpreadToCurve#new' do
|
6
|
+
it 'populate bonds when file is right' do
|
7
|
+
c2 = File.join(File.dirname(__FILE__), '../fixtures/c2.csv')
|
8
|
+
spread_to_curve = BondCalculator::SpreadToCurve.new(c2)
|
9
|
+
|
10
|
+
assert !spread_to_curve.bonds.nil?
|
11
|
+
assert !spread_to_curve.bonds.empty?
|
12
|
+
end
|
13
|
+
it 'error when file is wrong' do
|
14
|
+
assert_raises(Errno::ENOENT) { BondCalculator::SpreadToCurve.new('') }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'SpreadToCurve#calculate' do
|
19
|
+
c2 = File.join(File.dirname(__FILE__), '../fixtures/c2.csv')
|
20
|
+
let(:spread_to_curve) { BondCalculator::SpreadToCurve.new(c2) }
|
21
|
+
|
22
|
+
it 'return list with bond_name and spread to curve' do
|
23
|
+
response = spread_to_curve.calculate
|
24
|
+
|
25
|
+
response.each do |r|
|
26
|
+
assert !r[:bond_name].nil?
|
27
|
+
assert !r[:spread_to_curve].nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
assert !response.nil?
|
31
|
+
assert !response.empty?
|
32
|
+
|
33
|
+
first = response.first
|
34
|
+
assert_equal first[:bond_name], 'C1'
|
35
|
+
assert_equal first[:spread_to_curve], 1.43
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
bond,type,term,yield
|
2
|
+
C1,corporate,1.3 years,3.30%
|
3
|
+
C2,corporate,2.0 years,3.80%
|
4
|
+
C3,corporate,5.2 years,5.30%
|
5
|
+
C4,corporate,9.0 years,6.20%
|
6
|
+
C5,corporate,10.1 years,6.40%
|
7
|
+
C6,corporate,16.0 years,9.30%
|
8
|
+
C7,corporate,22.9 years,12.30%
|
9
|
+
G1,government,0.9 years,1.70%
|
10
|
+
G2,government,2.3 years,2.30%
|
11
|
+
G3,government,7.8 years,3.30%
|
12
|
+
G4,government,12 years,5.50%
|
13
|
+
G5,government,15.1 years,7.50%
|
14
|
+
G6,government,24.2 years,9.80%
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bond_calculator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lucas Sant Anna
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest-reporters
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.1.13
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.1'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.1.13
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: minitest
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '5.8'
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 5.8.4
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '5.8'
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 5.8.4
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: rake
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '10.0'
|
74
|
+
type: :development
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '10.0'
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: pry
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: rubocop
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.50.0
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - "~>"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 0.50.0
|
109
|
+
description: Calculate the best bond
|
110
|
+
email:
|
111
|
+
- l.minota@gmail.com
|
112
|
+
executables:
|
113
|
+
- console
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- ".gitignore"
|
118
|
+
- ".ruby-version"
|
119
|
+
- CHANGELOG.md
|
120
|
+
- Gemfile
|
121
|
+
- LICENSE.txt
|
122
|
+
- README.md
|
123
|
+
- Rakefile
|
124
|
+
- bin/console
|
125
|
+
- bond_calculator.gemspec
|
126
|
+
- doc/BondCalculator.html
|
127
|
+
- doc/BondCalculator/BaseCalculator.html
|
128
|
+
- doc/BondCalculator/Bond.html
|
129
|
+
- doc/BondCalculator/SpreadToBenchmark.html
|
130
|
+
- doc/BondCalculator/SpreadToCurve.html
|
131
|
+
- doc/_index.html
|
132
|
+
- doc/class_list.html
|
133
|
+
- doc/css/common.css
|
134
|
+
- doc/css/full_list.css
|
135
|
+
- doc/css/style.css
|
136
|
+
- doc/file.README.html
|
137
|
+
- doc/file_list.html
|
138
|
+
- doc/frames.html
|
139
|
+
- doc/index.html
|
140
|
+
- doc/js/app.js
|
141
|
+
- doc/js/full_list.js
|
142
|
+
- doc/js/jquery.js
|
143
|
+
- doc/method_list.html
|
144
|
+
- doc/top-level-namespace.html
|
145
|
+
- lib/bond_calculator.rb
|
146
|
+
- lib/bond_calculator/base_calculator.rb
|
147
|
+
- lib/bond_calculator/bond.rb
|
148
|
+
- lib/bond_calculator/spread_to_benchmark.rb
|
149
|
+
- lib/bond_calculator/spread_to_curve.rb
|
150
|
+
- lib/bond_calculator/version.rb
|
151
|
+
- test/bond_calculator/base_calculator_test.rb
|
152
|
+
- test/bond_calculator/bond_calculator_test.rb
|
153
|
+
- test/bond_calculator/bond_test.rb
|
154
|
+
- test/bond_calculator/spread_to_benchmark_test.rb
|
155
|
+
- test/bond_calculator/spread_to_curve_test.rb
|
156
|
+
- test/fixtures/c1.csv
|
157
|
+
- test/fixtures/c2.csv
|
158
|
+
- test/test_helper.rb
|
159
|
+
homepage: http://lucassantanna.com
|
160
|
+
licenses:
|
161
|
+
- MIT
|
162
|
+
metadata: {}
|
163
|
+
post_install_message:
|
164
|
+
rdoc_options: []
|
165
|
+
require_paths:
|
166
|
+
- lib
|
167
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: 2.4.0
|
172
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
requirements: []
|
178
|
+
rubyforge_project:
|
179
|
+
rubygems_version: 2.6.13
|
180
|
+
signing_key:
|
181
|
+
specification_version: 4
|
182
|
+
summary: Ruby Best Bond Calculator
|
183
|
+
test_files:
|
184
|
+
- test/bond_calculator/base_calculator_test.rb
|
185
|
+
- test/bond_calculator/bond_calculator_test.rb
|
186
|
+
- test/bond_calculator/bond_test.rb
|
187
|
+
- test/bond_calculator/spread_to_benchmark_test.rb
|
188
|
+
- test/bond_calculator/spread_to_curve_test.rb
|
189
|
+
- test/fixtures/c1.csv
|
190
|
+
- test/fixtures/c2.csv
|
191
|
+
- test/test_helper.rb
|