act_as_api_client 0.2.0 → 1.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/.devcontainer.json +11 -0
- data/.github/workflows/main.yml +8 -7
- data/.gitignore +3 -1
- data/.rubocop.yml +7 -2
- data/.rubocop_todo.yml +14 -28
- data/Dockerfile +3 -0
- data/Gemfile +0 -8
- data/Gemfile.lock +2 -5
- data/README.md +6 -8
- data/act_as_api_client.gemspec +9 -4
- data/demo.rb +1 -1
- data/docker-compose.yml +9 -0
- data/examples/anthropic_playground.rb +31 -0
- data/examples/github_repositories.rb +21 -0
- data/lib/act_as_api_client/client_loader.rb +46 -0
- data/lib/act_as_api_client/clients/anthropic/messages_client.rb +85 -0
- data/lib/act_as_api_client/clients/{github_client.rb → github_repositories_client.rb} +3 -3
- data/lib/act_as_api_client/clients/http_client.rb +32 -6
- data/lib/act_as_api_client/errors/invalid_response_error.rb +8 -0
- data/lib/act_as_api_client/errors/network_error.rb +8 -0
- data/lib/act_as_api_client/errors/non_existing_client_error.rb +16 -0
- data/lib/act_as_api_client.rb +7 -16
- metadata +117 -12
- data/lib/act_as_api_client/clients/authorize_net_notifications_client.rb +0 -30
- data/lib/act_as_api_client/clients/authorize_net_webhooks_client.rb +0 -42
- data/lib/act_as_api_client/version.rb +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a90b4aea75a3d4fffe79dc9d882cc6560c464409cfa07aa9227806573cef5055
|
|
4
|
+
data.tar.gz: 70429d7b213697175b2283bfa2aabca4b019a7c7272b097e34fa9786904ae6cd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b2f6b525f14bf39b4463d40cba93aa2cf84d98b92e5e5a77ddc9bc34cb8ba8f02a5e098d38788657317b6b5f0774a22f5345de6338e4b47e2548896b9216c794
|
|
7
|
+
data.tar.gz: 64a64300293bf60782357e32c7909dc8d01a95e47e22c6df36226f6278d4dc941449d38d6fc135e42620ecf7efa9a8a874dbad4d523e175cba22a90f7c762c99
|
data/.devcontainer.json
ADDED
data/.github/workflows/main.yml
CHANGED
|
@@ -9,9 +9,9 @@ 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
|
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
runs-on: ubuntu-latest
|
|
22
22
|
strategy:
|
|
23
23
|
matrix:
|
|
24
|
-
ruby-version: [
|
|
24
|
+
ruby-version: ["3.0"]
|
|
25
25
|
steps:
|
|
26
26
|
- uses: actions/checkout@v3
|
|
27
27
|
- name: Set up Ruby
|
|
@@ -35,15 +35,16 @@ jobs:
|
|
|
35
35
|
runs-on: ubuntu-latest
|
|
36
36
|
strategy:
|
|
37
37
|
matrix:
|
|
38
|
-
|
|
38
|
+
os: [ubuntu-latest, macos-latest]
|
|
39
|
+
ruby-version: ["2.6", "2.7", "3.0", "3.1", "3.2", "3.3"]
|
|
39
40
|
steps:
|
|
40
41
|
- uses: actions/checkout@v3
|
|
41
42
|
- name: Set up Ruby
|
|
42
|
-
uses: ruby/setup-ruby@
|
|
43
|
+
uses: ruby/setup-ruby@v1
|
|
43
44
|
with:
|
|
44
45
|
ruby-version: ${{ matrix.ruby-version }}
|
|
45
|
-
bundler-cache: true
|
|
46
|
+
bundler-cache: true
|
|
46
47
|
- name: Copy credentials file for CI
|
|
47
48
|
run: mv spec/credentials.example.yml spec/credentials.yml
|
|
48
49
|
- name: Run tests
|
|
49
|
-
run: bundle exec rspec
|
|
50
|
+
run: bundle exec rspec
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -16,7 +16,12 @@ Layout/LineLength:
|
|
|
16
16
|
|
|
17
17
|
AllCops:
|
|
18
18
|
NewCops: enable
|
|
19
|
-
TargetRubyVersion: 2.
|
|
19
|
+
TargetRubyVersion: 2.6
|
|
20
20
|
|
|
21
21
|
Style/Documentation:
|
|
22
|
-
Enabled: false
|
|
22
|
+
Enabled: false
|
|
23
|
+
|
|
24
|
+
Metrics/BlockLength:
|
|
25
|
+
Exclude:
|
|
26
|
+
- 'spec/**/*'
|
|
27
|
+
- 'act_as_api_client.gemspec'
|
data/.rubocop_todo.yml
CHANGED
|
@@ -10,61 +10,47 @@
|
|
|
10
10
|
# Configuration parameters: IgnoredMethods, Max.
|
|
11
11
|
Metrics/AbcSize:
|
|
12
12
|
Exclude:
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
# Offense count: 5
|
|
16
|
-
# Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods.
|
|
17
|
-
# ExcludedMethods: refine
|
|
18
|
-
Metrics/BlockLength:
|
|
19
|
-
Exclude:
|
|
20
|
-
- '**/*.gemspec'
|
|
21
|
-
- 'spec/act_as_api_client/clients/authorize_net/authorize_net_notifications_client_spec.rb'
|
|
22
|
-
- 'spec/act_as_api_client/clients/github_client/find_by_spec.rb'
|
|
23
|
-
- 'spec/act_as_api_client/clients/github_client/find_spec.rb'
|
|
24
|
-
- 'spec/act_as_api_client/clients/github_client/where_spec.rb'
|
|
13
|
+
- "lib/act_as_api_client/clients/github_repositories_client.rb"
|
|
25
14
|
|
|
26
15
|
# Offense count: 1
|
|
27
16
|
# Configuration parameters: IgnoredMethods, Max.
|
|
28
17
|
Metrics/CyclomaticComplexity:
|
|
29
18
|
Exclude:
|
|
30
|
-
-
|
|
19
|
+
- "lib/act_as_api_client/clients/github_repositories_client.rb"
|
|
31
20
|
|
|
32
21
|
# Offense count: 2
|
|
33
22
|
# Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods.
|
|
34
23
|
Metrics/MethodLength:
|
|
35
24
|
Exclude:
|
|
36
|
-
-
|
|
37
|
-
-
|
|
25
|
+
- "lib/act_as_api_client/clients/github_repositories_client.rb"
|
|
26
|
+
- "lib/act_as_api_client/clients/http_client.rb"
|
|
38
27
|
|
|
39
28
|
# Offense count: 2
|
|
40
29
|
Naming/AccessorMethodName:
|
|
41
30
|
Exclude:
|
|
42
|
-
-
|
|
31
|
+
- "lib/act_as_api_client.rb"
|
|
43
32
|
|
|
44
33
|
# Offense count: 1
|
|
45
34
|
# Configuration parameters: Max.
|
|
46
35
|
RSpec/ExampleLength:
|
|
47
36
|
Exclude:
|
|
48
|
-
-
|
|
37
|
+
- "spec/act_as_api_client/clients/http_client_spec.rb"
|
|
49
38
|
|
|
50
39
|
# Offense count: 2
|
|
51
40
|
# Configuration parameters: CustomTransform, IgnoreMethods, SpecSuffixOnly.
|
|
52
41
|
RSpec/FilePath:
|
|
53
42
|
Exclude:
|
|
54
|
-
-
|
|
55
|
-
-
|
|
43
|
+
- "spec/act_as_api_client/clients/authorize_net/authorize_net_notifications_client_spec.rb"
|
|
44
|
+
- "spec/act_as_api_client/clients/authorize_net/authorize_net_webhooks_client_spec.rb"
|
|
45
|
+
- "spec/act_as_api_client/clients/github_client/find_by_spec.rb"
|
|
46
|
+
- "spec/act_as_api_client/clients/github_client/find_spec.rb"
|
|
47
|
+
- "spec/act_as_api_client/clients/github_client/where_spec.rb"
|
|
56
48
|
|
|
57
49
|
# Offense count: 3
|
|
58
50
|
# Configuration parameters: Max.
|
|
59
51
|
RSpec/NestedGroups:
|
|
60
52
|
Exclude:
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
# Offense count: 1
|
|
64
|
-
# Configuration parameters: MinBodyLength.
|
|
65
|
-
Style/GuardClause:
|
|
66
|
-
Exclude:
|
|
67
|
-
- 'lib/act_as_api_client/clients/authorize_net_webhooks_client.rb'
|
|
53
|
+
- "spec/act_as_api_client/clients/github_client/find_by_spec.rb"
|
|
68
54
|
|
|
69
55
|
# Offense count: 4
|
|
70
56
|
# Cop supports --auto-correct.
|
|
@@ -72,5 +58,5 @@ Style/GuardClause:
|
|
|
72
58
|
# URISchemes: http, https
|
|
73
59
|
Layout/LineLength:
|
|
74
60
|
Exclude:
|
|
75
|
-
-
|
|
76
|
-
-
|
|
61
|
+
- "lib/act_as_api_client/clients/github_repositories_client.rb"
|
|
62
|
+
- "spec/support/vcr_setup.rb"
|
data/Dockerfile
ADDED
data/Gemfile
CHANGED
|
@@ -4,11 +4,3 @@ source "https://rubygems.org"
|
|
|
4
4
|
|
|
5
5
|
# Specify your gem's dependencies in act_as_api_client.gemspec
|
|
6
6
|
gemspec
|
|
7
|
-
|
|
8
|
-
gem "byebug", "~> 11.1"
|
|
9
|
-
gem "rake", "~> 13.0"
|
|
10
|
-
gem "rspec", "~> 3.0"
|
|
11
|
-
gem "rubocop", "~> 0.80"
|
|
12
|
-
gem "rubocop-rspec", require: false
|
|
13
|
-
gem "vcr", "~> 6.1"
|
|
14
|
-
gem "webmock", "~> 3.14"
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
act_as_api_client (
|
|
4
|
+
act_as_api_client (1.3.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
@@ -68,7 +68,4 @@ DEPENDENCIES
|
|
|
68
68
|
rubocop (~> 0.80)
|
|
69
69
|
rubocop-rspec
|
|
70
70
|
vcr (~> 6.1)
|
|
71
|
-
webmock (~> 3.14)
|
|
72
|
-
|
|
73
|
-
BUNDLED WITH
|
|
74
|
-
2.2.3
|
|
71
|
+
webmock (~> 3.14)
|
data/README.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# act_as_api_client
|
|
2
2
|
|
|
3
|
-
How to create api clients for your application? What is a better way to encapsualte interactions with third APIs? My answer is `act_as_api_client`.
|
|
3
|
+
How to create api clients for your application? What is a better way to encapsualte interactions with third party APIs? My answer is `act_as_api_client`.
|
|
4
4
|
|
|
5
5
|
Let's assume you have a typical Rails or any ruby application and want to play around with an API, Github for example. See the [Usage](https://github.com/Rukomoynikov/act_as_api_client#usage) section to find how to use existing preconfigured API's and encapsulate all logic inside `APIClient` classes.
|
|
6
6
|
|
|
7
|
-
_At the moment i experiment in order to make api clients behavior very similiar to `ActiveRecord` models, so out of the box most of the clients support these methods: find, where, delete, update, find_by, create, update_
|
|
8
|
-
|
|
9
7
|
## Installation
|
|
10
8
|
|
|
11
9
|
Add this line to your application's Gemfile:
|
|
@@ -25,14 +23,14 @@ Or install it yourself as:
|
|
|
25
23
|
## Usage
|
|
26
24
|
|
|
27
25
|
### Folder for clients:
|
|
28
|
-
Create a folder in your app for examples `api_clients
|
|
26
|
+
Create a folder in your app for examples `api_clients`. This will be the place where you will keep all servies responsible for communication with external HTTP APIs.
|
|
29
27
|
|
|
30
28
|
### Create API client class:
|
|
31
|
-
For example you
|
|
29
|
+
For example, you need to fetch and update Github repositories, then you class may have a form like this:
|
|
32
30
|
|
|
33
31
|
```ruby
|
|
34
32
|
class GithubClient < ApiClient
|
|
35
|
-
act_as_api_client for: :
|
|
33
|
+
act_as_api_client for: :github_repositories
|
|
36
34
|
end
|
|
37
35
|
```
|
|
38
36
|
|
|
@@ -40,9 +38,9 @@ In case you want to provide and use authorization token for Github:
|
|
|
40
38
|
|
|
41
39
|
```ruby
|
|
42
40
|
class GithubClient < ApiClient
|
|
43
|
-
act_as_api_client for: :
|
|
41
|
+
act_as_api_client for: :github_repositories,
|
|
44
42
|
with: {
|
|
45
|
-
token: <your_token>
|
|
43
|
+
token: <your_token> # ENV variable of secret
|
|
46
44
|
}
|
|
47
45
|
end
|
|
48
46
|
```
|
data/act_as_api_client.gemspec
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "lib/act_as_api_client/version"
|
|
4
|
-
|
|
5
3
|
Gem::Specification.new do |spec|
|
|
6
4
|
spec.name = "act_as_api_client"
|
|
7
|
-
spec.version =
|
|
5
|
+
spec.version = "1.3.0"
|
|
8
6
|
spec.authors = ["Max Rukomoynikov"]
|
|
9
7
|
spec.email = ["rukomoynikov@gmail.com"]
|
|
10
8
|
|
|
@@ -12,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
|
12
10
|
spec.description = "Helps you to build reliable API clients in a minute. Just add act_as_api_client to your classes"
|
|
13
11
|
spec.homepage = "https://rubygems.org/gems/act_as_api_client"
|
|
14
12
|
spec.license = "MIT"
|
|
15
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
|
13
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
|
|
16
14
|
|
|
17
15
|
spec.metadata = {
|
|
18
16
|
"source_code_uri" => "https://github.com/Rukomoynikov/act_as_api_client",
|
|
@@ -29,6 +27,13 @@ Gem::Specification.new do |spec|
|
|
|
29
27
|
spec.require_paths = ["lib"]
|
|
30
28
|
|
|
31
29
|
# Uncomment to register a new dependency of your gem
|
|
30
|
+
spec.add_development_dependency "byebug", "~> 11.1"
|
|
31
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
|
32
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
|
33
|
+
spec.add_development_dependency "rubocop", "~> 0.80"
|
|
34
|
+
spec.add_development_dependency "rubocop-rspec"
|
|
35
|
+
spec.add_development_dependency "vcr", "~> 6.1"
|
|
36
|
+
spec.add_development_dependency "webmock", "~> 3.14"
|
|
32
37
|
|
|
33
38
|
# For more information and examples about making a new gem, checkout our
|
|
34
39
|
# guide at: https://bundler.io/guides/creating_gem.html
|
data/demo.rb
CHANGED
data/docker-compose.yml
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Run it with `ruby anthropic_playground.rb`
|
|
4
|
+
# See Anthropic development API documentation on https://docs.anthropic.com/en/api/messages
|
|
5
|
+
|
|
6
|
+
require "bundler/inline"
|
|
7
|
+
|
|
8
|
+
gemfile(true) do
|
|
9
|
+
source "https://rubygems.org"
|
|
10
|
+
|
|
11
|
+
gem "act_as_api_client", path: "../"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
require "act_as_api_client"
|
|
15
|
+
|
|
16
|
+
class AnthropicClient < ApiClient
|
|
17
|
+
act_as_api_client for: %i[anthropic messages],
|
|
18
|
+
with: { x_api_key: ENV["ANTHROPIC_API_KEY"] }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
anthropic_client = AnthropicClient.new
|
|
22
|
+
|
|
23
|
+
pp anthropic_client.create(
|
|
24
|
+
model: "claude-3-5-sonnet-20241022",
|
|
25
|
+
messages: [
|
|
26
|
+
{ "role": "user", "content": "Hello there." },
|
|
27
|
+
{ "role": "assistant", "content": "Hi, I'm Claude. How can I help you?" },
|
|
28
|
+
{ "role": "user", "content": "Can you explain LLMs in plain English?" }
|
|
29
|
+
],
|
|
30
|
+
max_tokens: 1024
|
|
31
|
+
)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Run it with `ruby github_repositories.rb`
|
|
4
|
+
|
|
5
|
+
require "bundler/inline"
|
|
6
|
+
|
|
7
|
+
gemfile(true) do
|
|
8
|
+
source "https://rubygems.org"
|
|
9
|
+
|
|
10
|
+
gem "act_as_api_client", path: "./"
|
|
11
|
+
gem "tabled"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
require "act_as_api_client"
|
|
15
|
+
|
|
16
|
+
class GithubApiClient < ApiClient
|
|
17
|
+
act_as_api_client for: :github_repositories
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
github_api_client = GithubApiClient.new
|
|
21
|
+
pp github_api_client.find("Rukomoynikov/tabled")
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActAsApiClient
|
|
4
|
+
class ClientLoader
|
|
5
|
+
attr_reader :client_for
|
|
6
|
+
|
|
7
|
+
def initialize(client_for:)
|
|
8
|
+
@client_for = client_for
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def class_name
|
|
12
|
+
case client_for.class.to_s
|
|
13
|
+
when "String", "Symbol"
|
|
14
|
+
"#{convert_underscore_to_camelcase(client_for)}Client"
|
|
15
|
+
when "Array"
|
|
16
|
+
client_for
|
|
17
|
+
.map { |item| convert_underscore_to_camelcase(item) }
|
|
18
|
+
.join("::")
|
|
19
|
+
.concat("Client")
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def path
|
|
24
|
+
case client_for.class.to_s
|
|
25
|
+
when "String", "Symbol"
|
|
26
|
+
File.expand_path("clients/#{client_for}_client", File.dirname(__FILE__))
|
|
27
|
+
when "Array"
|
|
28
|
+
client_path = client_for.join("/")
|
|
29
|
+
|
|
30
|
+
File.expand_path("clients/#{client_path}_client", File.dirname(__FILE__))
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
# Converting from authorize_net_webhooks_client to AuthorizeNetWebhooksClient
|
|
37
|
+
#
|
|
38
|
+
# @param value [String] string with underscores
|
|
39
|
+
# @return [String] transformed in camel case format string
|
|
40
|
+
def convert_underscore_to_camelcase(value)
|
|
41
|
+
value.to_s.capitalize.gsub(/_(.)/) do |s|
|
|
42
|
+
s.upcase.gsub("_", "")
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../http_client"
|
|
4
|
+
|
|
5
|
+
# See the documentation on https://docs.anthropic.com/en/api/messages
|
|
6
|
+
|
|
7
|
+
module ActAsApiClient
|
|
8
|
+
module Clients
|
|
9
|
+
module Anthropic
|
|
10
|
+
module MessagesClient
|
|
11
|
+
ANTHROPIC_VERSION = "2023-06-01"
|
|
12
|
+
BASE_URL = "https://api.anthropic.com/v1/messages"
|
|
13
|
+
|
|
14
|
+
include HttpClient
|
|
15
|
+
|
|
16
|
+
# Sends request to Anthropic API https://docs.anthropic.com/en/api/messages
|
|
17
|
+
#
|
|
18
|
+
# @param model [String] The model that will complete your prompt
|
|
19
|
+
# @param messages [Array] Input messages
|
|
20
|
+
# @param max_tokens [Integer] The maximum number of tokens to generate before stopping
|
|
21
|
+
# @param metadata [Hash] An object describing metadata about the request
|
|
22
|
+
# @param stop_sequences [Array<String>] Custom text sequences that will cause the model to stop generating
|
|
23
|
+
# @param stream [Boolean] Whether to incrementally stream the response using server-sent events
|
|
24
|
+
# @param system [String] System prompt
|
|
25
|
+
# @param temperature [Float] Amount of randomness injected into the response
|
|
26
|
+
# @param tool_choice [Hash] How the model should use the provided tools
|
|
27
|
+
# @param tools [Array<Hash>] Definitions of tools that the model may use
|
|
28
|
+
# @param top_k [Integer] Only sample from the top K options for each subsequent token
|
|
29
|
+
# @param top_p [Float] Use nucleus sampling
|
|
30
|
+
#
|
|
31
|
+
# @return [Hash] Response from Anthropic API
|
|
32
|
+
def create(**params)
|
|
33
|
+
post(BASE_URL, headers: headers, body: body(**params))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def headers
|
|
39
|
+
default = {
|
|
40
|
+
"Content-Type": "application/json",
|
|
41
|
+
"x-api-key" => options[:x_api_key],
|
|
42
|
+
"anthropic-version" => options[:anthropic_version] || ANTHROPIC_VERSION
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
default["anthropic-beta"] = options[:anthropic_beta] if options[:anthropic_beta]
|
|
46
|
+
|
|
47
|
+
default
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# rubocop:disable Metrics/ParameterLists, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
51
|
+
def body(model:,
|
|
52
|
+
messages:,
|
|
53
|
+
max_tokens:,
|
|
54
|
+
metadata: nil,
|
|
55
|
+
stop_sequences: nil,
|
|
56
|
+
stream: false,
|
|
57
|
+
system: nil,
|
|
58
|
+
temperature: 1.0,
|
|
59
|
+
tool_choice: nil,
|
|
60
|
+
tools: nil,
|
|
61
|
+
top_k: nil,
|
|
62
|
+
top_p: nil)
|
|
63
|
+
default = {
|
|
64
|
+
model: model,
|
|
65
|
+
messages: messages,
|
|
66
|
+
max_tokens: max_tokens,
|
|
67
|
+
stream: stream,
|
|
68
|
+
temperature: temperature
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
default[:metadata] = metadata if metadata
|
|
72
|
+
default[:stop_sequences] = stop_sequences if stop_sequences
|
|
73
|
+
default[:system] = system if system
|
|
74
|
+
default[:tool_choice] = tool_choice if tool_choice
|
|
75
|
+
default[:tools] = tools if tools
|
|
76
|
+
default[:top_k] = top_k if top_k
|
|
77
|
+
default[:top_p] = top_p if top_p
|
|
78
|
+
|
|
79
|
+
default
|
|
80
|
+
end
|
|
81
|
+
# rubocop:enable Metrics/ParameterLists, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -4,7 +4,7 @@ require_relative "http_client"
|
|
|
4
4
|
|
|
5
5
|
module ActAsApiClient
|
|
6
6
|
module Clients
|
|
7
|
-
module
|
|
7
|
+
module GithubRepositoriesClient
|
|
8
8
|
include HttpClient
|
|
9
9
|
|
|
10
10
|
# Searches Github for one repository by it's owner and repository names.
|
|
@@ -30,7 +30,7 @@ module ActAsApiClient
|
|
|
30
30
|
#
|
|
31
31
|
# @example Reverse a string
|
|
32
32
|
# class GithubClient < ApiClient
|
|
33
|
-
# act_as_api_client for: :
|
|
33
|
+
# act_as_api_client for: :github_repositories
|
|
34
34
|
# end
|
|
35
35
|
#
|
|
36
36
|
# GithubClient.new.where('rails')
|
|
@@ -50,7 +50,7 @@ module ActAsApiClient
|
|
|
50
50
|
#
|
|
51
51
|
# @example Reverse a string
|
|
52
52
|
# class GithubClient < ApiClient
|
|
53
|
-
# act_as_api_client for: :
|
|
53
|
+
# act_as_api_client for: :github_repositories
|
|
54
54
|
# end
|
|
55
55
|
#
|
|
56
56
|
# GithubClient.new.find_by(organization: 'rails')
|
|
@@ -3,19 +3,22 @@
|
|
|
3
3
|
require "net/http"
|
|
4
4
|
require "json"
|
|
5
5
|
|
|
6
|
+
require "act_as_api_client/errors/invalid_response_error"
|
|
7
|
+
require "act_as_api_client/errors/network_error"
|
|
8
|
+
|
|
6
9
|
module ActAsApiClient
|
|
7
10
|
module Clients
|
|
8
11
|
module HttpClient
|
|
9
12
|
private
|
|
10
13
|
|
|
11
|
-
def get(url, options
|
|
14
|
+
def get(url, **options)
|
|
12
15
|
# Request part
|
|
13
16
|
uri = URI(url)
|
|
14
17
|
uri.query = URI.encode_www_form(options.fetch(:params, {}))
|
|
15
18
|
|
|
16
19
|
request = Net::HTTP::Get.new(uri)
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
set_request_headers(headers: options.fetch(:headers, {}),
|
|
21
|
+
request: request)
|
|
19
22
|
|
|
20
23
|
# Response part
|
|
21
24
|
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
|
@@ -28,8 +31,31 @@ module ActAsApiClient
|
|
|
28
31
|
end
|
|
29
32
|
end
|
|
30
33
|
|
|
31
|
-
def post
|
|
32
|
-
#
|
|
34
|
+
def post(url, headers: {}, **options) # rubocop:disable Metrics/AbcSize
|
|
35
|
+
# Request part
|
|
36
|
+
uri = URI(url)
|
|
37
|
+
uri.query = URI.encode_www_form(options.fetch(:params, {}))
|
|
38
|
+
|
|
39
|
+
request = Net::HTTP::Post.new(uri)
|
|
40
|
+
|
|
41
|
+
request.body = options.fetch(:body, {}).to_json
|
|
42
|
+
set_request_headers(headers: headers, request: request)
|
|
43
|
+
|
|
44
|
+
# Response part
|
|
45
|
+
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
|
46
|
+
http.request(request)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
case response
|
|
50
|
+
when Net::HTTPSuccess
|
|
51
|
+
::JSON.parse(response.body)
|
|
52
|
+
when Net::HTTPNotFound, Net::HTTPUnprocessableEntity, Net::HTTPUnauthorized
|
|
53
|
+
::JSON.parse(response.body)
|
|
54
|
+
end
|
|
55
|
+
rescue Net::OpenTimeout, Net::ReadTimeout, SocketError => e
|
|
56
|
+
raise ActAsApiClient::NetworkError, "Network error occurred: #{e.message}"
|
|
57
|
+
rescue JSON::ParserError => e
|
|
58
|
+
raise ActAsApiClient::InvalidResponseError, "Invalid JSON response: #{e.message}"
|
|
33
59
|
end
|
|
34
60
|
|
|
35
61
|
def put
|
|
@@ -44,7 +70,7 @@ module ActAsApiClient
|
|
|
44
70
|
# HTTParty.delete
|
|
45
71
|
end
|
|
46
72
|
|
|
47
|
-
def
|
|
73
|
+
def set_request_headers(headers:, request:)
|
|
48
74
|
headers.each do |key, value|
|
|
49
75
|
request[key] = value
|
|
50
76
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActAsApiClient
|
|
4
|
+
module Errors
|
|
5
|
+
class NonExistingClient < StandardError
|
|
6
|
+
def initialize(requested_client:)
|
|
7
|
+
@requested_client = requested_client
|
|
8
|
+
super
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def message
|
|
12
|
+
"The requested client (#{@requested_client}) doesn't exist"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/act_as_api_client.rb
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative "act_as_api_client/version"
|
|
4
3
|
require_relative "act_as_api_client/base_api_methods"
|
|
4
|
+
require "act_as_api_client/errors/non_existing_client_error"
|
|
5
|
+
require "act_as_api_client/client_loader"
|
|
5
6
|
|
|
6
7
|
class ApiClient
|
|
7
8
|
include ActAsApiClient::BaseApiMethods
|
|
@@ -17,26 +18,16 @@ class ApiClient
|
|
|
17
18
|
def set_general_client(client_for:)
|
|
18
19
|
return if client_for.nil?
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
client_loader = ActAsApiClient::ClientLoader.new(client_for: client_for)
|
|
21
22
|
|
|
22
|
-
require(
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
require(client_loader.path)
|
|
24
|
+
include const_get("ActAsApiClient::Clients::#{client_loader.class_name}")
|
|
25
|
+
rescue LoadError
|
|
26
|
+
raise ActAsApiClient::Errors::NonExistingClient.new(requested_client: client_for)
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
def set_options(options:)
|
|
28
30
|
define_method("options") { options }
|
|
29
31
|
end
|
|
30
|
-
|
|
31
|
-
# Converting from authorize_net_webhooks_client to AuthorizeNetWebhooksClient
|
|
32
|
-
#
|
|
33
|
-
# @param value [String] string with underscores
|
|
34
|
-
#
|
|
35
|
-
# @return [String] transformed in camel case format string
|
|
36
|
-
def convert_underscore_to_camelcase(value)
|
|
37
|
-
value.to_s.capitalize.gsub(/_(.)/) do |s|
|
|
38
|
-
s.upcase.gsub("_", "")
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
32
|
end
|
|
42
33
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,113 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: act_as_api_client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Max Rukomoynikov
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
11
|
+
date: 2024-11-21 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: byebug
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '11.1'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '11.1'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '13.0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '13.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '3.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '3.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rubocop
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0.80'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.80'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rubocop-rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: vcr
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '6.1'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '6.1'
|
|
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.14'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '3.14'
|
|
13
111
|
description: Helps you to build reliable API clients in a minute. Just add act_as_api_client
|
|
14
112
|
to your classes
|
|
15
113
|
email:
|
|
@@ -18,12 +116,14 @@ executables: []
|
|
|
18
116
|
extensions: []
|
|
19
117
|
extra_rdoc_files: []
|
|
20
118
|
files:
|
|
119
|
+
- ".devcontainer.json"
|
|
21
120
|
- ".github/workflows/main.yml"
|
|
22
121
|
- ".gitignore"
|
|
23
122
|
- ".rspec"
|
|
24
123
|
- ".rubocop.yml"
|
|
25
124
|
- ".rubocop_todo.yml"
|
|
26
125
|
- CODE_OF_CONDUCT.md
|
|
126
|
+
- Dockerfile
|
|
27
127
|
- Gemfile
|
|
28
128
|
- Gemfile.lock
|
|
29
129
|
- LICENSE.txt
|
|
@@ -33,13 +133,18 @@ files:
|
|
|
33
133
|
- bin/console
|
|
34
134
|
- bin/setup
|
|
35
135
|
- demo.rb
|
|
136
|
+
- docker-compose.yml
|
|
137
|
+
- examples/anthropic_playground.rb
|
|
138
|
+
- examples/github_repositories.rb
|
|
36
139
|
- lib/act_as_api_client.rb
|
|
37
140
|
- lib/act_as_api_client/base_api_methods.rb
|
|
38
|
-
- lib/act_as_api_client/
|
|
39
|
-
- lib/act_as_api_client/clients/
|
|
40
|
-
- lib/act_as_api_client/clients/
|
|
141
|
+
- lib/act_as_api_client/client_loader.rb
|
|
142
|
+
- lib/act_as_api_client/clients/anthropic/messages_client.rb
|
|
143
|
+
- lib/act_as_api_client/clients/github_repositories_client.rb
|
|
41
144
|
- lib/act_as_api_client/clients/http_client.rb
|
|
42
|
-
- lib/act_as_api_client/
|
|
145
|
+
- lib/act_as_api_client/errors/invalid_response_error.rb
|
|
146
|
+
- lib/act_as_api_client/errors/network_error.rb
|
|
147
|
+
- lib/act_as_api_client/errors/non_existing_client_error.rb
|
|
43
148
|
homepage: https://rubygems.org/gems/act_as_api_client
|
|
44
149
|
licenses:
|
|
45
150
|
- MIT
|
|
@@ -48,7 +153,7 @@ metadata:
|
|
|
48
153
|
homepage_uri: https://rubygems.org/gems/act_as_api_client
|
|
49
154
|
documentation_uri: https://rubydoc.info/github/Rukomoynikov/act_as_api_client/main
|
|
50
155
|
bug_tracker_uri: https://github.com/Rukomoynikov/act_as_api_client/issues
|
|
51
|
-
post_install_message:
|
|
156
|
+
post_install_message:
|
|
52
157
|
rdoc_options: []
|
|
53
158
|
require_paths:
|
|
54
159
|
- lib
|
|
@@ -56,15 +161,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
56
161
|
requirements:
|
|
57
162
|
- - ">="
|
|
58
163
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: 2.
|
|
164
|
+
version: 2.6.0
|
|
60
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
166
|
requirements:
|
|
62
167
|
- - ">="
|
|
63
168
|
- !ruby/object:Gem::Version
|
|
64
169
|
version: '0'
|
|
65
170
|
requirements: []
|
|
66
|
-
rubygems_version: 3.
|
|
67
|
-
signing_key:
|
|
171
|
+
rubygems_version: 3.0.3.1
|
|
172
|
+
signing_key:
|
|
68
173
|
specification_version: 4
|
|
69
174
|
summary: Collection of predefined API clients
|
|
70
175
|
test_files: []
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "http_client"
|
|
4
|
-
require_relative "./authorize_net_webhooks_client"
|
|
5
|
-
require "base64"
|
|
6
|
-
|
|
7
|
-
module ActAsApiClient
|
|
8
|
-
module Clients
|
|
9
|
-
module AuthorizeNetNotificationsClient
|
|
10
|
-
include AuthorizeNetWebhooksClient
|
|
11
|
-
|
|
12
|
-
def where(parameters = {})
|
|
13
|
-
# GET https://apitest.authorize.net/rest/v1/notifications?from_date=2017-03-01&to_date=2017-03-13&offset=0&limit=100
|
|
14
|
-
# GET https://apitest.authorize.net/rest/v1/notifications?deliveryStatus=Failed
|
|
15
|
-
# [:from_date, :to_date, :offset, :limit, :deliveryStatus]
|
|
16
|
-
|
|
17
|
-
get("https://#{base_uri}/rest/v1/notifications/",
|
|
18
|
-
headers: { "Authorization" => auth },
|
|
19
|
-
params: parameters)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def find(uuid)
|
|
23
|
-
raise StandardError, "uuid is not provided" if uuid.empty?
|
|
24
|
-
|
|
25
|
-
get("https://#{base_uri}/rest/v1/notifications/#{uuid}",
|
|
26
|
-
headers: { "Authorization" => auth })
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative "http_client"
|
|
4
|
-
require "base64"
|
|
5
|
-
|
|
6
|
-
module ActAsApiClient
|
|
7
|
-
module Clients
|
|
8
|
-
module AuthorizeNetWebhooksClient
|
|
9
|
-
include HttpClient
|
|
10
|
-
DEFAULT_OPTIONS = {
|
|
11
|
-
mode: :production
|
|
12
|
-
}.freeze
|
|
13
|
-
|
|
14
|
-
def initialize
|
|
15
|
-
@options = DEFAULT_OPTIONS.merge(options)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def find(uuid)
|
|
19
|
-
raise StandardError, "uuid is not provided" if uuid.empty?
|
|
20
|
-
|
|
21
|
-
get("https://#{base_uri}/rest/v1/webhooks/#{uuid}",
|
|
22
|
-
headers: { "Authorization" => auth })
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
def base_uri
|
|
28
|
-
if @options[:mode] == :test
|
|
29
|
-
"apitest.authorize.net"
|
|
30
|
-
else
|
|
31
|
-
"authorize.net"
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def auth
|
|
36
|
-
if options[:payment_user]
|
|
37
|
-
"Basic #{Base64.strict_encode64("#{options[:payment_user]}:#{options[:payment_pass]}")}"
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|