maestro_plugin 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,4 +1,3 @@
1
- *.gem
2
1
  *.rbc
3
2
  .bundle
4
3
  .config
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- maestro_plugin (0.0.2)
4
+ maestro_plugin (0.0.4)
5
5
  json (>= 1.4.6)
6
6
  logging (= 1.8.0)
7
7
  rubyzip (= 0.9.8)
@@ -18,7 +18,7 @@ GEM
18
18
  logging (1.8.0)
19
19
  little-plugger (>= 1.1.3)
20
20
  multi_json (>= 1.3.6)
21
- multi_json (1.3.6)
21
+ multi_json (1.7.2)
22
22
  rake (10.0.4)
23
23
  rspec (2.13.0)
24
24
  rspec-core (~> 2.13.0)
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- maestro_plugin Gem
2
- ===================
1
+ Maestro Ruby Plugin Gem
2
+ =======================
3
3
 
4
4
  Library For Creating Ruby Based Maestro Plugins
5
5
  =======
data/Rakefile CHANGED
@@ -4,24 +4,14 @@ require 'rake/clean'
4
4
 
5
5
  require File.expand_path('../lib/maestro_plugin/version', __FILE__)
6
6
 
7
- CLEAN.include([ 'pkg', '*.gem'])
7
+ CLEAN.include('pkg')
8
+ CLOBBER.include('.bundle', '.config', 'coverage', 'InstalledFiles', 'spec/reports', 'rdoc', 'test', 'tmp')
8
9
 
9
- task :default => [:build]
10
+ task :default => [:clean, :bundle, :spec, :build]
10
11
 
11
- desc 'Run specs'
12
- RSpec::Core::RakeTask.new do |t|
13
- t.pattern = './spec/**/*_spec.rb' # don't need this, it's default.
14
- t.rspec_opts = '--fail-fast --format p --color'
15
- # Put spec opts in a file named .rspec in root
16
- end
12
+ RSpec::Core::RakeTask.new
17
13
 
18
14
  desc 'Get dependencies with Bundler'
19
15
  task :bundle do
20
- system 'bundle install'
21
- end
22
-
23
- task :build => [:clean, :bundle, :spec]
24
- task :build do
25
- system 'gem build maestro_plugin.gemspec'
16
+ sh %{bundle install}
26
17
  end
27
-
@@ -129,18 +129,44 @@ module Maestro
129
129
  end
130
130
 
131
131
  # Sends the specified ouput string to the server for persistence
132
- def write_output(output)
133
- return if output.gsub(/\n/, '').empty?
132
+ # If called with :buffer as an option, the output will be queued up until a number of writes has occurred, or
133
+ # a reasonable period since the last sent occurred.
134
+ # Any call without the :buffer option will cause any buffered output to be sent immediately.
135
+ #
136
+ # Example:
137
+ # write_output("I am Sam\n") <-- send immediately
138
+ # write_output("Sam I am\n", :buffer => true) <-- buffer for later
139
+ # write_output("I like Ham\n") <-- sends 'Sam I am\nI like Ham\n'
140
+ def write_output(output, options = {})
141
+ # First time thru? We need to do some setup!
142
+ reset_buffered_output if @buffered_output.nil?
143
+
144
+ # If we have data and its not just a newline add it
145
+ if output && !output.gsub(/\n/, '').empty?
146
+ @buffered_output += output
147
+ end
134
148
 
135
- workitem[OUTPUT_META] = output
136
- workitem[STREAMING_META] = true
137
- send_workitem_message
149
+ # If a) we have data to write, and
150
+ # b) its been > 2 seconds since we last sent
151
+ #
152
+ # The 2 second factor is there to allow slowly accumulating data to be sent out more regularly.
153
+ if !@buffered_output.empty? && (!options[:buffer] || Time.now - @last_write_output > 2)
154
+ workitem[OUTPUT_META] = @buffered_output
155
+ workitem[STREAMING_META] = true
156
+ send_workitem_message
157
+ reset_buffered_output
158
+ end
138
159
  rescue Exception => e
139
160
  Maestro.log.warn "Unable To Write Output To Server #{e.class} #{e}: #{e.backtrace.join("\n")}"
140
161
  ensure
141
162
  workitem.delete(STREAMING_META)
142
163
  end
143
164
 
165
+ def reset_buffered_output
166
+ @buffered_output = ''
167
+ @last_write_output = Time.now
168
+ end
169
+
144
170
  def error
145
171
  fields[ERROR_META]
146
172
  end
@@ -243,10 +269,13 @@ module Maestro
243
269
 
244
270
  # end persistence
245
271
 
246
- def get_field(field)
247
- fields[field]
272
+ # Get a field from workitem, supporting default value
273
+ def get_field(field, default = nil)
274
+ value = fields[field]
275
+ value = default if !default.nil? && (value.nil? || (value.respond_to?(:empty?) && value.empty?))
276
+ value
248
277
  end
249
-
278
+
250
279
  def fields
251
280
  workitem['fields']
252
281
  end
@@ -1,5 +1,5 @@
1
1
  module Maestro
2
2
  module Plugin
3
- VERSION = '0.0.2'
3
+ VERSION = '0.0.3'
4
4
  end
5
5
  end
@@ -29,7 +29,7 @@ describe Maestro::MaestroWorker do
29
29
  before :each do
30
30
  @workitem = {'fields' => {}}
31
31
  @ruote_participants = double("ruote_participants")
32
- @ruote_participants.should_receive(:send_workitem_message).with(@workitem)
32
+ @ruote_participants.should_receive(:send_workitem_message).at_least(:once).with(@workitem)
33
33
 
34
34
  @worker = Maestro::MaestroWorker.new
35
35
  @worker.stub(:ruote_participants => @ruote_participants)
@@ -37,40 +37,68 @@ describe Maestro::MaestroWorker do
37
37
  @worker.should_receive(:send_workitem_message).at_least(:once).and_call_original
38
38
 
39
39
  end
40
-
40
+
41
41
  it 'should send a write_output message' do
42
42
  @worker.write_output('Some Silly String')
43
43
  @worker.workitem['__output__'].should eql('Some Silly String')
44
44
  @worker.workitem['__streaming__'].should be_nil
45
45
  end
46
-
46
+
47
+ it 'should aggregate output' do
48
+ @worker.write_output('Some Silly String')
49
+ @worker.workitem['__output__'].should eql('Some Silly String')
50
+ @worker.workitem['__streaming__'].should be_nil
51
+
52
+ @worker.write_output("1", :buffer => true)
53
+ @worker.workitem['__output__'].should eql('Some Silly String')
54
+ @worker.workitem['__streaming__'].should be_nil
55
+ @worker.write_output("22", :buffer => true)
56
+ @worker.workitem['__output__'].should eql('Some Silly String')
57
+ @worker.workitem['__streaming__'].should be_nil
58
+
59
+ # Should auto-send after 2 second delay
60
+ sleep 3
61
+ @worker.write_output("333", :buffer => true)
62
+ @worker.workitem['__output__'].should eql('122333')
63
+ @worker.workitem['__streaming__'].should be_nil
64
+ @worker.write_output("4444", :buffer => true)
65
+ @worker.workitem['__output__'].should eql('122333')
66
+ @worker.workitem['__streaming__'].should be_nil
67
+
68
+ # When called without aggregate, should purge
69
+ @worker.write_output("5555")
70
+ @worker.workitem['__output__'].should eql('44445555')
71
+ @worker.workitem['__streaming__'].should be_nil
72
+ end
73
+
47
74
  it 'should send a not needed message' do
48
75
  @worker.not_needed
49
76
  @worker.workitem['__not_needed__'].should be_nil
50
77
  end
51
-
78
+
52
79
  it 'should send a cancel message' do
53
80
  @worker.cancel
54
81
  @worker.workitem['__cancel__'].should be_nil
55
82
  end
56
-
83
+
57
84
  it 'should send a set_waiting message' do
58
- @ruote_participants.should_receive(:send_workitem_message).with(@workitem)
85
+ # expects already in before :each block, so putting it here too causes test fail
86
+ # @ruote_participants.should_receive(:send_workitem_message).with(@workitem)
59
87
  @worker.set_waiting(true)
60
88
  @worker.workitem['__waiting__'].should be_true
61
-
89
+
62
90
  @worker.set_waiting(false)
63
91
  @worker.workitem['__waiting__'].should be_nil
64
92
  end
65
-
93
+
66
94
  it 'should send a create record message' do
67
95
  @worker.create_record_with_fields('cars', ['manu', 'date', 'name'], ['ferrari', '1964', '250 GTO'])
68
-
96
+
69
97
  @worker.workitem['__model__'].should eql('cars')
70
98
  @worker.workitem['__record_fields__'].should eql('manu,date,name')
71
99
  @worker.workitem['__record_values__'].should eql('ferrari,1964,250 GTO')
72
100
  end
73
-
101
+
74
102
  it 'should send a create record message with a hash' do
75
103
  fields = {'manu' => 'ferrari', 'date' => '1964', 'name' => 'GTO'}
76
104
  @worker.create_record_with_fields('cars', fields)
@@ -80,13 +108,13 @@ describe Maestro::MaestroWorker do
80
108
 
81
109
  it 'should send an update record-field message' do
82
110
  @worker.update_fields_in_record('animal', 'donkey', 'name', 'e-or')
83
-
111
+
84
112
  @worker.workitem['__model__'].should eql('animal')
85
113
  @worker.workitem['__record_id__'].should eql('donkey')
86
114
  @worker.workitem['__record_field__'].should eql('name')
87
115
  @worker.workitem['__record_value__'].should eql('e-or')
88
116
  end
89
-
117
+
90
118
  it 'should send a delete record message' do
91
119
  @worker.delete_record('animal', 1)
92
120
  @worker.workitem['__model__'].should eql('animal')
@@ -101,8 +129,8 @@ describe Maestro::MaestroWorker do
101
129
  @worker.workitem['__filter__'].should eql(filter)
102
130
  @worker.workitem['__name__'].should be_nil
103
131
  end
104
- end
105
-
132
+ end
133
+
106
134
  describe 'Field handling' do
107
135
  before :each do
108
136
  @worker = Maestro::MaestroWorker.new
@@ -136,7 +164,5 @@ describe Maestro::MaestroWorker do
136
164
  @worker.is_json?('a string').should be_false
137
165
  end
138
166
 
139
-
140
-
141
167
  end
142
168
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: maestro_plugin
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Etienne Pelletier
@@ -10,85 +10,85 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2013-04-04 00:00:00 Z
13
+ date: 2013-04-23 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: logging
17
- version_requirements: &id001 !ruby/object:Gem::Requirement
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
18
19
  none: false
19
20
  requirements:
20
21
  - - "="
21
22
  - !ruby/object:Gem::Version
22
23
  version: 1.8.0
23
- requirement: *id001
24
- prerelease: false
25
24
  type: :runtime
25
+ version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rubyzip
28
- version_requirements: &id002 !ruby/object:Gem::Requirement
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
29
30
  none: false
30
31
  requirements:
31
32
  - - "="
32
33
  - !ruby/object:Gem::Version
33
34
  version: 0.9.8
34
- requirement: *id002
35
- prerelease: false
36
35
  type: :runtime
36
+ version_requirements: *id002
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: json
39
- version_requirements: &id003 !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
40
41
  none: false
41
42
  requirements:
42
43
  - - ">="
43
44
  - !ruby/object:Gem::Version
44
45
  version: 1.4.6
45
- requirement: *id003
46
- prerelease: false
47
46
  type: :runtime
47
+ version_requirements: *id003
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: bundler
50
- version_requirements: &id004 !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
51
52
  none: false
52
53
  requirements:
53
54
  - - ~>
54
55
  - !ruby/object:Gem::Version
55
56
  version: "1.3"
56
- requirement: *id004
57
- prerelease: false
58
57
  type: :development
58
+ version_requirements: *id004
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rake
61
- version_requirements: &id005 !ruby/object:Gem::Requirement
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
62
63
  none: false
63
64
  requirements:
64
65
  - - ">="
65
66
  - !ruby/object:Gem::Version
66
67
  version: "0"
67
- requirement: *id005
68
- prerelease: false
69
68
  type: :development
69
+ version_requirements: *id005
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: jruby-openssl
72
- version_requirements: &id006 !ruby/object:Gem::Requirement
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
73
74
  none: false
74
75
  requirements:
75
76
  - - ">="
76
77
  - !ruby/object:Gem::Version
77
78
  version: "0"
78
- requirement: *id006
79
- prerelease: false
80
79
  type: :development
80
+ version_requirements: *id006
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: rspec
83
- version_requirements: &id007 !ruby/object:Gem::Requirement
83
+ prerelease: false
84
+ requirement: &id007 !ruby/object:Gem::Requirement
84
85
  none: false
85
86
  requirements:
86
87
  - - ~>
87
88
  - !ruby/object:Gem::Version
88
89
  version: 2.13.0
89
- requirement: *id007
90
- prerelease: false
91
90
  type: :development
91
+ version_requirements: *id007
92
92
  description: A ruby library to help with the creation of Maestro plugins
93
93
  email:
94
94
  - epelletier@maestrodev.com
@@ -126,18 +126,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - ">="
128
128
  - !ruby/object:Gem::Version
129
- hash: 2
130
- segments:
131
- - 0
132
129
  version: "0"
133
130
  required_rubygems_version: !ruby/object:Gem::Requirement
134
131
  none: false
135
132
  requirements:
136
133
  - - ">="
137
134
  - !ruby/object:Gem::Version
138
- hash: 2
139
- segments:
140
- - 0
141
135
  version: "0"
142
136
  requirements: []
143
137