tdl-client-ruby 0.19.3 → 0.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +3 -0
- data/README.md +11 -3
- data/lib/tdl.rb +6 -1
- data/lib/tdl/audit/console_audit_stream.rb +9 -0
- data/lib/tdl/previous_version.rb +1 -1
- data/lib/tdl/{abstractions → queue/abstractions}/processing_rule.rb +0 -0
- data/lib/tdl/{abstractions → queue/abstractions}/request.rb +0 -0
- data/lib/tdl/{abstractions → queue/abstractions}/response/fatal_error_response.rb +1 -1
- data/lib/tdl/{abstractions → queue/abstractions}/response/valid_response.rb +0 -0
- data/lib/tdl/{actions → queue/actions}/client_actions.rb +3 -3
- data/lib/tdl/{actions → queue/actions}/publish_action.rb +0 -0
- data/lib/tdl/{actions → queue/actions}/publish_and_stop_action.rb +0 -0
- data/lib/tdl/{actions → queue/actions}/stop_action.rb +0 -0
- data/lib/tdl/{client.rb → queue/client.rb} +4 -4
- data/lib/tdl/queue/implementation_runner_config.rb +59 -0
- data/lib/tdl/{processing_rules.rb → queue/processing_rules.rb} +4 -4
- data/lib/tdl/queue/queue_based_implementation_runner.rb +75 -0
- data/lib/tdl/queue/queue_based_implementation_runner_builder.rb +40 -0
- data/lib/tdl/{serialization → queue/serialization}/deserialization_exception.rb +0 -0
- data/lib/tdl/{serialization → queue/serialization}/json_rpc_serialization_provider.rb +2 -2
- data/lib/tdl/{transport → queue/transport}/remote_broker.rb +1 -1
- data/lib/tdl/runner/challenge_server_client.rb +91 -0
- data/lib/tdl/runner/challenge_session.rb +95 -0
- data/lib/tdl/runner/challenge_session_config.rb +74 -0
- data/lib/tdl/runner/recording_system.rb +62 -0
- data/lib/tdl/runner/round_management.rb +43 -0
- data/lib/tdl/runner/runner_action.rb +28 -0
- data/tdl-client-ruby.gemspec +1 -1
- data/tdl-client-ruby.iml +17 -19
- metadata +41 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfff7b61ca7c2da15456e4c6d38e552c08a452c1
|
4
|
+
data.tar.gz: 05214917528db407ae73ac41a5a056fc75c84e65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf5b14b4bb3a3eacdf104e8f594cde8b5414f1842101a23a547d8d799f6ee4d0cd1c3c659254d4bfe497bb11b3cf68df508fcc489466a17333d42a139e335d67
|
7
|
+
data.tar.gz: 23beacfb8721248e08d2a771e48e8ae77feb3e50611960a80c0d0c927d788ee1e62684d0ae7660c40b745c9847165f904f39cd5300c26dec2616f73aaab527aa
|
data/.gitignore
CHANGED
data/.gitmodules
CHANGED
data/README.md
CHANGED
@@ -26,11 +26,19 @@ All test require the ActiveMQ broker to be started.
|
|
26
26
|
The following commands are available for the broker.
|
27
27
|
|
28
28
|
```
|
29
|
-
./broker/activemq-wrapper start
|
30
|
-
|
31
|
-
|
29
|
+
python ./broker/activemq-wrapper.py start
|
30
|
+
python wiremock/wiremock-wrapper.py start 41375
|
31
|
+
python wiremock/wiremock-wrapper.py start 8222
|
32
32
|
```
|
33
33
|
|
34
34
|
Run tests with `rake features`.
|
35
35
|
To run a single scenario execute `cucumber path/to/file.feature:line_no`
|
36
36
|
Recommendation is to use the cucumber command instead of rake always outside of CI.
|
37
|
+
|
38
|
+
# Cleanup
|
39
|
+
|
40
|
+
Stop external dependencies
|
41
|
+
```
|
42
|
+
python ./broker/activemq-wrapper.py stop
|
43
|
+
```
|
44
|
+
|
data/lib/tdl.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
require 'tdl/client'
|
1
|
+
require 'tdl/queue/client'
|
2
|
+
require 'tdl/queue/implementation_runner_config'
|
3
|
+
require 'tdl/queue/queue_based_implementation_runner'
|
4
|
+
require 'tdl/queue/queue_based_implementation_runner_builder'
|
5
|
+
require 'tdl/runner/challenge_session'
|
6
|
+
require 'tdl/runner/challenge_session_config'
|
2
7
|
|
3
8
|
module TDL
|
4
9
|
end
|
data/lib/tdl/previous_version.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'tdl/actions/publish_action'
|
2
|
-
require 'tdl/actions/stop_action'
|
3
|
-
require 'tdl/actions/publish_and_stop_action'
|
1
|
+
require 'tdl/queue/actions/publish_action'
|
2
|
+
require 'tdl/queue/actions/stop_action'
|
3
|
+
require 'tdl/queue/actions/publish_and_stop_action'
|
4
4
|
|
5
5
|
module TDL
|
6
6
|
module ClientActions
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'stomp'
|
2
2
|
require 'logging'
|
3
3
|
|
4
|
-
require 'tdl/transport/remote_broker'
|
5
|
-
require 'tdl/processing_rules'
|
6
|
-
require 'tdl/actions/stop_action'
|
4
|
+
require 'tdl/queue/transport/remote_broker'
|
5
|
+
require 'tdl/queue/processing_rules'
|
6
|
+
require 'tdl/queue/actions/stop_action'
|
7
7
|
|
8
|
-
require 'tdl/serialization/json_rpc_serialization_provider'
|
8
|
+
require 'tdl/queue/serialization/json_rpc_serialization_provider'
|
9
9
|
|
10
10
|
module TDL
|
11
11
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'tdl/audit/console_audit_stream'
|
2
|
+
|
3
|
+
module TDL
|
4
|
+
|
5
|
+
class ImplementationRunnerConfig
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@port = 61616
|
9
|
+
@time_to_wait_for_requests = 500
|
10
|
+
@audit_stream = ConsoleAuditStream.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_hostname(hostname)
|
14
|
+
@hostname = hostname
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_port(port)
|
19
|
+
@port = port
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_unique_id(unique_id)
|
24
|
+
@unique_id = unique_id
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_time_to_wait_for_requests(time_to_wait_for_requests)
|
29
|
+
@time_to_wait_for_requests = time_to_wait_for_requests
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_audit_stream(audit_stream)
|
34
|
+
@set_audit_stream = audit_stream
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_hostname
|
39
|
+
@hostname
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_port
|
43
|
+
@port
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_unique_id
|
47
|
+
@unique_id
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_time_to_wait_for_requests
|
51
|
+
@time_to_wait_for_requests
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_audit_stream
|
55
|
+
@audit_stream
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'tdl/abstractions/processing_rule'
|
2
|
-
require 'tdl/abstractions/response/fatal_error_response'
|
3
|
-
require 'tdl/abstractions/response/valid_response'
|
4
|
-
require 'tdl/actions/client_actions'
|
1
|
+
require 'tdl/queue/abstractions/processing_rule'
|
2
|
+
require 'tdl/queue/abstractions/response/fatal_error_response'
|
3
|
+
require 'tdl/queue/abstractions/response/valid_response'
|
4
|
+
require 'tdl/queue/actions/client_actions'
|
5
5
|
|
6
6
|
module TDL
|
7
7
|
class ProcessingRules
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'logging'
|
2
|
+
|
3
|
+
require 'tdl/queue/processing_rules'
|
4
|
+
|
5
|
+
module TDL
|
6
|
+
class QueueBasedImplementationRunner
|
7
|
+
|
8
|
+
def initialize(config, deploy_processing_rules)
|
9
|
+
@config = config
|
10
|
+
@deploy_processing_rules = deploy_processing_rules
|
11
|
+
@logger = Logging.logger[self]
|
12
|
+
@total_processing_time = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
time1 = Time.now.to_f
|
17
|
+
begin
|
18
|
+
@logger.info 'Starting client'
|
19
|
+
remote_broker = RemoteBroker.new(
|
20
|
+
@config.get_hostname,
|
21
|
+
@config.get_port,
|
22
|
+
@config.get_unique_id,
|
23
|
+
@config.get_time_to_wait_for_requests)
|
24
|
+
remote_broker.subscribe(ApplyProcessingRules.new(@deploy_processing_rules))
|
25
|
+
@logger.info 'Waiting for requests.'
|
26
|
+
remote_broker.join
|
27
|
+
@logger.info 'Stopping client'
|
28
|
+
|
29
|
+
rescue Exception => e
|
30
|
+
# raise e if ENV['TDL_ENV'] == 'test'
|
31
|
+
@logger.error "There was a problem processing messages. #{e.message}"
|
32
|
+
@logger.error e.backtrace.join("\n")
|
33
|
+
end
|
34
|
+
|
35
|
+
time2 = Time.now.to_f
|
36
|
+
@total_processing_time = (time2 - time1) * 1000.00
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_request_timeout_millis
|
40
|
+
@config.get_time_to_wait_for_requests
|
41
|
+
end
|
42
|
+
|
43
|
+
def total_processing_time
|
44
|
+
@total_processing_time
|
45
|
+
end
|
46
|
+
|
47
|
+
class ApplyProcessingRules
|
48
|
+
|
49
|
+
def initialize(processing_rules)
|
50
|
+
@processing_rules = processing_rules
|
51
|
+
@logger = Logging.logger[self]
|
52
|
+
@audit = AuditStream.new
|
53
|
+
end
|
54
|
+
|
55
|
+
def process_next_request_from(remote_broker, request)
|
56
|
+
@audit.start_line
|
57
|
+
@audit.log(request)
|
58
|
+
|
59
|
+
# Obtain response from user
|
60
|
+
response = @processing_rules.get_response_for(request)
|
61
|
+
@audit.log(response)
|
62
|
+
|
63
|
+
# Obtain action
|
64
|
+
client_action = response.client_action
|
65
|
+
|
66
|
+
# Act
|
67
|
+
client_action.after_response(remote_broker, request, response)
|
68
|
+
@audit.log(client_action)
|
69
|
+
@audit.end_line
|
70
|
+
client_action.prepare_for_next_request(remote_broker)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'tdl/queue/queue_based_implementation_runner'
|
2
|
+
require 'tdl/queue/actions/client_actions'
|
3
|
+
|
4
|
+
module TDL
|
5
|
+
|
6
|
+
class QueueBasedImplementationRunnerBuilder
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@deploy_processing_rules = create_deploy_processing_rules()
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_config(config)
|
13
|
+
@config = config
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_solution_for(method_name, user_implementation, action = ClientActions.publish)
|
18
|
+
@deploy_processing_rules
|
19
|
+
.on(method_name)
|
20
|
+
.call(user_implementation)
|
21
|
+
.then(action)
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def create
|
26
|
+
QueueBasedImplementationRunner.new(@config, @deploy_processing_rules)
|
27
|
+
end
|
28
|
+
|
29
|
+
private def create_deploy_processing_rules
|
30
|
+
deploy_processing_rules = ProcessingRules.new()
|
31
|
+
deploy_processing_rules
|
32
|
+
.on('display_description')
|
33
|
+
.call(-> (params) {'OK'})
|
34
|
+
.then(ClientActions.publish)
|
35
|
+
deploy_processing_rules
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
File without changes
|
@@ -0,0 +1,91 @@
|
|
1
|
+
class ChallengeServerClient
|
2
|
+
|
3
|
+
def initialize(hostname, port, journey_id, use_colours)
|
4
|
+
@base_url = "http://#{hostname}:#{port}"
|
5
|
+
@journey_id = journey_id
|
6
|
+
use_colours ? @accept_header = 'text/coloured' : @accept_header = 'text/not-coloured'
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_journey_progress
|
10
|
+
get('journeyProgress')
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_available_actions
|
14
|
+
get('availableActions')
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_round_description
|
18
|
+
get('roundDescription')
|
19
|
+
end
|
20
|
+
|
21
|
+
def send_action(action)
|
22
|
+
encoded_path = @journey_id.encode('utf-8')
|
23
|
+
url = "#{@base_url}/action/#{action}/#{encoded_path}"
|
24
|
+
response = Unirest.post(url, headers: {'Accept'=> @accept_header, 'Accept-Charset'=> 'UTF-8'})
|
25
|
+
ensure_status_ok(response)
|
26
|
+
response.body
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def get(name)
|
32
|
+
journey_id_utf8 = @journey_id.encode('utf-8')
|
33
|
+
url = "#{@base_url}/#{name}/#{journey_id_utf8}"
|
34
|
+
response = Unirest.get(url, headers: {'Accept'=> @accept_header, 'Accept-Charset'=> 'UTF-8'})
|
35
|
+
ensure_status_ok(response)
|
36
|
+
response.body
|
37
|
+
end
|
38
|
+
|
39
|
+
def ensure_status_ok(response)
|
40
|
+
if client_error?(response.code)
|
41
|
+
raise ClientErrorException, response.body
|
42
|
+
elsif server_error?(response.code)
|
43
|
+
raise ServerErrorException, response.body
|
44
|
+
elsif other_error_response?(response.code)
|
45
|
+
raise OtherCommunicationException, response.body
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def client_error?(response_status)
|
50
|
+
response_status >= 400 && response_status < 500
|
51
|
+
end
|
52
|
+
|
53
|
+
def server_error?(response_status)
|
54
|
+
response_status >= 500 && response_status < 600
|
55
|
+
end
|
56
|
+
|
57
|
+
def other_error_response?(response_status)
|
58
|
+
response_status < 200 || response_status > 300
|
59
|
+
end
|
60
|
+
|
61
|
+
class ClientErrorException < RuntimeError
|
62
|
+
# def initialise(message)
|
63
|
+
# @response_message = message
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# def get_response_message
|
67
|
+
# @response_message
|
68
|
+
# end
|
69
|
+
end
|
70
|
+
|
71
|
+
class ServerErrorException < RuntimeError
|
72
|
+
# def initialise(message)
|
73
|
+
# @response_message = message
|
74
|
+
# end
|
75
|
+
#
|
76
|
+
# def get_response_message
|
77
|
+
# @response_message
|
78
|
+
# end
|
79
|
+
end
|
80
|
+
|
81
|
+
class OtherCommunicationException < RuntimeError
|
82
|
+
# def initialise(message)
|
83
|
+
# @response_message = message
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# def get_response_message
|
87
|
+
# @response_message
|
88
|
+
# end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'tdl/runner/challenge_server_client'
|
2
|
+
require 'tdl/runner/round_management'
|
3
|
+
require 'tdl/runner/recording_system'
|
4
|
+
|
5
|
+
include RoundManagement
|
6
|
+
|
7
|
+
module TDL
|
8
|
+
|
9
|
+
class ChallengeSession
|
10
|
+
def self.for_runner(runner)
|
11
|
+
ChallengeSession.new(runner)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(runner)
|
15
|
+
@runner = runner
|
16
|
+
end
|
17
|
+
|
18
|
+
def with_config(config)
|
19
|
+
@config = config
|
20
|
+
@audit_stream = config.get_audit_stream
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def with_action_provider(callback)
|
25
|
+
@user_input_callback = callback
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def start
|
30
|
+
@recording_system = RecordingSystem.new(@config.get_recording_system_should_be_on)
|
31
|
+
|
32
|
+
unless @recording_system.is_recording_system_ok
|
33
|
+
@audit_stream.write_line 'Please run `record_screen_and_upload` before continuing.'
|
34
|
+
return
|
35
|
+
end
|
36
|
+
|
37
|
+
@audit_stream.write_line "Connecting to #{@config.get_hostname}"
|
38
|
+
run_app
|
39
|
+
end
|
40
|
+
|
41
|
+
def run_app
|
42
|
+
@challenge_server_client = ChallengeServerClient.new(
|
43
|
+
@config.get_hostname,
|
44
|
+
@config.get_port,
|
45
|
+
@config.get_journey_id,
|
46
|
+
@config.get_use_colours)
|
47
|
+
|
48
|
+
begin
|
49
|
+
should_continue = check_status_of_challenge
|
50
|
+
if should_continue
|
51
|
+
user_input = @user_input_callback.call
|
52
|
+
@audit_stream.write_line "Selected action is: #{user_input}"
|
53
|
+
round_description = execute_user_action(user_input)
|
54
|
+
RoundManagement.save_description(@recording_system, round_description, @audit_stream, @config.get_working_directory)
|
55
|
+
end
|
56
|
+
rescue ChallengeServerClient::ClientErrorException => e
|
57
|
+
@audit_stream.write_line e.message
|
58
|
+
rescue ChallengeServerClient::ServerErrorException => e
|
59
|
+
@audit_stream.write_line 'Server experienced an error. Try again in a few minutes.'
|
60
|
+
rescue ChallengeServerClient::OtherCommunicationException => e
|
61
|
+
@audit_stream.write_line 'Client threw an unexpected error. Try again.'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def check_status_of_challenge
|
66
|
+
@audit_stream = @config.get_audit_stream
|
67
|
+
|
68
|
+
journey_progress = @challenge_server_client.get_journey_progress
|
69
|
+
@audit_stream.write_line(journey_progress)
|
70
|
+
|
71
|
+
available_actions = @challenge_server_client.get_available_actions
|
72
|
+
@audit_stream.write_line(available_actions)
|
73
|
+
|
74
|
+
not(available_actions.include?('No actions available.'))
|
75
|
+
end
|
76
|
+
|
77
|
+
def execute_user_action(user_input)
|
78
|
+
if user_input == 'deploy'
|
79
|
+
@runner.run
|
80
|
+
last_fetched_round = RoundManagement.get_last_fetched_round(@config.get_working_directory)
|
81
|
+
@recording_system.deploy_notify_event last_fetched_round
|
82
|
+
end
|
83
|
+
|
84
|
+
execute_action user_input
|
85
|
+
end
|
86
|
+
|
87
|
+
def execute_action(user_input)
|
88
|
+
action_feedback = @challenge_server_client.send_action user_input
|
89
|
+
@audit_stream.write_line action_feedback
|
90
|
+
@challenge_server_client.get_round_description
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module TDL
|
2
|
+
|
3
|
+
class ChallengeSessionConfig
|
4
|
+
def self.for_journey_id(journey_id)
|
5
|
+
ChallengeSessionConfig.new(journey_id)
|
6
|
+
end
|
7
|
+
|
8
|
+
def initialize(journey_id)
|
9
|
+
@port = 8222
|
10
|
+
@use_colours = true
|
11
|
+
@recording_system_should_be_on = true
|
12
|
+
@journey_id = journey_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def with_server_hostname(hostname)
|
16
|
+
@hostname = hostname
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def with_port(port)
|
21
|
+
@port = port
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def with_colours(use_colours)
|
26
|
+
@use_colours = use_colours
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def with_recording_system_should_be_on(recording_system_should_be_on)
|
31
|
+
@recording_system_should_be_on = recording_system_should_be_on
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def with_audit_stream(audit_stream)
|
36
|
+
@audit_stream = audit_stream
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def with_working_directory(working_directory)
|
41
|
+
@working_directory = working_directory
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_recording_system_should_be_on
|
46
|
+
@recording_system_should_be_on
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_hostname
|
50
|
+
@hostname
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_port
|
54
|
+
@port
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_journey_id
|
58
|
+
@journey_id
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_use_colours
|
62
|
+
@use_colours
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_audit_stream
|
66
|
+
@audit_stream
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_working_directory
|
70
|
+
@working_directory
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'unirest'
|
2
|
+
require 'tdl/runner/runner_action'
|
3
|
+
|
4
|
+
RECORDING_SYSTEM_ENDPOINT = 'http://localhost:41375'
|
5
|
+
|
6
|
+
class RecordingSystem
|
7
|
+
|
8
|
+
def initialize(recording_required)
|
9
|
+
@recording_required = recording_required
|
10
|
+
end
|
11
|
+
|
12
|
+
def is_recording_required
|
13
|
+
@recording_required
|
14
|
+
end
|
15
|
+
|
16
|
+
def is_recording_system_ok
|
17
|
+
return is_recording_required ? is_running : true
|
18
|
+
end
|
19
|
+
|
20
|
+
def is_running
|
21
|
+
begin
|
22
|
+
response = Unirest.get "#{RECORDING_SYSTEM_ENDPOINT}/status"
|
23
|
+
if response.code == 200 and response.body.start_with?('OK')
|
24
|
+
return true
|
25
|
+
end
|
26
|
+
rescue StandardError => e
|
27
|
+
puts "Could not reach recording system: #{e.message}"
|
28
|
+
end
|
29
|
+
false
|
30
|
+
end
|
31
|
+
|
32
|
+
def deploy_notify_event(last_fetched_round)
|
33
|
+
notify_event(last_fetched_round, RunnerActions.deploy_to_production.short_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def on_new_round(round_id, short_name)
|
37
|
+
notify_event(round_id, short_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def notify_event(last_fetched_round, short_name)
|
41
|
+
if not @recording_required
|
42
|
+
return
|
43
|
+
end
|
44
|
+
|
45
|
+
begin
|
46
|
+
response = Unirest.post "#{RECORDING_SYSTEM_ENDPOINT}/notify",
|
47
|
+
parameters:"#{last_fetched_round}/#{short_name}"
|
48
|
+
|
49
|
+
unless response.code == 200
|
50
|
+
puts "Recording system returned code: #{response.code}"
|
51
|
+
return
|
52
|
+
end
|
53
|
+
|
54
|
+
unless response.body.start_with?('ACK')
|
55
|
+
puts "Recording system returned body: #{response.body}"
|
56
|
+
end
|
57
|
+
rescue StandardError => e
|
58
|
+
puts "Could not reach recording system: #{e.message}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
CHALLENGES_FOLDER = 'challenges'
|
2
|
+
LAST_FETCHED_ROUND_PATH = "#{CHALLENGES_FOLDER}/XR.txt"
|
3
|
+
|
4
|
+
require 'tdl/runner/runner_action'
|
5
|
+
|
6
|
+
include RunnerActions
|
7
|
+
|
8
|
+
module RoundManagement
|
9
|
+
|
10
|
+
def save_description(listener, raw_description, audit_stream, working_directory)
|
11
|
+
return unless raw_description.include? "\n"
|
12
|
+
|
13
|
+
newline_index = raw_description.index("\n")
|
14
|
+
round_id = raw_description[0..newline_index - 1]
|
15
|
+
listener.on_new_round(round_id, RunnerActions.get_new_round_description.short_name) if round_id != get_last_fetched_round(working_directory)
|
16
|
+
|
17
|
+
display_and_save_description(round_id, raw_description, audit_stream, working_directory)
|
18
|
+
end
|
19
|
+
|
20
|
+
def display_and_save_description(label, description, audit_stream, working_directory)
|
21
|
+
Dir.mkdir(File.join(working_directory, CHALLENGES_FOLDER)) unless File.exists?(File.join(working_directory, CHALLENGES_FOLDER))
|
22
|
+
|
23
|
+
output_description = File.open("#{working_directory}/#{CHALLENGES_FOLDER}/#{label}.txt", 'w')
|
24
|
+
output_description << description
|
25
|
+
output_description.close
|
26
|
+
audit_stream.write_line("Challenge description saved to file: #{CHALLENGES_FOLDER}/#{label}.txt.")
|
27
|
+
|
28
|
+
output_last_round = File.open(File.join(working_directory, LAST_FETCHED_ROUND_PATH), 'w')
|
29
|
+
output_last_round << label
|
30
|
+
output_last_round.close
|
31
|
+
|
32
|
+
'OK'
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_last_fetched_round(working_directory)
|
36
|
+
begin
|
37
|
+
File.read(File.join(working_directory, LAST_FETCHED_ROUND_PATH))
|
38
|
+
rescue StandardError => _
|
39
|
+
'noRound'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'tdl/queue/actions/client_actions'
|
2
|
+
|
3
|
+
include TDL::ClientActions
|
4
|
+
|
5
|
+
class RunnerAction
|
6
|
+
attr_reader :short_name, :name, :client_action
|
7
|
+
|
8
|
+
def initialize(short_name, name, client_action)
|
9
|
+
@short_name = short_name
|
10
|
+
@name = name
|
11
|
+
@client_action = client_action
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
module RunnerActions
|
17
|
+
def get_new_round_description
|
18
|
+
RunnerAction.new('new', 'get_new_round_description', TDL::ClientActions.stop)
|
19
|
+
end
|
20
|
+
|
21
|
+
def deploy_to_production
|
22
|
+
RunnerAction.new('deploy', 'deploy_to_production', TDL::ClientActions.publish)
|
23
|
+
end
|
24
|
+
|
25
|
+
def all
|
26
|
+
[get_new_round_description, deploy_to_production]
|
27
|
+
end
|
28
|
+
end
|
data/tdl-client-ruby.gemspec
CHANGED
@@ -52,7 +52,7 @@ Gem::Specification.new do |spec|
|
|
52
52
|
|
53
53
|
spec.add_runtime_dependency 'stomp', '1.3.4'
|
54
54
|
spec.add_runtime_dependency 'logging', '2.0.0'
|
55
|
-
|
55
|
+
spec.add_runtime_dependency 'unirest', '1.1.2'
|
56
56
|
|
57
57
|
spec.add_development_dependency 'bundler', '~> 1.9'
|
58
58
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/tdl-client-ruby.iml
CHANGED
@@ -17,38 +17,36 @@
|
|
17
17
|
</content>
|
18
18
|
<orderEntry type="jdk" jdkName="rbenv: 2.2.2" jdkType="RUBY_SDK" />
|
19
19
|
<orderEntry type="sourceFolder" forTests="false" />
|
20
|
+
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.3.8, rbenv: 2.2.2) [gem]" level="application" />
|
20
21
|
<orderEntry type="library" scope="PROVIDED" name="ansi (v1.5.0, rbenv: 2.2.2) [gem]" level="application" />
|
21
|
-
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.
|
22
|
+
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.3, rbenv: 2.2.2) [gem]" level="application" />
|
22
23
|
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.12.5, rbenv: 2.2.2) [gem]" level="application" />
|
23
|
-
<orderEntry type="library" scope="PROVIDED" name="coveralls (v0.8.
|
24
|
+
<orderEntry type="library" scope="PROVIDED" name="coveralls (v0.8.9, rbenv: 2.2.2) [gem]" level="application" />
|
24
25
|
<orderEntry type="library" scope="PROVIDED" name="cucumber (v2.0.2, rbenv: 2.2.2) [gem]" level="application" />
|
25
26
|
<orderEntry type="library" scope="PROVIDED" name="cucumber-core (v1.2.0, rbenv: 2.2.2) [gem]" level="application" />
|
26
|
-
<orderEntry type="library" scope="PROVIDED" name="debase (v0.1.
|
27
|
-
<orderEntry type="library" scope="PROVIDED" name="debase-ruby_core_source (v0.
|
28
|
-
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.
|
27
|
+
<orderEntry type="library" scope="PROVIDED" name="debase (v0.1.8, rbenv: 2.2.2) [gem]" level="application" />
|
28
|
+
<orderEntry type="library" scope="PROVIDED" name="debase-ruby_core_source (v0.10.2, rbenv: 2.2.2) [gem]" level="application" />
|
29
|
+
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.3, rbenv: 2.2.2) [gem]" level="application" />
|
29
30
|
<orderEntry type="library" scope="PROVIDED" name="docile (v1.1.5, rbenv: 2.2.2) [gem]" level="application" />
|
30
|
-
<orderEntry type="library" scope="PROVIDED" name="domain_name (v0.5.24, rbenv: 2.2.2) [gem]" level="application" />
|
31
31
|
<orderEntry type="library" scope="PROVIDED" name="gherkin (v2.12.2, rbenv: 2.2.2) [gem]" level="application" />
|
32
|
-
<orderEntry type="library" scope="PROVIDED" name="http-cookie (v1.0.2, rbenv: 2.2.2) [gem]" level="application" />
|
33
32
|
<orderEntry type="library" scope="PROVIDED" name="json (v1.8.6, rbenv: 2.2.2) [gem]" level="application" />
|
34
33
|
<orderEntry type="library" scope="PROVIDED" name="little-plugger (v1.1.4, rbenv: 2.2.2) [gem]" level="application" />
|
35
34
|
<orderEntry type="library" scope="PROVIDED" name="logging (v2.0.0, rbenv: 2.2.2) [gem]" level="application" />
|
36
|
-
<orderEntry type="library" scope="PROVIDED" name="mime-types (
|
35
|
+
<orderEntry type="library" scope="PROVIDED" name="mime-types (v1.25.1, rbenv: 2.2.2) [gem]" level="application" />
|
37
36
|
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.4.1, rbenv: 2.2.2) [gem]" level="application" />
|
38
|
-
<orderEntry type="library" scope="PROVIDED" name="minitest-reporters (v1.
|
39
|
-
<orderEntry type="library" scope="PROVIDED" name="multi_json (v1.
|
37
|
+
<orderEntry type="library" scope="PROVIDED" name="minitest-reporters (v1.1.19, rbenv: 2.2.2) [gem]" level="application" />
|
38
|
+
<orderEntry type="library" scope="PROVIDED" name="multi_json (v1.13.1, rbenv: 2.2.2) [gem]" level="application" />
|
40
39
|
<orderEntry type="library" scope="PROVIDED" name="multi_test (v0.1.2, rbenv: 2.2.2) [gem]" level="application" />
|
41
|
-
<orderEntry type="library" scope="PROVIDED" name="
|
42
|
-
<orderEntry type="library" scope="PROVIDED" name="rest-client (v1.
|
43
|
-
<orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.
|
40
|
+
<orderEntry type="library" scope="PROVIDED" name="rake (v10.5.0, rbenv: 2.2.2) [gem]" level="application" />
|
41
|
+
<orderEntry type="library" scope="PROVIDED" name="rest-client (v1.6.9, rbenv: 2.2.2) [gem]" level="application" />
|
42
|
+
<orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.9.0, rbenv: 2.2.2) [gem]" level="application" />
|
44
43
|
<orderEntry type="library" scope="PROVIDED" name="simplecov (v0.10.0, rbenv: 2.2.2) [gem]" level="application" />
|
45
|
-
<orderEntry type="library" scope="PROVIDED" name="simplecov-html (v0.10.
|
44
|
+
<orderEntry type="library" scope="PROVIDED" name="simplecov-html (v0.10.2, rbenv: 2.2.2) [gem]" level="application" />
|
46
45
|
<orderEntry type="library" scope="PROVIDED" name="stomp (v1.3.4, rbenv: 2.2.2) [gem]" level="application" />
|
47
|
-
<orderEntry type="library" scope="PROVIDED" name="term-ansicolor (v1.
|
48
|
-
<orderEntry type="library" scope="PROVIDED" name="thor (v0.19.
|
49
|
-
<orderEntry type="library" scope="PROVIDED" name="tins (v1.
|
50
|
-
<orderEntry type="library" scope="PROVIDED" name="
|
51
|
-
<orderEntry type="library" scope="PROVIDED" name="unf_ext (v0.0.7.1, rbenv: 2.2.2) [gem]" level="application" />
|
46
|
+
<orderEntry type="library" scope="PROVIDED" name="term-ansicolor (v1.6.0, rbenv: 2.2.2) [gem]" level="application" />
|
47
|
+
<orderEntry type="library" scope="PROVIDED" name="thor (v0.19.4, rbenv: 2.2.2) [gem]" level="application" />
|
48
|
+
<orderEntry type="library" scope="PROVIDED" name="tins (v1.6.0, rbenv: 2.2.2) [gem]" level="application" />
|
49
|
+
<orderEntry type="library" scope="PROVIDED" name="unirest (v1.1.2, rbenv: 2.2.2) [gem]" level="application" />
|
52
50
|
</component>
|
53
51
|
<component name="RModuleSettingsStorage">
|
54
52
|
<LOAD_PATH number="1" string0="$MODULE_DIR$/../../tdl-warmup/ruby/lib" />
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tdl-client-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Ghionoiu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stomp
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: unirest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.2
|
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.2
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,21 +212,31 @@ files:
|
|
198
212
|
- Rakefile
|
199
213
|
- examples/add_numbers.rb
|
200
214
|
- lib/tdl.rb
|
201
|
-
- lib/tdl/
|
202
|
-
- lib/tdl/abstractions/request.rb
|
203
|
-
- lib/tdl/abstractions/response/fatal_error_response.rb
|
204
|
-
- lib/tdl/abstractions/response/valid_response.rb
|
205
|
-
- lib/tdl/actions/client_actions.rb
|
206
|
-
- lib/tdl/actions/publish_action.rb
|
207
|
-
- lib/tdl/actions/publish_and_stop_action.rb
|
208
|
-
- lib/tdl/actions/stop_action.rb
|
209
|
-
- lib/tdl/client.rb
|
215
|
+
- lib/tdl/audit/console_audit_stream.rb
|
210
216
|
- lib/tdl/previous_version.rb
|
211
|
-
- lib/tdl/
|
212
|
-
- lib/tdl/
|
213
|
-
- lib/tdl/
|
217
|
+
- lib/tdl/queue/abstractions/processing_rule.rb
|
218
|
+
- lib/tdl/queue/abstractions/request.rb
|
219
|
+
- lib/tdl/queue/abstractions/response/fatal_error_response.rb
|
220
|
+
- lib/tdl/queue/abstractions/response/valid_response.rb
|
221
|
+
- lib/tdl/queue/actions/client_actions.rb
|
222
|
+
- lib/tdl/queue/actions/publish_action.rb
|
223
|
+
- lib/tdl/queue/actions/publish_and_stop_action.rb
|
224
|
+
- lib/tdl/queue/actions/stop_action.rb
|
225
|
+
- lib/tdl/queue/client.rb
|
226
|
+
- lib/tdl/queue/implementation_runner_config.rb
|
227
|
+
- lib/tdl/queue/processing_rules.rb
|
228
|
+
- lib/tdl/queue/queue_based_implementation_runner.rb
|
229
|
+
- lib/tdl/queue/queue_based_implementation_runner_builder.rb
|
230
|
+
- lib/tdl/queue/serialization/deserialization_exception.rb
|
231
|
+
- lib/tdl/queue/serialization/json_rpc_serialization_provider.rb
|
232
|
+
- lib/tdl/queue/transport/remote_broker.rb
|
233
|
+
- lib/tdl/runner/challenge_server_client.rb
|
234
|
+
- lib/tdl/runner/challenge_session.rb
|
235
|
+
- lib/tdl/runner/challenge_session_config.rb
|
236
|
+
- lib/tdl/runner/recording_system.rb
|
237
|
+
- lib/tdl/runner/round_management.rb
|
238
|
+
- lib/tdl/runner/runner_action.rb
|
214
239
|
- lib/tdl/thread_timer.rb
|
215
|
-
- lib/tdl/transport/remote_broker.rb
|
216
240
|
- lib/tdl/util.rb
|
217
241
|
- release.sh
|
218
242
|
- tdl-client-ruby.gemspec
|
@@ -221,7 +245,7 @@ homepage: https://github.com/julianghionoiu/tdl-client-ruby
|
|
221
245
|
licenses:
|
222
246
|
- GPL-3.0
|
223
247
|
metadata:
|
224
|
-
previous_version: 0.19.
|
248
|
+
previous_version: 0.19.3
|
225
249
|
post_install_message:
|
226
250
|
rdoc_options: []
|
227
251
|
require_paths:
|
@@ -238,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
262
|
version: '0'
|
239
263
|
requirements: []
|
240
264
|
rubyforge_project:
|
241
|
-
rubygems_version: 2.6.
|
265
|
+
rubygems_version: 2.6.14
|
242
266
|
signing_key:
|
243
267
|
specification_version: 4
|
244
268
|
summary: A client to connect to the central kata server.
|