teabag 0.7.2 → 0.7.3

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.
Files changed (114) hide show
  1. data/README.md +36 -2
  2. data/app/assets/javascripts/teabag-angular.js +88 -44
  3. data/app/assets/javascripts/teabag-jasmine.js +12 -0
  4. data/app/assets/javascripts/teabag-mocha.js +13 -3
  5. data/app/assets/javascripts/teabag-qunit.js +13 -3
  6. data/app/assets/javascripts/teabag/base/teabag.coffee +5 -0
  7. data/app/views/teabag/spec/runner.html.erb +39 -20
  8. data/lib/teabag.rb +2 -0
  9. data/lib/teabag/configuration.rb +2 -1
  10. data/lib/teabag/coverage.rb +1 -1
  11. data/lib/teabag/formatters/base_formatter.rb +1 -0
  12. data/lib/teabag/formatters/teamcity_formatter.rb +57 -0
  13. data/lib/teabag/instrumentation.rb +1 -1
  14. data/lib/teabag/suite.rb +12 -1
  15. data/lib/teabag/version.rb +1 -1
  16. data/spec/dummy/log/development.log +1237 -0
  17. data/spec/dummy/log/test.log +317 -0
  18. data/spec/dummy/tmp/cache/assets/C35/A30/sprockets%2F29906bf540f7d2e081088494b2554989 +0 -0
  19. data/spec/dummy/tmp/cache/assets/C4E/9B0/sprockets%2Fa807397434c9262c3d62da3e91152184 +0 -0
  20. data/spec/dummy/tmp/cache/assets/C72/150/sprockets%2F4194031b4b51b6422c14ac697e3455e5 +0 -0
  21. data/spec/dummy/tmp/cache/assets/C75/D50/sprockets%2F5302968a40e08d2c011aa38666d273f6 +0 -0
  22. data/spec/dummy/tmp/cache/assets/C78/F80/sprockets%2F9161622ddd251097a4ab816b8220984c +0 -0
  23. data/spec/dummy/tmp/cache/assets/C7D/8F0/sprockets%2Ff13d01b85f2449a4f0638ff260425906 +0 -0
  24. data/spec/dummy/tmp/cache/assets/C89/700/sprockets%2F259935a7704fef0069303ea63fa89408 +0 -0
  25. data/spec/dummy/tmp/cache/assets/C8A/460/sprockets%2F77bffd9959420103906722b404ae8d59 +0 -0
  26. data/spec/dummy/tmp/cache/assets/C91/FA0/sprockets%2F2eb81283f5789ae91a69344552db3856 +0 -0
  27. data/spec/dummy/tmp/cache/assets/C9D/E90/sprockets%2F3045c9533f179d3e1c805d163ed002a0 +0 -0
  28. data/spec/dummy/tmp/cache/assets/CA6/DF0/sprockets%2F7da83747ce56e49393b6b8726587f846 +0 -0
  29. data/spec/dummy/tmp/cache/assets/CA9/C40/sprockets%2F932b7e2cd1e067289ab51190800814df +0 -0
  30. data/spec/dummy/tmp/cache/assets/CAA/0C0/sprockets%2F057b0ce384f16d9202ae84473436cc35 +0 -0
  31. data/spec/dummy/tmp/cache/assets/CAD/410/sprockets%2F651414e5c7e86f05c5108dc71626b25c +0 -0
  32. data/spec/dummy/tmp/cache/assets/CAF/0F0/sprockets%2F6000e67cf3f2377f860c24da7c819701 +0 -0
  33. data/spec/dummy/tmp/cache/assets/CB0/700/sprockets%2F006af6bf0f6b55777b03c4615c853881 +0 -0
  34. data/spec/dummy/tmp/cache/assets/CBB/FA0/sprockets%2F74922109263bdc965b2e9567eec6d154 +0 -0
  35. data/spec/dummy/tmp/cache/assets/CBD/AF0/sprockets%2Fd687ec33822256e9444e8cd04f1b4873 +0 -0
  36. data/spec/dummy/tmp/cache/assets/CBF/630/sprockets%2F707d2db81468088470d476abff35388d +0 -0
  37. data/spec/dummy/tmp/cache/assets/CC2/EC0/sprockets%2F76bf80cb571ca530357f78db78167866 +0 -0
  38. data/spec/dummy/tmp/cache/assets/CCE/C50/sprockets%2Fe12774c2fea852112414bb379a71f31a +0 -0
  39. data/spec/dummy/tmp/cache/assets/CD3/460/sprockets%2F7f3f6802b0b309ed142d0b671c9640c4 +0 -0
  40. data/spec/dummy/tmp/cache/assets/CE0/090/sprockets%2F48d5d35ae87d0723318b8bc257fa2237 +0 -0
  41. data/spec/dummy/tmp/cache/assets/CE3/1F0/sprockets%2Fe69a515d3a9d14c669be8871012a7d07 +0 -0
  42. data/spec/dummy/tmp/cache/assets/CE6/270/sprockets%2F2c98152560d18470fec8cf4c6829b4d0 +0 -0
  43. data/spec/dummy/tmp/cache/assets/CE6/7C0/sprockets%2Fa03a2c86ce6724be8542295e1cf24798 +0 -0
  44. data/spec/dummy/tmp/cache/assets/CE7/A60/sprockets%2Ff58eee249aa167d23f8220087bb46684 +0 -0
  45. data/spec/dummy/tmp/cache/assets/CE9/9E0/sprockets%2F135480d497ed7e4884462dc0ef0b80d7 +0 -0
  46. data/spec/dummy/tmp/cache/assets/CEB/680/sprockets%2F67f0794ef8c0576d5c7da34f4437305a +0 -0
  47. data/spec/dummy/tmp/cache/assets/CEB/B40/sprockets%2F1150bf8d912aa100a132251eefaf6045 +0 -0
  48. data/spec/dummy/tmp/cache/assets/CEC/360/sprockets%2F264b79dde726b36d63fee272a0609469 +0 -0
  49. data/spec/dummy/tmp/cache/assets/CEE/3A0/sprockets%2Fb6c48f0d375946fb4038e3643c468e8a +0 -0
  50. data/spec/dummy/tmp/cache/assets/CF8/780/sprockets%2F8845b81ff27cdb57c835836c9f91a265 +0 -0
  51. data/spec/dummy/tmp/cache/assets/CFA/D20/sprockets%2Fb26796b39b3c5d6ed70be7989637a493 +0 -0
  52. data/spec/dummy/tmp/cache/assets/CFB/210/sprockets%2F9104695bfbf9a9d4b94382e6e90487a9 +0 -0
  53. data/spec/dummy/tmp/cache/assets/CFC/380/sprockets%2Fa7443cbd671446a589867dd5f4a4f989 +0 -0
  54. data/spec/dummy/tmp/cache/assets/D00/110/sprockets%2F6a6353b7723a8b21708e0fbfe04bd422 +0 -0
  55. data/spec/dummy/tmp/cache/assets/D00/F60/sprockets%2F42e279b52511c47d26c0adb125fd04e8 +0 -0
  56. data/spec/dummy/tmp/cache/assets/D03/630/sprockets%2F5d8da32dba6a7be70426a1d554773701 +0 -0
  57. data/spec/dummy/tmp/cache/assets/D04/170/sprockets%2F76ab1dc02e6c7618852708a1e05a2df3 +0 -0
  58. data/spec/dummy/tmp/cache/assets/D04/480/sprockets%2F8bd8f10500b21d2f9d94e4cd1401c936 +0 -0
  59. data/spec/dummy/tmp/cache/assets/D05/8D0/sprockets%2F319f8f235f452343f1ebf03cb262d23d +0 -0
  60. data/spec/dummy/tmp/cache/assets/D09/BF0/sprockets%2F9e6bca5d26f50d9484385d51ba04312c +0 -0
  61. data/spec/dummy/tmp/cache/assets/D0E/570/sprockets%2F90fe371bf8091e88a712124d9cdae260 +0 -0
  62. data/spec/dummy/tmp/cache/assets/D15/750/sprockets%2F8effdd3e668a4036260a3e370f3b6657 +0 -0
  63. data/spec/dummy/tmp/cache/assets/D17/710/sprockets%2Ffa49fb6823d466e79a195e0cd71340c5 +0 -0
  64. data/spec/dummy/tmp/cache/assets/D1D/560/sprockets%2F1ca784ee7ba1922465147e7f8963eae5 +0 -0
  65. data/spec/dummy/tmp/cache/assets/D1E/AA0/sprockets%2F5c8741a556bc955cd36e61c88582b6dc +0 -0
  66. data/spec/dummy/tmp/cache/assets/D31/9C0/sprockets%2Fbd102a4f5a4985c3519dd6ab0295a1c6 +0 -0
  67. data/spec/dummy/tmp/cache/assets/D35/7C0/sprockets%2Ff536a2606eaf7d542c0985104cb62baf +0 -0
  68. data/spec/dummy/tmp/cache/assets/D37/FF0/sprockets%2F96841ca4cfae32c515077f3f5fc303b2 +0 -0
  69. data/spec/dummy/tmp/cache/assets/D3C/840/sprockets%2Fc6202ec91d567a85bd3d46dc43ea9108 +0 -0
  70. data/spec/dummy/tmp/cache/assets/D44/E90/sprockets%2F05cfc0bf7c9938963d1d1c63248db80d +0 -0
  71. data/spec/dummy/tmp/cache/assets/D45/C30/sprockets%2Fcc744877558178a3adb77c441cadce70 +0 -0
  72. data/spec/dummy/tmp/cache/assets/D49/A10/sprockets%2Fc4656bd995a6f297c26d19b13aadb963 +0 -0
  73. data/spec/dummy/tmp/cache/assets/D50/D70/sprockets%2Fe2a3e6c95b11e0801a4eebae3a026026 +0 -0
  74. data/spec/dummy/tmp/cache/assets/D51/400/sprockets%2Ff5e433d8a31e80985b75ce598de236be +0 -0
  75. data/spec/dummy/tmp/cache/assets/D54/D80/sprockets%2F631327e25ec20edc723046cdec3bb1c0 +0 -0
  76. data/spec/dummy/tmp/cache/assets/D5C/710/sprockets%2F9427d05cee2caa721241a25a9af1d08f +0 -0
  77. data/spec/dummy/tmp/cache/assets/D5C/CC0/sprockets%2Faa8bf6de211f2765b0a26f112b971f0c +0 -0
  78. data/spec/dummy/tmp/cache/assets/D61/1F0/sprockets%2F0c7a6176d2fc4db00bb9a74d36380fe1 +0 -0
  79. data/spec/dummy/tmp/cache/assets/D67/BC0/sprockets%2F35d2c2b45981ade5a2db2a9c7f37a615 +0 -0
  80. data/spec/dummy/tmp/cache/assets/D69/F90/sprockets%2F6a0795b7b38bd7e6142cd1b88211dade +0 -0
  81. data/spec/dummy/tmp/cache/assets/D6A/950/sprockets%2F429b1806cb7580ebf29f9a12c33cbea6 +0 -0
  82. data/spec/dummy/tmp/cache/assets/D6A/ED0/sprockets%2F662ef351d001ba9f2a3a578d26bf9eb6 +0 -0
  83. data/spec/dummy/tmp/cache/assets/D6D/530/sprockets%2F8d52dee91bff01a8a2306d8a7c9152a9 +0 -0
  84. data/spec/dummy/tmp/cache/assets/D6D/DA0/sprockets%2Fac936bf40b42227a2bf9d474ae9ec149 +0 -0
  85. data/spec/dummy/tmp/cache/assets/D77/B30/sprockets%2F946cf2f17c7eb41037f9ee08ad67ec40 +0 -0
  86. data/spec/dummy/tmp/cache/assets/D78/2F0/sprockets%2F3c61f8915b8f717b1de788e6ecad122c +0 -0
  87. data/spec/dummy/tmp/cache/assets/D93/BD0/sprockets%2Ff5e1b60201e08e3ddf8d3de5211f3d5e +0 -0
  88. data/spec/dummy/tmp/cache/assets/DA0/330/sprockets%2Fcbbb4de706387d50f48a72ee6c9c1b80 +0 -0
  89. data/spec/dummy/tmp/cache/assets/DA5/0A0/sprockets%2F7a4b5928cec69ab65afff309a04d6b47 +0 -0
  90. data/spec/dummy/tmp/cache/assets/DAE/6C0/sprockets%2F77c7a8676aeefa73156c55dfcf51cc46 +0 -0
  91. data/spec/dummy/tmp/cache/assets/DAF/7C0/sprockets%2F8942514d59e7bffbfb33cde6fa9735c2 +0 -0
  92. data/spec/dummy/tmp/cache/assets/DB3/5D0/sprockets%2Fce1d4d75832c9bdeafd869f6f7b61725 +0 -0
  93. data/spec/dummy/tmp/cache/assets/DB5/040/sprockets%2F9a9da5df88713663b9fbc945facca891 +0 -0
  94. data/spec/dummy/tmp/cache/assets/DC3/230/sprockets%2Fdf52e72eb73be91eccc60182191aed0b +0 -0
  95. data/spec/dummy/tmp/cache/assets/DC7/A10/sprockets%2F84a8af0fcbf401864e1ae5bf092cba94 +0 -0
  96. data/spec/dummy/tmp/cache/assets/DCD/EB0/sprockets%2F4f77f509126ecbced7ea2a5ab290c8d4 +0 -0
  97. data/spec/dummy/tmp/cache/assets/DF6/0E0/sprockets%2F85b10db6e1afe643aba6d396abdd77f0 +0 -0
  98. data/spec/dummy/tmp/cache/assets/DF7/E10/sprockets%2F25e4253aba9a9adcefb72552fb1ff0c8 +0 -0
  99. data/spec/dummy/tmp/cache/assets/DF9/AD0/sprockets%2Fc700afd7cee3fe9d7ff8352b213b2c4a +0 -0
  100. data/spec/dummy/tmp/cache/assets/DFC/C20/sprockets%2Fd9178ad7e3b401c9fceafd64ea2b50d6 +0 -0
  101. data/spec/dummy/tmp/cache/assets/DFC/C30/sprockets%2Fb50a07cb30b0bd0eec8e98e5de79d65d +0 -0
  102. data/spec/dummy/tmp/cache/assets/E02/6E0/sprockets%2F63d6a5cdb8cefa64ef76b5c6e0fd3720 +0 -0
  103. data/spec/dummy/tmp/cache/assets/E08/BB0/sprockets%2Fefac99af1af28543aef6fb607faa4973 +0 -0
  104. data/spec/dummy/tmp/cache/assets/E2F/790/sprockets%2F7fac280deaa7ef20a77d5c9b5b9cfc34 +0 -0
  105. data/spec/dummy/tmp/cache/assets/E2F/9D0/sprockets%2Fafd2bbe50bf8be88e74d1dc049a7c09d +0 -0
  106. data/spec/dummy/tmp/cache/assets/E41/250/sprockets%2F97cf8fe3d7ffaff076f655aefb36da03 +0 -0
  107. data/spec/dummy/tmp/cache/assets/E64/1E0/sprockets%2F81ab4c863fbbdec8dd66afc97ebf034d +0 -0
  108. data/spec/dummy/tmp/cache/assets/E6E/260/sprockets%2Fd9f8ab8b91ef582cc6c99a3ba0dedfe6 +0 -0
  109. data/spec/dummy/tmp/cache/assets/F79/360/sprockets%2F0ce035fefee5ebdabc8efabfbdbd6ee4 +0 -0
  110. data/spec/teabag/coverage_spec.rb +4 -2
  111. data/spec/teabag/formatters/teamcity_formatter_spec.rb +91 -0
  112. data/spec/teabag/instrumentation_spec.rb +4 -2
  113. data/spec/teabag/suite_spec.rb +24 -0
  114. metadata +7 -4
@@ -10,7 +10,7 @@ describe Teabag::Coverage do
10
10
  before do
11
11
  Teabag.configuration.should_receive(:coverage_reports).and_return(["text", "text-summary", "html"])
12
12
  subject.stub(:generate_report) { |i, f| "_#{f}_report_" }
13
- File.stub(:write)
13
+ File.stub(:open)
14
14
 
15
15
  path = nil
16
16
  Dir.mktmpdir { |p| path = p }
@@ -19,7 +19,9 @@ describe Teabag::Coverage do
19
19
  end
20
20
 
21
21
  it "writes the data to a file" do
22
- File.should_receive(:write).with(@output, '{"foo":"bar"}')
22
+ file = mock('file')
23
+ File.should_receive(:open).with(@output, "w").and_yield(file)
24
+ file.should_receive(:write).with('{"foo":"bar"}')
23
25
  subject.reports
24
26
  end
25
27
 
@@ -0,0 +1,91 @@
1
+ require "spec_helper"
2
+ require "teabag/formatters/teamcity_formatter"
3
+ require "teabag/result"
4
+
5
+ describe Teabag::Formatters::TeamcityFormatter do
6
+
7
+ before do
8
+ @log = ""
9
+ STDOUT.stub(:print) { |s| @log << s }
10
+ end
11
+
12
+ describe "#runner" do
13
+
14
+ let(:json) { {"start" => "_start_", "total" => 20} }
15
+
16
+ it "logs the information" do
17
+ result = Teabag::Result.build_from_json(json)
18
+ subject.should_receive(:log).with("##teamcity[testSuiteStarted name='Jasmine']")
19
+ subject.runner(result)
20
+ end
21
+
22
+ end
23
+
24
+ describe "#spec" do
25
+
26
+ describe "passing spec" do
27
+
28
+ let(:json) { {"status" => "passed", "suite" => "My Suite", "label" => "My Label"} }
29
+
30
+ it "calls passing_spec" do
31
+ result = Teabag::Result.build_from_json(json)
32
+ subject.spec(result)
33
+
34
+ @log.should include "##teamcity[testStarted name='My Suite My Label' captureStandardOutput='false']
35
+ ##teamcity[testFinished name='My Suite My Label']"
36
+ end
37
+
38
+ end
39
+
40
+ describe "pending spec" do
41
+
42
+ let(:json) { {"status" => "pending", "suite" => "My Suite", "label" => "My Label"} }
43
+
44
+ it "calls pending_spec" do
45
+ result = Teabag::Result.build_from_json(json)
46
+ subject.spec(result)
47
+ @log.should include "##teamcity[testStarted name='My Suite My Label' captureStandardOutput='false']
48
+ ##teamcity[testFinished name='My Suite My Label']"
49
+ end
50
+
51
+ end
52
+
53
+ describe "failing spec" do
54
+
55
+ let(:json) { {"status" => "fail", "suite" => "My Suite", "label" => "My Label", "message" => "Error, oh no"} }
56
+
57
+ it "calls failing_spec" do
58
+ result = Teabag::Result.build_from_json(json)
59
+ subject.spec(result)
60
+ @log.should include "##teamcity[testStarted name='My Suite My Label' captureStandardOutput='false']
61
+ ##teamcity[testFailed name='My Suite My Label' message='Error, oh no']
62
+ ##teamcity[testFinished name='My Suite My Label']"
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ describe "#error" do
70
+
71
+ let(:json) { {"status" => "error", "message" => "Error, oh no", "trace" => [{"file" => "myfile.js", "line" => "33"}] } }
72
+
73
+ it "logs error" do
74
+ error = Teabag::Result.build_from_json(json)
75
+ subject.error(error)
76
+ @log.should include "##teamcity[message text='Error, oh no' errorDetails='myfile.js:33' status='ERROR']"
77
+ end
78
+
79
+ end
80
+
81
+ describe "#result" do
82
+
83
+ it "ends the suite" do
84
+ subject.result('result')
85
+
86
+ @log.should include "##teamcity[testSuiteFinished name='Jasmine']"
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -72,7 +72,7 @@ describe Teabag::Instrumentation do
72
72
  before do
73
73
  Teabag::Instrumentation.stub(:add?).and_return(true)
74
74
 
75
- File.stub(:write)
75
+ File.stub(:open)
76
76
  subject.any_instance.stub(:instrument).and_return(source + " // instrumented")
77
77
 
78
78
  path = nil
@@ -82,7 +82,9 @@ describe Teabag::Instrumentation do
82
82
  end
83
83
 
84
84
  it "writes the file to a tmp path" do
85
- File.should_receive(:write).with(@output, "function add(a, b) { return a + b } // ☃ ")
85
+ file = mock('file')
86
+ File.should_receive(:open).with(@output, "w").and_yield(file)
87
+ file.should_receive(:write).with("function add(a, b) { return a + b } // ☃ ")
86
88
  subject.add_to(response, env)
87
89
  end
88
90
 
@@ -51,6 +51,12 @@ describe Teabag::Suite do
51
51
 
52
52
  end
53
53
 
54
+ describe "#use_require" do
55
+ it "returns an boolean" do
56
+ expect(subject.use_require).to eq(false)
57
+ end
58
+ end
59
+
54
60
  describe "#stylesheets" do
55
61
 
56
62
  it "returns an array of stylesheets" do
@@ -102,6 +108,24 @@ describe Teabag::Suite do
102
108
 
103
109
  end
104
110
 
111
+ describe "#spec_javascripts_for_require" do
112
+ before do
113
+ subject.should_receive(:specs).and_return(%w(
114
+ test/js_ext.js.coffee
115
+ test/coffee_ext.coffee
116
+ test/coffee_and_erb_ext.coffee.erb
117
+ test/js_and_erb_ext.js.erb
118
+ ))
119
+ end
120
+ it 'returns an array of spec javascripts without .js and Teabag prefix' do
121
+ result = subject.spec_javascripts_for_require
122
+ expect(result[0]).to eq 'test/js_ext'
123
+ expect(result[1]).to eq 'test/coffee_ext'
124
+ expect(result[2]).to eq 'test/coffee_and_erb_ext'
125
+ expect(result[3]).to eq 'test/js_and_erb_ext'
126
+ end
127
+ end
128
+
105
129
  describe "#suites" do
106
130
 
107
131
  it "returns as hash with expected results" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teabag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-05-08 00:00:00.000000000 Z
14
+ date: 2013-06-16 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: railties
@@ -124,6 +124,7 @@ files:
124
124
  - lib/teabag/formatters/swayze_or_oprah_formatter.rb
125
125
  - lib/teabag/formatters/tap_formatter.rb
126
126
  - lib/teabag/formatters/tap_y_formatter.rb
127
+ - lib/teabag/formatters/teamcity_formatter.rb
127
128
  - lib/teabag/instrumentation.rb
128
129
  - lib/teabag/result.rb
129
130
  - lib/teabag/runner.rb
@@ -484,6 +485,7 @@ files:
484
485
  - spec/teabag/formatters/dot_formatter_spec.rb
485
486
  - spec/teabag/formatters/tap_formatter_spec.rb
486
487
  - spec/teabag/formatters/tap_y_formatter_spec.rb
488
+ - spec/teabag/formatters/teamcity_formatter_spec.rb
487
489
  - spec/teabag/instrumentation_spec.rb
488
490
  - spec/teabag/result_spec.rb
489
491
  - spec/teabag/runner_spec.rb
@@ -513,7 +515,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
513
515
  version: '0'
514
516
  segments:
515
517
  - 0
516
- hash: 171213547106369531
518
+ hash: 518881676548785832
517
519
  required_rubygems_version: !ruby/object:Gem::Requirement
518
520
  none: false
519
521
  requirements:
@@ -522,7 +524,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
522
524
  version: '0'
523
525
  segments:
524
526
  - 0
525
- hash: 171213547106369531
527
+ hash: 518881676548785832
526
528
  requirements: []
527
529
  rubyforge_project:
528
530
  rubygems_version: 1.8.24
@@ -861,6 +863,7 @@ test_files:
861
863
  - spec/teabag/formatters/dot_formatter_spec.rb
862
864
  - spec/teabag/formatters/tap_formatter_spec.rb
863
865
  - spec/teabag/formatters/tap_y_formatter_spec.rb
866
+ - spec/teabag/formatters/teamcity_formatter_spec.rb
864
867
  - spec/teabag/instrumentation_spec.rb
865
868
  - spec/teabag/result_spec.rb
866
869
  - spec/teabag/runner_spec.rb