anyt 0.2.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/.gitignore +43 -0
- data/.rubocop.yml +68 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/MIT-LICENSE +20 -0
- data/Makefile +5 -0
- data/README.md +35 -0
- data/anyt.gemspec +41 -0
- data/bin/anyt +16 -0
- data/bin/console +7 -0
- data/bin/setup +8 -0
- data/circle.yml +14 -0
- data/lib/anyt.rb +14 -0
- data/lib/anyt/cli.rb +119 -0
- data/lib/anyt/client.rb +102 -0
- data/lib/anyt/command.rb +50 -0
- data/lib/anyt/config.rb +23 -0
- data/lib/anyt/dummy/application.rb +31 -0
- data/lib/anyt/dummy/config.ru +10 -0
- data/lib/anyt/ext/minitest.rb +119 -0
- data/lib/anyt/rpc.rb +40 -0
- data/lib/anyt/tests.rb +50 -0
- data/lib/anyt/tests/core/ping_test.rb +23 -0
- data/lib/anyt/tests/core/welcome_test.rb +10 -0
- data/lib/anyt/tests/request/connection_test.rb +52 -0
- data/lib/anyt/tests/streams/multiple_clients_test.rb +61 -0
- data/lib/anyt/tests/streams/multiple_test.rb +60 -0
- data/lib/anyt/tests/streams/single_test.rb +58 -0
- data/lib/anyt/tests/subscriptions/ack_test.rb +41 -0
- data/lib/anyt/tests/subscriptions/perform_test.rb +62 -0
- data/lib/anyt/tests/subscriptions/transmissions_test.rb +33 -0
- data/lib/anyt/utils.rb +3 -0
- data/lib/anyt/utils/async_helpers.rb +16 -0
- data/lib/anyt/version.rb +5 -0
- metadata +289 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
feature "Request" do
|
4
|
+
connect_handler('request_url') do
|
5
|
+
request.url =~ /test=request_url/
|
6
|
+
end
|
7
|
+
|
8
|
+
scenario %{
|
9
|
+
Url is set during connection
|
10
|
+
} do
|
11
|
+
client = build_client(qs: 'test=request_url')
|
12
|
+
assert_equal client.receive, "type" => "welcome"
|
13
|
+
end
|
14
|
+
|
15
|
+
connect_handler('cookies') do
|
16
|
+
cookies[:username] == 'john green'
|
17
|
+
end
|
18
|
+
|
19
|
+
scenario %{
|
20
|
+
Reject when required cookies are not set
|
21
|
+
} do
|
22
|
+
client = build_client(qs: 'test=cookies')
|
23
|
+
client.wait_for_close
|
24
|
+
assert client.closed?
|
25
|
+
end
|
26
|
+
|
27
|
+
scenario %{
|
28
|
+
Accepts when required cookies are set
|
29
|
+
} do
|
30
|
+
client = build_client(qs: 'test=cookies', cookies: 'username=john green')
|
31
|
+
assert_equal client.receive, "type" => "welcome"
|
32
|
+
end
|
33
|
+
|
34
|
+
connect_handler('headers') do
|
35
|
+
request.headers['X-API-TOKEN'] == 'abc'
|
36
|
+
end
|
37
|
+
|
38
|
+
scenario %{
|
39
|
+
Reject when required header is missing
|
40
|
+
} do
|
41
|
+
client = build_client(qs: 'test=headers')
|
42
|
+
client.wait_for_close
|
43
|
+
assert client.closed?
|
44
|
+
end
|
45
|
+
|
46
|
+
scenario %{
|
47
|
+
Accepts when required header is set
|
48
|
+
} do
|
49
|
+
client = build_client(qs: 'test=headers', headers: { 'x-api-token' => 'abc' })
|
50
|
+
assert_equal client.receive, "type" => "welcome"
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
feature "Streams with many clients" do
|
4
|
+
channel do
|
5
|
+
def subscribed
|
6
|
+
stream_from "a"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:client2) { build_client(ignore: %w[ping welcome]) }
|
11
|
+
|
12
|
+
before do
|
13
|
+
subscribe_request = { command: "subscribe", identifier: { channel: channel }.to_json }
|
14
|
+
|
15
|
+
client.send(subscribe_request)
|
16
|
+
client2.send(subscribe_request)
|
17
|
+
|
18
|
+
ack = {
|
19
|
+
"identifier" => { channel: channel }.to_json, "type" => "confirm_subscription"
|
20
|
+
}
|
21
|
+
|
22
|
+
assert_equal ack, client.receive
|
23
|
+
assert_equal ack, client2.receive
|
24
|
+
end
|
25
|
+
|
26
|
+
scenario %{
|
27
|
+
Multiple clients receive messages from stream
|
28
|
+
} do
|
29
|
+
ActionCable.server.broadcast("a", data: "X")
|
30
|
+
|
31
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "X" } }
|
32
|
+
|
33
|
+
assert_equal msg, client.receive
|
34
|
+
assert_equal msg, client2.receive
|
35
|
+
end
|
36
|
+
|
37
|
+
scenario %{
|
38
|
+
Client receive messages when another client removes subscription
|
39
|
+
} do
|
40
|
+
ActionCable.server.broadcast("a", data: "X")
|
41
|
+
|
42
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "X" } }
|
43
|
+
|
44
|
+
assert_equal msg, client.receive
|
45
|
+
assert_equal msg, client2.receive
|
46
|
+
|
47
|
+
unsubscribe_request = { command: "unsubscribe", identifier: { channel: channel }.to_json }
|
48
|
+
|
49
|
+
client.send(unsubscribe_request)
|
50
|
+
|
51
|
+
# ActionCable doesn't provide an unsubscription ack :(
|
52
|
+
sleep 1
|
53
|
+
|
54
|
+
ActionCable.server.broadcast("a", data: "Y")
|
55
|
+
|
56
|
+
msg2 = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "Y" } }
|
57
|
+
|
58
|
+
assert_equal msg2, client2.receive
|
59
|
+
assert_raises(Anyt::Client::TimeoutError) { client.receive(timeout: 0.5) }
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
feature "Multiple streams" do
|
4
|
+
channel do
|
5
|
+
def subscribed
|
6
|
+
stream_from "a"
|
7
|
+
stream_from "b"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
before do
|
12
|
+
subscribe_request = { command: "subscribe", identifier: { channel: channel }.to_json }
|
13
|
+
|
14
|
+
client.send(subscribe_request)
|
15
|
+
|
16
|
+
ack = {
|
17
|
+
"identifier" => { channel: channel }.to_json, "type" => "confirm_subscription"
|
18
|
+
}
|
19
|
+
|
20
|
+
assert_equal ack, client.receive
|
21
|
+
end
|
22
|
+
|
23
|
+
scenario %{
|
24
|
+
Client receives messages from both streams
|
25
|
+
} do
|
26
|
+
ActionCable.server.broadcast("a", data: "X")
|
27
|
+
|
28
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "X" } }
|
29
|
+
|
30
|
+
assert_equal msg, client.receive
|
31
|
+
|
32
|
+
ActionCable.server.broadcast("b", data: "Y")
|
33
|
+
|
34
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "Y" } }
|
35
|
+
|
36
|
+
assert_equal msg, client.receive
|
37
|
+
end
|
38
|
+
|
39
|
+
scenario %{
|
40
|
+
Client does not receive messages from any stream after removing subscription
|
41
|
+
} do
|
42
|
+
ActionCable.server.broadcast("a", data: "X")
|
43
|
+
|
44
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "X" } }
|
45
|
+
|
46
|
+
assert_equal msg, client.receive
|
47
|
+
|
48
|
+
unsubscribe_request = { command: "unsubscribe", identifier: { channel: channel }.to_json }
|
49
|
+
|
50
|
+
client.send(unsubscribe_request)
|
51
|
+
|
52
|
+
# ActionCable doesn't provide an unsubscription ack :(
|
53
|
+
sleep 1
|
54
|
+
|
55
|
+
ActionCable.server.broadcast("a", data: "Y")
|
56
|
+
ActionCable.server.broadcast("b", data: "Z")
|
57
|
+
|
58
|
+
assert_raises(Anyt::Client::TimeoutError) { client.receive(timeout: 0.5) }
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
feature "Single stream" do
|
4
|
+
channel do
|
5
|
+
def subscribed
|
6
|
+
stream_from "a"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
before do
|
11
|
+
subscribe_request = { command: "subscribe", identifier: { channel: channel }.to_json }
|
12
|
+
|
13
|
+
client.send(subscribe_request)
|
14
|
+
|
15
|
+
ack = {
|
16
|
+
"identifier" => { channel: channel }.to_json, "type" => "confirm_subscription"
|
17
|
+
}
|
18
|
+
|
19
|
+
assert_equal ack, client.receive
|
20
|
+
end
|
21
|
+
|
22
|
+
scenario %{
|
23
|
+
Client receives messages from the stream
|
24
|
+
} do
|
25
|
+
ActionCable.server.broadcast("a", data: "X")
|
26
|
+
|
27
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "X" } }
|
28
|
+
|
29
|
+
assert_equal msg, client.receive
|
30
|
+
|
31
|
+
ActionCable.server.broadcast("a", data: "Y")
|
32
|
+
|
33
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "Y" } }
|
34
|
+
|
35
|
+
assert_equal msg, client.receive
|
36
|
+
end
|
37
|
+
|
38
|
+
scenario %{
|
39
|
+
Client does not receive messages from the stream after removing subscription
|
40
|
+
} do
|
41
|
+
ActionCable.server.broadcast("a", data: "X")
|
42
|
+
|
43
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "data" => "X" } }
|
44
|
+
|
45
|
+
assert_equal msg, client.receive
|
46
|
+
|
47
|
+
unsubscribe_request = { command: "unsubscribe", identifier: { channel: channel }.to_json }
|
48
|
+
|
49
|
+
client.send(unsubscribe_request)
|
50
|
+
|
51
|
+
# ActionCable doesn't provide an unsubscription ack :(
|
52
|
+
sleep 1
|
53
|
+
|
54
|
+
ActionCable.server.broadcast("a", data: "Y")
|
55
|
+
|
56
|
+
assert_raises(Anyt::Client::TimeoutError) { client.receive(timeout: 0.5) }
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
feature "Subscription aknowledgement" do
|
4
|
+
channel
|
5
|
+
|
6
|
+
channel('rejector') do
|
7
|
+
def subscribed
|
8
|
+
reject
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
scenario %{
|
13
|
+
Client receives subscription confirmation
|
14
|
+
} do
|
15
|
+
|
16
|
+
subscribe_request = { command: "subscribe", identifier: { channel: channel }.to_json }
|
17
|
+
|
18
|
+
client.send(subscribe_request)
|
19
|
+
|
20
|
+
ack = {
|
21
|
+
"identifier" => { channel: channel }.to_json, "type" => "confirm_subscription"
|
22
|
+
}
|
23
|
+
|
24
|
+
assert_equal ack, client.receive
|
25
|
+
end
|
26
|
+
|
27
|
+
scenario %{
|
28
|
+
Client receives subscription rejection
|
29
|
+
} do
|
30
|
+
|
31
|
+
subscribe_request = { command: "subscribe", identifier: { channel: rejector_channel }.to_json }
|
32
|
+
|
33
|
+
client.send(subscribe_request)
|
34
|
+
|
35
|
+
ack = {
|
36
|
+
"identifier" => { channel: rejector_channel }.to_json, "type" => "reject_subscription"
|
37
|
+
}
|
38
|
+
|
39
|
+
assert_equal ack, client.receive
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "anyt/utils"
|
4
|
+
using Anyt::AsyncHelpers
|
5
|
+
|
6
|
+
feature "Subscription perform methods" do
|
7
|
+
channel do
|
8
|
+
def tick
|
9
|
+
transmit('tock')
|
10
|
+
end
|
11
|
+
|
12
|
+
def echo(data)
|
13
|
+
transmit(response: data['text'])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
before do
|
18
|
+
subscribe_request = { command: "subscribe", identifier: { channel: channel }.to_json }
|
19
|
+
|
20
|
+
client.send(subscribe_request)
|
21
|
+
|
22
|
+
ack = {
|
23
|
+
"identifier" => { channel: channel }.to_json, "type" => "confirm_subscription"
|
24
|
+
}
|
25
|
+
|
26
|
+
assert_equal ack, client.receive
|
27
|
+
end
|
28
|
+
|
29
|
+
scenario %{
|
30
|
+
Client perform actions without arguments
|
31
|
+
} do
|
32
|
+
|
33
|
+
perform_request = {
|
34
|
+
command: "message",
|
35
|
+
identifier: { channel: channel }.to_json,
|
36
|
+
"data" => { "action" => "tick" }.to_json
|
37
|
+
}
|
38
|
+
|
39
|
+
client.send(perform_request)
|
40
|
+
|
41
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => "tock" }
|
42
|
+
|
43
|
+
assert_equal msg, client.receive
|
44
|
+
end
|
45
|
+
|
46
|
+
scenario %{
|
47
|
+
Client perform actions with arguments
|
48
|
+
} do
|
49
|
+
|
50
|
+
perform_request = {
|
51
|
+
command: "message",
|
52
|
+
identifier: { channel: channel }.to_json,
|
53
|
+
"data" => { "action" => "echo", "text" => "hello" }.to_json
|
54
|
+
}
|
55
|
+
|
56
|
+
client.send(perform_request)
|
57
|
+
|
58
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => { "response" => "hello" } }
|
59
|
+
|
60
|
+
assert_equal msg, client.receive
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
feature "Subscription transmissions" do
|
4
|
+
channel do
|
5
|
+
def subscribed
|
6
|
+
transmit("hello")
|
7
|
+
transmit("world")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
scenario %{
|
12
|
+
Client receives transmissions from #subscribed callback
|
13
|
+
} do
|
14
|
+
|
15
|
+
subscribe_request = { command: "subscribe", identifier: { channel: channel }.to_json }
|
16
|
+
|
17
|
+
client.send(subscribe_request)
|
18
|
+
|
19
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => "hello" }
|
20
|
+
|
21
|
+
assert_equal msg, client.receive
|
22
|
+
|
23
|
+
msg = { "identifier" => { channel: channel }.to_json, "message" => "world" }
|
24
|
+
|
25
|
+
assert_equal msg, client.receive
|
26
|
+
|
27
|
+
ack = {
|
28
|
+
"identifier" => { channel: channel }.to_json, "type" => "confirm_subscription"
|
29
|
+
}
|
30
|
+
|
31
|
+
assert_equal ack, client.receive
|
32
|
+
end
|
33
|
+
end
|
data/lib/anyt/utils.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Anyt
|
4
|
+
module AsyncHelpers # :nodoc:
|
5
|
+
refine Object do
|
6
|
+
# Wait for block to return true of raise error
|
7
|
+
def wait(timeout = 1)
|
8
|
+
until yield
|
9
|
+
sleep 0.1
|
10
|
+
timeout -= 0.1
|
11
|
+
raise "Timeout error" unless timeout.positive?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/anyt/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,289 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: anyt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- palkan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-10-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 5.10.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 5.10.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest-reporters
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.1.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: anycable-rails
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.4.6
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.4.6
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: websocket
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.2.4
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.2.4
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: websocket-client-simple
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.3.0
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.3.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: concurrent-ruby
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.0.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.0.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: bundler
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rake
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '10.0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '10.0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.3.8
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 0.3.8
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rubocop
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0.50'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0.50'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: pry
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 0.10.4
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 0.10.4
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: puma
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '3.6'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '3.6'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: pry-byebug
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
description: Anycable conformance testing tool
|
224
|
+
email:
|
225
|
+
- dementiev.vm@gmail.com
|
226
|
+
executables:
|
227
|
+
- anyt
|
228
|
+
extensions: []
|
229
|
+
extra_rdoc_files: []
|
230
|
+
files:
|
231
|
+
- ".gitignore"
|
232
|
+
- ".rubocop.yml"
|
233
|
+
- Gemfile
|
234
|
+
- LICENSE.txt
|
235
|
+
- MIT-LICENSE
|
236
|
+
- Makefile
|
237
|
+
- README.md
|
238
|
+
- anyt.gemspec
|
239
|
+
- bin/anyt
|
240
|
+
- bin/console
|
241
|
+
- bin/setup
|
242
|
+
- circle.yml
|
243
|
+
- lib/anyt.rb
|
244
|
+
- lib/anyt/cli.rb
|
245
|
+
- lib/anyt/client.rb
|
246
|
+
- lib/anyt/command.rb
|
247
|
+
- lib/anyt/config.rb
|
248
|
+
- lib/anyt/dummy/application.rb
|
249
|
+
- lib/anyt/dummy/config.ru
|
250
|
+
- lib/anyt/ext/minitest.rb
|
251
|
+
- lib/anyt/rpc.rb
|
252
|
+
- lib/anyt/tests.rb
|
253
|
+
- lib/anyt/tests/core/ping_test.rb
|
254
|
+
- lib/anyt/tests/core/welcome_test.rb
|
255
|
+
- lib/anyt/tests/request/connection_test.rb
|
256
|
+
- lib/anyt/tests/streams/multiple_clients_test.rb
|
257
|
+
- lib/anyt/tests/streams/multiple_test.rb
|
258
|
+
- lib/anyt/tests/streams/single_test.rb
|
259
|
+
- lib/anyt/tests/subscriptions/ack_test.rb
|
260
|
+
- lib/anyt/tests/subscriptions/perform_test.rb
|
261
|
+
- lib/anyt/tests/subscriptions/transmissions_test.rb
|
262
|
+
- lib/anyt/utils.rb
|
263
|
+
- lib/anyt/utils/async_helpers.rb
|
264
|
+
- lib/anyt/version.rb
|
265
|
+
homepage: http://github.com/anycable/anyt
|
266
|
+
licenses:
|
267
|
+
- MIT
|
268
|
+
metadata: {}
|
269
|
+
post_install_message:
|
270
|
+
rdoc_options: []
|
271
|
+
require_paths:
|
272
|
+
- lib
|
273
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
274
|
+
requirements:
|
275
|
+
- - ">="
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: '0'
|
278
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
279
|
+
requirements:
|
280
|
+
- - ">="
|
281
|
+
- !ruby/object:Gem::Version
|
282
|
+
version: '0'
|
283
|
+
requirements: []
|
284
|
+
rubyforge_project:
|
285
|
+
rubygems_version: 2.6.13
|
286
|
+
signing_key:
|
287
|
+
specification_version: 4
|
288
|
+
summary: Anycable conformance testing tool
|
289
|
+
test_files: []
|