typingpool 0.7.4 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README.markdown +1 -1
- data/bin/tp-config +1 -1
- data/lib/typingpool.rb +2 -2
- data/lib/typingpool/project.rb +1 -1
- data/lib/typingpool/project/remote.rb +8 -10
- data/lib/typingpool/project/remote/s3.rb +65 -60
- data/lib/typingpool/project/remote/sftp.rb +20 -8
- data/lib/typingpool/test/fixtures/utf8-2.txt +6 -0
- data/lib/typingpool/test/fixtures/utf8.txt +8 -0
- data/lib/typingpool/version.rb +3 -0
- data/test/test_integration_script_2_tp_make.rb +2 -0
- data/test/test_integration_script_6_tp_finish.rb +6 -3
- data/test/test_unit_project_remote.rb +32 -10
- data/typingpool.gemspec +42 -0
- metadata +25 -21
data/LICENSE
CHANGED
data/README.markdown
CHANGED
data/bin/tp-config
CHANGED
@@ -60,7 +60,7 @@ unless options[:testing]
|
|
60
60
|
end
|
61
61
|
|
62
62
|
if not(config.amazon.bucket || (config.sftp && config.sftp.user))
|
63
|
-
config.amazon.bucket =
|
63
|
+
config.amazon.bucket = Typingpool::Project::Remote::S3.random_bucket_name
|
64
64
|
end
|
65
65
|
|
66
66
|
unless config.transcripts
|
data/lib/typingpool.rb
CHANGED
@@ -483,11 +483,11 @@
|
|
483
483
|
# Ryan Tate - ryantate@ryantate.com
|
484
484
|
#
|
485
485
|
#==License
|
486
|
-
# Copyright (c) 2011-
|
486
|
+
# Copyright (c) 2011-2013 Ryan Tate. Released under the terms of the MIT
|
487
487
|
# license. See LICENSE for details.
|
488
488
|
|
489
489
|
module Typingpool
|
490
|
-
|
490
|
+
require 'typingpool/version'
|
491
491
|
require 'typingpool/error'
|
492
492
|
require 'typingpool/utility'
|
493
493
|
require 'typingpool/config'
|
data/lib/typingpool/project.rb
CHANGED
@@ -39,7 +39,7 @@ module Typingpool
|
|
39
39
|
#this Project instance. Takes an optional Config instance; default
|
40
40
|
#is project.config.
|
41
41
|
def remote(config=@config)
|
42
|
-
Remote.from_config(
|
42
|
+
Remote.from_config(config)
|
43
43
|
end
|
44
44
|
|
45
45
|
#Constructs and returns a Project::Local instance associated with
|
@@ -10,29 +10,27 @@ module Typingpool
|
|
10
10
|
#basenames; a 'remove' method, which takes an array of remote file
|
11
11
|
#basenames; and the methods 'host' and 'path', which return the
|
12
12
|
#location of the destination server and destination directory,
|
13
|
-
#respectively.
|
13
|
+
#respectively. The method 'url' returns the URL string pre-pended
|
14
|
+
#to each file.
|
14
15
|
#
|
15
|
-
#Thus, there will always be 'put', 'remove', 'host' and '
|
16
|
+
#Thus, there will always be 'put', 'remove', 'host', 'path', and 'url'
|
16
17
|
#methods available, in addition to the Project::Remote methods
|
17
18
|
#outlined below.
|
18
19
|
class Remote
|
19
20
|
require 'typingpool/project/remote/s3'
|
20
21
|
require 'typingpool/project/remote/sftp'
|
21
22
|
|
22
|
-
#
|
23
|
-
attr_accessor :name
|
24
|
-
|
25
|
-
#Constructor. Takes the project name and a Config
|
23
|
+
#Constructor. Takes a Config
|
26
24
|
#instance. Returns a Project::Remote::S3 or
|
27
25
|
#Project::Remote::SFTP instance, depending on the particulars of
|
28
26
|
#the Config. If there are sufficient config params to return
|
29
27
|
#EITHER an S3 or SFTP subclass, it will prefer the SFTP
|
30
28
|
#subclass.
|
31
|
-
def self.from_config(
|
29
|
+
def self.from_config(config)
|
32
30
|
if config.sftp
|
33
|
-
SFTP.
|
31
|
+
SFTP.from_config(config.sftp)
|
34
32
|
elsif config.amazon && config.amazon.bucket
|
35
|
-
S3.
|
33
|
+
S3.from_config(config.amazon)
|
36
34
|
else
|
37
35
|
raise Error, "No valid upload params found in config file (SFTP or Amazon info)"
|
38
36
|
end
|
@@ -49,7 +47,7 @@ module Typingpool
|
|
49
47
|
#Given a file path, returns the URL to the file path were it to
|
50
48
|
#be uploaded by this instance.
|
51
49
|
def file_to_url(file)
|
52
|
-
"#{
|
50
|
+
"#{url}/#{URI.escape(file)}"
|
53
51
|
end
|
54
52
|
|
55
53
|
#Given an URL, returns the file portion of the path, given the
|
@@ -5,22 +5,36 @@ module Typingpool
|
|
5
5
|
#Subclass for storing remote files on Amazon Simple Storage
|
6
6
|
#Service (S3)
|
7
7
|
class S3 < Remote
|
8
|
-
require 'aws
|
9
|
-
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
require 'aws-sdk'
|
9
|
+
|
10
|
+
#Takes a Config#amazon, extracts the needed params, and
|
11
|
+
#returns a Project::Remote::S3 instance. Raises an exception
|
12
|
+
#of type Error::File::Remote::S3 if any required params (key,
|
13
|
+
#secret, bucket) are missing from the config.
|
14
|
+
def self.from_config(config_amazon)
|
15
|
+
key = config_amazon.key or raise Error::File::Remote::S3, "Missing Amazon key in config"
|
16
|
+
secret = config_amazon.secret or raise Error::File::Remote::S3, "Missing Amazon secret in config"
|
17
|
+
bucket_name = config_amazon.bucket or raise Error::File::Remote::S3, "Missing Amazon bucket in config"
|
18
|
+
url = config_amazon.url
|
19
|
+
new(key, secret, bucket_name, url)
|
20
|
+
end
|
19
21
|
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
|
22
|
+
#Takes an optional length for the random sequence, 16 by
|
23
|
+
#default, and an optional bucket name prefix, 'typingpool-' by
|
24
|
+
#default. Returns a string safe for use as both an S3 bucket
|
25
|
+
#and as a subdomain. Random charcters are drawn from [a-z0-9],
|
26
|
+
#though the first character in the returned string will always
|
27
|
+
#be a letter.
|
28
|
+
def self.random_bucket_name(length=16, prefix='typingpool-')
|
29
|
+
charset = [(0 .. 9).to_a, ('a' .. 'z').to_a].flatten
|
30
|
+
if prefix.to_s.empty? && (length > 0)
|
31
|
+
#ensure subdomain starts with a letter
|
32
|
+
prefix = ('a' .. 'z').to_a[SecureRandom.random_number(26)]
|
33
|
+
length -= 1
|
34
|
+
end
|
35
|
+
random_sequence = (1 .. length).map{ charset[ SecureRandom.random_number(charset.count) ] }
|
36
|
+
[prefix.to_s, random_sequence].join
|
37
|
+
end
|
24
38
|
|
25
39
|
#Returns the base URL, which is prepended to the remote
|
26
40
|
#files. This is either the 'url' attribute of the
|
@@ -29,16 +43,13 @@ module Typingpool
|
|
29
43
|
#'default_url' (e.g. "https://bucketname.s3.amazonaws.com").
|
30
44
|
attr_reader :url
|
31
45
|
|
32
|
-
#Constructor. Takes
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
@
|
37
|
-
@
|
38
|
-
@
|
39
|
-
@secret = @config.secret or raise Error::File::Remote::S3, "Missing Amazon secret in config"
|
40
|
-
@bucket = @config.bucket or raise Error::File::Remote::S3, "Missing Amazon bucket in config"
|
41
|
-
@url = @config.url || default_url
|
46
|
+
#Constructor. Takes an Amazon AWS access key id, secret access
|
47
|
+
#key, bucket name, and optional URL prefix.
|
48
|
+
def initialize(key, secret, bucket, url=nil)
|
49
|
+
@key = key
|
50
|
+
@secret = secret
|
51
|
+
@bucket_name = bucket
|
52
|
+
@url = url || default_url
|
42
53
|
end
|
43
54
|
|
44
55
|
#The remote host (server) name, parsed from #url
|
@@ -54,11 +65,15 @@ module Typingpool
|
|
54
65
|
#Upload files/strings to S3, optionally changing the names in the process.
|
55
66
|
# ==== Params
|
56
67
|
#[io_streams] Enumerable collection of IO objects, like a File
|
57
|
-
# or StringIO instance.
|
68
|
+
# or StringIO instance. Each IO object must repond
|
69
|
+
# to the methods rewind, read, and eof? (so no
|
70
|
+
# pipes, sockets, etc)
|
58
71
|
#[as] Optional if the io_streams are File instances. Array of
|
59
72
|
# file basenames, used to name the destination
|
60
73
|
# files. Default is the basename of the Files
|
61
74
|
# passed in as io_streams.
|
75
|
+
#[&block] Optional. Passed an io_stream and destination name
|
76
|
+
# just before each upload
|
62
77
|
# ==== Returns
|
63
78
|
#Array of URLs corresponding to the uploaded files.
|
64
79
|
def put(io_streams, as=io_streams.map{|file| File.basename(file)})
|
@@ -66,27 +81,29 @@ module Typingpool
|
|
66
81
|
dest = as[i]
|
67
82
|
yield(stream, dest) if block_given?
|
68
83
|
begin
|
69
|
-
|
70
|
-
rescue AWS::S3::NoSuchBucket
|
71
|
-
|
84
|
+
s3.buckets[@bucket_name].objects[dest].write(stream, :acl => :public_read)
|
85
|
+
rescue AWS::S3::Errors::NoSuchBucket
|
86
|
+
s3.buckets.create(@bucket_name, :acl => :public_read)
|
87
|
+
stream.rewind
|
72
88
|
retry
|
73
|
-
end
|
89
|
+
end #begin
|
74
90
|
file_to_url(dest)
|
75
91
|
end #batch
|
76
92
|
end
|
77
93
|
|
78
94
|
#Delete objects from S3.
|
79
95
|
# ==== Params
|
80
|
-
#[files]
|
81
|
-
#
|
96
|
+
#[files] Enumerable collection of file names. Should NOT
|
97
|
+
# include the bucket name (path).
|
98
|
+
#[&block] Optional. Passed a file name before each delete.
|
82
99
|
# ==== Returns
|
83
|
-
#
|
84
|
-
#succeeded.
|
100
|
+
#Nil
|
85
101
|
def remove(files)
|
86
102
|
batch(files) do |file, i|
|
87
103
|
yield(file) if block_given?
|
88
|
-
|
104
|
+
s3.buckets[@bucket_name].objects[file].delete
|
89
105
|
end
|
106
|
+
nil
|
90
107
|
end
|
91
108
|
|
92
109
|
protected
|
@@ -94,40 +111,28 @@ module Typingpool
|
|
94
111
|
def batch(io_streams)
|
95
112
|
results = []
|
96
113
|
io_streams.each_with_index do |stream, i|
|
97
|
-
connect if i == 0
|
98
114
|
begin
|
99
115
|
results.push(yield(stream, i))
|
100
|
-
rescue AWS::S3::
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
116
|
+
rescue AWS::S3::Errors::InvalidAccessKeyId
|
117
|
+
raise Error::File::Remote::S3::Credentials, "S3 operation failed because your AWS access key ID is wrong. Double-check your config file."
|
118
|
+
rescue AWS::S3::Errors::SignatureDoesNotMatch
|
119
|
+
raise Error::File::Remote::S3::Credentials, "S3 operation failed with a signature error. This likely means your AWS secret access key is wrong."
|
120
|
+
rescue AWS::Errors::Base => e
|
121
|
+
raise Error::File::Remote::S3, "Your S3 operation failed with an Amazon error: #{e} (#{e.class})"
|
106
122
|
end #begin
|
107
|
-
end #
|
108
|
-
disconnect unless io_streams.empty?
|
123
|
+
end #io_streams.each_with_index
|
109
124
|
results
|
110
125
|
end
|
111
126
|
|
112
|
-
def
|
113
|
-
AWS::S3
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
:use_ssl => true
|
118
|
-
)
|
119
|
-
end
|
120
|
-
|
121
|
-
def disconnect
|
122
|
-
AWS::S3::Base.disconnect
|
123
|
-
end
|
124
|
-
|
125
|
-
def make_bucket
|
126
|
-
AWS::S3::Bucket.create(@bucket)
|
127
|
+
def s3
|
128
|
+
AWS::S3.new(
|
129
|
+
:access_key_id => @key,
|
130
|
+
:secret_access_key => @secret
|
131
|
+
)
|
127
132
|
end
|
128
133
|
|
129
134
|
def default_url
|
130
|
-
"https://#{@
|
135
|
+
"https://#{@bucket_name}.s3.amazonaws.com"
|
131
136
|
end
|
132
137
|
end #S3
|
133
138
|
end #Remote
|
@@ -9,6 +9,18 @@ module Typingpool
|
|
9
9
|
class SFTP < Remote
|
10
10
|
require 'net/sftp'
|
11
11
|
|
12
|
+
#Takes a Config#sftp, extracts the needed params, and returns
|
13
|
+
#a Project::Remote::SFTP instance. Raises an exception of type
|
14
|
+
#Error::File::Remote::SFTP if any required params (user, host,
|
15
|
+
#url) are missing from the config.
|
16
|
+
def self.from_config(config_sftp)
|
17
|
+
user = config_sftp.user or raise Error::File::Remote::SFTP, "No SFTP user specified in config"
|
18
|
+
host = config_sftp.host or raise Error::File::Remote::SFTP, "No SFTP host specified in config"
|
19
|
+
url = config_sftp.url or raise Error::File::Remote::SFTP, "No SFTP url specified in config"
|
20
|
+
path = config_sftp.path
|
21
|
+
new(user, host, url, path)
|
22
|
+
end
|
23
|
+
|
12
24
|
#Returns the remote host (server) name. This is set from
|
13
25
|
#Config#sftp#host.
|
14
26
|
attr_reader :host
|
@@ -25,14 +37,14 @@ module Typingpool
|
|
25
37
|
#files. This is set from Config#sftp#url.
|
26
38
|
attr_reader :url
|
27
39
|
|
28
|
-
#Constructor. Takes the project name
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@user =
|
33
|
-
@host =
|
34
|
-
@url =
|
35
|
-
@path =
|
40
|
+
#Constructor. Takes the project name, SFTP user, SFTP host,
|
41
|
+
#URL prefix to append to file names, and an optional SFTP path
|
42
|
+
#(for SFTP uploading, not appended to URL).
|
43
|
+
def initialize(user, host, url, path=nil)
|
44
|
+
@user = user
|
45
|
+
@host = host
|
46
|
+
@url = url
|
47
|
+
@path = path || ''
|
36
48
|
end
|
37
49
|
|
38
50
|
#See docs for Project::Remote::S3#put.
|
@@ -41,6 +41,7 @@ class TestTpMake < Typingpool::Test::Script
|
|
41
41
|
assignments = project.local.file('data', 'assignment.csv').as(:csv)
|
42
42
|
assert_equal(project.local.subdir('audio','chunks').to_a.size, assignments.count)
|
43
43
|
assert_all_assets_have_upload_status(assignments, ['audio'], 'yes')
|
44
|
+
sleep 4 #pause before checking URLs so remote server has time to fully upload
|
44
45
|
assignments.each do |assignment|
|
45
46
|
assert_not_nil(assignment['audio_url'])
|
46
47
|
assert(working_url? assignment['audio_url'])
|
@@ -108,6 +109,7 @@ class TestTpMake < Typingpool::Test::Script
|
|
108
109
|
audio_urls.each_with_index do |original_url, i|
|
109
110
|
assert_equal(original_url, audio_urls2[i])
|
110
111
|
end
|
112
|
+
sleep 4 #pause before checking URLs so remote server has time to fully upload
|
111
113
|
assert_equal(audio_urls.count, audio_urls2.select{|url| working_url? url }.count)
|
112
114
|
ensure
|
113
115
|
tp_finish_outside_sandbox(dir, good_config_path)
|
@@ -15,23 +15,26 @@ class TestTpFinish < Typingpool::Test::Script
|
|
15
15
|
urls = csv.map{|assignment| assignment['audio_url'] }
|
16
16
|
refute_empty(urls)
|
17
17
|
assert_all_assets_have_upload_status(csv, ['audio'], 'yes')
|
18
|
+
sleep 3 #pause before checking URLs so remote server has time to fully upload
|
18
19
|
assert_equal(urls.size, urls.select{|url| working_url? url}.size)
|
19
20
|
assert_nothing_raised do
|
20
21
|
tp_finish_outside_sandbox(dir, config_path)
|
21
22
|
end
|
22
|
-
sleep
|
23
|
+
sleep 3 #pause before checking URLs so remote server has time to fully delete
|
23
24
|
assert_empty(urls.select{|url| working_url? url })
|
24
25
|
assert_all_assets_have_upload_status(csv, ['audio'], 'no')
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
+
def test_tp_finish_on_audio_files_with_sftp
|
29
|
+
skip_if_no_sftp_credentials('tp-finish sftp test')
|
28
30
|
in_temp_tp_dir do |dir|
|
29
31
|
config_path = self.config_path(dir)
|
30
32
|
tp_finish_on_audio_files_with(dir, config_path)
|
31
|
-
end
|
33
|
+
end
|
32
34
|
end
|
33
35
|
|
34
36
|
def test_tp_finish_on_audio_files_with_s3
|
37
|
+
skip_if_no_s3_credentials('tp-finish sftp test')
|
35
38
|
in_temp_tp_dir do |dir|
|
36
39
|
config = config_from_dir(dir)
|
37
40
|
config.to_hash.delete('sftp')
|
@@ -5,37 +5,41 @@ $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
|
|
5
5
|
require 'typingpool'
|
6
6
|
require 'typingpool/test'
|
7
7
|
require 'stringio'
|
8
|
+
require 'aws-sdk'
|
9
|
+
require 'securerandom'
|
8
10
|
|
9
11
|
class TestProjectRemote < Typingpool::Test
|
10
12
|
def test_project_remote_from_config
|
11
|
-
assert(remote = Typingpool::Project::Remote.from_config(
|
13
|
+
assert(remote = Typingpool::Project::Remote.from_config(dummy_config(1)))
|
12
14
|
assert_instance_of(Typingpool::Project::Remote::S3, remote)
|
13
|
-
assert(remote = Typingpool::Project::Remote.from_config(
|
15
|
+
assert(remote = Typingpool::Project::Remote.from_config(dummy_config(2)))
|
14
16
|
assert_instance_of(Typingpool::Project::Remote::SFTP, remote)
|
15
17
|
config = dummy_config(2)
|
16
18
|
config.to_hash.delete('sftp')
|
17
19
|
assert_raises(Typingpool::Error) do
|
18
|
-
Typingpool::Project::Remote.from_config(
|
20
|
+
Typingpool::Project::Remote.from_config(config)
|
19
21
|
end #assert_raises
|
20
22
|
end
|
21
23
|
|
22
24
|
def test_project_remote_s3_base
|
23
25
|
config = dummy_config(1)
|
24
|
-
assert(remote = Typingpool::Project::Remote::S3.
|
25
|
-
%w(key secret bucket).each do |param|
|
26
|
-
refute_nil(remote.send(param.to_sym))
|
27
|
-
assert_equal(config.amazon.send(param.to_sym), remote.send(param.to_sym))
|
28
|
-
end #%w().each do...
|
26
|
+
assert(remote = Typingpool::Project::Remote::S3.from_config(config.amazon))
|
29
27
|
assert_nil(config.amazon.url)
|
30
28
|
assert_includes(remote.url, config.amazon.bucket)
|
31
29
|
custom_url = 'http://tp.example.com/tp-test/1/2/3'
|
32
30
|
config.amazon.url = custom_url
|
33
|
-
assert(remote = Typingpool::Project::Remote::S3.
|
31
|
+
assert(remote = Typingpool::Project::Remote::S3.from_config(config.amazon))
|
34
32
|
refute_nil(remote.url)
|
35
33
|
refute_includes(remote.url, config.amazon.bucket)
|
36
34
|
assert_includes(remote.url, custom_url)
|
37
35
|
assert_equal('tp.example.com', remote.host)
|
38
36
|
assert_equal('/tp-test/1/2/3', remote.path)
|
37
|
+
assert_includes(Typingpool::Project::Remote::S3.random_bucket_name, 'typingpool-')
|
38
|
+
assert_equal(27, Typingpool::Project::Remote::S3.random_bucket_name.size)
|
39
|
+
assert_equal(21,Typingpool::Project::Remote::S3.random_bucket_name(10).size)
|
40
|
+
assert_equal(28,Typingpool::Project::Remote::S3.random_bucket_name(10, 'testing-typingpool').size)
|
41
|
+
assert_equal(34,Typingpool::Project::Remote::S3.random_bucket_name(16, 'testing-typingpool').size)
|
42
|
+
assert_match(Typingpool::Project::Remote::S3.random_bucket_name(16, ''), /^[a-z]/)
|
39
43
|
end
|
40
44
|
|
41
45
|
def test_project_remote_s3_networked
|
@@ -47,9 +51,26 @@ class TestProjectRemote < Typingpool::Test
|
|
47
51
|
standard_put_remove_tests(remote)
|
48
52
|
end
|
49
53
|
|
54
|
+
def test_project_remote_s3_networked_make_new_bucket_when_needed
|
55
|
+
assert(config = self.config)
|
56
|
+
skip_if_no_s3_credentials('Project::Remote::S3 upload and delete tests', config)
|
57
|
+
config.to_hash.delete('sftp')
|
58
|
+
config.amazon.bucket = Typingpool::Project::Remote::S3.random_bucket_name(16, 'typingpool-test-')
|
59
|
+
assert(s3 = AWS::S3.new(:access_key_id => config.amazon.key, :secret_access_key => config.amazon.secret))
|
60
|
+
refute(s3.buckets[config.amazon.bucket].exists?)
|
61
|
+
assert(project = Typingpool::Project.new(project_default[:title], config))
|
62
|
+
assert_instance_of(Typingpool::Project::Remote::S3, remote = project.remote)
|
63
|
+
begin
|
64
|
+
standard_put_remove_tests(remote)
|
65
|
+
assert(s3.buckets[config.amazon.bucket].exists?)
|
66
|
+
ensure
|
67
|
+
s3.buckets[config.amazon.bucket].delete
|
68
|
+
end #begin
|
69
|
+
end
|
70
|
+
|
50
71
|
def test_project_remote_sftp_base
|
51
72
|
config = dummy_config(2)
|
52
|
-
assert(remote = Typingpool::Project::Remote::SFTP.
|
73
|
+
assert(remote = Typingpool::Project::Remote::SFTP.from_config(config.sftp))
|
53
74
|
%w(host path user url).each do |param|
|
54
75
|
refute_nil(remote.send(param.to_sym))
|
55
76
|
assert_equal(config.sftp.send(param.to_sym), remote.send(param.to_sym))
|
@@ -140,6 +161,7 @@ class TestProjectRemote < Typingpool::Test
|
|
140
161
|
assert(urls = args[:remote].put(*put_args))
|
141
162
|
begin
|
142
163
|
assert_equal(args[:streams].count, urls.count)
|
164
|
+
sleep 4
|
143
165
|
urls.each{|url| assert(working_url?(url)) }
|
144
166
|
args[:test_with].call(urls) if args[:test_with]
|
145
167
|
ensure
|
data/typingpool.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env gem build
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'typingpool/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'typingpool'
|
8
|
+
s.version = Typingpool::VERSION
|
9
|
+
s.date = Time.now.strftime("%Y-%m-%d")
|
10
|
+
s.description = 'An app for transcribing audio using Mechanical Turk'
|
11
|
+
s.summary = s.description
|
12
|
+
s.authors = ['Ryan Tate']
|
13
|
+
s.email = 'ryantate@ryantate.com'
|
14
|
+
s.homepage = 'http://github.com/ryantate/typingpool'
|
15
|
+
s.required_ruby_version = '>= 1.9.2'
|
16
|
+
s.requirements = ['ffmpeg', 'mp3splt', 'mp3wrap']
|
17
|
+
s.add_runtime_dependency('rturk', '~> 2.9')
|
18
|
+
s.add_runtime_dependency('highline', '>= 1.6')
|
19
|
+
s.add_runtime_dependency('nokogiri', '>= 1.5')
|
20
|
+
s.add_runtime_dependency('aws-sdk', '~> 1.8.0')
|
21
|
+
s.add_runtime_dependency('net-sftp', '>= 2.0.5')
|
22
|
+
s.add_runtime_dependency('vcr')
|
23
|
+
s.add_runtime_dependency('webmock')
|
24
|
+
s.require_path = 'lib'
|
25
|
+
s.executables = ['tp-config',
|
26
|
+
'tp-make',
|
27
|
+
'tp-assign',
|
28
|
+
'tp-review',
|
29
|
+
'tp-collect',
|
30
|
+
'tp-finish']
|
31
|
+
s.test_files = ['test/test_unit_amazon.rb',
|
32
|
+
'test/test_unit_config.rb',
|
33
|
+
'test/test_unit_filer.rb',
|
34
|
+
'test/test_unit_project.rb',
|
35
|
+
'test/test_unit_project_local.rb',
|
36
|
+
'test/test_unit_project_remote.rb',
|
37
|
+
'test/test_unit_template.rb',
|
38
|
+
'test/test_unit_transcript.rb']
|
39
|
+
s.bindir = 'bin'
|
40
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
41
|
+
s.files = `git ls-files`.split("\n")
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typingpool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rturk
|
@@ -60,13 +60,13 @@ dependencies:
|
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.5'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
name: aws-
|
63
|
+
name: aws-sdk
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 1.8.0
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,7 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
77
|
+
version: 1.8.0
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
79
|
name: net-sftp
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,32 +126,32 @@ dependencies:
|
|
126
126
|
description: An app for transcribing audio using Mechanical Turk
|
127
127
|
email: ryantate@ryantate.com
|
128
128
|
executables:
|
129
|
-
- tp-config
|
130
|
-
- tp-make
|
131
129
|
- tp-assign
|
132
|
-
- tp-review
|
133
130
|
- tp-collect
|
131
|
+
- tp-config
|
134
132
|
- tp-finish
|
133
|
+
- tp-make
|
134
|
+
- tp-review
|
135
135
|
extensions: []
|
136
136
|
extra_rdoc_files: []
|
137
137
|
files:
|
138
|
-
- Rakefile
|
139
138
|
- LICENSE
|
140
139
|
- README.markdown
|
141
|
-
-
|
142
|
-
- bin/tp-make
|
140
|
+
- Rakefile
|
143
141
|
- bin/tp-assign
|
144
|
-
- bin/tp-review
|
145
142
|
- bin/tp-collect
|
143
|
+
- bin/tp-config
|
146
144
|
- bin/tp-finish
|
145
|
+
- bin/tp-make
|
146
|
+
- bin/tp-review
|
147
147
|
- lib/typingpool.rb
|
148
148
|
- lib/typingpool/amazon.rb
|
149
|
-
- lib/typingpool/amazon/question.rb
|
150
149
|
- lib/typingpool/amazon/hit.rb
|
151
|
-
- lib/typingpool/amazon/hit/full.rb
|
152
|
-
- lib/typingpool/amazon/hit/full/fromsearchhits.rb
|
153
150
|
- lib/typingpool/amazon/hit/assignment.rb
|
154
151
|
- lib/typingpool/amazon/hit/assignment/empty.rb
|
152
|
+
- lib/typingpool/amazon/hit/full.rb
|
153
|
+
- lib/typingpool/amazon/hit/full/fromsearchhits.rb
|
154
|
+
- lib/typingpool/amazon/question.rb
|
155
155
|
- lib/typingpool/app.rb
|
156
156
|
- lib/typingpool/app/cli.rb
|
157
157
|
- lib/typingpool/app/cli/formatter.rb
|
@@ -173,12 +173,6 @@ files:
|
|
173
173
|
- lib/typingpool/template.rb
|
174
174
|
- lib/typingpool/template/assignment.rb
|
175
175
|
- lib/typingpool/template/env.rb
|
176
|
-
- lib/typingpool/test.rb
|
177
|
-
- lib/typingpool/test/script.rb
|
178
|
-
- lib/typingpool/transcript.rb
|
179
|
-
- lib/typingpool/transcript/chunk.rb
|
180
|
-
- lib/typingpool/utility.rb
|
181
|
-
- lib/typingpool/utility/castable.rb
|
182
176
|
- lib/typingpool/templates/assignment/amazon-init.js
|
183
177
|
- lib/typingpool/templates/assignment/interview.html.erb
|
184
178
|
- lib/typingpool/templates/assignment/interview/nameless.html.erb
|
@@ -205,6 +199,7 @@ files:
|
|
205
199
|
- lib/typingpool/templates/project/etc/player/player.swf
|
206
200
|
- lib/typingpool/templates/project/etc/transcript.css
|
207
201
|
- lib/typingpool/templates/transcript.html.erb
|
202
|
+
- lib/typingpool/test.rb
|
208
203
|
- lib/typingpool/test/fixtures/amazon-question-html.html
|
209
204
|
- lib/typingpool/test/fixtures/amazon-question-url.txt
|
210
205
|
- lib/typingpool/test/fixtures/audio/mp3/interview.1.mp3
|
@@ -222,12 +217,20 @@ files:
|
|
222
217
|
- lib/typingpool/test/fixtures/tp_review_id.txt
|
223
218
|
- lib/typingpool/test/fixtures/tp_review_sandbox-assignment.csv
|
224
219
|
- lib/typingpool/test/fixtures/transcript-chunks.csv
|
220
|
+
- lib/typingpool/test/fixtures/utf8-2.txt
|
221
|
+
- lib/typingpool/test/fixtures/utf8.txt
|
225
222
|
- lib/typingpool/test/fixtures/utf8_transcript.txt
|
226
223
|
- lib/typingpool/test/fixtures/vcr/tp-collect-1.yml
|
227
224
|
- lib/typingpool/test/fixtures/vcr/tp-collect-2.yml
|
228
225
|
- lib/typingpool/test/fixtures/vcr/tp-collect-3.yml
|
229
226
|
- lib/typingpool/test/fixtures/vcr/tp-review-1.yml
|
230
227
|
- lib/typingpool/test/fixtures/vcr/tp-review-2.yml
|
228
|
+
- lib/typingpool/test/script.rb
|
229
|
+
- lib/typingpool/transcript.rb
|
230
|
+
- lib/typingpool/transcript/chunk.rb
|
231
|
+
- lib/typingpool/utility.rb
|
232
|
+
- lib/typingpool/utility/castable.rb
|
233
|
+
- lib/typingpool/version.rb
|
231
234
|
- test/make_amazon_question_fixture.rb
|
232
235
|
- test/make_tp_collect_fixture_1.rb
|
233
236
|
- test/make_tp_collect_fixture_2.rb
|
@@ -250,6 +253,7 @@ files:
|
|
250
253
|
- test/test_unit_project_remote.rb
|
251
254
|
- test/test_unit_template.rb
|
252
255
|
- test/test_unit_transcript.rb
|
256
|
+
- typingpool.gemspec
|
253
257
|
homepage: http://github.com/ryantate/typingpool
|
254
258
|
licenses: []
|
255
259
|
post_install_message:
|