spacex 0.0.7 → 1.0.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +5 -5
  3. data/CHANGELOG.md +18 -2
  4. data/CONTRIBUTING.md +7 -7
  5. data/Gemfile +2 -0
  6. data/README.md +207 -98
  7. data/lib/spacex.rb +3 -0
  8. data/lib/spacex/base_request.rb +45 -20
  9. data/lib/spacex/capsules.rb +19 -0
  10. data/lib/spacex/company_info.rb +1 -1
  11. data/lib/spacex/cores.rb +22 -0
  12. data/lib/spacex/dragon_capsules.rb +2 -16
  13. data/lib/spacex/launches.rb +13 -1
  14. data/lib/spacex/missions.rb +2 -16
  15. data/lib/spacex/roadster.rb +1 -1
  16. data/lib/spacex/rockets.rb +7 -0
  17. data/lib/spacex/ships.rb +2 -16
  18. data/lib/spacex/version.rb +1 -1
  19. data/spacex.gemspec +6 -5
  20. data/spec/fixtures/spacex/capsules.yml +83 -0
  21. data/spec/fixtures/spacex/capsules/C202.yml +123 -0
  22. data/spec/fixtures/spacex/company_info/info.yml +63 -0
  23. data/spec/fixtures/spacex/cores.yml +62 -0
  24. data/spec/fixtures/spacex/cores/B1041.yml +123 -0
  25. data/spec/fixtures/spacex/dragon_capsules/info.yml +6 -6
  26. data/spec/fixtures/spacex/dragon_capsules/info/dragon1.yml +64 -0
  27. data/spec/fixtures/spacex/launches.yml +62 -0
  28. data/spec/fixtures/spacex/launches/all.yml +62 -0
  29. data/spec/fixtures/spacex/launches/next.yml +123 -0
  30. data/spec/fixtures/spacex/missions/F3364BF.yml +77 -0
  31. data/spec/fixtures/spacex/missions/info.yml +7 -7
  32. data/spec/fixtures/spacex/roadster/info.yml +64 -0
  33. data/spec/fixtures/spacex/rockets/info.yml +105 -0
  34. data/spec/fixtures/spacex/rockets/info/falcon1.yml +139 -0
  35. data/spec/fixtures/spacex/rockets/info/invalid.yml +61 -0
  36. data/spec/fixtures/spacex/ships/info.yml +20 -20
  37. data/spec/fixtures/spacex/ships/info/AMERICANCHAMPION.yml +61 -0
  38. data/spec/spacex/capsules_spec.rb +38 -0
  39. data/spec/spacex/company_info_spec.rb +2 -4
  40. data/spec/spacex/cores_spec.rb +45 -0
  41. data/spec/spacex/dragon_capsules_spec.rb +6 -6
  42. data/spec/spacex/launches_spec.rb +205 -15
  43. data/spec/spacex/missions_spec.rb +3 -5
  44. data/spec/spacex/roadster_spec.rb +3 -3
  45. data/spec/spacex/rockets_spec.rb +210 -0
  46. data/spec/spacex/ships_spec.rb +4 -4
  47. data/spec/spacex/version_spec.rb +1 -3
  48. data/spec/spec_helper.rb +9 -0
  49. metadata +63 -20
data/lib/spacex.rb CHANGED
@@ -11,3 +11,6 @@ require_relative 'spacex/roadster'
11
11
  require_relative 'spacex/dragon_capsules'
12
12
  require_relative 'spacex/ships'
13
13
  require_relative 'spacex/missions'
14
+ require_relative 'spacex/rockets'
15
+ require_relative 'spacex/capsules'
16
+ require_relative 'spacex/cores'
@@ -1,31 +1,56 @@
1
- require 'byebug'
2
-
3
1
  module SPACEX
4
2
  class Response < Hashie::Mash
5
3
  disable_warnings
6
4
  end
7
5
 
8
6
  module BaseRequest
9
- def self.get(path)
10
- data = call_api(path)
11
- SPACEX::Response.new(data.get.body)
12
- end
7
+ class << self
8
+ def info(path, klass = nil, params = {})
9
+ response_body = get(path, params).body
10
+ process(response_body, klass)
11
+ end
13
12
 
14
- def self.retrieve_all(path)
15
- data = call_api(path)
16
- data.get.body.map { |k| [k] }
17
- end
13
+ private
14
+
15
+ def get(path, params)
16
+ conn(path).get do |req|
17
+ req.params = params
18
+ end
19
+ end
20
+
21
+ def process(response_body, klass)
22
+ if response_body.is_a? Array
23
+ response_body.map do |element|
24
+ processed_response(element, klass)
25
+ end
26
+ else
27
+ processed_response(response_body, klass)
28
+ end
29
+ end
30
+
31
+ def processed_response(response, klass)
32
+ if klass.nil?
33
+ spacex_response(response)
34
+ else
35
+ klass.new(spacex_response(response))
36
+ end
37
+ end
38
+
39
+ def spacex_response(response)
40
+ SPACEX::Response.new(response)
41
+ end
18
42
 
19
- def self.call_api(path)
20
- Faraday.new(
21
- url: "#{SPACEX::ROOT_URI}/#{path}",
22
- request: {
23
- params_encoder: Faraday::FlatParamsEncoder
24
- }
25
- ) do |c|
26
- c.use ::FaradayMiddleware::ParseJson
27
- c.use Faraday::Response::RaiseError
28
- c.use Faraday::Adapter::NetHttp
43
+ def conn(path)
44
+ Faraday.new(
45
+ url: "#{SPACEX::ROOT_URI}/#{path}",
46
+ request: {
47
+ params_encoder: Faraday::FlatParamsEncoder
48
+ }
49
+ ) do |c|
50
+ c.use ::FaradayMiddleware::ParseJson
51
+ c.use Faraday::Response::RaiseError
52
+ c.use Faraday::Adapter::NetHttp
53
+ end
29
54
  end
30
55
  end
31
56
  end
@@ -0,0 +1,19 @@
1
+ module SPACEX
2
+ class Capsules < Hashie::Trash
3
+ include Hashie::Extensions::IgnoreUndeclared
4
+
5
+ property 'capsule_serial'
6
+ property 'capsule_id'
7
+ property 'status'
8
+ property 'original_launch'
9
+ property 'original_launch_unix'
10
+ property 'missions'
11
+ property 'landings'
12
+ property 'type'
13
+ property 'details'
14
+
15
+ def self.info(capsule_serial = nil)
16
+ SPACEX::BaseRequest.info("capsules/#{capsule_serial}", SPACEX::Capsules)
17
+ end
18
+ end
19
+ end
@@ -1,7 +1,7 @@
1
1
  module SPACEX
2
2
  module CompanyInfo
3
3
  def self.info
4
- SPACEX::BaseRequest.get('info')
4
+ SPACEX::BaseRequest.info('info')
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,22 @@
1
+ module SPACEX
2
+ class Cores < Hashie::Trash
3
+ include Hashie::Extensions::IgnoreUndeclared
4
+
5
+ property 'core_serial'
6
+ property 'block'
7
+ property 'status'
8
+ property 'original_launch'
9
+ property 'original_launch_unix'
10
+ property 'missions'
11
+ property 'rtls_attempts'
12
+ property 'rtls_landings'
13
+ property 'asds_attempts'
14
+ property 'asds_landings'
15
+ property 'water_landing'
16
+ property 'details'
17
+
18
+ def self.info(core_serial = nil)
19
+ SPACEX::BaseRequest.info("cores/#{core_serial}", SPACEX::Cores)
20
+ end
21
+ end
22
+ end
@@ -26,22 +26,8 @@ module SPACEX
26
26
  property 'wikipedia'
27
27
  property 'description'
28
28
 
29
- class << self
30
- def retrieve_all
31
- data = SPACEX::BaseRequest.call_api('dragons')
32
- data.get.body.map { |k| SPACEX::DragonCapsules.new(k) }
33
- end
34
-
35
- def get(dragon_id = nil)
36
- return retrieve_all if dragon_id.nil?
37
-
38
- data = SPACEX::BaseRequest.get("dragons/#{dragon_id}")
39
- SPACEX::DragonCapsules.new(data)
40
- end
41
-
42
- def info(dragon_id = nil)
43
- get(dragon_id)
44
- end
29
+ def self.info(dragon_id = nil)
30
+ SPACEX::BaseRequest.info("dragons/#{dragon_id}", SPACEX::DragonCapsules)
45
31
  end
46
32
  end
47
33
  end
@@ -1,7 +1,19 @@
1
1
  module SPACEX
2
2
  module Launches
3
3
  def self.latest
4
- SPACEX::BaseRequest.get('launches/latest')
4
+ SPACEX::BaseRequest.info('launches/latest')
5
+ end
6
+
7
+ def self.next
8
+ SPACEX::BaseRequest.info('launches/next')
9
+ end
10
+
11
+ def self.all
12
+ SPACEX::BaseRequest.info('launches')
13
+ end
14
+
15
+ def self.info
16
+ all
5
17
  end
6
18
  end
7
19
  end
@@ -11,22 +11,8 @@ module SPACEX
11
11
  property 'twitter'
12
12
  property 'description'
13
13
 
14
- class << self
15
- def retrieve_all
16
- data = SPACEX::BaseRequest.call_api('missions')
17
- data.get.body.map { |k| SPACEX::Missions.new(k) }
18
- end
19
-
20
- def get(mission_id = nil)
21
- return retrieve_all if mission_id.nil?
22
-
23
- data = SPACEX::BaseRequest.get("missions/#{mission_id}")
24
- SPACEX::Missions.new(data)
25
- end
26
-
27
- def info(mission_id = nil)
28
- get(mission_id)
29
- end
14
+ def self.info(mission_id = nil)
15
+ SPACEX::BaseRequest.info("missions/#{mission_id}", SPACEX::Missions)
30
16
  end
31
17
  end
32
18
  end
@@ -1,7 +1,7 @@
1
1
  module SPACEX
2
2
  module Roadster
3
3
  def self.info
4
- SPACEX::BaseRequest.get('roadster')
4
+ SPACEX::BaseRequest.info('roadster')
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,7 @@
1
+ module SPACEX
2
+ module Rockets
3
+ def self.info(rocket_id = nil)
4
+ SPACEX::BaseRequest.info("rockets/#{rocket_id}")
5
+ end
6
+ end
7
+ end
data/lib/spacex/ships.rb CHANGED
@@ -26,22 +26,8 @@ module SPACEX
26
26
  property 'url'
27
27
  property 'image'
28
28
 
29
- class << self
30
- def retrieve_all
31
- data = SPACEX::BaseRequest.call_api('ships')
32
- data.get.body.map { |k| SPACEX::Ships.new(k) }
33
- end
34
-
35
- def get(ship_id = nil)
36
- return retrieve_all if ship_id.nil?
37
-
38
- data = SPACEX::BaseRequest.get("ships/#{ship_id}")
39
- SPACEX::Ships.new(data)
40
- end
41
-
42
- def info(ship_id = nil)
43
- get(ship_id)
44
- end
29
+ def self.info(ship_id = nil)
30
+ SPACEX::BaseRequest.info("ships/#{ship_id}", SPACEX::Ships)
45
31
  end
46
32
  end
47
33
  end
@@ -1,5 +1,5 @@
1
1
  module SPACEX
2
- VERSION = '0.0.7'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  ROOT_URI = 'https://api.spacexdata.com/v3'.freeze
4
4
 
5
5
  def self.help
data/spacex.gemspec CHANGED
@@ -17,12 +17,13 @@ Gem::Specification.new do |s|
17
17
  s.files = `git ls-files`.split("\n")
18
18
  s.test_files = `git ls-files -- spec/*`.split("\n")
19
19
  s.require_paths = ['lib']
20
- s.add_dependency 'faraday', '>= 0.9'
21
- s.add_dependency 'faraday_middleware'
20
+ s.add_dependency 'faraday', '~> 0.9'
21
+ s.add_dependency 'faraday_middleware', '~> 0.12'
22
22
  s.add_dependency 'hashie', '3.6.0'
23
+ s.add_development_dependency 'coveralls'
23
24
  s.add_development_dependency 'rake', '~> 10'
24
- s.add_development_dependency 'rspec'
25
+ s.add_development_dependency 'rspec', '~> 3.8'
25
26
  s.add_development_dependency 'rubocop', '0.51.0'
26
- s.add_development_dependency 'vcr'
27
- s.add_development_dependency 'webmock'
27
+ s.add_development_dependency 'vcr', '~> 4'
28
+ s.add_development_dependency 'webmock', '~> 3.4'
28
29
  end
@@ -0,0 +1,83 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.spacexdata.com/v3/capsules/
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.15.3
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Date:
22
+ - Mon, 15 Oct 2018 04:13:37 GMT
23
+ Content-Type:
24
+ - application/json; charset=utf-8
25
+ Transfer-Encoding:
26
+ - chunked
27
+ Connection:
28
+ - keep-alive
29
+ Set-Cookie:
30
+ - __cfduid=dd8346f9a0220b57866735728f74ebd191539576817; expires=Tue, 15-Oct-19
31
+ 04:13:37 GMT; path=/; domain=.spacexdata.com; HttpOnly; Secure
32
+ Vary:
33
+ - Accept-Encoding, Origin
34
+ X-Dns-Prefetch-Control:
35
+ - 'off'
36
+ X-Frame-Options:
37
+ - SAMEORIGIN
38
+ Strict-Transport-Security:
39
+ - max-age=15552000; includeSubDomains
40
+ X-Download-Options:
41
+ - noopen
42
+ X-Content-Type-Options:
43
+ - nosniff
44
+ X-Xss-Protection:
45
+ - 1; mode=block
46
+ Access-Control-Allow-Origin:
47
+ - "*"
48
+ X-Response-Time:
49
+ - 49ms
50
+ Expect-Ct:
51
+ - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
52
+ Server:
53
+ - cloudflare
54
+ Cf-Ray:
55
+ - 469f74439912572f-IAD
56
+ body:
57
+ encoding: ASCII-8BIT
58
+ string: '[{"capsule_serial":"C201","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
59
+ 2.0","details":"Pressure vessel used for Dragon 2 structural testing. Rumored
60
+ to be repurposed for first Red Dragon Mission","reuse_count":0},{"capsule_serial":"C202","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
61
+ 2.0","details":"Capsule used to qualify Dragon 2''s environmental control
62
+ and life support systems.","reuse_count":0},{"capsule_serial":"C203","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
63
+ 2.0","details":"Rumored to be used for Inflight Abort Test after DM-1","reuse_count":0},{"capsule_serial":"C204","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
64
+ 2.0","details":"Currently in construction for use in DM-2","reuse_count":0},{"capsule_serial":"C205","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
65
+ 2.0","details":"In construction for use in first mission in contract under
66
+ the CCtCap contract","reuse_count":0},{"capsule_serial":"C101","capsule_id":"dragon1","status":"retired","original_launch":"2010-12-08T15:43:00.000Z","original_launch_unix":1291822980,"missions":[{"name":"COTS
67
+ 1","flight":7}],"landings":0,"type":"Dragon 1.0","details":"Reentered after
68
+ three weeks in orbit","reuse_count":0},{"capsule_serial":"C102","capsule_id":"dragon1","status":"retired","original_launch":"2012-05-02T07:44:00.000Z","original_launch_unix":1335944640,"missions":[{"name":"COTS
69
+ 2","flight":8}],"landings":1,"type":"Dragon 1.0","details":"First Dragon spacecraft","reuse_count":0},{"capsule_serial":"C103","capsule_id":"dragon1","status":"unknown","original_launch":"2012-10-08T00:35:00.000Z","original_launch_unix":1349656500,"missions":[{"name":"CRS-1","flight":9}],"landings":1,"type":"Dragon
70
+ 1.0","details":"First of twenty missions flown under the CRS1 contract","reuse_count":0},{"capsule_serial":"C104","capsule_id":"dragon1","status":"unknown","original_launch":"2013-03-01T19:10:00.000Z","original_launch_unix":1362165000,"missions":[{"name":"CRS-2","flight":10}],"landings":1,"type":"Dragon
71
+ 1.0","details":null,"reuse_count":0},{"capsule_serial":"C105","capsule_id":"dragon1","status":"unknown","original_launch":"2014-04-18T19:25:00.000Z","original_launch_unix":1397849100,"missions":[{"name":"CRS-3","flight":14}],"landings":1,"type":"Dragon
72
+ 1.1","details":"First Dragon v1.1 capsule","reuse_count":0},{"capsule_serial":"C106","capsule_id":"dragon1","status":"active","original_launch":"2014-09-21T05:52:00.000Z","original_launch_unix":1411278720,"missions":[{"name":"CRS-4","flight":18},{"name":"CRS-11","flight":41}],"landings":2,"type":"Dragon
73
+ 1.1","details":"First Dragon capsule to be reused","reuse_count":1},{"capsule_serial":"C107","capsule_id":"dragon1","status":"unknown","original_launch":"2015-01-10T09:47:00.000Z","original_launch_unix":1420883220,"missions":[{"name":"CRS-5","flight":19}],"landings":1,"type":"Dragon
74
+ 1.1","details":null,"reuse_count":0},{"capsule_serial":"C108","capsule_id":"dragon1","status":"active","original_launch":"2015-04-14T20:10:00.000Z","original_launch_unix":1429042200,"missions":[{"name":"CRS-6","flight":22},{"name":"CRS-13","flight":51}],"landings":2,"type":"Dragon
75
+ 1.1","details":"Second Dragon capsule to be reused","reuse_count":1},{"capsule_serial":"C109","capsule_id":"dragon1","status":"destroyed","original_launch":"2015-06-28T14:21:00.000Z","original_launch_unix":1435501260,"missions":[{"name":"CRS-7","flight":24}],"landings":0,"type":"Dragon
76
+ 1.1","details":"Destroyed on impact after F9 launch failure","reuse_count":0},{"capsule_serial":"C110","capsule_id":"dragon1","status":"active","original_launch":"2016-04-08T20:43:00.000Z","original_launch_unix":1460148180,"missions":[{"name":"CRS-8","flight":28},{"name":"CRS-14","flight":59}],"landings":2,"type":"Dragon
77
+ 1.1","details":null,"reuse_count":1},{"capsule_serial":"C111","capsule_id":"dragon1","status":"active","original_launch":"2016-07-18T04:45:00.000Z","original_launch_unix":1468817100,"missions":[{"name":"CRS-9","flight":32},{"name":"CRS-15","flight":64}],"landings":2,"type":"Dragon
78
+ 1.1","details":null,"reuse_count":1},{"capsule_serial":"C112","capsule_id":"dragon1","status":"active","original_launch":"2017-02-19T14:39:00.000Z","original_launch_unix":1487515140,"missions":[{"name":"CRS-10","flight":36}],"landings":1,"type":"Dragon
79
+ 1.1","details":null,"reuse_count":0},{"capsule_serial":"C113","capsule_id":"dragon1","status":"active","original_launch":"2017-08-14T16:31:00.000Z","original_launch_unix":1502728260,"missions":[{"name":"CRS-12","flight":45}],"landings":1,"type":"Dragon
80
+ 1.1","details":"The last newly manufactured Dragon 1","reuse_count":0}]'
81
+ http_version:
82
+ recorded_at: Mon, 15 Oct 2018 04:13:37 GMT
83
+ recorded_with: VCR 4.0.0
@@ -0,0 +1,123 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.spacexdata.com/v3/capsules/C202
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.15.3
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Date:
22
+ - Thu, 11 Oct 2018 16:56:57 GMT
23
+ Content-Type:
24
+ - application/json; charset=utf-8
25
+ Transfer-Encoding:
26
+ - chunked
27
+ Connection:
28
+ - keep-alive
29
+ Set-Cookie:
30
+ - __cfduid=dde4b2f1d71fa0b62f41b29183867cebd1539277017; expires=Fri, 11-Oct-19
31
+ 16:56:57 GMT; path=/; domain=.spacexdata.com; HttpOnly; Secure
32
+ Vary:
33
+ - Accept-Encoding, Origin
34
+ X-Dns-Prefetch-Control:
35
+ - 'off'
36
+ X-Frame-Options:
37
+ - SAMEORIGIN
38
+ Strict-Transport-Security:
39
+ - max-age=15552000; includeSubDomains
40
+ X-Download-Options:
41
+ - noopen
42
+ X-Content-Type-Options:
43
+ - nosniff
44
+ X-Xss-Protection:
45
+ - 1; mode=block
46
+ Access-Control-Allow-Origin:
47
+ - "*"
48
+ X-Response-Time:
49
+ - 35ms
50
+ Expect-Ct:
51
+ - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
52
+ Server:
53
+ - cloudflare
54
+ Cf-Ray:
55
+ - 4682dcee4d542474-IAD
56
+ body:
57
+ encoding: ASCII-8BIT
58
+ string: '{"capsule_serial":"C202","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
59
+ 2.0","details":"Capsule used to qualify Dragon 2''s environmental control
60
+ and life support systems.","reuse_count":0}'
61
+ http_version:
62
+ recorded_at: Thu, 11 Oct 2018 16:56:57 GMT
63
+ - request:
64
+ method: get
65
+ uri: https://api.spacexdata.com/v3/capsules/C202
66
+ body:
67
+ encoding: US-ASCII
68
+ string: ''
69
+ headers:
70
+ User-Agent:
71
+ - Faraday v0.15.3
72
+ Accept-Encoding:
73
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
74
+ Accept:
75
+ - "*/*"
76
+ response:
77
+ status:
78
+ code: 200
79
+ message: OK
80
+ headers:
81
+ Date:
82
+ - Thu, 11 Oct 2018 16:56:57 GMT
83
+ Content-Type:
84
+ - application/json; charset=utf-8
85
+ Transfer-Encoding:
86
+ - chunked
87
+ Connection:
88
+ - keep-alive
89
+ Set-Cookie:
90
+ - __cfduid=d39640f3b8c92ab574c8c50a302d44b5b1539277017; expires=Fri, 11-Oct-19
91
+ 16:56:57 GMT; path=/; domain=.spacexdata.com; HttpOnly; Secure
92
+ Vary:
93
+ - Accept-Encoding, Origin
94
+ X-Dns-Prefetch-Control:
95
+ - 'off'
96
+ X-Frame-Options:
97
+ - SAMEORIGIN
98
+ Strict-Transport-Security:
99
+ - max-age=15552000; includeSubDomains
100
+ X-Download-Options:
101
+ - noopen
102
+ X-Content-Type-Options:
103
+ - nosniff
104
+ X-Xss-Protection:
105
+ - 1; mode=block
106
+ Access-Control-Allow-Origin:
107
+ - "*"
108
+ X-Response-Time:
109
+ - 38ms
110
+ Expect-Ct:
111
+ - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
112
+ Server:
113
+ - cloudflare
114
+ Cf-Ray:
115
+ - 4682dcefa91a5729-IAD
116
+ body:
117
+ encoding: ASCII-8BIT
118
+ string: '{"capsule_serial":"C202","capsule_id":"dragon2","status":"active","original_launch":null,"original_launch_unix":null,"missions":[],"landings":0,"type":"Dragon
119
+ 2.0","details":"Capsule used to qualify Dragon 2''s environmental control
120
+ and life support systems.","reuse_count":0}'
121
+ http_version:
122
+ recorded_at: Thu, 11 Oct 2018 16:56:57 GMT
123
+ recorded_with: VCR 4.0.0