typingpool 0.8.4 → 0.8.5

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.
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