knockapi 0.4.12 → 0.5.1
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/.github/workflows/ruby.yml +12 -17
- data/.ruby-version +1 -1
- data/.tool-versions +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +4 -26
- data/lib/knock/bulk_operations.rb +0 -1
- data/lib/knock/client.rb +29 -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 +0 -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 +0 -1
- 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: a134ca1b8dfef66365a05c99f1eb70146f647d1df31978da691b81b09016d37e
|
4
|
+
data.tar.gz: ce602039743e58d61f5a926aec90996a95e6635343b148df247c914b33597cd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78a5c9740fd5fe6328ffaa1b8582dbf93221fc2775bdfc3471935c86de5bbb2fe1b9d80f2e7280c3a8bdb6bdc99cc59180a9e46ab77b6041673aae06ab3d43d7
|
7
|
+
data.tar.gz: 4dd3a4622d8d2cddd6b1b6b895740071603ffc613971e817bd58baa650602cc2c835664935d06500a768d83c00e8961b4eadbbf1e65b8cc91462b9c13d0fc7ee
|
data/.github/workflows/ruby.yml
CHANGED
@@ -9,42 +9,37 @@ name: Ruby
|
|
9
9
|
|
10
10
|
on:
|
11
11
|
push:
|
12
|
-
branches: [
|
12
|
+
branches: ["main"]
|
13
13
|
pull_request:
|
14
|
-
branches: [
|
14
|
+
branches: ["main"]
|
15
15
|
|
16
16
|
permissions:
|
17
17
|
contents: read
|
18
18
|
|
19
19
|
jobs:
|
20
20
|
test:
|
21
|
-
|
22
21
|
runs-on: ubuntu-latest
|
23
22
|
strategy:
|
24
23
|
matrix:
|
25
|
-
ruby-version: [
|
24
|
+
ruby-version: ["2.7", "3.0", "3.1", "3.2"]
|
26
25
|
|
27
26
|
steps:
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
37
|
-
- name: Run tests
|
38
|
-
run: bundle exec rspec spec
|
27
|
+
- uses: actions/checkout@v3
|
28
|
+
- name: Set up Ruby
|
29
|
+
uses: ruby/setup-ruby@v1
|
30
|
+
with:
|
31
|
+
ruby-version: ${{ matrix.ruby-version }}
|
32
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rspec spec
|
39
35
|
|
40
36
|
lint:
|
41
|
-
|
42
37
|
runs-on: ubuntu-latest
|
43
38
|
steps:
|
44
39
|
- name: Checkout code
|
45
40
|
uses: actions/checkout@v3
|
46
41
|
- name: Install Ruby and gems
|
47
|
-
uses: ruby/setup-ruby@
|
42
|
+
uses: ruby/setup-ruby@v1
|
48
43
|
with:
|
49
44
|
bundler-cache: true
|
50
45
|
# Add or replace any other lints here
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.2.5
|
data/.tool-versions
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 3.2.
|
1
|
+
ruby 3.2.5
|
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
|
@@ -75,6 +82,8 @@ module Knock
|
|
75
82
|
end
|
76
83
|
|
77
84
|
# rubocop:disable Metrics/AbcSize
|
85
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
86
|
+
# rubocop:disable Metrics/MethodLength
|
78
87
|
|
79
88
|
def handle_error_response(response:)
|
80
89
|
http_status = response.code.to_i
|
@@ -109,10 +118,18 @@ module Knock
|
|
109
118
|
http_status: http_status,
|
110
119
|
request_id: response['x-request-id']
|
111
120
|
)
|
121
|
+
when 429
|
122
|
+
raise APIError.new(
|
123
|
+
message: json['message'],
|
124
|
+
http_status: http_status,
|
125
|
+
request_id: response['x-request-id']
|
126
|
+
)
|
112
127
|
end
|
113
128
|
end
|
114
129
|
|
115
130
|
# rubocop:enable Metrics/AbcSize
|
131
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
132
|
+
# rubocop:enable Metrics/MethodLength
|
116
133
|
|
117
134
|
private
|
118
135
|
|
@@ -122,4 +139,5 @@ module Knock
|
|
122
139
|
end.join('; ')
|
123
140
|
end
|
124
141
|
end
|
142
|
+
# rubocop:enable Metrics/ModuleLength
|
125
143
|
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
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
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.1
|
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: 2024-
|
11
|
+
date: 2024-07-29 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.5.
|
112
|
+
rubygems_version: 3.5.11
|
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