bond_calculator 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +5 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE.txt +7 -0
  7. data/README.md +78 -0
  8. data/Rakefile +13 -0
  9. data/bin/console +10 -0
  10. data/bond_calculator.gemspec +30 -0
  11. data/doc/BondCalculator.html +140 -0
  12. data/doc/BondCalculator/BaseCalculator.html +480 -0
  13. data/doc/BondCalculator/Bond.html +693 -0
  14. data/doc/BondCalculator/SpreadToBenchmark.html +567 -0
  15. data/doc/BondCalculator/SpreadToCurve.html +475 -0
  16. data/doc/_index.html +143 -0
  17. data/doc/class_list.html +51 -0
  18. data/doc/css/common.css +1 -0
  19. data/doc/css/full_list.css +58 -0
  20. data/doc/css/style.css +492 -0
  21. data/doc/file.README.html +133 -0
  22. data/doc/file_list.html +56 -0
  23. data/doc/frames.html +17 -0
  24. data/doc/index.html +133 -0
  25. data/doc/js/app.js +248 -0
  26. data/doc/js/full_list.js +216 -0
  27. data/doc/js/jquery.js +4 -0
  28. data/doc/method_list.html +155 -0
  29. data/doc/top-level-namespace.html +110 -0
  30. data/lib/bond_calculator.rb +7 -0
  31. data/lib/bond_calculator/base_calculator.rb +37 -0
  32. data/lib/bond_calculator/bond.rb +48 -0
  33. data/lib/bond_calculator/spread_to_benchmark.rb +77 -0
  34. data/lib/bond_calculator/spread_to_curve.rb +64 -0
  35. data/lib/bond_calculator/version.rb +5 -0
  36. data/test/bond_calculator/base_calculator_test.rb +31 -0
  37. data/test/bond_calculator/bond_calculator_test.rb +9 -0
  38. data/test/bond_calculator/bond_test.rb +24 -0
  39. data/test/bond_calculator/spread_to_benchmark_test.rb +33 -0
  40. data/test/bond_calculator/spread_to_curve_test.rb +37 -0
  41. data/test/fixtures/c1.csv +4 -0
  42. data/test/fixtures/c2.csv +14 -0
  43. data/test/test_helper.rb +7 -0
  44. metadata +191 -0
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bond_calculator/version'
4
+ require 'bond_calculator/bond'
5
+ require 'bond_calculator/base_calculator'
6
+ require 'bond_calculator/spread_to_benchmark'
7
+ require 'bond_calculator/spread_to_curve'
@@ -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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BondCalculator
4
+ VERSION = '0.0.2'
5
+ 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,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ describe 'BondCalculator::VERSION' do
6
+ it 'has a version number' do
7
+ value(::BondCalculator::VERSION).wont_be_nil
8
+ end
9
+ 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,4 @@
1
+ bond,type,term,yield
2
+ C1,corporate,10.3 years,5.30%
3
+ G1,government,9.4 years,3.70%
4
+ G2,government,12 years,4.80%
@@ -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%
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/reporters'
4
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
5
+ require 'minitest/autorun'
6
+ require 'bond_calculator'
7
+ require 'pry'
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