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
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
module CF
|
|
2
|
+
class InputFormat
|
|
3
|
+
include Client
|
|
4
|
+
|
|
5
|
+
# name for the input_format, e.g. :name => "image_url"
|
|
6
|
+
attr_accessor :name
|
|
7
|
+
|
|
8
|
+
# required boolean either true or false , e.g. :required => "true" & if false then you don't need to mention
|
|
9
|
+
attr_accessor :required
|
|
10
|
+
|
|
11
|
+
# valid_type format of the source for the input_format, e.g. :valid_type => "url"
|
|
12
|
+
attr_accessor :valid_type
|
|
13
|
+
|
|
14
|
+
# ID of an input_format
|
|
15
|
+
attr_accessor :id
|
|
16
|
+
|
|
17
|
+
# ID of Line with which input_format is associated
|
|
18
|
+
attr_accessor :line_title, :errors
|
|
19
|
+
|
|
20
|
+
# ==Initializes a new input_format
|
|
21
|
+
# * Syntax for creating new input_format: <b>InputFormat.new(</b> Hash <b>)</b>
|
|
22
|
+
# ===Usage Example:
|
|
23
|
+
# line = CF::Line.create("Digitize", "Survey")
|
|
24
|
+
#
|
|
25
|
+
# attrs = {:line => line,
|
|
26
|
+
# :name => "image_url",
|
|
27
|
+
# :required => true,
|
|
28
|
+
# :valid_type => "url"}
|
|
29
|
+
#
|
|
30
|
+
# input_format = CF::InputFormat.new(attrs)
|
|
31
|
+
# line.input_formats input_format
|
|
32
|
+
def initialize(options={})
|
|
33
|
+
@station = options[:station]
|
|
34
|
+
@line = options[:line]
|
|
35
|
+
@name = options[:name]
|
|
36
|
+
@required = options[:required]
|
|
37
|
+
@valid_type = options[:valid_type]
|
|
38
|
+
if !@station.nil? or !@line.nil?
|
|
39
|
+
line_title = @station.nil? ? @line.title : @station.line_title
|
|
40
|
+
resp = self.class.post("/lines/#{CF.account_name}/#{@line.title.downcase}/input_formats.json", :input_format => {:name => @name, :required => @required, :valid_type => @valid_type})
|
|
41
|
+
if resp.code != 200
|
|
42
|
+
self.errors = resp.error.message
|
|
43
|
+
end
|
|
44
|
+
@line_title = line_title
|
|
45
|
+
if !@station.nil? && @station.except.nil? && @station.extra.nil?
|
|
46
|
+
@station.input_formats = self
|
|
47
|
+
else
|
|
48
|
+
@line.input_formats = self
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# ==Returns all the input headers of a specific line
|
|
54
|
+
# line = CF::Line.new("Digitize Card","Survey")
|
|
55
|
+
#
|
|
56
|
+
# attrs_1 = {:line => line,
|
|
57
|
+
# :name => "image_url",
|
|
58
|
+
# :required => true,
|
|
59
|
+
# :valid_type => "url"
|
|
60
|
+
# }
|
|
61
|
+
# attrs_2 = {:line => line,
|
|
62
|
+
# :name => "text_url",
|
|
63
|
+
# :required => true,
|
|
64
|
+
# :valid_type => "url"
|
|
65
|
+
# }
|
|
66
|
+
#
|
|
67
|
+
# input_format_1 = CF::InputFormat.new(attrs_1)
|
|
68
|
+
# line.input_formats input_format_1
|
|
69
|
+
# input_format_2 = CF::InputFormat.new(attrs_2)
|
|
70
|
+
# line.input_formats input_format_2
|
|
71
|
+
#
|
|
72
|
+
# input_formats_of_line = CF::InputFormat.all(line)
|
|
73
|
+
# returns an array of input headers associated with line
|
|
74
|
+
def self.all(line)
|
|
75
|
+
get("/lines/#{CF.account_name}/#{line.title.downcase}/input_formats.json")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# ==Returns a particular input header of a specific line
|
|
79
|
+
# ===Usage example
|
|
80
|
+
# line = CF::Line.new("Digitize Card","Survey")
|
|
81
|
+
# attrs = {:line => line,
|
|
82
|
+
# :name => "image_url_type",
|
|
83
|
+
# :required => true,
|
|
84
|
+
# :valid_type => "url"
|
|
85
|
+
# }
|
|
86
|
+
#
|
|
87
|
+
# input_format = CF::InputFormat.new(attrs)
|
|
88
|
+
# line.input_formats input_format
|
|
89
|
+
# input_format = line.input_formats[0]
|
|
90
|
+
#
|
|
91
|
+
# got_input_format = input_format.get
|
|
92
|
+
def get
|
|
93
|
+
self.class.get("/lines/#{line_id}/input_formats/#{id}.json")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# ==Updates input header
|
|
97
|
+
# ===Usage example
|
|
98
|
+
# line = CF::Line.new("Digitize Card","Survey")
|
|
99
|
+
# attrs = {:line => line,
|
|
100
|
+
# :name => "image_url_type",
|
|
101
|
+
# :required => true,
|
|
102
|
+
# :valid_type => "url"
|
|
103
|
+
# }
|
|
104
|
+
#
|
|
105
|
+
# input_format = CF::InputFormat.new(attrs)
|
|
106
|
+
# line.input_formats input_format
|
|
107
|
+
# input_format = line.input_formats[0]
|
|
108
|
+
#
|
|
109
|
+
# updated_input_format = input_format.update({:name => "jackpot", :field_type => "lottery"})
|
|
110
|
+
def update(options={})
|
|
111
|
+
@name = options[:name]
|
|
112
|
+
@required = options[:required]
|
|
113
|
+
@valid_type = options[:valid_type]
|
|
114
|
+
self.class.put("/lines/#{line_id}/input_formats/#{id}.json", :input_format => {:name => @name, :required => @required, :valid_type => @valid_type})
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# line = CF::Line.new("Digitize Card","Survey")
|
|
118
|
+
# attrs = {:line => line,
|
|
119
|
+
# :name => "image_url_type",
|
|
120
|
+
# :required => true,
|
|
121
|
+
# :valid_type => "url"
|
|
122
|
+
# }
|
|
123
|
+
#
|
|
124
|
+
# input_format = CF::InputFormat.new(attrs)
|
|
125
|
+
# line.input_formats input_format
|
|
126
|
+
#
|
|
127
|
+
# input_format = line.input_formats[0]
|
|
128
|
+
# input_format.delete
|
|
129
|
+
# deletes input header
|
|
130
|
+
def delete
|
|
131
|
+
self.class.delete("/lines/#{line_id}/input_formats/#{id}.json")
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
data/lib/cf/line.rb
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
module CF
|
|
2
|
+
class Line
|
|
3
|
+
require 'httparty'
|
|
4
|
+
include Client
|
|
5
|
+
|
|
6
|
+
# Title of the Line
|
|
7
|
+
attr_accessor :title
|
|
8
|
+
|
|
9
|
+
# Category Name is required for the category which is categorized according to ID, e.g. "4dc8ad6572f8be0600000001"
|
|
10
|
+
attr_accessor :department_name
|
|
11
|
+
|
|
12
|
+
# Public is a boolean attribute which when set to true becomes public & vice-versa
|
|
13
|
+
#
|
|
14
|
+
# Public attribute is optional
|
|
15
|
+
attr_accessor :public
|
|
16
|
+
|
|
17
|
+
# Description attribute describes about the line
|
|
18
|
+
#
|
|
19
|
+
# Description attribute is optional
|
|
20
|
+
attr_accessor :description
|
|
21
|
+
|
|
22
|
+
# id attribute is for the line_id & is required to be stored for making Api calls
|
|
23
|
+
attr_accessor :id
|
|
24
|
+
|
|
25
|
+
# stations contained within line object
|
|
26
|
+
attr_accessor :stations
|
|
27
|
+
|
|
28
|
+
# input_formats contained within line object
|
|
29
|
+
attr_accessor :input_formats
|
|
30
|
+
attr_accessor :errors
|
|
31
|
+
#attr_accessor :input_format_instance
|
|
32
|
+
#attr_accessor :station_instance
|
|
33
|
+
|
|
34
|
+
# ==Initializes a new line
|
|
35
|
+
# ==Usage of line.new("line_name")
|
|
36
|
+
#
|
|
37
|
+
# line = Line.new("Digit", "Survey")
|
|
38
|
+
def initialize(title, department_name, options={})
|
|
39
|
+
@input_formats =[]
|
|
40
|
+
@stations =[]
|
|
41
|
+
@title = title
|
|
42
|
+
@department_name = department_name
|
|
43
|
+
@public = options[:public]
|
|
44
|
+
@description = options[:description]
|
|
45
|
+
resp = self.class.post("/lines/#{CF.account_name}.json", {:line => {:title => title, :department_name => department_name, :public => @public, :description => @description}})
|
|
46
|
+
if resp.code != 200
|
|
47
|
+
self.errors = resp.error.message
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# ==Usage of line.stations << station
|
|
52
|
+
# line = CF::Line.new("line name")
|
|
53
|
+
# station = CF::Station.new({:type => "Work"})
|
|
54
|
+
# line.stations station
|
|
55
|
+
#
|
|
56
|
+
# * returns
|
|
57
|
+
# line.stations as an array of stations
|
|
58
|
+
def stations stations = nil
|
|
59
|
+
if stations
|
|
60
|
+
type = stations.type
|
|
61
|
+
@station_input_formats = stations.station_input_formats
|
|
62
|
+
if type == "Improve" && self.stations.size < 1
|
|
63
|
+
raise ImproveStationNotAllowed.new("You cannot add Improve Station as a first station of a line")
|
|
64
|
+
else
|
|
65
|
+
request_general =
|
|
66
|
+
{
|
|
67
|
+
:body =>
|
|
68
|
+
{
|
|
69
|
+
:api_key => CF.api_key,
|
|
70
|
+
:station => {:type => type, :input_formats => @station_input_formats}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if type == "Tournament"
|
|
74
|
+
@jury_worker = stations.jury_worker
|
|
75
|
+
@auto_judge = stations.auto_judge
|
|
76
|
+
request_tournament =
|
|
77
|
+
{
|
|
78
|
+
:body =>
|
|
79
|
+
{
|
|
80
|
+
:api_key => CF.api_key,
|
|
81
|
+
:station => {:type => type, :jury_worker => @jury_worker, :auto_judge => @auto_judge, :input_formats => @station_input_formats}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
resp = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{self.title.downcase}/stations.json",request_tournament)
|
|
85
|
+
else
|
|
86
|
+
resp = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{self.title.downcase}/stations.json",request_general)
|
|
87
|
+
end
|
|
88
|
+
station = CF::Station.new()
|
|
89
|
+
resp.to_hash.each_pair do |k,v|
|
|
90
|
+
station.send("#{k}=",v) if station.respond_to?(k)
|
|
91
|
+
end
|
|
92
|
+
station.line = self
|
|
93
|
+
station.line_title = self.title
|
|
94
|
+
if resp.response.code != "200"
|
|
95
|
+
station.errors = resp.parsed_response['error']['message']
|
|
96
|
+
end
|
|
97
|
+
@stations << station
|
|
98
|
+
end
|
|
99
|
+
else
|
|
100
|
+
@stations
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def << stations #:nodoc:
|
|
105
|
+
type = stations.type
|
|
106
|
+
@stations << stations
|
|
107
|
+
resp = CF::Station.post("/lines/#{self.id}/stations.json", :station => {:type => type})
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def stations=(stations) # :nodoc:
|
|
112
|
+
@stations << stations
|
|
113
|
+
#resp = CF::Station.post("/lines/#{id}/stations.json", :station => {:type => stations.type})
|
|
114
|
+
#@station_id = resp._id
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# ==Initializes a new line
|
|
118
|
+
# ==Usage of line.create("line_name") do |block|
|
|
119
|
+
# ===creating Line within block using variable
|
|
120
|
+
# Line.create("line_name") do |line|
|
|
121
|
+
# CF::InputFormat.new({:line => line, :label => "image_url", :field_type => "text_data", :value => "http://s3.amazon.com/bizcardarmy/medium/1.jpg", :required => true, :validation_format => "url"})
|
|
122
|
+
# CF::Station.new({:line => line, :type => "Work"})
|
|
123
|
+
# end
|
|
124
|
+
#
|
|
125
|
+
# ===OR creating without variable
|
|
126
|
+
# CF::Line.create("line_name") do
|
|
127
|
+
# CF::InputFormat.new({:line => self, :label => "image_url", :field_type => "text_data", :value => "http://s3.amazon.com/bizcardarmy/medium/1.jpg", :required => true, :validation_format => "url"})
|
|
128
|
+
# CF::Station.new({:line => self, :type => "Work"})
|
|
129
|
+
# end
|
|
130
|
+
def self.create(title, department_name, options={}, &block)
|
|
131
|
+
line = Line.new(title,department_name,options={})
|
|
132
|
+
@public = options[:public]
|
|
133
|
+
@description = options[:description]
|
|
134
|
+
if block.arity >= 1
|
|
135
|
+
block.call(line)
|
|
136
|
+
else
|
|
137
|
+
line.instance_eval &block
|
|
138
|
+
end
|
|
139
|
+
line
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# ==Usage of line.input_formats(input_format)
|
|
143
|
+
# line = Line.new("line name", "Survey")
|
|
144
|
+
#
|
|
145
|
+
# input_format = CF::InputFormat.new({:label => "image_url", :field_type => "text_data", :value => "http://s3.amazon.com/bizcardarmy/medium/1.jpg", :required => true, :validation_format => "url"})
|
|
146
|
+
# line.input_formats input_format
|
|
147
|
+
# * returns
|
|
148
|
+
# line.input_formats as an array of input_formats
|
|
149
|
+
def input_formats input_formats_value = nil
|
|
150
|
+
if input_formats_value
|
|
151
|
+
name = input_formats_value.name
|
|
152
|
+
required = input_formats_value.required
|
|
153
|
+
valid_type = input_formats_value.valid_type
|
|
154
|
+
resp = CF::InputFormat.post("/lines/#{CF.account_name}/#{self.title.downcase}/input_formats.json", :input_format => {:name => name, :required => required, :valid_type => valid_type})
|
|
155
|
+
input_format = CF::InputFormat.new()
|
|
156
|
+
resp.each_pair do |k,v|
|
|
157
|
+
input_format.send("#{k}=",v) if input_format.respond_to?(k)
|
|
158
|
+
end
|
|
159
|
+
if resp.code != 200
|
|
160
|
+
input_format.errors = resp.error.message
|
|
161
|
+
end
|
|
162
|
+
@input_formats << input_format
|
|
163
|
+
else
|
|
164
|
+
@input_formats
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
def input_formats=(input_formats_value) # :nodoc:
|
|
168
|
+
@input_formats << input_formats_value
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# ==Returns the content of a line by making an Api call
|
|
172
|
+
# ===Syntax for get_line method is
|
|
173
|
+
# CF::Line.info(line)
|
|
174
|
+
def self.info(line)
|
|
175
|
+
if line.class == CF::Line
|
|
176
|
+
resp = get("/lines/#{CF.account_name}/#{line.title.downcase}.json")
|
|
177
|
+
else
|
|
178
|
+
resp = get("/lines/#{CF.account_name}/#{line.downcase}.json")
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# ==Finds a line
|
|
183
|
+
# ===Syntax for find method is
|
|
184
|
+
# CF::Line.find(line.id)
|
|
185
|
+
def self.find(line_id)
|
|
186
|
+
get("/lines/#{line_id}.json")
|
|
187
|
+
end
|
|
188
|
+
# ==Returns all the lines of an account
|
|
189
|
+
# ===Syntax for all method is
|
|
190
|
+
# CF::Line.all
|
|
191
|
+
def self.all
|
|
192
|
+
get("/lines/#{CF.account_name}.json")
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def get_stations
|
|
196
|
+
CF::Station.get("/lines/#{ACCOUNT_NAME}/#{self.title.downcase}/stations.json")
|
|
197
|
+
end
|
|
198
|
+
# ==Return all the lines whose public value is set true
|
|
199
|
+
# ===Syntax for public_lines method is
|
|
200
|
+
# CF::Line.public_lines
|
|
201
|
+
def self.public_lines
|
|
202
|
+
get("/public_lines.json")
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# ==Updates a line
|
|
206
|
+
# ===Syntax for update method is
|
|
207
|
+
# line = CF::Line.new("Digitize Card", "Survey")
|
|
208
|
+
# line.update({:title => "New Title"})
|
|
209
|
+
# * This changes the title of the "line" object from "Digitize Card" to "New Title"
|
|
210
|
+
def update(options={})
|
|
211
|
+
old_title = self.title
|
|
212
|
+
@title = options[:title]
|
|
213
|
+
@department_name = options[:department_name]
|
|
214
|
+
@public = options[:public]
|
|
215
|
+
@description = options[:description]
|
|
216
|
+
self.class.put("/lines/#{CF.account_name}/#{old_title.downcase}.json", :line => {:title => @title, :department_name => @department_name, :public => @public, :description => @description})
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# ==Deletes a line
|
|
220
|
+
# ===Syantax for delete method
|
|
221
|
+
# line = CF::Line.new("Digitize Card", "Survey")
|
|
222
|
+
# line.delete
|
|
223
|
+
def destroy
|
|
224
|
+
self.class.delete("/lines/#{CF.account_name}/#{self.title.downcase}.json")
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def self.destroy(title)
|
|
228
|
+
delete("/lines/#{CF.account_name}/#{title.downcase}.json")
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module CF
|
|
2
|
+
class RobotWorker
|
|
3
|
+
require 'httparty'
|
|
4
|
+
include Client
|
|
5
|
+
|
|
6
|
+
# type of the station, e.g. station = Station.new(line, {:type => "Work"})
|
|
7
|
+
attr_accessor :settings, :type, :errors, :station, :number, :reward
|
|
8
|
+
|
|
9
|
+
def initialize(options={})
|
|
10
|
+
@type = options[:type].nil? ? nil : options[:type].camelize
|
|
11
|
+
@settings = options[:settings]
|
|
12
|
+
station = options[:station]
|
|
13
|
+
|
|
14
|
+
if station
|
|
15
|
+
request = options[:settings].merge(:type => @type)
|
|
16
|
+
resp = self.class.post("/lines/#{CF.account_name}/#{station.line_title.downcase}/stations/#{station.index}/workers.json", :worker => request)
|
|
17
|
+
if resp.code != 200
|
|
18
|
+
self.errors = resp.error.message
|
|
19
|
+
end
|
|
20
|
+
self.number = resp.number
|
|
21
|
+
self.reward = resp.reward
|
|
22
|
+
self.station = station
|
|
23
|
+
station.worker = self
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.create(options)
|
|
28
|
+
RobotWorker.new(options)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/cf/run.rb
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
module CF
|
|
2
|
+
class Run
|
|
3
|
+
require 'httparty'
|
|
4
|
+
include Client
|
|
5
|
+
|
|
6
|
+
# title of the "run" object
|
|
7
|
+
attr_accessor :title
|
|
8
|
+
|
|
9
|
+
# file attributes to upload
|
|
10
|
+
attr_accessor :file, :input
|
|
11
|
+
|
|
12
|
+
# line attribute with which run is associated
|
|
13
|
+
attr_accessor :line
|
|
14
|
+
|
|
15
|
+
attr_accessor :id, :errors
|
|
16
|
+
|
|
17
|
+
# ==Initializes a new Run
|
|
18
|
+
# ==Usage Example:
|
|
19
|
+
#
|
|
20
|
+
# line = CF::Line.create("Digitize Card","Digitization") do |l|
|
|
21
|
+
# CF::InputHeader.new({:label => "Company", :field_type => "text_data", :value => "Google", :required => true, :validation_format => "general"})
|
|
22
|
+
# CF::InputHeader.new({:label => "Website", :field_type => "text_data", :value => "www.google.com", :required => true, :validation_format => "url"})
|
|
23
|
+
# CF::Station.create({:line => l, :type => "work") do |s|
|
|
24
|
+
# CF::HumanWorker.new({:station => s, :number => 1, :reward => 20)
|
|
25
|
+
# CF::StandardInstruction.create(:station => s, :title => "Enter text from a business card image", :description => "Describe"}) do |i|
|
|
26
|
+
# CF::FormField.new({:instruction => i, :label => "First Name", :field_type => "SA", :required => "true"})
|
|
27
|
+
# CF::FormField.new({:instruction => i, :label => "Middle Name", :field_type => "SA"})
|
|
28
|
+
# CF::FormField.new({:instruction => i, :label => "Last Name", :field_type => "SA", :required => "true"})
|
|
29
|
+
# end
|
|
30
|
+
# end
|
|
31
|
+
# end
|
|
32
|
+
#
|
|
33
|
+
# run = CF::Run.new(line, "run name", File.expand_path("../../fixtures/input_data/test.csv", __FILE__))
|
|
34
|
+
def initialize(line, title, input)
|
|
35
|
+
@line = line
|
|
36
|
+
@title = title
|
|
37
|
+
if File.exist?(input.to_s)
|
|
38
|
+
@file = input
|
|
39
|
+
@param_data = File.new(input, 'rb')
|
|
40
|
+
@param_for_input = :file
|
|
41
|
+
resp = self.class.post("/lines/#{CF.account_name}/#{@line.title.downcase}/runs.json", {:data => {:run => {:title => @title}}, @param_for_input => @param_data})
|
|
42
|
+
if resp.code != 200
|
|
43
|
+
self.errors = resp.error.message
|
|
44
|
+
end
|
|
45
|
+
else
|
|
46
|
+
@input = input
|
|
47
|
+
@param_data = input
|
|
48
|
+
@param_for_input = :inputs
|
|
49
|
+
options =
|
|
50
|
+
{
|
|
51
|
+
:body =>
|
|
52
|
+
{
|
|
53
|
+
:api_key => CF.api_key,
|
|
54
|
+
:data =>{:run => { :title => @title }, :inputs => @param_data}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
run = HTTParty.post("#{CF.api_url}#{CF.api_version}/lines/#{CF.account_name}/#{@line.title.downcase}/runs.json",options)
|
|
58
|
+
if run.code != 200
|
|
59
|
+
self.errors = run.parsed_response['error']['message']
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# ==Creates a new Run
|
|
65
|
+
# ==Usage Example:
|
|
66
|
+
#
|
|
67
|
+
# line = CF::Line.create("Digitize Card","Digitization") do |l|
|
|
68
|
+
# CF::InputHeader.new({:line => l, :label => "Company", :field_type => "text_data", :value => "Google", :required => true, :validation_format => "general"})
|
|
69
|
+
# CF::InputHeader.new({:line => l, :label => "Website", :field_type => "text_data", :value => "www.google.com", :required => true, :validation_format => "url"})
|
|
70
|
+
# CF::Station.create({:line => l, :type => "work") do |s|
|
|
71
|
+
# CF::HumanWorker.new({:station => s, :number => 1, :reward => 20)
|
|
72
|
+
# CF::StandardInstruction.create(:station => s, :title => "Enter text from a business card image", :description => "Describe"}) do |i|
|
|
73
|
+
# CF::FormField.new({:instruction => i, :label => "First Name", :field_type => "SA", :required => "true"})
|
|
74
|
+
# CF::FormField.new({:instruction => i, :label => "Middle Name", :field_type => "SA"})
|
|
75
|
+
# CF::FormField.new({:instruction => i, :label => "Last Name", :field_type => "SA", :required => "true"})
|
|
76
|
+
# end
|
|
77
|
+
# end
|
|
78
|
+
# end
|
|
79
|
+
#
|
|
80
|
+
# run = CF::Run.create(line, "run name", File.expand_path("../../fixtures/input_data/test.csv", __FILE__))
|
|
81
|
+
def self.create(line, title, file)
|
|
82
|
+
Run.new(line, title, file)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def get # :nodoc:
|
|
86
|
+
self.class.get("/lines/#{@line.id}/runs/#{@id}.json")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.get_final_output(run_id)
|
|
90
|
+
resp = get("/runs/#{run_id}/final_outputs.json")
|
|
91
|
+
|
|
92
|
+
@final_output =[]
|
|
93
|
+
resp.each do |r|
|
|
94
|
+
result = FinalOutput.new()
|
|
95
|
+
r.to_hash.each_pair do |k,v|
|
|
96
|
+
result.send("#{k}=",v) if result.respond_to?(k)
|
|
97
|
+
end
|
|
98
|
+
@final_output << result
|
|
99
|
+
end
|
|
100
|
+
return @final_output
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def final_output
|
|
104
|
+
resp = self.class.get("/runs/#{CF.account_name}/#{self.title.downcase}/output.json")
|
|
105
|
+
@final_output =[]
|
|
106
|
+
resp['output'].each do |r|
|
|
107
|
+
result = FinalOutput.new()
|
|
108
|
+
r.to_hash.each_pair do |k,v|
|
|
109
|
+
result.send("#{k}=",v) if result.respond_to?(k)
|
|
110
|
+
end
|
|
111
|
+
if result.final_output == nil
|
|
112
|
+
result.final_output = resp.output
|
|
113
|
+
end
|
|
114
|
+
@final_output << result
|
|
115
|
+
end
|
|
116
|
+
return @final_output
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def self.final_output(title)
|
|
120
|
+
resp = get("/runs/#{CF.account_name}/#{title.downcase}/output.json")
|
|
121
|
+
@final_output =[]
|
|
122
|
+
resp['output'].each do |r|
|
|
123
|
+
result = FinalOutput.new()
|
|
124
|
+
r.to_hash.each_pair do |k,v|
|
|
125
|
+
result.send("#{k}=",v) if result.respond_to?(k)
|
|
126
|
+
end
|
|
127
|
+
if result.final_output == nil
|
|
128
|
+
result.final_output = resp.output
|
|
129
|
+
end
|
|
130
|
+
@final_output << result
|
|
131
|
+
end
|
|
132
|
+
return @final_output
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def self.output(options={})
|
|
136
|
+
station_no = options[:station]
|
|
137
|
+
title = options[:title]
|
|
138
|
+
resp = get("/runs/#{CF.account_name}/#{title.downcase}/output/#{station_no}.json")
|
|
139
|
+
return resp['output'].first.to_hash
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def output(options={})
|
|
143
|
+
station_no = options[:station]
|
|
144
|
+
resp = self.class.get("/runs/#{CF.account_name}/#{self.title.downcase}/output/#{station_no}.json")
|
|
145
|
+
return resp['output'].first.to_hash
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def self.find(title)
|
|
149
|
+
resp = get("/runs/#{CF.account_name}/#{title.downcase}.json")
|
|
150
|
+
if resp.code != 200
|
|
151
|
+
resp.error = resp.error.message
|
|
152
|
+
resp.merge!(:errors => "#{resp.error}")
|
|
153
|
+
resp.delete(:error)
|
|
154
|
+
end
|
|
155
|
+
return resp
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|