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.
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