cloudfactory 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
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,56 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module CF
5
+ describe CF::RobotWorker do
6
+ context "create an image processing robot worker" do
7
+ it "should create image processing robot worker for first station in Block DSL way" do
8
+ # WebMock.allow_net_connect!
9
+ VCR.use_cassette "robot_worker/image_processing_robot/block/create-worker-single-station", :record => :new_episodes do
10
+ line = CF::Line.create("image_processing_robot","Digitization") do |l|
11
+ CF::InputFormat.new({:line => l, :name => "url", :valid_type => "url", :required => "true"})
12
+ CF::Station.create({:line => l, :type => "work"}) do |s|
13
+ CF::RobotWorker.create({:station => s, :type => "image_processing_robot", :settings => {:image => ["{url}"], :sharpen => {:radius => "10"}}})
14
+ end
15
+ end
16
+ run = CF::Run.create(line, "image_processing_robot_run", [{"url"=> "http://wwwdelivery.superstock.com/WI/223/1527/PreviewComp/SuperStock_1527R-020214.jpg"}])
17
+ output = run.final_output
18
+ converted_url = output.first.final_output.first.processed_image_of_url
19
+ File.exist?("/Users/manish/apps/cloudfactory/public#{converted_url}").should eql(true)
20
+ output.first.final_output.first.sharpen.radius.should eql("10")
21
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
22
+ line.stations.first.worker.reward.should eql(0)
23
+ line.stations.first.worker.number.should eql(1)
24
+ line.stations.first.worker.settings.should eql({:image => ["{url}"], :sharpen => {:radius => "10"}})
25
+ line.stations.first.worker.type.should eql("ImageProcessingRobot")
26
+ end
27
+ end
28
+
29
+ it "should create image processing robot worker for first station in a plain ruby way" do
30
+ # WebMock.allow_net_connect!
31
+ VCR.use_cassette "robot_worker/image_processing_robot/plain-ruby/create-worker-in-first-station", :record => :new_episodes do
32
+ line = CF::Line.new("image_processing_robot_1","Digitization")
33
+ input_format = CF::InputFormat.new({:name => "url", :required => true, :valid_type => "url"})
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 => "image_processing_robot", :settings => {:image => ["{url}"], :sharpen => {:radius => "10"}}})
40
+ line.stations.first.worker = worker
41
+
42
+ run = CF::Run.create(line, "image_processing_robot_run_1", [{"url"=> "http://wwwdelivery.superstock.com/WI/223/1527/PreviewComp/SuperStock_1527R-020214.jpg"}])
43
+ output = run.final_output
44
+ converted_url = output.first.final_output.first.processed_image_of_url
45
+ File.exist?("/Users/manish/apps/cloudfactory/public#{converted_url}").should eql(true)
46
+ output.first.final_output.first.sharpen.radius.should eql("10")
47
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
48
+ line.stations.first.worker.reward.should eql(0)
49
+ line.stations.first.worker.number.should eql(1)
50
+ line.stations.first.worker.settings.should eql({:image => ["{url}"], :sharpen => {:radius => "10"}})
51
+ line.stations.first.worker.type.should eql("ImageProcessingRobot")
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::InputFormat do
4
+ context "create an input header" do
5
+ it "in plain ruby way within line" do
6
+ # WebMock.allow_net_connect!
7
+ VCR.use_cassette "input_formats/plain-ruby/create-within-line", :record => :new_episodes do
8
+ line = CF::Line.new("Digitize","Digitization")
9
+ input_format = CF::InputFormat.new({:name => "Company", :required => true, :valid_type => "general"})
10
+ line.input_formats input_format
11
+ line.input_formats.first.name.should eql("Company")
12
+ line.input_formats.first.valid_type.should eql("general")
13
+ end
14
+ end
15
+
16
+ it "in plain ruby way within station" do
17
+ # WebMock.allow_net_connect!
18
+ VCR.use_cassette "input_formats/plain-ruby/create", :record => :new_episodes do
19
+ attrs = {:name => "image_url",
20
+ :required => true,
21
+ :valid_type => "url"
22
+ }
23
+
24
+ line = CF::Line.new("Digitize-121","Digitization")
25
+ input_format = CF::InputFormat.new(attrs)
26
+ line.input_formats input_format
27
+ input_format1 = CF::InputFormat.new({:name => "image", :required => true, :valid_type => "url"})
28
+ line.input_formats input_format1
29
+ station = CF::Station.new({:type => "work"})
30
+ line.stations station
31
+
32
+ line.title.should eq("Digitize-121")
33
+ line.input_formats.first.name.should eq("image_url")
34
+ line.input_formats.first.required.should eq(true)
35
+ line.input_formats.first.valid_type.should eq("url")
36
+ line.input_formats.last.name.should eq("image")
37
+ line.input_formats.last.required.should eq(true)
38
+ line.input_formats.last.valid_type.should eq("url")
39
+ end
40
+ end
41
+
42
+ it "in block DSL way within line" do
43
+ # WebMock.allow_net_connect!
44
+ VCR.use_cassette "input_formats/block/create-input-headers-of-line", :record => :new_episodes do
45
+ line = CF::Line.create("Digitize-2","Digitization") do |l|
46
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
47
+ CF::InputFormat.new({:line => l, :name => "image", :required => true, :valid_type => "url"})
48
+ end
49
+ line.input_formats[0].name.should eq("image_url")
50
+ line.input_formats[1].name.should eq("image")
51
+ end
52
+ end
53
+
54
+ it "in block DSL way within station" do
55
+ # WebMock.allow_net_connect!
56
+ VCR.use_cassette "input_formats/block/create-input-headers-of-station", :record => :new_episodes do
57
+ line = CF::Line.create("Digitize-3","Digitization") do |l|
58
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
59
+ CF::InputFormat.new({:line => l, :name => "image", :required => true, :valid_type => "url"})
60
+ CF::Station.new({:line => l, :type => "work"})
61
+ end
62
+ line.input_formats[0].name.should eq("image_url")
63
+ line.input_formats[1].name.should eq("image")
64
+ end
65
+ end
66
+ end
67
+
68
+ context "return all the input headers" do
69
+ it "should return all the input headers of a line " do
70
+ # WebMock.allow_net_connect!
71
+ VCR.use_cassette "input_formats/block/input-headers-of-line", :record => :new_episodes do
72
+ line = CF::Line.create("Digitize-111","Digitization") do |l|
73
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
74
+ CF::InputFormat.new({:line => l, :name => "image", :required => true, :valid_type => "url"})
75
+ CF::Station.new({:line => l, :type => "work"})
76
+ end
77
+ input_formats_of_line = CF::InputFormat.all(line)
78
+ # => getting input_formats response need to be modified
79
+ input_formats_of_line.map(&:name).should include("image_url")
80
+ input_formats_of_line.map(&:name).should include("image")
81
+ input_formats_of_line.map(&:valid_type).should include("url")
82
+ end
83
+ end
84
+ end
85
+
86
+ context "create an input_format" do
87
+ it "in Block DSL way without name to set the error attribute" do
88
+ # WebMock.allow_net_connect!
89
+ VCR.use_cassette "input_formats/block/create-invalid-input-formats", :record => :new_episodes do
90
+ line = CF::Line.create("Digitize-2","Digitization") do |l|
91
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
92
+ CF::InputFormat.new({:line => l, :required => true, :valid_type => "url"})
93
+ end
94
+ line.input_formats[0].name.should eq("image_url")
95
+ line.input_formats[1].errors.should eql(["Name can't be blank"])
96
+ end
97
+ end
98
+
99
+ it "in plain Ruby way with invalid data to set the error attribute" do
100
+ # WebMock.allow_net_connect!
101
+ VCR.use_cassette "input_formats/plain-ruby/create-invalid-input-formats", :record => :new_episodes do
102
+ line = CF::Line.new("Digitize-3","Digitization")
103
+ input_format_1 = CF::InputFormat.new({:name => "image_url", :required => true, :valid_type => "url"})
104
+ line.input_formats input_format_1
105
+ input_format_2 = CF::InputFormat.new({:required => true, :valid_type => "url"})
106
+ line.input_formats input_format_2
107
+
108
+ line.input_formats[0].name.should eq("image_url")
109
+ line.input_formats[1].errors.should eql(["Name can't be blank"])
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ module CF
5
+ describe CF::RobotWorker do
6
+ context "create a keyword matching robot worker and text extraction robot" do
7
+ it "should create keyword matching robot worker for first station in Block DSL way" do
8
+ # WebMock.allow_net_connect!
9
+ VCR.use_cassette "robot_worker/keyword_matching_robot/block/create-worker-single-station", :record => :new_episodes do
10
+ line = CF::Line.create("keyword_matching_robot","Digitization") do |l|
11
+ CF::InputFormat.new({:line => l, :name => "url", :valid_type => "url", :required => "true"})
12
+ CF::Station.create({:line => l, :type => "work"}) do |s|
13
+ CF::RobotWorker.create({:station => s, :type => "text_extraction_robot", :settings => {:url => ["{url}"]}})
14
+ end
15
+ CF::Station.create({:line => l, :type => "work"}) do |s1|
16
+ CF::RobotWorker.create({:station => s1, :type => "keyword_matching_robot", :settings => {:content => ["{contents_of_url}"], :keywords => ["SaaS","see","additional","deepak","saroj"]}})
17
+ end
18
+ end
19
+ run = CF::Run.create(line, "keyword_matching_robot_run", [{"url"=> "http://techcrunch.com/2011/07/26/with-v2-0-assistly-brings-a-simple-pricing-model-rewards-and-a-bit-of-free-to-customer-service-software"}])
20
+ output = run.final_output
21
+ output.first.final_output.first.included_keywords_count_in_contents_of_url.should eql(["3", "2", "2"])
22
+ output.first.final_output.first.keyword_included_in_contents_of_url.should eql(["SaaS", "see", "additional"])
23
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
24
+ line.stations.first.worker.reward.should eql(1)
25
+ line.stations.first.worker.number.should eql(1)
26
+ line.stations.first.worker.settings.should eql({:url => ["{url}"]})
27
+ line.stations.first.worker.type.should eql("TextExtractionRobot")
28
+ line.stations.last.worker.class.should eql(CF::RobotWorker)
29
+ line.stations.last.worker.reward.should eql(1)
30
+ line.stations.last.worker.number.should eql(1)
31
+ line.stations.last.worker.settings.should eql({:content => ["{contents_of_url}"], :keywords => ["SaaS","see","additional","deepak","saroj"]})
32
+ line.stations.last.worker.type.should eql("KeywordMatchingRobot")
33
+ end
34
+ end
35
+
36
+ it "should create keyword matching robot worker for first station in a plain ruby way" do
37
+ # WebMock.allow_net_connect!
38
+ VCR.use_cassette "robot_worker/keyword_matching_robot/plain-ruby/create-worker-in-first-station", :record => :new_episodes do
39
+ line = CF::Line.new("keyword_matching_robot_1","Digitization")
40
+ input_format = CF::InputFormat.new({:name => "url", :required => true, :valid_type => "url"})
41
+ line.input_formats input_format
42
+
43
+ station = CF::Station.new({:type => "work"})
44
+ line.stations station
45
+
46
+ worker = CF::RobotWorker.create({:type => "text_extraction_robot", :settings => {:url => ["{url}"]}})
47
+ line.stations.first.worker = worker
48
+
49
+ station_1 = CF::Station.new({:type => "work"})
50
+ line.stations station
51
+
52
+ worker = CF::RobotWorker.create({:type => "keyword_matching_robot", :settings => {:content => ["{contents_of_url}"], :keywords => ["SaaS","see","additional","deepak","saroj"]}})
53
+ line.stations.last.worker = worker
54
+
55
+ run = CF::Run.create(line, "keyword_matching_robot_run_1", [{"url"=> "http://techcrunch.com/2011/07/26/with-v2-0-assistly-brings-a-simple-pricing-model-rewards-and-a-bit-of-free-to-customer-service-software"}])
56
+ output = run.final_output
57
+ output.first.final_output.first.included_keywords_count_in_contents_of_url.should eql(["3", "2", "2"])
58
+ output.first.final_output.first.keyword_included_in_contents_of_url.should eql(["SaaS", "see", "additional"])
59
+ line.stations.first.worker.class.should eql(CF::RobotWorker)
60
+ line.stations.first.worker.reward.should eql(1)
61
+ line.stations.first.worker.number.should eql(1)
62
+ line.stations.first.worker.settings.should eql({:url => ["{url}"]})
63
+ line.stations.first.worker.type.should eql("TextExtractionRobot")
64
+ line.stations.last.worker.class.should eql(CF::RobotWorker)
65
+ line.stations.last.worker.reward.should eql(1)
66
+ line.stations.last.worker.number.should eql(1)
67
+ line.stations.last.worker.settings.should eql({:content => ["{contents_of_url}"], :keywords => ["SaaS","see","additional","deepak","saroj"]})
68
+ line.stations.last.worker.type.should eql("KeywordMatchingRobot")
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
data/spec/line_spec.rb ADDED
@@ -0,0 +1,338 @@
1
+ require 'spec_helper'
2
+
3
+ describe CF::Line do
4
+ let(:input_format) { CF::InputFormat.new({:name => "image_url", :required => true, :valid_type => "url"}) }
5
+
6
+ context "create a line" do
7
+ it "the plain ruby way" do
8
+ VCR.use_cassette "lines/block/create", :record => :new_episodes do
9
+ # WebMock.allow_net_connect!
10
+ line = CF::Line.new("Digit-02", "Digitization", {:public => false, :description => "this is description"})
11
+ line.title.should eq("Digit-02")
12
+ line.department_name.should eq("Digitization")
13
+ end
14
+ end
15
+
16
+ it "using block with variable" do
17
+ VCR.use_cassette "lines/block/create-block-var", :record => :new_episodes do
18
+ # WebMock.allow_net_connect!
19
+ line = CF::Line.create("Digitizecard-10","Digitization") do |l|
20
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
21
+ CF::InputFormat.new({:line => l, :name => "image", :required => true, :valid_type => "url"})
22
+ CF::Station.new({:line => l, :type => "work"})
23
+ end
24
+ line.title.should eq("Digitizecard-10")
25
+ line.department_name.should eq("Digitization")
26
+ line.input_formats[0].name.should eql("image_url")
27
+ line.input_formats[1].name.should eql("image")
28
+ line.stations.first.type.should eq("WorkStation")
29
+ end
30
+ end
31
+
32
+ it "using block without variable" do
33
+ VCR.use_cassette "lines/block/create-without-block-var", :record => :new_episodes do
34
+ # WebMock.allow_net_connect!
35
+ line = CF::Line.create("Digitizeard", "Digitization") do
36
+ CF::InputFormat.new({:line => self, :name => "image_url", :required => true, :valid_type => "url"})
37
+ CF::Station.create({:line => self, :type => "work"}) do |station|
38
+ CF::HumanWorker.new({:station => station, :number => 2, :reward => 20})
39
+ CF::TaskForm.create({:station => station, :title => "Enter text from a business card image", :instruction => "Describe"}) do |i|
40
+ CF::FormField.new({:form => i, :label => "First Name", :field_type => "SA", :required => "true"})
41
+ CF::FormField.new({:form => i, :label => "Middle Name", :field_type => "SA"})
42
+ CF::FormField.new({:form => i, :label => "Last Name", :field_type => "SA", :required => "true"})
43
+ end
44
+ end
45
+ end
46
+ line.title.should eq("Digitizeard")
47
+ line.department_name.should eq("Digitization")
48
+ line.input_formats.first.name.should eql("image_url")
49
+ line.stations.first.type.should eq("WorkStation")
50
+ line.stations.first.worker.number.should eq(2)
51
+ line.stations.first.form.instruction.should eq("Describe")
52
+ line.stations.first.form.form_fields.first.label.should eq("First Name")
53
+ end
54
+ end
55
+
56
+ it "with all the optional params" do
57
+ VCR.use_cassette "lines/block/create-optional-params", :record => :new_episodes do
58
+ # WebMock.allow_net_connect!
59
+ line = CF::Line.new("Lineame", "Digitization", {:public => true, :description => "this is description"})
60
+ line.title.should eq("Lineame")
61
+ line.department_name.should eq("Digitization")
62
+ line.public.should eql(true)
63
+ line.description.should eq("this is description")
64
+ end
65
+ end
66
+ end
67
+
68
+ context "with 1 station" do
69
+ it "create with a new station" do
70
+ VCR.use_cassette "lines/block/create-one-station", :record => :new_episodes do
71
+ # WebMock.allow_net_connect!
72
+ line = CF::Line.create("Digitizer1", "Digitization") do |l|
73
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
74
+ CF::Station.create({:line => l, :type => "work"}) do |station|
75
+ CF::HumanWorker.new({:line => l, :station => station, :number => 2, :reward => 20})
76
+ CF::TaskForm.create({:station => station, :title => "Enter text from a business card image", :instruction => "Describe"}) do |i|
77
+ CF::FormField.new({:form => i, :label => "First Name", :field_type => "SA", :required => "true"})
78
+ CF::FormField.new({:form => i, :label => "Middle Name", :field_type => "SA"})
79
+ CF::FormField.new({:form => i, :label => "Last Name", :field_type => "SA", :required => "true"})
80
+ end
81
+ end
82
+ end
83
+ line.title.should eq("Digitizer1")
84
+ line.department_name.should eq("Digitization")
85
+ line.input_formats.first.name.should eql("image_url")
86
+ line.stations.first.type.should eq("WorkStation")
87
+ line.stations.first.worker.number.should eq(2)
88
+ line.stations.first.worker.reward.should eq(20)
89
+ line.stations.first.form.title.should eq("Enter text from a business card image")
90
+ line.stations.first.form.instruction.should eq("Describe")
91
+ line.stations.first.form.form_fields.first.label.should eq("First Name")
92
+ line.stations.first.form.form_fields.first.field_type.should eq("SA")
93
+ line.stations.first.form.form_fields.first.required.should eq(true)
94
+ end
95
+ end
96
+ end
97
+
98
+ context "listing lines" do
99
+ it "should list all the existing lines that belong to particular owner" do
100
+ # WebMock.allow_net_connect!
101
+ VCR.use_cassette "lines/block/listing-lines", :record => :new_episodes do
102
+ 5.times do |i|
103
+ CF::Line.new("Digitizeard---#{i}", "Digitization", {:public => false, :description => "#{i}-this is description"})
104
+ end
105
+ lines = CF::Line.all
106
+ lines.last.title.should eq("digitizeard---4")
107
+ end
108
+ end
109
+
110
+ it "should list all the public lines" do
111
+ # WebMock.allow_net_connect!
112
+ VCR.use_cassette "lines/block/listing-public-lines", :record => :new_episodes do
113
+ 1.times do |i|
114
+ CF::Line.new("Digitizecarr-#{i}", "Digitization", {:public => false, :description => "#{i}-this is description"})
115
+ end
116
+ 2.times do |i|
117
+ CF::Line.new("Lineee-#{i}", "Digitization", {:public => true, :description => "#{i}-this is description"})
118
+ end
119
+
120
+ lines = CF::Line.public_lines
121
+ lines.last.title.should eq("lineee-1")
122
+ end
123
+ end
124
+ end
125
+
126
+ context "an existing line" do
127
+ it "should get the line info by passing the line object" do
128
+ # WebMock.allow_net_connect!
129
+ VCR.use_cassette "lines/block/line-info", :record => :new_episodes do
130
+ line = CF::Line.new("Digitize-22", "Digitization", {:public => true, :description => "this is description"})
131
+ get_line = CF::Line.info(line)
132
+ get_line.title.should eql("digitize-22")
133
+ get_line.public.should eql(true)
134
+ get_line.description.should eql("this is description")
135
+ end
136
+ end
137
+
138
+ it "should get the line info by passing just the title" do
139
+ # WebMock.allow_net_connect!
140
+ VCR.use_cassette "lines/block/line-info-title", :record => :new_episodes do
141
+ line = CF::Line.new("digitizee", "Digitization", {:public => true, :description => "this is description"})
142
+ get_line = CF::Line.info(line.title)
143
+ get_line.title.should eql("digitizee")
144
+ get_line.public.should eql(true)
145
+ get_line.description.should eql("this is description")
146
+ end
147
+ end
148
+
149
+ it "should render the error sent via the API overriding the RestClient one" do
150
+ # WebMock.allow_net_connect!
151
+ VCR.use_cassette "lines/block/non-existing-line", :record => :new_episodes do
152
+ get_line = CF::Line.info("non-existing-line-title")
153
+ get_line.code.should eql(404)
154
+ get_line.error.message.should match("Line document not found using selector")
155
+ end
156
+ end
157
+
158
+ end
159
+
160
+ context "Updating a line" do
161
+ it "updates an existing line" do
162
+ # WebMock.allow_net_connect!
163
+ VCR.use_cassette "lines/block/update-line", :record => :new_episodes do
164
+ line = CF::Line.new("Digitizd-14", "Digitization", {:public => true, :description => "this is description"})
165
+ line.update({:title => "Newtitle-1", :department_name => "Survey", :description => "this is new description"})
166
+ updated_line = CF::Line.info(line)
167
+ updated_line.title.should eql("newtitle-1")
168
+ updated_line.title.should_not eql("digitizd-14")
169
+ # department is not updated
170
+ # updated_line.department_name.should eql("Survey")
171
+ # updated_line.department_name.should_not eql("Digitization")
172
+ updated_line.description.should eql("this is new description")
173
+ updated_line.description.should_not eql("this is description")
174
+ end
175
+ end
176
+ end
177
+
178
+ context "deleting" do
179
+ it "should delete a line" do
180
+ # WebMock.allow_net_connect!
181
+ VCR.use_cassette "lines/block/delete-line", :record => :new_episodes do
182
+ line = CF::Line.new("Digitizerd-2", "Digitization", {:public => true, :description => "this is description"})
183
+ resp = line.destroy
184
+ resp.code.should eql(200)
185
+ deleted_resp = CF::Line.info(line)
186
+ deleted_resp.error.message.should eql("Line document not found using selector: {:public=>true, :title=>\"digitizerd-2\"}")
187
+ end
188
+ end
189
+
190
+ it "should delete a line" do
191
+ # WebMock.allow_net_connect!
192
+ VCR.use_cassette "lines/block/delete-line-with-title", :record => :new_episodes do
193
+ line = CF::Line.new("Digitizerd-2", "Digitization", {:public => true, :description => "this is description"})
194
+ resp = CF::Line.destroy("Digitizerd-2")
195
+ resp.code.should eql(200)
196
+ deleted_resp = CF::Line.info(line)
197
+ deleted_resp.error.message.should eql("Line document not found using selector: {:public=>true, :title=>\"digitizerd-2\"}")
198
+ end
199
+ end
200
+ end
201
+
202
+ context "create a basic line" do
203
+ it "should create a basic line with one station" do
204
+ # WebMock.allow_net_connect!
205
+ VCR.use_cassette "lines/block/create-basic-line", :record => :new_episodes do
206
+ line = CF::Line.create("Digiard-11","Digitization") do |l|
207
+ CF::InputFormat.new({:line => l, :name => "image_url", :required => true, :valid_type => "url"})
208
+ CF::Station.create({:line => l, :type => "work"}) do |s|
209
+ CF::HumanWorker.new({:station => s, :number => 2, :reward => 20})
210
+ CF::TaskForm.create({:station => s, :title => "Enter text from a business card image", :instruction => "Describe"}) do |i|
211
+ CF::FormField.new({:form => i, :label => "First Name", :field_type => "SA", :required => "true"})
212
+ CF::FormField.new({:form => i, :label => "Middle Name", :field_type => "SA"})
213
+ CF::FormField.new({:form => i, :label => "Last Name", :field_type => "SA", :required => "true"})
214
+ end
215
+ end
216
+ end
217
+ line.title.should eq("Digiard-11")
218
+ line.input_formats.first.name.should eql("image_url")
219
+ line.stations.first.type.should eq("WorkStation")
220
+ line.stations.first.worker.number.should eq(2)
221
+ line.stations.first.worker.reward.should eq(20)
222
+ line.stations.first.form.title.should eq("Enter text from a business card image")
223
+ line.stations.first.form.instruction.should eq("Describe")
224
+ line.stations.first.form.form_fields[0].label.should eq("First Name")
225
+ line.stations.first.form.form_fields[0].field_type.should eq("SA")
226
+ line.stations.first.form.form_fields[0].required.should eq(true)
227
+ line.stations.first.form.form_fields[1].label.should eq("Middle Name")
228
+ line.stations.first.form.form_fields[1].field_type.should eq("SA")
229
+ line.stations.first.form.form_fields[1].required.should eq(nil)
230
+ line.stations.first.form.form_fields[2].label.should eq("Last Name")
231
+ line.stations.first.form.form_fields[2].field_type.should eq("SA")
232
+ line.stations.first.form.form_fields[2].required.should eq(true)
233
+ end
234
+ end
235
+ end
236
+
237
+ context "create line using plain ruby way" do
238
+ it "should create a station " do
239
+ # WebMock.allow_net_connect!
240
+ VCR.use_cassette "lines/plain-ruby/create-station", :record => :new_episodes do
241
+ line = CF::Line.new("Digitizeardd7", "Digitization")
242
+ CF::InputFormat.new({:line => line, :name => "image_url", :required => true, :valid_type => "url"})
243
+ station = CF::Station.new({:type => "work"})
244
+ line.stations station
245
+ line.stations.first.type.should eql("WorkStation")
246
+ end
247
+ end
248
+
249
+ it "should create a human worker within station" do
250
+ # WebMock.allow_net_connect!
251
+ VCR.use_cassette "lines/plain-ruby/create-station-with-worker", :record => :new_episodes do
252
+ line = CF::Line.new("Digitize-card6", "Digitization")
253
+ CF::InputFormat.new({:line => line, :name => "image_url", :required => true, :valid_type => "url"})
254
+ station = CF::Station.new({:type => "work"})
255
+ line.stations station
256
+ worker = CF::HumanWorker.new({:number => 2, :reward => 20})
257
+ line.stations.first.worker = worker
258
+ line.stations.first.type.should eql("WorkStation")
259
+ line.stations.first.worker.number.should eql(2)
260
+ line.stations.first.worker.reward.should eql(20)
261
+ end
262
+ end
263
+
264
+ it "should create a TaskForm within station" do
265
+ # WebMock.allow_net_connect!
266
+ VCR.use_cassette "lines/plain-ruby/create-form", :record => :new_episodes do
267
+ line = CF::Line.new("Diggard-1", "Digitization")
268
+ station = CF::Station.new({:type => "work"})
269
+ line.stations station
270
+
271
+ worker = CF::HumanWorker.new({:number => 2, :reward => 20})
272
+ line.stations.first.worker = worker
273
+
274
+ form = CF::TaskForm.new({:title => "Enter text from a business card image", :instruction => "Describe"})
275
+ line.stations.first.form = form
276
+
277
+ line.stations.first.form.title.should eql("Enter text from a business card image")
278
+ line.stations.first.form.instruction.should eql("Describe")
279
+ end
280
+ end
281
+
282
+ it "should create an input_format within line" do
283
+ # WebMock.allow_net_connect!
284
+ VCR.use_cassette "lines/plain-ruby/create-input-header", :record => :new_episodes do
285
+ line = CF::Line.new("Digard-2", "Digitization")
286
+ input_format = CF::InputFormat.new({:name => "image_url", :required => true, :valid_type => "url"})
287
+ line.input_formats input_format
288
+ station = CF::Station.new({:type => "work"})
289
+ line.stations station
290
+ line.stations.first.input_formats.first['name'].should eq("image_url")
291
+ line.stations.first.input_formats.first['required'].should eq(true)
292
+ line.stations.first.input_formats.first['valid_type'].should eq("url")
293
+ end
294
+ end
295
+
296
+ it "should create form fields within the standard instruction" do
297
+ # WebMock.allow_net_connect!
298
+ VCR.use_cassette "lines/plain-ruby/create-form-fields", :record => :new_episodes do
299
+ line = CF::Line.new("Digitized-4", "Digitization")
300
+ station = CF::Station.new({:type => "work"})
301
+ line.stations station
302
+
303
+ worker = CF::HumanWorker.new({:number => 2, :reward => 20})
304
+ line.stations.first.worker = worker
305
+
306
+ form = CF::TaskForm.new({:title => "Enter text from a business card image", :instruction => "Describe"})
307
+ line.stations.first.form = form
308
+
309
+ form_fields_1 = CF::FormField.new({:label => "First Name", :field_type => "SA", :required => "true"})
310
+ line.stations.first.form.form_fields form_fields_1
311
+ form_fields_2 = CF::FormField.new({:label => "Middle Name", :field_type => "SA"})
312
+ line.stations.first.form.form_fields form_fields_2
313
+ form_fields_3 = CF::FormField.new({:label => "Last Name", :field_type => "SA", :required => "true"})
314
+ line.stations.first.form.form_fields form_fields_3
315
+
316
+ line.stations.first.form.form_fields[0].label.should eql("First Name")
317
+ line.stations.first.form.form_fields[0].field_type.should eq("SA")
318
+ line.stations.first.form.form_fields[0].required.should eq(true)
319
+ line.stations.first.form.form_fields[1].label.should eql("Middle Name")
320
+ line.stations.first.form.form_fields[1].field_type.should eq("SA")
321
+ line.stations.first.form.form_fields[2].label.should eql("Last Name")
322
+ line.stations.first.form.form_fields[2].field_type.should eq("SA")
323
+ line.stations.first.form.form_fields[2].required.should eq(true)
324
+ end
325
+ end
326
+ end
327
+
328
+ context "create a line" do
329
+ it "the plain ruby way" do
330
+ # WebMock.allow_net_connect!
331
+ VCR.use_cassette "lines/plain-ruby/create-line-with-used-title", :record => :new_episodes do
332
+ line = CF::Line.new("new_line", "Digitization")
333
+ line_1 = CF::Line.new("new_line", "Digitization")
334
+ line_1.errors.should eql("[\"Title is already taken for this account\"]")
335
+ end
336
+ end
337
+ end
338
+ end