spacex 0.0.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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