duffel_api 0.0.1.pre.dev → 0.1.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +82 -0
  3. data/.github/dependabot.yml +6 -0
  4. data/.gitignore +9 -0
  5. data/.rubocop.yml +9 -9
  6. data/CHANGELOG.md +1 -3
  7. data/CODE_OF_CONDUCT.md +1 -1
  8. data/Gemfile +10 -2
  9. data/LICENSE.txt +1 -1
  10. data/README.md +190 -33
  11. data/Rakefile +1 -3
  12. data/bin/console +7 -0
  13. data/bin/setup +2 -0
  14. data/duffel_api.gemspec +40 -0
  15. data/examples/book_and_change.rb +106 -0
  16. data/examples/book_with_seat.rb +91 -0
  17. data/examples/exploring_data.rb +43 -0
  18. data/examples/hold_and_pay_later.rb +82 -0
  19. data/examples/search_and_book.rb +91 -0
  20. data/lib/duffel_api/api_response.rb +17 -0
  21. data/lib/duffel_api/api_service.rb +37 -0
  22. data/lib/duffel_api/client.rb +87 -0
  23. data/lib/duffel_api/errors/airline_error.rb +8 -0
  24. data/lib/duffel_api/errors/api_error.rb +8 -0
  25. data/lib/duffel_api/errors/authentication_error.rb +8 -0
  26. data/lib/duffel_api/errors/error.rb +54 -0
  27. data/lib/duffel_api/errors/invalid_request_error.rb +8 -0
  28. data/lib/duffel_api/errors/invalid_state_error.rb +8 -0
  29. data/lib/duffel_api/errors/rate_limit_error.rb +8 -0
  30. data/lib/duffel_api/errors/validation_error.rb +8 -0
  31. data/lib/duffel_api/list_response.rb +27 -0
  32. data/lib/duffel_api/middlewares/raise_duffel_errors.rb +67 -0
  33. data/lib/duffel_api/paginator.rb +27 -0
  34. data/lib/duffel_api/request.rb +64 -0
  35. data/lib/duffel_api/resources/aircraft.rb +26 -0
  36. data/lib/duffel_api/resources/airline.rb +26 -0
  37. data/lib/duffel_api/resources/airport.rb +40 -0
  38. data/lib/duffel_api/resources/base_resource.rb +16 -0
  39. data/lib/duffel_api/resources/offer.rb +60 -0
  40. data/lib/duffel_api/resources/offer_passenger.rb +28 -0
  41. data/lib/duffel_api/resources/offer_request.rb +34 -0
  42. data/lib/duffel_api/resources/order.rb +58 -0
  43. data/lib/duffel_api/resources/order_cancellation.rb +34 -0
  44. data/lib/duffel_api/resources/order_change.rb +46 -0
  45. data/lib/duffel_api/resources/order_change_offer.rb +46 -0
  46. data/lib/duffel_api/resources/order_change_request.rb +30 -0
  47. data/lib/duffel_api/resources/payment.rb +26 -0
  48. data/lib/duffel_api/resources/payment_intent.rb +52 -0
  49. data/lib/duffel_api/resources/refund.rb +42 -0
  50. data/lib/duffel_api/resources/seat_map.rb +24 -0
  51. data/lib/duffel_api/resources/webhook.rb +32 -0
  52. data/lib/duffel_api/response.rb +45 -0
  53. data/lib/duffel_api/services/aircraft_service.rb +36 -0
  54. data/lib/duffel_api/services/airlines_service.rb +36 -0
  55. data/lib/duffel_api/services/airports_service.rb +36 -0
  56. data/lib/duffel_api/services/base_service.rb +29 -0
  57. data/lib/duffel_api/services/offer_passengers_service.rb +30 -0
  58. data/lib/duffel_api/services/offer_requests_service.rb +67 -0
  59. data/lib/duffel_api/services/offers_service.rb +36 -0
  60. data/lib/duffel_api/services/order_cancellations_service.rb +75 -0
  61. data/lib/duffel_api/services/order_change_offers_service.rb +36 -0
  62. data/lib/duffel_api/services/order_change_requests_service.rb +37 -0
  63. data/lib/duffel_api/services/order_changes_service.rb +56 -0
  64. data/lib/duffel_api/services/orders_service.rb +74 -0
  65. data/lib/duffel_api/services/payment_intents_service.rb +56 -0
  66. data/lib/duffel_api/services/payments_service.rb +26 -0
  67. data/lib/duffel_api/services/refunds_service.rb +36 -0
  68. data/lib/duffel_api/services/seat_maps_service.rb +19 -0
  69. data/lib/duffel_api/services/webhooks_service.rb +83 -0
  70. data/lib/duffel_api/version.rb +1 -1
  71. data/lib/duffel_api.rb +51 -4
  72. metadata +90 -12
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
4
+ module DuffelAPI
5
+ module Resources
6
+ class Webhook < BaseResource
7
+ attr_reader :active
8
+ attr_reader :created_at
9
+ attr_reader :events
10
+ attr_reader :id
11
+ attr_reader :live_mode
12
+ attr_reader :secret
13
+ attr_reader :updated_at
14
+ attr_reader :url
15
+
16
+ def initialize(object, response = nil)
17
+ @object = object
18
+
19
+ @active = object["active"]
20
+ @created_at = object["created_at"]
21
+ @events = object["events"]
22
+ @id = object["id"]
23
+ @live_mode = object["live_mode"]
24
+ @secret = object["secret"]
25
+ @updated_at = object["updated_at"]
26
+ @url = object["url"]
27
+
28
+ super(object, response)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ class Response
5
+ extend Forwardable
6
+
7
+ def_delegator :@response, :headers
8
+ def_delegator :@response, :status, :status_code
9
+
10
+ def initialize(response)
11
+ @response = response
12
+ end
13
+
14
+ def raw_body
15
+ @response.body
16
+ end
17
+
18
+ # Return the body of parsed JSON body of the API response
19
+ def parsed_body
20
+ JSON.parse(raw_body) unless raw_body.empty?
21
+ end
22
+
23
+ # Returns the meta hash of the response
24
+ def meta
25
+ return {} if parsed_body.nil?
26
+
27
+ parsed_body.fetch("meta", {})
28
+ rescue JSON::ParserError
29
+ {}
30
+ end
31
+
32
+ # Returns the request ID from the response headers
33
+ def request_id
34
+ normalised_headers["x-request-id"]
35
+ end
36
+
37
+ private
38
+
39
+ def normalised_headers
40
+ headers.transform_keys(&:downcase)
41
+ end
42
+
43
+ def json?; end
44
+ end
45
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class AircraftService < BaseService
6
+ def list(options = {})
7
+ path = "/air/aircraft"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Aircraft,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ DuffelAPI::Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/aircraft/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Aircraft.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class AirlinesService < BaseService
6
+ def list(options = {})
7
+ path = "/air/airlines"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Airline,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ DuffelAPI::Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/airlines/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Airline.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class AirportsService < BaseService
6
+ def list(options = {})
7
+ path = "/air/airports"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Airport,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ DuffelAPI::Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/airports/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Airport.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cgi"
4
+
5
+ module DuffelAPI
6
+ module Services
7
+ class BaseService
8
+ def initialize(api_service)
9
+ @api_service = api_service
10
+ end
11
+
12
+ def make_request(method, path, options = {})
13
+ @api_service.make_request(method, path, options)
14
+ end
15
+
16
+ private
17
+
18
+ def substitute_url_pattern(url, param_map)
19
+ param_map.reduce(url) do |new_url, (param, value)|
20
+ new_url.gsub(":#{param}", CGI.escape(value))
21
+ end
22
+ end
23
+
24
+ def unenvelope_body(parsed_body)
25
+ parsed_body["data"]
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OfferPassengersService < BaseService
6
+ def update(offer_id, passenger_id, options = {})
7
+ path = substitute_url_pattern(
8
+ "/air/offers/:offer_id/passengers/:passenger_id",
9
+ "offer_id" => offer_id,
10
+ "passenger_id" => passenger_id,
11
+ )
12
+
13
+ params = options.delete(:params) || {}
14
+ options[:params] = {}
15
+ options[:params]["data"] = params
16
+
17
+ begin
18
+ response = make_request(:patch, path, options)
19
+
20
+ # Response doesn't raise any errors until #body is called
21
+ response.tap(&:raw_body)
22
+ end
23
+
24
+ return if response.raw_body.nil?
25
+
26
+ Resources::OfferPassenger.new(unenvelope_body(response.parsed_body), response)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OfferRequestsService < BaseService
6
+ def create(options = {})
7
+ path = "/air/offer_requests"
8
+
9
+ params = options.delete(:params) || {}
10
+
11
+ # The "Create offer request" API expects a JSON body and can also accept the
12
+ # `return_offers` query parameter. No other endpoints in the Duffel API allow
13
+ # both. To avoid making the client library interface confusing, we get the client
14
+ # to pass this value in along with the body params, and we know to move it into
15
+ # the querystring.
16
+ return_offers = params.delete(:return_offers)
17
+
18
+ unless return_offers.nil?
19
+ options[:query_params] = { return_offers: return_offers }
20
+ end
21
+
22
+ options[:params] = {}
23
+ options[:params]["data"] = params
24
+
25
+ begin
26
+ response = make_request(:post, path, options)
27
+
28
+ # Response doesn't raise any errors until #body is called
29
+ response.tap(&:raw_body)
30
+ end
31
+
32
+ return if response.raw_body.nil?
33
+
34
+ Resources::OfferRequest.new(unenvelope_body(response.parsed_body), response)
35
+ end
36
+
37
+ def list(options = {})
38
+ path = "/air/offer_requests"
39
+
40
+ response = make_request(:get, path, options)
41
+
42
+ ListResponse.new(
43
+ response: response,
44
+ unenveloped_body: unenvelope_body(response.parsed_body),
45
+ resource_class: Resources::OfferRequest,
46
+ )
47
+ end
48
+
49
+ def all(options = {})
50
+ Paginator.new(
51
+ service: self,
52
+ options: options,
53
+ ).enumerator
54
+ end
55
+
56
+ def get(id, options = {})
57
+ path = substitute_url_pattern("/air/offer_requests/:id", "id" => id)
58
+
59
+ response = make_request(:get, path, options)
60
+
61
+ return if response.raw_body.nil?
62
+
63
+ Resources::OfferRequest.new(unenvelope_body(response.parsed_body), response)
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OffersService < BaseService
6
+ def list(options = {})
7
+ path = "/air/offers"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::Offer,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/offers/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::Offer.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderCancellationsService < BaseService
6
+ def create(options = {})
7
+ path = "/air/order_cancellations"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::OrderCancellation.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def confirm(id, options = {})
26
+ path = substitute_url_pattern("/air/order_cancellations/:id/actions/confirm",
27
+ "id" => id)
28
+
29
+ params = options.delete(:params) || {}
30
+ options[:params] = {}
31
+ options[:params]["data"] = params
32
+
33
+ begin
34
+ response = make_request(:post, path, options)
35
+
36
+ # Response doesn't raise any errors until #body is called
37
+ response.tap(&:raw_body)
38
+ end
39
+
40
+ return if response.raw_body.nil?
41
+
42
+ Resources::OrderCancellation.new(unenvelope_body(response.parsed_body), response)
43
+ end
44
+
45
+ def list(options = {})
46
+ path = "/air/order_cancellations"
47
+
48
+ response = make_request(:get, path, options)
49
+
50
+ ListResponse.new(
51
+ response: response,
52
+ unenveloped_body: unenvelope_body(response.parsed_body),
53
+ resource_class: Resources::OrderCancellation,
54
+ )
55
+ end
56
+
57
+ def all(options = {})
58
+ Paginator.new(
59
+ service: self,
60
+ options: options,
61
+ ).enumerator
62
+ end
63
+
64
+ def get(id, options = {})
65
+ path = substitute_url_pattern("/air/order_cancellations/:id", "id" => id)
66
+
67
+ response = make_request(:get, path, options)
68
+
69
+ return if response.raw_body.nil?
70
+
71
+ Resources::OrderCancellation.new(unenvelope_body(response.parsed_body), response)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderChangeOffersService < BaseService
6
+ def list(options = {})
7
+ path = "/air/order_change_offers"
8
+
9
+ response = make_request(:get, path, options)
10
+
11
+ ListResponse.new(
12
+ response: response,
13
+ unenveloped_body: unenvelope_body(response.parsed_body),
14
+ resource_class: Resources::OrderChangeOffer,
15
+ )
16
+ end
17
+
18
+ def all(options = {})
19
+ Paginator.new(
20
+ service: self,
21
+ options: options,
22
+ ).enumerator
23
+ end
24
+
25
+ def get(id, options = {})
26
+ path = substitute_url_pattern("/air/order_change_offers/:id", "id" => id)
27
+
28
+ response = make_request(:get, path, options)
29
+
30
+ return if response.raw_body.nil?
31
+
32
+ Resources::OrderChangeOffer.new(unenvelope_body(response.parsed_body), response)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderChangeRequestsService < BaseService
6
+ def create(options = {})
7
+ path = "/air/order_change_requests"
8
+
9
+ params = options.delete(:params) || {}
10
+
11
+ options[:params] = {}
12
+ options[:params]["data"] = params
13
+
14
+ begin
15
+ response = make_request(:post, path, options)
16
+
17
+ # Response doesn't raise any errors until #body is called
18
+ response.tap(&:raw_body)
19
+ end
20
+
21
+ return if response.raw_body.nil?
22
+
23
+ Resources::OrderChangeRequest.new(unenvelope_body(response.parsed_body), response)
24
+ end
25
+
26
+ def get(id, options = {})
27
+ path = substitute_url_pattern("/air/order_change_requests/:id", "id" => id)
28
+
29
+ response = make_request(:get, path, options)
30
+
31
+ return if response.raw_body.nil?
32
+
33
+ Resources::OrderChangeRequest.new(unenvelope_body(response.parsed_body), response)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrderChangesService < BaseService
6
+ def create(options = {})
7
+ path = "/air/order_changes"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::OrderChange.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def confirm(id, options = {})
26
+ path = substitute_url_pattern("/air/order_changes/:id/actions/confirm",
27
+ "id" => id)
28
+
29
+ params = options.delete(:params) || {}
30
+ options[:params] = {}
31
+ options[:params]["data"] = params
32
+
33
+ begin
34
+ response = make_request(:post, path, options)
35
+
36
+ # Response doesn't raise any errors until #body is called
37
+ response.tap(&:raw_body)
38
+ end
39
+
40
+ return if response.raw_body.nil?
41
+
42
+ Resources::OrderChange.new(unenvelope_body(response.parsed_body), response)
43
+ end
44
+
45
+ def get(id, options = {})
46
+ path = substitute_url_pattern("/air/order_changes/:id", "id" => id)
47
+
48
+ response = make_request(:get, path, options)
49
+
50
+ return if response.raw_body.nil?
51
+
52
+ Resources::OrderChange.new(unenvelope_body(response.parsed_body), response)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class OrdersService < BaseService
6
+ def create(options = {})
7
+ path = "/air/orders"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::Order.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def update(id, options = {})
26
+ path = substitute_url_pattern("/air/orders/:id", "id" => id)
27
+
28
+ params = options.delete(:params) || {}
29
+ options[:params] = {}
30
+ options[:params]["data"] = params
31
+
32
+ begin
33
+ response = make_request(:patch, path, options)
34
+
35
+ # Response doesn't raise any errors until #body is called
36
+ response.tap(&:raw_body)
37
+ end
38
+
39
+ return if response.raw_body.nil?
40
+
41
+ Resources::Order.new(unenvelope_body(response.parsed_body), response)
42
+ end
43
+
44
+ def list(options = {})
45
+ path = "/air/orders"
46
+
47
+ response = make_request(:get, path, options)
48
+
49
+ ListResponse.new(
50
+ response: response,
51
+ unenveloped_body: unenvelope_body(response.parsed_body),
52
+ resource_class: Resources::Order,
53
+ )
54
+ end
55
+
56
+ def all(options = {})
57
+ Paginator.new(
58
+ service: self,
59
+ options: options,
60
+ ).enumerator
61
+ end
62
+
63
+ def get(id, options = {})
64
+ path = substitute_url_pattern("/air/orders/:id", "id" => id)
65
+
66
+ response = make_request(:get, path, options)
67
+
68
+ return if response.raw_body.nil?
69
+
70
+ Resources::Order.new(unenvelope_body(response.parsed_body), response)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuffelAPI
4
+ module Services
5
+ class PaymentIntentsService < BaseService
6
+ def create(options = {})
7
+ path = "/payments/payment_intents"
8
+
9
+ params = options.delete(:params) || {}
10
+ options[:params] = {}
11
+ options[:params]["data"] = params
12
+
13
+ begin
14
+ response = make_request(:post, path, options)
15
+
16
+ # Response doesn't raise any errors until #body is called
17
+ response.tap(&:raw_body)
18
+ end
19
+
20
+ return if response.raw_body.nil?
21
+
22
+ Resources::PaymentIntent.new(unenvelope_body(response.parsed_body), response)
23
+ end
24
+
25
+ def confirm(id, options = {})
26
+ path = substitute_url_pattern("/payments/payment_intents/:id/actions/confirm",
27
+ "id" => id)
28
+
29
+ params = options.delete(:params) || {}
30
+ options[:params] = {}
31
+ options[:params]["data"] = params
32
+
33
+ begin
34
+ response = make_request(:post, path, options)
35
+
36
+ # Response doesn't raise any errors until #body is called
37
+ response.tap(&:raw_body)
38
+ end
39
+
40
+ return if response.raw_body.nil?
41
+
42
+ Resources::PaymentIntent.new(unenvelope_body(response.parsed_body), response)
43
+ end
44
+
45
+ def get(id, options = {})
46
+ path = substitute_url_pattern("/payments/payment_intents/:id", "id" => id)
47
+
48
+ response = make_request(:get, path, options)
49
+
50
+ return if response.raw_body.nil?
51
+
52
+ Resources::PaymentIntent.new(unenvelope_body(response.parsed_body), response)
53
+ end
54
+ end
55
+ end
56
+ end