ci-syntax-tool 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/LICENSE +27 -0
  4. data/README.md +109 -0
  5. data/Rakefile +43 -0
  6. data/bin/ci-syntax-tool +12 -0
  7. data/ci-syntax-tool.gemspec +27 -0
  8. data/lib/ci-syntax-tool.rb +6 -0
  9. data/lib/ci-syntax-tool/checker.rb +63 -0
  10. data/lib/ci-syntax-tool/command_line.rb +229 -0
  11. data/lib/ci-syntax-tool/format/base.rb +50 -0
  12. data/lib/ci-syntax-tool/format/junit.rb +54 -0
  13. data/lib/ci-syntax-tool/format/progress.rb +60 -0
  14. data/lib/ci-syntax-tool/format_factory.rb +55 -0
  15. data/lib/ci-syntax-tool/language/base.rb +56 -0
  16. data/lib/ci-syntax-tool/language/yaml.rb +41 -0
  17. data/lib/ci-syntax-tool/language_factory.rb +41 -0
  18. data/lib/ci-syntax-tool/result.rb +134 -0
  19. data/lib/ci-syntax-tool/version.rb +10 -0
  20. data/rubocop.yml +11 -0
  21. data/test/features/.keep +0 -0
  22. data/test/features/command-line-help.feature +15 -0
  23. data/test/features/format-junit.feature +29 -0
  24. data/test/features/language-yaml.feature +34 -0
  25. data/test/features/pluggable-formatters.feature +42 -0
  26. data/test/features/pluggable-languages.feature +15 -0
  27. data/test/features/require-ruby.feature +38 -0
  28. data/test/features/step_definitions/cli_steps.rb +46 -0
  29. data/test/features/step_definitions/format_steps.rb +63 -0
  30. data/test/features/step_definitions/junit_steps.rb +57 -0
  31. data/test/features/step_definitions/language_steps.rb +39 -0
  32. data/test/features/step_definitions/require_steps.rb +38 -0
  33. data/test/features/support/feature_helper.rb +142 -0
  34. data/test/fixtures/.keep +0 -0
  35. data/test/fixtures/files/clean/README.md +6 -0
  36. data/test/fixtures/files/clean/ansiblish.yaml +12 -0
  37. data/test/fixtures/files/clean/kitchenish.yml +17 -0
  38. data/test/fixtures/files/clean/rubocopish.yaml +11 -0
  39. data/test/fixtures/files/error/bad-indentation.yaml +5 -0
  40. data/test/fixtures/files/error/missing-array-element.yaml +5 -0
  41. data/test/fixtures/files/error/unquoted-jinja-template.yaml +3 -0
  42. data/test/fixtures/files/error/very-high-yaml-version.yaml +3 -0
  43. data/test/fixtures/require/invalid.rb +6 -0
  44. data/test/fixtures/require/mock_format.rb +10 -0
  45. data/test/fixtures/require/second.rb +10 -0
  46. data/test/fixtures/require/valid.rb +10 -0
  47. data/test/unit/.keep +0 -0
  48. data/test/unit/format_factory_spec.rb +46 -0
  49. data/test/unit/language_factory_spec.rb +46 -0
  50. data/test/unit/result_spec.rb +18 -0
  51. data/test/unit/spec_helper.rb +31 -0
  52. metadata +201 -0
@@ -0,0 +1,142 @@
1
+ require_relative '../../../lib/ci-syntax-tool'
2
+ require 'minitest'
3
+
4
+ require 'byebug'
5
+
6
+ module CI
7
+ module Syntax
8
+ module Tool
9
+ module FeatureHelpers
10
+
11
+ include MiniTest::Assertions
12
+
13
+ attr_writer :assertions
14
+ def assertions
15
+ @assertions ||= 0
16
+ end
17
+
18
+ def run_check(command_line_args)
19
+
20
+ # puts "RAW CLI: " + command_line_args.inspect # DEBUG
21
+
22
+ # Capture any stdout and stderr
23
+ sio_out = StringIO.new
24
+ old_stdout = $stdout
25
+ $stdout = sio_out
26
+ sio_err = StringIO.new
27
+ old_stderr = $stderr
28
+ $stderr = sio_err
29
+
30
+ overall_result = nil
31
+ cli_opts = CI::Syntax::Tool::CommandLine.new(command_line_args)
32
+ # puts "COOKED CLI: " + cli_opts.options.inspect # DEBUG
33
+ if cli_opts.runnable?
34
+ checker = CI::Syntax::Tool::Checker.new(cli_opts)
35
+ exit_status = checker.run()
36
+ overall_result = checker.overall_result
37
+ else
38
+ exit_status = cli_opts.non_runnable_exit_status
39
+ end
40
+
41
+ $stdout = old_stdout
42
+ $stderr = old_stderr
43
+
44
+ result = {
45
+ stdout: sio_out.string,
46
+ stderr: sio_err.string,
47
+ exit_status: exit_status,
48
+ overall_result: overall_result,
49
+ }
50
+ # puts "Results: " + result.inspect # DEBUG
51
+ return result
52
+
53
+ end
54
+
55
+ def list_cli_opts
56
+ return [
57
+ {s: 'V', l: 'version', d: 'Show ci-syntax-tool version'},
58
+ {s: 'h', l: 'help', d: 'Show this help message'},
59
+ {s: 'l', l: 'lang LANG', d: 'Select this language for checking. Repeatable. Default, all languages.'},
60
+ { l: 'list-languages', d: 'List available languages and exit.'},
61
+ {s: 'f', l: 'format FORMAT', d: 'Use this format for output. Repeatable, but if repeated, must have an equal number of --output options.'},
62
+ {s: 'o', l: 'output PATH', d: 'Write formatted output to this location. Use "-" to represent STDOUT. Defaults to STDOUT if zero or one --format option used. Repeatable with an equal number of --format options.'},
63
+ { l: 'list-formats', d: 'List available formats and exit.'},
64
+ {s: 'r', l: 'require RUBYFILE', d: 'Load additional Ruby code, perhaps for a custom language or format. Repeatable.'},
65
+ {s: 'd', l: 'debug', d: 'Provide debug-level output to STDOUT.'},
66
+ ]
67
+ end
68
+
69
+ def list_core_languages
70
+ return [
71
+ 'YAML',
72
+ ]
73
+ end
74
+
75
+ def list_core_formats
76
+ return [
77
+ 'JUnit',
78
+ 'Progress',
79
+ ]
80
+ end
81
+
82
+ def assert_usage_message
83
+ list_cli_opts.each do |opt|
84
+ re = '\s+'
85
+ re += '-' if opt[:s]
86
+ re += opt[:s] if opt[:s]
87
+ re += ',' if opt[:s]
88
+ re += '\s+'
89
+ re += '--' + opt[:l]
90
+ re += '\s+'
91
+ re += opt[:d]
92
+ re += '\s+'
93
+ assert_match(Regexp.new(re), @run_result[:stdout], "The '#{opt[:l]}' option should be present")
94
+ end
95
+ # TODO - check for spurious options?
96
+ end
97
+
98
+ def assert_language_list
99
+ seen = @run_result[:stdout].split("\n").sort
100
+ expected = list_core_languages.sort
101
+ assert_equal(expected, seen, 'The list of supported languages should match')
102
+ end
103
+
104
+ def assert_format_list
105
+ seen = @run_result[:stdout].split("\n").sort
106
+ expected = list_core_formats.sort
107
+ assert_equal(expected, seen, 'The list of supported formats should match')
108
+ end
109
+
110
+ def assert_class_loaded(klass)
111
+ begin
112
+ Kernel.const_get(klass)
113
+ rescue NameError => e
114
+ flunk("Expected Class #{klass} to have been loaded")
115
+ rescue StandardError => e
116
+ raise
117
+ end
118
+ end
119
+
120
+ def files_matching_language(files, lang_name)
121
+ globs = LanguageFactory.create(lang_name).combined_globs
122
+ matches = []
123
+ globs.each do |glob|
124
+ re = glob.gsub('.', '\.')
125
+ re = glob.gsub('**/', '.+')
126
+ re = re.gsub('*', '.+')
127
+ re += '$'
128
+ re = Regexp.new(re)
129
+ files.select {|fn1| fn1.match(re) }.each do |fn2|
130
+ matches << fn2
131
+ end
132
+ end
133
+ matches
134
+ end
135
+
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+
142
+ World(CI::Syntax::Tool::FeatureHelpers)
File without changes
@@ -0,0 +1,6 @@
1
+ # A Test Markdown File
2
+
3
+ ## With a section
4
+
5
+ and some block
6
+ quotes
@@ -0,0 +1,12 @@
1
+ ---
2
+ - name: A pretend play
3
+ hosts: the_mostest
4
+ tasks:
5
+ - name: Do something
6
+ command: tap-dance to stardom
7
+
8
+ - name: touch something
9
+ file:
10
+ path: /tmp/hearts-and-minds-of-our-nations-youth
11
+ action: touch
12
+
@@ -0,0 +1,17 @@
1
+ ---
2
+ driver:
3
+ name: vagrant
4
+
5
+ provisioner:
6
+ name: chef_zero
7
+
8
+ platforms:
9
+ - name: ubuntu-14.04
10
+ driver_config:
11
+ network:
12
+ - ["forwarded_port", {guest: 80, host: 8080, auto_correct: true}]
13
+
14
+ suites:
15
+ - name: default
16
+ run_list:
17
+ - recipe[awesomesauce::default]
@@ -0,0 +1,11 @@
1
+ Style/FileName:
2
+ Enabled: False
3
+
4
+ Metrics/MethodLength:
5
+ Max: 25
6
+
7
+ Style/TrailingWhitespace:
8
+ Enabled: False
9
+
10
+ Style/TrailingComma:
11
+ Enabled: False
@@ -0,0 +1,5 @@
1
+ ---
2
+ name: Indented zero spaces
3
+ name: indented two spaces
4
+ name: indented three spaces
5
+ name: indented one space, wth
@@ -0,0 +1,5 @@
1
+ ---
2
+ Here:
3
+ -
4
+ name: foo
5
+ - nope
@@ -0,0 +1,3 @@
1
+ ---
2
+ - name: A typical rookie ansible mistake
3
+ value: {{ this_will_bite_it }}
@@ -0,0 +1,3 @@
1
+ %YAML 9.9
2
+ ---
3
+ name: Yeah right
@@ -0,0 +1,6 @@
1
+ module CI
2
+ module Syntax
3
+ module Tool
4
+ module Test
5
+ class InvalidRequire
6
+ # Intentionally syntactically bad
@@ -0,0 +1,10 @@
1
+ module CI
2
+ module Syntax
3
+ module Tool
4
+ module Format
5
+ class MockFormat < Format::Base
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module CI
2
+ module Syntax
3
+ module Tool
4
+ module Test
5
+ class SecondRequire
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module CI
2
+ module Syntax
3
+ module Tool
4
+ module Test
5
+ class ValidRequire
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
File without changes
@@ -0,0 +1,46 @@
1
+ require_relative './spec_helper'
2
+
3
+ RSpec.describe CI::Syntax::Tool::FormatFactory, "#all_format_classes" do
4
+
5
+ it "should return a list of Classes" do
6
+ langs = CI::Syntax::Tool::FormatFactory.all_format_classes
7
+ langs.each do |lang|
8
+ expect(lang).to be_kind_of(Class)
9
+ end
10
+ end
11
+
12
+ end
13
+
14
+ RSpec.describe CI::Syntax::Tool::FormatFactory, "#all_format_names" do
15
+
16
+ it "should return a list of Strings" do
17
+ lang_names = CI::Syntax::Tool::FormatFactory.all_format_names
18
+ lang_names.each do |lang|
19
+ expect(lang).to be_kind_of(String)
20
+ end
21
+ end
22
+
23
+ it "should not return Base among the format names" do
24
+ lang_names = CI::Syntax::Tool::FormatFactory.all_format_names
25
+ expect(lang_names).not_to include('Base')
26
+ end
27
+
28
+ it "should include the expected format names" do
29
+ lang_names = CI::Syntax::Tool::FormatFactory.all_format_names
30
+ [
31
+ 'Progress',
32
+ ].each do |lang|
33
+ expect(lang_names).to include(lang)
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ RSpec.describe CI::Syntax::Tool::FormatFactory, "#create" do
40
+ it "should be able to create one of each format with a single arg" do
41
+ CI::Syntax::Tool::FormatFactory.all_format_names.each do |fmt_name|
42
+ lang_obj = CI::Syntax::Tool::FormatFactory.create(fmt_name, 'test/tmp/dest-unit-0')
43
+ expect(lang_obj).to be_kind_of CI::Syntax::Tool::Format::Base
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require_relative './spec_helper'
2
+
3
+ RSpec.describe CI::Syntax::Tool::LanguageFactory, "#all_language_classes" do
4
+
5
+ it "should return a list of Classes" do
6
+ langs = CI::Syntax::Tool::LanguageFactory.all_language_classes
7
+ langs.each do |lang|
8
+ expect(lang).to be_kind_of(Class)
9
+ end
10
+ end
11
+
12
+ end
13
+
14
+ RSpec.describe CI::Syntax::Tool::LanguageFactory, "#all_language_names" do
15
+
16
+ it "should return a list of Strings" do
17
+ lang_names = CI::Syntax::Tool::LanguageFactory.all_language_names
18
+ lang_names.each do |lang|
19
+ expect(lang).to be_kind_of(String)
20
+ end
21
+ end
22
+
23
+ it "should not return Base among the language names" do
24
+ lang_names = CI::Syntax::Tool::LanguageFactory.all_language_names
25
+ expect(lang_names).not_to include('Base')
26
+ end
27
+
28
+ it "should include the expected language names" do
29
+ lang_names = CI::Syntax::Tool::LanguageFactory.all_language_names
30
+ [
31
+ 'YAML',
32
+ ].each do |lang|
33
+ expect(lang_names).to include(lang)
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ RSpec.describe CI::Syntax::Tool::LanguageFactory, "#create" do
40
+ it "should be able to create one of each language with no args" do
41
+ CI::Syntax::Tool::LanguageFactory.all_language_names.each do |lang_name|
42
+ lang_obj = CI::Syntax::Tool::LanguageFactory.create(lang_name)
43
+ expect(lang_obj).to be_kind_of CI::Syntax::Tool::Language::Base
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ require_relative './spec_helper'
2
+
3
+ RSpec.describe CI::Syntax::Tool::Issue, "#constructor" do
4
+
5
+ it "should be an error-level issue by default" do
6
+ issue = CI::Syntax::Tool::Issue.new
7
+ expect(issue.level).to be :error
8
+ end
9
+
10
+ end
11
+
12
+ RSpec.describe CI::Syntax::Tool::Result::FileResult, "#issue counting" do
13
+ it "should have zero issues by default" do
14
+ fr = CI::Syntax::Tool::Result::FileResult.new('fake.yaml')
15
+ expect(fr.warning_count).to eq 0
16
+ expect(fr.error_count).to eq 0
17
+ end
18
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../lib/ci-syntax-tool'
2
+
3
+ require 'rspec'
4
+ require 'rspec/core'
5
+
6
+ RSpec.configure do |config|
7
+
8
+ config.expect_with :rspec do |expectations|
9
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
10
+ end
11
+
12
+ config.mock_with :rspec do |mocks|
13
+ mocks.verify_partial_doubles = true
14
+ end
15
+
16
+ config.disable_monkey_patching!
17
+
18
+ config.warnings = true
19
+
20
+
21
+ if config.files_to_run.one?
22
+ config.default_formatter = 'doc'
23
+ end
24
+
25
+ config.profile_examples = 10
26
+
27
+ config.order = :random
28
+
29
+ Kernel.srand config.seed
30
+
31
+ end
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ci-syntax-tool
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Clinton Wolfe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.8'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: cucumber
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.28'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.28'
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.6'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.6'
83
+ description: Checks YAML, JSON, Ruby, ERB, and other syntaxes, then reports errors
84
+ and OKs in a nice way for your CI system.
85
+ email:
86
+ - clinton@omniti.com
87
+ executables:
88
+ - ci-syntax-tool
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".gitignore"
93
+ - LICENSE
94
+ - README.md
95
+ - Rakefile
96
+ - bin/ci-syntax-tool
97
+ - ci-syntax-tool.gemspec
98
+ - lib/ci-syntax-tool.rb
99
+ - lib/ci-syntax-tool/checker.rb
100
+ - lib/ci-syntax-tool/command_line.rb
101
+ - lib/ci-syntax-tool/format/base.rb
102
+ - lib/ci-syntax-tool/format/junit.rb
103
+ - lib/ci-syntax-tool/format/progress.rb
104
+ - lib/ci-syntax-tool/format_factory.rb
105
+ - lib/ci-syntax-tool/language/base.rb
106
+ - lib/ci-syntax-tool/language/yaml.rb
107
+ - lib/ci-syntax-tool/language_factory.rb
108
+ - lib/ci-syntax-tool/result.rb
109
+ - lib/ci-syntax-tool/version.rb
110
+ - rubocop.yml
111
+ - test/features/.keep
112
+ - test/features/command-line-help.feature
113
+ - test/features/format-junit.feature
114
+ - test/features/language-yaml.feature
115
+ - test/features/pluggable-formatters.feature
116
+ - test/features/pluggable-languages.feature
117
+ - test/features/require-ruby.feature
118
+ - test/features/step_definitions/cli_steps.rb
119
+ - test/features/step_definitions/format_steps.rb
120
+ - test/features/step_definitions/junit_steps.rb
121
+ - test/features/step_definitions/language_steps.rb
122
+ - test/features/step_definitions/require_steps.rb
123
+ - test/features/support/feature_helper.rb
124
+ - test/fixtures/.keep
125
+ - test/fixtures/files/clean/README.md
126
+ - test/fixtures/files/clean/ansiblish.yaml
127
+ - test/fixtures/files/clean/kitchenish.yml
128
+ - test/fixtures/files/clean/rubocopish.yaml
129
+ - test/fixtures/files/error/bad-indentation.yaml
130
+ - test/fixtures/files/error/missing-array-element.yaml
131
+ - test/fixtures/files/error/unquoted-jinja-template.yaml
132
+ - test/fixtures/files/error/very-high-yaml-version.yaml
133
+ - test/fixtures/require/invalid.rb
134
+ - test/fixtures/require/mock_format.rb
135
+ - test/fixtures/require/second.rb
136
+ - test/fixtures/require/valid.rb
137
+ - test/tmp/.keep
138
+ - test/unit/.keep
139
+ - test/unit/format_factory_spec.rb
140
+ - test/unit/language_factory_spec.rb
141
+ - test/unit/result_spec.rb
142
+ - test/unit/spec_helper.rb
143
+ homepage: https://github.com/clintoncwolfe/ci-syntax-tool
144
+ licenses:
145
+ - BSD (3-clause)
146
+ metadata: {}
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubyforge_project:
163
+ rubygems_version: 2.4.8
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: A Rubygem implementing a suite of source code syntax checkers, with well-behaved
167
+ output fo use with CI engines.
168
+ test_files:
169
+ - test/features/.keep
170
+ - test/features/command-line-help.feature
171
+ - test/features/format-junit.feature
172
+ - test/features/language-yaml.feature
173
+ - test/features/pluggable-formatters.feature
174
+ - test/features/pluggable-languages.feature
175
+ - test/features/require-ruby.feature
176
+ - test/features/step_definitions/cli_steps.rb
177
+ - test/features/step_definitions/format_steps.rb
178
+ - test/features/step_definitions/junit_steps.rb
179
+ - test/features/step_definitions/language_steps.rb
180
+ - test/features/step_definitions/require_steps.rb
181
+ - test/features/support/feature_helper.rb
182
+ - test/fixtures/.keep
183
+ - test/fixtures/files/clean/README.md
184
+ - test/fixtures/files/clean/ansiblish.yaml
185
+ - test/fixtures/files/clean/kitchenish.yml
186
+ - test/fixtures/files/clean/rubocopish.yaml
187
+ - test/fixtures/files/error/bad-indentation.yaml
188
+ - test/fixtures/files/error/missing-array-element.yaml
189
+ - test/fixtures/files/error/unquoted-jinja-template.yaml
190
+ - test/fixtures/files/error/very-high-yaml-version.yaml
191
+ - test/fixtures/require/invalid.rb
192
+ - test/fixtures/require/mock_format.rb
193
+ - test/fixtures/require/second.rb
194
+ - test/fixtures/require/valid.rb
195
+ - test/tmp/.keep
196
+ - test/unit/.keep
197
+ - test/unit/format_factory_spec.rb
198
+ - test/unit/language_factory_spec.rb
199
+ - test/unit/result_spec.rb
200
+ - test/unit/spec_helper.rb
201
+ has_rdoc: