chargebee 2.74.0 → 2.77.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +98 -0
  3. data/Gemfile.lock +2 -2
  4. data/README.md +53 -0
  5. data/VERSION +1 -1
  6. data/chargebee.gemspec +17 -2
  7. data/lib/chargebee/environment.rb +3 -2
  8. data/lib/chargebee/models/addon.rb +7 -7
  9. data/lib/chargebee/models/address.rb +2 -2
  10. data/lib/chargebee/models/alert.rb +16 -8
  11. data/lib/chargebee/models/alert_status.rb +2 -2
  12. data/lib/chargebee/models/async_response.rb +18 -0
  13. data/lib/chargebee/models/async_response_list.rb +10 -0
  14. data/lib/chargebee/models/attached_item.rb +5 -5
  15. data/lib/chargebee/models/business_entity.rb +2 -2
  16. data/lib/chargebee/models/card.rb +5 -5
  17. data/lib/chargebee/models/column_definition.rb +10 -0
  18. data/lib/chargebee/models/comment.rb +4 -4
  19. data/lib/chargebee/models/configuration.rb +1 -1
  20. data/lib/chargebee/models/coupon.rb +9 -9
  21. data/lib/chargebee/models/coupon_code.rb +4 -4
  22. data/lib/chargebee/models/coupon_set.rb +7 -7
  23. data/lib/chargebee/models/credit_note.rb +22 -17
  24. data/lib/chargebee/models/credit_note_estimate.rb +1 -1
  25. data/lib/chargebee/models/csv_tax_rule.rb +6 -1
  26. data/lib/chargebee/models/currency.rb +6 -6
  27. data/lib/chargebee/models/customer.rb +26 -26
  28. data/lib/chargebee/models/customer_entitlement.rb +1 -1
  29. data/lib/chargebee/models/differential_price.rb +5 -5
  30. data/lib/chargebee/models/entitlement.rb +2 -2
  31. data/lib/chargebee/models/entitlement_override.rb +2 -2
  32. data/lib/chargebee/models/estimate.rb +20 -20
  33. data/lib/chargebee/models/event.rb +2 -2
  34. data/lib/chargebee/models/export.rb +18 -18
  35. data/lib/chargebee/models/feature.rb +9 -9
  36. data/lib/chargebee/models/gift.rb +7 -7
  37. data/lib/chargebee/models/grant_block.rb +3 -3
  38. data/lib/chargebee/models/hosted_page.rb +22 -22
  39. data/lib/chargebee/models/in_app_subscription.rb +4 -4
  40. data/lib/chargebee/models/invoice.rb +48 -44
  41. data/lib/chargebee/models/invoice_estimate.rb +1 -1
  42. data/lib/chargebee/models/item.rb +5 -5
  43. data/lib/chargebee/models/item_entitlement.rb +4 -4
  44. data/lib/chargebee/models/item_family.rb +5 -5
  45. data/lib/chargebee/models/item_price.rb +7 -7
  46. data/lib/chargebee/models/ledger_account_balance.rb +1 -1
  47. data/lib/chargebee/models/ledger_operation.rb +9 -10
  48. data/lib/chargebee/models/meter.rb +18 -0
  49. data/lib/chargebee/models/metered_feature.rb +46 -0
  50. data/lib/chargebee/models/non_subscription.rb +1 -1
  51. data/lib/chargebee/models/offer_event.rb +1 -1
  52. data/lib/chargebee/models/offer_fulfillment.rb +3 -3
  53. data/lib/chargebee/models/omnichannel_one_time_order.rb +2 -2
  54. data/lib/chargebee/models/omnichannel_subscription.rb +4 -4
  55. data/lib/chargebee/models/omnichannel_subscription_item.rb +1 -1
  56. data/lib/chargebee/models/order.rb +12 -12
  57. data/lib/chargebee/models/payment_intent.rb +9 -4
  58. data/lib/chargebee/models/payment_schedule_scheme.rb +3 -3
  59. data/lib/chargebee/models/payment_source.rb +16 -16
  60. data/lib/chargebee/models/payment_voucher.rb +4 -4
  61. data/lib/chargebee/models/personalized_offer.rb +1 -1
  62. data/lib/chargebee/models/plan.rb +7 -7
  63. data/lib/chargebee/models/portal_session.rb +4 -4
  64. data/lib/chargebee/models/price_variant.rb +5 -5
  65. data/lib/chargebee/models/pricing_page_session.rb +2 -2
  66. data/lib/chargebee/models/promotional_credit.rb +5 -5
  67. data/lib/chargebee/models/promotional_grant.rb +1 -1
  68. data/lib/chargebee/models/purchase.rb +2 -2
  69. data/lib/chargebee/models/quote.rb +27 -27
  70. data/lib/chargebee/models/quote_line_group.rb +1 -1
  71. data/lib/chargebee/models/quoted_charge.rb +2 -2
  72. data/lib/chargebee/models/ramp.rb +6 -6
  73. data/lib/chargebee/models/recorded_purchase.rb +2 -2
  74. data/lib/chargebee/models/resource_migration.rb +1 -1
  75. data/lib/chargebee/models/rule.rb +1 -1
  76. data/lib/chargebee/models/site_migration_detail.rb +1 -1
  77. data/lib/chargebee/models/subscription.rb +37 -37
  78. data/lib/chargebee/models/subscription_entitlement.rb +2 -2
  79. data/lib/chargebee/models/time_machine.rb +3 -3
  80. data/lib/chargebee/models/transaction.rb +11 -11
  81. data/lib/chargebee/models/unbilled_charge.rb +6 -6
  82. data/lib/chargebee/models/usage.rb +5 -5
  83. data/lib/chargebee/models/usage_charge.rb +1 -1
  84. data/lib/chargebee/models/usage_event.rb +2 -2
  85. data/lib/chargebee/models/usage_file.rb +2 -2
  86. data/lib/chargebee/models/usage_summary.rb +1 -1
  87. data/lib/chargebee/models/virtual_bank_account.rb +6 -6
  88. data/lib/chargebee/models/webhook_endpoint.rb +5 -5
  89. data/lib/chargebee/request.rb +37 -8
  90. data/lib/chargebee/result.rb +41 -6
  91. data/lib/chargebee/telemetry/request_telemetry_context.rb +29 -0
  92. data/lib/chargebee/telemetry/request_telemetry_error.rb +20 -0
  93. data/lib/chargebee/telemetry/request_telemetry_result.rb +20 -0
  94. data/lib/chargebee/telemetry/telemetry_adapter.rb +32 -0
  95. data/lib/chargebee/telemetry/telemetry_attribute_keys.rb +33 -0
  96. data/lib/chargebee/telemetry/telemetry_support.rb +123 -0
  97. data/lib/chargebee/telemetry_executor.rb +95 -0
  98. data/lib/chargebee.rb +14 -1
  99. data/spec/chargebee/request_telemetry_spec.rb +75 -0
  100. data/spec/chargebee/telemetry_executor_spec.rb +147 -0
  101. data/spec/chargebee/telemetry_support_spec.rb +29 -0
  102. metadata +20 -2
@@ -0,0 +1,95 @@
1
+ require 'uri'
2
+
3
+ module ChargeBee
4
+ class TelemetryExecutor
5
+ class << self
6
+ def execute(env, telemetry_resource:, telemetry_operation:, method:, http_url:, request_headers: {})
7
+ adapter = env.telemetry_adapter
8
+ if adapter.nil? || telemetry_resource.to_s.empty? || telemetry_operation.to_s.empty?
9
+ _status, result = yield(nil)
10
+ return result
11
+ end
12
+
13
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
14
+ headers = {}
15
+ handle = start_telemetry(
16
+ env, adapter, telemetry_resource, telemetry_operation, method, http_url, request_headers, headers
17
+ )
18
+
19
+ begin
20
+ telemetry_headers = headers.empty? ? nil : headers
21
+ status_code, result = yield(telemetry_headers)
22
+ end_telemetry_success(adapter, handle, start, status_code)
23
+ result
24
+ rescue => err
25
+ end_telemetry_failure(adapter, handle, start, err)
26
+ raise
27
+ end
28
+ end
29
+
30
+ def build_http_url(env, sub_domain, url)
31
+ path = url.start_with?('/') ? url : "/#{url}"
32
+ full = env.api_url(path, sub_domain)
33
+ uri = URI.parse(full)
34
+ "#{uri.scheme}://#{uri.host}#{uri.path}"
35
+ end
36
+
37
+ private
38
+
39
+ def start_telemetry(env, adapter, resource, operation, method, http_url, request_headers, headers)
40
+ uri = URI.parse(http_url)
41
+ host = uri.host || ''
42
+ api_path = "/api/#{Environment::API_VERSION}"
43
+ context = Telemetry::TelemetrySupport.build_request_telemetry_context(
44
+ resource,
45
+ operation,
46
+ method.to_s.upcase,
47
+ http_url,
48
+ host,
49
+ env.site,
50
+ Telemetry::TelemetrySupport.resolve_chargebee_api_version(api_path),
51
+ ChargeBee::VERSION,
52
+ request_headers,
53
+ )
54
+ safe_on_request_start(env, adapter, context, headers)
55
+ end
56
+
57
+ def end_telemetry_success(adapter, handle, start, http_status_code)
58
+ duration_ms = elapsed_ms(start)
59
+ result = Telemetry::TelemetrySupport.build_request_telemetry_result(http_status_code, duration_ms, nil)
60
+ safe_on_request_end(adapter, handle, result)
61
+ end
62
+
63
+ def end_telemetry_failure(adapter, handle, start, err)
64
+ status_code = Telemetry::TelemetrySupport.extract_http_status_code(err) || 500
65
+ duration_ms = elapsed_ms(start)
66
+ telemetry_error = Telemetry::TelemetrySupport.extract_request_telemetry_error(err)
67
+ result = Telemetry::TelemetrySupport.build_request_telemetry_result(status_code, duration_ms, telemetry_error)
68
+ safe_on_request_end(adapter, handle, result)
69
+ end
70
+
71
+ def safe_on_request_start(env, adapter, context, headers)
72
+ adapter.on_request_start(context, headers)
73
+ rescue => err
74
+ log_telemetry_error(env, 'on_request_start', err)
75
+ nil
76
+ end
77
+
78
+ def safe_on_request_end(adapter, handle, result)
79
+ adapter.on_request_end(handle, result)
80
+ rescue => err
81
+ warn "[ChargeBee] Telemetry adapter on_request_end failed: #{err}"
82
+ end
83
+
84
+ def log_telemetry_error(env, phase, err)
85
+ return unless env.enable_debug_logs
86
+
87
+ warn "[ChargeBee] Telemetry adapter #{phase} failed: #{err}. Continuing without telemetry."
88
+ end
89
+
90
+ def elapsed_ms(start)
91
+ ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
92
+ end
93
+ end
94
+ end
95
+ end
data/lib/chargebee.rb CHANGED
@@ -7,12 +7,22 @@ require File.dirname(__FILE__) + '/chargebee/list_result'
7
7
 
8
8
  require File.dirname(__FILE__) + '/chargebee/errors'
9
9
 
10
+ require File.dirname(__FILE__) + '/chargebee/telemetry/telemetry_attribute_keys'
11
+ require File.dirname(__FILE__) + '/chargebee/telemetry/request_telemetry_context'
12
+ require File.dirname(__FILE__) + '/chargebee/telemetry/request_telemetry_error'
13
+ require File.dirname(__FILE__) + '/chargebee/telemetry/request_telemetry_result'
14
+ require File.dirname(__FILE__) + '/chargebee/telemetry/telemetry_adapter'
15
+ require File.dirname(__FILE__) + '/chargebee/telemetry/telemetry_support'
16
+ require File.dirname(__FILE__) + '/chargebee/telemetry_executor'
17
+
10
18
  require File.dirname(__FILE__) + '/chargebee/models/model'
11
19
  require File.dirname(__FILE__) + '/chargebee/models/addon'
12
20
  require File.dirname(__FILE__) + '/chargebee/models/address'
13
21
  require File.dirname(__FILE__) + '/chargebee/models/advance_invoice_schedule'
14
22
  require File.dirname(__FILE__) + '/chargebee/models/alert'
15
23
  require File.dirname(__FILE__) + '/chargebee/models/alert_status'
24
+ require File.dirname(__FILE__) + '/chargebee/models/async_response'
25
+ require File.dirname(__FILE__) + '/chargebee/models/async_response_list'
16
26
  require File.dirname(__FILE__) + '/chargebee/models/attached_item'
17
27
  require File.dirname(__FILE__) + '/chargebee/models/attribute'
18
28
  require File.dirname(__FILE__) + '/chargebee/models/billing_configuration'
@@ -20,6 +30,7 @@ require File.dirname(__FILE__) + '/chargebee/models/brand'
20
30
  require File.dirname(__FILE__) + '/chargebee/models/business_entity'
21
31
  require File.dirname(__FILE__) + '/chargebee/models/business_entity_transfer'
22
32
  require File.dirname(__FILE__) + '/chargebee/models/card'
33
+ require File.dirname(__FILE__) + '/chargebee/models/column_definition'
23
34
  require File.dirname(__FILE__) + '/chargebee/models/comment'
24
35
  require File.dirname(__FILE__) + '/chargebee/models/configuration'
25
36
  require File.dirname(__FILE__) + '/chargebee/models/contact'
@@ -63,6 +74,8 @@ require File.dirname(__FILE__) + '/chargebee/models/item_price'
63
74
  require File.dirname(__FILE__) + '/chargebee/models/ledger_account_balance'
64
75
  require File.dirname(__FILE__) + '/chargebee/models/ledger_operation'
65
76
  require File.dirname(__FILE__) + '/chargebee/models/metadata'
77
+ require File.dirname(__FILE__) + '/chargebee/models/meter'
78
+ require File.dirname(__FILE__) + '/chargebee/models/metered_feature'
66
79
  require File.dirname(__FILE__) + '/chargebee/models/non_subscription'
67
80
  require File.dirname(__FILE__) + '/chargebee/models/offer_event'
68
81
  require File.dirname(__FILE__) + '/chargebee/models/offer_fulfillment'
@@ -121,7 +134,7 @@ require File.dirname(__FILE__) + '/chargebee/models/webhook_endpoint'
121
134
 
122
135
  module ChargeBee
123
136
 
124
- VERSION = '2.74.0'
137
+ VERSION = '2.77.0'
125
138
 
126
139
  @@default_env = nil
127
140
  @@verify_ca_certs = true
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe ChargeBee::Request do
4
+ class InjectTraceAdapter
5
+ include ChargeBee::Telemetry::TelemetryAdapter
6
+
7
+ def on_request_start(_context, request_headers)
8
+ request_headers['traceparent'] = '00-test-trace'
9
+ nil
10
+ end
11
+
12
+ def on_request_end(_handle, _result)
13
+ end
14
+ end
15
+
16
+ it 'does not mutate caller headers when telemetry injects trace headers' do
17
+ env = ChargeBee::Environment.new(
18
+ api_key: 'test_key',
19
+ site: 'acme',
20
+ telemetry_adapter: InjectTraceAdapter.new,
21
+ )
22
+ original_headers = { 'chargebee-foo' => 'bar' }
23
+ headers = original_headers.dup
24
+
25
+ ChargeBee::NativeRequest.expects(:request).with do |_method, _url, _env, _params, merged_headers, *_rest|
26
+ expect(merged_headers['traceparent']).to eq('00-test-trace')
27
+ expect(merged_headers['chargebee-foo']).to eq('bar')
28
+ true
29
+ end.returns([{}, {}, '200'])
30
+
31
+ ChargeBee::Request.send(
32
+ 'get',
33
+ '/customers',
34
+ {},
35
+ env,
36
+ headers,
37
+ nil,
38
+ false,
39
+ {},
40
+ {},
41
+ telemetry_resource: 'customer',
42
+ telemetry_operation: 'list',
43
+ )
44
+
45
+ expect(headers).to eq(original_headers)
46
+ expect(headers).not_to have_key('traceparent')
47
+ end
48
+
49
+ it 'accepts nil headers when telemetry injects trace headers' do
50
+ env = ChargeBee::Environment.new(
51
+ api_key: 'test_key',
52
+ site: 'acme',
53
+ telemetry_adapter: InjectTraceAdapter.new,
54
+ )
55
+
56
+ ChargeBee::NativeRequest.expects(:request).with do |_method, _url, _env, _params, merged_headers, *_rest|
57
+ expect(merged_headers['traceparent']).to eq('00-test-trace')
58
+ true
59
+ end.returns([{}, {}, '200'])
60
+
61
+ ChargeBee::Request.send(
62
+ 'get',
63
+ '/customers',
64
+ {},
65
+ env,
66
+ nil,
67
+ nil,
68
+ false,
69
+ {},
70
+ {},
71
+ 'customer',
72
+ 'list',
73
+ )
74
+ end
75
+ end
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ module ChargeBee
4
+ class RecordingTelemetryAdapter
5
+ include Telemetry::TelemetryAdapter
6
+
7
+ attr_reader :events, :start_context, :end_result
8
+
9
+ def initialize
10
+ @events = []
11
+ end
12
+
13
+ def on_request_start(context, request_headers)
14
+ @events << 'start'
15
+ @start_context = context
16
+ request_headers['traceparent'] = '00-test-trace'
17
+ 'span-1'
18
+ end
19
+
20
+ def on_request_end(handle, result)
21
+ @events << 'end'
22
+ @end_result = result
23
+ end
24
+ end
25
+ end
26
+
27
+ describe ChargeBee::TelemetryExecutor do
28
+ let(:env) do
29
+ ChargeBee::Environment.new(api_key: 'test_key', site: 'acme')
30
+ end
31
+
32
+ it 'skips telemetry when no adapter is configured' do
33
+ result = ChargeBee::TelemetryExecutor.execute(
34
+ env,
35
+ telemetry_resource: 'customer',
36
+ telemetry_operation: 'list',
37
+ method: 'get',
38
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
39
+ ) do |headers|
40
+ expect(headers).to be_nil
41
+ [200, :ok]
42
+ end
43
+
44
+ expect(result).to eq(:ok)
45
+ end
46
+
47
+ it 'skips telemetry when resource or operation metadata is missing' do
48
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
49
+ env.telemetry_adapter = adapter
50
+
51
+ result = ChargeBee::TelemetryExecutor.execute(
52
+ env,
53
+ telemetry_resource: '',
54
+ telemetry_operation: 'list',
55
+ method: 'get',
56
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
57
+ ) do |_headers|
58
+ [200, :ok]
59
+ end
60
+
61
+ expect(result).to eq(:ok)
62
+ expect(adapter.events).to be_empty
63
+ end
64
+
65
+ it 'calls adapter once per request and injects trace headers' do
66
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
67
+ env.telemetry_adapter = adapter
68
+
69
+ result = ChargeBee::TelemetryExecutor.execute(
70
+ env,
71
+ telemetry_resource: 'customer',
72
+ telemetry_operation: 'list',
73
+ method: 'get',
74
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
75
+ ) do |headers|
76
+ expect(headers['traceparent']).to eq('00-test-trace')
77
+ [200, :ok]
78
+ end
79
+
80
+ expect(result).to eq(:ok)
81
+ expect(adapter.events).to eq(%w[start end])
82
+ expect(adapter.start_context.span_name).to eq('chargebee.customer.list')
83
+ expect(adapter.end_result.http_status_code).to eq(200)
84
+ end
85
+
86
+ it 'captures chargebee-* request headers and excludes the PII origin family' do
87
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
88
+ env.telemetry_adapter = adapter
89
+ request_headers = {
90
+ 'chargebee-foo' => 'bar',
91
+ 'Chargebee-Idempotency-Key' => 'idem-key-1',
92
+ 'Authorization' => 'Basic super-secret',
93
+ 'chargebee-request-origin-ip' => '202.170.207.70',
94
+ }
95
+
96
+ ChargeBee::TelemetryExecutor.execute(
97
+ env,
98
+ telemetry_resource: 'customer',
99
+ telemetry_operation: 'list',
100
+ method: 'get',
101
+ http_url: 'https://acme.chargebee.com/api/v2/customers',
102
+ request_headers: request_headers,
103
+ ) do |_headers|
104
+ [200, :ok]
105
+ end
106
+
107
+ attrs = adapter.start_context.start_attributes
108
+ expect(attrs['http.request.header.chargebee-foo']).to eq('bar')
109
+ expect(attrs['http.request.header.chargebee-idempotency-key']).to eq('idem-key-1')
110
+ expect(attrs['http.request.header.authorization']).to be_nil
111
+ expect(attrs['http.request.header.chargebee-request-origin-ip']).to be_nil
112
+ expect(attrs.to_s).not_to include('202.170.207.70')
113
+ end
114
+
115
+ it 'records chargebee API errors on failure' do
116
+ adapter = ChargeBee::RecordingTelemetryAdapter.new
117
+ env.telemetry_adapter = adapter
118
+ api_error = ChargeBee::InvalidRequestError.new(
119
+ 404,
120
+ {
121
+ message: 'Not found',
122
+ type: 'invalid_request',
123
+ api_error_code: 'resource_not_found',
124
+ param: 'customer_id',
125
+ },
126
+ )
127
+
128
+ expect do
129
+ ChargeBee::TelemetryExecutor.execute(
130
+ env,
131
+ telemetry_resource: 'customer',
132
+ telemetry_operation: 'retrieve',
133
+ method: 'get',
134
+ http_url: 'https://acme.chargebee.com/api/v2/customers/1',
135
+ ) do |_headers|
136
+ raise api_error
137
+ end
138
+ end.to raise_error(api_error)
139
+
140
+ expect(adapter.events).to eq(%w[start end])
141
+ expect(adapter.end_result.http_status_code).to eq(404)
142
+ expect(adapter.end_result.error.chargebee_error_code).to eq('resource_not_found')
143
+ expect(adapter.end_result.end_attributes['error.type']).to eq('invalid_request')
144
+ expect(adapter.end_result.end_attributes['chargebee.error.type']).to eq('invalid_request')
145
+ expect(adapter.end_result.end_attributes['error.type']).not_to eq('404')
146
+ end
147
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe ChargeBee::Telemetry::TelemetrySupport do
4
+ describe '.build_request_end_span_attributes' do
5
+ it 'uses chargebee error type for error.type' do
6
+ error = ChargeBee::Telemetry::RequestTelemetryError.new(
7
+ message: 'Not found',
8
+ chargebee_error_code: 'resource_not_found',
9
+ chargebee_api_error_type: 'invalid_request',
10
+ )
11
+
12
+ attributes = described_class.build_request_end_span_attributes(404, error)
13
+
14
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::HTTP_RESPONSE_STATUS_CODE]).to eq(404)
15
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::ERROR_TYPE]).to eq('invalid_request')
16
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::CHARGEBEE_ERROR_TYPE]).to eq('invalid_request')
17
+ end
18
+
19
+ it 'omits error.type when chargebee error classification is unavailable' do
20
+ error = ChargeBee::Telemetry::RequestTelemetryError.new(message: 'request failed')
21
+
22
+ attributes = described_class.build_request_end_span_attributes(500, error)
23
+
24
+ expect(attributes[ChargeBee::Telemetry::TelemetryAttributeKeys::HTTP_RESPONSE_STATUS_CODE]).to eq(500)
25
+ expect(attributes).not_to have_key(ChargeBee::Telemetry::TelemetryAttributeKeys::ERROR_TYPE)
26
+ expect(attributes).not_to have_key(ChargeBee::Telemetry::TelemetryAttributeKeys::CHARGEBEE_ERROR_TYPE)
27
+ end
28
+ end
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chargebee
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.74.0
4
+ version: 2.77.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rajaraman S
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-06-18 00:00:00.000000000 Z
12
+ date: 2026-07-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cgi
@@ -88,6 +88,8 @@ files:
88
88
  - lib/chargebee/models/advance_invoice_schedule.rb
89
89
  - lib/chargebee/models/alert.rb
90
90
  - lib/chargebee/models/alert_status.rb
91
+ - lib/chargebee/models/async_response.rb
92
+ - lib/chargebee/models/async_response_list.rb
91
93
  - lib/chargebee/models/attached_item.rb
92
94
  - lib/chargebee/models/attribute.rb
93
95
  - lib/chargebee/models/billing_configuration.rb
@@ -95,6 +97,7 @@ files:
95
97
  - lib/chargebee/models/business_entity.rb
96
98
  - lib/chargebee/models/business_entity_transfer.rb
97
99
  - lib/chargebee/models/card.rb
100
+ - lib/chargebee/models/column_definition.rb
98
101
  - lib/chargebee/models/comment.rb
99
102
  - lib/chargebee/models/configuration.rb
100
103
  - lib/chargebee/models/contact.rb
@@ -139,6 +142,8 @@ files:
139
142
  - lib/chargebee/models/ledger_account_balance.rb
140
143
  - lib/chargebee/models/ledger_operation.rb
141
144
  - lib/chargebee/models/metadata.rb
145
+ - lib/chargebee/models/meter.rb
146
+ - lib/chargebee/models/metered_feature.rb
142
147
  - lib/chargebee/models/model.rb
143
148
  - lib/chargebee/models/non_subscription.rb
144
149
  - lib/chargebee/models/offer_event.rb
@@ -200,10 +205,20 @@ files:
200
205
  - lib/chargebee/request.rb
201
206
  - lib/chargebee/rest.rb
202
207
  - lib/chargebee/result.rb
208
+ - lib/chargebee/telemetry/request_telemetry_context.rb
209
+ - lib/chargebee/telemetry/request_telemetry_error.rb
210
+ - lib/chargebee/telemetry/request_telemetry_result.rb
211
+ - lib/chargebee/telemetry/telemetry_adapter.rb
212
+ - lib/chargebee/telemetry/telemetry_attribute_keys.rb
213
+ - lib/chargebee/telemetry/telemetry_support.rb
214
+ - lib/chargebee/telemetry_executor.rb
203
215
  - lib/chargebee/util.rb
204
216
  - lib/ssl/ca-certs.crt
205
217
  - spec/chargebee/list_result_spec.rb
206
218
  - spec/chargebee/native_request_spec.rb
219
+ - spec/chargebee/request_telemetry_spec.rb
220
+ - spec/chargebee/telemetry_executor_spec.rb
221
+ - spec/chargebee/telemetry_support_spec.rb
207
222
  - spec/chargebee_spec.rb
208
223
  - spec/errors_spec.rb
209
224
  - spec/sample_response.rb
@@ -236,6 +251,9 @@ summary: Ruby client for Chargebee API.
236
251
  test_files:
237
252
  - spec/chargebee/list_result_spec.rb
238
253
  - spec/chargebee/native_request_spec.rb
254
+ - spec/chargebee/request_telemetry_spec.rb
255
+ - spec/chargebee/telemetry_executor_spec.rb
256
+ - spec/chargebee/telemetry_support_spec.rb
239
257
  - spec/chargebee_spec.rb
240
258
  - spec/errors_spec.rb
241
259
  - spec/sample_response.rb