cloudfactory 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,6 +38,7 @@ module CF
38
38
  def initialize(title, department_name, options={})
39
39
  @input_formats =[]
40
40
  @stations =[]
41
+ @gold_standards = []
41
42
  @title = title
42
43
  @department_name = department_name
43
44
  @public = options[:public].nil? ? true : options[:public]
@@ -222,10 +223,59 @@ module CF
222
223
  @output_formats
223
224
  end
224
225
  end
225
-
226
+
226
227
  def output_formats=(output_format) # :nodoc:
227
228
  @output_formats = output_format
228
229
  end
230
+
231
+
232
+ #specify the goldstandards for the line
233
+ # ===Usage Example:
234
+ # CF::GoldStandard.new({ :line => line,:name => "easy", :input => [{'image_url' =>"http://onwired.com/images/portfolio/linda-stanley-business-card.jpg"}],:expected_output => [{"first_name" => {"value" => "John"}, "last_name" => {"value" => "Lennon"}, "company" => {"value" => "Sprout"}}]})
235
+ def gold_standards gold_standard = nil
236
+ if gold_standard
237
+ line = self
238
+ gold_standard_options = gold_standard.settings
239
+ if !gold_standard_options.nil?
240
+ # check whether the gold standard is from a file or not(check for bulk assignment of goldstandards)
241
+ if gold_standard_options[:file]
242
+ puts gold_standard_options[:file]
243
+ if File.exist?(gold_standard_options[:file].to_s)
244
+ file_upload = File.new(gold_standard_options[:file], 'rb')
245
+ resp = self.class.post("/lines/#{CF.account_name}/#{line.title.downcase}/gold_standards.json", {:file => file_upload})
246
+ gold_standard = CF::GoldStandard.new()
247
+ resp.each do |gs|
248
+ gold_standard.settings.merge!(gs.to_hash)
249
+ end
250
+ end
251
+ else
252
+ request =
253
+ {
254
+ :body =>
255
+ {
256
+ :api_key => CF.api_key,
257
+ :gold_standard => gold_standard_options
258
+ }
259
+ }
260
+ resp = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{line.title.downcase}/gold_standards.json",request)
261
+ gold_standard = CF::GoldStandard.new()
262
+ resp.parsed_response.first.delete("id")
263
+ gold_standard.settings.merge!(resp.parsed_response.first.symbolize_keys)
264
+ self.errors = resp.parsed_response['error']['message'] if resp.code != 200
265
+ end
266
+ @gold_standards << gold_standard
267
+ end
268
+ else
269
+ @gold_standards
270
+ end
271
+ end
272
+
273
+
274
+ def gold_standards=(gold_standard) # :nodoc:
275
+ @gold_standards << gold_standard
276
+ end
277
+
278
+
229
279
  # ==Returns the content of a line by making an Api call
230
280
  # ===Usage Example:
231
281
  # CF::Line.info(line)
@@ -168,38 +168,38 @@ module CF
168
168
  return resp
169
169
  end
170
170
  end
171
-
171
+
172
172
  # ==Returns progress of the production run
173
173
  # ===Usage Example:
174
174
  # progress = CF::Run.progress("run_title")
175
175
  def self.progress(run_title)
176
176
  get("/runs/#{CF.account_name}/#{run_title}/progress.json")
177
177
  end
178
-
178
+
179
179
  def progress # :nodoc:
180
180
  self.class.get("/runs/#{CF.account_name}/#{self.title}/progress.json")
181
181
  end
182
-
182
+
183
183
  # ==Returns progress details of the production run
184
184
  # ===Usage Example:
185
185
  # progress = CF::Run.progress_details("run_title")
186
186
  def self.progress_details(run_title)
187
- resp = get("/runs/#{CF.account_name}/#{run_title}/details.json")
188
- return resp['progress_details']
187
+ resp = get("/runs/#{CF.account_name}/#{run_title}/progress.json")
188
+ return resp['progress']
189
189
  end
190
-
190
+
191
191
  def progress_details # :nodoc:
192
- resp = self.class.get("/runs/#{CF.account_name}/#{self.title}/details.json")
193
- return resp['progress_details']
192
+ resp = self.class.get("/runs/#{CF.account_name}/#{self.title}/progress.json")
193
+ return resp['progress']
194
194
  end
195
-
195
+
196
196
  # ==Returns all runs of a line
197
197
  # ===Usage Example:
198
198
  # progress = CF::Run.all({:line_title => "line_title", :page => 1)
199
199
  def self.all(options={})
200
200
  page = options[:page].presence
201
201
  line_title = options[:line_title].presence
202
-
202
+
203
203
  if line_title.nil?
204
204
  if page.nil?
205
205
  resp = get("/runs/#{CF.account_name}.json")
@@ -11,22 +11,22 @@ module CF
11
11
 
12
12
  # Index number of station
13
13
  attr_accessor :index
14
-
14
+
15
15
  # Line attribute of the station with which station is associated
16
16
  attr_accessor :line
17
-
17
+
18
18
  # Manual input format settings for the station
19
19
  attr_accessor :station_input_formats
20
-
20
+
21
21
  # Jury worker settings for the Tournament Station
22
22
  attr_accessor :jury_worker
23
-
23
+
24
24
  # Auto Judge settings for the Tournament Station
25
25
  attr_accessor :auto_judge
26
-
26
+
27
27
  # Contains Error Message if any
28
28
  attr_accessor :errors
29
-
29
+
30
30
  # batch_size attribute, required for specifing size of batch
31
31
  attr_accessor :batch_size
32
32
 
@@ -37,6 +37,7 @@ module CF
37
37
  # line.stations station
38
38
  def initialize(options={})
39
39
  @input_formats =[]
40
+ @badges = []
40
41
  @line_title = options[:line].nil? ? nil : options[:line].title
41
42
  @type = options[:type].nil? ? nil : options[:type].camelize
42
43
  @jury_worker = options[:jury_worker]
@@ -44,29 +45,30 @@ module CF
44
45
  @station_input_formats = options[:input_formats]
45
46
  @line_instance = options[:line]
46
47
  @batch_size = options[:batch_size]
48
+ @gold_standards = []
47
49
  @acceptance_ratio = options[:acceptance_ratio]
48
50
  if @batch_size.nil?
49
- request_general =
51
+ request_general =
50
52
  {
51
- :body =>
53
+ :body =>
52
54
  {
53
55
  :api_key => CF.api_key,
54
56
  :station => {:type => @type, :input_formats => @station_input_formats}
55
57
  }
56
58
  }
57
59
  if @acceptance_ratio.nil?
58
- request_tournament =
60
+ request_tournament =
59
61
  {
60
- :body =>
62
+ :body =>
61
63
  {
62
64
  :api_key => CF.api_key,
63
65
  :station => {:type => @type, :jury_worker => @jury_worker, :auto_judge => @auto_judge, :input_formats => @station_input_formats}
64
66
  }
65
67
  }
66
68
  else
67
- request_tournament =
69
+ request_tournament =
68
70
  {
69
- :body =>
71
+ :body =>
70
72
  {
71
73
  :api_key => CF.api_key,
72
74
  :station => {:type => @type, :jury_worker => @jury_worker, :auto_judge => @auto_judge, :input_formats => @station_input_formats, :acceptance_ratio => @acceptance_ratio}
@@ -74,27 +76,27 @@ module CF
74
76
  }
75
77
  end
76
78
  else
77
- request_general =
79
+ request_general =
78
80
  {
79
- :body =>
81
+ :body =>
80
82
  {
81
83
  :api_key => CF.api_key,
82
84
  :station => {:type => @type, :input_formats => @station_input_formats, :batch_size => @batch_size}
83
85
  }
84
86
  }
85
87
  if @acceptance_ratio.nil?
86
- request_tournament =
88
+ request_tournament =
87
89
  {
88
- :body =>
90
+ :body =>
89
91
  {
90
92
  :api_key => CF.api_key,
91
93
  :station => {:type => @type, :jury_worker => @jury_worker, :auto_judge => @auto_judge, :input_formats => @station_input_formats, :batch_size => @batch_size}
92
94
  }
93
95
  }
94
96
  else
95
- request_tournament =
97
+ request_tournament =
96
98
  {
97
- :body =>
99
+ :body =>
98
100
  {
99
101
  :api_key => CF.api_key,
100
102
  :station => {:type => @type, :jury_worker => @jury_worker, :auto_judge => @auto_judge, :input_formats => @station_input_formats, :batch_size => @batch_size, :acceptance_ratio => @acceptance_ratio}
@@ -172,25 +174,23 @@ module CF
172
174
  else
173
175
  number = worker_instance.number
174
176
  reward = worker_instance.reward
175
- badge = worker_instance.badge
176
177
  stat_badge = worker_instance.stat_badge
177
- if badge.nil? && stat_badge.nil?
178
- request =
178
+ if stat_badge.nil?
179
+ request =
179
180
  {
180
- :body =>
181
+ :body =>
181
182
  {
182
183
  :api_key => CF.api_key,
183
184
  :worker => {:number => number, :reward => reward, :type => "HumanWorker"}
184
185
  }
185
186
  }
186
187
  else
187
- request =
188
+ request =
188
189
  {
189
- :body =>
190
+ :body =>
190
191
  {
191
192
  :api_key => CF.api_key,
192
193
  :worker => {:number => number, :reward => reward, :type => "HumanWorker"},
193
- :skill_badge => badge,
194
194
  :stat_badge => stat_badge
195
195
  }
196
196
  }
@@ -200,8 +200,7 @@ module CF
200
200
  worker.id = resp.parsed_response['id']
201
201
  worker.number = resp.parsed_response['number']
202
202
  worker.reward = resp.parsed_response['reward']
203
- worker.stat_badge = resp.parsed_response['stat_badge']
204
- worker.skill_badges << resp.parsed_response['skill_badges']
203
+ worker.stat_badge = resp.parsed_response['stat_badge']
205
204
  if resp.code != 200
206
205
  worker.errors = resp.parsed_response['error']['message']
207
206
  end
@@ -264,7 +263,7 @@ module CF
264
263
  @html = @form.raw_html
265
264
  @resp = CF::CustomTaskForm.post("/lines/#{CF.account_name}/#{self.line_title.downcase}/stations/#{self.index}/form.json", :form => {:title => @title, :instruction => @instruction, :_type => "CustomTaskForm", :raw_html => @html})
266
265
  else
267
- @resp = CF::TaskForm.post("/lines/#{CF.account_name}/#{self.line_title.downcase}/stations/#{self.index}/form.json", :form => {:title => @title, :instruction => @instruction, :_type => type})
266
+ @resp = CF::TaskForm.post("/lines/#{CF.account_name}/#{self.line_title.downcase}/stations/#{self.index}/form.json", :form => {:title => @title, :instruction => @instruction, :_type => type})
268
267
  end
269
268
  @resp.to_hash.each_pair do |k,v|
270
269
  form.send("#{k}=",v) if form.respond_to?(k)
@@ -319,7 +318,7 @@ module CF
319
318
  self.errors = resp.error.message if resp.code != 200
320
319
  return resp
321
320
  end
322
-
321
+
323
322
  def to_s # :nodoc:
324
323
  if self.type == "TournamentStation"
325
324
  "{:type => #{self.type}, :index => #{self.index}, :line_title => #{self.line_title}, :station_input_formats => #{self.station_input_formats}, :jury_worker => #{self.jury_worker}, auto_judge => #{self.auto_judge}, :errors => #{self.errors}}"
@@ -327,5 +326,88 @@ module CF
327
326
  "{:type => #{self.type}, :index => #{self.index}, :line_title => #{self.line_title}, :station_input_formats => #{self.station_input_formats}, :errors => #{self.errors}}"
328
327
  end
329
328
  end
329
+
330
+ #specify the goldstandards for the station
331
+ # ===Usage Example:
332
+ # CF::GoldStandard.new({ :station => station,:name => "easy",:input => [{'image_url' =>"http://onwired.com/images/portfolio/linda-stanley-business-card.jpg"}],:expected_output => [{"first_name" => {"value" => "John"}, "last_name" => {"value" => "Lennon"}, "company" => {"value" => "Sprout"}}]})
333
+ def gold_standards gold_standard = nil
334
+ if gold_standard
335
+ station = self
336
+ gold_standard_options = gold_standard.settings
337
+ if !gold_standard_options.nil?
338
+ if gold_standard_options[:file]
339
+ if File.exist?(gold_standard_options[:file].to_s)
340
+ file_upload = File.new(gold_standard_options[:file], 'rb')
341
+ resp = self.class.post("/lines/#{CF.account_name}/#{line.title.downcase}/gold_standards.json", {:file => file_upload})
342
+ gold_standard = CF::GoldStandard.new()
343
+ resp.each do |gs|
344
+ gold_standard.settings.merge!(gs.to_hash)
345
+ end
346
+ end
347
+ else
348
+ request =
349
+ {
350
+ :body =>
351
+ {
352
+ :api_key => CF.api_key,
353
+ :gold_standard => gold_standard_options
354
+ }
355
+ }
356
+ resp = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{line.title.downcase}/stations/#{station.index.to_i}/gold_standards.json",request)
357
+ gold_standard = CF::GoldStandard.new()
358
+ resp.parsed_response.first.delete("id")
359
+ gold_standard.settings.merge!(resp.parsed_response.first.symbolize_keys)
360
+ self.errors = resp.parsed_response['error']['message'] if resp.code != 200
361
+ end
362
+ @gold_standards << gold_standard
363
+ end
364
+ else
365
+ @gold_standards
366
+ end
367
+ end
368
+
369
+ def gold_standards=(gold_standard) # :nodoc:
370
+ @gold_standards << gold_standard
371
+ end
372
+
373
+ #specify the badges for the station
374
+ # ===Usage Example:
375
+ # CF::Badge.new({:line => line, :station => s,:name => "Tomb Digitizer", :description => "This badge qualifies you to work on tomb digitization tasks.",:max_badges => 100,:gold_standards => ["#{@gold_standard.settings[:name]}"],:test_attributes =>{:type => "default",:retries => 10,:pass_percentage => 100,:check_manually => true}})
376
+ def badges badge = nil
377
+ line_title = line["title"] || line.title
378
+ if badge
379
+ if badge.settings[:test_attributes][:form_attributes].present?
380
+ form = badge.settings[:test_attributes][:form_attributes]
381
+ if( form[:type] == "CustomTaskForm" && form[:file])
382
+ raw_html = ""
383
+ File.open("#{form[:file]}").each_line do |line|
384
+ raw_html += line
385
+ end
386
+ badge.settings[:test_attributes][:form_attributes].merge!({:raw_html => raw_html,:_type =>"CustomTaskForm"})
387
+ end
388
+ badge.settings[:test_attributes][:form_attributes].merge!({:_type =>"TaskForm"}) if form[:type] == "TaskForm"
389
+ end
390
+ request =
391
+ {
392
+ :body =>
393
+ {
394
+ :api_key => CF.api_key,
395
+ :badge => badge.settings
396
+ }
397
+ }
398
+ resp = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{line_title.downcase}/stations/#{self.index}/badges.json",request)
399
+ badge = CF::Badge.new()
400
+ badge.settings.merge!(resp.to_hash)
401
+ self.errors = resp.parsed_response['error']['message'] if resp.code != 200
402
+ @badges << badge
403
+ else
404
+ @badges
405
+ end
406
+ end
407
+
408
+ def badges=(badge)
409
+ @badges << badge
410
+ end
411
+
330
412
  end
331
413
  end
@@ -0,0 +1,66 @@
1
+ module CF
2
+ class TestRun
3
+ require 'httparty'
4
+ include Client
5
+
6
+ # Title of the "run" object
7
+ attr_accessor :title
8
+
9
+ # Input to be passed for Production Run
10
+ attr_accessor :gold_standard_inputs
11
+
12
+ # Line attribute with which run is associated
13
+ attr_accessor :line
14
+
15
+ # Contains Error Message if any
16
+ attr_accessor :errors
17
+
18
+ # ==Initializes a new Run
19
+ # ===Usage Example:
20
+ #
21
+ # run = CF::Run.new("line_title", "run name", file_path)
22
+ #
23
+ # ==OR
24
+ # You can pass line object instead of passing line title:
25
+ # run = CF::Run.new(line_object, "run name", file_path)
26
+ def initialize(line, title, gold_standards_number)
27
+ @gold_standards_number = gold_standards_number # a number that denotes how many goldstandard form line should be included to create units
28
+ if line.class == CF::Line || line.class == Hashie::Mash
29
+ @line = line
30
+ @line_title = line.title
31
+ elsif line.class == String
32
+ if line.split("/").count == 2
33
+ @account = line.split("/").first
34
+ @line_title = line.split("/").last
35
+ elsif line.split("/").count == 1
36
+ @line_title = line
37
+ end
38
+ end
39
+ @title = title
40
+ if gold_standards_number
41
+ options =
42
+ {
43
+ :body =>
44
+ {
45
+ :api_key => CF.api_key,
46
+ :data =>{:run => { :title => @title ,:test =>"true"}, :gold_standard_inputs => @gold_standards_number}
47
+ }
48
+ }
49
+ if line.class == String && line.split("/").count == 2
50
+ run = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{@account}/#{@line_title.downcase}/runs.json",options)
51
+ else
52
+ run = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{@line_title.downcase}/runs.json",options)
53
+ end
54
+ if run.code != 200
55
+ self.errors = run.parsed_response['error']['message']
56
+ end
57
+ else
58
+ self.errors = "Number of GoldStandards to be used is not provided"
59
+ end
60
+ end
61
+
62
+ def self.create(line, title, input_number)
63
+ TestRun.new(line, title, input_number)
64
+ end
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module CF # :nodoc: all
2
- VERSION = "0.4.4"
2
+ VERSION = "0.4.5"
3
3
  end
@@ -4,6 +4,6 @@ describe CF::Account do
4
4
  it "should get the account info" do
5
5
  WebMock.allow_net_connect!
6
6
  account_info = CF::Account.info
7
- account_info['name'].should eql("kickass")
7
+ account_info['name'].should eql("chandra")
8
8
  end
9
9
  end