factory_trace 0.1.0
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 +7 -0
- data/lib/factory_trace/check_unused.rb +75 -0
- data/lib/factory_trace/configuration.rb +16 -0
- data/lib/factory_trace/printer.rb +32 -0
- data/lib/factory_trace/tracker.rb +21 -0
- data/lib/factory_trace/version.rb +3 -0
- data/lib/factory_trace.rb +46 -0
- data/lib/integrations/rspec.rb +6 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 47eb79312468fdf6bb3625c9046f6372d44cf56b84b052d1018d049b4f2d25fb
|
4
|
+
data.tar.gz: 763c2b6a5b1af979b2a7ef3f64e5ed7beb2ce74a88e8f40826d5939b9fe338ae
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8376bf6ccb33ff20681d990ed2710cb7e821524d9748ac8ae9222a58215abdc735b35aa5f55f851e669bd8e44c2c3f81795a646783e8b81c63c90c168ab4c7d4
|
7
|
+
data.tar.gz: b1262635dc1965e4107987f0bf686ae6bc94ac468d60906af41c93bf8f988cccccc7331c08a0723f793c5c463f2538764edbc832f1ab2649c5bc930ab390fb5f
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module FactoryTrace
|
2
|
+
class CheckUnused
|
3
|
+
|
4
|
+
# @param [Hash<Symbol, Set<Symbol>>]
|
5
|
+
def initialize(data)
|
6
|
+
@initial_data = data
|
7
|
+
end
|
8
|
+
|
9
|
+
# @return [Array<Hash>]
|
10
|
+
def check!
|
11
|
+
data = prepare(initial_data)
|
12
|
+
|
13
|
+
output = []
|
14
|
+
|
15
|
+
FactoryBot.factories.each do |factory|
|
16
|
+
unless data[factory.name.to_s]
|
17
|
+
output << {code: :unused, factory: factory}
|
18
|
+
next
|
19
|
+
end
|
20
|
+
|
21
|
+
factory.defined_traits.each do |trait|
|
22
|
+
output << {code: :unused, factory: factory, trait: trait} unless data[factory.name.to_s].include?(trait.name.to_s)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
FactoryBot.traits.each do |trait|
|
27
|
+
output << {code: :unused, trait: trait} unless data['_traits'].include?(trait.name.to_s)
|
28
|
+
end
|
29
|
+
|
30
|
+
output
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Return new structure where each trait is moved to its own factory
|
36
|
+
#
|
37
|
+
# @param [Hash<Symbol, Set<Symbol>>]
|
38
|
+
#
|
39
|
+
# @return [Hash<String, Set<String>>]
|
40
|
+
def prepare(data)
|
41
|
+
# +_traits+ is for global traits
|
42
|
+
output = {'_traits' => Set.new}
|
43
|
+
|
44
|
+
data.each do |factory_name, trait_names|
|
45
|
+
factory_name = factory_name.to_s
|
46
|
+
|
47
|
+
output[factory_name] ||= Set.new
|
48
|
+
|
49
|
+
trait_names.each do |trait_name|
|
50
|
+
trait_name = trait_name.to_s
|
51
|
+
|
52
|
+
factory = FactoryBot.factories[factory_name]
|
53
|
+
trait_found = false
|
54
|
+
|
55
|
+
until factory.is_a?(FactoryBot::NullFactory)
|
56
|
+
if factory.defined_traits.any? { |trait| trait.name.to_s == trait_name }
|
57
|
+
trait_found = true
|
58
|
+
output[factory.name.to_s] ||= Set.new
|
59
|
+
output[factory.name.to_s] << trait_name
|
60
|
+
break
|
61
|
+
end
|
62
|
+
factory = factory.send(:parent)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Belongs to global traits
|
66
|
+
output['_traits'] << trait_name unless trait_found
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
output
|
71
|
+
end
|
72
|
+
|
73
|
+
attr_reader :initial_data
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FactoryTrace
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :path, :enabled
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@enabled = ENV.key?('FB_TRACE') || ENV.key?('FB_TRACE_FILE')
|
7
|
+
@path = ENV['FB_TRACE_FILE']
|
8
|
+
end
|
9
|
+
|
10
|
+
def out
|
11
|
+
return STDOUT unless path
|
12
|
+
|
13
|
+
File.open(path, 'w')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module FactoryTrace
|
2
|
+
class Printer
|
3
|
+
def initialize(io)
|
4
|
+
@io = io
|
5
|
+
end
|
6
|
+
|
7
|
+
# @param [Array<Hash>] results
|
8
|
+
def print(results)
|
9
|
+
results.each do |result|
|
10
|
+
io.puts(convert(result))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# @param [Hash<Symbol, Object>] result
|
17
|
+
def convert(result)
|
18
|
+
suffix =
|
19
|
+
case
|
20
|
+
when result[:factory] && result[:trait]
|
21
|
+
"trait '#{result[:trait].name}' of factory '#{result[:factory].name}'"
|
22
|
+
when result[:factory]
|
23
|
+
"factory '#{result[:factory].name}'"
|
24
|
+
else
|
25
|
+
"global trait '#{result[:trait].name}'"
|
26
|
+
end
|
27
|
+
"#{result[:code]} #{suffix}"
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :io
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module FactoryTrace
|
4
|
+
class Tracker
|
5
|
+
attr_reader :storage
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@storage = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def track!
|
12
|
+
ActiveSupport::Notifications.subscribe('factory_bot.run_factory') do |_name, _start, _finish, _id, payload|
|
13
|
+
name = payload[:name]
|
14
|
+
traits = payload[:traits]
|
15
|
+
|
16
|
+
storage[name] ||= Set.new
|
17
|
+
storage[name] |= traits
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# External dependencies
|
2
|
+
require 'factory_bot'
|
3
|
+
# Library
|
4
|
+
require 'factory_trace/configuration'
|
5
|
+
require 'factory_trace/version'
|
6
|
+
require 'factory_trace/tracker'
|
7
|
+
require 'factory_trace/check_unused'
|
8
|
+
require 'factory_trace/printer'
|
9
|
+
# Integrations
|
10
|
+
require 'integrations/rspec'
|
11
|
+
|
12
|
+
module FactoryTrace
|
13
|
+
class << self
|
14
|
+
def start
|
15
|
+
return unless configuration.enabled
|
16
|
+
|
17
|
+
tracker.track!
|
18
|
+
end
|
19
|
+
|
20
|
+
def stop
|
21
|
+
return unless configuration.enabled
|
22
|
+
|
23
|
+
result = CheckUnused.new(tracker.storage).check!
|
24
|
+
|
25
|
+
printer.print(result)
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure
|
29
|
+
yield(configuration)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def tracker
|
35
|
+
@tracker ||= Tracker.new
|
36
|
+
end
|
37
|
+
|
38
|
+
def printer
|
39
|
+
@printer ||= Printer.new(configuration.out)
|
40
|
+
end
|
41
|
+
|
42
|
+
def configuration
|
43
|
+
@configuration ||= Configuration.new
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: factory_trace
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- djezzzl
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-04-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: factory_bot
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- lawliet.djez@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/factory_trace.rb
|
77
|
+
- lib/factory_trace/check_unused.rb
|
78
|
+
- lib/factory_trace/configuration.rb
|
79
|
+
- lib/factory_trace/printer.rb
|
80
|
+
- lib/factory_trace/tracker.rb
|
81
|
+
- lib/factory_trace/version.rb
|
82
|
+
- lib/integrations/rspec.rb
|
83
|
+
homepage: https://github.com/djezzzl/factory_trace
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.7.9
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Provide an easy way to maintain factories and traits from FactoryBot
|
107
|
+
test_files: []
|