cloudfactory 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,10 @@
1
+ ## 0.4.5 (2012-02-01)
2
+
3
+ * Gold Standard added for line
4
+ * Gold Standard added for station
5
+ * Badge added for the station
6
+ * Test run added for test the production
7
+
1
8
  ## 0.4.4 (2011-12-21)
2
9
 
3
10
  * Skill badge max_badges must be greater than 100
data/lib/cf.rb CHANGED
@@ -91,4 +91,7 @@ require "#{directory}/cf/run"
91
91
  require "#{directory}/cf/department"
92
92
  require "#{directory}/cf/robot_worker"
93
93
  require "#{directory}/cf/version"
94
- require "#{directory}/cf/output_format"
94
+ require "#{directory}/cf/output_format"
95
+ require "#{directory}/cf/gold_standard"
96
+ require "#{directory}/cf/badge"
97
+ require "#{directory}/cf/test_run"
@@ -0,0 +1,59 @@
1
+ module CF
2
+ class Badge
3
+ require 'httparty'
4
+ include Client
5
+
6
+ # goldstandard settings
7
+ attr_accessor :settings
8
+
9
+ #Badge name
10
+ attr_accessor :name
11
+
12
+ # the description for the badge
13
+ attr_accessor :description
14
+
15
+ # number of badge provided to the worker
16
+ attr_accessor :max_badges
17
+
18
+ # Contains error message
19
+ attr_accessor :errors
20
+
21
+ def initialize(options={})
22
+ options.symbolize_keys!
23
+ if (!options.blank? && options[:test_attributes][:form_attributes].present?)
24
+ form = options[:test_attributes][:form_attributes]
25
+ if( form[:type] == "CustomTaskForm" && form[:file])
26
+ raw_html = ""
27
+ File.open("#{form[:file]}").each_line do |line|
28
+ raw_html += line
29
+ end
30
+ options[:test_attributes][:form_attributes].merge!({:raw_html => raw_html,:_type =>"CustomTaskForm"})
31
+ end
32
+ options[:test_attributes][:form_attributes].merge!({:_type =>"TaskForm"}) if form[:type] == "TaskForm"
33
+ end
34
+ @settings = options
35
+ @station = options[:station] if options[:station].nil? ? nil : options[:station]
36
+ @line = options[:line] if options[:line].nil? ? nil : options[:line]
37
+ if !@line.nil? && @station
38
+ options.delete(:station) if @settings[:station].present?
39
+ options.delete(:line)
40
+ request =
41
+ {
42
+ :body =>
43
+ {
44
+ :api_key => CF.api_key,
45
+ :badge => options
46
+ }
47
+ }
48
+
49
+ resp = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{@line.title.downcase}/stations/#{@station.index}/badges.json",request)
50
+ @station.badges = self
51
+ self.errors = resp.parsed_response['error']['message'] if resp.code != 200
52
+ end
53
+ end
54
+
55
+ def self.create(*args)
56
+ Badge.new(args.first)
57
+ end
58
+ end
59
+ end
@@ -34,6 +34,12 @@ module Cf # :nodoc: all
34
34
  include Thor::Actions
35
35
  include Cf::Config
36
36
 
37
+ def help(*args)
38
+ File.open(File.expand_path(File.dirname(__FILE__)+"/help.txt")).each_line{ |s|
39
+ say s
40
+ }
41
+ end
42
+
37
43
  map "-v" => :version
38
44
 
39
45
  desc "login", "Setup the cloudfactory credentials"
@@ -72,14 +72,14 @@ module Cf # :nodoc: all
72
72
  if resp_line.nil?
73
73
  say("Line does not exist entitled #{line_title} !!!", :red) and exit(1)
74
74
  else
75
- line = Hashie::Mash.new(resp_line)
75
+ line = Hashie::Mash.new(resp_line)
76
76
  end
77
77
  if line.title == line_title && !resp_line.nil?
78
78
  if options.force
79
79
  CF::Line.destroy(line_title, :forced => true)
80
80
  say("The line #{line_title} deleted forcefully!", :yellow)
81
81
  else
82
-
82
+
83
83
  # Check whether this line has existing runs or not
84
84
  resp_runs = CF::Run.all({:line_title => line_title})
85
85
 
@@ -154,162 +154,215 @@ module Cf # :nodoc: all
154
154
  return
155
155
  end
156
156
  errors = validate(yaml_source)
157
-
157
+
158
158
  if errors.present?
159
159
  say("Invalid line.yml file. Correct its structure as per the errors shown below.", :red)
160
160
  errors.each {|error| say(" #{error}", :cyan)}
161
161
  exit(1)
162
162
  end
163
-
163
+
164
164
  set_target_uri(false)
165
165
  set_api_key(yaml_source)
166
166
 
167
- CF.account_name = CF::Account.info['name']
167
+ CF.account_name = CF::Account.info['name']
168
168
 
169
- line_dump = YAML::load(File.read(yaml_source).strip)
170
- line_title = line_dump['title'].parameterize
171
- line_description = line_dump['description']
172
- line_department = line_dump['department']
173
- line_public = line_dump['public']
174
-
175
- line = CF::Line.info(line_title)
176
- if line['error'].blank? && options.force?
177
- rollback(line.title)
178
- elsif line['error'].blank?
179
- say("This line already exist.", :yellow)
180
- override = agree("Do you want to override? [y/n] ")
181
- if override
182
- say("Deleting the line forcefuly..", :yellow)
183
- rollback(line['title'])
184
- else
185
- say("Line creation aborted!!", :yellow) and exit(1)
186
- end
169
+ line_dump = YAML::load(File.read(yaml_source).strip)
170
+ line_title = line_dump['title'].parameterize
171
+ line_description = line_dump['description']
172
+ line_department = line_dump['department']
173
+ line_public = line_dump['public']
174
+
175
+ line = CF::Line.info(line_title)
176
+ if line['error'].blank? && options.force?
177
+ rollback(line.title)
178
+ elsif line['error'].blank?
179
+ say("This line already exist.", :yellow)
180
+ override = agree("Do you want to override? [y/n] ")
181
+ if override
182
+ say("Deleting the line forcefuly..", :yellow)
183
+ rollback(line['title'])
184
+ else
185
+ say("Line creation aborted!!", :yellow) and exit(1)
187
186
  end
188
- line = CF::Line.new(line_title, line_department, {:description => line_description, :public => line_public})
189
- say "Creating new assembly line: #{line.title}", :green
190
- say("Error: #{line.errors}", :red) and exit(1) if line.errors.present?
191
-
192
- say "Adding InputFormats", :green
193
-
194
- # Creation of InputFormat from yaml file
195
- input_formats = line_dump['input_formats']
196
- input_formats.each_with_index do |input_format, index|
197
- if input_format['valid_type']
198
- @attrs = {
199
- :name => input_format['name'],
200
- :required => input_format['required'],
201
- :valid_type => input_format['valid_type']
202
- }
203
- elsif input_format['valid_type'].nil?
204
- @attrs = {
205
- :name => input_format['name'],
206
- :required => input_format['required'],
207
- :valid_type => input_format['valid_type']
208
- }
209
- end
210
- input_format_for_line = CF::InputFormat.new(@attrs)
211
- input_format = line.input_formats input_format_for_line
212
- say_status "input", "#{@attrs[:name]}"
213
- display_error(line_title, "#{line.input_formats[index].errors}") if line.input_formats[index].errors.present?
187
+ end
188
+ line = CF::Line.new(line_title, line_department, {:description => line_description, :public => line_public})
189
+ say "Creating new assembly line: #{line.title}", :green
190
+ say("Error: #{line.errors}", :red) and exit(1) if line.errors.present?
191
+
192
+ say "Adding InputFormats", :green
193
+
194
+ # Creation of InputFormat from yaml file
195
+ input_formats = line_dump['input_formats']
196
+ input_formats.each_with_index do |input_format, index|
197
+ if input_format['valid_type']
198
+ @attrs = {
199
+ :name => input_format['name'],
200
+ :required => input_format['required'],
201
+ :valid_type => input_format['valid_type']
202
+ }
203
+ elsif input_format['valid_type'].nil?
204
+ @attrs = {
205
+ :name => input_format['name'],
206
+ :required => input_format['required'],
207
+ :valid_type => input_format['valid_type']
208
+ }
214
209
  end
210
+ input_format_for_line = CF::InputFormat.new(@attrs)
211
+ input_format = line.input_formats input_format_for_line
212
+ say_status "input", "#{@attrs[:name]}"
213
+ display_error(line_title, "#{line.input_formats[index].errors}") if line.input_formats[index].errors.present?
214
+ end
215
+
216
+ # Creation of Station
217
+ stations = line_dump['stations']
218
+ stations.each_with_index do |station_file, s_index|
219
+ type = station_file['station']['station_type']
220
+ index = station_file['station']['station_index']
221
+ input_formats_for_station = station_file['station']['input_formats']
222
+ batch_size = station_file['station']['batch_size']
223
+ if type == "tournament"
224
+ jury_worker = station_file['station']['jury_worker']
225
+ auto_judge = station_file['station']['auto_judge']
226
+ acceptance_ratio = station_file['station']['acceptance_ratio']
227
+ station_params = {:line => line, :type => type, :jury_worker => jury_worker, :auto_judge => auto_judge, :input_formats => input_formats_for_station, :batch_size => batch_size, :acceptance_ratio => acceptance_ratio}
228
+ else
229
+ station_params = {:line => line, :type => type, :input_formats => input_formats_for_station, :batch_size => batch_size}
230
+ end
231
+ station = CF::Station.create(station_params) do |s|
232
+ say "Adding Station #{index}: #{s.type}", :green
233
+ display_error(line_title, "#{s.errors}") if s.errors.present?
234
+
235
+ # For Worker
236
+ worker = station_file['station']['worker']
237
+ number = worker['num_workers']
238
+ reward = worker['reward']
239
+ worker_type = worker['worker_type']
240
+ if worker_type == "human"
241
+ skill_badges = worker['skill_badges']
242
+ stat_badge = worker['stat_badge']
243
+ if stat_badge.nil?
244
+ human_worker = CF::HumanWorker.new({:station => s, :number => number, :reward => reward})
245
+ else
246
+ human_worker = CF::HumanWorker.new({:station => s, :number => number, :reward => reward, :stat_badge => stat_badge})
247
+ end
248
+
249
+ if worker['skill_badges'].present?
250
+ skill_badges.each do |badge|
251
+ human_worker.badge = badge
252
+ end
253
+ end
215
254
 
216
- # Creation of Station
217
- stations = line_dump['stations']
218
- stations.each_with_index do |station_file, s_index|
219
- type = station_file['station']['station_type']
220
- index = station_file['station']['station_index']
221
- input_formats_for_station = station_file['station']['input_formats']
222
- batch_size = station_file['station']['batch_size']
223
- if type == "tournament"
224
- jury_worker = station_file['station']['jury_worker']
225
- auto_judge = station_file['station']['auto_judge']
226
- acceptance_ratio = station_file['station']['acceptance_ratio']
227
- station_params = {:line => line, :type => type, :jury_worker => jury_worker, :auto_judge => auto_judge, :input_formats => input_formats_for_station, :batch_size => batch_size, :acceptance_ratio => acceptance_ratio}
255
+ say_status "worker", "#{number} Cloud #{pluralize(number, "Worker")} with reward of #{reward} #{pluralize(reward, "cent")}"
256
+ display_error(line_title, "#{human_worker.errors}") if human_worker.errors.present?
257
+ elsif worker_type =~ /robot/
258
+ settings = worker['settings']
259
+ robot_worker = CF::RobotWorker.create({:station => s, :type => worker_type, :settings => settings})
260
+
261
+ say_status "robot", "Robot worker: #{worker_type}"
262
+ display_error(line_title, "#{robot_worker.errors}") if robot_worker.errors.present?
228
263
  else
229
- station_params = {:line => line, :type => type, :input_formats => input_formats_for_station, :batch_size => batch_size}
264
+ display_error(line_title, "Invalid worker type: #{worker_type}")
230
265
  end
231
- station = CF::Station.create(station_params) do |s|
232
- say "Adding Station #{index}: #{s.type}", :green
233
- display_error(line_title, "#{s.errors}") if s.errors.present?
234
-
235
- # For Worker
236
- worker = station_file['station']['worker']
237
- number = worker['num_workers']
238
- reward = worker['reward']
239
- worker_type = worker['worker_type']
240
- if worker_type == "human"
241
- skill_badges = worker['skill_badges']
242
- stat_badge = worker['stat_badge']
243
- if stat_badge.nil?
244
- human_worker = CF::HumanWorker.new({:station => s, :number => number, :reward => reward})
245
- else
246
- human_worker = CF::HumanWorker.new({:station => s, :number => number, :reward => reward, :stat_badge => stat_badge})
247
- end
248
-
249
- if worker['skill_badges'].present?
250
- skill_badges.each do |badge|
251
- human_worker.badge = badge
252
- end
266
+
267
+ # Creation of Form
268
+ # Creation of TaskForm
269
+ if station_file['station']['task_form'].present?
270
+ title = station_file['station']['task_form']['form_title']
271
+ instruction = station_file['station']['task_form']['instruction']
272
+ form = CF::TaskForm.create({:station => s, :title => title, :instruction => instruction}) do |f|
273
+
274
+ # Creation of FormFields
275
+ say_status "form", "TaskForm '#{f.title}'"
276
+ display_error(line_title, "#{f.errors}") if f.errors.present?
277
+
278
+ station_file['station']['task_form']['form_fields'].each do |form_field|
279
+ form_field_params = form_field.merge(:form => f)
280
+ field = CF::FormField.new(form_field_params.symbolize_keys)
281
+ say_status "form_field", "FormField '#{field.form_field_params}'"
282
+ display_error(line_title, field.errors) if field.errors.present?
253
283
  end
254
284
 
255
- say_status "worker", "#{number} Cloud #{pluralize(number, "Worker")} with reward of #{reward} #{pluralize(reward, "cent")}"
256
- display_error(line_title, "#{human_worker.errors}") if human_worker.errors.present?
257
- elsif worker_type =~ /robot/
258
- settings = worker['settings']
259
- robot_worker = CF::RobotWorker.create({:station => s, :type => worker_type, :settings => settings})
285
+ end
286
+
287
+ elsif station_file['station']['custom_task_form'].present?
288
+ # Creation of CustomTaskForm
289
+ title = station_file['station']['custom_task_form']['form_title']
290
+ instruction = station_file['station']['custom_task_form']['instruction']
291
+
292
+ html_file = station_file['station']['custom_task_form']['html']
293
+ html = File.read("#{line_source}/station#{station_file['station']['station_index']}.html")
294
+ form = CF::CustomTaskForm.create({:station => s, :title => title, :instruction => instruction, :raw_html => html})
295
+ say_status "form", "CustomTaskForm '#{form.title}'"
296
+ display_error(line_title, "#{form.errors}") if form.errors.present?
297
+ end
260
298
 
261
- say_status "robot", "Robot worker: #{worker_type}"
262
- display_error(line_title, "#{robot_worker.errors}") if robot_worker.errors.present?
299
+ #check the presence of gold standard and create goldstandards for the station
300
+ say "Adding Gold Standards to stations", :green
301
+ gold_standards = station_file['station']['gold_standards']
302
+ if gold_standards
303
+ if gold_standards.class == Hash#gold_standards["file"]
304
+ gold_standard = CF::GoldStandard.new(gold_standards.merge!({:line => line,:station => s }))
305
+ say_status "GoldStandard", "parameters '#{gold_standards}'"
306
+ display_error(line_title, "#{gold_standard.errors}") if gold_standard.errors.present?
263
307
  else
264
- display_error(line_title, "Invalid worker type: #{worker_type}")
308
+ gold_standards.each do |gold_options|
309
+ gold_standard = CF::GoldStandard.new(gold_options.merge({:line => line,:station => s }))
310
+ say_status "GoldStandard", "parameters '#{gold_options}'"
311
+ display_error(line_title, "#{gold_standard.errors}") if gold_standard.errors.present?
312
+ end
265
313
  end
314
+ end
266
315
 
267
- # Creation of Form
268
- # Creation of TaskForm
269
- if station_file['station']['task_form'].present?
270
- title = station_file['station']['task_form']['form_title']
271
- instruction = station_file['station']['task_form']['instruction']
272
- form = CF::TaskForm.create({:station => s, :title => title, :instruction => instruction}) do |f|
273
-
274
- # Creation of FormFields
275
- say_status "form", "TaskForm '#{f.title}'"
276
- display_error(line_title, "#{f.errors}") if f.errors.present?
277
-
278
- station_file['station']['task_form']['form_fields'].each do |form_field|
279
- form_field_params = form_field.merge(:form => f)
280
- field = CF::FormField.new(form_field_params.symbolize_keys)
281
- say_status "form_field", "FormField '#{field.form_field_params}'"
282
- display_error(line_title, field.errors) if field.errors.present?
316
+ #######create badge #########
317
+ say "Adding Badges to station", :green
318
+ badges = station_file['station']['badges']
319
+ if badges
320
+ badges.each do |s_badge|
321
+ form = s_badge["test_attributes"]["form_attributes"]
322
+ unless form.blank?
323
+ if form["type"] == "CustomTaskForm"
324
+ file = File.read("#{line_source}/#{form["file"]}") || File.read("#{line_source}/badges/station#{station_file['station']['station_index']}.html")
325
+ s_badge["test_attributes"]["form_attributes"].merge!({:raw_html => file, :_type =>"CustomTaskForm" })
326
+ else
327
+ s_badge["test_attributes"]["form_attributes"].merge!({:_type =>"TaskForm" })
283
328
  end
284
-
285
329
  end
286
-
287
- elsif station_file['station']['custom_task_form'].present?
288
- # Creation of CustomTaskForm
289
- title = station_file['station']['custom_task_form']['form_title']
290
- instruction = station_file['station']['custom_task_form']['instruction']
291
-
292
- html_file = station_file['station']['custom_task_form']['html']
293
- html = File.read("#{line_source}/station#{station_file['station']['station_index']}.html")
294
- form = CF::CustomTaskForm.create({:station => s, :title => title, :instruction => instruction, :raw_html => html})
295
- say_status "form", "CustomTaskForm '#{form.title}'"
296
- display_error(line_title, "#{form.errors}") if form.errors.present?
330
+ badge = CF::Badge.new(s_badge.merge({:line => line,:station => s }))
331
+ say_status "Badge","parameters '#{s_badge}'"
332
+ display_error(line_title, "#{badge.errors}") if badge.errors.present?
297
333
  end
298
-
299
334
  end
300
335
  end
301
-
302
- output_formats = line_dump['output_formats'].presence
303
- if output_formats
304
- output_format = CF::OutputFormat.new(output_formats.merge(:line => line))
305
- say "Adding Output Format #{output_formats}", :green
306
- display_error(line_title, "#{output_format.errors}") if output_format.errors.present?
336
+ end
337
+
338
+ output_formats = line_dump['output_formats'].presence
339
+ if output_formats
340
+ output_format = CF::OutputFormat.new(output_formats.merge(:line => line))
341
+ say "Adding Output Format #{output_formats}", :green
342
+ display_error(line_title, "#{output_format.errors}") if output_format.errors.present?
343
+ end
344
+
345
+ #check the presence of gold standard and create goldstandards for the line
346
+ say "Adding GoldStandards to Line", :green
347
+ gold_standards = line_dump['gold_standards'].presence
348
+ if gold_standards
349
+ if gold_standards.class == Hash#gold_standards["file"]
350
+ gold_standard = CF::GoldStandard.new(gold_standards.merge!({:line => line}))
351
+ say_status "GoldStandard", "parameters '#{gold_standards}'"
352
+ display_error(line_title, "#{gold_standard.errors}") if gold_standard.errors.present?
353
+ else
354
+ gold_standards.each do |gold_options|
355
+ gold_standard = CF::GoldStandard.new(gold_options.merge(:line => line))
356
+ say_status "GoldStandard", "parameters '#{gold_options}'"
357
+ display_error(line_title, "#{gold_standard.errors}") if gold_standard.errors.present?
307
358
  end
308
-
309
- say " ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁", :white
310
- say "Line was successfully created.", :green
311
- say "View your line at http://#{CF.account_name}.#{CF.api_url.split("/")[-2]}/lines/#{CF.account_name}/#{line.title}", :yellow
312
- say "\nNow you can do production runs with: cf production start <your-run-title>", :green
359
+ end
360
+ end
361
+
362
+ say " ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁", :white
363
+ say "Line was successfully created.", :green
364
+ say "View your line at http://#{CF.account_name}.#{CF.api_url.split("/")[-2]}/lines/#{CF.account_name}/#{line.title}", :yellow
365
+ say "\nNow you can do production runs with: cf production start <your-run-title>", :green
313
366
  end
314
367
 
315
368
  desc "line list", "List your lines"