shared_workforce 0.2.10 → 0.2.11
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/README.markdown +3 -5
- data/lib/shared_workforce.rb +6 -3
- data/lib/shared_workforce/configuration.rb +18 -1
- data/lib/shared_workforce/end_point.rb +2 -2
- data/lib/shared_workforce/frameworks/rails.rb +5 -1
- data/lib/shared_workforce/response_poller.rb +6 -7
- data/lib/shared_workforce/task.rb +1 -1
- data/lib/shared_workforce/task_request/http_with_poller.rb +2 -10
- data/lib/shared_workforce/version.rb +1 -1
- data/spec/configuration_spec.rb +23 -0
- data/spec/shared_workforce_spec.rb +13 -0
- metadata +14 -12
data/README.markdown
CHANGED
@@ -11,13 +11,11 @@ You can view a live demo sandbox app at [http://catsify.herokuapp.com](http://ca
|
|
11
11
|
|
12
12
|
The service is currently in private beta and is available as a [Heroku add-on](https://addons.heroku.com/sharedworkforce). You can apply for an invitation at [sharedworkforce.com](http://www.sharedworkforce.com).
|
13
13
|
|
14
|
-
Getting started with Heroku
|
15
|
-
===========================
|
16
14
|
|
17
|
-
Getting started
|
15
|
+
Getting started
|
16
|
+
===============
|
18
17
|
|
19
|
-
Getting started
|
20
|
-
==============================
|
18
|
+
_**Note to Heroku users:** Getting started with [Heroku](http://www.heroku.com]) takes less than 5 minutes. The best way to get started is to follow the README on the [demo app source code](https://github.com/sharedworkforce/sharedworkforce-demo-rails)._
|
21
19
|
|
22
20
|
### Step 1 - get an API key
|
23
21
|
|
data/lib/shared_workforce.rb
CHANGED
@@ -16,9 +16,8 @@ require 'active_support/inflector'
|
|
16
16
|
require 'active_support/core_ext/hash/indifferent_access'
|
17
17
|
|
18
18
|
module SharedWorkforce
|
19
|
-
|
20
|
-
class << self
|
21
19
|
|
20
|
+
class << self
|
22
21
|
attr_writer :configuration
|
23
22
|
|
24
23
|
def configure
|
@@ -28,6 +27,10 @@ module SharedWorkforce
|
|
28
27
|
def configuration
|
29
28
|
@configuration ||= SharedWorkforce::Configuration.new
|
30
29
|
end
|
30
|
+
|
31
|
+
def logger
|
32
|
+
@configuration.logger
|
33
|
+
end
|
31
34
|
end
|
32
|
-
|
35
|
+
|
33
36
|
end
|
@@ -4,6 +4,8 @@ module SharedWorkforce
|
|
4
4
|
attr_writer :callback_host
|
5
5
|
attr_writer :callback_path
|
6
6
|
attr_writer :api_key
|
7
|
+
attr_writer :logger
|
8
|
+
|
7
9
|
attr_accessor :http_end_point
|
8
10
|
attr_accessor :request_class
|
9
11
|
|
@@ -28,6 +30,10 @@ module SharedWorkforce
|
|
28
30
|
@callback_host ||= ENV['SHAREDWORKFORCE_CALLBACK_HOST']
|
29
31
|
end
|
30
32
|
|
33
|
+
def logger
|
34
|
+
@logger ||= (rails_logger || default_logger)
|
35
|
+
end
|
36
|
+
|
31
37
|
private
|
32
38
|
|
33
39
|
def default_request_class
|
@@ -43,6 +49,17 @@ module SharedWorkforce
|
|
43
49
|
TaskRequest::Http
|
44
50
|
end
|
45
51
|
end
|
46
|
-
|
52
|
+
|
53
|
+
def rails_logger
|
54
|
+
(defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger) ||
|
55
|
+
(defined?(RAILS_DEFAULT_LOGGER) && RAILS_DEFAULT_LOGGER.respond_to?(:debug) && RAILS_DEFAULT_LOGGER)
|
56
|
+
end
|
57
|
+
|
58
|
+
def default_logger
|
59
|
+
require 'logger'
|
60
|
+
l = ::Logger.new($stdout)
|
61
|
+
l.level = ::Logger::INFO
|
62
|
+
l
|
63
|
+
end
|
47
64
|
end
|
48
65
|
end
|
@@ -15,8 +15,8 @@ module SharedWorkforce
|
|
15
15
|
|
16
16
|
def process_response(body)
|
17
17
|
body = JSON.parse(body)
|
18
|
-
|
19
|
-
|
18
|
+
SharedWorkforce.logger.info "Processing Shared Workforce task callback"
|
19
|
+
SharedWorkforce.logger.info { body.inspect }
|
20
20
|
|
21
21
|
raise SecurityTransgression unless valid_api_key?(body['api_key'])
|
22
22
|
|
@@ -2,7 +2,11 @@ if defined?(ActionController::Metal)
|
|
2
2
|
class Railtie < Rails::Railtie
|
3
3
|
initializer 'shared_workforce' do |app|
|
4
4
|
app.config.middleware.use SharedWorkforce::EndPoint
|
5
|
-
|
5
|
+
if Rails.env.development?
|
6
|
+
# Stop log buffering when using Foreman in development
|
7
|
+
$stdout.sync = true
|
8
|
+
SharedWorkforce::ResponsePoller.start
|
9
|
+
end
|
6
10
|
end
|
7
11
|
end
|
8
12
|
end
|
@@ -1,21 +1,20 @@
|
|
1
1
|
module SharedWorkforce
|
2
2
|
class ResponsePoller
|
3
|
+
# The response poller is intended for use during local development only. It
|
4
|
+
# facilitates real world task responses without needing an open socket for the
|
5
|
+
# web hooks.
|
3
6
|
|
4
7
|
def self.start(interval=60)
|
5
8
|
new.start(interval)
|
6
9
|
end
|
7
10
|
|
8
|
-
def initialize
|
9
|
-
$stdout.sync = true
|
10
|
-
end
|
11
|
-
|
12
11
|
def start(interval)
|
13
12
|
Thread.abort_on_exception = true
|
14
13
|
Thread.new do
|
15
|
-
|
14
|
+
SharedWorkforce.logger.info "SharedWorkforce: Checking every #{interval} seconds for new responses."
|
16
15
|
|
17
16
|
while true
|
18
|
-
|
17
|
+
SharedWorkforce.logger.info "SharedWorkforce: Checking for new task responses."
|
19
18
|
process_tasks completed_tasks
|
20
19
|
sleep interval
|
21
20
|
end
|
@@ -27,7 +26,7 @@ module SharedWorkforce
|
|
27
26
|
def process_tasks(tasks)
|
28
27
|
tasks.each do |task|
|
29
28
|
if task['state'] == "completed"
|
30
|
-
|
29
|
+
SharedWorkforce.logger.info "SharedWorkforce: Task complete. Getting responses."
|
31
30
|
responses = collect_responses(task['id'])
|
32
31
|
SharedWorkforce::TaskResult.new(responses).process!
|
33
32
|
end
|
@@ -1,15 +1,7 @@
|
|
1
1
|
require 'rest_client'
|
2
2
|
module SharedWorkforce
|
3
|
-
class TaskRequest::HttpWithPoller < TaskRequest
|
4
|
-
|
5
|
-
def create
|
6
|
-
task = JSON.parse(RestClient.post("#{http_end_point}/tasks", *request_params))
|
7
|
-
end
|
8
|
-
|
9
|
-
def cancel
|
10
|
-
RestClient.post("#{http_end_point}/tasks/cancel", *request_params)
|
11
|
-
end
|
12
|
-
|
3
|
+
class TaskRequest::HttpWithPoller < TaskRequest::Http
|
4
|
+
# Disable callbacks during development
|
13
5
|
def request_params
|
14
6
|
[{:task=>@task.to_hash.merge(@params).merge(:callback_url=>callback_url, :callback_enabled=>false), :api_key=>api_key}.to_json, {:content_type => :json, :accept => :json}]
|
15
7
|
end
|
data/spec/configuration_spec.rb
CHANGED
@@ -46,5 +46,28 @@ describe "Configuration" do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
49
|
+
|
50
|
+
describe "#logger" do
|
51
|
+
it "should default to rails logger" do
|
52
|
+
logger_double = double(:logger)
|
53
|
+
configuration.stub(:rails_logger).and_return(logger_double)
|
54
|
+
configuration.logger.should == logger_double
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should fallback to a default logger" do
|
58
|
+
logger_double = double(:logger)
|
59
|
+
configuration.stub(:rails_logger).and_return(nil)
|
60
|
+
configuration.stub(:default_logger).and_return(logger_double)
|
61
|
+
configuration.logger.should == logger_double
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should be overridden by a custom logger" do
|
65
|
+
logger_double = double(:logger)
|
66
|
+
configuration.stub(:rails_logger).and_return(double(:rails_logger))
|
67
|
+
configuration.logger = logger_double
|
68
|
+
|
69
|
+
configuration.logger.should == logger_double
|
70
|
+
end
|
71
|
+
end
|
49
72
|
|
50
73
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "SharedWorkforce" do
|
4
|
+
describe "#logger" do
|
5
|
+
it "should return the configured logger" do
|
6
|
+
with_configuration do |c|
|
7
|
+
c.logger = logger = double(:logger)
|
8
|
+
|
9
|
+
SharedWorkforce.logger.should == logger
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shared_workforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
16
|
-
requirement: &
|
16
|
+
requirement: &70125168657440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70125168657440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: json
|
27
|
-
requirement: &
|
27
|
+
requirement: &70125168672660 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70125168672660
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activesupport
|
38
|
-
requirement: &
|
38
|
+
requirement: &70125168669900 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70125168669900
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &70125168665380 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.2.9
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70125168665380
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: webmock
|
60
|
-
requirement: &
|
60
|
+
requirement: &70125168676340 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70125168676340
|
69
69
|
description: Shared Workforce is a service and simple API for human intelligence tasks
|
70
70
|
email:
|
71
71
|
- sam@samoliver.com
|
@@ -98,6 +98,7 @@ files:
|
|
98
98
|
- spec/client_spec.rb
|
99
99
|
- spec/configuration_spec.rb
|
100
100
|
- spec/end_point_spec.rb
|
101
|
+
- spec/shared_workforce_spec.rb
|
101
102
|
- spec/spec_helper.rb
|
102
103
|
- spec/support/configuration_helper.rb
|
103
104
|
- spec/task_request/black_hole_spec.rb
|
@@ -135,6 +136,7 @@ test_files:
|
|
135
136
|
- spec/client_spec.rb
|
136
137
|
- spec/configuration_spec.rb
|
137
138
|
- spec/end_point_spec.rb
|
139
|
+
- spec/shared_workforce_spec.rb
|
138
140
|
- spec/spec_helper.rb
|
139
141
|
- spec/support/configuration_helper.rb
|
140
142
|
- spec/task_request/black_hole_spec.rb
|