typingpool 0.8.4 → 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12d9537ae9deb2fdab3078afea4a69132658bf8e
4
- data.tar.gz: 7a343081d80b50c26220e5701a3f4a6e758b7006
3
+ metadata.gz: c9684ded37fc04f867ff0149b4c3e5818c406816
4
+ data.tar.gz: 0ce4f81ef776d2c66a43b7ef36480f1b238dd70c
5
5
  SHA512:
6
- metadata.gz: 6405ecd1a2744e022e45bb0e3dca0c1ca7a396e0633022c6a80aba676f0e6e02f8e9fc922f9683d9165f4cee25d3ed3f8904c1eaf9bfc24d6a1b39aaf8345954
7
- data.tar.gz: 6c391f5f719098d40cd987dbe4de7e454f654b3cd2c65cdf99a21c82431d370a992d0a78844fd176ccc028331d289899367930a74f750612528f01522874c964
6
+ metadata.gz: 81e328fc781b70bd82a4c9b8bda7d8fb2b3f339f266967faec6785526452fef5c94ce50802da0df75d2b533d5218a48a662967db981547c70a1dfa0ea35a3a08
7
+ data.tar.gz: 95849ca6aef153d4868726cb6106761dd101fd1c3efdc31c9c3f99823fad1150f62fdfd7c01636ceb1ccea27d435a8a4875edd2184077b47887e0c607c0a5f87
data/Rakefile CHANGED
@@ -10,14 +10,10 @@ task :test => [:test_unit, :test_integration]
10
10
 
11
11
  desc "Run unit tests"
12
12
  Rake::TestTask.new('test_unit') do |t|
13
- t.test_files = FileList[
14
- 'test/test_unit*'
15
- ]
13
+ t.pattern = 'test/test_unit*'
16
14
  end
17
15
 
18
16
  desc "Run integration tests"
19
17
  Rake::TestTask.new('test_integration') do |t|
20
- t.test_files = FileList[
21
- (1..6).map{|n| "test/test_integration_script_#{n}*" }
22
- ]
18
+ t.pattern = 'test/test_integration_script*'
23
19
  end
data/bin/tp-collect CHANGED
@@ -18,6 +18,7 @@ OptionParser.new do |commands|
18
18
  commands.on('--fixture=PATH',
19
19
  "Optional. For testing purposes only.",
20
20
  "A VCR ficture for running with mock data.") do |fixture|
21
+ require 'typingpool/app/test'
21
22
  options[:fixture] = fixture
22
23
  end
23
24
  commands.on('--help',
data/bin/tp-make CHANGED
@@ -164,8 +164,10 @@ else
164
164
  FileUtils.remove_entry_secure(temp_conversion_dir)
165
165
  end #if project.local
166
166
 
167
- Typingpool::App.upload_audio_for_project(project) do |file, as|
168
- STDERR.puts "Uploading #{File.basename(file)} to #{project.remote.host}/#{project.remote.path} as #{as}"
167
+ unless options[:devtest]
168
+ Typingpool::App.upload_audio_for_project(project) do |file, as|
169
+ STDERR.puts "Uploading #{File.basename(file)} to #{project.remote.host}/#{project.remote.path} as #{as}"
170
+ end
169
171
  end
170
172
 
171
173
  if STDOUT.tty? && Typingpool::Utility.os_x?
data/bin/tp-review CHANGED
@@ -29,6 +29,7 @@ OptionParser.new do |commands|
29
29
  commands.on('--fixture=PATH',
30
30
  "Optional. For testing purposes only.",
31
31
  "A VCR fixture for running with mock data") do |fixture|
32
+ require 'typingpool/app/test'
32
33
  options[:fixture] = fixture
33
34
  end
34
35
  commands.on('--help',
@@ -11,7 +11,6 @@ module Typingpool
11
11
  #As such, all App methods should be considered fluid and likely to
12
12
  #change in subsequent releases.
13
13
  module App
14
- require 'vcr'
15
14
  require 'stringio'
16
15
  require 'open3'
17
16
  class << self
@@ -424,35 +423,6 @@ module Typingpool
424
423
  yield(missing) unless missing.empty?
425
424
  end
426
425
 
427
- #Begins recording of an HTTP mock fixture (for automated
428
- #testing) using the great VCR gem. Automatically filters your
429
- #Config#amazon#key and Config#amazon#secret from the recorded
430
- #fixture, and automatically determines the "cassette" name and
431
- #"cassette library" dir from the supplied path.
432
- # ==== Params
433
- # [fixture_path] Path to where you want the HTTP fixture
434
- # recorded, including filename.
435
- # [config] A Config instance, used to extract the
436
- # Config#amazon#secret and Config#amazon#key that
437
- # will be filtered from the fixture.
438
- # ==== Returns
439
- # Result of calling VCR.insert_cassette.
440
- def vcr_record(fixture_path, config)
441
- VCR.configure do |c|
442
- c.cassette_library_dir = File.dirname(fixture_path)
443
- c.hook_into :webmock
444
- c.filter_sensitive_data('<AWS_KEY>'){ config.amazon.key }
445
- c.filter_sensitive_data('<AWS_SECRET>'){ config.amazon.secret }
446
- end
447
- VCR.insert_cassette(File.basename(fixture_path, '.*'), :record => :new_episodes)
448
- end
449
-
450
- #Stops recording of the last call to vcr_record. Returns the
451
- #result of VCR.eject_cassette.
452
- def vcr_stop
453
- VCR.eject_cassette
454
- end
455
-
456
426
  #protected
457
427
 
458
428
  def with_abort_on_url_mismatch(url_type='')
@@ -0,0 +1,35 @@
1
+ module Typingpool
2
+ module App
3
+ require 'vcr'
4
+ class << self
5
+ #Begins recording of an HTTP mock fixture (for automated
6
+ #testing) using the great VCR gem. Automatically filters your
7
+ #Config#amazon#key and Config#amazon#secret from the recorded
8
+ #fixture, and automatically determines the "cassette" name and
9
+ #"cassette library" dir from the supplied path.
10
+ # ==== Params
11
+ # [fixture_path] Path to where you want the HTTP fixture
12
+ # recorded, including filename.
13
+ # [config] A Config instance, used to extract the
14
+ # Config#amazon#secret and Config#amazon#key that
15
+ # will be filtered from the fixture.
16
+ # ==== Returns
17
+ # Result of calling VCR.insert_cassette.
18
+ def vcr_record(fixture_path, config)
19
+ VCR.configure do |c|
20
+ c.cassette_library_dir = File.dirname(fixture_path)
21
+ c.hook_into :webmock
22
+ c.filter_sensitive_data('<AWS_KEY>'){ config.amazon.key }
23
+ c.filter_sensitive_data('<AWS_SECRET>'){ config.amazon.secret }
24
+ end
25
+ VCR.insert_cassette(File.basename(fixture_path, '.*'), :record => :new_episodes)
26
+ end
27
+
28
+ #Stops recording of the last call to vcr_record. Returns the
29
+ #result of VCR.eject_cassette.
30
+ def vcr_stop
31
+ VCR.eject_cassette
32
+ end
33
+ end #class << self
34
+ end #App
35
+ end #Typingpool
@@ -1,6 +1,6 @@
1
1
  module Typingpool
2
- require 'minitest/autorun'
3
-
2
+ require 'minitest'
3
+ require 'typingpool/app/test'
4
4
  class Test < Minitest::Test
5
5
  require 'nokogiri'
6
6
  require 'fileutils'
@@ -100,6 +100,23 @@ module Typingpool
100
100
  Typingpool::Utility.working_url?(*args)
101
101
  end
102
102
 
103
+ def working_url_eventually?(url, max_seconds=10, min_tries=2, max_redirects=6, seeking=true)
104
+ start = Time.now.to_i
105
+ tries = 0
106
+ wait = 0
107
+ loop do
108
+ sleep wait
109
+ return seeking if (working_url?(url, max_redirects) == seeking)
110
+ wait = wait > 0 ? wait * 2 : 1
111
+ tries += 1
112
+ end until (tries >= min_tries) && ((Time.now.to_i + wait - start) >= max_seconds)
113
+ not seeking
114
+ end
115
+
116
+ def broken_url_eventually?(url, max_seconds=10, min_tries=2, max_redirects=6)
117
+ not(working_url_eventually?(url, max_seconds, min_tries, max_redirects, false))
118
+ end
119
+
103
120
  def fetch_url(*args)
104
121
  Typingpool::Utility.fetch_url(*args)
105
122
  end
@@ -4,7 +4,64 @@ module Typingpool
4
4
  require 'typingpool'
5
5
  require 'yaml'
6
6
  require 'open3'
7
+ require 'fileutils'
7
8
 
9
+ @@readymade_project_path = nil
10
+
11
+ def self.readymade_project_container=(path)
12
+ @@readymade_project_path = path
13
+ end
14
+
15
+ def self.readymade_project_container
16
+ @@readymade_project_path
17
+ end
18
+
19
+ def with_temp_readymade_project
20
+ in_temp_tp_dir do |dir|
21
+ setup_readymade_project_into(config_path(dir))
22
+ yield(dir)
23
+ end
24
+ end
25
+
26
+ def setup_readymade_project_into(config_path)
27
+ init_readymade_project
28
+ copy_readymade_project_into(config_path)
29
+ reconfigure_readymade_project_in(config_path)
30
+ end
31
+
32
+ def init_readymade_project
33
+ unless Typingpool::Test::Script.readymade_project_container
34
+ dir = Typingpool::Test::Script.readymade_project_container = Dir.mktmpdir('typingpool_')
35
+ Minitest.after_run{ FileUtils.remove_entry_secure(dir) }
36
+ setup_temp_tp_dir(dir)
37
+ tp_make(dir, config_path(dir), 'mp3', true)
38
+ end
39
+ end
40
+
41
+ def copy_readymade_project_into(config_path)
42
+ config = Typingpool::Config.file(config_path)
43
+ FileUtils.cp_r(temp_tp_dir_project_dir(Typingpool::Test::Script.readymade_project_container), config.transcripts)
44
+ end
45
+
46
+ def reconfigure_readymade_project_in(config_path)
47
+ #rewrite URLs in assignment.csv according to config at config_path
48
+ project = Project.new(project_default[:title], Config.file(config_path))
49
+ File.delete(project.local.file('data', 'id.txt'))
50
+ project.local.create_id
51
+ id = project.local.id
52
+ assignments = project.local.file('data', 'assignment.csv').as(:csv)
53
+ urls = project.create_remote_names(assignments.map{|assignment| Project.local_basename_from_url(assignment['audio_url']) }).map{|file| project.remote.file_to_url(file) }
54
+ assignments.each! do |assignment|
55
+ assignment['audio_url'] = urls.shift
56
+ assignment['project_id'] = id
57
+ end
58
+ end
59
+
60
+ def simulate_failed_audio_upload_in(config_path)
61
+ project = Project.new(project_default[:title], Config.file(config_path))
62
+ csv = project.local.file('data', 'assignment.csv').as(:csv)
63
+ csv.each!{|a| a['audio_uploaded'] = 'maybe'}
64
+ end
8
65
 
9
66
  def audio_files(subdir='mp3')
10
67
  dir = File.join(audio_dir, subdir)
@@ -26,7 +83,7 @@ module Typingpool
26
83
 
27
84
 
28
85
  def in_temp_tp_dir
29
- ::Dir.mktmpdir('typingpool_') do |dir|
86
+ Dir.mktmpdir('typingpool_') do |dir|
30
87
  setup_temp_tp_dir(dir)
31
88
  yield(dir)
32
89
  end
@@ -83,17 +140,19 @@ module Typingpool
83
140
  end
84
141
 
85
142
  def call_tp_make(*args)
86
- call_script(path_to_tp_make, *args, '--devtest')
143
+ call_script(path_to_tp_make, *args)
87
144
  end
88
145
 
89
- def tp_make(in_dir, config=config_path(in_dir), audio_subdir='mp3')
90
- call_tp_make(
146
+ def tp_make(in_dir, config=config_path(in_dir), audio_subdir='mp3', devtest_mode_skipping_upload=false)
147
+ commands = [
91
148
  '--config', config,
92
149
  '--chunks', project_default[:chunks],
93
150
  *[:title, :subtitle].map{|param| ["--#{param}", project_default[param]] }.flatten,
94
151
  *[:voice, :unusual].map{|param| project_default[param].map{|value| ["--#{param}", value] } }.flatten,
95
152
  *audio_files(audio_subdir).map{|path| ['--file', path]}.flatten
96
- )
153
+ ]
154
+ commands.push('--devtest') if devtest_mode_skipping_upload
155
+ call_tp_make(*commands)
97
156
  end
98
157
 
99
158
  def path_to_tp_finish
@@ -1,3 +1,3 @@
1
1
  module Typingpool
2
- VERSION = '0.8.4'
2
+ VERSION = '0.8.5'
3
3
  end #Typingpool
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
- require 'csv'
8
8
  require 'open3'
9
9
 
10
10
  class TestTpMake < Typingpool::Test::Script
@@ -25,58 +25,80 @@ class TestTpMake < Typingpool::Test::Script
25
25
  end
26
26
 
27
27
  def assert_tp_make_abort_match(args, regex)
28
+ args.push('--devtest')
28
29
  assert_script_abort_match(args, regex) do |args|
29
30
  call_tp_make(*args)
30
31
  end
31
32
  end
32
33
 
33
- def tp_make_with(dir, config_path, subdir='mp3')
34
+ def tp_make_and_upload_with(dir, config_path)
34
35
  begin
35
- tp_make(dir, config_path, subdir)
36
+ tp_make(dir, config_path, 'mp3', false)
36
37
  assert(project = temp_tp_dir_project(dir, Typingpool::Config.file(config_path)))
37
- assert(project.local)
38
- assert(project.local.id)
39
- assert(project.local.subdir('audio','chunks').to_a.size <= 7)
40
- assert(project.local.subdir('audio','chunks').to_a.size >= 6)
41
- assert_equal(project_default[:subtitle], project.local.subtitle)
42
- assignments = project.local.file('data', 'assignment.csv').as(:csv)
43
- assert_equal(project.local.subdir('audio','chunks').to_a.size, assignments.count)
44
- assert_all_assets_have_upload_status(assignments, ['audio'], 'yes')
45
- sleep 4 #pause before checking URLs so remote server has time to fully upload
46
- assignments.each do |assignment|
47
- assert(assignment['audio_url'])
48
- assert(working_url? assignment['audio_url'])
49
- assert_equal(assignment['project_id'], project.local.id)
50
- assert_equal(assignment['unusual'].split(/\s*,\s*/), project_default[:unusual])
51
- project_default[:voice].each_with_index do |voice, i|
52
- name, description = voice.split(/\s*,\s*/)
53
- assert_equal(name, assignment["voice#{i+1}"])
54
- if not(description.to_s.empty?)
55
- assert_equal(description, assignment["voice#{i+1}title"])
56
- end
57
- end #project_default[:voice].each_with_index...
58
- end #assignments.each d0....
38
+ check_project_files(project)
39
+ check_project_uploads(project)
59
40
  ensure
60
41
  tp_finish_outside_sandbox(dir, config_path)
61
42
  end #begin
62
- assert_all_assets_have_upload_status(assignments, ['audio'], 'no')
43
+ assert_all_assets_have_upload_status(project.local.file('data', 'assignment.csv').as(:csv), ['audio'], 'no')
63
44
  end
64
45
 
65
- def test_tp_make
46
+
47
+ def check_project_uploads(project)
48
+ assignments = project.local.file('data', 'assignment.csv').as(:csv)
49
+ assert_all_assets_have_upload_status(assignments, ['audio'], 'yes')
50
+ assignments.each do |assignment|
51
+ assert(assignment['audio_url'])
52
+ assert(working_url_eventually? assignment['audio_url'])
53
+ assert_equal('yes', assignment['audio_uploaded'])
54
+ end #assignments.each do....
55
+ end
56
+
57
+ def check_project_files(project)
58
+ assert(project.local)
59
+ assert(project.local.id)
60
+ assert(project.local.subdir('audio','chunks').to_a.size <= 7)
61
+ assert(project.local.subdir('audio','chunks').to_a.size >= 6)
62
+ assert_equal(project_default[:subtitle], project.local.subtitle)
63
+ assignments = project.local.file('data', 'assignment.csv').as(:csv)
64
+ assert_equal(project.local.subdir('audio','chunks').to_a.size, assignments.count)
65
+ assignments.each do |assignment|
66
+ assert_equal(assignment['project_id'], project.local.id)
67
+ assert_equal(assignment['unusual'].split(/\s*,\s*/), project_default[:unusual])
68
+ project_default[:voice].each_with_index do |voice, i|
69
+ name, description = voice.split(/\s*,\s*/)
70
+ assert_equal(name, assignment["voice#{i+1}"])
71
+ if not(description.to_s.empty?)
72
+ assert_equal(description, assignment["voice#{i+1}title"])
73
+ end
74
+ end #project_default[:voice].each_with_index...
75
+ end #assignments.each do....
76
+ end
77
+
78
+ def test_tp_make_audio_handling
66
79
  Dir.entries(audio_dir).select{|entry| File.directory?(File.join(audio_dir, entry))}.reject{|entry| entry.match(/^\./) }.each do |subdir|
67
80
  in_temp_tp_dir do |dir|
68
81
  config_path = self.config_path(dir)
69
- skip_if_no_upload_credentials('tp-make integration test', Typingpool::Config.file(config_path))
70
- tp_make_with(dir, config_path, subdir)
82
+ skip_if_no_upload_credentials('tp-make audio handling test', Typingpool::Config.file(config_path))
83
+ tp_make(dir, config_path, subdir, true)
84
+ assert(project = temp_tp_dir_project(dir, Typingpool::Config.file(config_path)))
85
+ check_project_files(project)
71
86
  end #in_temp_tp_dir
72
87
  end #Dir.entries
73
88
  end
74
89
 
90
+ def test_tp_make_sftp
91
+ in_temp_tp_dir do |dir|
92
+ skip_if_no_sftp_credentials('tp-make SFTP upload test', config)
93
+ tp_make_and_upload_with(dir, config_path(dir))
94
+ end #in_temp_tp_dir do...
95
+ end
96
+
75
97
  def test_tp_make_s3
76
98
  in_temp_tp_dir do |dir|
77
99
  skip_if_no_s3_credentials('tp-make S3 integration test', config)
78
100
  config_path = setup_s3_config(dir)
79
- tp_make_with(dir, config_path)
101
+ tp_make_and_upload_with(dir, config_path)
80
102
  end #in_temp_tp_dir do...
81
103
  end
82
104
 
@@ -110,8 +132,7 @@ class TestTpMake < Typingpool::Test::Script
110
132
  audio_urls.each_with_index do |original_url, i|
111
133
  assert_equal(original_url, audio_urls2[i])
112
134
  end
113
- sleep 4 #pause before checking URLs so remote server has time to fully upload
114
- assert_equal(audio_urls.count, audio_urls2.select{|url| working_url? url }.count)
135
+ assert_equal(audio_urls.count, audio_urls2.select{|url| working_url_eventually? url }.count)
115
136
  ensure
116
137
  tp_finish_outside_sandbox(dir, good_config_path)
117
138
  end #begin
@@ -125,8 +146,9 @@ class TestTpMake < Typingpool::Test::Script
125
146
  skip_if_no_upload_credentials('tp-make audio file sorting test', Typingpool::Config.file(config_path))
126
147
  assert(audio_files('mp3').count > 1)
127
148
  correctly_ordered_paths = audio_files('mp3').sort
128
- tp_make_with(dir, config_path, 'mp3')
149
+ tp_make(dir, config_path, 'mp3', true)
129
150
  assert(project = temp_tp_dir_project(dir))
151
+ check_project_files(project)
130
152
  assert(merged_audio_file = project.local.subdir('audio','originals').files.detect{|filer| filer.path.match(/.\.all\../)})
131
153
  assert(File.exists? merged_audio_file)
132
154
  actually_ordered_paths = originals_from_merged_audio_file(merged_audio_file)
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
@@ -39,8 +40,7 @@ class TestTpAssign < Typingpool::Test::Script
39
40
  def test_tp_assign
40
41
  skip_if_no_amazon_credentials('tp-assign integration test')
41
42
  skip_if_no_upload_credentials('tp-assign integration test')
42
- in_temp_tp_dir do |dir|
43
- tp_make(dir)
43
+ with_temp_readymade_project do |dir|
44
44
  begin
45
45
  tp_assign(dir)
46
46
  assign_time = Time.now
@@ -65,88 +65,88 @@ class TestTpAssign < Typingpool::Test::Script
65
65
  tp_finish(dir)
66
66
  end #begin
67
67
  assert_empty(Typingpool::Amazon::HIT.all_for_project(project.local.id))
68
- end # in_temp_tp_dir
68
+ end #with_temp_readymade_project do...
69
69
  end
70
70
 
71
71
  def test_uploads_audio_when_needed
72
72
  skip_if_no_amazon_credentials('tp-assign unuploaded audio integration test')
73
73
  skip_if_no_s3_credentials('tp-assign unuploaded audio integration test')
74
- in_temp_tp_dir do |dir|
75
- good_config_path = setup_s3_config(dir)
76
- bad_config_path = setup_s3_config_with_bad_password(dir)
77
- assert_raises(Typingpool::Error::Shell) do
78
- tp_make(dir, bad_config_path, 'mp3')
79
- end
74
+ with_temp_readymade_project do |dir|
80
75
  project_dir = temp_tp_dir_project_dir(dir)
81
76
  assert(File.exists? project_dir)
82
77
  assert(File.directory? project_dir)
83
- assert(project = temp_tp_dir_project(dir, Typingpool::Config.file(bad_config_path)))
78
+ assert(project = temp_tp_dir_project(dir))
84
79
  csv = project.local.file('data', 'assignment.csv').as(:csv)
85
80
  assert_empty(csv.select{|assignment| working_url? assignment['audio_url']})
81
+ csv.each!{|a| a['audio_uploaded'] = 'maybe'}
86
82
  assert_all_assets_have_upload_status(csv, ['audio'], 'maybe')
87
83
  begin
88
- tp_assign(dir, good_config_path)
84
+ tp_assign(dir)
89
85
  sandbox_csv = project.local.file('data', 'sandbox-assignment.csv').as(:csv)
90
86
  assert_equal(csv.count, sandbox_csv.count)
91
- assert_equal(sandbox_csv.count, sandbox_csv.select{|assignment| working_url? assignment['audio_url'] }.count)
87
+ assert_equal(sandbox_csv.count, sandbox_csv.select{|assignment| working_url_eventually? assignment['audio_url'] }.count)
92
88
  assert_all_assets_have_upload_status(csv, ['audio'], 'yes')
93
89
  ensure
94
- tp_finish(dir, good_config_path)
90
+ tp_finish(dir)
95
91
  end #begin
96
- end # in_temp_tp_dir do...
92
+ end #with_temp_readymade_project do...
97
93
  end
98
94
 
99
95
  def test_fixing_failed_assignment_html_upload
100
96
  skip_if_no_amazon_credentials('tp-assign failed assignment upload integration test')
101
97
  skip_if_no_s3_credentials('tp-assign failed assignment upload integration test')
102
- in_temp_tp_dir do |dir|
98
+ with_temp_readymade_project do |dir|
103
99
  good_config_path = setup_s3_config(dir)
100
+ reconfigure_readymade_project_in(good_config_path)
101
+ project = temp_tp_dir_project(dir, Typingpool::Config.file(good_config_path))
102
+ csv = project.local.file('data', 'assignment.csv').as(:csv)
103
+ csv.each!{|a| a['audio_uploaded'] = 'maybe'}
104
+ tp_make(dir, good_config_path)
105
+ assert_all_assets_have_upload_status(csv, ['audio'], 'yes')
104
106
  bad_config_path = setup_s3_config_with_bad_password(dir)
105
- tp_make(dir, good_config_path, 'mp3')
106
107
  begin
107
- assert(project = temp_tp_dir_project(dir, Typingpool::Config.file(good_config_path)))
108
108
  assert(project.local)
109
109
  get_assignment_urls = lambda{|csv| csv.map{|assignment| assignment['assignment_url'] }.select{|url| url } }
110
- assert_empty(get_assignment_urls.call(project.local.file('data', 'assignment.csv').as(:csv)))
110
+ assert_empty(get_assignment_urls.call(csv))
111
111
  exception = assert_raises(Typingpool::Error::Shell) do
112
112
  tp_assign(dir, bad_config_path)
113
113
  end #assert_raises...
114
114
  assert_match(/s3 operation fail/i, exception.message)
115
115
  sandbox_csv = project.local.file('data', 'sandbox-assignment.csv').as(:csv)
116
116
  refute_empty(get_assignment_urls.call(sandbox_csv))
117
- check_assignment_urls = lambda{ get_assignment_urls.call(sandbox_csv).map{|url| Typingpool::Utility.working_url? url } }
118
- check_assignment_urls.call.each{|checked_out| refute(checked_out) }
117
+ get_assignment_urls.call(sandbox_csv).each{|url| refute(working_url? url) }
119
118
  assert_all_assets_have_upload_status(sandbox_csv, ['assignment'], 'maybe')
120
119
  tp_assign(dir, good_config_path)
121
- check_assignment_urls.call.each{|checked_out| assert(checked_out) }
120
+ get_assignment_urls.call(sandbox_csv).each{|url| assert(working_url_eventually? url) }
122
121
  assert_all_assets_have_upload_status(sandbox_csv, ['assignment'], 'yes')
123
122
  ensure
124
123
  tp_finish(dir, good_config_path)
125
124
  end #begin
126
- end #in_temp_tp_dir do...
125
+ end #with_temp_readymade_project do...
127
126
  end
128
127
 
129
128
  def test_abort_on_config_mismatch
130
129
  skip_if_no_s3_credentials('tp-assign abort on config mismatch test')
131
- in_temp_tp_dir do |dir|
130
+ with_temp_readymade_project do |dir|
132
131
  config = config_from_dir(dir)
133
132
  good_config_path = setup_s3_config(dir, config, '.config_s3_good')
134
- tp_make(dir, good_config_path)
133
+ reconfigure_readymade_project_in(good_config_path)
134
+ assert(config.amazon.bucket)
135
+ new_bucket = 'configmismatch-test'
136
+ refute_equal(new_bucket, config.amazon.bucket)
137
+ config.amazon.bucket = new_bucket
138
+ bad_config_path = setup_s3_config(dir, config, '.config_s3_bad')
139
+ success = false
135
140
  begin
136
- tp_finish_outside_sandbox(dir, good_config_path)
137
- assert(config.amazon.bucket)
138
- new_bucket = 'configmismatch-test'
139
- refute_equal(new_bucket, config.amazon.bucket)
140
- config.amazon.bucket = new_bucket
141
- bad_config_path = setup_s3_config(dir, config, '.config_s3_bad')
142
141
  exception = assert_raises(Typingpool::Error::Shell) do
143
142
  tp_assign(dir, bad_config_path)
144
143
  end #assert_raises...
145
144
  assert_match(/\burls don't look right\b/i, exception.message)
145
+ success = true
146
146
  ensure
147
- tp_finish(dir, good_config_path)
147
+ tp_finish(dir, good_config_path) unless success
148
148
  end #begin
149
- end #in_temp_tp_dir do...
149
+ end #with_temp_readymade_project do...
150
150
  end
151
151
 
152
152
  end #TestTpAssign
@@ -1,21 +1,21 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
8
9
  class TestTpReview < Typingpool::Test::Script
9
10
 
10
11
  def test_tp_review
11
- in_temp_tp_dir do |dir|
12
+ with_temp_readymade_project do |dir|
12
13
  skip_if_no_upload_credentials('tp-review integration test')
13
14
  skip_if_no_amazon_credentials('tp-review integration test')
14
- tp_make(dir)
15
15
  copy_fixtures_to_temp_tp_dir(dir, 'tp_review_')
16
16
  assert(File.exists? File.join(temp_tp_dir_project_dir(dir), 'data','sandbox-assignment.csv'))
17
17
  project = temp_tp_dir_project(dir)
18
- assert_equal(7, project.local.file('data','sandbox-assignment.csv').as(:csv).reject{|assignment| assignment['hit_id'].to_s.empty? }.count)
18
+ assert_equal(7, project.local.file('data','sandbox-assignment.csv').as(:csv).reject{|assignment| assignment['hit_id'].to_s.empty? }.count)
19
19
  begin
20
20
  output = nil
21
21
  output = tp_review_with_fixture(dir, File.join(fixtures_dir, 'vcr', 'tp-review-1'), %w(a r a r s q))
@@ -55,9 +55,8 @@ class TestTpReview < Typingpool::Test::Script
55
55
  assert_assignment_csv_has_transcription_count(3, project, 'sandbox-assignment.csv')
56
56
  ensure
57
57
  rm_fixtures_from_temp_tp_dir(dir, 'tp_review_')
58
- tp_finish(dir)
59
58
  end #begin
60
- end #in_temp_tp_dir
59
+ end #with_temp_readymade_project do...
61
60
  end
62
61
 
63
62
  def split_reviews(output)
@@ -1,18 +1,17 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
8
9
  class TestTpCollect < Typingpool::Test::Script
9
- require 'fileutils'
10
10
 
11
11
  def test_tp_collect
12
- in_temp_tp_dir do |dir|
12
+ with_temp_readymade_project do |dir|
13
13
  skip_if_no_upload_credentials('tp-collect integration test')
14
14
  skip_if_no_amazon_credentials('tp-collect integration test')
15
- tp_make(dir)
16
15
  copy_fixtures_to_temp_tp_dir(dir, 'tp_collect_')
17
16
  begin
18
17
  project = temp_tp_dir_project(dir)
@@ -30,9 +29,8 @@ class TestTpCollect < Typingpool::Test::Script
30
29
  # assert_assignment_csv_has_transcription_count(7, project, 'sandbox-assignment.csv')
31
30
  ensure
32
31
  rm_fixtures_from_temp_tp_dir(dir, 'tp_collect_')
33
- tp_finish(dir)
34
32
  end #begin
35
- end #in_temp_tp_dir
33
+ end #with_temp_readymade_project do...
36
34
  end
37
35
 
38
36
  end #TestTpCollect
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
@@ -9,23 +10,22 @@ class TestTpFinish < Typingpool::Test::Script
9
10
  def tp_finish_on_audio_files_with(dir, config_path)
10
11
  skip_if_no_amazon_credentials('tp-finish audio test')
11
12
  skip_if_no_upload_credentials('tp-finish audio test')
13
+ simulate_failed_audio_upload_in(config_path)
12
14
  tp_make(dir, config_path)
13
15
  project = temp_tp_dir_project(dir, Typingpool::Config.file(config_path))
14
16
  csv = project.local.file('data', 'assignment.csv').as(:csv)
15
17
  urls = csv.map{|assignment| assignment['audio_url'] }
16
18
  refute_empty(urls)
17
19
  assert_all_assets_have_upload_status(csv, ['audio'], 'yes')
18
- sleep 3 #pause before checking URLs so remote server has time to fully upload
19
- assert_equal(urls.size, urls.select{|url| working_url? url}.size)
20
+ assert_equal(urls.count, urls.select{|url| working_url_eventually? url}.count)
20
21
  tp_finish_outside_sandbox(dir, config_path)
21
- sleep 3 #pause before checking URLs so remote server has time to fully delete
22
- assert_empty(urls.select{|url| working_url? url })
22
+ assert_equal(urls.count, urls.select{|url| broken_url_eventually? url }.count)
23
23
  assert_all_assets_have_upload_status(csv, ['audio'], 'no')
24
24
  end
25
25
 
26
26
  def test_tp_finish_on_audio_files_with_sftp
27
27
  skip_if_no_sftp_credentials('tp-finish sftp test')
28
- in_temp_tp_dir do |dir|
28
+ with_temp_readymade_project do |dir|
29
29
  config_path = self.config_path(dir)
30
30
  tp_finish_on_audio_files_with(dir, config_path)
31
31
  end
@@ -33,10 +33,11 @@ class TestTpFinish < Typingpool::Test::Script
33
33
 
34
34
  def test_tp_finish_on_audio_files_with_s3
35
35
  skip_if_no_s3_credentials('tp-finish sftp test')
36
- in_temp_tp_dir do |dir|
36
+ with_temp_readymade_project do |dir|
37
37
  config = config_from_dir(dir)
38
38
  config.to_hash.delete('sftp')
39
39
  config_path = write_config(config, dir)
40
+ reconfigure_readymade_project_in(config_path)
40
41
  tp_finish_on_audio_files_with(dir, config_path)
41
42
  end
42
43
  end
@@ -44,12 +45,13 @@ class TestTpFinish < Typingpool::Test::Script
44
45
  def test_tp_finish_on_amazon_hits
45
46
  skip_if_no_amazon_credentials('tp-finish Amazon test')
46
47
  skip_if_no_upload_credentials('tp-finish Amazon test')
47
- in_temp_tp_dir do |dir|
48
- tp_make(dir)
48
+ with_temp_readymade_project do |dir|
49
49
  tp_assign(dir)
50
50
  project = temp_tp_dir_project(dir)
51
+ csv = project.local.file('data', 'assignment.csv').as(:csv)
51
52
  sandbox_csv = project.local.file('data', 'sandbox-assignment.csv').as(:csv)
52
- assert_all_assets_have_upload_status(sandbox_csv, ['audio', 'assignment'], 'yes')
53
+ assert_all_assets_have_upload_status(sandbox_csv, ['assignment'], 'yes')
54
+ assert_all_assets_have_upload_status(csv, ['audio'], 'yes')
53
55
  setup_amazon(dir)
54
56
  results = Typingpool::Amazon::HIT.all_for_project(project.local.id)
55
57
  refute_empty(results)
@@ -67,21 +69,22 @@ class TestTpFinish < Typingpool::Test::Script
67
69
  end #begin
68
70
  end #results.each...
69
71
  refute(File.exists? sandbox_csv)
70
- assert_all_assets_have_upload_status(project.local.file('data', 'assignment.csv').as(:csv), ['audio'], 'no')
71
- end #in_temp_tp_dir
72
+ assert_all_assets_have_upload_status(csv, ['audio'], 'no')
73
+ end #with_temp_readymade_project do...
72
74
  end
73
75
 
74
76
  def test_tp_finish_with_missing_files
75
77
  skip_if_no_amazon_credentials('tp-finish missing files test')
76
78
  skip_if_no_upload_credentials('tp-finish missing files test')
77
- in_temp_tp_dir do |dir|
79
+ with_temp_readymade_project do |dir|
78
80
  project = nil
81
+ simulate_failed_audio_upload_in(config_path(dir))
79
82
  tp_make(dir)
80
83
  begin
81
84
  project = temp_tp_dir_project(dir)
82
85
  assignments = project.local.file('data', 'assignment.csv').as(:csv).read
83
86
  urls = assignments.map{|assignment| assignment['audio_url'] }
84
- assert_empty(urls.reject{|url| working_url? url })
87
+ assert_equal(urls.count, urls.select{|url| working_url_eventually? url }.count)
85
88
  bogus_url = urls.first.sub(/\.mp3/, '.foo.mp3')
86
89
  refute_equal(urls.first, bogus_url)
87
90
  refute(working_url? bogus_url)
@@ -89,21 +92,23 @@ class TestTpFinish < Typingpool::Test::Script
89
92
  bogus_assignment['audio_url'] = bogus_url
90
93
  assignments.insert(1, bogus_assignment)
91
94
  project.local.file('data', 'assignment.csv').as(:csv).write(assignments)
92
- assert_equal(1, project.local.file('data', 'assignment.csv').as(:csv).reject{|assignment| working_url? assignment['audio_url'] }.count)
95
+ assignments = project.local.file('data', 'assignment.csv').as(:csv).read
96
+ refute(working_url? assignments[1]['audio_url'])
93
97
  ensure
94
98
  tp_finish_outside_sandbox(dir)
95
99
  end #begin
96
- assert_empty(project.local.file('data', 'assignment.csv').as(:csv).select{|assignment| working_url? assignment['audio_url'] })
97
- end #in_temp_tp_dir...
100
+ urls = project.local.file('data', 'assignment.csv').as(:csv).map{|assignment| assignment['audio_url'] }
101
+ assert_equal(urls.count, urls.select{|url| broken_url_eventually? url }.count)
102
+ end #with_temp_readymade_project do...
98
103
  end
99
104
 
100
- def test_abort_on_config_mismatch
101
- skip_if_no_s3_credentials('tp-finish abort on config mismatch test')
102
- in_temp_tp_dir do |dir|
103
- config = config_from_dir(dir)
104
- good_config_path = setup_s3_config(dir, config, '.config_s3_good')
105
- tp_make(dir, good_config_path)
106
- begin
105
+ def test_abort_on_config_mismatch
106
+ skip_if_no_s3_credentials('tp-finish abort on config mismatch test')
107
+ with_temp_readymade_project do |dir|
108
+ config = config_from_dir(dir)
109
+ good_config_path = setup_s3_config(dir, config, '.config_s3_good')
110
+ reconfigure_readymade_project_in(good_config_path)
111
+ simulate_failed_audio_upload_in(good_config_path)
107
112
  assert(config.amazon.bucket)
108
113
  new_bucket = 'configmismatch-test'
109
114
  refute_equal(new_bucket, config.amazon.bucket)
@@ -113,11 +118,7 @@ def test_abort_on_config_mismatch
113
118
  tp_finish_outside_sandbox(dir, bad_config_path)
114
119
  end #assert_raises...
115
120
  assert_match(/\burls don't look right\b/i, exception.message)
116
- ensure
117
- tp_finish_outside_sandbox(dir, good_config_path)
118
- end #begin
119
- end #in_temp_tp_dir do...
120
-
121
- end
121
+ end #with_temp_readymade_project do...
122
+ end
122
123
 
123
124
  end #TestTpFinish
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
  require 'uri'
@@ -137,7 +138,8 @@ class TestAmazon < Typingpool::Test
137
138
  with_dummy_typingpool_hit_or_skip('test_handles_hits_with_broken_external_question', url) do |hit, config|
138
139
  assert_equal(hit.full.external_question_url, url)
139
140
  refute(hit.full.external_question)
140
- end #with_dummy....
141
+ refute(hit.full.external_question_param(hit.class.url_at))
142
+ end #with_dummy....
141
143
  end
142
144
 
143
145
  #Lacks test for HIT::Assignment - needs VCR fixture (TODO)
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
  require 'fileutils'
@@ -1,11 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
- require 'tmpdir'
8
- require 'fileutils'
9
8
  require 'uri'
10
9
 
11
10
  class TestProject < Typingpool::Test
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
  require 'stringio'
8
9
  require 'aws-sdk'
9
- require 'securerandom'
10
10
 
11
11
  class TestProjectRemote < Typingpool::Test
12
12
  def test_project_remote_from_config
@@ -101,7 +101,6 @@ class TestProjectRemote < Typingpool::Test
101
101
  :test_with => lambda{|urls| urls.each_with_index{|url, i| assert_includes(url, basenames[i]) } }
102
102
  )
103
103
 
104
- sleep 5
105
104
  #now with different basenames
106
105
  remote_basenames = basenames.map{|name| [File.basename(name, '.*'), pseudo_random_chars, File.extname(name)].join }
107
106
  base_args = {
@@ -116,7 +115,6 @@ class TestProjectRemote < Typingpool::Test
116
115
  )
117
116
  )
118
117
 
119
- sleep 5
120
118
  #now using remove_urls for removal
121
119
  put_remove_test(
122
120
  base_args.merge(
@@ -125,7 +123,6 @@ class TestProjectRemote < Typingpool::Test
125
123
  )
126
124
  )
127
125
 
128
- sleep 5
129
126
  #now with stringio streams
130
127
  put_remove_test(
131
128
  base_args.merge(
@@ -164,14 +161,12 @@ class TestProjectRemote < Typingpool::Test
164
161
  assert(urls = args[:remote].put(*put_args))
165
162
  begin
166
163
  assert_equal(args[:streams].count, urls.count)
167
- sleep 10
168
- urls.each{|url| assert(working_url?(url)) }
164
+ urls.each{|url| assert(working_url_eventually?(url)) }
169
165
  args[:test_with].call(urls) if args[:test_with]
170
166
  ensure
171
167
  args[:remove_with].call(urls)
172
168
  end #begin
173
- sleep 10
174
- urls.each{|url| refute(working_url?(url)) }
169
+ urls.each{|url| assert(broken_url_eventually?(url)) }
175
170
  urls
176
171
  end
177
172
 
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
  require 'fileutils'
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
+
5
+ require 'minitest/autorun'
6
+ require 'typingpool'
7
+ require 'typingpool/test'
8
+ require 'set'
9
+
10
+ class TestTest < Typingpool::Test::Script
11
+
12
+ def test_readymade_project
13
+ in_temp_tp_dir do |dir|
14
+ tp_make(dir, config_path(dir), 'mp3', true)
15
+ assert_is_proper_tp_dir(dir)
16
+ assert_has_proper_assignment_csv(dir)
17
+ end
18
+ with_temp_readymade_project do |dir|
19
+ assert_is_proper_tp_dir(dir)
20
+ assert_has_proper_assignment_csv(dir)
21
+ end
22
+ with_temp_readymade_project do |dir|
23
+ with_temp_readymade_project do |dir2|
24
+ projects = [temp_tp_dir_project(dir), temp_tp_dir_project(dir2)]
25
+ refute_equal(projects[0].local.id, projects[1].local.id)
26
+ ['audio_url', 'project_id'].each do |csv_param|
27
+ param_set = projects.map{|project| Set.new project.local.file('data', 'assignment.csv').as(:csv).select{|a| a[csv_param] } }
28
+ assert_empty(param_set[0].intersection(param_set[1]))
29
+ end #['audio_url', 'project_id'].each do...
30
+ end #with_temp_readymade_project do...
31
+ end #with_temp_readymade_project do...
32
+ end
33
+
34
+ def assert_is_proper_tp_dir(dir)
35
+ assert(File.exists? temp_tp_dir_project_dir(dir))
36
+ assert(File.directory? temp_tp_dir_project_dir(dir))
37
+ assert(project = temp_tp_dir_project(dir))
38
+ assert(project.local)
39
+ assert_equal(3, project.local.subdir('audio', 'originals').files.count)
40
+ assert_in_delta(6, project.local.subdir('audio', 'chunks').files.count, 1)
41
+ end
42
+
43
+ def assert_has_proper_assignment_csv(dir)
44
+ assert(project = temp_tp_dir_project(dir))
45
+ assert(File.exists? project.local.file('data', 'assignment.csv').path)
46
+ assert(assignments = project.local.file('data', 'assignment.csv').as(:csv).read)
47
+ assert_equal(project.local.subdir('audio', 'chunks').files.count, assignments.count)
48
+ assert_equal(assignments.count, assignments.select{|a| a['audio_url']}.count)
49
+ assignments.each{|a| assert_match(/^https?:\/\/\w+/i, a['audio_url']) }
50
+ end
51
+
52
+ end #class TestTest
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift File.join(File.dirname(File.dirname($0)), 'lib')
3
+ $LOAD_PATH.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
4
4
 
5
+ require 'minitest/autorun'
5
6
  require 'typingpool'
6
7
  require 'typingpool/test'
7
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typingpool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Tate
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-30 00:00:00.000000000 Z
11
+ date: 2013-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rturk
@@ -155,6 +155,7 @@ files:
155
155
  - lib/typingpool/app/cli.rb
156
156
  - lib/typingpool/app/cli/formatter.rb
157
157
  - lib/typingpool/app/friendlyexceptions.rb
158
+ - lib/typingpool/app/test.rb
158
159
  - lib/typingpool/config.rb
159
160
  - lib/typingpool/config/root.rb
160
161
  - lib/typingpool/error.rb
@@ -252,6 +253,7 @@ files:
252
253
  - test/test_unit_project_local.rb
253
254
  - test/test_unit_project_remote.rb
254
255
  - test/test_unit_template.rb
256
+ - test/test_unit_test.rb
255
257
  - test/test_unit_transcript.rb
256
258
  - typingpool.gemspec
257
259
  homepage: http://github.com/ryantate/typingpool