pipa 0.1.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/bin/pipa +10 -0
- data/lib/pipa.rb +127 -0
- metadata +60 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 694998b5a4309d4faacf4183ecf7cb8541a40c86
|
4
|
+
data.tar.gz: b3285ca9af59c771d9a676540dd3a2c09003d058
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 074fae7374f8ac5c280b103bb91e1c3de53de15c8791f3aa405a1edc55d32343f269dc45fb1a8fc8328b5ce5e85a180332ad392b968ea5b1f03cb3a773a25624
|
7
|
+
data.tar.gz: c397d29ab6c7ae786478fa2e0c2bc589c8403556e5fc0a08b026dd12020b987cc8667619ffcc15f7a4ed99d1892f905808023cdd3bbb909a0177da2d4d8a0109
|
data/bin/pipa
ADDED
data/lib/pipa.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'open3'
|
3
|
+
require 'colorize'
|
4
|
+
|
5
|
+
class Pipa
|
6
|
+
def initialize(stages)
|
7
|
+
@stages = stages
|
8
|
+
@to_be_executed = Set.new( stages.map{|k,v| k} )
|
9
|
+
@executed = Set.new
|
10
|
+
@log = {}
|
11
|
+
@ret = {}
|
12
|
+
|
13
|
+
@stages.each do |name, attributes|
|
14
|
+
attributes["dependencies"] ||= []
|
15
|
+
attributes["dependencies_set"] = Set.new(attributes["dependencies"])
|
16
|
+
end
|
17
|
+
|
18
|
+
@threads = []
|
19
|
+
|
20
|
+
@success = true
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute
|
24
|
+
@to_be_executed.delete_if do |stage|
|
25
|
+
if resolved_dependencies? stage
|
26
|
+
execute_stage(stage)
|
27
|
+
true
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def wait
|
35
|
+
@threads.map(&:join)
|
36
|
+
unless @to_be_executed.empty?
|
37
|
+
log_error "Some stages couldn't be executed: #{@to_be_executed.to_a}"
|
38
|
+
end
|
39
|
+
@success
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def log_info(msg)
|
45
|
+
puts
|
46
|
+
puts "-------- [#{Time.now.utc}] --------".green
|
47
|
+
puts msg.green
|
48
|
+
puts "-------------------------------------------".green
|
49
|
+
end
|
50
|
+
|
51
|
+
def log_error(msg)
|
52
|
+
puts
|
53
|
+
puts "-------- [#{Time.now.utc}] --------".red
|
54
|
+
puts msg.red
|
55
|
+
puts "-------------------------------------------".red
|
56
|
+
end
|
57
|
+
|
58
|
+
def resolved_dependencies?(stage)
|
59
|
+
@stages[stage]["dependencies_set"].subset?(@executed)
|
60
|
+
end
|
61
|
+
|
62
|
+
def execute_stage(stage)
|
63
|
+
@threads << Thread.new do
|
64
|
+
t = Time.now
|
65
|
+
|
66
|
+
reader, writer = IO.pipe
|
67
|
+
|
68
|
+
mode = ["bash","ruby","node","http"].find {|m| !@stages[stage][m].nil?}
|
69
|
+
input = @stages[stage]["dependencies"].map{|d| "___deserialize(#{@ret[d].dump})"}.join(',')
|
70
|
+
|
71
|
+
cmd = case mode
|
72
|
+
when "bash"
|
73
|
+
["bash", "-e", "-c", "bash -e -c '#{@stages[stage][mode]}' | ruby -e \"require 'json'; print ARGF.read.to_json\" | tee >(cat >&3)"]
|
74
|
+
when "ruby"
|
75
|
+
["ruby", "-e", %Q(
|
76
|
+
require 'json'
|
77
|
+
#{@stages[stage][mode]};
|
78
|
+
___deserialize = JSON.instance_method(:parse)
|
79
|
+
___ret = main(#{input});
|
80
|
+
___ret_fd = IO.open(3, 'w')
|
81
|
+
___ret_fd.write(___ret.to_json);
|
82
|
+
___ret_fd.close
|
83
|
+
)]
|
84
|
+
when "node"
|
85
|
+
["node", "-e", %Q(
|
86
|
+
___deserialize = JSON.parse
|
87
|
+
#{@stages[stage][mode]};
|
88
|
+
const ___ret = main(#{input});
|
89
|
+
fs.writeSync(3, JSON.stringify(___ret));
|
90
|
+
)]
|
91
|
+
when "http"
|
92
|
+
["ruby", "-e", %Q(
|
93
|
+
require 'httpclient'
|
94
|
+
require 'json'
|
95
|
+
puts ___ret = HTTPClient.get_content("#{@stages[stage][mode]}")
|
96
|
+
___ret_fd = IO.open(3, 'w')
|
97
|
+
___ret_fd.write(___ret.to_json);
|
98
|
+
___ret_fd.close
|
99
|
+
)]
|
100
|
+
end
|
101
|
+
|
102
|
+
@log[stage] = ""
|
103
|
+
@ret[stage] = ""
|
104
|
+
|
105
|
+
Open3.popen2e(*cmd, 3 => writer.fileno) do |stdin, stdout_err, wait_thr|
|
106
|
+
while line = stdout_err.gets
|
107
|
+
puts line
|
108
|
+
@log[stage] << line
|
109
|
+
end
|
110
|
+
|
111
|
+
exit_status = wait_thr.value
|
112
|
+
if exit_status.success?
|
113
|
+
writer.close
|
114
|
+
@ret[stage] = reader.read
|
115
|
+
reader.close
|
116
|
+
@executed.add(stage)
|
117
|
+
log_info "Stage '#{stage}' took #{Time.now - t}s."
|
118
|
+
else
|
119
|
+
log_error "Stage '#{stage}' failed with status #{exit_status.exitstatus} after #{Time.now - t}s. Error msg:\n#{@log[stage]}"
|
120
|
+
@success = false
|
121
|
+
end
|
122
|
+
|
123
|
+
execute
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pipa
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Miguel Cantón Cortés
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colorize
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.8.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.8.1
|
27
|
+
description: Define and execute pipelines
|
28
|
+
email: miwelc@gmail.com
|
29
|
+
executables:
|
30
|
+
- pipa
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- bin/pipa
|
35
|
+
- lib/pipa.rb
|
36
|
+
homepage: http://rubygems.org/gems/pipa
|
37
|
+
licenses:
|
38
|
+
- MIT
|
39
|
+
metadata: {}
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 2.5.1
|
57
|
+
signing_key:
|
58
|
+
specification_version: 4
|
59
|
+
summary: Pipelines, easy
|
60
|
+
test_files: []
|