handinger 0.11.0 → 0.12.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/CHANGELOG.md +8 -0
- data/README.md +1 -1
- data/lib/handinger/models/create_task.rb +1 -10
- data/lib/handinger/models/worker_retrieve_params.rb +7 -21
- data/lib/handinger/resources/tasks.rb +7 -7
- data/lib/handinger/resources/workers.rb +5 -6
- data/lib/handinger/version.rb +1 -1
- data/rbi/handinger/models/create_task.rbi +0 -13
- data/rbi/handinger/models/worker_retrieve_params.rbi +11 -43
- data/rbi/handinger/resources/tasks.rbi +6 -8
- data/rbi/handinger/resources/workers.rbi +6 -8
- data/sig/handinger/models/create_task.rbs +0 -7
- data/sig/handinger/models/worker_retrieve_params.rbs +5 -21
- data/sig/handinger/resources/tasks.rbs +0 -1
- data/sig/handinger/resources/workers.rbs +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cc7d330384a0ff37cee9f18ad697e410a8cb931def3834447aca9724aa3fe098
|
|
4
|
+
data.tar.gz: 4e5e2ee2d79931da8d93b8ce0c3108be614b06de4cd2ed3b7f9156c03489dcf6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a894986cbb06d5de67b840d8e9b1206f09ce32321bbad244e7c10af3eb1e62a3ed16c8f953a627b274dc15c659518cd66a1fb0b9284f87ad9b03c36ae7c2b455
|
|
7
|
+
data.tar.gz: '096df7c53e269b14d163abe84d359260255453556a8af6ba8da4077cdbd7656973853ca96cc76437f61868f9e29a389ee752941f75e7672201dc02b4af7397ed'
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.12.0 (2026-06-03)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.11.0...v0.12.0](https://github.com/ramensoft/handinger-ruby/compare/v0.11.0...v0.12.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* Refactor task chat to use WebSocket agent connection ([64008fb](https://github.com/ramensoft/handinger-ruby/commit/64008fbcc2b333c98b8314db285f191bb37ed104))
|
|
10
|
+
|
|
3
11
|
## 0.11.0 (2026-05-15)
|
|
4
12
|
|
|
5
13
|
Full Changelog: [v0.10.1...v0.11.0](https://github.com/ramensoft/handinger-ruby/compare/v0.10.1...v0.11.0)
|
data/README.md
CHANGED
|
@@ -15,13 +15,6 @@ module Handinger
|
|
|
15
15
|
# @return [Symbol, Handinger::Models::CreateTask::Budget, nil]
|
|
16
16
|
optional :budget, enum: -> { Handinger::CreateTask::Budget }
|
|
17
17
|
|
|
18
|
-
# @!attribute stream
|
|
19
|
-
# Stream the response as server-sent events instead of waiting for the final
|
|
20
|
-
# payload.
|
|
21
|
-
#
|
|
22
|
-
# @return [Boolean, nil]
|
|
23
|
-
optional :stream, Handinger::Internal::Type::Boolean
|
|
24
|
-
|
|
25
18
|
# @!attribute task_id
|
|
26
19
|
# Optional client-provided task id. Reuse this id to add turns to an existing
|
|
27
20
|
# task.
|
|
@@ -36,7 +29,7 @@ module Handinger
|
|
|
36
29
|
# @return [String, nil]
|
|
37
30
|
optional :worker_id, String, api_name: :workerId
|
|
38
31
|
|
|
39
|
-
# @!method initialize(input:, budget: nil,
|
|
32
|
+
# @!method initialize(input:, budget: nil, task_id: nil, worker_id: nil)
|
|
40
33
|
# Some parameter documentations has been truncated, see
|
|
41
34
|
# {Handinger::Models::CreateTask} for more details.
|
|
42
35
|
#
|
|
@@ -44,8 +37,6 @@ module Handinger
|
|
|
44
37
|
#
|
|
45
38
|
# @param budget [Symbol, Handinger::Models::CreateTask::Budget] Compute budget the worker is allowed to spend on the task. Defaults to `standard
|
|
46
39
|
#
|
|
47
|
-
# @param stream [Boolean] Stream the response as server-sent events instead of waiting for the final paylo
|
|
48
|
-
#
|
|
49
40
|
# @param task_id [String] Optional client-provided task id. Reuse this id to add turns to an existing task
|
|
50
41
|
#
|
|
51
42
|
# @param worker_id [String] Worker id the task belongs to. If omitted, a new worker is created on-the-fly us
|
|
@@ -12,36 +12,22 @@ module Handinger
|
|
|
12
12
|
# @return [String]
|
|
13
13
|
required :worker_id, String
|
|
14
14
|
|
|
15
|
-
# @!attribute
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
# before closing.
|
|
15
|
+
# @!attribute task_id
|
|
16
|
+
# Return the worker state and messages for a specific task instead of the most
|
|
17
|
+
# recent one.
|
|
19
18
|
#
|
|
20
|
-
# @return [
|
|
21
|
-
optional :
|
|
19
|
+
# @return [String, nil]
|
|
20
|
+
optional :task_id, String
|
|
22
21
|
|
|
23
|
-
# @!method initialize(worker_id:,
|
|
22
|
+
# @!method initialize(worker_id:, task_id: nil, request_options: {})
|
|
24
23
|
# Some parameter documentations has been truncated, see
|
|
25
24
|
# {Handinger::Models::WorkerRetrieveParams} for more details.
|
|
26
25
|
#
|
|
27
26
|
# @param worker_id [String]
|
|
28
27
|
#
|
|
29
|
-
# @param
|
|
28
|
+
# @param task_id [String] Return the worker state and messages for a specific task instead of the most rec
|
|
30
29
|
#
|
|
31
30
|
# @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}]
|
|
32
|
-
|
|
33
|
-
# Set to "true" to receive a server-sent event stream that replays all stored
|
|
34
|
-
# messages and then continues with live chunks from the active task (if any)
|
|
35
|
-
# before closing.
|
|
36
|
-
module Stream
|
|
37
|
-
extend Handinger::Internal::Type::Enum
|
|
38
|
-
|
|
39
|
-
TRUE = :true
|
|
40
|
-
FALSE = :false
|
|
41
|
-
|
|
42
|
-
# @!method self.values
|
|
43
|
-
# @return [Array<Symbol>]
|
|
44
|
-
end
|
|
45
31
|
end
|
|
46
32
|
end
|
|
47
33
|
end
|
|
@@ -7,19 +7,19 @@ module Handinger
|
|
|
7
7
|
# Some parameter documentations has been truncated, see
|
|
8
8
|
# {Handinger::Models::TaskCreateParams} for more details.
|
|
9
9
|
#
|
|
10
|
-
# Run a new task against an existing worker
|
|
11
|
-
# add a follow-up turn instead of starting a fresh
|
|
12
|
-
# `multipart/form-data` to attach files; the bytes are bootstrapped
|
|
13
|
-
# worker's workspace before the task starts.
|
|
10
|
+
# Run a new task against an existing worker and wait for the result. Send a
|
|
11
|
+
# `taskId` of a prior task to add a follow-up turn instead of starting a fresh
|
|
12
|
+
# task. Send `multipart/form-data` to attach files; the bytes are bootstrapped
|
|
13
|
+
# into the worker's workspace before the task starts. The task runs to completion
|
|
14
|
+
# on the server even if the connection drops; subscribe to task webhooks for
|
|
15
|
+
# long-running tasks.
|
|
14
16
|
#
|
|
15
|
-
# @overload create(input:, budget: nil,
|
|
17
|
+
# @overload create(input:, budget: nil, task_id: nil, worker_id: nil, request_options: {})
|
|
16
18
|
#
|
|
17
19
|
# @param input [String]
|
|
18
20
|
#
|
|
19
21
|
# @param budget [Symbol, Handinger::Models::CreateTask::Budget] Compute budget the worker is allowed to spend on the task. Defaults to `standard
|
|
20
22
|
#
|
|
21
|
-
# @param stream [Boolean] Stream the response as server-sent events instead of waiting for the final paylo
|
|
22
|
-
#
|
|
23
23
|
# @param task_id [String] Optional client-provided task id. Reuse this id to add turns to an existing task
|
|
24
24
|
#
|
|
25
25
|
# @param worker_id [String] Worker id the task belongs to. If omitted, a new worker is created on-the-fly us
|
|
@@ -51,15 +51,14 @@ module Handinger
|
|
|
51
51
|
# Some parameter documentations has been truncated, see
|
|
52
52
|
# {Handinger::Models::WorkerRetrieveParams} for more details.
|
|
53
53
|
#
|
|
54
|
-
# Retrieve the current worker state and messages from its most recent task
|
|
55
|
-
#
|
|
56
|
-
# `stream=true`.
|
|
54
|
+
# Retrieve the current worker state and messages from its most recent task (or a
|
|
55
|
+
# specific task via `taskId`).
|
|
57
56
|
#
|
|
58
|
-
# @overload retrieve(worker_id,
|
|
57
|
+
# @overload retrieve(worker_id, task_id: nil, request_options: {})
|
|
59
58
|
#
|
|
60
59
|
# @param worker_id [String] Worker id returned by the create worker endpoint.
|
|
61
60
|
#
|
|
62
|
-
# @param
|
|
61
|
+
# @param task_id [String] Return the worker state and messages for a specific task instead of the most rec
|
|
63
62
|
#
|
|
64
63
|
# @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
|
|
65
64
|
#
|
|
@@ -72,7 +71,7 @@ module Handinger
|
|
|
72
71
|
@client.request(
|
|
73
72
|
method: :get,
|
|
74
73
|
path: ["api/workers/%1$s", worker_id],
|
|
75
|
-
query: query,
|
|
74
|
+
query: query.transform_keys(task_id: "taskId"),
|
|
76
75
|
model: Handinger::Worker,
|
|
77
76
|
options: options
|
|
78
77
|
)
|
data/lib/handinger/version.rb
CHANGED
|
@@ -19,14 +19,6 @@ module Handinger
|
|
|
19
19
|
sig { params(budget: Handinger::CreateTask::Budget::OrSymbol).void }
|
|
20
20
|
attr_writer :budget
|
|
21
21
|
|
|
22
|
-
# Stream the response as server-sent events instead of waiting for the final
|
|
23
|
-
# payload.
|
|
24
|
-
sig { returns(T.nilable(T::Boolean)) }
|
|
25
|
-
attr_reader :stream
|
|
26
|
-
|
|
27
|
-
sig { params(stream: T::Boolean).void }
|
|
28
|
-
attr_writer :stream
|
|
29
|
-
|
|
30
22
|
# Optional client-provided task id. Reuse this id to add turns to an existing
|
|
31
23
|
# task.
|
|
32
24
|
sig { returns(T.nilable(String)) }
|
|
@@ -47,7 +39,6 @@ module Handinger
|
|
|
47
39
|
params(
|
|
48
40
|
input: String,
|
|
49
41
|
budget: Handinger::CreateTask::Budget::OrSymbol,
|
|
50
|
-
stream: T::Boolean,
|
|
51
42
|
task_id: String,
|
|
52
43
|
worker_id: String
|
|
53
44
|
).returns(T.attached_class)
|
|
@@ -57,9 +48,6 @@ module Handinger
|
|
|
57
48
|
# Compute budget the worker is allowed to spend on the task. Defaults to
|
|
58
49
|
# `standard`.
|
|
59
50
|
budget: nil,
|
|
60
|
-
# Stream the response as server-sent events instead of waiting for the final
|
|
61
|
-
# payload.
|
|
62
|
-
stream: nil,
|
|
63
51
|
# Optional client-provided task id. Reuse this id to add turns to an existing
|
|
64
52
|
# task.
|
|
65
53
|
task_id: nil,
|
|
@@ -74,7 +62,6 @@ module Handinger
|
|
|
74
62
|
{
|
|
75
63
|
input: String,
|
|
76
64
|
budget: Handinger::CreateTask::Budget::OrSymbol,
|
|
77
|
-
stream: T::Boolean,
|
|
78
65
|
task_id: String,
|
|
79
66
|
worker_id: String
|
|
80
67
|
}
|
|
@@ -14,32 +14,26 @@ module Handinger
|
|
|
14
14
|
sig { returns(String) }
|
|
15
15
|
attr_accessor :worker_id
|
|
16
16
|
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
returns(T.nilable(Handinger::WorkerRetrieveParams::Stream::OrSymbol))
|
|
22
|
-
end
|
|
23
|
-
attr_reader :stream
|
|
17
|
+
# Return the worker state and messages for a specific task instead of the most
|
|
18
|
+
# recent one.
|
|
19
|
+
sig { returns(T.nilable(String)) }
|
|
20
|
+
attr_reader :task_id
|
|
24
21
|
|
|
25
|
-
sig
|
|
26
|
-
|
|
27
|
-
end
|
|
28
|
-
attr_writer :stream
|
|
22
|
+
sig { params(task_id: String).void }
|
|
23
|
+
attr_writer :task_id
|
|
29
24
|
|
|
30
25
|
sig do
|
|
31
26
|
params(
|
|
32
27
|
worker_id: String,
|
|
33
|
-
|
|
28
|
+
task_id: String,
|
|
34
29
|
request_options: Handinger::RequestOptions::OrHash
|
|
35
30
|
).returns(T.attached_class)
|
|
36
31
|
end
|
|
37
32
|
def self.new(
|
|
38
33
|
worker_id:,
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
stream: nil,
|
|
34
|
+
# Return the worker state and messages for a specific task instead of the most
|
|
35
|
+
# recent one.
|
|
36
|
+
task_id: nil,
|
|
43
37
|
request_options: {}
|
|
44
38
|
)
|
|
45
39
|
end
|
|
@@ -48,39 +42,13 @@ module Handinger
|
|
|
48
42
|
override.returns(
|
|
49
43
|
{
|
|
50
44
|
worker_id: String,
|
|
51
|
-
|
|
45
|
+
task_id: String,
|
|
52
46
|
request_options: Handinger::RequestOptions
|
|
53
47
|
}
|
|
54
48
|
)
|
|
55
49
|
end
|
|
56
50
|
def to_hash
|
|
57
51
|
end
|
|
58
|
-
|
|
59
|
-
# Set to "true" to receive a server-sent event stream that replays all stored
|
|
60
|
-
# messages and then continues with live chunks from the active task (if any)
|
|
61
|
-
# before closing.
|
|
62
|
-
module Stream
|
|
63
|
-
extend Handinger::Internal::Type::Enum
|
|
64
|
-
|
|
65
|
-
TaggedSymbol =
|
|
66
|
-
T.type_alias do
|
|
67
|
-
T.all(Symbol, Handinger::WorkerRetrieveParams::Stream)
|
|
68
|
-
end
|
|
69
|
-
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
70
|
-
|
|
71
|
-
TRUE =
|
|
72
|
-
T.let(:true, Handinger::WorkerRetrieveParams::Stream::TaggedSymbol)
|
|
73
|
-
FALSE =
|
|
74
|
-
T.let(:false, Handinger::WorkerRetrieveParams::Stream::TaggedSymbol)
|
|
75
|
-
|
|
76
|
-
sig do
|
|
77
|
-
override.returns(
|
|
78
|
-
T::Array[Handinger::WorkerRetrieveParams::Stream::TaggedSymbol]
|
|
79
|
-
)
|
|
80
|
-
end
|
|
81
|
-
def self.values
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
52
|
end
|
|
85
53
|
end
|
|
86
54
|
end
|
|
@@ -4,15 +4,16 @@ module Handinger
|
|
|
4
4
|
module Resources
|
|
5
5
|
# Run and inspect tasks against a worker.
|
|
6
6
|
class Tasks
|
|
7
|
-
# Run a new task against an existing worker
|
|
8
|
-
# add a follow-up turn instead of starting a fresh
|
|
9
|
-
# `multipart/form-data` to attach files; the bytes are bootstrapped
|
|
10
|
-
# worker's workspace before the task starts.
|
|
7
|
+
# Run a new task against an existing worker and wait for the result. Send a
|
|
8
|
+
# `taskId` of a prior task to add a follow-up turn instead of starting a fresh
|
|
9
|
+
# task. Send `multipart/form-data` to attach files; the bytes are bootstrapped
|
|
10
|
+
# into the worker's workspace before the task starts. The task runs to completion
|
|
11
|
+
# on the server even if the connection drops; subscribe to task webhooks for
|
|
12
|
+
# long-running tasks.
|
|
11
13
|
sig do
|
|
12
14
|
params(
|
|
13
15
|
input: String,
|
|
14
16
|
budget: Handinger::CreateTask::Budget::OrSymbol,
|
|
15
|
-
stream: T::Boolean,
|
|
16
17
|
task_id: String,
|
|
17
18
|
worker_id: String,
|
|
18
19
|
request_options: Handinger::RequestOptions::OrHash
|
|
@@ -23,9 +24,6 @@ module Handinger
|
|
|
23
24
|
# Compute budget the worker is allowed to spend on the task. Defaults to
|
|
24
25
|
# `standard`.
|
|
25
26
|
budget: nil,
|
|
26
|
-
# Stream the response as server-sent events instead of waiting for the final
|
|
27
|
-
# payload.
|
|
28
|
-
stream: nil,
|
|
29
27
|
# Optional client-provided task id. Reuse this id to add turns to an existing
|
|
30
28
|
# task.
|
|
31
29
|
task_id: nil,
|
|
@@ -47,23 +47,21 @@ module Handinger
|
|
|
47
47
|
)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
# Retrieve the current worker state and messages from its most recent task
|
|
51
|
-
#
|
|
52
|
-
# `stream=true`.
|
|
50
|
+
# Retrieve the current worker state and messages from its most recent task (or a
|
|
51
|
+
# specific task via `taskId`).
|
|
53
52
|
sig do
|
|
54
53
|
params(
|
|
55
54
|
worker_id: String,
|
|
56
|
-
|
|
55
|
+
task_id: String,
|
|
57
56
|
request_options: Handinger::RequestOptions::OrHash
|
|
58
57
|
).returns(Handinger::Worker)
|
|
59
58
|
end
|
|
60
59
|
def retrieve(
|
|
61
60
|
# Worker id returned by the create worker endpoint.
|
|
62
61
|
worker_id,
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
stream: nil,
|
|
62
|
+
# Return the worker state and messages for a specific task instead of the most
|
|
63
|
+
# recent one.
|
|
64
|
+
task_id: nil,
|
|
67
65
|
request_options: {}
|
|
68
66
|
)
|
|
69
67
|
end
|
|
@@ -4,7 +4,6 @@ module Handinger
|
|
|
4
4
|
{
|
|
5
5
|
input: String,
|
|
6
6
|
budget: Handinger::Models::CreateTask::budget,
|
|
7
|
-
stream: bool,
|
|
8
7
|
task_id: String,
|
|
9
8
|
worker_id: String
|
|
10
9
|
}
|
|
@@ -18,10 +17,6 @@ module Handinger
|
|
|
18
17
|
Handinger::Models::CreateTask::budget
|
|
19
18
|
) -> Handinger::Models::CreateTask::budget
|
|
20
19
|
|
|
21
|
-
attr_reader stream: bool?
|
|
22
|
-
|
|
23
|
-
def stream=: (bool) -> bool
|
|
24
|
-
|
|
25
20
|
attr_reader task_id: String?
|
|
26
21
|
|
|
27
22
|
def task_id=: (String) -> String
|
|
@@ -33,7 +28,6 @@ module Handinger
|
|
|
33
28
|
def initialize: (
|
|
34
29
|
input: String,
|
|
35
30
|
?budget: Handinger::Models::CreateTask::budget,
|
|
36
|
-
?stream: bool,
|
|
37
31
|
?task_id: String,
|
|
38
32
|
?worker_id: String
|
|
39
33
|
) -> void
|
|
@@ -41,7 +35,6 @@ module Handinger
|
|
|
41
35
|
def to_hash: -> {
|
|
42
36
|
input: String,
|
|
43
37
|
budget: Handinger::Models::CreateTask::budget,
|
|
44
|
-
stream: bool,
|
|
45
38
|
task_id: String,
|
|
46
39
|
worker_id: String
|
|
47
40
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
module Handinger
|
|
2
2
|
module Models
|
|
3
3
|
type worker_retrieve_params =
|
|
4
|
-
{
|
|
5
|
-
worker_id: String,
|
|
6
|
-
stream: Handinger::Models::WorkerRetrieveParams::stream
|
|
7
|
-
}
|
|
4
|
+
{ worker_id: String, task_id: String }
|
|
8
5
|
& Handinger::Internal::Type::request_parameters
|
|
9
6
|
|
|
10
7
|
class WorkerRetrieveParams < Handinger::Internal::Type::BaseModel
|
|
@@ -13,34 +10,21 @@ module Handinger
|
|
|
13
10
|
|
|
14
11
|
attr_accessor worker_id: String
|
|
15
12
|
|
|
16
|
-
attr_reader
|
|
13
|
+
attr_reader task_id: String?
|
|
17
14
|
|
|
18
|
-
def
|
|
19
|
-
Handinger::Models::WorkerRetrieveParams::stream
|
|
20
|
-
) -> Handinger::Models::WorkerRetrieveParams::stream
|
|
15
|
+
def task_id=: (String) -> String
|
|
21
16
|
|
|
22
17
|
def initialize: (
|
|
23
18
|
worker_id: String,
|
|
24
|
-
?
|
|
19
|
+
?task_id: String,
|
|
25
20
|
?request_options: Handinger::request_opts
|
|
26
21
|
) -> void
|
|
27
22
|
|
|
28
23
|
def to_hash: -> {
|
|
29
24
|
worker_id: String,
|
|
30
|
-
|
|
25
|
+
task_id: String,
|
|
31
26
|
request_options: Handinger::RequestOptions
|
|
32
27
|
}
|
|
33
|
-
|
|
34
|
-
type stream = :true | :false
|
|
35
|
-
|
|
36
|
-
module Stream
|
|
37
|
-
extend Handinger::Internal::Type::Enum
|
|
38
|
-
|
|
39
|
-
TRUE: :true
|
|
40
|
-
FALSE: :false
|
|
41
|
-
|
|
42
|
-
def self?.values: -> ::Array[Handinger::Models::WorkerRetrieveParams::stream]
|
|
43
|
-
end
|
|
44
28
|
end
|
|
45
29
|
end
|
|
46
30
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: handinger
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Handinger
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-06-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cgi
|