rflow 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +3 -0
- data/Gemfile +2 -1
- data/Guardfile +1 -1
- data/README.md +9 -9
- data/Vagrantfile +9 -9
- data/bin/rflow +9 -9
- data/example/http_extensions.rb +7 -7
- data/lib/rflow.rb +24 -3
- data/lib/rflow/child_process.rb +2 -0
- data/lib/rflow/component.rb +2 -2
- data/lib/rflow/component/port.rb +51 -26
- data/lib/rflow/configuration.rb +4 -4
- data/lib/rflow/configuration/ruby_dsl.rb +4 -4
- data/lib/rflow/connection.rb +4 -4
- data/lib/rflow/connections/zmq_connection.rb +5 -7
- data/lib/rflow/daemon_process.rb +12 -2
- data/lib/rflow/logger.rb +1 -1
- data/lib/rflow/master.rb +2 -20
- data/lib/rflow/message.rb +28 -18
- data/lib/rflow/pid_file.rb +17 -5
- data/lib/rflow/shard.rb +6 -6
- data/lib/rflow/version.rb +1 -1
- data/rflow.gemspec +20 -20
- data/schema/message.avsc +6 -1
- data/spec/rflow/component/port_spec.rb +17 -17
- data/spec/rflow/components/clock_spec.rb +1 -1
- data/spec/rflow/configuration/ruby_dsl_spec.rb +47 -47
- data/spec/rflow/configuration_spec.rb +8 -8
- data/spec/rflow/forward_to_input_port_spec.rb +38 -9
- data/spec/rflow/forward_to_output_port_spec.rb +5 -4
- data/spec/rflow/logger_spec.rb +5 -5
- data/spec/rflow/message/data/raw_spec.rb +2 -2
- data/spec/rflow/message/data_spec.rb +8 -8
- data/spec/rflow/message_spec.rb +63 -29
- data/spec/rflow_spec.rb +18 -18
- metadata +14 -13
- data/NOTES +0 -187
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
class RFlow
|
4
4
|
describe ForwardToOutputPort do
|
5
5
|
before(:each) do
|
6
|
-
ActiveRecord::Base.establish_connection adapter:
|
6
|
+
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
|
7
7
|
Configuration.migrate_database
|
8
8
|
end
|
9
9
|
|
@@ -12,18 +12,19 @@ class RFlow
|
|
12
12
|
let(:generator) do
|
13
13
|
RFlow::Components::GenerateIntegerSequence.new.tap do |c|
|
14
14
|
c.configure!({})
|
15
|
-
c.out.direct_connect ruby_proc_filter.filtered
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
let(:
|
18
|
+
let(:accept_evens) do
|
20
19
|
RFlow::Components::RubyProcFilter.new.tap do |c|
|
21
20
|
c.configure! 'filter_proc_string' => 'message % 2 == 0'
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'should place the messages on the output port, regardless of the filter' do
|
26
|
-
|
25
|
+
generator.out.direct_connect accept_evens.filtered
|
26
|
+
|
27
|
+
accept_evens.filtered.collect_messages(nil, messages) do
|
27
28
|
5.times { generator.generate }
|
28
29
|
end
|
29
30
|
expect(messages.map(&:data).map(&:data_object)).to eq([0, 1, 2, 3, 4])
|
data/spec/rflow/logger_spec.rb
CHANGED
@@ -17,16 +17,16 @@ class RFlow
|
|
17
17
|
|
18
18
|
before(:each) { initialize_logger }
|
19
19
|
|
20
|
-
it
|
20
|
+
it 'should initialize correctly' do
|
21
21
|
expect(File.exist?(log_file_path)).to be true
|
22
22
|
|
23
|
-
logger.error
|
23
|
+
logger.error 'TESTTESTTEST'
|
24
24
|
expect(File.read(log_file_path)).to match(/TESTTESTTEST/)
|
25
25
|
|
26
26
|
logger.close
|
27
27
|
end
|
28
28
|
|
29
|
-
it
|
29
|
+
it 'should reopen correctly' do
|
30
30
|
moved_path = log_file_path + '.old'
|
31
31
|
|
32
32
|
expect(File.exist?(log_file_path)).to be true
|
@@ -36,13 +36,13 @@ class RFlow
|
|
36
36
|
|
37
37
|
logger.reopen
|
38
38
|
|
39
|
-
logger.error
|
39
|
+
logger.error 'TESTTESTTEST'
|
40
40
|
expect(File.read(log_file_path)).to match(/TESTTESTTEST/)
|
41
41
|
expect(File.read(moved_path)).not_to match(/TESTTESTTEST/)
|
42
42
|
|
43
43
|
logger.close
|
44
44
|
end
|
45
45
|
|
46
|
-
it
|
46
|
+
it 'should toggle log level'
|
47
47
|
end
|
48
48
|
end
|
@@ -7,11 +7,11 @@ class RFlow
|
|
7
7
|
describe 'Raw Avro Schema' do
|
8
8
|
let(:schema) { Configuration.available_data_types['RFlow::Message::Data::Raw']['avro'] }
|
9
9
|
|
10
|
-
it
|
10
|
+
it 'should load the schema' do
|
11
11
|
expect(schema).not_to be_nil
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
14
|
+
it 'should encode and decode an object' do
|
15
15
|
raw = {'raw' => Array.new(256) { rand(256) }.pack('c*')}
|
16
16
|
|
17
17
|
expect { encode_avro(schema, raw) }.to_not raise_error
|
@@ -9,13 +9,13 @@ class RFlow
|
|
9
9
|
let(:valid_schema) { '{"type": "string"}' }
|
10
10
|
let(:serialized_string) { encode_avro(valid_schema, string) }
|
11
11
|
|
12
|
-
context
|
13
|
-
it
|
12
|
+
context 'if created without a schema' do
|
13
|
+
it 'should throw an exception' do
|
14
14
|
expect { Data.new(nil) }.to raise_error(ArgumentError, /^Invalid schema/)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
context
|
18
|
+
context 'if created with an invalid schema for the serialization' do
|
19
19
|
['avro', :avro].each do |it|
|
20
20
|
it "should throw an exception for serialization type #{it.inspect}" do
|
21
21
|
expect { Data.new(invalid_schema, it) }.to raise_error(ArgumentError, /^Invalid schema/)
|
@@ -23,14 +23,14 @@ class RFlow
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
context
|
26
|
+
context 'if created with a valid avro schema' do
|
27
27
|
['avro', :avro].each do |it|
|
28
28
|
it "should instantiate correctly for serialization type #{it.inspect}" do
|
29
29
|
expect { Data.new(valid_schema, it) }.to_not raise_error
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
context
|
33
|
+
context 'if created with a non-avro data serialization' do
|
34
34
|
['unknown', :unknown, 'xml', :xml].each do |it|
|
35
35
|
it "should throw an exception for serialization type #{it.inspect}" do
|
36
36
|
expect { Data.new(valid_schema, it) }.to raise_error(
|
@@ -39,15 +39,15 @@ class RFlow
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
context
|
42
|
+
context 'if created with an avro serialization' do
|
43
43
|
['avro', :avro].each do |it|
|
44
44
|
it "should instantiate correctly for serialization type #{it.inspect}" do
|
45
45
|
expect { Data.new(valid_schema, it) }.to_not raise_error
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
context
|
50
|
-
it
|
49
|
+
context 'if created with a serialized data object' do
|
50
|
+
it 'should instantiate correctly' do
|
51
51
|
expect { Data.new(valid_schema, 'avro', serialized_string )}.to_not raise_error
|
52
52
|
end
|
53
53
|
end
|
data/spec/rflow/message_spec.rb
CHANGED
@@ -4,70 +4,70 @@ require 'rflow/message'
|
|
4
4
|
|
5
5
|
class RFlow
|
6
6
|
describe Message do
|
7
|
-
context
|
8
|
-
it
|
7
|
+
context 'if created with an unknown data type' do
|
8
|
+
it 'should throw an exception' do
|
9
9
|
expect { Message.new('non_existent_data_type') }.to raise_error(
|
10
10
|
ArgumentError, "Data type 'non_existent_data_type' with serialization_type 'avro' not found")
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
context
|
14
|
+
context 'if created with a known data type' do
|
15
15
|
before(:all) do
|
16
16
|
@schema = '{"type": "string"}'
|
17
17
|
Configuration.add_available_data_type(:string_type, 'avro', @schema)
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
20
|
+
it 'should instantiate correctly' do
|
21
21
|
expect { Message.new('string_type') }.to_not raise_error
|
22
22
|
end
|
23
23
|
|
24
|
-
context
|
25
|
-
context
|
24
|
+
context 'if created with empty provenance' do
|
25
|
+
context 'if created with an unknown data serialization' do
|
26
26
|
['unknown', :unknown].each do |it|
|
27
27
|
it "should throw an exception for #{it.inspect}" do
|
28
|
-
expect { Message.new('string_type', [], it) }.to raise_error(
|
28
|
+
expect { Message.new('string_type', [], {}, it) }.to raise_error(
|
29
29
|
ArgumentError, "Data type 'string_type' with serialization_type 'unknown' not found")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
context
|
34
|
+
context 'if created with a known data serialization' do
|
35
35
|
['avro', :avro].each do |it|
|
36
36
|
it "should instantiate correctly for #{it.inspect}" do
|
37
|
-
expect { Message.new('string_type', [], it) }.to_not raise_error
|
37
|
+
expect { Message.new('string_type', [], {}, it) }.to_not raise_error
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
context
|
41
|
+
context 'if created with a mismatched schema' do
|
42
42
|
it
|
43
43
|
end
|
44
|
-
context
|
44
|
+
context 'if created with a matched schema' do
|
45
45
|
it
|
46
46
|
end
|
47
47
|
|
48
|
-
context
|
49
|
-
context
|
48
|
+
context 'if created with a nil schema' do
|
49
|
+
context 'if created with a serialized data object' do
|
50
50
|
let(:serialized_string) { encode_avro(@schema, 'this is a string to be serialized') }
|
51
51
|
|
52
|
-
it
|
53
|
-
expect { Message.new('string_type', [], 'avro', nil, serialized_string) }.to_not raise_error
|
52
|
+
it 'should instantiate correctly' do
|
53
|
+
expect { Message.new('string_type', [], {}, 'avro', nil, serialized_string) }.to_not raise_error
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
context
|
60
|
+
context 'if created with invalid provenance' do
|
61
61
|
let(:invalid_processing_event_hash) { {'started_at' => 'bad time string'} }
|
62
62
|
let(:invalid_provenance) { [invalid_processing_event_hash] }
|
63
63
|
|
64
|
-
it
|
64
|
+
it 'should throw an exception' do
|
65
65
|
expect { Message.new('string_type', invalid_provenance) }.to raise_error(
|
66
66
|
ArgumentError, 'invalid date: "bad time string"')
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
context
|
70
|
+
context 'if created with valid provenance' do
|
71
71
|
let(:valid_xmlschema_time) { '2001-01-01T01:01:01.000001Z' }
|
72
72
|
let(:valid_processing_event_hash) { {'component_instance_uuid' => 'uuid', 'started_at' => valid_xmlschema_time } }
|
73
73
|
let(:valid_processing_event) { Message::ProcessingEvent.new('uuid', valid_xmlschema_time, valid_xmlschema_time, 'context') }
|
@@ -77,11 +77,11 @@ class RFlow
|
|
77
77
|
valid_processing_event]
|
78
78
|
end
|
79
79
|
|
80
|
-
it
|
80
|
+
it 'should instantiate correctly' do
|
81
81
|
expect { Message.new('string_type', valid_provenance) }.to_not raise_error
|
82
82
|
end
|
83
83
|
|
84
|
-
it
|
84
|
+
it 'should correctly set the provenance processing events' do
|
85
85
|
Message.new('string_type', valid_provenance).provenance[1].tap do |p|
|
86
86
|
expect(p.component_instance_uuid).to eq('uuid')
|
87
87
|
expect(p.started_at).to eq(Time.xmlschema(valid_xmlschema_time))
|
@@ -90,16 +90,50 @@ class RFlow
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
it
|
93
|
+
it 'should to_hash its provenance correctly' do
|
94
94
|
expect(Message.new('string_type', valid_provenance).provenance.map(&:to_hash)).to eq([
|
95
|
-
{
|
96
|
-
{
|
97
|
-
{
|
95
|
+
{'component_instance_uuid' => 'uuid', 'started_at' => nil, 'completed_at' => nil, 'context' => nil},
|
96
|
+
{'component_instance_uuid' => 'uuid', 'started_at' => valid_xmlschema_time, 'completed_at' => nil, 'context' => nil},
|
97
|
+
{'component_instance_uuid' => 'uuid', 'started_at' => valid_xmlschema_time, 'completed_at' => valid_xmlschema_time, 'context' => 'context'}])
|
98
98
|
end
|
99
|
+
|
100
|
+
it "should not serialize data that doesn't match the schema" do
|
101
|
+
message = Message.new('string_type')
|
102
|
+
expect { message.to_avro }.to raise_error(::Avro::IO::AvroTypeError)
|
103
|
+
message.data.data_object = 'data'
|
104
|
+
expect { message.to_avro }.to_not raise_error
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'if given properties' do
|
109
|
+
it 'should initialize and serialize with valid properties' do
|
110
|
+
properties = { 'boom' => 'boom', 'down' => 'town' }
|
111
|
+
message = Message.new('string_type', nil, properties)
|
112
|
+
expect(message.properties).to eq(properties)
|
113
|
+
|
114
|
+
message.data.data_object = 'data'
|
115
|
+
|
116
|
+
Message.from_avro(message.to_avro).tap do |processed|
|
117
|
+
expect(processed.properties).to eq(properties)
|
118
|
+
expect(processed.properties['boom']).to eq(message.properties['boom'])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should stringify non-string properties' do
|
123
|
+
properties = { :boom => :town }
|
124
|
+
message = Message.new('string_type', nil, properties)
|
125
|
+
|
126
|
+
message.data.data_object = 'data'
|
127
|
+
|
128
|
+
Message.from_avro(message.to_avro).tap do |processed|
|
129
|
+
expect(processed.properties['boom']).to eq(message.properties[:boom].to_s)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
99
133
|
end
|
100
134
|
|
101
|
-
context
|
102
|
-
it
|
135
|
+
context 'if correctly created' do
|
136
|
+
it 'should serialize and deserialize correctly to/from avro' do
|
103
137
|
message = Message.new('string_type').tap do |m|
|
104
138
|
m.provenance << Message::ProcessingEvent.new('UUID')
|
105
139
|
m.data.data_object = 'teh awesome'
|
@@ -112,8 +146,8 @@ class RFlow
|
|
112
146
|
end
|
113
147
|
end
|
114
148
|
|
115
|
-
context
|
116
|
-
it
|
149
|
+
context 'if data extensions exist' do
|
150
|
+
it 'should extend the data element with the extension' do
|
117
151
|
module ExtensionModule; def ext_method; end; end
|
118
152
|
|
119
153
|
message = Message.new('string_type')
|
@@ -126,7 +160,7 @@ class RFlow
|
|
126
160
|
end
|
127
161
|
end
|
128
162
|
|
129
|
-
it
|
163
|
+
it 'should correctly handle large raw types' do
|
130
164
|
message = Message.new('RFlow::Message::Data::Raw').tap do |m|
|
131
165
|
m.data.raw = Array.new(101) { rand(256) }.pack('c*')
|
132
166
|
end
|
data/spec/rflow_spec.rb
CHANGED
@@ -37,7 +37,7 @@ describe RFlow do
|
|
37
37
|
|
38
38
|
# Grab all the pids from the log, which seems to be the only
|
39
39
|
# reliable way to get them
|
40
|
-
log_lines.map {|line| /\((\d+)\)/.match(line)[1].to_i }.uniq
|
40
|
+
log_lines.map {|line| /\(\s*(\d+)\s*\)/.match(line)[1].to_i }.uniq
|
41
41
|
end
|
42
42
|
|
43
43
|
def run_and_shutdown(app_name, expected_worker_count)
|
@@ -64,7 +64,7 @@ describe RFlow do
|
|
64
64
|
yield # verify output
|
65
65
|
|
66
66
|
# Terminate the master
|
67
|
-
expect(Process.kill(
|
67
|
+
expect(Process.kill('TERM', master_pid)).to eq(1)
|
68
68
|
|
69
69
|
# Make sure everything is dead after a second
|
70
70
|
sleep 2
|
@@ -72,7 +72,7 @@ describe RFlow do
|
|
72
72
|
expect { Process.kill(0, pid) }.to raise_error(Errno::ESRCH)
|
73
73
|
end
|
74
74
|
rescue Exception => e
|
75
|
-
Process.kill(
|
75
|
+
Process.kill('TERM', master_pid) if master_pid
|
76
76
|
raise
|
77
77
|
end
|
78
78
|
|
@@ -94,13 +94,13 @@ describe RFlow do
|
|
94
94
|
|
95
95
|
after(:each) { Dir.chdir @original_directory_path }
|
96
96
|
|
97
|
-
context
|
97
|
+
context 'when executing from the test script' do
|
98
98
|
before(:all) { load @extensions_file_name }
|
99
99
|
|
100
100
|
describe '.run!' do
|
101
101
|
def run_rflow_with_dsl(&block)
|
102
102
|
rflow_thread = Thread.new do
|
103
|
-
ActiveRecord::Base.establish_connection adapter:
|
103
|
+
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
|
104
104
|
RFlow::Configuration.migrate_database
|
105
105
|
RFlow::Configuration::RubyDSL.configure {|c| block.call(c) }
|
106
106
|
RFlow::Configuration.merge_defaults!
|
@@ -117,7 +117,7 @@ describe RFlow do
|
|
117
117
|
rflow_thread.join
|
118
118
|
end
|
119
119
|
|
120
|
-
it
|
120
|
+
it 'should run a non-sharded workflow' do
|
121
121
|
run_rflow_with_dsl do |c|
|
122
122
|
c.setting 'rflow.log_level', 'ERROR'
|
123
123
|
c.setting 'rflow.application_directory_path', @temp_directory_path
|
@@ -158,7 +158,7 @@ describe RFlow do
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
-
it
|
161
|
+
it 'should run a sharded workflow' do
|
162
162
|
run_rflow_with_dsl do |c|
|
163
163
|
c.setting 'rflow.log_level', 'ERROR'
|
164
164
|
c.setting 'rflow.application_directory_path', @temp_directory_path
|
@@ -207,7 +207,7 @@ describe RFlow do
|
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
210
|
-
it
|
210
|
+
it 'should deliver broadcast messages to every copy of a shard' do
|
211
211
|
run_rflow_with_dsl do |c|
|
212
212
|
c.setting 'rflow.log_level', 'FATAL'
|
213
213
|
c.setting 'rflow.application_directory_path', @temp_directory_path
|
@@ -249,8 +249,8 @@ describe RFlow do
|
|
249
249
|
end
|
250
250
|
end
|
251
251
|
|
252
|
-
context
|
253
|
-
context
|
252
|
+
context 'when executing via the rflow binary' do
|
253
|
+
context 'with a simple ruby DSL config file' do
|
254
254
|
before(:each) do
|
255
255
|
write_config_file <<-EOF
|
256
256
|
RFlow::Configuration::RubyDSL.configure do |c|
|
@@ -259,14 +259,14 @@ describe RFlow do
|
|
259
259
|
EOF
|
260
260
|
end
|
261
261
|
|
262
|
-
it
|
262
|
+
it 'should load a ruby dsl file into a sqlite DB' do
|
263
263
|
load_database
|
264
264
|
|
265
|
-
ActiveRecord::Base.establish_connection adapter:
|
265
|
+
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: db_file_name
|
266
266
|
expect(RFlow::Configuration::Setting.where(:name => 'mysetting').first.value).to eq('myvalue')
|
267
267
|
end
|
268
268
|
|
269
|
-
it
|
269
|
+
it 'should not load a database if the database file already exists' do
|
270
270
|
File.open(db_file_name, 'w') {|file| file.write 'boom' }
|
271
271
|
|
272
272
|
r = execute_rflow("load -d #{db_file_name} -c #{config_file_name}")
|
@@ -278,7 +278,7 @@ describe RFlow do
|
|
278
278
|
end
|
279
279
|
end
|
280
280
|
|
281
|
-
context
|
281
|
+
context 'with a component that runs subshells' do
|
282
282
|
let(:app_name) { 'sharded_subshell_test' }
|
283
283
|
|
284
284
|
before(:each) do
|
@@ -300,15 +300,15 @@ describe RFlow do
|
|
300
300
|
load_database
|
301
301
|
end
|
302
302
|
|
303
|
-
it
|
303
|
+
it 'should run successfully daemonize and run in the background' do
|
304
304
|
run_and_shutdown app_name, 1 do # 1 default worker
|
305
305
|
expect(File.exist?(File.join(@temp_directory_path, 'out1'))).to be true
|
306
|
-
File.readlines('out1').each {|line| expect(line).to match /\w+ \w
|
306
|
+
File.readlines('out1').each {|line| expect(line).to match /\w+ \w+\s+\d+ \d+:\d+:\d+ \w+ \d+/ }
|
307
307
|
end
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
311
|
-
context
|
311
|
+
context 'with a complex, sharded ruby DSL config file' do
|
312
312
|
let(:app_name) { 'sharded_bin_test' }
|
313
313
|
|
314
314
|
before(:each) do
|
@@ -352,7 +352,7 @@ describe RFlow do
|
|
352
352
|
expect(r[:stdout]).to match /error/i
|
353
353
|
end
|
354
354
|
|
355
|
-
it
|
355
|
+
it 'should daemonize and run in the background' do
|
356
356
|
output_files = {
|
357
357
|
'out1' => [0, 3, 6, 9] * 3,
|
358
358
|
'out2' => (20..30).to_a * 2,
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- John Stoneham
|
7
8
|
- Michael L. Artz
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2016-06-14 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: uuidtools
|
@@ -44,14 +45,14 @@ dependencies:
|
|
44
45
|
requirements:
|
45
46
|
- - "~>"
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.1
|
48
|
+
version: '1.1'
|
48
49
|
type: :runtime
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.1
|
55
|
+
version: '1.1'
|
55
56
|
- !ruby/object:Gem::Dependency
|
56
57
|
name: sqlite3
|
57
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,26 +87,26 @@ dependencies:
|
|
86
87
|
requirements:
|
87
88
|
- - "~>"
|
88
89
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.7
|
90
|
+
version: '1.7'
|
90
91
|
type: :runtime
|
91
92
|
prerelease: false
|
92
93
|
version_requirements: !ruby/object:Gem::Requirement
|
93
94
|
requirements:
|
94
95
|
- - "~>"
|
95
96
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.7
|
97
|
+
version: '1.7'
|
97
98
|
- !ruby/object:Gem::Dependency
|
98
99
|
name: em-zeromq
|
99
100
|
requirement: !ruby/object:Gem::Requirement
|
100
101
|
requirements:
|
101
|
-
- -
|
102
|
+
- - "~>"
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: 0.5.0
|
104
105
|
type: :runtime
|
105
106
|
prerelease: false
|
106
107
|
version_requirements: !ruby/object:Gem::Requirement
|
107
108
|
requirements:
|
108
|
-
- -
|
109
|
+
- - "~>"
|
109
110
|
- !ruby/object:Gem::Version
|
110
111
|
version: 0.5.0
|
111
112
|
- !ruby/object:Gem::Dependency
|
@@ -114,14 +115,14 @@ dependencies:
|
|
114
115
|
requirements:
|
115
116
|
- - "~>"
|
116
117
|
- !ruby/object:Gem::Version
|
117
|
-
version: '1
|
118
|
+
version: '1'
|
118
119
|
type: :development
|
119
120
|
prerelease: false
|
120
121
|
version_requirements: !ruby/object:Gem::Requirement
|
121
122
|
requirements:
|
122
123
|
- - "~>"
|
123
124
|
- !ruby/object:Gem::Version
|
124
|
-
version: '1
|
125
|
+
version: '1'
|
125
126
|
- !ruby/object:Gem::Dependency
|
126
127
|
name: rspec
|
127
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -181,7 +182,8 @@ dependencies:
|
|
181
182
|
description: A Ruby flow-based programming framework that utilizes ZeroMQ for component
|
182
183
|
connections and Avro for serialization
|
183
184
|
email:
|
184
|
-
-
|
185
|
+
- john.stoneham@redjack.com
|
186
|
+
- mlartz@gmail.com
|
185
187
|
executables:
|
186
188
|
- rflow
|
187
189
|
extensions: []
|
@@ -196,7 +198,6 @@ files:
|
|
196
198
|
- Gemfile
|
197
199
|
- Guardfile
|
198
200
|
- LICENSE
|
199
|
-
- NOTES
|
200
201
|
- README.VAGRANT
|
201
202
|
- README.md
|
202
203
|
- Rakefile
|
@@ -277,7 +278,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
278
|
version: '0'
|
278
279
|
requirements: []
|
279
280
|
rubyforge_project:
|
280
|
-
rubygems_version: 2.
|
281
|
+
rubygems_version: 2.5.1
|
281
282
|
signing_key:
|
282
283
|
specification_version: 4
|
283
284
|
summary: A Ruby flow-based programming framework
|