knockapi 0.4.11 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +4 -26
- data/lib/knock/bulk_operations.rb +0 -1
- data/lib/knock/client.rb +19 -11
- data/lib/knock/configuration.rb +18 -0
- data/lib/knock/errors.rb +3 -0
- data/lib/knock/messages.rb +0 -1
- data/lib/knock/objects.rb +1 -1
- data/lib/knock/preferences.rb +0 -1
- data/lib/knock/tenants.rb +0 -1
- data/lib/knock/users.rb +0 -1
- data/lib/knock/version.rb +1 -1
- data/lib/knock/workflows.rb +3 -4
- data/lib/knock.rb +22 -10
- data/spec/configuration_spec.rb +63 -0
- metadata +6 -4
- data/lib/knock/base.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2393f1d0c19c88f4969519059063b0b71a4f5a936f40abb6e7521e519830e1b
|
4
|
+
data.tar.gz: 2f6f91ec95d57f8dd8c52c74bbd6506d4d978626ff17f4d77c0bb4acfabff6d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3348c75410ed7a5b26522243eb7a41a54aec41e1750d9afe5f401ba34efb4284b3fd16f6ad7b42195ef08da98d2b04a9df6eae28b9ac118b81fb89dba28feeba
|
7
|
+
data.tar.gz: c0b60143532820fa86dbca11bb81b3f030253158edd5dd998198d11235a6fe2c3f8cbf3106ad56f7064a1741822037a0b2f9a448dcaa05684abafecb76d2d6c3
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -26,7 +26,10 @@ Or, you may set the key yourself in an initializer:
|
|
26
26
|
|
27
27
|
```ruby
|
28
28
|
# /config/initializers/knock.rb
|
29
|
-
Knock.
|
29
|
+
Knock.configure do |config|
|
30
|
+
config.key = '[your api key]'
|
31
|
+
config.timeout = 120
|
32
|
+
end
|
30
33
|
```
|
31
34
|
|
32
35
|
## Usage
|
@@ -34,10 +37,6 @@ Knock.key = 'sk_12345'
|
|
34
37
|
### Identifying users
|
35
38
|
|
36
39
|
```ruby
|
37
|
-
require "knock"
|
38
|
-
|
39
|
-
Knock.key = "sk_12345"
|
40
|
-
|
41
40
|
Knock::Users.identify(
|
42
41
|
id: "jhammond",
|
43
42
|
data: {
|
@@ -50,10 +49,6 @@ Knock::Users.identify(
|
|
50
49
|
### Sending notifies (triggering workflows)
|
51
50
|
|
52
51
|
```ruby
|
53
|
-
require "knock"
|
54
|
-
|
55
|
-
Knock.key = "sk_12345"
|
56
|
-
|
57
52
|
# The key of the workflow (from Knock dashboard)
|
58
53
|
Knock::Workflows.trigger(
|
59
54
|
key: "dinosaurs-loose",
|
@@ -74,29 +69,18 @@ Knock::Workflows.trigger(
|
|
74
69
|
### Retrieving users
|
75
70
|
|
76
71
|
```ruby
|
77
|
-
require "knock"
|
78
|
-
|
79
|
-
Knock.key = "sk_12345"
|
80
|
-
|
81
72
|
Knock::Users.get(id: "jhammond")
|
82
73
|
```
|
83
74
|
|
84
75
|
### Deleting users
|
85
76
|
|
86
77
|
```ruby
|
87
|
-
require "knock"
|
88
|
-
|
89
|
-
Knock.key = "sk_12345"
|
90
|
-
|
91
78
|
Knock::Users.delete(id: "jhammond")
|
92
79
|
```
|
93
80
|
|
94
81
|
### Preferences
|
95
82
|
|
96
83
|
```ruby
|
97
|
-
require "knock"
|
98
|
-
Knock.key = "sk_12345"
|
99
|
-
|
100
84
|
# Set an entire preference set
|
101
85
|
Knock::Users.set_preferences(
|
102
86
|
user_id: "jhammond",
|
@@ -115,9 +99,6 @@ Knock::Users.get_preferences(user_id: "jhammond")
|
|
115
99
|
### Getting and setting channel data
|
116
100
|
|
117
101
|
```ruby
|
118
|
-
require "knock"
|
119
|
-
Knock.key = "sk_12345"
|
120
|
-
|
121
102
|
# Set channel data for an APNS
|
122
103
|
Knock::Users.set_channel_data(
|
123
104
|
id: "jhammond",
|
@@ -134,9 +115,6 @@ Knock::Users.get_channel_data(user_id: "jhammond", channel_id: KNOCK_APNS_CHANNE
|
|
134
115
|
### Cancelling workflows
|
135
116
|
|
136
117
|
```ruby
|
137
|
-
require "knock"
|
138
|
-
Knock.key = "sk_12345"
|
139
|
-
|
140
118
|
Knock::Workflows.cancel(
|
141
119
|
key: "dinosaurs-loose",
|
142
120
|
cancellation_key: trigger_alert.id,
|
data/lib/knock/client.rb
CHANGED
@@ -2,20 +2,27 @@
|
|
2
2
|
|
3
3
|
module Knock
|
4
4
|
# A Net::HTTP based API client for interacting with the Knock API
|
5
|
+
# rubocop:disable Metrics/ModuleLength
|
5
6
|
module Client
|
6
7
|
include Kernel
|
7
8
|
|
8
9
|
def client
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
Net::HTTP.new(Knock.config.api_hostname, 443).tap do |http_client|
|
11
|
+
http_client.use_ssl = true
|
12
|
+
http_client.open_timeout = Knock.config.timeout
|
13
|
+
http_client.read_timeout = Knock.config.timeout
|
14
|
+
http_client.write_timeout = Knock.config.timeout if RUBY_VERSION >= '2.6.0'
|
15
|
+
end
|
15
16
|
end
|
16
17
|
|
17
18
|
def execute_request(request:)
|
18
|
-
|
19
|
+
begin
|
20
|
+
response = client.request(request)
|
21
|
+
rescue Net::OpenTimeout, Net::ReadTimeout, Net::WriteTimeout
|
22
|
+
raise TimeoutError.new(
|
23
|
+
message: 'API Timeout Error'
|
24
|
+
)
|
25
|
+
end
|
19
26
|
|
20
27
|
http_status = response.code.to_i
|
21
28
|
handle_error_response(response: response) if http_status >= 400
|
@@ -32,7 +39,7 @@ module Knock
|
|
32
39
|
'Content-Type' => 'application/json'
|
33
40
|
)
|
34
41
|
|
35
|
-
request['Authorization'] = "Bearer #{access_token || Knock.key!}" if auth
|
42
|
+
request['Authorization'] = "Bearer #{access_token || Knock.config.key!}" if auth
|
36
43
|
request['User-Agent'] = user_agent
|
37
44
|
request
|
38
45
|
end
|
@@ -40,7 +47,7 @@ module Knock
|
|
40
47
|
def post_request(path:, auth: false, idempotency_key: nil, body: nil)
|
41
48
|
request = Net::HTTP::Post.new(path, 'Content-Type' => 'application/json')
|
42
49
|
request.body = body.to_json if body
|
43
|
-
request['Authorization'] = "Bearer #{Knock.key!}" if auth
|
50
|
+
request['Authorization'] = "Bearer #{Knock.config.key!}" if auth
|
44
51
|
request['User-Agent'] = user_agent
|
45
52
|
request['Idempotency-Key'] = idempotency_key if idempotency_key
|
46
53
|
request
|
@@ -56,7 +63,7 @@ module Knock
|
|
56
63
|
)
|
57
64
|
|
58
65
|
request.body = body.to_json if body
|
59
|
-
request['Authorization'] = "Bearer #{Knock.key!}" if auth
|
66
|
+
request['Authorization'] = "Bearer #{Knock.config.key!}" if auth
|
60
67
|
request['User-Agent'] = user_agent
|
61
68
|
request
|
62
69
|
end
|
@@ -64,7 +71,7 @@ module Knock
|
|
64
71
|
def put_request(path:, auth: false, idempotency_key: nil, body: nil)
|
65
72
|
request = Net::HTTP::Put.new(path, 'Content-Type' => 'application/json')
|
66
73
|
request.body = body.to_json if body
|
67
|
-
request['Authorization'] = "Bearer #{Knock.key!}" if auth
|
74
|
+
request['Authorization'] = "Bearer #{Knock.config.key!}" if auth
|
68
75
|
request['User-Agent'] = user_agent
|
69
76
|
request['Idempotency-Key'] = idempotency_key if idempotency_key
|
70
77
|
request
|
@@ -122,4 +129,5 @@ module Knock
|
|
122
129
|
end.join('; ')
|
123
130
|
end
|
124
131
|
end
|
132
|
+
# rubocop:enable Metrics/ModuleLength
|
125
133
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# typed: true
|
4
|
+
|
5
|
+
module Knock
|
6
|
+
# Configuration class sets config initializer
|
7
|
+
class Configuration
|
8
|
+
attr_accessor :api_hostname, :timeout, :key
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@timeout = 60
|
12
|
+
end
|
13
|
+
|
14
|
+
def key!
|
15
|
+
key or raise '`Knock.config.key` not set'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/knock/errors.rb
CHANGED
@@ -42,4 +42,7 @@ module Knock
|
|
42
42
|
# InvalidRequestError is raised when a request is initiated with invalid
|
43
43
|
# parameters.
|
44
44
|
class InvalidRequestError < KnockError; end
|
45
|
+
|
46
|
+
# TimeoutError is raised when the HTTP request to the API times out
|
47
|
+
class TimeoutError < KnockError; end
|
45
48
|
end
|
data/lib/knock/messages.rb
CHANGED
data/lib/knock/objects.rb
CHANGED
@@ -9,7 +9,6 @@ module Knock
|
|
9
9
|
# rubocop:disable Metrics/ModuleLength
|
10
10
|
module Objects
|
11
11
|
class << self
|
12
|
-
include Base
|
13
12
|
include Client
|
14
13
|
|
15
14
|
DEFAULT_PREFERENCE_SET_ID = 'default'
|
@@ -333,6 +332,7 @@ module Knock
|
|
333
332
|
# - page_size: size of page to be returned (max: 50)
|
334
333
|
# - after: after cursor for pagination
|
335
334
|
# - before: before cursor for pagination
|
335
|
+
# - recipients: list of recipient identifiers to filter subscribers of the object
|
336
336
|
#
|
337
337
|
# @return [Hash] Paginated subscriptions response
|
338
338
|
def list_subscriptions(collection:, id:, options: {})
|
data/lib/knock/preferences.rb
CHANGED
data/lib/knock/tenants.rb
CHANGED
data/lib/knock/users.rb
CHANGED
data/lib/knock/version.rb
CHANGED
data/lib/knock/workflows.rb
CHANGED
@@ -7,7 +7,6 @@ module Knock
|
|
7
7
|
# Methods for interacting with workflows in Knock
|
8
8
|
module Workflows
|
9
9
|
class << self
|
10
|
-
include Base
|
11
10
|
include Client
|
12
11
|
|
13
12
|
# Triggers the workflow with the given key
|
@@ -18,12 +17,12 @@ module Knock
|
|
18
17
|
# @param [Hash] data The data to pass to the workflow
|
19
18
|
# @param [String] cancellation_key An optional key to identify this workflow
|
20
19
|
# invocation for cancelling
|
21
|
-
# @param [String] tenant An optional tenant identifier
|
20
|
+
# @param [String, Hash] tenant An optional tenant identifier or a set of tenant attributes
|
22
21
|
# @param [String] idempotency_key An optional idempotency key to prevent
|
23
22
|
# duplicate workflow invocations
|
24
23
|
#
|
25
24
|
# @return [Hash] A workflow trigger result
|
26
|
-
def trigger(key:,
|
25
|
+
def trigger(key:, recipients:, data: {}, actor: nil, cancellation_key: nil, tenant: nil, idempotency_key: nil)
|
27
26
|
attrs = {
|
28
27
|
actor: actor,
|
29
28
|
recipients: recipients,
|
@@ -72,7 +71,7 @@ module Knock
|
|
72
71
|
# @param [Array<String, Hash>] recipients The recipient identifiers
|
73
72
|
# @param [Array<Hash>] repeats The repeat rules for when to schedule the workflow run
|
74
73
|
# @param [Hash] data Parameters to be used as variables on the workflow run
|
75
|
-
# @param [String] tenant An optional tenant identifier
|
74
|
+
# @param [String, Hash] tenant An optional tenant identifier or a set of tenant attributes
|
76
75
|
|
77
76
|
def create_schedules(key:, recipients:, repeats:, scheduled_at: nil, data: {}, actor: nil, tenant: nil)
|
78
77
|
attrs = {
|
data/lib/knock.rb
CHANGED
@@ -2,25 +2,39 @@
|
|
2
2
|
|
3
3
|
require 'knock/version'
|
4
4
|
require 'json'
|
5
|
+
require 'knock/configuration'
|
5
6
|
|
6
7
|
# Setup for Knock client
|
7
8
|
module Knock
|
8
|
-
|
9
|
+
def self.default_config
|
10
|
+
Configuration.new.tap do |config|
|
11
|
+
config.api_hostname = ENV['KNOCK_API_HOSTNAME'] || 'api.knock.app'
|
12
|
+
config.key = ENV['KNOCK_API_KEY']
|
13
|
+
end
|
14
|
+
end
|
9
15
|
|
10
|
-
def self.
|
11
|
-
|
16
|
+
def self.config
|
17
|
+
@config ||= default_config
|
12
18
|
end
|
13
19
|
|
14
|
-
def self.
|
15
|
-
|
20
|
+
def self.configure
|
21
|
+
yield(config)
|
16
22
|
end
|
17
23
|
|
18
|
-
def self.key
|
19
|
-
|
24
|
+
def self.key=(value)
|
25
|
+
warn '`Knock.key=` is deprecated. Use `Knock.configure` instead.'
|
26
|
+
|
27
|
+
config.key = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.key
|
31
|
+
warn '`Knock.key` is deprecated. Use `Knock.configure` instead.'
|
32
|
+
config.key
|
20
33
|
end
|
21
34
|
|
22
35
|
autoload :Base, 'knock/base'
|
23
36
|
autoload :Client, 'knock/client'
|
37
|
+
autoload :Configuration, 'knock/configuration'
|
24
38
|
|
25
39
|
# Resources
|
26
40
|
autoload :Preferences, 'knock/preferences'
|
@@ -35,9 +49,7 @@ module Knock
|
|
35
49
|
autoload :APIError, 'knock/errors'
|
36
50
|
autoload :AuthenticationError, 'knock/errors'
|
37
51
|
autoload :InvalidRequestError, 'knock/errors'
|
38
|
-
|
39
|
-
key = ENV['KNOCK_API_KEY']
|
40
|
-
Knock.key = key unless key.nil?
|
52
|
+
autoload :TimeoutError, 'knock/errors'
|
41
53
|
|
42
54
|
# Triggers the workflow with the given key
|
43
55
|
#
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# typed: false
|
4
|
+
require_relative '../lib/knock'
|
5
|
+
|
6
|
+
describe Knock do
|
7
|
+
describe '.configure' do
|
8
|
+
context 'with key and no timeout' do
|
9
|
+
before do
|
10
|
+
Knock.configure do |config|
|
11
|
+
config.key = 'example_api_key'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'sets the key and default timeout configuration' do
|
16
|
+
expect(Knock.config.key).to eq('example_api_key')
|
17
|
+
expect(Knock.config.timeout).to eq(60)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with key and timeout' do
|
22
|
+
before do
|
23
|
+
Knock.configure do |config|
|
24
|
+
config.key = 'example_api_key'
|
25
|
+
config.timeout = 120
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'sets the key and timeout configuration' do
|
30
|
+
expect(Knock.config.key).to eq('example_api_key')
|
31
|
+
expect(Knock.config.timeout).to eq(120)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe Knock::Configuration do
|
38
|
+
describe '.key!' do
|
39
|
+
context 'with key set' do
|
40
|
+
before do
|
41
|
+
Knock.config.key = 'example_api_key'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns the key' do
|
45
|
+
expect(Knock.config.key!).to eq('example_api_key')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with key not set' do
|
50
|
+
before do
|
51
|
+
Knock.config.key = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'throws an error' do
|
55
|
+
expect do
|
56
|
+
Knock.config.key!
|
57
|
+
end.to raise_error(
|
58
|
+
'`Knock.config.key` not set'
|
59
|
+
)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knockapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Knock Labs, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,9 +76,9 @@ files:
|
|
76
76
|
- bin/publish
|
77
77
|
- knockapi.gemspec
|
78
78
|
- lib/knock.rb
|
79
|
-
- lib/knock/base.rb
|
80
79
|
- lib/knock/bulk_operations.rb
|
81
80
|
- lib/knock/client.rb
|
81
|
+
- lib/knock/configuration.rb
|
82
82
|
- lib/knock/errors.rb
|
83
83
|
- lib/knock/messages.rb
|
84
84
|
- lib/knock/objects.rb
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/knock/users.rb
|
88
88
|
- lib/knock/version.rb
|
89
89
|
- lib/knock/workflows.rb
|
90
|
+
- spec/configuration_spec.rb
|
90
91
|
- spec/tenants_spec.rb
|
91
92
|
homepage: https://github.com/knocklabs/knock-ruby
|
92
93
|
licenses:
|
@@ -108,9 +109,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
109
|
- !ruby/object:Gem::Version
|
109
110
|
version: '0'
|
110
111
|
requirements: []
|
111
|
-
rubygems_version: 3.
|
112
|
+
rubygems_version: 3.5.9
|
112
113
|
signing_key:
|
113
114
|
specification_version: 4
|
114
115
|
summary: API client for Knock
|
115
116
|
test_files:
|
117
|
+
- spec/configuration_spec.rb
|
116
118
|
- spec/tenants_spec.rb
|
data/lib/knock/base.rb
DELETED