to_factory 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b7199b7f56596066bd61469c11ed611c8559011
4
+ data.tar.gz: 9799646595d3bb9835d61cceffde7514334bfc9a
5
+ SHA512:
6
+ metadata.gz: eb276d7e60f92af6de9fb7a6c6fa0883cdffbd43d585141d359bb64b6e4539936d7fe40545453026419ccfa513a72db5804eecbe80ffd75f42d886d2f7c61e1c
7
+ data.tar.gz: 9345ae024ec70089a05d6430e1039691bbfad6eb43833525e8bb1ed4d7ba9054560a5d15b780617f4ede28efb51bc88c3e770250a24883ecc435563f05efc804
data/README.md CHANGED
@@ -11,10 +11,13 @@ ToFactory :wrench:
11
11
 
12
12
  Easily add factories with valid data for an existing project.
13
13
 
14
+ If you find yourself retro-fitting tests this gem will save you some of the legwork.
15
+
14
16
  * auto-generate all factories
15
17
  * adhoc generate from existing records
16
18
  * unintrusively update factory files in place
17
- * Parses and writes both new `FactoryGirl`, syntax or older `Factory.define` syntax
19
+ * display factory definition for a record
20
+ * parse and write `FactoryGirl` syntax or older `Factory.define` syntax
18
21
 
19
22
  Tested against Ruby 1.8.7, 1.9.2, 1.9.3, 2.0.0, 2.1.x, 2.2.0
20
23
 
@@ -63,11 +66,6 @@ ToFactory(exclude: [User, Project])
63
66
  #Use Adhoc instances from the console
64
67
  ToFactory User.last
65
68
 
66
- #List defined factory names
67
- ToFactory.definitions
68
- #=> [:user, :admin, :project]
69
-
70
-
71
69
  #writes to spec/factories/user.rb
72
70
  FactoryGirl.define
73
71
  factory(:user) do |u|
@@ -76,6 +74,16 @@ FactoryGirl.define
76
74
  end
77
75
  end
78
76
 
77
+ #List defined factory names
78
+ ToFactory.definitions
79
+ #=> [:user, :admin, :project]
80
+
81
+ #Display definition from record
82
+ ToFactory.definition_for @user
83
+
84
+ #Display existing definition from name
85
+ ToFactory.definition_for :admin
86
+
79
87
  #doesn't overwrite existing factories
80
88
  ToFactory User.last
81
89
  #Exception =>
@@ -16,8 +16,8 @@ module ToFactory
16
16
  end
17
17
 
18
18
  def organize
19
- representations.group_by(&:klass).inject({}) do |o, (klass,r)|
20
- o[klass] = r.sort_by(&:hierarchy_order)
19
+ representations.group_by{|i| i.klass.name.underscore}.inject({}) do |o, (klass_name,r)|
20
+ o[klass_name] = r.sort_by(&:hierarchy_order)
21
21
  o
22
22
  end
23
23
  end
@@ -54,7 +54,7 @@ module ToFactory
54
54
  end
55
55
 
56
56
  def raise_already_exists!(keys)
57
- raise ToFactory::AlreadyExists.new "an item for each of the following keys #{keys} already exists"
57
+ raise ToFactory::AlreadyExists.new "an item for each of the following keys #{keys.inspect} already exists"
58
58
  end
59
59
  end
60
60
  end
@@ -5,8 +5,8 @@ module ToFactory
5
5
  end
6
6
 
7
7
  def write(definitions)
8
- definitions.each do |klass, representations|
9
- write_to(name_from klass) do
8
+ definitions.each do |klass_name, representations|
9
+ write_to(klass_name) do
10
10
  wrap_factories(representations.map(&:definition))
11
11
  end
12
12
  end
@@ -14,10 +14,6 @@ module ToFactory
14
14
 
15
15
  private
16
16
 
17
- def name_from(klass)
18
- klass.name.underscore.gsub /^"|"$/, ""
19
- end
20
-
21
17
  def write_to(name)
22
18
  mkdir(name)
23
19
 
@@ -35,9 +31,9 @@ module ToFactory
35
31
  end
36
32
 
37
33
  def modern_header(definitions)
38
- out = "FactoryGirl.define do\n"
39
- out << definitions.join("\n")
40
- out << "\nend\n"
34
+ out = "FactoryGirl.define do\n"
35
+ out << definitions.join("\n\n")
36
+ out << "end"
41
37
  end
42
38
 
43
39
  def mkdir(name)
@@ -26,8 +26,6 @@ module ToFactory
26
26
  formatted
27
27
  end
28
28
 
29
- private
30
-
31
29
  def format(value, nested)
32
30
  case value
33
31
  when Time, DateTime
@@ -37,12 +35,30 @@ module ToFactory
37
35
  when Hash
38
36
  inspect_hash(value, nested)
39
37
  when Array
40
- value.map{|v| inspect_value(v)}
38
+ inspect_array(value, nested)
39
+ when String
40
+ validate_parseable!(value).inspect
41
41
  else
42
42
  value.inspect
43
43
  end
44
44
  end
45
45
 
46
+ private
47
+
48
+ def validate_parseable!(value)
49
+ return value if parse(value)
50
+
51
+ "ToFactory: RubyParser exception parsing this attribute after factory generation"
52
+ end
53
+
54
+ def parse(value)
55
+ @parser ||= RubyParser.new
56
+ @parser.parse(value)
57
+ true
58
+ rescue
59
+ false
60
+ end
61
+
46
62
  def inspect_time(value)
47
63
  time = in_utc(value).strftime("%Y-%m-%dT%H:%M%Z").inspect
48
64
  time.gsub(/UTC"$/, "Z\"").gsub(/GMT"$/, "Z\"")
@@ -60,6 +76,11 @@ module ToFactory
60
76
  end
61
77
  end
62
78
 
79
+ def inspect_array(value, nested)
80
+ values = value.map{|v| format(v, nested)}.join(", ")
81
+ "[#{values}]"
82
+ end
83
+
63
84
  def key_value_pair(key, value)
64
85
  formatted_key = inspect_value(key, true)
65
86
  formatted_value = inspect_value(value.fetch(key), true)
@@ -19,20 +19,12 @@ module ToFactory
19
19
 
20
20
  def header(&block)
21
21
  if ToFactory.new_syntax?
22
- modern_header &block
22
+ generic_header(" factory", "", " end", &block)
23
23
  else
24
- header_factory_girl_1 &block
24
+ generic_header("Factory.define", " |o|", "end", &block)
25
25
  end
26
26
  end
27
27
 
28
- def modern_header(&block)
29
- generic_header("factory", "", &block)
30
- end
31
-
32
- def header_factory_girl_1(&block)
33
- generic_header("Factory.define", " |o|", &block)
34
- end
35
-
36
28
  def factory_attribute(attr, value)
37
29
  Attribute.new(attr, value).to_s
38
30
  end
@@ -49,10 +41,10 @@ module ToFactory
49
41
  @representation.parent_name
50
42
  end
51
43
 
52
- def generic_header(factory_start, block_arg, &block)
53
- out = " #{factory_start}(:#{name}#{parent_clause}) do#{block_arg}\n"
44
+ def generic_header(factory_start, block_arg, ending, &block)
45
+ out = "#{factory_start}(:#{name}#{parent_clause}) do#{block_arg}\n"
54
46
  out << yield.to_s
55
- out << " end\n"
47
+ out << "#{ending}\n"
56
48
  end
57
49
 
58
50
  def parent_clause
@@ -1,3 +1,3 @@
1
1
  module ToFactory
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/to_factory.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  require "to_factory/version"
2
4
  require "to_factory/config"
3
5
  require "to_factory/generation/factory"
@@ -14,6 +16,7 @@ require "to_factory/options_parser"
14
16
 
15
17
  module ToFactory
16
18
  class MissingActiveRecordInstanceException < Exception;end
19
+ class NotFoundError < Exception;end
17
20
 
18
21
  class << self
19
22
  def new_syntax?
@@ -27,9 +30,24 @@ module ToFactory
27
30
  false
28
31
  end
29
32
 
33
+ def definition_for(item)
34
+ if item.is_a? ActiveRecord::Base
35
+ Representation.from(item).definition
36
+ else
37
+ if found = representations.find{|r| r.name.to_s == item.to_s }
38
+ found.definition
39
+ else
40
+ raise NotFoundError.new "No definition found for #{item}"
41
+ end
42
+ end
43
+ end
44
+
30
45
  def definitions
31
- results = Finders::Factory.new.call
32
- results.map(&:name)
46
+ representations.map(&:name)
47
+ end
48
+
49
+ def representations
50
+ Finders::Factory.new.call
33
51
  end
34
52
  end
35
53
  end
@@ -9,7 +9,7 @@ describe ToFactory::FileWriter do
9
9
  fs = ToFactory::FileSync.new
10
10
  representations = fs.all_representations
11
11
  #sanity check generation isn't broken
12
- expect(representations.keys).to eq [ToFactory::User]
12
+ expect(representations.keys).to eq ["to_factory/user"]
13
13
  expect(representations.values[0][0]).to be_a ToFactory::Representation
14
14
 
15
15
  fw.write representations
@@ -23,6 +23,22 @@ describe ToFactory do
23
23
 
24
24
  end
25
25
 
26
+ describe "ToFactory.definition_for" do
27
+ let(:expected_user_file) { File.read "./spec/example_factories/#{version}_syntax/user.rb"}
28
+ it do
29
+ expect(ToFactory.definition_for user).to match_sexp expected_user_file
30
+ end
31
+
32
+ it do
33
+ ToFactory(user)
34
+ expect(ToFactory.definition_for :"to_factory/user").to match_sexp expected_user_file
35
+ end
36
+
37
+ it "raises a not found error" do
38
+ expect(lambda{ToFactory.definition_for :"to_factory/user"}).to raise_error ToFactory::NotFoundError
39
+ end
40
+ end
41
+
26
42
  describe "Object#ToFactory" do
27
43
  context "with multiple levels of parent classes" do
28
44
  let(:filename) { "spec/example_factories/#{version}_syntax/#{'user_admin_super_admin'}.rb"}
@@ -43,8 +59,13 @@ describe ToFactory do
43
59
 
44
60
  it "generates all factories" do
45
61
  ToFactory()
62
+ #simple check for equivalent ruby
46
63
  expect(user_file) .to match_sexp expected_user_file
47
64
  expect(project_file).to match_sexp expected_project_file
65
+
66
+ #once we are sure output is equivalent ruby, check output is identical
67
+ expect(user_file.chomp) .to eq expected_user_file.chomp
68
+ expect(project_file.chomp).to eq expected_project_file.chomp
48
69
  end
49
70
 
50
71
  def user_file_includes(content)
data/spec/spec_helper.rb CHANGED
@@ -6,7 +6,6 @@ rescue LoadError
6
6
  end
7
7
 
8
8
  require 'active_record'
9
- require 'fileutils'
10
9
  require 'active_support/core_ext/string'
11
10
  require 'active_support/core_ext/hash'
12
11
  require "sqlite3"
@@ -33,7 +33,7 @@ describe ToFactory::Collation do
33
33
  pre_existing = [ admin, user, super_admin ]
34
34
 
35
35
  result = ToFactory::Collation.organize(new_definitions, pre_existing)
36
- result = result[ToFactory::User]
36
+ result = result["to_factory/user"]
37
37
  expect(result.map &:hierarchy_order).to eq [1,2,3,4]
38
38
  expect(result).to eq [user, admin, super_admin, root]
39
39
  end
@@ -13,8 +13,8 @@ describe ToFactory::FileWriter do
13
13
  it "adds factories for all models" do
14
14
  user_representation = double :name => :user, "definition" => "factory a"
15
15
  project_representation = double :name => "project", :definition =>"factory b"
16
- fw.write({ToFactory::User =>[user_representation],
17
- ToFactory::Project => [project_representation]
16
+ fw.write({"to_factory/user" =>[user_representation],
17
+ "to_factory/project" => [project_representation]
18
18
  })
19
19
 
20
20
  if ToFactory.new_syntax?
@@ -22,6 +22,25 @@ describe ToFactory::Generation::Attribute do
22
22
 
23
23
  expect(attribute.inspect_value(hash)).to eq expected
24
24
  end
25
+
26
+ it "handles arrays correctly" do
27
+ expected = "[1, 2, :a, \"4\"]"
28
+
29
+ input = [1, 2, :a, "4"]
30
+ expect(attribute.format(input, false)).to eq expected
31
+ end
25
32
  end
26
33
 
34
+ if RUBY_VERSION =~ /\A1\.8/
35
+ it "alters attributes that are unparseable by RubyParser" do
36
+ #when reparsing the generated files, we don't want the parser itself
37
+ #to raise an exception, rather than fix RubyParser now, a hotfix is to
38
+ #warn about these attributes and replace them with something parseable
39
+ value = File.read("./spec/support/ruby_parser_exception_causing_string.rb")
40
+ expect(lambda{RubyParser.new.parse(value)}).to raise_error StringScanner::Error
41
+ result = attribute.inspect_value(value)
42
+ expect(lambda{RubyParser.new.parse(result)}).not_to raise_error
43
+ expect(result).to match /ToFactory: RubyParser exception/
44
+ end
45
+ end
27
46
  end
metadata CHANGED
@@ -1,177 +1,137 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: to_factory
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 0
10
- version: 0.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Mark Burns
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2015-01-08 00:00:00 +01:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2015-01-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: sqlite3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.6
20
+ type: :development
23
21
  prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 23
30
- segments:
31
- - 1
32
- - 3
33
- - 6
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
34
26
  version: 1.3.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: database_cleaner
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
35
34
  type: :development
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: ruby-debug
39
35
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
43
45
  - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 3
46
- segments:
47
- - 0
48
- version: "0"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
49
48
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: database_cleaner
53
49
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 13
60
- segments:
61
- - 0
62
- - 3
63
- version: "0.3"
64
- type: :development
65
- version_requirements: *id003
66
- - !ruby/object:Gem::Dependency
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
67
56
  name: ruby2ruby
68
- prerelease: false
69
- requirement: &id004 !ruby/object:Gem::Requirement
70
- none: false
71
- requirements:
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
72
59
  - - ">="
73
- - !ruby/object:Gem::Version
74
- hash: 3
75
- segments:
76
- - 0
77
- version: "0"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
78
62
  type: :runtime
79
- version_requirements: *id004
80
- - !ruby/object:Gem::Dependency
81
- name: activerecord
82
63
  prerelease: false
83
- requirement: &id005 !ruby/object:Gem::Requirement
84
- none: false
85
- requirements:
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
86
73
  - - ">"
87
- - !ruby/object:Gem::Version
88
- hash: 3
89
- segments:
90
- - 2
91
- - 0
92
- version: "2.0"
93
- - - <
94
- - !ruby/object:Gem::Version
95
- hash: 27
96
- segments:
97
- - 4
98
- - 0
99
- version: "4.0"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
100
76
  type: :runtime
101
- version_requirements: *id005
102
- - !ruby/object:Gem::Dependency
103
- name: i18n
104
77
  prerelease: false
105
- requirement: &id006 !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - <
109
- - !ruby/object:Gem::Version
110
- hash: 5
111
- segments:
112
- - 0
113
- - 7
114
- version: "0.7"
115
- type: :runtime
116
- version_requirements: *id006
117
- - !ruby/object:Gem::Dependency
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
118
84
  name: factory_girl
119
- prerelease: false
120
- requirement: &id007 !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - <
124
- - !ruby/object:Gem::Version
125
- hash: 3
126
- segments:
127
- - 2
128
- - 0
129
- version: "2.0"
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.5'
130
90
  type: :development
131
- version_requirements: *id007
132
- - !ruby/object:Gem::Dependency
133
- name: rspec
134
91
  prerelease: false
135
- requirement: &id008 !ruby/object:Gem::Requirement
136
- none: false
137
- requirements:
138
- - - ~>
139
- - !ruby/object:Gem::Version
140
- hash: 7
141
- segments:
142
- - 3
143
- - 0
144
- version: "3.0"
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
145
104
  type: :development
146
- version_requirements: *id008
147
- - !ruby/object:Gem::Dependency
148
- name: rake
149
105
  prerelease: false
150
- requirement: &id009 !ruby/object:Gem::Requirement
151
- none: false
152
- requirements:
153
- - - ~>
154
- - !ruby/object:Gem::Version
155
- hash: 35
156
- segments:
157
- - 10
158
- - 0
159
- version: "10.0"
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '10.0'
160
118
  type: :development
161
- version_requirements: *id009
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '10.0'
162
125
  description: Autogenerate and append/create factory_girl definitions from the console
163
- email:
126
+ email:
164
127
  - markthedeveloper@gmail.com
165
128
  executables: []
166
-
167
129
  extensions: []
168
-
169
130
  extra_rdoc_files: []
170
-
171
- files:
172
- - .gitignore
173
- - .rspec
174
- - .travis.yml
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".travis.yml"
175
135
  - Gemfile
176
136
  - README.md
177
137
  - Rakefile
@@ -227,6 +187,7 @@ files:
227
187
  - spec/support/models/not_active_record.rb
228
188
  - spec/support/models/project.rb
229
189
  - spec/support/models/user.rb
190
+ - spec/support/ruby_parser_exception_causing_string.rb
230
191
  - spec/unit/collation_spec.rb
231
192
  - spec/unit/file_writer_spec.rb
232
193
  - spec/unit/finders/factory_spec.rb
@@ -237,41 +198,31 @@ files:
237
198
  - spec/unit/parsing/klass_inference_spec.rb
238
199
  - tmp/.keep
239
200
  - to_factory.gemspec
240
- has_rdoc: true
241
- homepage: ""
242
- licenses:
201
+ homepage: ''
202
+ licenses:
243
203
  - MIT
204
+ metadata: {}
244
205
  post_install_message:
245
206
  rdoc_options: []
246
-
247
- require_paths:
207
+ require_paths:
248
208
  - lib
249
- required_ruby_version: !ruby/object:Gem::Requirement
250
- none: false
251
- requirements:
209
+ required_ruby_version: !ruby/object:Gem::Requirement
210
+ requirements:
252
211
  - - ">="
253
- - !ruby/object:Gem::Version
254
- hash: 3
255
- segments:
256
- - 0
257
- version: "0"
258
- required_rubygems_version: !ruby/object:Gem::Requirement
259
- none: false
260
- requirements:
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ required_rubygems_version: !ruby/object:Gem::Requirement
215
+ requirements:
261
216
  - - ">="
262
- - !ruby/object:Gem::Version
263
- hash: 3
264
- segments:
265
- - 0
266
- version: "0"
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
267
219
  requirements: []
268
-
269
220
  rubyforge_project:
270
- rubygems_version: 1.6.2
221
+ rubygems_version: 2.4.5
271
222
  signing_key:
272
- specification_version: 3
223
+ specification_version: 4
273
224
  summary: Turn ActiveRecord instances into factories
274
- test_files:
225
+ test_files:
275
226
  - spec/db/migrate/1_create_users.rb
276
227
  - spec/db/migrate/2_create_projects.rb
277
228
  - spec/db/migrate/3_create_not_namespaced.rb
@@ -305,6 +256,7 @@ test_files:
305
256
  - spec/support/models/not_active_record.rb
306
257
  - spec/support/models/project.rb
307
258
  - spec/support/models/user.rb
259
+ - spec/support/ruby_parser_exception_causing_string.rb
308
260
  - spec/unit/collation_spec.rb
309
261
  - spec/unit/file_writer_spec.rb
310
262
  - spec/unit/finders/factory_spec.rb