factory_trace 0.2.1 → 0.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f8910590a0b5aab2a00f31e0aa41cc244161e8c387b47341b0f6c2a96d7e40c8
4
- data.tar.gz: e6902745419605702ccc35def7d110b7c18b23b1407af3560b2d2e3f75a43e96
3
+ metadata.gz: 484192f056c62919a10db1bcabe6d3f769fc7be2973e1278e9eff0874c5a0d96
4
+ data.tar.gz: 1b339e7c7b1d0a0fa8828631fff9a33926347cdafc22446061aa57b7483c2686
5
5
  SHA512:
6
- metadata.gz: 15b006db74f1f06d6b8f5a16dff18158a407ed292e2a90b1859c7c6bd6fc503d1016e14516e2fa2e1081a4d6dd873fff0096e4fd2d98ab39c794e63c986a7bb5
7
- data.tar.gz: 69a82579dc197d590f1578e04fcbd818e48c2bf5750d01f86ffb62e77d1fcb6341792dcae76ae0c50bfb8acb48d562fdac1f0caa9b1e6d6a292fc5853d9aae1b
6
+ metadata.gz: 866ba5578d028ca9eb9c623ea38c03ac5df59383831d3d0b11ee765e9f181e69260e49621fea2d353836361f8b6836b6b092fe73f7be948757e0782a6b5f0e05
7
+ data.tar.gz: dd8cf671469977ab78a6821398a27e39c999b981eb6938bf016ab41be56684d16f259cce7663c154f6f9fd1c1b1d94f62288177e6a3e6e31a841affeb8c3f3b9
data/lib/factory_trace.rb CHANGED
@@ -4,7 +4,10 @@ require 'factory_bot'
4
4
  require 'factory_trace/configuration'
5
5
  require 'factory_trace/version'
6
6
  require 'factory_trace/tracker'
7
+
7
8
  require 'factory_trace/find_unused'
9
+ require 'factory_trace/storage_handler'
10
+
8
11
  require 'factory_trace/readers/trace_reader'
9
12
  require 'factory_trace/writers/writer'
10
13
  require 'factory_trace/writers/report_writer'
@@ -23,6 +26,9 @@ module FactoryTrace
23
26
  def stop
24
27
  return unless configuration.enabled
25
28
 
29
+ # This is required to exclude parent traits from +defined_traits+
30
+ FactoryBot.reload
31
+
26
32
  writer.write(results)
27
33
  end
28
34
 
@@ -38,12 +44,16 @@ module FactoryTrace
38
44
 
39
45
  def results
40
46
  if configuration.mode?(:full)
41
- FindUnused.call(tracker.storage)
47
+ FindUnused.call(preprocessed)
42
48
  elsif configuration.mode?(:trace_only)
43
- tracker.storage
49
+ preprocessed
44
50
  end
45
51
  end
46
52
 
53
+ def preprocessed
54
+ @preprocessed ||= StorageHandler.prepare(tracker.storage)
55
+ end
56
+
47
57
  def tracker
48
58
  @tracker ||= Tracker.new
49
59
  end
@@ -1,76 +1,36 @@
1
1
  module FactoryTrace
2
2
  class FindUnused
3
- # @param [Hash<Symbol, Set<Symbol>>] initial_data
3
+ # @param [Array<Hash>] initial_data
4
4
  # @return [Array<Hash>]
5
5
  def self.call(initial_data)
6
- # This is required to exclude parent traits from +defined_traits+
7
- FactoryBot.reload
8
-
9
- data = prepare(initial_data)
6
+ all, used = initial_data
10
7
 
11
8
  output = []
12
9
 
13
- FactoryBot.factories.each do |factory|
14
- unless data[factory.name.to_s]
15
- output << {code: :unused, factory: factory}
10
+ all.each do |factory_name, trait_names|
11
+ unless used.key?(factory_name)
12
+ output << {code: :unused, factory_name: factory_name}
16
13
  next
17
14
  end
18
15
 
19
- factory.defined_traits.each do |trait|
20
- output << {code: :unused, factory: factory, trait: trait} unless data[factory.name.to_s].include?(trait.name.to_s)
21
- end
22
- end
23
-
24
- FactoryBot.traits.each do |trait|
25
- output << {code: :unused, trait: trait} unless data['_traits'].include?(trait.name.to_s)
26
- end
27
-
28
- output.unshift(code: :unused, value: output.size)
29
- output.unshift(code: :used, value: data['_total_used'])
30
- end
31
-
32
- private
33
-
34
- # Return new structure where each trait is moved to its own factory
35
- #
36
- # @param [Hash<Symbol, Set<Symbol>>]
37
- # @return [Hash<String, Set<String>>]
38
- def self.prepare(data)
39
- # +_traits+ is for global traits
40
- output = {'_traits' => Set.new, '_total_used' => count_total(data)}
41
-
42
- data.each do |factory_name, trait_names|
43
- factory_name = factory_name.to_s
44
-
45
- output[factory_name] ||= Set.new
46
-
47
16
  trait_names.each do |trait_name|
48
- trait_name = trait_name.to_s
49
-
50
- factory = FactoryBot.factories[factory_name]
51
- trait_found = false
52
-
53
- until factory.is_a?(FactoryBot::NullFactory)
54
- if factory.defined_traits.any? { |trait| trait.name.to_s == trait_name }
55
- trait_found = true
56
- output[factory.name.to_s] ||= Set.new
57
- output[factory.name.to_s] << trait_name
58
- break
59
- end
60
- factory = factory.send(:parent)
17
+ unless used[factory_name].include?(trait_name)
18
+ output << {code: :unused, trait_name: trait_name}.tap { |h| h[:factory_name] = factory_name unless factory_name == '_traits' }
61
19
  end
62
-
63
- # Belongs to global traits
64
- output['_traits'] << trait_name unless trait_found
65
20
  end
66
21
  end
67
22
 
23
+ output.unshift(code: :unused, value: output.size)
24
+ output.unshift(code: :used, value: count_total(used))
25
+
68
26
  output
69
27
  end
70
28
 
29
+ private
30
+
71
31
  # @param [Hash<Symbol, Set<Symbol>>]
72
32
  def self.count_total(data)
73
- data.reduce(0) { |result, (_factory, traits)| result + 1 + traits.size }
33
+ data.reduce(0) { |result, (factory_name, trait_names)| result + (factory_name != '_traits' ? 1 : 0) + trait_names.size }
74
34
  end
75
35
  end
76
36
  end
@@ -2,10 +2,18 @@ require 'set'
2
2
 
3
3
  module FactoryTrace
4
4
  class TraceReader
5
+ # Read the data from files and merge it
6
+ # First hash - all factories
7
+ # Second hash - used factories
8
+ #
9
+ # @return [Array<Hash>]
5
10
  def self.read_from_files(*file_names, config: Configuration.new)
6
- file_names.reduce({}) do |hash, file_name|
11
+ file_names.reduce([{}, {}]) do |array, file_name|
7
12
  reader = new(File.open(file_name, 'r'), config: config)
8
- hash.merge(reader.read) { |_key, v1, v2| v1 | v2 }
13
+ new = reader.read
14
+ array.each_with_index.map do |hash, index|
15
+ hash.merge(new[index]) { |_key, v1, v2| v1 | v2 }
16
+ end
9
17
  end
10
18
  end
11
19
 
@@ -14,19 +22,27 @@ module FactoryTrace
14
22
  @config = config
15
23
  end
16
24
 
25
+ # Read the data from file
26
+ # First hash - all factories
27
+ # Second hash - used factories
28
+ #
29
+ # @return [Array<Hash>]
17
30
  def read
18
- @data ||= {}
31
+ data = [{}, {}]
32
+ point = -1
19
33
 
20
34
  io.each_line do |line|
21
- factory, *traits = line.strip.split(',').map(&:to_sym)
35
+ next point += 1 if line.match?(/-all-|-used-/)
36
+
37
+ factory, *traits = line.strip.split(',')
22
38
 
23
39
  if factory
24
- @data[factory] ||= Set.new
25
- @data[factory] |= traits
40
+ data[point][factory] ||= Set.new
41
+ data[point][factory] |= traits
26
42
  end
27
43
  end
28
44
 
29
- @data
45
+ data
30
46
  end
31
47
 
32
48
  private
@@ -0,0 +1,61 @@
1
+ require 'set'
2
+
3
+ module FactoryTrace
4
+ class StorageHandler
5
+ # @param [Hash<Symbol, Set<Symbol>>] initial_data
6
+ #
7
+ # First hash - all factories
8
+ # Second hash - used factories
9
+ #
10
+ # @return [Array<Hash>]
11
+ def self.prepare(initial_data)
12
+ [collect_all, convert(initial_data)]
13
+ end
14
+
15
+ private
16
+
17
+ def self.collect_all
18
+ FactoryBot.factories.reduce({'_traits' => Set.new(FactoryBot.traits.map(&:name).map(&:to_s))}) do |hash, factory|
19
+ hash[factory.name.to_s] = Set.new(factory.defined_traits.map(&:name).map(&:to_s))
20
+ hash
21
+ end
22
+ end
23
+
24
+ # Return new structure where each trait is moved to its own factory
25
+ #
26
+ # @param [Hash<Symbol, Set<Symbol>>]
27
+ # @return [Hash<String, Set<String>>]
28
+ def self.convert(data)
29
+ # +_traits+ is for global traits
30
+ output = {'_traits' => Set.new}
31
+
32
+ data.each do |factory_name, trait_names|
33
+ factory_name = factory_name.to_s
34
+
35
+ output[factory_name] ||= Set.new
36
+
37
+ trait_names.each do |trait_name|
38
+ trait_name = trait_name.to_s
39
+
40
+ factory = FactoryBot.factories[factory_name]
41
+ trait_found = false
42
+
43
+ until factory.is_a?(FactoryBot::NullFactory)
44
+ if factory.defined_traits.any? { |trait| trait.name.to_s == trait_name }
45
+ trait_found = true
46
+ output[factory.name.to_s] ||= Set.new
47
+ output[factory.name.to_s] << trait_name
48
+ break
49
+ end
50
+ factory = factory.send(:parent)
51
+ end
52
+
53
+ # Belongs to global traits
54
+ output['_traits'] << trait_name unless trait_found
55
+ end
56
+ end
57
+
58
+ output
59
+ end
60
+ end
61
+ end
@@ -1,3 +1,3 @@
1
1
  module FactoryTrace
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
@@ -23,12 +23,12 @@ module FactoryTrace
23
23
  case
24
24
  when result[:value]
25
25
  colorize(total_color, "total number of unique #{result[:code]} factories & traits: #{result[:value]}")
26
- when result[:factory] && result[:trait]
27
- "#{result[:code]} trait #{colorize(:blue, result[:trait].name)} of factory #{colorize(:blue, result[:factory].name)}"
28
- when result[:factory]
29
- "#{result[:code]} factory #{colorize(:blue, result[:factory].name)}"
26
+ when result[:factory_name] && result[:trait_name]
27
+ "#{result[:code]} trait #{colorize(:blue, result[:trait_name])} of factory #{colorize(:blue, result[:factory_name])}"
28
+ when result[:factory_name]
29
+ "#{result[:code]} factory #{colorize(:blue, result[:factory_name])}"
30
30
  else
31
- "#{result[:code]} global trait #{colorize(:blue, result[:trait].name)}"
31
+ "#{result[:code]} global trait #{colorize(:blue, result[:trait_name])}"
32
32
  end
33
33
  end
34
34
 
@@ -1,8 +1,18 @@
1
1
  module FactoryTrace
2
2
  class TraceWriter < Writer
3
- # @param [Hash<Symbol, Set<Hash>>] results
3
+ # @param [Array<Hash>] results
4
4
  def write(results)
5
- results.each do |key, set|
5
+ io.puts('-all-')
6
+ output(results[0])
7
+ io.puts('-used-')
8
+ output(results[1])
9
+ end
10
+
11
+ private
12
+
13
+ # @param [Hash<Symbol, Set<Hash>>] data
14
+ def output(data)
15
+ data.each do |key, set|
6
16
  line = [key, set.to_a.join(',')].join(',')
7
17
  io.puts(line)
8
18
  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.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - djezzzl
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-30 00:00:00.000000000 Z
11
+ date: 2019-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: factory_bot
@@ -79,6 +79,7 @@ files:
79
79
  - lib/factory_trace/configuration.rb
80
80
  - lib/factory_trace/find_unused.rb
81
81
  - lib/factory_trace/readers/trace_reader.rb
82
+ - lib/factory_trace/storage_handler.rb
82
83
  - lib/factory_trace/tracker.rb
83
84
  - lib/factory_trace/version.rb
84
85
  - lib/factory_trace/writers/report_writer.rb