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.
- data/.gitignore +11 -0
- data/.rspec +1 -0
- data/Gemfile +10 -0
- data/README.md +44 -0
- data/Rakefile +40 -0
- data/bin/cf +8 -0
- data/cf.gemspec +76 -0
- data/example/google_translate_app/Gemfile +12 -0
- data/example/google_translate_app/config.ru +7 -0
- data/example/google_translate_app/google_translate_input.csv +4 -0
- data/example/google_translate_app/google_translator_app.rb +53 -0
- data/example/google_translate_app/views/index.haml +2 -0
- data/example/google_translate_app/views/layout.haml +7 -0
- data/example/google_translate_app/views/run.haml +4 -0
- data/example/google_translate_app/views/style.sass +2 -0
- data/example/human_worker_app/Gemfile +12 -0
- data/example/human_worker_app/config.ru +7 -0
- data/example/human_worker_app/human_worker_app.rb +55 -0
- data/example/human_worker_app/human_worker_input.csv +5 -0
- data/example/human_worker_app/public/app.js +12 -0
- data/example/human_worker_app/temp.csv +3 -0
- data/example/human_worker_app/views/index.haml +15 -0
- data/example/human_worker_app/views/layout.haml +10 -0
- data/example/human_worker_app/views/result.haml +18 -0
- data/example/human_worker_app/views/run.haml +12 -0
- data/example/human_worker_app/views/style.sass +25 -0
- data/example/sample_yaml_files/concept_tagging_robot.yaml +18 -0
- data/example/sample_yaml_files/content_scraping_robot.yaml +19 -0
- data/example/sample_yaml_files/entity_extraction_robot.yaml +18 -0
- data/example/sample_yaml_files/google_translate_robot.yaml +20 -0
- data/example/sample_yaml_files/image_processing_robot.yaml +20 -0
- data/example/sample_yaml_files/keyword_matching_and_text_extraction_robot.yaml +26 -0
- data/example/sample_yaml_files/mailer_robot.yaml +21 -0
- data/example/sample_yaml_files/media_converter_robot.yaml +21 -0
- data/example/sample_yaml_files/media_splitting_robot.yaml +20 -0
- data/example/sample_yaml_files/multiple_skill_badge.yaml +75 -0
- data/example/sample_yaml_files/sentiment_robot.yaml +19 -0
- data/example/sample_yaml_files/skill_badge.yaml +56 -0
- data/example/sample_yaml_files/stat_badge.yaml +40 -0
- data/example/sample_yaml_files/term_extraction_robot.yaml +20 -0
- data/example/sample_yaml_files/tournament_station_and_form_fields.yaml +40 -0
- data/features/form_generation.feature +46 -0
- data/features/form_preview.feature +98 -0
- data/features/line_creation.feature +99 -0
- data/features/line_deletion.feature +50 -0
- data/features/line_generation.feature +57 -0
- data/features/run.feature +141 -0
- data/features/support/cli_steps.rb +16 -0
- data/features/support/env.rb +23 -0
- data/features/target_url.feature +82 -0
- data/fixtures/api_credentials_example.yml +4 -0
- data/fixtures/input_data/media_converter_robot.csv +2 -0
- data/fixtures/input_data/test.csv +2 -0
- data/lib/cf.rb +94 -0
- data/lib/cf/account.rb +32 -0
- data/lib/cf/cli.rb +52 -0
- data/lib/cf/cli/config.rb +87 -0
- data/lib/cf/cli/form.rb +82 -0
- data/lib/cf/cli/line.rb +237 -0
- data/lib/cf/cli/production.rb +62 -0
- data/lib/cf/cli/templates/css_file.css.erb +22 -0
- data/lib/cf/cli/templates/form_preview.html.erb +17 -0
- data/lib/cf/cli/templates/html_file.html.erb +21 -0
- data/lib/cf/cli/templates/js_file.js.erb +18 -0
- data/lib/cf/cli/templates/line.tt +55 -0
- data/lib/cf/cli/templates/sample-line/form.css +27 -0
- data/lib/cf/cli/templates/sample-line/form.html +26 -0
- data/lib/cf/cli/templates/sample-line/form.js +7 -0
- data/lib/cf/cli/templates/sample-line/line.yml.erb +67 -0
- data/lib/cf/cli/templates/sample-line/sample-line.csv +3 -0
- data/lib/cf/client.rb +56 -0
- data/lib/cf/custom_task_form.rb +136 -0
- data/lib/cf/department.rb +24 -0
- data/lib/cf/final_output.rb +20 -0
- data/lib/cf/form_field.rb +62 -0
- data/lib/cf/human_worker.rb +67 -0
- data/lib/cf/input_format.rb +134 -0
- data/lib/cf/line.rb +231 -0
- data/lib/cf/robot_worker.rb +31 -0
- data/lib/cf/run.rb +158 -0
- data/lib/cf/station.rb +340 -0
- data/lib/cf/task_form.rb +147 -0
- data/lib/cf/version.rb +3 -0
- data/lib/generators/cf/form/form_generator.rb +55 -0
- data/lib/generators/cf/form/templates/cf_form.html.erb +11 -0
- data/lib/generators/cf/install/install_generator.rb +22 -0
- data/lib/generators/cf/install/templates/README +13 -0
- data/lib/generators/cf/install/templates/cloud_factory.rb +7 -0
- data/spec/account_spec.rb +11 -0
- data/spec/badge_spec.rb +88 -0
- data/spec/concept_tagging_robot_spec.rb +54 -0
- data/spec/config_spec.rb +20 -0
- data/spec/content_scraping_robot_spec.rb +58 -0
- data/spec/custom_task_form_spec.rb +190 -0
- data/spec/department_spec.rb +14 -0
- data/spec/entity_extraction_robot_spec.rb +56 -0
- data/spec/form_field_spec.rb +126 -0
- data/spec/generators/form_generator_spec.rb +60 -0
- data/spec/generators/install_generator_spec.rb +35 -0
- data/spec/google_translate_robot_spec.rb +64 -0
- data/spec/human_worker_spec.rb +118 -0
- data/spec/image_processing_robot_spec.rb +56 -0
- data/spec/input_format_spec.rb +113 -0
- data/spec/keyword_matching_and_text_extraction_robot_spec.rb +73 -0
- data/spec/line_spec.rb +338 -0
- data/spec/mailer_robot_spec.rb +62 -0
- data/spec/media_converter_robot_spec.rb +72 -0
- data/spec/media_splitting_robot_spec.rb +62 -0
- data/spec/run_spec.rb +298 -0
- data/spec/sentiment_robot_spec.rb +56 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/station_spec.rb +256 -0
- data/spec/task_form_spec.rb +96 -0
- data/spec/term_extraction_robot_spec.rb +58 -0
- data/spec/text_appending_robot_spec.rb +86 -0
- metadata +472 -0
data/lib/cf/cli/line.rb
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require 'thor/group'
|
|
3
|
+
|
|
4
|
+
module Cf
|
|
5
|
+
class Newline < Thor::Group
|
|
6
|
+
include Thor::Actions
|
|
7
|
+
include Cf::Config
|
|
8
|
+
source_root File.expand_path('../templates/', __FILE__)
|
|
9
|
+
argument :title, :type => :string, :desc => "The line title"
|
|
10
|
+
argument :yaml_destination, :type => :string, :required => true
|
|
11
|
+
|
|
12
|
+
def generate_line_template
|
|
13
|
+
arr = yaml_destination.split("/")
|
|
14
|
+
arr.pop
|
|
15
|
+
line_destination = arr.join("/")
|
|
16
|
+
template("sample-line/line.yml.erb", yaml_destination)
|
|
17
|
+
copy_file("sample-line/form.css", "#{line_destination}/station_2/form.css")
|
|
18
|
+
copy_file("sample-line/form.html", "#{line_destination}/station_2/form.html")
|
|
19
|
+
copy_file("sample-line/form.js", "#{line_destination}/station_2/form.js")
|
|
20
|
+
copy_file("sample-line/sample-line.csv", "#{line_destination}/input/#{title.underscore.dasherize}.csv")
|
|
21
|
+
FileUtils.mkdir("#{line_destination}/output")
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
module Cf
|
|
28
|
+
class Line < Thor
|
|
29
|
+
include Cf::Config
|
|
30
|
+
desc "line generate LINE-TITLE", "generates a line template at <line-title>/line.yml"
|
|
31
|
+
method_option :force, :type => :boolean, :default => false, :aliases => "-f", :desc => "force to overwrite the files if the line already exists, default is false"
|
|
32
|
+
# method_option :with_custom_form, :type => :boolean, :default => false, :aliases => "-wcf", :desc => "generate the template with custom task form and the sample files, default is true"
|
|
33
|
+
|
|
34
|
+
def generate(title=nil)
|
|
35
|
+
if title.present?
|
|
36
|
+
line_destination = "#{title.underscore.dasherize}"
|
|
37
|
+
yaml_destination = "#{line_destination}/line.yml"
|
|
38
|
+
FileUtils.rm_rf(line_destination, :verbose => true) if options.force? && File.exist?(line_destination)
|
|
39
|
+
if File.exist?(line_destination)
|
|
40
|
+
say "Skipping #{yaml_destination} because it already exists.\nUse the -f flag to force it to overwrite or check and delete it manually.", :red
|
|
41
|
+
else
|
|
42
|
+
say "Generating #{yaml_destination}", :green
|
|
43
|
+
Cf::Newline.start([title, yaml_destination])
|
|
44
|
+
say "A new line named #{line_destination} generated.", :green
|
|
45
|
+
say "Modify the #{yaml_destination} file and you can create this line with: cf line create", :yellow
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
say "Title for the line is required.", :red
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
desc "line delete", "delete the line at http://cloudfactory.com"
|
|
53
|
+
def delete
|
|
54
|
+
line_source = Dir.pwd
|
|
55
|
+
yaml_source = "#{line_source}/line.yml"
|
|
56
|
+
|
|
57
|
+
unless File.exist?(yaml_source)
|
|
58
|
+
say("The line.yml file does not exist in this directory", :red) and return
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
set_target_uri(false)
|
|
62
|
+
if set_api_key(yaml_source)
|
|
63
|
+
CF.account_name = CF::Account.info.name
|
|
64
|
+
line_dump = YAML::load(File.open(yaml_source))
|
|
65
|
+
line_title = line_dump['title']
|
|
66
|
+
|
|
67
|
+
CF::Line.destroy(line_title)
|
|
68
|
+
say("The line #{line_title} was deleted successfully!", :yellow)
|
|
69
|
+
else
|
|
70
|
+
say("The api_key is missing in the line.yml file", :red)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
desc "line create", "takes the yaml file at line.yml and creates a new line at http://cloudfactory.com"
|
|
75
|
+
def create
|
|
76
|
+
line_source = Dir.pwd
|
|
77
|
+
yaml_source = "#{line_source}/line.yml"
|
|
78
|
+
|
|
79
|
+
unless File.exist?(yaml_source)
|
|
80
|
+
say "The line.yml file does not exist in this directory", :red
|
|
81
|
+
return
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
set_target_uri(false)
|
|
85
|
+
if set_api_key(yaml_source)
|
|
86
|
+
|
|
87
|
+
CF.account_name = CF::Account.info.name
|
|
88
|
+
|
|
89
|
+
line_dump = YAML::load(File.open(yaml_source))
|
|
90
|
+
line_title = line_dump['title'].parameterize
|
|
91
|
+
line_description = line_dump['description']
|
|
92
|
+
line_department = line_dump['department']
|
|
93
|
+
line = CF::Line.new(line_title, line_department, :description => line_description)
|
|
94
|
+
|
|
95
|
+
unless line.errors.blank?
|
|
96
|
+
say("#{line.errors.message}", :red) and return
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
say "Creating new assembly line: #{line.title}", :green
|
|
100
|
+
say "Adding InputFormats", :green
|
|
101
|
+
|
|
102
|
+
# Creation of InputFormat from yaml file
|
|
103
|
+
input_formats = line_dump['input_formats']
|
|
104
|
+
input_formats.each do |input_format|
|
|
105
|
+
attrs = {
|
|
106
|
+
:name => input_format['name'],
|
|
107
|
+
:required => input_format['required'],
|
|
108
|
+
:valid_type => input_format['valid_type']
|
|
109
|
+
}
|
|
110
|
+
input_format_for_line = CF::InputFormat.new(attrs)
|
|
111
|
+
line.input_formats input_format_for_line
|
|
112
|
+
say_status "input", "#{attrs[:name]}"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Creation of Station
|
|
116
|
+
stations = line_dump['stations']
|
|
117
|
+
stations.each do |station_file|
|
|
118
|
+
type = station_file['station']['station_type']
|
|
119
|
+
index = station_file['station']['station_index']
|
|
120
|
+
input_formats_for_station = station_file['station']['input_formats']
|
|
121
|
+
if type == "tournament"
|
|
122
|
+
jury_worker = station_file['station']['jury_worker']
|
|
123
|
+
auto_judge = station_file['station']['auto_judge']
|
|
124
|
+
station_params = {:line => line, :type => type, :jury_worker => jury_worker, :auto_judge => auto_judge, :input_formats => input_formats_for_station}
|
|
125
|
+
else
|
|
126
|
+
station_params = {:line => line, :type => type, :input_formats => input_formats_for_station}
|
|
127
|
+
end
|
|
128
|
+
station = CF::Station.create(station_params) do |s|
|
|
129
|
+
#say "New Station has been created of type => #{s.type}", :green
|
|
130
|
+
say "Adding Station #{index}: #{s.type}", :green
|
|
131
|
+
# For Worker
|
|
132
|
+
worker = station_file['station']['worker']
|
|
133
|
+
number = worker['num_workers']
|
|
134
|
+
reward = worker['reward']
|
|
135
|
+
worker_type = worker['worker_type']
|
|
136
|
+
if worker_type == "human"
|
|
137
|
+
skill_badges = worker['skill_badges']
|
|
138
|
+
stat_badge = worker['stat_badge']
|
|
139
|
+
if stat_badge.nil?
|
|
140
|
+
human_worker = CF::HumanWorker.new({:station => s, :number => number, :reward => reward})
|
|
141
|
+
else
|
|
142
|
+
human_worker = CF::HumanWorker.new({:station => s, :number => number, :reward => reward, :stat_badge => stat_badge})
|
|
143
|
+
end
|
|
144
|
+
if worker['skill_badges'].present?
|
|
145
|
+
skill_badges.each do |badge|
|
|
146
|
+
human_worker.badge = badge
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
#say "New Worker has been created of type => #{worker_type}, Number => #{number} and Reward => #{reward}", :green
|
|
150
|
+
say_status "worker", "#{number} Cloud #{pluralize(number, "Worker")} with reward of #{reward} #{pluralize(reward, "cent")}"
|
|
151
|
+
else
|
|
152
|
+
settings = worker['settings']
|
|
153
|
+
robot_worker = CF::RobotWorker.create({:station => s, :type => worker_type, :settings => settings})
|
|
154
|
+
|
|
155
|
+
#say "New Worker has been created of type => #{worker_type} and settings => #{worker['settings']}", :green
|
|
156
|
+
say_status "robot", "Robot worker: #{worker_type}"
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Creation of Form
|
|
160
|
+
# Creation of TaskForm
|
|
161
|
+
if station_file['station']['task_form'].present?
|
|
162
|
+
title = station_file['station']['task_form']['form_title']
|
|
163
|
+
instruction = station_file['station']['task_form']['instruction']
|
|
164
|
+
form = CF::TaskForm.create({:station => s, :title => title, :instruction => instruction}) do |f|
|
|
165
|
+
# Creation of FormFields
|
|
166
|
+
station_file['station']['task_form']['form_fields'].each do |form_field|
|
|
167
|
+
form_field_params = form_field.merge(:form => f)
|
|
168
|
+
field = CF::FormField.new(form_field_params.symbolize_keys)
|
|
169
|
+
end
|
|
170
|
+
say_status "form", "TaskForm '#{f.title}'"
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
elsif station_file['station']['custom_task_form'].present?
|
|
174
|
+
# Creation of CustomTaskForm
|
|
175
|
+
title = station_file['station']['custom_task_form']['form_title']
|
|
176
|
+
instruction = station_file['station']['custom_task_form']['instruction']
|
|
177
|
+
|
|
178
|
+
html_file = station_file['station']['custom_task_form']['html']
|
|
179
|
+
html = File.read("#{line_source}/station_#{station_file['station']['station_index']}/#{html_file}")
|
|
180
|
+
css_file = station_file['station']['custom_task_form']['css']
|
|
181
|
+
css = File.read("#{line_source}/station_#{station_file['station']['station_index']}/#{css_file}")
|
|
182
|
+
js_file = station_file['station']['custom_task_form']['js']
|
|
183
|
+
js = File.read("#{line_source}/station_#{station_file['station']['station_index']}/#{js_file}")
|
|
184
|
+
form = CF::CustomTaskForm.create({:station => s, :title => title, :instruction => instruction, :raw_html => html, :raw_css => css, :raw_javascript => js})
|
|
185
|
+
|
|
186
|
+
say_status "form", "CustomTaskForm '#{form.title}'"
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
say " ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁", :white
|
|
192
|
+
say "Line was successfully created.", :green
|
|
193
|
+
say "View your line at http://#{CF.account_name}.#{CF.api_url.split("/")[-2]}/lines/#{CF.account_name}/#{line.title}", :yellow
|
|
194
|
+
say "\nNow you can do production runs with: cf production start <your_run_title>", :green
|
|
195
|
+
say "Note: Make sure your-run-title.csv file is in the input directory.", :green
|
|
196
|
+
else
|
|
197
|
+
say "The api_key is missing in the line.yml file", :red
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
desc "line list", "List your lines"
|
|
202
|
+
def list
|
|
203
|
+
line_source = Dir.pwd
|
|
204
|
+
yaml_source = "#{line_source}/line.yml"
|
|
205
|
+
|
|
206
|
+
unless File.exist?(yaml_source)
|
|
207
|
+
say("The line.yml file does not exist in this directory", :red) and return
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
set_target_uri(false)
|
|
211
|
+
if set_api_key(yaml_source)
|
|
212
|
+
CF.account_name = CF::Account.info.name
|
|
213
|
+
lines = CF::Line.all
|
|
214
|
+
lines.sort! {|a, b| a[:name] <=> b[:name] }
|
|
215
|
+
say "\n"
|
|
216
|
+
say("No Lines", :yellow) if lines.blank?
|
|
217
|
+
|
|
218
|
+
lines_table = table do |t|
|
|
219
|
+
t.headings = ["Line Title", 'URL']
|
|
220
|
+
lines.each do |line|
|
|
221
|
+
t << [line.title, "http://#{CF.account_name}.cloudfactory.com/lines/#{CF.account_name}/#{line.title.parameterize}"]
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
say(lines_table)
|
|
225
|
+
else
|
|
226
|
+
say("The api_key is missing in the line.yml file", :red)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# helper function like in Rails
|
|
231
|
+
def pluralize(number, text)
|
|
232
|
+
return text.pluralize if number != 1
|
|
233
|
+
text
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
end
|
|
237
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'thor/group'
|
|
2
|
+
|
|
3
|
+
module Cf
|
|
4
|
+
class Production < Thor
|
|
5
|
+
include Cf::Config
|
|
6
|
+
|
|
7
|
+
desc "production start <run-title>", "creates a production run with input data file at input/<run-title>.csv"
|
|
8
|
+
method_option :input_data, :type => :string, :aliases => "-i", :desc => "the name of the input data file"
|
|
9
|
+
method_option :live, :type => :boolean, :default => false, :aliases => "-l", :desc => "force the host to set to live mturk environment"
|
|
10
|
+
def start(title=nil)
|
|
11
|
+
|
|
12
|
+
if title.nil?
|
|
13
|
+
say("The run title is required to start the production.", :red) and return
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
run_title = title.parameterize
|
|
17
|
+
line_destination = Dir.pwd
|
|
18
|
+
yaml_source = "#{line_destination}/line.yml"
|
|
19
|
+
|
|
20
|
+
unless File.exist?("#{yaml_source}")
|
|
21
|
+
say("The current directory is not a valid line directory.", :red) and return
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
line_yaml_dump = YAML::load(File.open(yaml_source))
|
|
25
|
+
line_title = line_yaml_dump['title'].parameterize
|
|
26
|
+
|
|
27
|
+
if !options[:input_data].nil?
|
|
28
|
+
input_data = "input/#{options[:input_data]}"
|
|
29
|
+
else
|
|
30
|
+
input_data = "input/#{run_title}.csv"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
unless File.exist?(input_data)
|
|
34
|
+
say("The input data csv file named #{input_data} is missing.", :red) and return
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
set_target_uri(options[:live])
|
|
38
|
+
# before starting the run creation process, we need to make sure whether the line exists or not
|
|
39
|
+
# if not, then we got to first create the line and then do the production run
|
|
40
|
+
# else we just simply do the production run
|
|
41
|
+
if set_api_key(yaml_source)
|
|
42
|
+
CF.account_name = CF::Account.info.name
|
|
43
|
+
line = CF::Line.info(line_title)
|
|
44
|
+
input_data_path = "#{Dir.pwd}/#{input_data}"
|
|
45
|
+
if line.error.blank?
|
|
46
|
+
say "Creating a production run with title #{run_title}", :green
|
|
47
|
+
run = CF::Run.create(line, run_title, input_data_path)
|
|
48
|
+
say "A run with title #{run.title} created successfully."
|
|
49
|
+
else
|
|
50
|
+
# first create line
|
|
51
|
+
say "Creating the line: #{line_title}", :green
|
|
52
|
+
Cf::Line.new.create
|
|
53
|
+
# Now create a production run with the title run_title
|
|
54
|
+
run = CF::Run.create(CF::Line.info(line_title), run_title, input_data_path)
|
|
55
|
+
say "A run with title #{run.title} using the line #{line_title} was successfully created."
|
|
56
|
+
end
|
|
57
|
+
else
|
|
58
|
+
say "The api_key is missing in the line.yml file", :red
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
body {background:red;}
|
|
2
|
+
|
|
3
|
+
#instructions{
|
|
4
|
+
text-align:center;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
#image-field-wrapper{
|
|
8
|
+
min-width:1050px;
|
|
9
|
+
overflow:hidden;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#field-panel{
|
|
13
|
+
float:left;
|
|
14
|
+
padding: 10px 10px 0 10px;
|
|
15
|
+
min-width:512px;
|
|
16
|
+
overflow:hidden;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.input-field{
|
|
20
|
+
width:150px;
|
|
21
|
+
margin:4px;
|
|
22
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<title>Form Preview</title>
|
|
5
|
+
<link href="form.css" media="screen, projection" rel="stylesheet" type="text/css" />
|
|
6
|
+
<script src="form.js" type="text/javascript"></script>
|
|
7
|
+
</head>
|
|
8
|
+
<!--[if lt IE 7 ]> <body class="ie6"> <![endif]-->
|
|
9
|
+
<!--[if IE 7 ]> <body class="ie7"> <![endif]-->
|
|
10
|
+
<!--[if IE 8 ]> <body class="ie8"> <![endif]-->
|
|
11
|
+
<!--[if IE 9 ]> <body class="ie9"> <![endif]-->
|
|
12
|
+
<!--[if (gt IE 9)|!(IE)]><!--> <body> <!--<![endif]-->
|
|
13
|
+
<div id="container">
|
|
14
|
+
<%= form_content %>
|
|
15
|
+
</div>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<div id="station_<%= station %>_instructions" class="station_<%= station %> cf_form_instruction">
|
|
2
|
+
<ul>
|
|
3
|
+
<li>Sample bullet list of instruction</li>
|
|
4
|
+
<li>Sample bullet list of instruction</li>
|
|
5
|
+
<li>Sample bullet list of instruction</li>
|
|
6
|
+
</ul>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div id="station_<%= station %>_form" class="station_<%= station %> cf_form_content">
|
|
10
|
+
<%- labels.split(",").each do |label| -%>
|
|
11
|
+
<label>{{<%= label %>}}</label>
|
|
12
|
+
<%- end unless labels.nil? -%>
|
|
13
|
+
|
|
14
|
+
<div id = "field-panel">
|
|
15
|
+
<%-
|
|
16
|
+
fields.each_pair do |field_name, field_type|
|
|
17
|
+
-%>
|
|
18
|
+
<p><label><%= field_name %></label><input id="<%= field_name.downcase %>" type="text" name="output[<%= field_name.downcase %>]" data-valid-type="<%= field_type.downcase %>" /></p>
|
|
19
|
+
<%- end unless fields.blank? -%>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script src="http://code.jquery.com/jquery-latest.js"></script>
|
|
2
|
+
<script type="text/javascript" src="http://www.bizcardarmy.com/javascripts/jquery.autocomplete-min.js"></script>
|
|
3
|
+
<script type="text/javascript">
|
|
4
|
+
$(document).ready(function(){
|
|
5
|
+
autocomplete_fields = ["first_name", "middle_name", "last_name", "company", "job_title", "city", "state", "zip"];
|
|
6
|
+
|
|
7
|
+
$.each(autocomplete_fields, function(index, value){
|
|
8
|
+
var inputField = "input." + value;
|
|
9
|
+
$(inputField).autocomplete({
|
|
10
|
+
serviceUrl: "http://www.bizcardarmy.com/cards/return_data_for_autocompletion.json",
|
|
11
|
+
maxHeight: 400,
|
|
12
|
+
width: 300,
|
|
13
|
+
zIndex: 9999,
|
|
14
|
+
params: { field: value }
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
</script>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
|
|
2
|
+
# See docs at http://developers.cloudfactory.com/lines/yaml.html
|
|
3
|
+
# See examples at http://developers.cloudfactory.com/lines/examples.html
|
|
4
|
+
#
|
|
5
|
+
# Fill in your API key below (see http://cloudfactory.com/account#settings)
|
|
6
|
+
# ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
|
|
7
|
+
|
|
8
|
+
# Line settings (see http://cloudfactory.com/lines/yaml.html#line-settings)
|
|
9
|
+
api_key: fill_in_your_api_key
|
|
10
|
+
title: <%= title.underscore.dasherize %>
|
|
11
|
+
description: Describe the line what its purpose is and what it does. You got the idea, right?
|
|
12
|
+
department: Survey
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Line Input Formats (see http://cloudfactory.com/lines/yaml.html#line-input-formats)
|
|
16
|
+
# input_formats:
|
|
17
|
+
# - name: company
|
|
18
|
+
# required: true
|
|
19
|
+
# valid_type: general # general, url, date, email, ...
|
|
20
|
+
|
|
21
|
+
# Stations (see http://cloudfactory.com/lines/yaml.html#stations)
|
|
22
|
+
stations:
|
|
23
|
+
- station:
|
|
24
|
+
station_index: 1
|
|
25
|
+
station_type: work
|
|
26
|
+
# Worker (see http://cloudfactory.com/lines/yaml.html#workers)
|
|
27
|
+
worker:
|
|
28
|
+
worker_type: human # human, impr
|
|
29
|
+
num_workers: 2
|
|
30
|
+
reward: 5
|
|
31
|
+
# Task Form (see http://cloudfactory.com/lines/yaml.html#task-forms)
|
|
32
|
+
task_form:
|
|
33
|
+
form_title: Enter text from a business card image for TASKFORM
|
|
34
|
+
instruction: Read the business card image and the fill the fields for TASKFORM
|
|
35
|
+
form_fields:
|
|
36
|
+
- label: CEO Name
|
|
37
|
+
field_type: short_answer
|
|
38
|
+
required: true
|
|
39
|
+
- label: CEO Email
|
|
40
|
+
field_type: email
|
|
41
|
+
required: true
|
|
42
|
+
- station:
|
|
43
|
+
station_index: 2
|
|
44
|
+
station_type: work
|
|
45
|
+
worker:
|
|
46
|
+
worker_type: human
|
|
47
|
+
num_workers: 1
|
|
48
|
+
reward: 3
|
|
49
|
+
# Custom Task Form (see http://cloudfactory.com/lines/yaml.html#custom-task-form)
|
|
50
|
+
custom_task_form:
|
|
51
|
+
form_title: Enter text from a business card image for CUSTOMTASKFORM
|
|
52
|
+
instruction: Read the business card image and the fill the fields for CUSTOMTASKFORM
|
|
53
|
+
html: form.html
|
|
54
|
+
css: form.css
|
|
55
|
+
js: form.js
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
body {background: grey;}
|
|
2
|
+
|
|
3
|
+
#instructions{
|
|
4
|
+
text-align:center;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
#image-field-wrapper{
|
|
8
|
+
min-width:1050px;
|
|
9
|
+
overflow:hidden;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#field-panel{
|
|
13
|
+
float:left;
|
|
14
|
+
padding: 10px 10px 0 10px;
|
|
15
|
+
min-width:512px;
|
|
16
|
+
overflow:hidden;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.input-field{
|
|
20
|
+
width:150px;
|
|
21
|
+
margin:4px;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.appended_para {
|
|
25
|
+
font-size: 1.5em;
|
|
26
|
+
font-family: Verdana, Arial;
|
|
27
|
+
}
|