amazon-pricing 0.1.94 → 0.1.95

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzE2MTU4YzE3YmEzM2ExYjlmOWZmMDk5ZWRhNjA2NjllZjZlZDY5Zg==
4
+ NDk2N2NkZjYwYzAxOTAyYzk2ZWM4ZmNhNzFhZWRlMmQ0YTQzMmM3Zg==
5
5
  data.tar.gz: !binary |-
6
- MzdjODUyZDg3NzI4OTY2ZDcxNzQwMmNiNThiMjY3NTBkOGNhZWI0OQ==
6
+ OTBkNWNkYzNlOWRkOTAyZmUwZjZmYjFhYjkzMWFlOGFmZmMyMGQ1Yw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MjBkYzJmZjgxMTc3MTFmMjdmNzM4YjMyMmIyMjVkNjRhN2VhODUyNTI5MDE0
10
- ZjVlZjY0NTk0OWQ4ZjM0OTE1ODYwM2Y5YzMxZjZkMTcwYjczYmZlM2ZhYzYw
11
- ZWU3MDJiMGFkZTM3YzdhNzU2ZGJiZDhlZjk4NDc4MDI3YzM4ZjE=
9
+ ZjExYTkzMjQ4ZWFkZmMzODMxZTIzYjUzNWM5YjlkNTI5ZjllOTlmYjEyYjg2
10
+ MmFiMDU0N2Q4MTljZDVmMTM2Y2RjN2Q2OGNmZDE3YTY0ZjllYzdhNWNkZWM3
11
+ ODMxYmYxYzBjMTNhYzVhZDhhOGJiOThlYjc5YjlhZDI1ZGRlOTg=
12
12
  data.tar.gz: !binary |-
13
- MTFiOTgzNDRjYTE5YWMxMDc5NjBjM2MyOTkwM2YxYTUzNjA2NmY1MDEyMWI3
14
- ZWI4ZWE0MmE4YjcyMDEwMTc1Zjk0MzFhMGJmODQ3YjNmYzM3Njc1OWY0Mjll
15
- OTkwYTEzZmRmZGJlZGI1NjY1NzFkZDg4NjAxMGJjZjZjOTA0MTg=
13
+ NDZjOTRjMmZmMTc3MjEyOTQyNjJjN2RmYTlhNDE3NTllMTI1M2FjMzIxZWQ2
14
+ OTlhNTUzNTM3NWFkMjE0MTE2NjI3YWY2OWNiNDQ3MjExNDE3MGJiYjNkMGVh
15
+ YzVjYmY5NjI1Y2MyMTJjMGRkZTUxMDVlYzY5ODFmMjY0YWMzMDY=
data/Rakefile CHANGED
@@ -34,6 +34,27 @@ task :print_ec2_price_list do
34
34
  print_ec2_table(pricing)
35
35
  end
36
36
 
37
+ desc "Prints current EC2 DI pricing in CSV format"
38
+ task :print_ec2_di_price_list do
39
+ require 'amazon-pricing'
40
+ pricing = AwsPricing::Ec2DiPriceList.new
41
+ print_ec2_table(pricing)
42
+ end
43
+
44
+ desc "Prints current EC2 Dedicated Host Instance pricing in CSV format"
45
+ task :print_ec2_dhi_price_list do
46
+ require 'amazon-pricing'
47
+ pricing = AwsPricing::Ec2DedicatedHostInstancePriceList.new
48
+ print_ec2_table(pricing)
49
+ end
50
+
51
+ desc "Prints current EC2 Dedicated Host pricing in CSV format"
52
+ task :print_ec2_dh_price_list do
53
+ require 'amazon-pricing'
54
+ pricing = AwsPricing::Ec2DedicatedHostPriceList.new
55
+ print_ec2_dh_table(pricing)
56
+ end
57
+
37
58
  desc "Prints current RDS pricing in CSV format"
38
59
  task :print_rds_price_list do
39
60
  require 'amazon-pricing'
@@ -95,6 +116,35 @@ def print_ec2_table(pricing, target_region = nil)
95
116
  end
96
117
  end
97
118
 
119
+ def print_ec2_dh_table(pricing, target_region = nil)
120
+ line = "Region,Instance Type,API Name,Memory (MB),Disk (GB),Compute Units,Virtual Cores,Disk Type,OD Linux PPH,OD Windows PPH,OD RHEL PPH,OD SLES PPH,OD MsWinSQL PPH,OD MsWinSQLWeb PPH,"
121
+ [:year1, :year3].each do |term|
122
+ [:light, :medium, :heavy, :allupfront, :partialupfront, :noupfront].each do |res_type|
123
+ [:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
124
+ line += "#{term} #{res_type} #{os} Prepay,#{term} #{res_type} #{os} PPH,"
125
+ end
126
+ end
127
+ end
128
+ puts line.chop
129
+ pricing.regions.each do |region|
130
+ next if region.name != target_region if target_region
131
+ region.ec2_dh_types.each do |t|
132
+ line = "#{region.name},#{t.name},#{t.api_name},#{t.memory_in_mb},#{t.disk_in_gb},#{t.compute_units},#{t.virtual_cores},#{t.disk_type},"
133
+ [:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
134
+ line += "#{t.price_per_hour(os, :ondemand)},"
135
+ end
136
+ [:year1, :year3].each do |term|
137
+ [:light, :medium, :heavy, :allupfront, :partialupfront, :noupfront].each do |res_type|
138
+ [:linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb].each do |os|
139
+ line += "#{t.prepay(os, res_type, term)},#{t.price_per_hour(os, res_type, term)},"
140
+ end
141
+ end
142
+ end
143
+ puts line.chop
144
+ end
145
+ end
146
+ end
147
+
98
148
  def print_elasticache_table(pricing, target_region = nil)
99
149
  line = "Region,Node Type,API Name,Memmory (MB),Virtual Cores,Disk Type,OD PPH,"
100
150
  [:year1, :year3].each do |term|
@@ -8,6 +8,8 @@ require 'amazon-pricing/common/ec2_common'
8
8
  require 'amazon-pricing/aws-price-list'
9
9
  require 'amazon-pricing/ec2-price-list'
10
10
  require 'amazon-pricing/ec2-di-price-list'
11
+ require 'amazon-pricing/ec2-dhi-price-list'
12
+ require 'amazon-pricing/ec2-dh-price-list'
11
13
  require 'amazon-pricing/rds-price-list'
12
14
  require 'amazon-pricing/dynamo-db-price-list'
13
15
  require 'amazon-pricing/elasticache-price-list'
@@ -104,6 +104,7 @@ module AwsPricing
104
104
  ELASTICACHE_BASE_URL = "http://a0.awsstatic.com/pricing/1/elasticache/"
105
105
 
106
106
  DI_OD_BASE_URL = "http://a0.awsstatic.com/pricing/1/dedicated-instances/"
107
+ DH_OD_BASE_URL = "http://a0.awsstatic.com/pricing/1/dedicated-hosts/"
107
108
  RESERVED_DI_BASE_URL = "http://a0.awsstatic.com/pricing/1/ec2/ri-v2/"
108
109
  RESERVED_DI_PREV_GEN_BASE_URL = "http://a0.awsstatic.com/pricing/1/ec2/previous-generation/ri-v2/"
109
110
 
@@ -1,5 +1,7 @@
1
1
  module AwsPricing
2
+
2
3
  module Ec2Common
4
+
3
5
  # Retrieves the EC2 on-demand instance pricing.
4
6
  # type_of_instance = :ondemand, :light, :medium, :heavy
5
7
  def fetch_ec2_instance_pricing(url, type_of_instance, operating_system)
@@ -0,0 +1,36 @@
1
+ require 'amazon-pricing/definitions/instance-type'
2
+
3
+ module AwsPricing
4
+ class Ec2DedicatedHostType < InstanceType
5
+
6
+ def initialize(region, family_name)
7
+ @category_types = {}
8
+ @region = region
9
+ @name = ''
10
+ @api_name = family_name
11
+ end
12
+
13
+ def category_types
14
+ @category_types
15
+ end
16
+
17
+ def region
18
+ @region
19
+ end
20
+
21
+ def update_dh_pricing(operating_system, dhprice)
22
+ os = get_category_type(operating_system)
23
+ if os.nil?
24
+ os = OperatingSystem.new(self, operating_system)
25
+ @category_types[operating_system] = os
26
+ end
27
+
28
+ category = operating_system.to_s
29
+ values = { category => dhprice }
30
+ price = coerce_price(values[category])
31
+ os.set_price_per_hour(:ondemand, nil, price)
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -88,6 +88,22 @@ module AwsPricing
88
88
  end
89
89
  end
90
90
 
91
+ # operating_system = :linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb
92
+ # dhprice is a string representing the price per hour for the Dedicated Host
93
+ # capacity is the number of this type of instancess supported on this Dedicated Host
94
+ def update_dhi_pricing(operating_system, dhprice, capacity)
95
+ os = get_category_type(operating_system)
96
+ if os.nil?
97
+ os = OperatingSystem.new(self, operating_system)
98
+ @category_types[operating_system] = os
99
+ end
100
+
101
+ category = operating_system.to_s
102
+ values = { category => dhprice }
103
+ price = coerce_price(values[category])
104
+ os.set_price_per_hour(:ondemand, nil, price/capacity)
105
+ end
106
+
91
107
  def update_pricing2(operating_system, res_type, ondemand_pph = nil, year1_prepay = nil, year3_prepay = nil, year1_pph = nil, year3_pph = nil)
92
108
 
93
109
  os = get_category_type(operating_system)
@@ -38,7 +38,7 @@ module AwsPricing
38
38
 
39
39
  # Keep this in for backwards compatibility within current major version of gem
40
40
  def disk_in_mb
41
- @disk_in_gb * 1000
41
+ @disk_in_gb.nil? ? 0 : @disk_in_gb * 1000
42
42
  end
43
43
 
44
44
  def memory_in_gb
@@ -15,13 +15,14 @@ module AwsPricing
15
15
  # e.g. us-east, us-west
16
16
  #
17
17
  class Region
18
- attr_accessor :name, :ebs_price, :ec2_instance_types, :rds_instance_types, :elasticache_node_types
18
+ attr_accessor :name, :ebs_price, :ec2_instance_types, :rds_instance_types, :elasticache_node_types, :ec2_dh_types
19
19
 
20
20
  def initialize(name)
21
21
  @name = name
22
22
  @ec2_instance_types = {}
23
23
  @rds_instance_types = {}
24
24
  @elasticache_node_types = {}
25
+ @ec2_dh_types = {}
25
26
  end
26
27
 
27
28
  # Maintained for backward compatibility reasons (retrieves EC2 instance type)
@@ -41,6 +42,10 @@ module AwsPricing
41
42
  @elasticache_node_types.values
42
43
  end
43
44
 
45
+ def ec2_dh_types
46
+ @ec2_dh_types.values
47
+ end
48
+
44
49
  # Returns whether an instance_type is available.
45
50
  # operating_system = :linux, :mswin, :rhel, :sles, :mswinSQL, :mswinSQLWeb
46
51
  # type_of_instance = :ondemand, :light, :medium, :heavy
@@ -78,6 +83,15 @@ module AwsPricing
78
83
  current
79
84
  end
80
85
 
86
+ def add_or_update_ec2_dh_type(family)
87
+ current = get_ec2_dh_type(family)
88
+ if current.nil?
89
+ current = Ec2DedicatedHostType.new(self, family)
90
+ @ec2_dh_types[family] = current
91
+ end
92
+ current
93
+ end
94
+
81
95
  # Maintained for backward compatibility reasons (retrieves EC2 instance type)
82
96
  def get_instance_type(api_name)
83
97
  get_ec2_instance_type(api_name)
@@ -95,6 +109,10 @@ module AwsPricing
95
109
  @elasticache_node_types[api_name]
96
110
  end
97
111
 
112
+ def get_ec2_dh_type(family)
113
+ @ec2_dh_types[family]
114
+ end
115
+
98
116
  end
99
117
 
100
118
  end
@@ -0,0 +1,52 @@
1
+ module AwsPricing
2
+ class Ec2DedicatedHostPriceList < PriceList
3
+ include AwsPricing::Ec2Common
4
+
5
+ def initialize
6
+ super
7
+ InstanceType.populate_lookups
8
+ get_ec2_dh_od_pricing
9
+ end
10
+
11
+ def os_types
12
+ @@OS_TYPES
13
+ end
14
+
15
+ protected
16
+
17
+ @@OS_TYPES = [ 'linux', 'rhel', 'sles', 'mswin', 'mswinSQL', 'mswinSQLWeb', 'mswinSQLEnterprise' ]
18
+
19
+ def get_ec2_dh_od_pricing
20
+ @@OS_TYPES.each do |os|
21
+ fetch_ec2_dedicated_host_pricing(DH_OD_BASE_URL + "dh-od.min.js", os.to_sym)
22
+ end
23
+ end
24
+
25
+ def fetch_ec2_dedicated_host_pricing(url, operating_system)
26
+ res = PriceList.fetch_url(url)
27
+ begin
28
+ res['config']['regions'].each do |reg|
29
+ region_name = reg['region']
30
+ region = get_region(region_name)
31
+ if region.nil?
32
+ $stderr.puts "[fetch_ec2_dedicated_host_pricing] WARNING: unable to find region #{region_name}"
33
+ next
34
+ end
35
+ reg['types'].each do |type|
36
+ type_name = type['name']
37
+ tiers = type['tiers']
38
+ tiers.each do |tier|
39
+ family = tier['name']
40
+ api_name = family
41
+ dhprice = tier['prices']['USD']
42
+ dh_type = region.add_or_update_ec2_dh_type(family)
43
+ dh_type.update_dh_pricing(operating_system, dhprice)
44
+ end
45
+ end
46
+ end
47
+ rescue UnknownTypeError
48
+ $stderr.puts "[fetch_ec2_dedicated_host_pricing] WARNING: encountered #{$!.message}"
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,74 @@
1
+ module AwsPricing
2
+ class Ec2DedicatedHostInstancePriceList < PriceList
3
+ include AwsPricing::Ec2Common
4
+
5
+ def initialize
6
+ super
7
+ InstanceType.populate_lookups
8
+ get_ec2_dhi_od_pricing
9
+ end
10
+
11
+ def os_types
12
+ @@OS_TYPES
13
+ end
14
+
15
+ protected
16
+
17
+ @@OS_TYPES = [ 'linux', 'rhel', 'sles', 'mswin', 'mswinSQL', 'mswinSQLWeb', 'mswinSQLEnterprise' ]
18
+
19
+ @@CAPACITY_HASH = {
20
+ 'c3' => { "large"=>16, "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
21
+ 'c4' => { "large"=>16, "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
22
+ 'p2' => { "xlarge"=>16, "8xlarge"=>2, "16xlarge"=>1 },
23
+ 'g2' => { "2xlarge"=>4, "8xlarge"=>1 },
24
+ 'm3' => { "medium"=>32, "large"=>16, "xlarge"=>8, "2xlarge"=>4 },
25
+ 'd2' => { "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
26
+ 'r4' => { "large"=>32, "xlarge"=>16, "2xlarge"=>8, "4xlarge"=>4, "8xlarge"=>2, "16xlarge"=>1 },
27
+ 'r3' => { "large"=>16, "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1 },
28
+ 'm4' => { "large"=>22, "xlarge"=>11, "2xlarge"=>5, "4xlarge"=>4, "10xlarge"=>1, "16xlarge"=>1 },
29
+ 'i2' => { "xlarge"=>8, "2xlarge"=>4, "4xlarge"=>2, "8xlarge"=>1, "16xlarge"=>1 },
30
+ 'i3' => { "large"=>32, "xlarge"=>16, "2xlarge"=>8, "4xlarge"=>4, "8xlarge"=>2, "16xlarge"=>1 },
31
+ 'x1' => { "16xlarge"=>2, "32xlarge"=>1 }
32
+ }
33
+
34
+ def get_ec2_dhi_od_pricing
35
+ @@OS_TYPES.each do |os|
36
+ fetch_ec2_dedicated_host_instance_pricing(DH_OD_BASE_URL + "dh-od.min.js", os.to_sym)
37
+ end
38
+ end
39
+
40
+ def fetch_ec2_dedicated_host_instance_pricing(url, operating_system)
41
+ res = PriceList.fetch_url(url)
42
+ res['config']['regions'].each do |reg|
43
+ begin
44
+ region_name = reg['region']
45
+ region = get_region(region_name)
46
+ if region.nil?
47
+ $stderr.puts "[fetch_ec2_dedicated_host_instance_pricing] WARNING: unable to find region #{region_name}"
48
+ next
49
+ end
50
+ reg['types'].each do |type|
51
+ type_name = type['name']
52
+ tiers = type['tiers']
53
+ tiers.each do |tier|
54
+ family = tier['name']
55
+
56
+ # hack for now until I can get capacity for fpga instances
57
+ next if family == 'f1'
58
+
59
+ dhprice = tier['prices']['USD']
60
+ @@CAPACITY_HASH[family].each do |inst_size,capacity|
61
+ api_name, name = Ec2InstanceType.get_name(family, "#{family}.#{inst_size}", false)
62
+ instance_type = region.add_or_update_ec2_instance_type(api_name, name)
63
+ instance_type.update_dhi_pricing(operating_system, dhprice, capacity)
64
+ end
65
+ end
66
+ end
67
+
68
+ rescue UnknownTypeError
69
+ $stderr.puts "[fetch_ec2_dedicated_host_instance_pricing] WARNING: encountered #{$!.message}"
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -8,5 +8,5 @@
8
8
  # Home:: http://github.com/CloudHealth/amazon-pricing
9
9
  #++
10
10
  module AwsPricing
11
- VERSION = '0.1.94'
11
+ VERSION = '0.1.95'
12
12
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe AwsPricing::Ec2DedicatedHostPriceList do
4
+
5
+ before(:all) do
6
+ @pricing = AwsPricing::Ec2DedicatedHostPriceList.new
7
+ end
8
+
9
+ def validate_price_in_region region
10
+ # Result have valid node name
11
+ region.ec2_dh_types.each do |dh_type|
12
+ expect(dh_type.api_name).to have(2).characters
13
+ expect(dh_type.region.ec2_dh_types[0].category_types[:linux].name).to eq(:linux)
14
+ expect(dh_type.region.ec2_dh_types[0].category_types[:linux].ondemand_price_per_hour.class).to eq(Float)
15
+ end
16
+ end
17
+
18
+ describe 'new' do
19
+ it 'Ec2DedicatedHostPriceList.new should return valid response' do
20
+ @pricing.regions.each do |region|
21
+ validate_price_in_region region
22
+ end
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe AwsPricing::Ec2DedicatedHostInstancePriceList do
4
+
5
+ before(:all) do
6
+ @pricing = AwsPricing::Ec2DedicatedHostInstancePriceList.new
7
+ @dh_pricing = AwsPricing::Ec2DedicatedHostPriceList.new
8
+ end
9
+
10
+ def validate_price_in_region region
11
+ # Result have valid node name
12
+ region.ec2_instance_types.each do |inst_type|
13
+ expect(inst_type.api_name).to match(/[[:alpha:]][[:alpha:]]./)
14
+ expect(inst_type.category_types).to have_exactly(@pricing.os_types.length).items
15
+ expect(inst_type.category_types[0].price_per_hour.class).to eq(Float)
16
+
17
+ family_name = inst_type.api_name.split('.').first
18
+ dh_region_arr = @dh_pricing.regions.select { |reg| reg.name == region.name }
19
+ expect(dh_region_arr).to have_exactly(1).items
20
+ dh_region = dh_region_arr[0]
21
+ dh_price_per_hour = dh_region.ec2_dh_types[0].price_per_hour(:linux, :ondemand)
22
+ dh_dh_type_arr = dh_region.ec2_dh_types.select { |type| type.api_name == family_name }
23
+ expect(dh_dh_type_arr).to have_exactly(1).items
24
+ dh_dh_type = dh_dh_type_arr[0]
25
+ expect(inst_type.category_types[0].price_per_hour).to be <= dh_dh_type.category_types[:linux].ondemand_price_per_hour
26
+ end
27
+ end
28
+
29
+ describe 'new' do
30
+ it 'Ec2DedicatedHostInstancePriceList.new should return valid response' do
31
+ @pricing.regions.each do |region|
32
+ validate_price_in_region region
33
+ end
34
+ end
35
+ end
36
+
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amazon-pricing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.94
4
+ version: 0.1.95
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Kinsella
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-02 00:00:00.000000000 Z
11
+ date: 2017-05-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A Ruby library for retrieving pricing for Amazon Web Services
14
14
  email:
@@ -38,6 +38,7 @@ files:
38
38
  - lib/amazon-pricing/definitions/category-type.rb
39
39
  - lib/amazon-pricing/definitions/database-type.rb
40
40
  - lib/amazon-pricing/definitions/ebs-price.rb
41
+ - lib/amazon-pricing/definitions/ec2-dh-type.rb
41
42
  - lib/amazon-pricing/definitions/ec2-instance-type.rb
42
43
  - lib/amazon-pricing/definitions/elasticache_node_type.rb
43
44
  - lib/amazon-pricing/definitions/instance-type.rb
@@ -45,6 +46,8 @@ files:
45
46
  - lib/amazon-pricing/definitions/rds-instance-type.rb
46
47
  - lib/amazon-pricing/definitions/region.rb
47
48
  - lib/amazon-pricing/dynamo-db-price-list.rb
49
+ - lib/amazon-pricing/ec2-dh-price-list.rb
50
+ - lib/amazon-pricing/ec2-dhi-price-list.rb
48
51
  - lib/amazon-pricing/ec2-di-price-list.rb
49
52
  - lib/amazon-pricing/ec2-price-list.rb
50
53
  - lib/amazon-pricing/elasticache-price-list.rb
@@ -52,6 +55,8 @@ files:
52
55
  - lib/amazon-pricing/rds-price-list.rb
53
56
  - lib/amazon-pricing/version.rb
54
57
  - spec/lib/amazon-pricing/definitions/database-type_spec.rb
58
+ - spec/lib/amazon-pricing/ec2_dh_pricing_spec.rb
59
+ - spec/lib/amazon-pricing/ec2_dhi_pricing_spec.rb
55
60
  - spec/lib/amazon-pricing/elasticache_pricing_spec.rb
56
61
  - spec/lib/amazon-pricing/helpers/instance-type-spec.rb
57
62
  - spec/lib/amazon-pricing/rds_pricing_spec.rb
@@ -90,6 +95,8 @@ specification_version: 4
90
95
  summary: Amazon Web Services Pricing Ruby gem
91
96
  test_files:
92
97
  - spec/lib/amazon-pricing/definitions/database-type_spec.rb
98
+ - spec/lib/amazon-pricing/ec2_dh_pricing_spec.rb
99
+ - spec/lib/amazon-pricing/ec2_dhi_pricing_spec.rb
93
100
  - spec/lib/amazon-pricing/elasticache_pricing_spec.rb
94
101
  - spec/lib/amazon-pricing/helpers/instance-type-spec.rb
95
102
  - spec/lib/amazon-pricing/rds_pricing_spec.rb