volley-ruby 1.0.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 +7 -0
- data/CHANGELOG.md +32 -0
- data/LICENSE +22 -0
- data/README.md +327 -0
- data/RELEASING.md +131 -0
- data/TESTING.md +155 -0
- data/examples/example.rb +42 -0
- data/lib/volley/models/connection.rb +22 -0
- data/lib/volley/models/delivery_attempt.rb +22 -0
- data/lib/volley/models/destination.rb +21 -0
- data/lib/volley/models/event.rb +23 -0
- data/lib/volley/models/organization.rb +20 -0
- data/lib/volley/models/project.rb +21 -0
- data/lib/volley/models/source.rb +29 -0
- data/lib/volley/models.rb +10 -0
- data/lib/volley/resources/connections_resource.rb +51 -0
- data/lib/volley/resources/delivery_attempts_resource.rb +38 -0
- data/lib/volley/resources/destinations_resource.rb +56 -0
- data/lib/volley/resources/events_resource.rb +54 -0
- data/lib/volley/resources/organizations_resource.rb +63 -0
- data/lib/volley/resources/projects_resource.rb +52 -0
- data/lib/volley/resources/sources_resource.rb +70 -0
- data/lib/volley/resources/webhooks_resource.rb +26 -0
- data/lib/volley/resources.rb +11 -0
- data/lib/volley/version.rb +7 -0
- data/lib/volley/volley_client.rb +133 -0
- data/lib/volley/volley_exception.rb +53 -0
- data/lib/volley.rb +10 -0
- data/volley-ruby.gemspec +43 -0
- metadata +173 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'faraday'
|
|
4
|
+
require 'faraday/retry'
|
|
5
|
+
require 'json'
|
|
6
|
+
require_relative 'volley_exception'
|
|
7
|
+
require_relative 'resources/organizations_resource'
|
|
8
|
+
require_relative 'resources/projects_resource'
|
|
9
|
+
require_relative 'resources/sources_resource'
|
|
10
|
+
require_relative 'resources/destinations_resource'
|
|
11
|
+
require_relative 'resources/connections_resource'
|
|
12
|
+
require_relative 'resources/events_resource'
|
|
13
|
+
require_relative 'resources/delivery_attempts_resource'
|
|
14
|
+
require_relative 'resources/webhooks_resource'
|
|
15
|
+
|
|
16
|
+
module Volley
|
|
17
|
+
# Main client for interacting with the Volley API.
|
|
18
|
+
class VolleyClient
|
|
19
|
+
DEFAULT_BASE_URL = 'https://api.volleyhooks.com'
|
|
20
|
+
DEFAULT_TIMEOUT = 30
|
|
21
|
+
|
|
22
|
+
attr_reader :api_token, :base_url, :organization_id
|
|
23
|
+
attr_reader :organizations, :projects, :sources, :destinations, :connections, :events, :delivery_attempts, :webhooks
|
|
24
|
+
|
|
25
|
+
# Initializes a new instance of the VolleyClient class.
|
|
26
|
+
#
|
|
27
|
+
# @param api_token [String] Your Volley API token
|
|
28
|
+
# @param base_url [String, nil] Custom base URL (defaults to https://api.volleyhooks.com)
|
|
29
|
+
# @param organization_id [Integer, nil] Organization ID for all requests
|
|
30
|
+
# @param http_client [Faraday::Connection, nil] Custom Faraday HTTP client (optional)
|
|
31
|
+
def initialize(api_token, base_url: nil, organization_id: nil, http_client: nil)
|
|
32
|
+
raise ArgumentError, 'API token is required' if api_token.nil? || api_token.empty?
|
|
33
|
+
|
|
34
|
+
@api_token = api_token
|
|
35
|
+
@base_url = base_url || DEFAULT_BASE_URL
|
|
36
|
+
@organization_id = organization_id
|
|
37
|
+
|
|
38
|
+
@http_client = http_client || build_http_client
|
|
39
|
+
|
|
40
|
+
# Initialize resource clients
|
|
41
|
+
@organizations = Resources::OrganizationsResource.new(self)
|
|
42
|
+
@projects = Resources::ProjectsResource.new(self)
|
|
43
|
+
@sources = Resources::SourcesResource.new(self)
|
|
44
|
+
@destinations = Resources::DestinationsResource.new(self)
|
|
45
|
+
@connections = Resources::ConnectionsResource.new(self)
|
|
46
|
+
@events = Resources::EventsResource.new(self)
|
|
47
|
+
@delivery_attempts = Resources::DeliveryAttemptsResource.new(self)
|
|
48
|
+
@webhooks = Resources::WebhooksResource.new(self)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Sets the organization ID for subsequent requests.
|
|
52
|
+
#
|
|
53
|
+
# @param organization_id [Integer] The organization ID to use
|
|
54
|
+
def set_organization_id(organization_id)
|
|
55
|
+
@organization_id = organization_id
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Clears the organization ID (uses default organization).
|
|
59
|
+
def clear_organization_id
|
|
60
|
+
@organization_id = nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Gets the current organization ID.
|
|
64
|
+
#
|
|
65
|
+
# @return [Integer, nil] The organization ID, or nil if not set
|
|
66
|
+
def get_organization_id
|
|
67
|
+
@organization_id
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Performs an HTTP request with authentication.
|
|
71
|
+
#
|
|
72
|
+
# @param method [String] HTTP method (GET, POST, PUT, DELETE)
|
|
73
|
+
# @param path [String] API path (e.g., /api/org)
|
|
74
|
+
# @param data [Hash, nil] Request body data (for POST/PUT)
|
|
75
|
+
# @param query_params [Hash, nil] Query parameters
|
|
76
|
+
# @return [Hash] Response data
|
|
77
|
+
# @raise [VolleyException] If the request fails
|
|
78
|
+
def request(method, path, data: nil, query_params: nil)
|
|
79
|
+
url = "#{@base_url}#{path}"
|
|
80
|
+
|
|
81
|
+
headers = {
|
|
82
|
+
'Authorization' => "Bearer #{@api_token}",
|
|
83
|
+
'Content-Type' => 'application/json',
|
|
84
|
+
'Accept' => 'application/json'
|
|
85
|
+
}
|
|
86
|
+
headers['X-Organization-ID'] = @organization_id.to_s if @organization_id
|
|
87
|
+
|
|
88
|
+
response = @http_client.public_send(method.downcase.to_sym) do |req|
|
|
89
|
+
req.url url
|
|
90
|
+
req.headers = headers
|
|
91
|
+
req.body = data.to_json if data && %w[post put].include?(method.downcase)
|
|
92
|
+
req.params = query_params if query_params
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
handle_response(response)
|
|
96
|
+
rescue Faraday::Error => e
|
|
97
|
+
raise VolleyException.new("Request failed: #{e.message}", 0)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
def build_http_client
|
|
103
|
+
Faraday.new do |f|
|
|
104
|
+
f.request :retry, {
|
|
105
|
+
max: 3,
|
|
106
|
+
interval: 1,
|
|
107
|
+
retry_statuses: [429, 500, 502, 503, 504]
|
|
108
|
+
}
|
|
109
|
+
f.adapter Faraday.default_adapter
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def handle_response(response)
|
|
114
|
+
unless response.success?
|
|
115
|
+
error_message = 'Request failed'
|
|
116
|
+
begin
|
|
117
|
+
error_data = JSON.parse(response.body)
|
|
118
|
+
error_message = error_data['error'] || error_data['message'] || error_message
|
|
119
|
+
rescue JSON::ParserError
|
|
120
|
+
error_message = response.body || error_message
|
|
121
|
+
end
|
|
122
|
+
raise VolleyException.new(error_message, response.status)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
return {} if response.body.nil? || response.body.empty?
|
|
126
|
+
|
|
127
|
+
JSON.parse(response.body)
|
|
128
|
+
rescue JSON::ParserError
|
|
129
|
+
{}
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Volley
|
|
4
|
+
# Exception thrown when a Volley API request fails.
|
|
5
|
+
class VolleyException < StandardError
|
|
6
|
+
attr_reader :status_code
|
|
7
|
+
|
|
8
|
+
# Initializes a new instance of the VolleyException class.
|
|
9
|
+
#
|
|
10
|
+
# @param message [String] Error message
|
|
11
|
+
# @param status_code [Integer] HTTP status code
|
|
12
|
+
def initialize(message = '', status_code = 0)
|
|
13
|
+
super(message)
|
|
14
|
+
@status_code = status_code
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Checks if the exception represents an unauthorized error (401).
|
|
18
|
+
#
|
|
19
|
+
# @return [Boolean]
|
|
20
|
+
def unauthorized?
|
|
21
|
+
@status_code == 401
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Checks if the exception represents a forbidden error (403).
|
|
25
|
+
#
|
|
26
|
+
# @return [Boolean]
|
|
27
|
+
def forbidden?
|
|
28
|
+
@status_code == 403
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Checks if the exception represents a not found error (404).
|
|
32
|
+
#
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
def not_found?
|
|
35
|
+
@status_code == 404
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Checks if the exception represents a rate limit error (429).
|
|
39
|
+
#
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
def rate_limited?
|
|
42
|
+
@status_code == 429
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Checks if the exception represents a server error (5xx).
|
|
46
|
+
#
|
|
47
|
+
# @return [Boolean]
|
|
48
|
+
def server_error?
|
|
49
|
+
@status_code >= 500 && @status_code < 600
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
data/lib/volley.rb
ADDED
data/volley-ruby.gemspec
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'lib/volley/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'volley-ruby'
|
|
7
|
+
spec.version = Volley::VERSION
|
|
8
|
+
spec.authors = ['Volley']
|
|
9
|
+
spec.email = ['support@volleyhooks.com']
|
|
10
|
+
|
|
11
|
+
spec.summary = 'Official Ruby SDK for the Volley API'
|
|
12
|
+
spec.description = 'Official Ruby SDK for the Volley webhook infrastructure API'
|
|
13
|
+
spec.homepage = 'https://github.com/volleyhq/volley-ruby'
|
|
14
|
+
spec.license = 'MIT'
|
|
15
|
+
|
|
16
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
17
|
+
spec.metadata['source_code_uri'] = 'https://github.com/volleyhq/volley-ruby'
|
|
18
|
+
spec.metadata['changelog_uri'] = 'https://github.com/volleyhq/volley-ruby/blob/main/CHANGELOG.md'
|
|
19
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
20
|
+
|
|
21
|
+
# Specify which files should be added to the gem when it is released.
|
|
22
|
+
spec.files = Dir.chdir(__dir__) do
|
|
23
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
24
|
+
(File.expand_path(f) == __FILE__) ||
|
|
25
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git .github .rspec .rubocop Gemfile Rakefile])
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
spec.bindir = 'exe'
|
|
29
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
30
|
+
spec.require_paths = ['lib']
|
|
31
|
+
|
|
32
|
+
spec.required_ruby_version = '>= 2.6.0'
|
|
33
|
+
|
|
34
|
+
spec.add_dependency 'faraday', '~> 2.0'
|
|
35
|
+
spec.add_dependency 'faraday-retry', '~> 2.0'
|
|
36
|
+
|
|
37
|
+
spec.add_development_dependency 'bundler', '>= 1.17'
|
|
38
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
|
39
|
+
spec.add_development_dependency 'rspec', '~> 3.12'
|
|
40
|
+
spec.add_development_dependency 'rubocop', '~> 1.50'
|
|
41
|
+
spec.add_development_dependency 'webmock', '~> 3.18'
|
|
42
|
+
end
|
|
43
|
+
|
metadata
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: volley-ruby
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Volley
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2025-12-17 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: faraday
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: faraday-retry
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '2.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '2.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: bundler
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '1.17'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '1.17'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rake
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '13.0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '13.0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '3.12'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '3.12'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rubocop
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '1.50'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '1.50'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: webmock
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '3.18'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '3.18'
|
|
111
|
+
description: Official Ruby SDK for the Volley webhook infrastructure API
|
|
112
|
+
email:
|
|
113
|
+
- support@volleyhooks.com
|
|
114
|
+
executables: []
|
|
115
|
+
extensions: []
|
|
116
|
+
extra_rdoc_files: []
|
|
117
|
+
files:
|
|
118
|
+
- CHANGELOG.md
|
|
119
|
+
- LICENSE
|
|
120
|
+
- README.md
|
|
121
|
+
- RELEASING.md
|
|
122
|
+
- TESTING.md
|
|
123
|
+
- examples/example.rb
|
|
124
|
+
- lib/volley.rb
|
|
125
|
+
- lib/volley/models.rb
|
|
126
|
+
- lib/volley/models/connection.rb
|
|
127
|
+
- lib/volley/models/delivery_attempt.rb
|
|
128
|
+
- lib/volley/models/destination.rb
|
|
129
|
+
- lib/volley/models/event.rb
|
|
130
|
+
- lib/volley/models/organization.rb
|
|
131
|
+
- lib/volley/models/project.rb
|
|
132
|
+
- lib/volley/models/source.rb
|
|
133
|
+
- lib/volley/resources.rb
|
|
134
|
+
- lib/volley/resources/connections_resource.rb
|
|
135
|
+
- lib/volley/resources/delivery_attempts_resource.rb
|
|
136
|
+
- lib/volley/resources/destinations_resource.rb
|
|
137
|
+
- lib/volley/resources/events_resource.rb
|
|
138
|
+
- lib/volley/resources/organizations_resource.rb
|
|
139
|
+
- lib/volley/resources/projects_resource.rb
|
|
140
|
+
- lib/volley/resources/sources_resource.rb
|
|
141
|
+
- lib/volley/resources/webhooks_resource.rb
|
|
142
|
+
- lib/volley/version.rb
|
|
143
|
+
- lib/volley/volley_client.rb
|
|
144
|
+
- lib/volley/volley_exception.rb
|
|
145
|
+
- volley-ruby.gemspec
|
|
146
|
+
homepage: https://github.com/volleyhq/volley-ruby
|
|
147
|
+
licenses:
|
|
148
|
+
- MIT
|
|
149
|
+
metadata:
|
|
150
|
+
homepage_uri: https://github.com/volleyhq/volley-ruby
|
|
151
|
+
source_code_uri: https://github.com/volleyhq/volley-ruby
|
|
152
|
+
changelog_uri: https://github.com/volleyhq/volley-ruby/blob/main/CHANGELOG.md
|
|
153
|
+
rubygems_mfa_required: 'true'
|
|
154
|
+
post_install_message:
|
|
155
|
+
rdoc_options: []
|
|
156
|
+
require_paths:
|
|
157
|
+
- lib
|
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
|
+
requirements:
|
|
160
|
+
- - ">="
|
|
161
|
+
- !ruby/object:Gem::Version
|
|
162
|
+
version: 2.6.0
|
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
|
+
requirements:
|
|
165
|
+
- - ">="
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: '0'
|
|
168
|
+
requirements: []
|
|
169
|
+
rubygems_version: 3.0.3.1
|
|
170
|
+
signing_key:
|
|
171
|
+
specification_version: 4
|
|
172
|
+
summary: Official Ruby SDK for the Volley API
|
|
173
|
+
test_files: []
|