cloudfactory 0.0.13

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.
Files changed (116) hide show
  1. data/.gitignore +11 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +10 -0
  4. data/README.md +44 -0
  5. data/Rakefile +40 -0
  6. data/bin/cf +8 -0
  7. data/cf.gemspec +76 -0
  8. data/example/google_translate_app/Gemfile +12 -0
  9. data/example/google_translate_app/config.ru +7 -0
  10. data/example/google_translate_app/google_translate_input.csv +4 -0
  11. data/example/google_translate_app/google_translator_app.rb +53 -0
  12. data/example/google_translate_app/views/index.haml +2 -0
  13. data/example/google_translate_app/views/layout.haml +7 -0
  14. data/example/google_translate_app/views/run.haml +4 -0
  15. data/example/google_translate_app/views/style.sass +2 -0
  16. data/example/human_worker_app/Gemfile +12 -0
  17. data/example/human_worker_app/config.ru +7 -0
  18. data/example/human_worker_app/human_worker_app.rb +55 -0
  19. data/example/human_worker_app/human_worker_input.csv +5 -0
  20. data/example/human_worker_app/public/app.js +12 -0
  21. data/example/human_worker_app/temp.csv +3 -0
  22. data/example/human_worker_app/views/index.haml +15 -0
  23. data/example/human_worker_app/views/layout.haml +10 -0
  24. data/example/human_worker_app/views/result.haml +18 -0
  25. data/example/human_worker_app/views/run.haml +12 -0
  26. data/example/human_worker_app/views/style.sass +25 -0
  27. data/example/sample_yaml_files/concept_tagging_robot.yaml +18 -0
  28. data/example/sample_yaml_files/content_scraping_robot.yaml +19 -0
  29. data/example/sample_yaml_files/entity_extraction_robot.yaml +18 -0
  30. data/example/sample_yaml_files/google_translate_robot.yaml +20 -0
  31. data/example/sample_yaml_files/image_processing_robot.yaml +20 -0
  32. data/example/sample_yaml_files/keyword_matching_and_text_extraction_robot.yaml +26 -0
  33. data/example/sample_yaml_files/mailer_robot.yaml +21 -0
  34. data/example/sample_yaml_files/media_converter_robot.yaml +21 -0
  35. data/example/sample_yaml_files/media_splitting_robot.yaml +20 -0
  36. data/example/sample_yaml_files/multiple_skill_badge.yaml +75 -0
  37. data/example/sample_yaml_files/sentiment_robot.yaml +19 -0
  38. data/example/sample_yaml_files/skill_badge.yaml +56 -0
  39. data/example/sample_yaml_files/stat_badge.yaml +40 -0
  40. data/example/sample_yaml_files/term_extraction_robot.yaml +20 -0
  41. data/example/sample_yaml_files/tournament_station_and_form_fields.yaml +40 -0
  42. data/features/form_generation.feature +46 -0
  43. data/features/form_preview.feature +98 -0
  44. data/features/line_creation.feature +99 -0
  45. data/features/line_deletion.feature +50 -0
  46. data/features/line_generation.feature +57 -0
  47. data/features/run.feature +141 -0
  48. data/features/support/cli_steps.rb +16 -0
  49. data/features/support/env.rb +23 -0
  50. data/features/target_url.feature +82 -0
  51. data/fixtures/api_credentials_example.yml +4 -0
  52. data/fixtures/input_data/media_converter_robot.csv +2 -0
  53. data/fixtures/input_data/test.csv +2 -0
  54. data/lib/cf.rb +94 -0
  55. data/lib/cf/account.rb +32 -0
  56. data/lib/cf/cli.rb +52 -0
  57. data/lib/cf/cli/config.rb +87 -0
  58. data/lib/cf/cli/form.rb +82 -0
  59. data/lib/cf/cli/line.rb +237 -0
  60. data/lib/cf/cli/production.rb +62 -0
  61. data/lib/cf/cli/templates/css_file.css.erb +22 -0
  62. data/lib/cf/cli/templates/form_preview.html.erb +17 -0
  63. data/lib/cf/cli/templates/html_file.html.erb +21 -0
  64. data/lib/cf/cli/templates/js_file.js.erb +18 -0
  65. data/lib/cf/cli/templates/line.tt +55 -0
  66. data/lib/cf/cli/templates/sample-line/form.css +27 -0
  67. data/lib/cf/cli/templates/sample-line/form.html +26 -0
  68. data/lib/cf/cli/templates/sample-line/form.js +7 -0
  69. data/lib/cf/cli/templates/sample-line/line.yml.erb +67 -0
  70. data/lib/cf/cli/templates/sample-line/sample-line.csv +3 -0
  71. data/lib/cf/client.rb +56 -0
  72. data/lib/cf/custom_task_form.rb +136 -0
  73. data/lib/cf/department.rb +24 -0
  74. data/lib/cf/final_output.rb +20 -0
  75. data/lib/cf/form_field.rb +62 -0
  76. data/lib/cf/human_worker.rb +67 -0
  77. data/lib/cf/input_format.rb +134 -0
  78. data/lib/cf/line.rb +231 -0
  79. data/lib/cf/robot_worker.rb +31 -0
  80. data/lib/cf/run.rb +158 -0
  81. data/lib/cf/station.rb +340 -0
  82. data/lib/cf/task_form.rb +147 -0
  83. data/lib/cf/version.rb +3 -0
  84. data/lib/generators/cf/form/form_generator.rb +55 -0
  85. data/lib/generators/cf/form/templates/cf_form.html.erb +11 -0
  86. data/lib/generators/cf/install/install_generator.rb +22 -0
  87. data/lib/generators/cf/install/templates/README +13 -0
  88. data/lib/generators/cf/install/templates/cloud_factory.rb +7 -0
  89. data/spec/account_spec.rb +11 -0
  90. data/spec/badge_spec.rb +88 -0
  91. data/spec/concept_tagging_robot_spec.rb +54 -0
  92. data/spec/config_spec.rb +20 -0
  93. data/spec/content_scraping_robot_spec.rb +58 -0
  94. data/spec/custom_task_form_spec.rb +190 -0
  95. data/spec/department_spec.rb +14 -0
  96. data/spec/entity_extraction_robot_spec.rb +56 -0
  97. data/spec/form_field_spec.rb +126 -0
  98. data/spec/generators/form_generator_spec.rb +60 -0
  99. data/spec/generators/install_generator_spec.rb +35 -0
  100. data/spec/google_translate_robot_spec.rb +64 -0
  101. data/spec/human_worker_spec.rb +118 -0
  102. data/spec/image_processing_robot_spec.rb +56 -0
  103. data/spec/input_format_spec.rb +113 -0
  104. data/spec/keyword_matching_and_text_extraction_robot_spec.rb +73 -0
  105. data/spec/line_spec.rb +338 -0
  106. data/spec/mailer_robot_spec.rb +62 -0
  107. data/spec/media_converter_robot_spec.rb +72 -0
  108. data/spec/media_splitting_robot_spec.rb +62 -0
  109. data/spec/run_spec.rb +298 -0
  110. data/spec/sentiment_robot_spec.rb +56 -0
  111. data/spec/spec_helper.rb +39 -0
  112. data/spec/station_spec.rb +256 -0
  113. data/spec/task_form_spec.rb +96 -0
  114. data/spec/term_extraction_robot_spec.rb +58 -0
  115. data/spec/text_appending_robot_spec.rb +86 -0
  116. metadata +472 -0
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::Department do
4
+ context "return category" do
5
+ it "should get all the departments" do
6
+ VCR.use_cassette "department/all", :record => :new_episodes do
7
+ departments = CF::Department.all
8
+ departments.map(&:name).should include("Digitization")
9
+ departments.map(&:name).should include("Data Processing")
10
+ departments.map(&:name).should include("Survey")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module CF
5
+ describe CF::RobotWorker do
6
+ context "create an entity extraction robot worker" do
7
+ it "should create entity extraction robot worker for first station in Block DSL way" do
8
+ # WebMock.allow_net_connect!
9
+ VCR.use_cassette "robot_worker/entity_extraction_robot/block/create-worker-single-station", :record => :new_episodes do
10
+ line = CF::Line.create("entity_extraction_robot","Digitization") do |l|
11
+ CF::InputFormat.new({:line => l, :name => "text", :valid_type => "general", :required => "true"})
12
+ CF::Station.create({:line => l, :type => "work"}) do |s|
13
+ CF::RobotWorker.create({:station => s, :type => "entity_extraction_robot", :settings => {:document => ["Franz Kafka and George Orwell are authors. Ludwig Von Beethoven and Mozart are musicians. China and Japan are countries"]}})
14
+ end
15
+ end
16
+ run = CF::Run.create(line, "entity_extraction_robot_run", [{"text"=> "Franz Kafka and George Orwell are authors. Ludwig Von Beethoven and Mozart are musicians. China and Japan are countries"}])
17
+ output = run.final_output
18
+ output.first.final_output.first.entity_counts_of_document.should eql([["2", "2", "1", "1", "2", "1"]])
19
+ output.first.final_output.first.entity_names_of_document.should eql([["Ludwig Von Beethoven", "Franz Kafka", "George Orwell", "Mozart", "China", "Japan"]])
20
+ output.first.final_output.first.entity_relevances_of_document.should eql([[92.12089999999999, 73.8997, 48.079100000000004, 28.9416, 27.1982, 21.1997]])
21
+ output.first.final_output.first.entity_types_of_document.should eql([["Person", "Person", "Person", "Person", "Country", "Country"]])
22
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
23
+ line.stations.first.worker.reward.should eql(5)
24
+ line.stations.first.worker.number.should eql(1)
25
+ line.stations.first.worker.settings.should eql({:document => ["Franz Kafka and George Orwell are authors. Ludwig Von Beethoven and Mozart are musicians. China and Japan are countries"]})
26
+ end
27
+ end
28
+
29
+ it "should create entity extraction robot worker for first station in a plain ruby way" do
30
+ # WebMock.allow_net_connect!
31
+ VCR.use_cassette "robot_worker/entity_extraction_robot/plain-ruby/create-worker-in-first-station", :record => :new_episodes do
32
+ line = CF::Line.new("entity_extraction_robot_1","Digitization")
33
+ input_format = CF::InputFormat.new({:name => "text", :required => "true", :valid_type => "general"})
34
+ line.input_formats input_format
35
+
36
+ station = CF::Station.new({:type => "work"})
37
+ line.stations station
38
+
39
+ worker = CF::RobotWorker.create({:type => "entity_extraction_robot", :settings => {:document => ["Franz Kafka and George Orwell are authors. Ludwig Von Beethoven and Mozart are musicians. China and Japan are countries"]}})
40
+ line.stations.first.worker = worker
41
+
42
+ run = CF::Run.create(line, "entity_extraction_robot_run_1", [{"text"=> "Franz Kafka and George Orwell are authors. Ludwig Von Beethoven and Mozart are musicians. China and Japan are countries"}])
43
+ output = run.final_output
44
+ output.first.final_output.first.entity_counts_of_document.should eql([["2", "2", "1", "1", "2", "1"]])
45
+ output.first.final_output.first.entity_names_of_document.should eql([["Ludwig Von Beethoven", "Franz Kafka", "George Orwell", "Mozart", "China", "Japan"]])
46
+ output.first.final_output.first.entity_relevances_of_document.should eql([[92.12089999999999, 73.8997, 48.079100000000004, 28.9416, 27.1982, 21.1997]])
47
+ output.first.final_output.first.entity_types_of_document.should eql([["Person", "Person", "Person", "Person", "Country", "Country"]])
48
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
49
+ line.stations.first.worker.reward.should eql(5)
50
+ line.stations.first.worker.number.should eql(1)
51
+ line.stations.first.worker.settings.should eql({:document => ["Franz Kafka and George Orwell are authors. Ludwig Von Beethoven and Mozart are musicians. China and Japan are countries"]})
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::FormField do
4
+ context "create an form_field" do
5
+ it "the plain ruby way" do
6
+ # WebMock.allow_net_connect!
7
+ VCR.use_cassette "form-fields/plain-ruby/create-form-fields", :record => :new_episodes do
8
+ line = CF::Line.new("Digitize-0", "Digitization")
9
+ station = CF::Station.new({:type => "work"})
10
+ line.stations station
11
+
12
+ worker = CF::HumanWorker.new({:number => 2, :reward => 20})
13
+ line.stations.first.worker = worker
14
+
15
+ form = CF::TaskForm.new({:title => "Enter text from a business card image", :instruction => "Describe"})
16
+ line.stations.first.form = form
17
+
18
+ form_fields_1 = CF::FormField.new({:label => "First Name", :field_type => "SA", :required => "true"})
19
+ line.stations.first.form.form_fields form_fields_1
20
+ form_fields_2 = CF::FormField.new({:label => "Middle Name", :field_type => "SA"})
21
+ line.stations.first.form.form_fields form_fields_2
22
+ form_fields_3 = CF::FormField.new({:label => "Last Name", :field_type => "SA", :required => "true"})
23
+ line.stations.first.form.form_fields form_fields_3
24
+ form_fields_3 = CF::FormField.new({:label => "Gender", :field_type => "RB", :required => "true", :option_values => ["male","female"]})
25
+ line.stations.first.form.form_fields form_fields_3
26
+
27
+ line.stations.first.form.form_fields[0].label.should eq("First Name")
28
+ line.stations.first.form.form_fields[0].field_type.should eq("SA")
29
+ line.stations.first.form.form_fields[0].required.should eq(true)
30
+ line.stations.first.form.form_fields[0].form_field_params.should eql({:label => "First Name", :field_type => "SA", :required => "true"})
31
+ line.stations.first.form.form_fields[1].label.should eq("Middle Name")
32
+ line.stations.first.form.form_fields[1].field_type.should eq("SA")
33
+ line.stations.first.form.form_fields[1].form_field_params.should eql({:label => "Middle Name", :field_type => "SA"})
34
+ line.stations.first.form.form_fields[2].label.should eq("Last Name")
35
+ line.stations.first.form.form_fields[2].field_type.should eq("SA")
36
+ line.stations.first.form.form_fields[2].required.should eq(true)
37
+ line.stations.first.form.form_fields[2].form_field_params.should eql({:label => "Last Name", :field_type => "SA", :required => "true"})
38
+ line.stations.first.form.form_fields[3].label.should eq("Gender")
39
+ line.stations.first.form.form_fields[3].field_type.should eq("RB")
40
+ line.stations.first.form.form_fields[3].required.should eq(true)
41
+ line.stations.first.form.form_fields[3].form_field_params.should eql({:label => "Gender", :field_type => "RB", :required => "true", :option_values => ["male","female"]})
42
+ end
43
+ end
44
+
45
+ it "in block DSL way" do
46
+ # WebMock.allow_net_connect!
47
+ VCR.use_cassette "form-fields/block/create-using-block", :record => :new_episodes do
48
+ line = CF::Line.create("Digitize-0101111-final", "Digitization") do
49
+ CF::InputFormat.new({:line => self, :name => "image_url", :required => true, :valid_type => "url"})
50
+ CF::Station.create({:line => self, :type => "work"}) do |station|
51
+ CF::HumanWorker.new({:station => station, :number => 2, :reward => 20})
52
+ CF::TaskForm.create({:station => station, :title => "Enter text from a business card image", :instruction => "Describe"}) do |i|
53
+ CF::FormField.new({:form => i, :label => "First Name", :field_type => "SA", :required => "true"})
54
+ CF::FormField.new({:form => i, :label => "Middle Name", :field_type => "SA"})
55
+ CF::FormField.new({:form => i, :label => "Last Name", :field_type => "SA", :required => "true"})
56
+ CF::FormField.new({:form => i, :label => "Gender", :field_type => "RB", :required => "true", :option_values => ["male","female"]})
57
+ end
58
+ end
59
+ end
60
+ line.title.should eq("Digitize-0101111-final")
61
+ line.department_name.should eq("Digitization")
62
+ line.input_formats.first.name.should eql("image_url")
63
+ line.stations.first.type.should eq("WorkStation")
64
+ line.stations.first.worker.number.should eq(2)
65
+ line.stations.first.form.instruction.should eq("Describe")
66
+ line.stations.first.form.form_fields[0].label.should eq("First Name")
67
+ line.stations.first.form.form_fields[0].field_type.should eq("SA")
68
+ line.stations.first.form.form_fields[0].required.should eq(true)
69
+ line.stations.first.form.form_fields[0].form_field_params.should eql({:label => "First Name", :field_type => "SA", :required => "true"})
70
+ line.stations.first.form.form_fields[1].label.should eq("Middle Name")
71
+ line.stations.first.form.form_fields[1].field_type.should eq("SA")
72
+ line.stations.first.form.form_fields[1].form_field_params.should eql({:label => "Middle Name", :field_type => "SA"})
73
+ line.stations.first.form.form_fields[2].label.should eq("Last Name")
74
+ line.stations.first.form.form_fields[2].field_type.should eq("SA")
75
+ line.stations.first.form.form_fields[2].required.should eq(true)
76
+ line.stations.first.form.form_fields[2].form_field_params.should eql({:label => "Last Name", :field_type => "SA", :required => "true"})
77
+ line.stations.first.form.form_fields[3].label.should eq("Gender")
78
+ line.stations.first.form.form_fields[3].field_type.should eq("RB")
79
+ line.stations.first.form.form_fields[3].required.should eq(true)
80
+ line.stations.first.form.form_fields[3].form_field_params.should eql({:label => "Gender", :field_type => "RB", :required => "true", :option_values => ["male","female"]})
81
+ end
82
+ end
83
+
84
+ it "in block DSL way with invalid form_field data" do
85
+ # WebMock.allow_net_connect!
86
+ VCR.use_cassette "form-fields/block/create-without-label", :record => :new_episodes do
87
+ line = CF::Line.create("Digitize-0101111-final", "Digitization") do
88
+ CF::InputFormat.new({:line => self, :name => "image_url", :required => true, :valid_type => "url"})
89
+ CF::Station.create({:line => self, :type => "work"}) do |station|
90
+ CF::HumanWorker.new({:station => station, :number => 2, :reward => 20})
91
+ CF::TaskForm.create({:station => station, :title => "Enter text from a business card image", :instruction => "Describe"}) do |i|
92
+ CF::FormField.new({:form => i, :field_type => "SA", :required => "true"})
93
+ end
94
+ end
95
+ end
96
+ line.stations.first.type.should eql("WorkStation")
97
+ line.stations.first.form.form_fields.first.errors.should eql(["Label can't be blank"])
98
+ end
99
+ end
100
+
101
+ it "in plain Ruby way with invalid form_field data" do
102
+ # WebMock.allow_net_connect!
103
+ VCR.use_cassette "form-fields/plain-ruby/create-without-label", :record => :new_episodes do
104
+ line = CF::Line.new("Digitize-0", "Digitization")
105
+ input_format = CF::InputFormat.new({:name => "image_url", :required => true, :valid_type => "url"})
106
+ line.input_formats input_format
107
+
108
+ station = CF::Station.new({:type => "work"})
109
+ line.stations station
110
+
111
+ worker = CF::HumanWorker.new({:number => 2, :reward => 20})
112
+ line.stations.first.worker = worker
113
+
114
+ form = CF::TaskForm.new({:title => "Enter text from a business card image", :instruction => "Describe"})
115
+ line.stations.first.form = form
116
+
117
+ form_fields_1 = CF::FormField.new({:field_type => "SA", :required => "true"})
118
+ line.stations.first.form.form_fields form_fields_1
119
+
120
+ line.stations.first.type.should eql("WorkStation")
121
+ line.stations.first.form.form_fields.first.errors.should eql(["Label can't be blank"])
122
+ end
123
+ end
124
+
125
+ end
126
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require 'rails/all'
3
+ require 'rails/generators/test_case'
4
+ require 'generator_spec/test_case'
5
+
6
+ require 'generators/cf/form/form_generator'
7
+
8
+ module Cf
9
+ module Generators
10
+ describe FormGenerator, "Passing both the Labels and Field:Type" do
11
+ include GeneratorSpec::TestCase
12
+ destination File.expand_path("../tmp", __FILE__)
13
+ arguments %w([company,website] CEO:string Website:url)
14
+
15
+ before { prepare_destination }
16
+
17
+ specify "should generate the custom task form for a rails app with labels and fields" do
18
+ run_generator
19
+ destination_root.should have_structure {
20
+ directory "app" do
21
+ directory "cf_forms" do
22
+ file "company_website_form.html" do
23
+ contains "<!-- CloudFactory Custom Task Form -->"
24
+ contains "<label>{{company}}</label>"
25
+ contains "<label>{{website}}</label>"
26
+ contains '<p><label>CEO</label><input id="ceo" type="text" name="output[ceo]" data-valid-type="string" /></p>'
27
+ contains '<p><label>Website</label><input id="website" type="text" name="output[website]" data-valid-type="url" /></p>'
28
+ end
29
+ end
30
+ end
31
+ }
32
+ end
33
+ end
34
+
35
+ describe FormGenerator, "Passing only the Field:Type without Label. e.g. for forms like Survey" do
36
+ include GeneratorSpec::TestCase
37
+ destination File.expand_path("../tmp", __FILE__)
38
+ arguments %w(CEO:string Website:url)
39
+
40
+ before { prepare_destination }
41
+
42
+ specify "should generate the custom task form for a rails app with fields only" do
43
+ run_generator
44
+ destination_root.should have_structure {
45
+ directory "app" do
46
+ directory "cf_forms" do
47
+ file "custom_task_form.html" do
48
+ contains "<!-- CloudFactory Custom Task Form -->"
49
+ contains '<p><label>CEO</label><input id="ceo" type="text" name="output[ceo]" data-valid-type="string" /></p>'
50
+ contains '<p><label>Website</label><input id="website" type="text" name="output[website]" data-valid-type="url" /></p>'
51
+ end
52
+ end
53
+ end
54
+ }
55
+ end
56
+ end
57
+
58
+
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+ require 'rails/all'
3
+ require 'rails/generators/test_case'
4
+ require 'generator_spec/test_case'
5
+
6
+ require 'generators/cf/install/install_generator'
7
+
8
+ module Cf
9
+ module Generators
10
+ describe InstallGenerator, "using custom matcher" do
11
+ include GeneratorSpec::TestCase
12
+ destination File.expand_path("../tmp", __FILE__)
13
+ arguments %w(valid_api_key)
14
+
15
+ before do
16
+ prepare_destination
17
+ run_generator
18
+ end
19
+
20
+ specify "should generate the initializer for a rails app" do
21
+ run_generator
22
+ destination_root.should have_structure {
23
+ directory "config" do
24
+ directory "initializers" do
25
+ file "cloud_factory.rb" do
26
+ contains "# CloudFactory Initializer"
27
+ contains "valid_api_key"
28
+ end
29
+ end
30
+ end
31
+ }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module CF
5
+ describe CF::RobotWorker do
6
+ context "create a google translator worker" do
7
+ it "should create google_translate_robot worker for first station in a plain ruby way" do
8
+ # WebMock.allow_net_connect!
9
+ VCR.use_cassette "robot_worker/google_translate_robot/plain-ruby/create-worker-in-first-station", :record => :new_episodes do
10
+ line = CF::Line.new("google_translate_robot","Digitization")
11
+ input_format = CF::InputFormat.new({:name => "text", :required => true, :valid_type => "general"})
12
+ line.input_formats input_format
13
+
14
+ station = CF::Station.new({:type => "work"})
15
+ line.stations station
16
+
17
+ worker = CF::RobotWorker.create({:type => "google_translate_robot", :settings => {:data => ["{text}"], :from => "en", :to => "es"}})
18
+ line.stations.first.worker = worker
19
+
20
+ form = CF::TaskForm.new({:title => "Enter text", :instruction => "Describe"})
21
+ line.stations.first.form = form
22
+
23
+ form_fields = CF::FormField.new({:label => "Description", :field_type => "SA", :required => "true"})
24
+ line.stations.first.form.form_fields form_fields
25
+ line.title.should eql("google_translate_robot")
26
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
27
+ line.stations.first.worker.number.should eql(1)
28
+ line.stations.first.worker.settings.should eql({:data => ["{text}"], :from => "en", :to => "es"})
29
+ line.stations.first.worker.type.should eql("GoogleTranslateRobot")
30
+ run = CF::Run.create(line, "google_translate_robot_run", [{"text"=> "I started loving Monsoon", "meta_data_text"=>"monsoon"}])
31
+
32
+ @final_output = run.final_output
33
+ line.stations.first.worker.number.should eq(1)
34
+ @final_output.first.final_output.first.translation_of_text.should eql('Empecé a amar a Monzón')
35
+ end
36
+ end
37
+
38
+ it "should create google_translate_robot in block DSL way" do
39
+ VCR.use_cassette "robot_worker/google_translate_robot/block/create-worker-block-dsl-way", :record => :new_episodes do
40
+ # WebMock.allow_net_connect!
41
+ line = CF::Line.create("google_translate_robot_1","Digitization") do |l|
42
+ CF::InputFormat.new({:line => l, :name => "text", :required => true, :valid_type => "general"})
43
+ CF::Station.create({:line => l, :type => "work"}) do |s|
44
+ CF::RobotWorker.create({:station => s, :type => "google_translate_robot", :settings => {:data => ["{text}"], :from => "en", :to => "es"}})
45
+ CF::TaskForm.create({:station => s, :title => "Enter text", :instruction => "Describe"}) do |i|
46
+ CF::FormField.new({:form => i, :label => "Description", :field_type => "SA", :required => "true"})
47
+ end
48
+ end
49
+ end
50
+ line.title.should eql("google_translate_robot_1")
51
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
52
+ line.stations.first.worker.number.should eql(1)
53
+ line.stations.first.worker.settings.should eql({:data => ["{text}"], :from => "en", :to => "es"})
54
+ line.stations.first.worker.type.should eql("GoogleTranslateRobot")
55
+ run = CF::Run.create(line, "google_translate_robot_run_1", [{"text"=> "I started loving Monsoon", "meta_data_text"=>"monsoon"}])
56
+
57
+ @final_output = run.final_output
58
+ line.stations.first.worker.number.should eq(1)
59
+ @final_output.first.final_output.first.translation_of_text.should eql('Empecé a amar a Monzón')
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ module CF
4
+ describe CF::HumanWorker do
5
+ context "create a worker" do
6
+ it "the block DSL way" do
7
+ # WebMock.allow_net_connect!
8
+ VCR.use_cassette "human_worker/block/create", :record => :new_episodes do
9
+ line = CF::Line.create("human_worker", "Digitization") do |l|
10
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
11
+ CF::Station.create({:line =>l, :type => "work"}) do |s|
12
+ @worker = CF::HumanWorker.new({:station => s, :number => 2, :reward => 20})
13
+ end
14
+ end
15
+ line.stations.first.type.should eql("WorkStation")
16
+ line.stations.first.worker.number.should eql(2)
17
+ line.stations.first.worker.reward.should eql(20)
18
+ end
19
+ end
20
+
21
+ it "in block DSL way with invalid data and should set the error" do
22
+ VCR.use_cassette "human_worker/block/create-with-invalid-data", :record => :new_episodes do
23
+ # WebMock.allow_net_connect!
24
+ line = CF::Line.create("human_worker1", "Digitization") do |l|
25
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
26
+ CF::Station.create({:line =>l, :type => "work"}) do |s|
27
+ @worker = CF::HumanWorker.new({:station => s})
28
+ end
29
+ end
30
+ line.stations.first.type.should eql("WorkStation")
31
+ line.stations.first.worker.errors.should eql("[\"Reward is not a number\", \"Reward must not contain decimal places\"]")
32
+ end
33
+ end
34
+
35
+ it "in plain ruby way with invalid data and should set the error" do
36
+ # WebMock.allow_net_connect!
37
+ VCR.use_cassette "human_worker/plain-ruby/create-with-invalid-data", :record => :new_episodes do
38
+ line = CF::Line.new("human_worker2", "Digitization")
39
+ input_format = CF::InputFormat.new({:name => "image_url", :required => true, :valid_type => "url"})
40
+ line.input_formats input_format
41
+
42
+ station = CF::Station.new({:type => "work"})
43
+ line.stations station
44
+
45
+ worker = CF::HumanWorker.new()
46
+ line.stations.first.worker = worker
47
+
48
+ line.stations.first.type.should eql("WorkStation")
49
+ line.stations.first.worker.errors.should eql("[\"Reward is not a number\", \"Reward must not contain decimal places\"]")
50
+ end
51
+ end
52
+ end
53
+
54
+ context "create a worker with skill_badge and skill_test" do
55
+ it "the Block DSL way" do
56
+ # WebMock.allow_net_connect!
57
+ VCR.use_cassette "human_worker/block/create-with-badge", :record => :new_episodes do
58
+ badge =
59
+ {
60
+ :title => 'Football Fanatic',
61
+ :description => "This qualification allows you to perform work at stations which have this badge.",
62
+ :max_badges => 3,
63
+ :test =>
64
+ {
65
+ :input => {:name => "Lionel Andres Messi", :country => "Argentina"},
66
+ :expected_output =>
67
+ [{:birthplace => "Rosario, Santa Fe, Argentina",:match_options => {:tolerance => 10, :ignore_case => true }},{:position => "CF",:match_options => {:tolerance => 1 }},{:"current-club" => "Barcelona",:match_options => {:tolerance => 1, :ignore_case => false }}]
68
+ }
69
+ }
70
+ line = CF::Line.create("human_worker3", "Digitization") do |l|
71
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
72
+ CF::Station.create({:line =>l, :type => "work"}) do |s|
73
+ @worker = CF::HumanWorker.new({:station => s, :number => 2, :reward => 20, :skill_badge => badge})
74
+ end
75
+ end
76
+ line.stations.first.type.should eql("WorkStation")
77
+ line.stations.first.worker.number.should eql(2)
78
+ line.stations.first.worker.reward.should eql(20)
79
+ line.stations.first.worker.skill_badges.first.should eql([{"title"=>"Football Fanatic", "description"=>"This qualification allows you to perform work at stations which have this badge.", "score"=>nil, "speed"=>nil, "quality_rating"=>nil, "max_badges"=>3, "skill_test"=>{"score_after"=>"submit", "manual_scoring"=>false, "display_answers"=>false, "edit_answers"=>true, "retries"=>0, "pass_percentage"=>100, "test_units"=>[{"input"=>{"name"=>"Lionel Andres Messi", "country"=>"Argentina"}, "expected_output"=>[{"birthplace"=>"Rosario, Santa Fe, Argentina", "match_options"=>{"tolerance"=>"1", "ignore_case"=>"false"}, "position"=>"CF", "current-club"=>"Barcelona"}], "match_options"=>{"tolerance"=>0, "ignore_case"=>false}}]}}])
80
+ line.stations.first.worker.stat_badge.should eql({"approval_rating"=>80, "assignment_duration"=>3600, "abandonment_rate"=>30, "country"=>nil})
81
+ end
82
+ end
83
+
84
+ it "in plain ruby way" do
85
+ # WebMock.allow_net_connect!
86
+ VCR.use_cassette "human_worker/plain-ruby/create-with-badge", :record => :new_episodes do
87
+ skill_badge =
88
+ {
89
+ :title => 'Football Fanatic',
90
+ :description => "This qualification allows you to perform work at stations which have this badge.",
91
+ :max_badges => 3,
92
+ :test =>
93
+ {
94
+ :input => {:name => "Lionel Andres Messi", :country => "Argentina"},
95
+ :expected_output =>
96
+ [{:birthplace => "Rosario, Santa Fe, Argentina",:match_options => {:tolerance => 10, :ignore_case => true }},{:position => "CF",:match_options => {:tolerance => 1 }},{:"current-club" => "Barcelona",:match_options => {:tolerance => 1, :ignore_case => false }}]
97
+ }
98
+ }
99
+ line = CF::Line.new("human_worker4", "Digitization")
100
+ input_format = CF::InputFormat.new({:name => "image_url", :required => true, :valid_type => "url"})
101
+ line.input_formats input_format
102
+
103
+ station = CF::Station.new({:type => "work"})
104
+ line.stations station
105
+
106
+ worker = CF::HumanWorker.new({:number => 2, :reward => 20, :skill_badge => skill_badge})
107
+ line.stations.first.worker = worker
108
+
109
+ line.stations.first.type.should eql("WorkStation")
110
+ line.stations.first.worker.number.should eql(2)
111
+ line.stations.first.worker.reward.should eql(20)
112
+ line.stations.first.worker.skill_badges.first.should eql([{"title"=>"Football Fanatic", "description"=>"This qualification allows you to perform work at stations which have this badge.", "score"=>nil, "speed"=>nil, "quality_rating"=>nil, "max_badges"=>3, "skill_test"=>{"score_after"=>"submit", "manual_scoring"=>false, "display_answers"=>false, "edit_answers"=>true, "retries"=>0, "pass_percentage"=>100, "test_units"=>[{"input"=>{"name"=>"Lionel Andres Messi", "country"=>"Argentina"}, "expected_output"=>[{"birthplace"=>"Rosario, Santa Fe, Argentina", "match_options"=>{"tolerance"=>"1", "ignore_case"=>"false"}, "position"=>"CF", "current-club"=>"Barcelona"}], "match_options"=>{"tolerance"=>0, "ignore_case"=>false}}]}}])
113
+ line.stations.first.worker.stat_badge.should eql({"approval_rating"=>80, "assignment_duration"=>3600, "abandonment_rate"=>30, "country"=>nil})
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end