hubspot-api-client 17.0.0.pre.beta.3 → 17.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf03f85e815cda2314c5d9433d05baf61dc9cff1578027fbf719df17346b2a22
4
- data.tar.gz: b10c430908fde3591fbe586ec97a1078ea4d5dfc6b5c151c02468d5650a76b61
3
+ metadata.gz: abbad95ec7ed2eab3eec2d180f721b54f7de216328c1df44670c32b3e14a882e
4
+ data.tar.gz: 0ac955e55206a6cd81881825c3f2669eb8cc5a792af273cb24cfaf1342230d6f
5
5
  SHA512:
6
- metadata.gz: ba61d9af22ac49d15c2ca40bf8545bd036441eba289b13faa18d657717ae40bc5d2c830a220ac44fd625a31020bc7844d2bfd5a6ce84c6dd5ba8a7d02f239ac7
7
- data.tar.gz: 24b656e117c4d7515ef257ba111634ecff1267831934361bf59046090bfd3aabf20929b966dc041c3a548ede2aabce7770a31841c16988c297d54ffd032de766
6
+ metadata.gz: 3961b180b6ca01a771749514c85d48cbca3b7ba18344038c39d2aed54c53389e6a3c1490a5f77913d67cbf9897ec9f101ac8ece545e528d0c2e54c73749c6da0
7
+ data.tar.gz: 579b92cbc0cb4c1db21a313866953d586a7e1c61ec200400265007625fcd5f817b6b4653c99e6d7ee6e5768a6685a036905391b83bde016b6c49daac4a985d41
data/CHANGELOG.md CHANGED
@@ -5,9 +5,26 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased](https://github.com/HubSpot/hubspot-api-ruby/compare/v17.0.0-beta.3...HEAD)
8
+ ## [Unreleased](https://github.com/HubSpot/hubspot-api-ruby/compare/v17.0.0...HEAD)
9
9
 
10
10
 
11
+ ## [17.0.0.pre.beta.4] - 2023-06-14
12
+
13
+ ## Updated
14
+
15
+ - Fix `Hubspot::OAuthHelper.authorize_url()` (don't add empty scopes or optional scopes to OAuth url)
16
+
17
+ ## [17.0.0.pre.beta.4] - 2023-05-17
18
+
19
+ ## Added
20
+
21
+ - added custom exceptions for Signature
22
+ - add associations types
23
+
24
+ ## Updated
25
+
26
+ - remove deprecated `validate_signature`
27
+
11
28
  ## [17.0.0-beta.3] - 2023-05-12
12
29
 
13
30
  ## Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hubspot-api-client (17.0.0-beta.3)
4
+ hubspot-api-client (17.0.0)
5
5
  json (~> 2.1, >= 2.1.0)
6
6
  typhoeus (~> 1.4.0)
7
7
 
@@ -19,7 +19,7 @@ module Hubspot
19
19
  events
20
20
  files
21
21
  marketing
22
- o_auth
22
+ oauth
23
23
  settings
24
24
  webhooks
25
25
  ].freeze
@@ -13,10 +13,6 @@ module Hubspot
13
13
  tokens
14
14
  ].freeze
15
15
  end
16
-
17
- def discovery_module_path
18
- super.gsub('o_auth', 'oauth')
19
- end
20
16
  end
21
17
  end
22
18
  end
@@ -1,14 +1,16 @@
1
1
  module Hubspot
2
2
  class ConfigurationError < StandardError; end
3
-
4
- class InvalidSignatureError < StandardError
5
- def initialize(msg: nil, signature: nil, signature_version: nil, hash_result: nil)
6
- @signature = signature
3
+ class InvalidSignatureVersionError < StandardError
4
+ def initialize(signature_version)
7
5
  @signature_version = signature_version
8
- @hash_result = hash_result
9
- msg = "Invalid signature passed to request" if msg.nil?
6
+ super("Invalid signature version passed to request: #{@signature_version}")
7
+ end
8
+ end
10
9
 
11
- super(msg)
10
+ class InvalidSignatureTimestampError < StandardError
11
+ def initialize(timestamp)
12
+ @timestamp = timestamp
13
+ super("Signature timestamp is invalid: #{@timestamp}.")
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,92 @@
1
+ module Hubspot
2
+ module Helpers
3
+ class AssociationType
4
+ PRIMARY_CONTACT_TO_COMPANY = 1
5
+ PRIMARY_COMPANY_TO_CONTACT = 2
6
+ DEAL_TO_CONTACT = 3
7
+ CONTACT_TO_DEAL = 4
8
+ PRIMARY_DEAL_TO_COMPANY = 5
9
+ PRIMARY_COMPANY_TO_DEAL = 6
10
+ CONTACT_TO_TICKET = 15
11
+ TICKET_TO_CONTACT = 16
12
+ DEAL_TO_LINE_ITEM = 19
13
+ LINE_ITEM_TO_DEAL = 20
14
+ PRIMARY_COMPANY_TO_TICKET = 25
15
+ PRIMARY_TICKET_TO_COMPANY = 26
16
+ DEAL_TO_TICKET = 27
17
+ TICKET_TO_DEAL = 28
18
+ DEAL_TO_QUOTE = 63
19
+ QUOTE_TO_DEAL = 64
20
+ QUOTE_TO_LINE_ITEM = 67
21
+ LINE_ITEM_TO_QUOTE = 68
22
+ QUOTE_TO_CONTACT = 69
23
+ CONTACT_TO_QUOTE = 70
24
+ QUOTE_TO_COMPANY = 71
25
+ COMPANY_TO_QUOTE = 72
26
+ CONTACT_TO_FEEDBACK_SUBMISSION = 97
27
+ FEEDBACK_SUBMISSION_TO_CONTACT = 98
28
+ TICKET_TO_FEEDBACK_SUBMISSION = 99
29
+ FEEDBACK_SUBMISSION_TO_TICKET = 100
30
+ COMPANY_TO_CALL = 181
31
+ CALL_TO_COMPANY = 182
32
+ COMPANY_TO_EMAIL = 185
33
+ EMAIL_TO_COMPANY = 186
34
+ COMPANY_TO_MEETING = 187
35
+ MEETING_TO_COMPANY = 188
36
+ COMPANY_TO_NOTE = 189
37
+ NOTE_TO_COMPANY = 190
38
+ COMPANY_TO_TASK = 191
39
+ TASK_TO_COMPANY = 192
40
+ CONTACT_TO_CALL = 193
41
+ CALL_TO_CONTACT = 194
42
+ CONTACT_TO_EMAIL = 197
43
+ EMAIL_TO_CONTACT = 198
44
+ CONTACT_TO_MEETING = 199
45
+ MEETING_TO_CONTACT = 200
46
+ CONTACT_TO_NOTE = 201
47
+ NOTE_TO_CONTACT = 202
48
+ CONTACT_TO_TASK = 203
49
+ TASK_TO_CONTACT = 204
50
+ DEAL_TO_CALL = 205
51
+ CALL_TO_DEAL = 206
52
+ DEAL_TO_EMAIL = 209
53
+ EMAIL_TO_DEAL = 210
54
+ DEAL_TO_MEETING = 211
55
+ MEETING_TO_DEAL = 212
56
+ DEAL_TO_NOTE = 213
57
+ NOTE_TO_DEAL = 214
58
+ DEAL_TO_TASK = 215
59
+ TASK_TO_DEAL = 216
60
+ QUOTE_TO_TASK = 217
61
+ TASK_TO_QUOTE = 218
62
+ TICKET_TO_CALL = 219
63
+ CALL_TO_TICKET = 220
64
+ TICKET_TO_EMAIL = 223
65
+ EMAIL_TO_TICKET = 224
66
+ TICKET_TO_MEETING = 225
67
+ MEETING_TO_TICKET = 226
68
+ TICKET_TO_NOTE = 227
69
+ NOTE_TO_TICKET = 228
70
+ TICKET_TO_TASK = 229
71
+ TASK_TO_TICKET = 230
72
+ CONTACT_TO_COMPANY = 279
73
+ COMPANY_TO_CONTACT = 280
74
+ TICKET_TO_COMPANY = 339
75
+ COMPANY_TO_TICKET = 340
76
+ DEAL_TO_COMPANY = 341
77
+ COMPANY_TO_DEAL = 342
78
+ CALL_TO_MEETING = 399
79
+ MEETING_TO_CALL = 400
80
+ POSTAL_MAIL_TO_CONTACT = 453
81
+ CONTACT_TO_POSTAL_MAIL = 454
82
+ POSTAL_MAIL_TO_TICKET = 455
83
+ TICKET_TO_POSTAL_MAIL = 456
84
+ POSTAL_MAIL_TO_DEAL = 457
85
+ DEAL_TO_POSTAL_MAIL = 458
86
+ POSTAL_MAIL_TO_COMPANY = 459
87
+ COMPANY_TO_POSTAL_MAIL = 460
88
+ end
89
+ end
90
+ end
91
+
92
+
@@ -2,7 +2,11 @@ module Hubspot
2
2
  module Helpers
3
3
  class CamelCase
4
4
  def format(string)
5
- string.split('_').collect(&:capitalize).join
5
+ if string == 'oauth'
6
+ 'OAuth'
7
+ else
8
+ string.split('_').collect(&:capitalize).join
9
+ end
6
10
  end
7
11
  end
8
12
  end
@@ -8,12 +8,11 @@ module Hubspot
8
8
  end
9
9
 
10
10
  def require_with_mapping(path)
11
- require path.gsub('o_auth', 'oauth')
11
+ require path
12
12
  end
13
13
 
14
14
  def require_with_codegen_mapping(path)
15
15
  require path
16
- .gsub('o_auth', 'oauth')
17
16
  .gsub('audit_logs/', 'audit-logs/')
18
17
  .gsub('blog_posts/', 'blog-posts/')
19
18
  .gsub('site_search', 'site-search')
@@ -17,7 +17,7 @@ module Hubspot
17
17
  if signature_version == "v3"
18
18
  current_time = DateTime.now.strftime("%s").to_i
19
19
  if current_time - timestamp.to_i > MAX_ALLOWED_TIMESTAMP
20
- raise StandardError("Timestamp is invalid, reject request.")
20
+ raise InvalidSignatureTimestampError.new(timestamp)
21
21
  end
22
22
  end
23
23
  hashed_signature = get_signature(
@@ -54,7 +54,7 @@ module Hubspot
54
54
  hash_result = OpenSSL::HMAC.base64digest('SHA256', client_secret, source_string.encode('utf-8'))
55
55
  return hash_result
56
56
  else
57
- raise StandardError("Not supported signature version: #{signature_version}")
57
+ raise InvalidSignatureVersionError.new(signature_version)
58
58
  end
59
59
  end
60
60
  end
@@ -2,7 +2,8 @@ module Hubspot
2
2
  module Helpers
3
3
  class SnakeCase
4
4
  def format(string)
5
- string.gsub(/::/, '/').
5
+ string.gsub('OAuth', 'Oauth').
6
+ gsub(/::/, '/').
6
7
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
7
8
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
8
9
  tr("-", "_").
@@ -2,15 +2,19 @@ module Hubspot
2
2
  class OAuthHelper
3
3
  AUTHORIZE_URL = 'https://app.hubspot.com/oauth/authorize'.freeze
4
4
  class << self
5
- def authorize_url(client_id:, redirect_uri:, scope:, optional_scope: [])
6
- query = URI.encode_www_form(
7
- client_id: client_id,
8
- redirect_uri: redirect_uri,
9
- scope: Array(scope),
10
- optional_scope: Array(optional_scope)
11
- )
5
+ def authorize_url(client_id, redirect_uri, scopes = nil, optional_scopes = nil, state = nil)
6
+ query_params = {
7
+ "client_id" => client_id,
8
+ "redirect_uri" => redirect_uri
9
+ }
12
10
 
13
- "#{AUTHORIZE_URL}?#{query}"
11
+ query_params["scope"] = scopes.join(' ') if scopes
12
+ query_params["optional_scope"] = optional_scopes.join(' ') if optional_scopes
13
+ query_params['state'] ||= state if state
14
+
15
+ params = URI.encode_www_form(query_params)
16
+
17
+ "#{AUTHORIZE_URL}?#{params}"
14
18
  end
15
19
  end
16
20
  end
@@ -1,3 +1,3 @@
1
1
  module Hubspot
2
- VERSION = '17.0.0-beta.3'
2
+ VERSION = '17.0.0'
3
3
  end
@@ -11,6 +11,6 @@ describe 'Hubspot::Client' do
11
11
  it { is_expected.to respond_to(:events) }
12
12
  it { is_expected.to respond_to(:files) }
13
13
  it { is_expected.to respond_to(:marketing) }
14
- it { is_expected.to respond_to(:o_auth) }
14
+ it { is_expected.to respond_to(:oauth) }
15
15
  it { is_expected.to respond_to(:webhooks) }
16
16
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Hubspot::Discovery::OAuth::AccessTokensApi' do
4
- subject(:api) { Hubspot::Client.new(access_token: 'test').o_auth.access_tokens_api }
4
+ subject(:api) { Hubspot::Client.new(access_token: 'test').oauth.access_tokens_api }
5
5
 
6
6
  it { is_expected.to respond_to(:get) }
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Hubspot::Discovery::OAuth::RefreshTokensApi' do
4
- subject(:api) { Hubspot::Client.new(access_token: 'test').o_auth.refresh_tokens_api }
4
+ subject(:api) { Hubspot::Client.new(access_token: 'test').oauth.refresh_tokens_api }
5
5
 
6
6
  it { is_expected.to respond_to(:archive) }
7
7
  it { is_expected.to respond_to(:get) }
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Hubspot::Discovery::OAuth::TokensApi' do
4
- subject(:api) { Hubspot::Client.new(access_token: 'test').o_auth.tokens_api }
4
+ subject(:api) { Hubspot::Client.new(access_token: 'test').oauth.tokens_api }
5
5
 
6
6
  it { is_expected.to respond_to(:create) }
7
7
  end
@@ -0,0 +1,75 @@
1
+ require 'uri'
2
+ require 'rspec'
3
+
4
+ require_relative "../../lib/hubspot/oauth_helper"
5
+
6
+ describe 'get_auth_url' do
7
+ AUTHORIZE_URL = 'https://app.hubspot.com/oauth/authorize'
8
+
9
+ let(:data) do
10
+ {
11
+ client_id: 'client_id',
12
+ redirect_uri: 'http://localhost',
13
+ scope: ['contacts', 'timeline'],
14
+ optional_scope: ['scope1', 'scope3']
15
+ }
16
+ end
17
+
18
+ it 'returns the correct URL with empty scope' do
19
+ expected_params = {
20
+ client_id: data[:client_id],
21
+ redirect_uri: data[:redirect_uri]
22
+ }
23
+ expected_url = "#{AUTHORIZE_URL}?#{URI.encode_www_form(expected_params)}"
24
+
25
+ result = Hubspot::OAuthHelper.authorize_url(data[:client_id], data[:redirect_uri])
26
+
27
+ expect(result).to eq(expected_url)
28
+ end
29
+
30
+ it 'returns the correct URL with scope' do
31
+ expected_params = {
32
+ client_id: data[:client_id],
33
+ redirect_uri: data[:redirect_uri],
34
+ scope: data[:scope].join(' ')
35
+ }
36
+ expected_url = "#{AUTHORIZE_URL}?#{URI.encode_www_form(expected_params)}"
37
+
38
+ result = Hubspot::OAuthHelper.authorize_url(data[:client_id], data[:redirect_uri], data[:scope])
39
+
40
+ expect(result).to eq(expected_url)
41
+ end
42
+
43
+ it 'returns the correct URL with optional_scope' do
44
+ expected_params = {
45
+ client_id: data[:client_id],
46
+ redirect_uri: data[:redirect_uri],
47
+ scope: data[:optional_scope].join(' ')
48
+ }
49
+ expected_url = "#{AUTHORIZE_URL}?#{URI.encode_www_form(expected_params)}"
50
+
51
+ result = Hubspot::OAuthHelper.authorize_url(data[:client_id], data[:redirect_uri], data[:optional_scope])
52
+
53
+ expect(result).to eq(expected_url)
54
+ end
55
+ it 'returns the correct URL' do
56
+ expected_params = {
57
+ client_id: data[:client_id],
58
+ redirect_uri: data[:redirect_uri],
59
+ scope: data[:scope].join(' '),
60
+ optional_scope: data[:optional_scope].join(' '),
61
+ state: "test_state"
62
+ }
63
+ expected_url = "#{AUTHORIZE_URL}?#{URI.encode_www_form(expected_params)}"
64
+
65
+ result = Hubspot::OAuthHelper.authorize_url(
66
+ data[:client_id],
67
+ data[:redirect_uri],
68
+ data[:scope],
69
+ data[:optional_scope],
70
+ "test_state"
71
+ )
72
+
73
+ expect(result).to eq(expected_url)
74
+ end
75
+ end
@@ -1,5 +1,6 @@
1
1
  require 'date'
2
2
  require_relative "../../lib/hubspot/helpers/signature"
3
+ require_relative "../../lib/hubspot/exceptions"
3
4
 
4
5
  TEST_DATA = {
5
6
  :client_secret=> "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
@@ -49,7 +50,7 @@ describe "Hubspot::Helpers::Signature.get_signature" do
49
50
  client_secret: TEST_DATA[:client_secret],
50
51
  request_body: TEST_DATA[:request_body],
51
52
  signature_version: "wrong_signature_version"
52
- ) }.to raise_error(StandardError)
53
+ ) }.to raise_error(Hubspot::InvalidSignatureVersionError)
53
54
  end
54
55
 
55
56
  end
@@ -102,7 +103,7 @@ describe "Hubspot::Helpers::Signature.is_valid" do
102
103
  request_body: TEST_DATA[:request_body],
103
104
  http_uri: TEST_DATA[:http_uri],
104
105
  signature_version: "v3"
105
- ) }.to raise_error(StandardError)
106
+ ) }.to raise_error(Hubspot::InvalidSignatureTimestampError)
106
107
  end
107
108
  it "should raise exception if :signature_version=>v3 and :timestamp=>wrong_timestamp" do
108
109
  expect { signature.is_valid(
@@ -112,6 +113,6 @@ describe "Hubspot::Helpers::Signature.is_valid" do
112
113
  http_uri: TEST_DATA[:http_uri],
113
114
  timestamp: "wrong_timestamp",
114
115
  signature_version: "v3"
115
- ) }.to raise_error(StandardError)
116
+ ) }.to raise_error(Hubspot::InvalidSignatureTimestampError)
116
117
  end
117
118
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hubspot-api-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 17.0.0.pre.beta.3
4
+ version: 17.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HubSpot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-12 00:00:00.000000000 Z
11
+ date: 2023-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -1783,12 +1783,12 @@ files:
1783
1783
  - lib/hubspot/discovery/webhooks/api/subscriptions_api.rb
1784
1784
  - lib/hubspot/discovery/webhooks/client.rb
1785
1785
  - lib/hubspot/exceptions.rb
1786
+ - lib/hubspot/helpers/association_type.rb
1786
1787
  - lib/hubspot/helpers/camel_case.rb
1787
1788
  - lib/hubspot/helpers/get_all_helper.rb
1788
1789
  - lib/hubspot/helpers/path.rb
1789
1790
  - lib/hubspot/helpers/signature.rb
1790
1791
  - lib/hubspot/helpers/snake_case.rb
1791
- - lib/hubspot/helpers/webhooks_helper.rb
1792
1792
  - lib/hubspot/oauth_helper.rb
1793
1793
  - lib/hubspot/version.rb
1794
1794
  - spec/discovery/automation/actions/callbacks_api_spec.rb
@@ -1939,6 +1939,7 @@ files:
1939
1939
  - spec/discovery/settings/users/users_api_spec.rb
1940
1940
  - spec/discovery/webhooks/settings_api_spec.rb
1941
1941
  - spec/discovery/webhooks/subscriptions_api_spec.rb
1942
+ - spec/helpers/authorize_url_spec.rb
1942
1943
  - spec/helpers/camel_case_spec.rb
1943
1944
  - spec/helpers/signature_spec.rb
1944
1945
  - spec/spec_helper.rb
@@ -1957,9 +1958,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
1957
1958
  version: '2.7'
1958
1959
  required_rubygems_version: !ruby/object:Gem::Requirement
1959
1960
  requirements:
1960
- - - ">"
1961
+ - - ">="
1961
1962
  - !ruby/object:Gem::Version
1962
- version: 1.3.1
1963
+ version: '0'
1963
1964
  requirements: []
1964
1965
  rubygems_version: 3.2.3
1965
1966
  signing_key:
@@ -2114,6 +2115,7 @@ test_files:
2114
2115
  - spec/discovery/events/events_api_spec.rb
2115
2116
  - spec/discovery/webhooks/settings_api_spec.rb
2116
2117
  - spec/discovery/webhooks/subscriptions_api_spec.rb
2118
+ - spec/helpers/authorize_url_spec.rb
2117
2119
  - spec/helpers/signature_spec.rb
2118
2120
  - spec/helpers/camel_case_spec.rb
2119
2121
  - spec/spec_helper.rb
@@ -1,32 +0,0 @@
1
- # @deprecated
2
- module Hubspot
3
- module Helpers
4
- class WebhooksHelper
5
- def self.validate_signature(
6
- signature:,
7
- client_secret:,
8
- http_uri:,
9
- request_body:,
10
- http_method: 'POST',
11
- signature_version: 'v2'
12
- )
13
-
14
- if signature_version == 'v1'
15
- source_string = client_secret + request_body.to_s
16
- else
17
- source_string = client_secret + http_method + http_uri + request_body.to_s
18
- end
19
-
20
- hash_result = Digest::SHA2.hexdigest(source_string.encode('utf-8'))
21
-
22
- if hash_result != signature
23
- raise InvalidSignatureError.new(
24
- signature: signature,
25
- signature_version: signature_version,
26
- hash_result: hash_result
27
- )
28
- end
29
- end
30
- end
31
- end
32
- end