killbill-client 2.4.0 → 3.3.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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +24 -118
- data/.github/CONTRIBUTING.md +20 -0
- data/.github/FUNDING.yml +3 -0
- data/.github/workflows/ci.yml +145 -0
- data/.github/workflows/release.yml +46 -0
- data/README.md +2 -1
- data/bin/retry +21 -0
- data/docker/docker-compose.ci.mysql.yml +21 -0
- data/docker/docker-compose.ci.postgresql.yml +21 -0
- data/killbill_client.gemspec +2 -1
- data/lib/killbill_client.rb +2 -0
- data/lib/killbill_client/api/api.rb +1 -1
- data/lib/killbill_client/api/net_http_adapter.rb +30 -16
- data/lib/killbill_client/models/account.rb +12 -24
- data/lib/killbill_client/models/admin.rb +131 -0
- data/lib/killbill_client/models/bundle.rb +2 -0
- data/lib/killbill_client/models/credit.rb +5 -5
- data/lib/killbill_client/models/custom_field.rb +17 -0
- data/lib/killbill_client/models/gen/account_attributes.rb +0 -1
- data/lib/killbill_client/models/gen/{block_price_override_attributes.rb → block_price_attributes.rb} +1 -1
- data/lib/killbill_client/models/gen/invoice_attributes.rb +1 -0
- data/lib/killbill_client/models/gen/invoice_item_attributes.rb +1 -0
- data/lib/killbill_client/models/gen/overdue_state_attributes.rb +0 -1
- data/lib/killbill_client/models/gen/{phase_price_override_attributes.rb → phase_price_attributes.rb} +2 -2
- data/lib/killbill_client/models/gen/require_gen.rb +52 -53
- data/lib/killbill_client/models/gen/subscription_attributes.rb +2 -0
- data/lib/killbill_client/models/gen/{tier_price_override_attributes.rb → tier_price_attributes.rb} +2 -2
- data/lib/killbill_client/models/gen/{usage_price_override_attributes.rb → usage_price_attributes.rb} +2 -2
- data/lib/killbill_client/models/helpers/custom_field_helper.rb +1 -1
- data/lib/killbill_client/models/invoice.rb +7 -7
- data/lib/killbill_client/models/invoice_item.rb +4 -1
- data/lib/killbill_client/models/invoice_payment.rb +3 -0
- data/lib/killbill_client/models/models.rb +1 -0
- data/lib/killbill_client/models/resource.rb +1 -1
- data/lib/killbill_client/models/subscription.rb +23 -1
- data/lib/killbill_client/version.rb +1 -16
- data/spec/killbill_client/http_adapter_spec.rb +38 -0
- data/spec/killbill_client/remote/model_spec.rb +15 -12
- metadata +30 -9
- data/lib/killbill_client/models/gen/credit_attributes.rb +0 -43
- data/lib/killbill_client/models/gen/invoice_email_attributes.rb +0 -35
data/README.md
CHANGED
data/bin/retry
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -euo pipefail
|
4
|
+
|
5
|
+
x() {
|
6
|
+
echo "+ $*" >&2
|
7
|
+
"$@"
|
8
|
+
}
|
9
|
+
|
10
|
+
retry_delay_seconds=10
|
11
|
+
|
12
|
+
i="0"
|
13
|
+
while [ $i -lt 4 ]
|
14
|
+
do
|
15
|
+
x "$@" && exit 0
|
16
|
+
sleep "${retry_delay_seconds}"
|
17
|
+
i=$[$i+1]
|
18
|
+
done
|
19
|
+
|
20
|
+
echo "$0: retrying [$*] timed out" >&2
|
21
|
+
exit 1
|
@@ -0,0 +1,21 @@
|
|
1
|
+
version: '3.8'
|
2
|
+
|
3
|
+
services:
|
4
|
+
killbill:
|
5
|
+
network_mode: host
|
6
|
+
image: killbill/killbill:0.22.20
|
7
|
+
environment:
|
8
|
+
- KILLBILL_CATALOG_URI=SpyCarAdvanced.xml
|
9
|
+
- KILLBILL_DAO_URL=jdbc:mysql://127.0.0.1:3306/killbill
|
10
|
+
- KILLBILL_DAO_USER=root
|
11
|
+
- KILLBILL_DAO_PASSWORD=root
|
12
|
+
- KILLBILL_SERVER_TEST_MODE=true
|
13
|
+
- KILLBILL_INVOICE_SANITY_SAFETY_BOUND_ENABLED=false
|
14
|
+
- KILLBILL_INVOICE_MAX_DAILY_NUMBER_OF_ITEMS_SAFETY_BOUND=-1
|
15
|
+
depends_on:
|
16
|
+
- db
|
17
|
+
db:
|
18
|
+
network_mode: host
|
19
|
+
image: killbill/mariadb:0.22
|
20
|
+
environment:
|
21
|
+
- MYSQL_ROOT_PASSWORD=root
|
@@ -0,0 +1,21 @@
|
|
1
|
+
version: '3.8'
|
2
|
+
|
3
|
+
services:
|
4
|
+
killbill:
|
5
|
+
network_mode: host
|
6
|
+
image: killbill/killbill:0.22.20
|
7
|
+
environment:
|
8
|
+
- KILLBILL_CATALOG_URI=SpyCarAdvanced.xml
|
9
|
+
- KILLBILL_DAO_URL=jdbc:postgresql://127.0.0.1:5432/killbill
|
10
|
+
- KILLBILL_DAO_USER=postgres
|
11
|
+
- KILLBILL_DAO_PASSWORD=postgres
|
12
|
+
- KILLBILL_SERVER_TEST_MODE=true
|
13
|
+
- KILLBILL_INVOICE_SANITY_SAFETY_BOUND_ENABLED=false
|
14
|
+
- KILLBILL_INVOICE_MAX_DAILY_NUMBER_OF_ITEMS_SAFETY_BOUND=-1
|
15
|
+
depends_on:
|
16
|
+
- db
|
17
|
+
db:
|
18
|
+
network_mode: host
|
19
|
+
image: killbill/postgresql:0.22
|
20
|
+
environment:
|
21
|
+
- POSTGRES_PASSWORD=postgres
|
data/killbill_client.gemspec
CHANGED
@@ -19,7 +19,7 @@ require 'killbill_client/version'
|
|
19
19
|
|
20
20
|
Gem::Specification.new do |s|
|
21
21
|
s.name = 'killbill-client'
|
22
|
-
s.version = KillBillClient::
|
22
|
+
s.version = KillBillClient::VERSION
|
23
23
|
s.summary = 'Kill Bill client library.'
|
24
24
|
s.description = 'An API client library for Kill Bill.'
|
25
25
|
|
@@ -43,6 +43,7 @@ Gem::Specification.new do |s|
|
|
43
43
|
s.add_dependency 'json', '>= 1.2.0', '< 2.0.0'
|
44
44
|
end
|
45
45
|
|
46
|
+
s.add_development_dependency 'gem-release', '~> 2.2'
|
46
47
|
s.add_development_dependency 'rake', '>= 10.0.0', '< 11.0.0'
|
47
48
|
s.add_development_dependency 'rspec', '~> 3.4'
|
48
49
|
end
|
data/lib/killbill_client.rb
CHANGED
@@ -35,6 +35,25 @@ module KillBillClient
|
|
35
35
|
:delete => ::Net::HTTP::Delete
|
36
36
|
}
|
37
37
|
|
38
|
+
def build_uri(relative_uri, options)
|
39
|
+
# Need to encode in case of spaces (e.g. /1.0/kb/security/users/Mad Max/roles)
|
40
|
+
encoded_relative_uri = URI::DEFAULT_PARSER.escape(relative_uri)
|
41
|
+
if URI(encoded_relative_uri).scheme.nil?
|
42
|
+
uri = (options[:base_uri] || KillBillClient::API.base_uri)
|
43
|
+
uri = URI.parse(uri) unless uri.is_a?(URI)
|
44
|
+
# Note: make sure to keep the full path (if any) from URI::HTTP, for non-ROOT deployments
|
45
|
+
# See https://github.com/killbill/killbill/issues/221#issuecomment-151980263
|
46
|
+
base_path = uri.request_uri == '/' ? '' : uri.request_uri
|
47
|
+
uri += (base_path + URI::DEFAULT_PARSER.escape(relative_uri))
|
48
|
+
else
|
49
|
+
uri = encoded_relative_uri
|
50
|
+
uri = URI.parse(uri) unless uri.is_a?(URI)
|
51
|
+
end
|
52
|
+
uri += encode_params(options).to_s
|
53
|
+
|
54
|
+
uri
|
55
|
+
end
|
56
|
+
|
38
57
|
def encode_params(options = {})
|
39
58
|
# Plugin properties and controlPluginNames are passed in the options but we want to send them as query parameters,
|
40
59
|
# so remove with from global hash and insert them under :params
|
@@ -67,8 +86,16 @@ module KillBillClient
|
|
67
86
|
|
68
87
|
def create_http_client(uri, options = {})
|
69
88
|
http = ::Net::HTTP.new uri.host, uri.port
|
70
|
-
|
71
|
-
|
89
|
+
if options[:read_timeout].is_a? Numeric
|
90
|
+
http.read_timeout = options[:read_timeout].to_f / 1000
|
91
|
+
elsif KillBillClient.read_timeout.is_a? Numeric
|
92
|
+
http.read_timeout = KillBillClient.read_timeout.to_f / 1000
|
93
|
+
end
|
94
|
+
if options[:connection_timeout].is_a? Numeric
|
95
|
+
http.open_timeout = options[:connection_timeout].to_f / 1000
|
96
|
+
elsif KillBillClient.connection_timeout.is_a? Numeric
|
97
|
+
http.open_timeout = KillBillClient.connection_timeout.to_f / 1000
|
98
|
+
end
|
72
99
|
http.use_ssl = uri.scheme == 'https'
|
73
100
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if (options[:disable_ssl_verification] || KillBillClient.disable_ssl_verification)
|
74
101
|
http
|
@@ -79,20 +106,7 @@ module KillBillClient
|
|
79
106
|
head.update options[:head] if options[:head]
|
80
107
|
head.delete_if { |_, value| value.nil? }
|
81
108
|
|
82
|
-
|
83
|
-
encoded_relative_uri = URI::DEFAULT_PARSER.escape(relative_uri)
|
84
|
-
if URI(encoded_relative_uri).scheme.nil?
|
85
|
-
uri = (options[:base_uri] || base_uri)
|
86
|
-
uri = URI.parse(uri) unless uri.is_a?(URI)
|
87
|
-
# Note: make sure to keep the full path (if any) from URI::HTTP, for non-ROOT deployments
|
88
|
-
# See https://github.com/killbill/killbill/issues/221#issuecomment-151980263
|
89
|
-
base_path = uri.request_uri == '/' ? '' : uri.request_uri
|
90
|
-
uri += (base_path + URI::DEFAULT_PARSER.escape(relative_uri))
|
91
|
-
else
|
92
|
-
uri = encoded_relative_uri
|
93
|
-
uri = URI.parse(uri) unless uri.is_a?(URI)
|
94
|
-
end
|
95
|
-
uri += encode_params(options).to_s
|
109
|
+
uri = build_uri(relative_uri, options)
|
96
110
|
request = METHODS[method].new uri.request_uri, head
|
97
111
|
|
98
112
|
# Configure multi-tenancy headers, if enabled
|
@@ -65,6 +65,14 @@ module KillBillClient
|
|
65
65
|
},
|
66
66
|
options
|
67
67
|
end
|
68
|
+
|
69
|
+
def blocking_state_audit_logs_with_history(blocking_state_id, options = {})
|
70
|
+
get "#{KILLBILL_API_ACCOUNTS_PREFIX}/block/#{blocking_state_id}/auditLogsWithHistory",
|
71
|
+
{},
|
72
|
+
options,
|
73
|
+
AuditLog
|
74
|
+
end
|
75
|
+
|
68
76
|
end
|
69
77
|
|
70
78
|
def create(user = nil, reason = nil, comment = nil, options = {})
|
@@ -135,20 +143,18 @@ module KillBillClient
|
|
135
143
|
Bundle
|
136
144
|
end
|
137
145
|
|
138
|
-
def invoices(
|
146
|
+
def invoices(options = {})
|
139
147
|
self.class.get "#{KILLBILL_API_ACCOUNTS_PREFIX}/#{account_id}/invoices",
|
140
148
|
{
|
141
|
-
:withItems => with_items
|
142
149
|
},
|
143
150
|
options,
|
144
151
|
Invoice
|
145
152
|
end
|
146
153
|
|
147
|
-
def migration_invoices(
|
154
|
+
def migration_invoices(options = {})
|
148
155
|
self.class.get "#{KILLBILL_API_ACCOUNTS_PREFIX}/#{account_id}/invoices",
|
149
156
|
{
|
150
|
-
:withMigrationInvoices => true
|
151
|
-
:withItems => with_items
|
157
|
+
:withMigrationInvoices => true
|
152
158
|
},
|
153
159
|
options,
|
154
160
|
Invoice
|
@@ -286,26 +292,7 @@ module KillBillClient
|
|
286
292
|
AuditLog
|
287
293
|
end
|
288
294
|
|
289
|
-
def email_notifications(options = {})
|
290
|
-
self.class.get "#{KILLBILL_API_ACCOUNTS_PREFIX}/#{account_id}/emailNotifications",
|
291
|
-
{},
|
292
|
-
options,
|
293
|
-
InvoiceEmailAttributes
|
294
|
-
end
|
295
|
-
|
296
|
-
def update_email_notifications(user = nil, reason = nil, comment = nil, options = {})
|
297
|
-
self.class.put "#{KILLBILL_API_ACCOUNTS_PREFIX}/#{account_id}/emailNotifications",
|
298
|
-
to_json,
|
299
|
-
{},
|
300
|
-
{
|
301
|
-
:user => user,
|
302
|
-
:reason => reason,
|
303
|
-
:comment => comment,
|
304
|
-
}.merge(options)
|
305
|
-
end
|
306
|
-
|
307
295
|
def all_tags(object_type, included_deleted, audit = 'NONE', options = {})
|
308
|
-
|
309
296
|
params = {}
|
310
297
|
params[:objectType] = object_type if object_type
|
311
298
|
params[:includedDeleted] = included_deleted if included_deleted
|
@@ -389,6 +376,7 @@ module KillBillClient
|
|
389
376
|
options,
|
390
377
|
AuditLog
|
391
378
|
end
|
379
|
+
|
392
380
|
end
|
393
381
|
end
|
394
382
|
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module KillBillClient
|
2
|
+
module Model
|
3
|
+
class Admin < AdminPaymentAttributes
|
4
|
+
|
5
|
+
KILLBILL_API_ADMIN_PREFIX = "#{KILLBILL_API_PREFIX}/admin"
|
6
|
+
KILLBILL_API_QUEUES_PREFIX = "#{KILLBILL_API_ADMIN_PREFIX}/queues"
|
7
|
+
|
8
|
+
KILLBILL_API_CLOCK_PREFIX = "#{KILLBILL_API_PREFIX}/test/clock"
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def get_queues_entries(account_id, options = {})
|
12
|
+
get KILLBILL_API_QUEUES_PREFIX,
|
13
|
+
{
|
14
|
+
:accountId => account_id,
|
15
|
+
:withHistory => options[:withHistory],
|
16
|
+
:minDate => options[:minDate],
|
17
|
+
:maxDate => options[:maxDate]
|
18
|
+
},
|
19
|
+
{
|
20
|
+
:accept => 'application/octet-stream'
|
21
|
+
}.merge(options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def fix_transaction_state(payment_id, transaction_id, transaction_status, user = nil, reason = nil, comment = nil, options = {})
|
25
|
+
put "#{KILLBILL_API_ADMIN_PREFIX}/payments/#{payment_id}/transactions/#{transaction_id}",
|
26
|
+
{:transactionStatus => transaction_status}.to_json,
|
27
|
+
{},
|
28
|
+
{
|
29
|
+
:user => user,
|
30
|
+
:reason => reason,
|
31
|
+
:comment => comment,
|
32
|
+
}.merge(options)
|
33
|
+
end
|
34
|
+
|
35
|
+
def trigger_invoice_generation_for_parked_accounts(offset = 0, limit = 100, user =nil, options = {})
|
36
|
+
post "#{KILLBILL_API_ADMIN_PREFIX}/invoices",
|
37
|
+
{},
|
38
|
+
{
|
39
|
+
:offset => offset,
|
40
|
+
:limit => limit
|
41
|
+
},
|
42
|
+
{
|
43
|
+
:user => user
|
44
|
+
}.merge(options)
|
45
|
+
end
|
46
|
+
|
47
|
+
def put_in_rotation(options = {})
|
48
|
+
put "#{KILLBILL_API_ADMIN_PREFIX}/healthcheck",
|
49
|
+
{},
|
50
|
+
{},
|
51
|
+
{}.merge(options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def put_out_of_rotation(options = {})
|
55
|
+
delete "#{KILLBILL_API_ADMIN_PREFIX}/healthcheck",
|
56
|
+
{},
|
57
|
+
{},
|
58
|
+
{}.merge(options)
|
59
|
+
end
|
60
|
+
|
61
|
+
def invalidates_cache(cache_name = nil, options = {})
|
62
|
+
delete "#{KILLBILL_API_ADMIN_PREFIX}/cache",
|
63
|
+
{},
|
64
|
+
{
|
65
|
+
:cacheName => cache_name
|
66
|
+
},
|
67
|
+
{}.merge(options)
|
68
|
+
end
|
69
|
+
|
70
|
+
def invalidates_cache_by_account(account_id = nil, options = {})
|
71
|
+
delete "#{KILLBILL_API_ADMIN_PREFIX}/cache/accounts/#{account_id}",
|
72
|
+
{},
|
73
|
+
{},
|
74
|
+
{}.merge(options)
|
75
|
+
end
|
76
|
+
|
77
|
+
def invalidates_cache_by_tenant(options = {})
|
78
|
+
delete "#{KILLBILL_API_ADMIN_PREFIX}/cache/tenants",
|
79
|
+
{},
|
80
|
+
{},
|
81
|
+
{}.merge(options)
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_clock(time_zone, options)
|
85
|
+
params = {}
|
86
|
+
params[:timeZone] = time_zone unless time_zone.nil?
|
87
|
+
|
88
|
+
res = get KILLBILL_API_CLOCK_PREFIX,
|
89
|
+
params,
|
90
|
+
options
|
91
|
+
JSON.parse res.body
|
92
|
+
end
|
93
|
+
|
94
|
+
def set_clock(requested_date, time_zone, options)
|
95
|
+
params = {}
|
96
|
+
params[:requestedDate] = requested_date unless requested_date.nil?
|
97
|
+
params[:timeZone] = time_zone unless time_zone.nil?
|
98
|
+
|
99
|
+
# The default 5s is not always enough
|
100
|
+
params[:timeoutSec] ||= 10
|
101
|
+
|
102
|
+
res = post KILLBILL_API_CLOCK_PREFIX,
|
103
|
+
{},
|
104
|
+
params,
|
105
|
+
{}.merge(options)
|
106
|
+
JSON.parse res.body
|
107
|
+
end
|
108
|
+
|
109
|
+
def increment_kb_clock(days, weeks, months, years, time_zone, options)
|
110
|
+
params = {}
|
111
|
+
params[:days] = days unless days.nil?
|
112
|
+
params[:weeks] = weeks unless weeks.nil?
|
113
|
+
params[:months] = months unless months.nil?
|
114
|
+
params[:years] = years unless years.nil?
|
115
|
+
params[:timeZone] = time_zone unless time_zone.nil?
|
116
|
+
|
117
|
+
# The default 5s is not always enough
|
118
|
+
params[:timeoutSec] ||= 10
|
119
|
+
|
120
|
+
res = put KILLBILL_API_CLOCK_PREFIX,
|
121
|
+
{},
|
122
|
+
params,
|
123
|
+
{}.merge(options)
|
124
|
+
|
125
|
+
JSON.parse res.body
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -6,12 +6,14 @@ module KillBillClient
|
|
6
6
|
|
7
7
|
include KillBillClient::Model::TagHelper
|
8
8
|
include KillBillClient::Model::CustomFieldHelper
|
9
|
+
include KillBillClient::Model::AuditLogWithHistoryHelper
|
9
10
|
|
10
11
|
has_custom_fields KILLBILL_API_BUNDLES_PREFIX, :bundle_id
|
11
12
|
has_tags KILLBILL_API_BUNDLES_PREFIX, :bundle_id
|
12
13
|
|
13
14
|
has_many :subscriptions, KillBillClient::Model::Subscription
|
14
15
|
has_many :audit_logs, KillBillClient::Model::AuditLog
|
16
|
+
has_audit_logs_with_history KILLBILL_API_BUNDLES_PREFIX, :bundle_id
|
15
17
|
|
16
18
|
class << self
|
17
19
|
def find_in_batches(offset = 0, limit = 100, options = {})
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module KillBillClient
|
2
2
|
module Model
|
3
|
-
class Credit <
|
3
|
+
class Credit < InvoiceItemAttributes
|
4
4
|
KILLBILL_API_CREDITS_PREFIX = "#{KILLBILL_API_PREFIX}/credits"
|
5
5
|
has_many :audit_logs, KillBillClient::Model::AuditLog
|
6
6
|
|
@@ -9,13 +9,13 @@ module KillBillClient
|
|
9
9
|
get "#{KILLBILL_API_CREDITS_PREFIX}/#{credit_id}",
|
10
10
|
{},
|
11
11
|
options,
|
12
|
-
|
12
|
+
InvoiceItemAttributes
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def create(auto_commit = false, user = nil, reason = nil, comment = nil, options = {})
|
17
|
-
|
18
|
-
to_json,
|
17
|
+
created_credits = self.class.post KILLBILL_API_CREDITS_PREFIX,
|
18
|
+
[to_hash].to_json,
|
19
19
|
{
|
20
20
|
:autoCommit => auto_commit
|
21
21
|
},
|
@@ -24,7 +24,7 @@ module KillBillClient
|
|
24
24
|
:reason => reason,
|
25
25
|
:comment => comment,
|
26
26
|
}.merge(options)
|
27
|
-
|
27
|
+
created_credits
|
28
28
|
end
|
29
29
|
|
30
30
|
end
|
@@ -28,6 +28,23 @@ module KillBillClient
|
|
28
28
|
},
|
29
29
|
options
|
30
30
|
end
|
31
|
+
|
32
|
+
def find_in_batches_by_search_type_name(object_type, field_name, field_value, offset = 0, limit = 100, options = {})
|
33
|
+
|
34
|
+
query_fields = {
|
35
|
+
:objectType => object_type,
|
36
|
+
:fieldName => field_name,
|
37
|
+
:fieldValue => field_value,
|
38
|
+
:offset => offset,
|
39
|
+
:limit => limit
|
40
|
+
}
|
41
|
+
query_fields[:fieldValue] = field_value if field_value
|
42
|
+
|
43
|
+
get "#{KILLBILL_API_CUSTOM_FIELDS_PREFIX}/search",
|
44
|
+
query_fields,
|
45
|
+
options
|
46
|
+
end
|
47
|
+
|
31
48
|
end
|
32
49
|
end
|
33
50
|
end
|