factory_trace 0.3.3 → 0.4.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 +4 -4
- data/lib/factory_trace.rb +15 -0
- data/lib/factory_trace/configuration.rb +6 -1
- data/lib/factory_trace/helpers/caller.rb +13 -0
- data/lib/factory_trace/helpers/converter.rb +4 -2
- data/lib/factory_trace/monkey_patches/definition_proxy.rb +13 -0
- data/lib/factory_trace/monkey_patches/dsl.rb +25 -0
- data/lib/factory_trace/monkey_patches/factory.rb +12 -0
- data/lib/factory_trace/monkey_patches/trait.rb +12 -0
- data/lib/factory_trace/processors/find_unused.rb +12 -3
- data/lib/factory_trace/readers/trace_reader.rb +3 -2
- data/lib/factory_trace/structures/factory.rb +8 -4
- data/lib/factory_trace/structures/trait.rb +7 -4
- data/lib/factory_trace/version.rb +1 -1
- data/lib/factory_trace/writers/report_writer.rb +10 -3
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a8964b9b2f6e4000d28ab545d781474d9c18668dbdb96a34de0c03b4282237f
|
4
|
+
data.tar.gz: 72a2d76a083cf9266e5296b3c538d7f9f49102acdd1328cd385fc1f9e8e3e6a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6096b82a57a43ab7ae87ef886f98ccda54dc0babb5e7a211d15a81464086e1fe479226af114fa745e5a47ce209df2fdcf0e81136f2058959e428147b98de248a
|
7
|
+
data.tar.gz: b683fd747531cbc50851834f2bbf0aa4a2f17c03e8eadbd7bc5ac2571312abd9046d2d4a46bd8499d0640e9f5e43e46e952583794a3a454ccc3c286029f42f6e
|
data/lib/factory_trace.rb
CHANGED
@@ -7,6 +7,7 @@ require 'factory_trace/configuration'
|
|
7
7
|
require 'factory_trace/version'
|
8
8
|
require 'factory_trace/helpers/converter'
|
9
9
|
require 'factory_trace/helpers/statusable'
|
10
|
+
require 'factory_trace/helpers/caller'
|
10
11
|
require 'factory_trace/tracker'
|
11
12
|
|
12
13
|
require 'factory_trace/structures/factory'
|
@@ -22,6 +23,12 @@ require 'factory_trace/readers/trace_reader'
|
|
22
23
|
require 'factory_trace/writers/writer'
|
23
24
|
require 'factory_trace/writers/report_writer'
|
24
25
|
require 'factory_trace/writers/trace_writer'
|
26
|
+
|
27
|
+
require 'factory_trace/monkey_patches/factory'
|
28
|
+
require 'factory_trace/monkey_patches/trait'
|
29
|
+
require 'factory_trace/monkey_patches/definition_proxy'
|
30
|
+
require 'factory_trace/monkey_patches/dsl'
|
31
|
+
|
25
32
|
# Integrations
|
26
33
|
require 'integrations/rspec' if defined?(RSpec::Core)
|
27
34
|
|
@@ -29,6 +36,7 @@ module FactoryTrace
|
|
29
36
|
class << self
|
30
37
|
def start
|
31
38
|
return unless configuration.enabled
|
39
|
+
trace_definitions! if configuration.trace_definition?
|
32
40
|
|
33
41
|
tracker.track!
|
34
42
|
end
|
@@ -67,5 +75,12 @@ module FactoryTrace
|
|
67
75
|
def tracker
|
68
76
|
@tracker ||= Tracker.new
|
69
77
|
end
|
78
|
+
|
79
|
+
def trace_definitions!
|
80
|
+
FactoryBot::Factory.prepend(FactoryTrace::MonkeyPatches::Factory)
|
81
|
+
FactoryBot::Trait.prepend(FactoryTrace::MonkeyPatches::Trait)
|
82
|
+
FactoryBot::Syntax::Default::DSL.prepend(FactoryTrace::MonkeyPatches::Default::DSL)
|
83
|
+
FactoryBot::DefinitionProxy.prepend(FactoryTrace::MonkeyPatches::DefinitionProxy)
|
84
|
+
end
|
70
85
|
end
|
71
86
|
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
module FactoryTrace
|
2
2
|
class Configuration
|
3
|
-
attr_accessor :path, :enabled, :color, :mode
|
3
|
+
attr_accessor :path, :enabled, :color, :mode, :trace_definition
|
4
4
|
|
5
5
|
def initialize
|
6
6
|
@enabled = ENV.key?('FB_TRACE') || ENV.key?('FB_TRACE_FILE')
|
7
7
|
@path = ENV['FB_TRACE_FILE']
|
8
8
|
@color = path.nil?
|
9
9
|
@mode = extract_mode(ENV['FB_TRACE']) || :full
|
10
|
+
@trace_definition = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def trace_definition?
|
14
|
+
@trace_definition
|
10
15
|
end
|
11
16
|
|
12
17
|
def out
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FactoryTrace
|
2
|
+
module Helpers
|
3
|
+
module Caller
|
4
|
+
module_function
|
5
|
+
|
6
|
+
# @return [String] file and line where the original method was called
|
7
|
+
def location
|
8
|
+
location = caller_locations[1]
|
9
|
+
"#{location.absolute_path}:#{location.lineno}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -9,7 +9,8 @@ module FactoryTrace
|
|
9
9
|
def trait(trait)
|
10
10
|
FactoryTrace::Structures::Trait.new(
|
11
11
|
trait.name.to_s,
|
12
|
-
declaration_names: extract_declarations(trait)
|
12
|
+
declaration_names: extract_declarations(trait),
|
13
|
+
definition_path: (trait.definition_path if trait.respond_to?(:definition_path))
|
13
14
|
)
|
14
15
|
end
|
15
16
|
|
@@ -21,7 +22,8 @@ module FactoryTrace
|
|
21
22
|
factory.names.map(&:to_s),
|
22
23
|
factory.defined_traits.map(&method(:trait)),
|
23
24
|
parent_name: factory.send(:parent).respond_to?(:name) ? factory.send(:parent).name.to_s : nil,
|
24
|
-
declaration_names: extract_declarations(factory)
|
25
|
+
declaration_names: extract_declarations(factory),
|
26
|
+
definition_path: (factory.definition_path if factory.respond_to?(:definition_path))
|
25
27
|
)
|
26
28
|
end
|
27
29
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FactoryTrace
|
2
|
+
module MonkeyPatches
|
3
|
+
module DefinitionProxy
|
4
|
+
def factory(name, options = {}, &block)
|
5
|
+
@child_factories << [name, Helpers::Caller.location, options, block]
|
6
|
+
end
|
7
|
+
|
8
|
+
def trait(name, &block)
|
9
|
+
@definition.define_trait(FactoryBot::Trait.new(name, Helpers::Caller.location, &block))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module FactoryTrace
|
2
|
+
module MonkeyPatches
|
3
|
+
module Default
|
4
|
+
module DSL
|
5
|
+
def factory(name, options = {}, &block)
|
6
|
+
caller_location = options.delete(:caller_location) || Helpers::Caller.location
|
7
|
+
factory = FactoryBot::Factory.new(name, caller_location, options)
|
8
|
+
proxy = FactoryBot::DefinitionProxy.new(factory.definition)
|
9
|
+
proxy.instance_eval(&block) if block_given?
|
10
|
+
|
11
|
+
FactoryBot.register_factory(factory)
|
12
|
+
|
13
|
+
proxy.child_factories.each do |(child_name, child_caller_location, child_options, child_block)|
|
14
|
+
parent_factory = child_options.delete(:parent) || name
|
15
|
+
factory(child_name, child_options.merge(parent: parent_factory, caller_location: child_caller_location), &child_block)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def trait(name, &block)
|
20
|
+
FactoryBot.register_trait(FactoryBot::Trait.new(name, Helpers::Caller.location, &block))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -13,15 +13,15 @@ module FactoryTrace
|
|
13
13
|
output = []
|
14
14
|
|
15
15
|
defined.factories.each do |factory|
|
16
|
-
output << {code: :unused, factory_names: factory.names} unless factory.status
|
16
|
+
output << append_definition_path({code: :unused, factory_names: factory.names}, factory) unless factory.status
|
17
17
|
|
18
18
|
factory.traits.each do |trait|
|
19
|
-
output << {code: :unused, factory_names: factory.names, trait_name: trait.name} unless trait.status
|
19
|
+
output << append_definition_path({code: :unused, factory_names: factory.names, trait_name: trait.name}, trait) unless trait.status
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
defined.traits.each do |trait|
|
24
|
-
output << {code: :unused, trait_name: trait.name} unless trait.status
|
24
|
+
output << append_definition_path({code: :unused, trait_name: trait.name}, trait) unless trait.status
|
25
25
|
end
|
26
26
|
|
27
27
|
output.unshift(code: :unused, value: output.size)
|
@@ -104,6 +104,15 @@ module FactoryTrace
|
|
104
104
|
mark_trait(declaration_trait, declaration_factory, collection, status: status) if declaration_trait
|
105
105
|
end
|
106
106
|
end
|
107
|
+
|
108
|
+
# @param [Hash]
|
109
|
+
# @param [FactoryTrace::Structures::Factory|FactoryTrace::Structures::Trait]
|
110
|
+
#
|
111
|
+
# @return [Hash]
|
112
|
+
def self.append_definition_path(hash, object)
|
113
|
+
hash[:definition_path] = object.definition_path if object.definition_path
|
114
|
+
hash
|
115
|
+
end
|
107
116
|
end
|
108
117
|
end
|
109
118
|
end
|
@@ -42,7 +42,7 @@ module FactoryTrace
|
|
42
42
|
private
|
43
43
|
|
44
44
|
def parse_trait(hash)
|
45
|
-
FactoryTrace::Structures::Trait.new(hash['name'], declaration_names: hash['declaration_names'])
|
45
|
+
FactoryTrace::Structures::Trait.new(hash['name'], declaration_names: hash['declaration_names'], definition_path: hash['definition_path'])
|
46
46
|
end
|
47
47
|
|
48
48
|
def parse_factory(hash)
|
@@ -50,7 +50,8 @@ module FactoryTrace
|
|
50
50
|
hash['names'],
|
51
51
|
hash['traits'].map(&method(:parse_trait)),
|
52
52
|
parent_name: hash['parent_name'],
|
53
|
-
declaration_names: hash['declaration_names']
|
53
|
+
declaration_names: hash['declaration_names'],
|
54
|
+
definition_path: hash['definition_path']
|
54
55
|
)
|
55
56
|
end
|
56
57
|
|
@@ -3,17 +3,19 @@ module FactoryTrace
|
|
3
3
|
class Factory
|
4
4
|
include Helpers::Statusable
|
5
5
|
|
6
|
-
attr_reader :names, :parent_name, :traits, :declaration_names
|
6
|
+
attr_reader :names, :parent_name, :traits, :declaration_names, :definition_path
|
7
7
|
|
8
8
|
# @param [Array<String>] names
|
9
9
|
# @param [Array<FactoryTrace::Structure::Trait>] traits
|
10
10
|
# @param [String|nil] parent_name
|
11
11
|
# @param [Array<String>] declaration_names
|
12
|
-
|
12
|
+
# @param [String] definition_path
|
13
|
+
def initialize(names, traits, parent_name: nil, declaration_names: [], definition_path: nil)
|
13
14
|
@names = names
|
14
15
|
@traits = traits
|
15
16
|
@parent_name = parent_name
|
16
17
|
@declaration_names = declaration_names
|
18
|
+
@definition_path = definition_path
|
17
19
|
end
|
18
20
|
|
19
21
|
# @return [Hash<Symbol, Object>]
|
@@ -22,7 +24,8 @@ module FactoryTrace
|
|
22
24
|
names: names,
|
23
25
|
traits: traits.map(&:to_h),
|
24
26
|
parent_name: parent_name,
|
25
|
-
declaration_names: declaration_names
|
27
|
+
declaration_names: declaration_names,
|
28
|
+
definition_path: definition_path
|
26
29
|
}
|
27
30
|
end
|
28
31
|
|
@@ -42,7 +45,8 @@ module FactoryTrace
|
|
42
45
|
names == factory.names &&
|
43
46
|
traits == factory.traits &&
|
44
47
|
parent_name == factory.parent_name &&
|
45
|
-
declaration_names == factory.declaration_names
|
48
|
+
declaration_names == factory.declaration_names &&
|
49
|
+
definition_path == factory.definition_path
|
46
50
|
end
|
47
51
|
end
|
48
52
|
end
|
@@ -3,20 +3,23 @@ module FactoryTrace
|
|
3
3
|
class Trait
|
4
4
|
include Helpers::Statusable
|
5
5
|
|
6
|
-
attr_reader :name, :declaration_names
|
6
|
+
attr_reader :name, :declaration_names, :definition_path
|
7
7
|
|
8
8
|
# @param [String] name
|
9
9
|
# @param [Array<String>] declaration_names
|
10
|
-
|
10
|
+
# @param [String] definition_path
|
11
|
+
def initialize(name, declaration_names: [], definition_path: nil)
|
11
12
|
@name = name
|
12
13
|
@declaration_names = declaration_names
|
14
|
+
@definition_path = definition_path
|
13
15
|
end
|
14
16
|
|
15
17
|
# @return [Hash<Symbol, Object>]
|
16
18
|
def to_h
|
17
19
|
{
|
18
20
|
name: name,
|
19
|
-
declaration_names: declaration_names
|
21
|
+
declaration_names: declaration_names,
|
22
|
+
definition_path: definition_path
|
20
23
|
}
|
21
24
|
end
|
22
25
|
|
@@ -24,7 +27,7 @@ module FactoryTrace
|
|
24
27
|
def ==(trait)
|
25
28
|
return false unless trait.is_a?(FactoryTrace::Structures::Trait)
|
26
29
|
|
27
|
-
name == trait.name && declaration_names == trait.declaration_names
|
30
|
+
name == trait.name && declaration_names == trait.declaration_names && definition_path == trait.definition_path
|
28
31
|
end
|
29
32
|
end
|
30
33
|
end
|
@@ -31,11 +31,11 @@ module FactoryTrace
|
|
31
31
|
when result[:value]
|
32
32
|
colorize(total_color, "total number of unique #{humanize_code(result[:code])} factories & traits: #{result[:value]}")
|
33
33
|
when result[:factory_names] && result[:trait_name]
|
34
|
-
"#{humanize_code(result[:code])} trait #{colorize(:blue, result[:trait_name])} of factory #{list(result[:factory_names])}"
|
34
|
+
append_definition_path(result) { "#{humanize_code(result[:code])} trait #{colorize(:blue, result[:trait_name])} of factory #{list(result[:factory_names])}" }
|
35
35
|
when result[:factory_names]
|
36
|
-
"#{humanize_code(result[:code])} factory #{list(result[:factory_names])}"
|
36
|
+
append_definition_path(result) { "#{humanize_code(result[:code])} factory #{list(result[:factory_names])}" }
|
37
37
|
else
|
38
|
-
"#{humanize_code(result[:code])} global trait #{colorize(:blue, result[:trait_name])}"
|
38
|
+
append_definition_path(result) { "#{humanize_code(result[:code])} global trait #{colorize(:blue, result[:trait_name])}" }
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -45,6 +45,13 @@ module FactoryTrace
|
|
45
45
|
"#{COLORS[color]}#{msg}\e[0m"
|
46
46
|
end
|
47
47
|
|
48
|
+
def append_definition_path(result)
|
49
|
+
msg = yield
|
50
|
+
return msg unless configuration.trace_definition? && result[:definition_path]
|
51
|
+
|
52
|
+
"#{msg} => #{result[:definition_path]}"
|
53
|
+
end
|
54
|
+
|
48
55
|
def humanize_code(code)
|
49
56
|
CODES[code]
|
50
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factory_trace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- djezzzl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: factory_bot
|
@@ -77,8 +77,13 @@ files:
|
|
77
77
|
- exe/factory_trace
|
78
78
|
- lib/factory_trace.rb
|
79
79
|
- lib/factory_trace/configuration.rb
|
80
|
+
- lib/factory_trace/helpers/caller.rb
|
80
81
|
- lib/factory_trace/helpers/converter.rb
|
81
82
|
- lib/factory_trace/helpers/statusable.rb
|
83
|
+
- lib/factory_trace/monkey_patches/definition_proxy.rb
|
84
|
+
- lib/factory_trace/monkey_patches/dsl.rb
|
85
|
+
- lib/factory_trace/monkey_patches/factory.rb
|
86
|
+
- lib/factory_trace/monkey_patches/trait.rb
|
82
87
|
- lib/factory_trace/preprocessors/extract_defined.rb
|
83
88
|
- lib/factory_trace/preprocessors/extract_used.rb
|
84
89
|
- lib/factory_trace/processors/find_unused.rb
|