Add sample script and extracted common code

This commit is contained in:
Charles Care
2019-10-14 21:00:02 +01:00
parent 91ddf93357
commit 690afb4572
4 changed files with 116 additions and 48 deletions

40
bin/example.rb Normal file
View File

@@ -0,0 +1,40 @@
#!/usr/bin/env ruby
require_relative "./client"
pipeline = PipelineClient.new
puts "Sample for ruby:two-fer"
action = ARGV[0]
lang = "ruby"
exercise_slug = "two-fer"
solution_slug = "soln-demo"
source = ARGV[1] || "s3://exercism-iterations/production/iterations/1182520"
r = case action
when "test"
pipeline.test_run(lang, exercise_slug, solution_slug, source)
when "analyze"
pipeline.analyze(lang, exercise_slug, solution_slug, source)
when "represent"
pipeline.represent(lang, exercise_slug, solution_slug, source)
else
raise "Command #{action} unknown.\n Usage: ./example.rb test|analyze|represent [s3_url]"
end
pipeline.close_socket
puts " === Complete ==="
if r["logs"]
r["logs"].each do |log_line|
puts "+ #{log_line["cmd"]}"
puts log_line["stdout"]
puts log_line["stderr"]
end
end
puts r["result"]

View File

@@ -4,11 +4,13 @@ require_relative "./client"
pipeline = PipelineClient.new
# return
lang = ARGV[0] || "ruby"
lang = "ruby"
lang = ARGV[1] || "ruby"
r = pipeline.represent(lang, "two-fer", "soln-42", "s3://exercism-dev/iterations/fff07700-e1c3-402d-8937-823aeefb159f")
r = pipeline.represent(lang, "two-fer", "soln-42",
"s3://exercism-iterations/production/iterations/1182520")
# puts r
if r["logs"]
r["logs"].each do |log_line|

View File

@@ -1,6 +1,6 @@
module Pipeline::Rpc::Worker
class AnalyzeAction < WorkerAction
class AnalyzeAction < ContainerAction
attr_reader :reader, :return_address
@@ -14,52 +14,24 @@ module Pipeline::Rpc::Worker
Pipeline::Runtime::AnalysisRun.new(track_dir, exercise_slug, solution_slug)
end
def invoke
s3 = Aws::S3::Client.new(
credentials: parse_credentials(request["context"]),
region: "eu-west-1")
language_slug = request["track_slug"]
exercise_slug = request["exercise_slug"]
solution_slug = request["solution_slug"]
location = request["iteration_folder"]
container_version = request["container_version"]
unless environment.released?(language_slug, container_version)
return {
error: "Container #{language_slug}:#{container_version} isn't available"
}
end
analysis_run = setup(language_slug, container_version, exercise_slug, solution_slug)
analysis_run.prepare_iteration do |iteration_folder|
location_uri = URI(location)
bucket = location_uri.host
path = location_uri.path[1..]
params = {
def prepare_folder(iteration_folder)
location = @request["iteration_folder"]
location_uri = URI(location)
bucket = location_uri.host
path = location_uri.path[1..]
params = {
bucket: bucket,
prefix: "#{path}/",
}
resp = s3.list_objects(params)
resp.contents.each do |item|
key = item[:key]
filename = File.basename(key)
s3.get_object({
bucket: bucket,
prefix: "#{path}/",
}
resp = s3.list_objects(params)
resp.contents.each do |item|
key = item[:key]
filename = File.basename(key)
s3.get_object({
bucket: bucket,
key: key,
response_target: "#{iteration_folder}/#{filename}"
})
end
end
begin
result = analysis_run.analyze!
result["return_address"] = return_address
result['msg_type'] = 'response'
result
rescue => e
puts e
ensure
puts "DONE"
key: key,
response_target: "#{iteration_folder}/#{filename}"
})
end
end

View File

@@ -0,0 +1,54 @@
module Pipeline::Rpc::Worker
class ContainerAction < WorkerAction
attr_reader :reader, :return_address, :s3
def initialize(request, return_address)
@request = request
@return_address = return_address
end
def setup(track_slug, version, exercise_slug, solution_slug)
track_dir = environment.track_dir(track_slug, version)
Pipeline::Runtime::AnalysisRun.new(track_dir, exercise_slug, solution_slug)
end
def invoke
@s3 = Aws::S3::Client.new(
credentials: parse_credentials(request["context"]),
region: "eu-west-1")
language_slug = request["track_slug"]
exercise_slug = request["exercise_slug"]
solution_slug = request["solution_slug"]
container_version = request["container_version"]
unless environment.released?(language_slug, container_version)
return {
error: "Container #{language_slug}:#{container_version} isn't available"
}
end
analysis_run = setup(language_slug, container_version, exercise_slug, solution_slug)
analysis_run.prepare_iteration do |iteration_folder|
prepare_folder(iteration_folder)
end
begin
result = analysis_run.analyze!
result["return_address"] = return_address
result['msg_type'] = 'response'
result
rescue => e
puts e
ensure
puts "DONE"
end
end
def prepare_folder(iteration_folder)
raise "Please prepare input"
end
end
end