iron_worker_ng 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.
- data/LICENSE +22 -0
- data/README.md +34 -0
- data/VERSION +1 -0
- data/bin/iron_worker_ng +164 -0
- data/lib/iron_worker_ng.rb +6 -0
- data/lib/iron_worker_ng/api_client.rb +143 -0
- data/lib/iron_worker_ng/api_client_error.rb +4 -0
- data/lib/iron_worker_ng/client.rb +55 -0
- data/lib/iron_worker_ng/code/base.rb +95 -0
- data/lib/iron_worker_ng/code/java.rb +51 -0
- data/lib/iron_worker_ng/code/node.rb +39 -0
- data/lib/iron_worker_ng/code/ruby.rb +86 -0
- data/lib/iron_worker_ng/feature/base.rb +12 -0
- data/lib/iron_worker_ng/feature/common/merge_dir.rb +43 -0
- data/lib/iron_worker_ng/feature/common/merge_file.rb +35 -0
- data/lib/iron_worker_ng/feature/java/merge_jar.rb +37 -0
- data/lib/iron_worker_ng/feature/java/merge_worker.rb +48 -0
- data/lib/iron_worker_ng/feature/node/merge_worker.rb +46 -0
- data/lib/iron_worker_ng/feature/ruby/merge_gem.rb +71 -0
- data/lib/iron_worker_ng/feature/ruby/merge_gemfile.rb +42 -0
- data/lib/iron_worker_ng/feature/ruby/merge_worker.rb +52 -0
- data/lib/iron_worker_ng/version.rb +7 -0
- metadata +139 -0
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Iron.io, Inc
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
|
13
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
14
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
15
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
16
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
17
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
18
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
19
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
20
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
21
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
22
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Basic Usage
|
2
|
+
|
3
|
+
Visit http://iron.io for more details.
|
4
|
+
|
5
|
+
## Create Worker
|
6
|
+
|
7
|
+
You can just put any code into worker or can create class with name matching file name (e.g MyWorker class in my_worker.rb) and run method.
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
require 'active_record'
|
11
|
+
|
12
|
+
# @params hash is available here
|
13
|
+
# do something fun
|
14
|
+
```
|
15
|
+
|
16
|
+
## Create Runner
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
require 'iron_worker_ng'
|
20
|
+
|
21
|
+
client = IronWorkerNG::Client.new('IRON_IO_PROJECT_ID', 'IRON_IO_TOKEN')
|
22
|
+
|
23
|
+
code = IronWorkerNG::Code::Ruby.new
|
24
|
+
code.merge_worker 'path/to/my_worker.rb'
|
25
|
+
code.merge_gem 'activerecord'
|
26
|
+
|
27
|
+
# you can use hash_string to check if you need to reupload code
|
28
|
+
# note that hash_string check is fast while code upload can take a while (depends on how much things you merged)
|
29
|
+
puts code.hash_string
|
30
|
+
|
31
|
+
client.codes.create(code)
|
32
|
+
|
33
|
+
client.tasks.create('MyWorker', 'foo' => 'bar')
|
34
|
+
```
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/bin/iron_worker_ng
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'time'
|
5
|
+
require 'iron_worker_ng'
|
6
|
+
|
7
|
+
if $*.size == 0 || (not ['upload', 'queue', 'schedule'].include?($*[0]))
|
8
|
+
puts 'usage: iron_worker_ng COMMAND [OPTIONS]'
|
9
|
+
puts ' COMMAND: upload, queue, schedule'
|
10
|
+
puts ' run iron_worker_ng COMMAND --help to get more information about each command'
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
command = $*[0]
|
15
|
+
$*.shift
|
16
|
+
|
17
|
+
if ENV['IRON_IO_PROJECT_ID'].nil? || ENV['IRON_IO_TOKEN'].nil?
|
18
|
+
puts "please set $IRON_IO_PROJECT_ID and $IRON_IO_TOKEN environment variables"
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
|
22
|
+
client = IronWorkerNG::Client.new(ENV['IRON_IO_PROJECT_ID'], ENV['IRON_IO_TOKEN'])
|
23
|
+
|
24
|
+
if command == 'upload'
|
25
|
+
runtimes = IronWorkerNG::Code::Base.registered_types
|
26
|
+
runtimes_help = runtimes[0][:name] + ' (default)' + (runtimes.size == 1 ? '' : ', ') + runtimes.map { |r| r[:name] }[1 .. -1].join(', ')
|
27
|
+
|
28
|
+
features = []
|
29
|
+
|
30
|
+
name = nil
|
31
|
+
runtime = nil
|
32
|
+
execute_features = []
|
33
|
+
|
34
|
+
opts = OptionParser.new do |opts|
|
35
|
+
opts.banner = 'usage: iron_worker_ng upload [OPTIONS]'
|
36
|
+
|
37
|
+
opts.on('-r', '--runtime RUNTIME', runtimes.map { |r| r[:name] }, "#{runtimes_help}") do |v|
|
38
|
+
runtime = v
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on('-n', '--name NAME', 'code name') do |v|
|
42
|
+
name = v
|
43
|
+
end
|
44
|
+
|
45
|
+
IronWorkerNG::Code::Base.registered_features.each do |f|
|
46
|
+
prefix = ''
|
47
|
+
|
48
|
+
if f[:for_klass] != IronWorkerNG::Code::Base
|
49
|
+
prefix = runtimes.find { |r| r[:klass] == f[:for_klass] }[:name] + '-'
|
50
|
+
end
|
51
|
+
|
52
|
+
opts.on("--#{prefix}#{f[:name].gsub('_', '-')} #{f[:args]}", Array) do |v|
|
53
|
+
execute_features << {:name => f[:name], :args => v}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
begin
|
59
|
+
opts.parse!
|
60
|
+
rescue OptionParser::ParseError
|
61
|
+
puts $!.to_s
|
62
|
+
exit 1
|
63
|
+
end
|
64
|
+
|
65
|
+
if execute_features.size == 0
|
66
|
+
puts opts
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
|
70
|
+
runtime = runtimes[0][:name] if runtime.nil?
|
71
|
+
|
72
|
+
code = runtimes.find { |r| r[:name] == runtime }[:klass].new(name)
|
73
|
+
|
74
|
+
execute_features.each do |f|
|
75
|
+
code.send(f[:name], *f[:args])
|
76
|
+
end
|
77
|
+
|
78
|
+
client.codes.create(code)
|
79
|
+
elsif command == 'queue' || command == 'schedule'
|
80
|
+
name = nil
|
81
|
+
params = {}
|
82
|
+
|
83
|
+
priority = nil
|
84
|
+
timeout = nil
|
85
|
+
delay = nil
|
86
|
+
|
87
|
+
start_at = nil
|
88
|
+
end_at = nil
|
89
|
+
run_times = nil
|
90
|
+
run_every = nil
|
91
|
+
|
92
|
+
opts = OptionParser.new do |opts|
|
93
|
+
opts.banner = "usage: iron_worker_ng #{command} [OPTIONS]"
|
94
|
+
|
95
|
+
opts.on('-n', '--name NAME', 'code name') do |v|
|
96
|
+
name = v
|
97
|
+
end
|
98
|
+
|
99
|
+
opts.on('-p', '--param NAME,VALUE', Array, 'parameters to pass') do |v|
|
100
|
+
params[v[0]] = v[1]
|
101
|
+
end
|
102
|
+
|
103
|
+
opts.on('--priority PRIORITY', Integer, '0 (default), 1, 2') do |v|
|
104
|
+
priority = v
|
105
|
+
end
|
106
|
+
|
107
|
+
opts.on('--timeout TIMEOUT', Integer, 'maximum run time in seconds from 0 to 3600 (default)') do |v|
|
108
|
+
timeout = v
|
109
|
+
end
|
110
|
+
|
111
|
+
opts.on('--delay DELAY', Integer, 'delay before start in seconds') do |v|
|
112
|
+
delay = v
|
113
|
+
end
|
114
|
+
|
115
|
+
if command == 'schedule'
|
116
|
+
opts.on('--start-at TIME', 'start task at specified time') do |v|
|
117
|
+
start_at = Time.parse(v)
|
118
|
+
end
|
119
|
+
|
120
|
+
opts.on('--end-at TIME', 'stop running task at specified time') do |v|
|
121
|
+
end_at = Time.parse(v)
|
122
|
+
end
|
123
|
+
|
124
|
+
opts.on('--run-times RUN_TIMES', Integer, 'run task no more times than specified') do |v|
|
125
|
+
run_times = v
|
126
|
+
end
|
127
|
+
|
128
|
+
opts.on('--run-every RUN_EVERY', Integer, 'run task every RUN_EVERY seconds') do |v|
|
129
|
+
run_every = v
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
begin
|
135
|
+
opts.parse!
|
136
|
+
rescue OptionParser::ParseError
|
137
|
+
puts $!.to_s
|
138
|
+
exit 1
|
139
|
+
end
|
140
|
+
|
141
|
+
if name.nil?
|
142
|
+
puts opts
|
143
|
+
exit 1
|
144
|
+
end
|
145
|
+
|
146
|
+
options = {}
|
147
|
+
|
148
|
+
options[:priority] = priority unless priority.nil?
|
149
|
+
options[:timeout] = timeout unless timeout.nil?
|
150
|
+
options[:delay] = delay unless delay.nil?
|
151
|
+
|
152
|
+
if command == 'schedule'
|
153
|
+
options[:start_at] = start_at unless start_at.nil?
|
154
|
+
options[:end_at] = end_at unless end_at.nil?
|
155
|
+
options[:run_times] = run_times unless run_times.nil?
|
156
|
+
options[:run_every] = run_every unless run_every.nil?
|
157
|
+
end
|
158
|
+
|
159
|
+
if command == 'queue'
|
160
|
+
client.tasks.create(name, params, options)
|
161
|
+
else
|
162
|
+
client.schedules.create(name, params, options)
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'rest'
|
3
|
+
require 'json'
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
require_relative 'api_client_error'
|
7
|
+
|
8
|
+
module IronWorkerNG
|
9
|
+
class APIClient
|
10
|
+
attr_reader :project_id
|
11
|
+
attr_reader :token
|
12
|
+
|
13
|
+
def initialize(project_id, token, params = {})
|
14
|
+
@project_id = project_id
|
15
|
+
@token = token
|
16
|
+
|
17
|
+
@user_agent = params[:user_agent] || 'iron_worker_ng-' + IronWorkerNG.version
|
18
|
+
|
19
|
+
scheme = params[:scheme] || 'https'
|
20
|
+
host = params[:host] || 'worker-aws-us-east-1.iron.io'
|
21
|
+
port = params[:port] || 443
|
22
|
+
api_version = params[:api_version] || 2
|
23
|
+
|
24
|
+
@url = "#{scheme}://#{host}:#{port}/#{api_version}/"
|
25
|
+
|
26
|
+
@rest = Rest::Client.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def common_request_hash
|
30
|
+
{
|
31
|
+
'Content-Type' => 'application/json',
|
32
|
+
'Authorization' => "OAuth #{@token}",
|
33
|
+
'User-Agent' => @user_agent
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def get(method, params = {})
|
38
|
+
request_hash = {}
|
39
|
+
request_hash[:headers] = common_request_hash
|
40
|
+
request_hash[:params] = params
|
41
|
+
|
42
|
+
@rest.get(@url + method, request_hash)
|
43
|
+
end
|
44
|
+
|
45
|
+
def post(method, params = {})
|
46
|
+
request_hash = {}
|
47
|
+
request_hash[:headers] = common_request_hash
|
48
|
+
request_hash[:body] = params.to_json
|
49
|
+
|
50
|
+
@rest.post(@url + method, request_hash)
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete(method, params = {})
|
54
|
+
request_hash = {}
|
55
|
+
request_hash[:headers] = common_request_hash
|
56
|
+
request_hash[:params] = params
|
57
|
+
|
58
|
+
@rest.delete(@url + method, request_hash)
|
59
|
+
end
|
60
|
+
|
61
|
+
def post_file(method, file, params = {})
|
62
|
+
request_hash = common_request_hash
|
63
|
+
request_hash[:data] = params.to_json
|
64
|
+
request_hash[:file] = file
|
65
|
+
|
66
|
+
RestClient.post(@url + method + "?oauth=#{@token}", request_hash)
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse_response(response, parse_json = true)
|
70
|
+
raise IronWorkerNG::APIClientError.new(response.body) if response.code != 200
|
71
|
+
|
72
|
+
return response.body unless parse_json
|
73
|
+
JSON.parse(response.body)
|
74
|
+
end
|
75
|
+
|
76
|
+
def codes_list(params = {})
|
77
|
+
parse_response(get("projects/#{@project_id}/codes", params))
|
78
|
+
end
|
79
|
+
|
80
|
+
def codes_get(id)
|
81
|
+
parse_response(get("projects/#{@project_id}/codes/#{id}"))
|
82
|
+
end
|
83
|
+
|
84
|
+
def codes_create(name, file, runtime, runner)
|
85
|
+
parse_response(post_file("projects/#{@project_id}/codes", File.new(file, 'rb'), {:name => name, :runtime => runtime, :file_name => runner}))
|
86
|
+
end
|
87
|
+
|
88
|
+
def codes_delete(id)
|
89
|
+
parse_response(delete("projects/#{@project_id}/codes/#{id}"))
|
90
|
+
end
|
91
|
+
|
92
|
+
def codes_revisions(id, params = {})
|
93
|
+
parse_response(get("projects/#{@project_id}/codes/#{id}/revisions", params))
|
94
|
+
end
|
95
|
+
|
96
|
+
def codes_download(id, params = {})
|
97
|
+
parse_response(get("projects/#{@project_id}/codes/#{id}/download", params), false)
|
98
|
+
end
|
99
|
+
|
100
|
+
def tasks_list(params = {})
|
101
|
+
parse_response(get("projects/#{@project_id}/tasks", params))
|
102
|
+
end
|
103
|
+
|
104
|
+
def tasks_get(id)
|
105
|
+
parse_response(get("projects/#{@project_id}/tasks/#{id}"))
|
106
|
+
end
|
107
|
+
|
108
|
+
def tasks_create(code_name, payload, params = {})
|
109
|
+
parse_response(post("projects/#{@project_id}/tasks", {:tasks => [{:code_name => code_name, :payload => payload}.merge(params)]}))
|
110
|
+
end
|
111
|
+
|
112
|
+
def tasks_cancel(id)
|
113
|
+
parse_response(post("projects/#{@project_id}/tasks/#{id}/cancel"))
|
114
|
+
end
|
115
|
+
|
116
|
+
def tasks_log(id)
|
117
|
+
parse_response(get("projects/#{@project_id}/tasks/#{id}/log"), false)
|
118
|
+
end
|
119
|
+
|
120
|
+
def tasks_set_progress(id, params = {})
|
121
|
+
parse_response(post("projects/#{@project_id}/tasks/#{id}/progress", params))
|
122
|
+
end
|
123
|
+
|
124
|
+
def schedules_list(params = {})
|
125
|
+
parse_response(get("projects/#{@project_id}/schedules", params))
|
126
|
+
end
|
127
|
+
|
128
|
+
def schedules_get(id)
|
129
|
+
parse_response(get("projects/#{@project_id}/schedules/#{id}"))
|
130
|
+
end
|
131
|
+
|
132
|
+
def schedules_create(code_name, payload, params = {})
|
133
|
+
params[:start_at] = params[:start_at].iso8601 if (not params[:start_at].nil?) && params[:start_at].class == Time
|
134
|
+
params[:end_at] = params[:end_at].iso8601 if (not params[:end_at].nil?) && params[:end_at].class == Time
|
135
|
+
|
136
|
+
parse_response(post("projects/#{@project_id}/schedules", {:schedules => [{:code_name => code_name, :payload => payload}.merge(params)]}))
|
137
|
+
end
|
138
|
+
|
139
|
+
def schedules_cancel(id)
|
140
|
+
parse_response(post("projects/#{@project_id}/schedules/#{id}/cancel"))
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'api_client'
|
2
|
+
|
3
|
+
module IronWorkerNG
|
4
|
+
class ClientProxyCaller
|
5
|
+
def initialize(client, prefix)
|
6
|
+
@client = client
|
7
|
+
@prefix = prefix
|
8
|
+
end
|
9
|
+
|
10
|
+
def method_missing(name, *args, &block)
|
11
|
+
full_name = @prefix.to_s + '_' + name.to_s
|
12
|
+
if @client.respond_to?(full_name)
|
13
|
+
@client.send(full_name, *args, &block)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Client
|
21
|
+
attr_reader :api
|
22
|
+
|
23
|
+
def initialize(project_id, token, params = {})
|
24
|
+
@api = IronWorkerNG::APIClient.new(project_id, token, params)
|
25
|
+
end
|
26
|
+
|
27
|
+
def method_missing(name, *args, &block)
|
28
|
+
if args.length == 0
|
29
|
+
IronWorkerNG::ClientProxyCaller.new(self, name)
|
30
|
+
else
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def codes_create(code)
|
36
|
+
zip_file = code.create_zip
|
37
|
+
@api.codes_create(code.name, zip_file, code.runtime, code.runner)
|
38
|
+
File.unlink(zip_file)
|
39
|
+
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
def tasks_create(code_name, params = {}, options = {})
|
44
|
+
res = @api.tasks_create(code_name, {:project_id => @api.project_id, :token => @api.token, :params => params}.to_json, options)
|
45
|
+
|
46
|
+
res['tasks'][0]['id']
|
47
|
+
end
|
48
|
+
|
49
|
+
def schedules_create(code_name, params = {}, options = {})
|
50
|
+
res = @api.schedules_create(code_name, {:project_id => @api.project_id, :token => @api.token, :params => params}.to_json, options)
|
51
|
+
|
52
|
+
res['schedules'][0]['id']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'zip/zip'
|
3
|
+
|
4
|
+
require_relative '../feature/base'
|
5
|
+
require_relative '../feature/common/merge_file'
|
6
|
+
require_relative '../feature/common/merge_dir'
|
7
|
+
|
8
|
+
module IronWorkerNG
|
9
|
+
module Code
|
10
|
+
class Base
|
11
|
+
attr_reader :name
|
12
|
+
attr_reader :features
|
13
|
+
|
14
|
+
@@registered_types = []
|
15
|
+
|
16
|
+
def self.registered_types
|
17
|
+
@@registered_types
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.register_type(type)
|
21
|
+
@@registered_types << type
|
22
|
+
end
|
23
|
+
|
24
|
+
@@registered_features = []
|
25
|
+
|
26
|
+
def self.registered_features
|
27
|
+
@@registered_features
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.register_feature(feature)
|
31
|
+
@@registered_features << feature
|
32
|
+
end
|
33
|
+
|
34
|
+
include IronWorkerNG::Feature::Common::MergeFile::InstanceMethods
|
35
|
+
include IronWorkerNG::Feature::Common::MergeDir::InstanceMethods
|
36
|
+
|
37
|
+
def initialize(name = nil)
|
38
|
+
@name = name
|
39
|
+
@features = []
|
40
|
+
end
|
41
|
+
|
42
|
+
def fixate
|
43
|
+
IronWorkerNG::Code::Base.registered_features.each do |rf|
|
44
|
+
if rf[:for_klass] == self.class && respond_to?(rf[:name] + '_fixate')
|
45
|
+
send(rf[:name] + '_fixate')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def hash_string
|
51
|
+
fixate
|
52
|
+
|
53
|
+
Digest::MD5.hexdigest(@features.map { |f| f.hash_string }.join)
|
54
|
+
end
|
55
|
+
|
56
|
+
def bundle(zip)
|
57
|
+
@features.each do |feature|
|
58
|
+
feature.bundle(zip)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_zip
|
63
|
+
fixate
|
64
|
+
|
65
|
+
init_code = ''
|
66
|
+
|
67
|
+
@features.each do |f|
|
68
|
+
if f.respond_to?(:code_for_init)
|
69
|
+
init_code += f.send(:code_for_init) + "\n"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
zip_name = Dir.tmpdir + '/' + Dir::Tmpname.make_tmpname("iron-worker-ng-", "code.zip")
|
74
|
+
|
75
|
+
Zip::ZipFile.open(zip_name, Zip::ZipFile::CREATE) do |zip|
|
76
|
+
bundle(zip)
|
77
|
+
create_runner(zip, init_code)
|
78
|
+
end
|
79
|
+
|
80
|
+
zip_name
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_runner(zip)
|
84
|
+
end
|
85
|
+
|
86
|
+
def runtime
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
|
90
|
+
def runner
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative '../feature/java/merge_jar'
|
2
|
+
require_relative '../feature/java/merge_worker'
|
3
|
+
|
4
|
+
module IronWorkerNG
|
5
|
+
module Code
|
6
|
+
class Java < IronWorkerNG::Code::Base
|
7
|
+
include IronWorkerNG::Feature::Java::MergeJar::InstanceMethods
|
8
|
+
include IronWorkerNG::Feature::Java::MergeWorker::InstanceMethods
|
9
|
+
|
10
|
+
def create_runner(zip, init_code)
|
11
|
+
classpath_array = []
|
12
|
+
|
13
|
+
@features.each do |f|
|
14
|
+
if f.respond_to?(:code_for_classpath)
|
15
|
+
classpath_array << f.send(:code_for_classpath)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
classpath = classpath_array.join(':')
|
20
|
+
|
21
|
+
zip.get_output_stream('runner.rb') do |runner|
|
22
|
+
runner.write <<RUNNER
|
23
|
+
# iron_worker_ng-#{IronWorkerNG.version}
|
24
|
+
|
25
|
+
root = nil
|
26
|
+
|
27
|
+
($*.length - 2).downto(0) do |i|
|
28
|
+
root = $*[i + 1] if $*[i] == '-d'
|
29
|
+
end
|
30
|
+
|
31
|
+
Dir.chdir(root)
|
32
|
+
|
33
|
+
#{init_code}
|
34
|
+
|
35
|
+
puts `java -cp #{classpath} #{worker.klass} \#{$*.join(' ')}`
|
36
|
+
RUNNER
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def runtime
|
41
|
+
'ruby'
|
42
|
+
end
|
43
|
+
|
44
|
+
def runner
|
45
|
+
'runner.rb'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
IronWorkerNG::Code::Base.register_type(:name => 'java', :klass => IronWorkerNG::Code::Java)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../feature/node/merge_worker'
|
2
|
+
|
3
|
+
module IronWorkerNG
|
4
|
+
module Code
|
5
|
+
class Node < IronWorkerNG::Code::Base
|
6
|
+
include IronWorkerNG::Feature::Node::MergeWorker::InstanceMethods
|
7
|
+
|
8
|
+
def create_runner(zip, init_code)
|
9
|
+
zip.get_output_stream('runner.rb') do |runner|
|
10
|
+
runner.write <<RUNNER
|
11
|
+
# iron_worker_ng-#{IronWorkerNG.version}
|
12
|
+
|
13
|
+
root = nil
|
14
|
+
|
15
|
+
($*.length - 2).downto(0) do |i|
|
16
|
+
root = $*[i + 1] if $*[i] == '-d'
|
17
|
+
end
|
18
|
+
|
19
|
+
Dir.chdir(root)
|
20
|
+
|
21
|
+
#{init_code}
|
22
|
+
|
23
|
+
puts `node \#{worker_file_name} \#{$*.join(' ')}`
|
24
|
+
RUNNER
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def runtime
|
29
|
+
'ruby'
|
30
|
+
end
|
31
|
+
|
32
|
+
def runner
|
33
|
+
'runner.rb'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
IronWorkerNG::Code::Base.register_type(:name => 'node', :klass => IronWorkerNG::Code::Node)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require_relative '../feature/ruby/merge_gem'
|
2
|
+
require_relative '../feature/ruby/merge_gemfile'
|
3
|
+
require_relative '../feature/ruby/merge_worker'
|
4
|
+
|
5
|
+
module IronWorkerNG
|
6
|
+
module Code
|
7
|
+
class Ruby < IronWorkerNG::Code::Base
|
8
|
+
include IronWorkerNG::Feature::Ruby::MergeGem::InstanceMethods
|
9
|
+
include IronWorkerNG::Feature::Ruby::MergeGemfile::InstanceMethods
|
10
|
+
include IronWorkerNG::Feature::Ruby::MergeWorker::InstanceMethods
|
11
|
+
|
12
|
+
def create_runner(zip, init_code)
|
13
|
+
zip.get_output_stream('runner.rb') do |runner|
|
14
|
+
runner.write <<RUNNER
|
15
|
+
# iron_worker_ng-#{IronWorkerNG.version}
|
16
|
+
|
17
|
+
root = nil
|
18
|
+
payload_file = nil
|
19
|
+
task_id = nil
|
20
|
+
|
21
|
+
($*.length - 2).downto(0) do |i|
|
22
|
+
root = $*[i + 1] if $*[i] == '-d'
|
23
|
+
payload_file = $*[i + 1] if $*[i] == '-payload'
|
24
|
+
task_id = $*[i + 1] if $*[i] == '-id'
|
25
|
+
end
|
26
|
+
|
27
|
+
Dir.chdir(root)
|
28
|
+
|
29
|
+
#{init_code}
|
30
|
+
$:.unshift("\#{root}")
|
31
|
+
|
32
|
+
def log(*args)
|
33
|
+
puts *args
|
34
|
+
end
|
35
|
+
|
36
|
+
require 'json'
|
37
|
+
|
38
|
+
payload = JSON.load(File.open(payload_file))
|
39
|
+
|
40
|
+
@iron_io_project_id = payload['project_id']
|
41
|
+
@iron_io_token = payload['token']
|
42
|
+
@iron_worker_task_id = task_id
|
43
|
+
@params = payload['params']
|
44
|
+
|
45
|
+
require worker_file_name
|
46
|
+
|
47
|
+
worker_class = nil
|
48
|
+
|
49
|
+
begin
|
50
|
+
worker_class = Kernel.const_get(worker_class_name)
|
51
|
+
rescue
|
52
|
+
end
|
53
|
+
|
54
|
+
unless worker_class.nil?
|
55
|
+
worker_inst = worker_class.new
|
56
|
+
|
57
|
+
class << worker_inst
|
58
|
+
attr_accessor :iron_io_project_id
|
59
|
+
attr_accessor :iron_io_token
|
60
|
+
attr_accessor :iron_worker_task_id
|
61
|
+
attr_accessor :params
|
62
|
+
end
|
63
|
+
|
64
|
+
worker_inst.iron_io_project_id = @iron_io_project_id
|
65
|
+
worker_inst.iron_io_token = @iron_io_token
|
66
|
+
worker_inst.iron_worker_task_id = @iron_worker_task_id
|
67
|
+
worker_inst.params = @params
|
68
|
+
|
69
|
+
worker_inst.run
|
70
|
+
end
|
71
|
+
RUNNER
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def runtime
|
76
|
+
'ruby'
|
77
|
+
end
|
78
|
+
|
79
|
+
def runner
|
80
|
+
'runner.rb'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
IronWorkerNG::Code::Base.register_type(:name => 'ruby', :klass => IronWorkerNG::Code::Ruby)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module IronWorkerNG
|
2
|
+
module Feature
|
3
|
+
module Common
|
4
|
+
module MergeDir
|
5
|
+
class Feature < IronWorkerNG::Feature::Base
|
6
|
+
attr_reader :path
|
7
|
+
attr_reader :dest
|
8
|
+
|
9
|
+
def initialize(path, dest)
|
10
|
+
@path = File.expand_path(path)
|
11
|
+
@dest = dest
|
12
|
+
end
|
13
|
+
|
14
|
+
def hash_string
|
15
|
+
s = @path + @dest + File.mtime(@path).to_i.to_s
|
16
|
+
|
17
|
+
Dir.glob(@path + '/**/**') do |path|
|
18
|
+
s += path + File.mtime(path).to_i.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
Digest::MD5.hexdigest(s)
|
22
|
+
end
|
23
|
+
|
24
|
+
def bundle(zip)
|
25
|
+
Dir.glob(@path + '/**/**') do |path|
|
26
|
+
zip.add(@dest + '/' + File.basename(@path) + path[@path.length .. -1], path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module InstanceMethods
|
32
|
+
def merge_dir(path, dest = '.')
|
33
|
+
@features << IronWorkerNG::Feature::Common::MergeDir::Feature.new(path, dest)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.included(base)
|
37
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_dir', :for_klass => base, :args => 'PATH[,DEST]')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module IronWorkerNG
|
2
|
+
module Feature
|
3
|
+
module Common
|
4
|
+
module MergeFile
|
5
|
+
class Feature < IronWorkerNG::Feature::Base
|
6
|
+
attr_reader :path
|
7
|
+
attr_reader :dest
|
8
|
+
|
9
|
+
def initialize(path, dest)
|
10
|
+
@path = File.expand_path(path)
|
11
|
+
@dest = dest
|
12
|
+
end
|
13
|
+
|
14
|
+
def hash_string
|
15
|
+
Digest::MD5.hexdigest(@path + @dest + File.mtime(@path).to_i.to_s)
|
16
|
+
end
|
17
|
+
|
18
|
+
def bundle(zip)
|
19
|
+
zip.add(@dest + '/' + File.basename(@path), @path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module InstanceMethods
|
24
|
+
def merge_file(path, dest = '.')
|
25
|
+
@features << IronWorkerNG::Feature::Common::MergerFile::Feature.new(path, dest)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.included(base)
|
29
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_file', :for_klass => base, :args => 'PATH[,DEST]')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module IronWorkerNG
|
2
|
+
module Feature
|
3
|
+
module Java
|
4
|
+
module MergeJar
|
5
|
+
class Feature < IronWorkerNG::Feature::Base
|
6
|
+
attr_reader :path
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
@path = File.expand_path(path)
|
10
|
+
end
|
11
|
+
|
12
|
+
def hash_string
|
13
|
+
Digest::MD5.hexdigest(@path + File.mtime(@path).to_i.to_s)
|
14
|
+
end
|
15
|
+
|
16
|
+
def bundle(zip)
|
17
|
+
zip.add(File.basename(@path), @path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def code_for_classpath
|
21
|
+
File.basename(@path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module InstanceMethods
|
26
|
+
def merge_jar(path)
|
27
|
+
@features << IronWorkerNG::Feature::Java::MergeJar::Feature.new(path)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(base)
|
31
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_jar', :for_klass => base, :args => 'PATH')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module IronWorkerNG
|
2
|
+
module Feature
|
3
|
+
module Java
|
4
|
+
module MergeWorker
|
5
|
+
class Feature < IronWorkerNG::Feature::Base
|
6
|
+
attr_reader :path
|
7
|
+
attr_reader :klass
|
8
|
+
|
9
|
+
def initialize(path, klass)
|
10
|
+
@path = File.expand_path(path)
|
11
|
+
@klass = klass
|
12
|
+
end
|
13
|
+
|
14
|
+
def hash_string
|
15
|
+
Digest::MD5.hexdigest(@path + @klass + File.mtime(@path).to_i.to_s)
|
16
|
+
end
|
17
|
+
|
18
|
+
def bundle(zip)
|
19
|
+
zip.add(File.basename(@path), @path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def code_for_classpath
|
23
|
+
File.basename(@path)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module InstanceMethods
|
28
|
+
attr_reader :worker
|
29
|
+
|
30
|
+
def merge_worker(path, klass)
|
31
|
+
@worker ||= nil
|
32
|
+
|
33
|
+
return unless @worker.nil?
|
34
|
+
|
35
|
+
@name ||= klass.split('.')[-1]
|
36
|
+
|
37
|
+
@worker = IronWorkerNG::Feature::Java::MergeWorker::Feature.new(path, klass)
|
38
|
+
@features << @worker
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.included(base)
|
42
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_worker', :for_klass => base, :args => 'PATH,CLASS')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module IronWorkerNG
|
2
|
+
module Feature
|
3
|
+
module Node
|
4
|
+
module MergeWorker
|
5
|
+
class Feature < IronWorkerNG::Feature::Base
|
6
|
+
attr_reader :path
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
@path = File.expand_path(path)
|
10
|
+
end
|
11
|
+
|
12
|
+
def hash_string
|
13
|
+
Digest::MD5.hexdigest(@path + File.mtime(@path).to_i.to_s)
|
14
|
+
end
|
15
|
+
|
16
|
+
def bundle(zip)
|
17
|
+
zip.add(File.basename(@path), @path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def code_for_init
|
21
|
+
"worker_file_name = '#{File.basename(@path)}'"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module InstanceMethods
|
26
|
+
attr_reader :worker
|
27
|
+
|
28
|
+
def merge_worker(path)
|
29
|
+
@worker ||= nil
|
30
|
+
|
31
|
+
return unless @worker.nil?
|
32
|
+
|
33
|
+
@name ||= File.basename(path).gsub(/\.js$/, '').capitalize.gsub(/_./) { |x| x[1].upcase }
|
34
|
+
|
35
|
+
@worker = IronWorkerNG::Feature::Node::MergeWorker::Feature.new(path)
|
36
|
+
@features << @worker
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.included(base)
|
40
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_worker', :for_klass => base, :args => 'PATH')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
|
3
|
+
module IronWorkerNG
|
4
|
+
module Feature
|
5
|
+
module Ruby
|
6
|
+
module MergeGem
|
7
|
+
class Feature < IronWorkerNG::Feature::Base
|
8
|
+
attr_reader :spec
|
9
|
+
|
10
|
+
def initialize(spec)
|
11
|
+
@spec = spec
|
12
|
+
end
|
13
|
+
|
14
|
+
def hash_string
|
15
|
+
Digest::MD5.hexdigest(@spec.full_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def bundle(zip)
|
19
|
+
if @spec.extensions.length == 0
|
20
|
+
zip.add('./gems/' + @spec.full_name, @spec.full_gem_path)
|
21
|
+
Dir.glob(@spec.full_gem_path + '/**/**') do |path|
|
22
|
+
zip.add('./gems/' + @spec.full_name + path[@spec.full_gem_path.length .. -1], path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def code_for_init
|
28
|
+
if @spec.extensions.length == 0
|
29
|
+
'$:.unshift("#{root}/gems/' + @spec.full_name + '/lib")'
|
30
|
+
else
|
31
|
+
'# native gem ' + @spec.full_name
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module InstanceMethods
|
37
|
+
attr_reader :merge_gem_reqs
|
38
|
+
|
39
|
+
def merge_gem(name, version = '>= 0')
|
40
|
+
@merge_gem_reqs ||= []
|
41
|
+
|
42
|
+
@merge_gem_reqs << Bundler::Dependency.new(name, version.split(', '))
|
43
|
+
end
|
44
|
+
|
45
|
+
def merge_gem_fixate
|
46
|
+
@merge_gem_reqs ||= []
|
47
|
+
|
48
|
+
@features.reject! { |f| f.class == IronWorkerNG::Feature::Ruby::MergeGem::Feature }
|
49
|
+
|
50
|
+
if @merge_gem_reqs.length > 0
|
51
|
+
reqs = @merge_gem_reqs.map { |req| Bundler::DepProxy.new(req, Gem::Platform::RUBY) }
|
52
|
+
|
53
|
+
source = Bundler::Source::Rubygems.new
|
54
|
+
index = Bundler::Index.build { |index| index.use source.specs }
|
55
|
+
|
56
|
+
spec_set = Bundler::Resolver.resolve(reqs, index)
|
57
|
+
|
58
|
+
spec_set.to_a.each do |spec|
|
59
|
+
@features << IronWorkerNG::Feature::Ruby::MergeGem::Feature.new(spec.__materialize__)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.included(base)
|
65
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_gem', :for_klass => base, :args => 'NAME[,VERSION]')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
|
3
|
+
module IronWorkerNG
|
4
|
+
module Feature
|
5
|
+
module Ruby
|
6
|
+
module MergeGemfile
|
7
|
+
class Feature < IronWorkerNG::Feature::Base
|
8
|
+
attr_reader :path
|
9
|
+
attr_reader :groups
|
10
|
+
|
11
|
+
def initialize(path, groups)
|
12
|
+
@path = File.expand_path(path)
|
13
|
+
@groups = groups
|
14
|
+
end
|
15
|
+
|
16
|
+
def hash_string
|
17
|
+
Digest::MD5.hexdigest(@path + File.mtime(@path).to_i.to_s + (File.exists?(@path + '.lock') ? File.mtime(@path + '.lock').to_i.to_s : '') + @groups.join)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module InstanceMethods
|
22
|
+
def merge_gemfile(path, *groups)
|
23
|
+
groups = groups.map { |g| g.to_sym }
|
24
|
+
groups << :default if groups.length == 0
|
25
|
+
|
26
|
+
specs = Bundler::Definition.build(path, path + '.lock', nil).specs_for(groups)
|
27
|
+
|
28
|
+
specs.each do |spec|
|
29
|
+
merge_gem(spec.name, spec.version.to_s)
|
30
|
+
end
|
31
|
+
|
32
|
+
@features << IronWorkerNG::Feature::Ruby::MergeGemfile::Feature.new(path, groups)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.included(base)
|
36
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_gemfile', :for_klass => base, :args => 'PATH[,GROUP...]')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module IronWorkerNG
|
2
|
+
module Feature
|
3
|
+
module Ruby
|
4
|
+
module MergeWorker
|
5
|
+
class Feature < IronWorkerNG::Feature::Base
|
6
|
+
attr_reader :path
|
7
|
+
attr_reader :klass
|
8
|
+
|
9
|
+
def initialize(path, klass)
|
10
|
+
@path = File.expand_path(path)
|
11
|
+
@klass = klass
|
12
|
+
end
|
13
|
+
|
14
|
+
def hash_string
|
15
|
+
Digest::MD5.hexdigest(@path + @klass)
|
16
|
+
end
|
17
|
+
|
18
|
+
def bundle(zip)
|
19
|
+
zip.add('./' + File.basename(@path), @path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def code_for_init
|
23
|
+
"worker_file_name = '#{File.basename(@path)}'\nworker_class_name='#{@klass}'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module InstanceMethods
|
28
|
+
attr_reader :worker
|
29
|
+
|
30
|
+
def merge_worker(path, klass = nil)
|
31
|
+
@worker ||= nil
|
32
|
+
|
33
|
+
return unless @worker.nil?
|
34
|
+
|
35
|
+
if klass == nil
|
36
|
+
klass = File.basename(path).gsub(/\.rb$/, '').capitalize.gsub(/_./) { |x| x[1].upcase }
|
37
|
+
end
|
38
|
+
|
39
|
+
@name ||= klass
|
40
|
+
|
41
|
+
@worker = IronWorkerNG::Feature::Ruby::MergeWorker::Feature.new(path, klass)
|
42
|
+
@features << @worker
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.included(base)
|
46
|
+
IronWorkerNG::Code::Base.register_feature(:name => 'merge_worker', :for_klass => base, :args => 'PATH[,CLASS]')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iron_worker_ng
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Kirilenko
|
9
|
+
- Iron.io, Inc
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: zip
|
17
|
+
requirement: &79402670 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *79402670
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rest-client
|
28
|
+
requirement: &79402330 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *79402330
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rest
|
39
|
+
requirement: &79401930 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *79401930
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: json
|
50
|
+
requirement: &79401450 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *79401450
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: bundler
|
61
|
+
requirement: &79401140 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.0.0
|
67
|
+
type: :runtime
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *79401140
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: jeweler
|
72
|
+
requirement: &79400870 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.8.3
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: *79400870
|
81
|
+
description: New generation ruby client for IronWorker
|
82
|
+
email: info@iron.io
|
83
|
+
executables:
|
84
|
+
- iron_worker_ng
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files:
|
87
|
+
- LICENSE
|
88
|
+
- README.md
|
89
|
+
files:
|
90
|
+
- LICENSE
|
91
|
+
- README.md
|
92
|
+
- VERSION
|
93
|
+
- bin/iron_worker_ng
|
94
|
+
- lib/iron_worker_ng.rb
|
95
|
+
- lib/iron_worker_ng/api_client.rb
|
96
|
+
- lib/iron_worker_ng/api_client_error.rb
|
97
|
+
- lib/iron_worker_ng/client.rb
|
98
|
+
- lib/iron_worker_ng/code/base.rb
|
99
|
+
- lib/iron_worker_ng/code/java.rb
|
100
|
+
- lib/iron_worker_ng/code/node.rb
|
101
|
+
- lib/iron_worker_ng/code/ruby.rb
|
102
|
+
- lib/iron_worker_ng/feature/base.rb
|
103
|
+
- lib/iron_worker_ng/feature/common/merge_dir.rb
|
104
|
+
- lib/iron_worker_ng/feature/common/merge_file.rb
|
105
|
+
- lib/iron_worker_ng/feature/java/merge_jar.rb
|
106
|
+
- lib/iron_worker_ng/feature/java/merge_worker.rb
|
107
|
+
- lib/iron_worker_ng/feature/node/merge_worker.rb
|
108
|
+
- lib/iron_worker_ng/feature/ruby/merge_gem.rb
|
109
|
+
- lib/iron_worker_ng/feature/ruby/merge_gemfile.rb
|
110
|
+
- lib/iron_worker_ng/feature/ruby/merge_worker.rb
|
111
|
+
- lib/iron_worker_ng/version.rb
|
112
|
+
homepage: http://www.iron.io
|
113
|
+
licenses: []
|
114
|
+
post_install_message:
|
115
|
+
rdoc_options: []
|
116
|
+
require_paths:
|
117
|
+
- lib
|
118
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
segments:
|
125
|
+
- 0
|
126
|
+
hash: 745459379
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 1.8.15
|
136
|
+
signing_key:
|
137
|
+
specification_version: 3
|
138
|
+
summary: New generation ruby client for IronWorker
|
139
|
+
test_files: []
|