kennel 2.15.0 → 2.16.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5e56bdcd6a89e07d259e9babdb5a25dd1d2e6b28fad74b4eccaa35348a4ade5
4
- data.tar.gz: b1ace19a2a6b768a73c941d70d930ba8d4b07111618af83547f58c38133f080b
3
+ metadata.gz: 3f5c11c126af9e586c2e7f48564760b8625248626204bdd76359001d78cd2038
4
+ data.tar.gz: 7ec6271b5eb235c8ee4b0bbaf3b9d59dc3b3f8796c5cf8288f6d753094e99a3c
5
5
  SHA512:
6
- metadata.gz: b311d407973c9773e4070d98870f02292cbc165dd94d91adb1f9b12df1998defd13ea38d1d490941b6297ed5d0a52fbc3825619184b576cb242771678b805f0e
7
- data.tar.gz: 77ae75c61c8a38892e91b341a8d98fc1ee6115a8040d42ddf2618c0e7ba90fac596a24dc2b5dcc5c535fb5510b8d92b6a08f90c95a0e9fc62b6407da50dbc4de
6
+ metadata.gz: 6778c767c1b28ad451f42e0a7f86557382e93627bfee517d7fcd857f90a674bd63294d67253704975c5653d4de616f731524eaf37bd11ff41822635dfcf78c8a
7
+ data.tar.gz: 626e57f6a9e8a8c8080defd2496d983fa93e0a9fcdf63e5ad87aad662c3f4aaca42ff7e5b0c6c9cb0d94fc66d43808fd10dee65add9d0ca3d1d60b76d2c801e9
data/lib/kennel/filter.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Kennel
4
4
  class Filter
5
+ ID_SEPARATOR = ":"
5
6
  attr_reader :project_filter
6
7
 
7
8
  def initialize
@@ -22,23 +23,18 @@ module Kennel
22
23
  !project_filter.nil?
23
24
  end
24
25
 
25
- def matches_project_id?(project_id)
26
+ def filters_project_id?(project_id)
26
27
  !filtering? || project_filter.include?(project_id)
27
28
  end
28
29
 
29
- def matches_tracking_id?(tracking_id)
30
+ def filters_tracking_id?(tracking_id)
30
31
  return true unless filtering?
31
32
  return tracking_id_filter.include?(tracking_id) if tracking_id_filter
32
33
 
33
- project_id = tracking_id.split(":").first
34
+ project_id = tracking_id.split(ID_SEPARATOR, 2).first
34
35
  project_filter.include?(project_id)
35
36
  end
36
37
 
37
- def tracking_id_for_path(tracking_id)
38
- return tracking_id unless tracking_id.end_with?(".json")
39
- tracking_id.sub("generated/", "").sub(".json", "").sub("/", ":")
40
- end
41
-
42
38
  private
43
39
 
44
40
  attr_reader :tracking_id_filter
@@ -46,7 +42,7 @@ module Kennel
46
42
  # needs to be called after read_tracking_id_filter_from_env
47
43
  def read_project_filter_from_env
48
44
  project_names = ENV["PROJECT"]&.split(",")&.sort&.uniq
49
- tracking_project_names = tracking_id_filter&.map { |id| id.split(":", 2).first }&.sort&.uniq
45
+ tracking_project_names = tracking_id_filter&.map { |id| id.split(ID_SEPARATOR, 2).first }&.sort&.uniq
50
46
  if project_names && tracking_project_names && project_names != tracking_project_names
51
47
  # avoid everything being filtered out
52
48
  raise "do not set a different PROJECT= when using TRACKING_ID="
@@ -57,8 +53,8 @@ module Kennel
57
53
  def read_tracking_id_filter_from_env
58
54
  return unless (tracking_id = ENV["TRACKING_ID"])
59
55
  tracking_id.split(",").map do |id|
60
- # allow users to paste the generated/ path of an objects to update it without manually converting
61
- tracking_id_for_path(id)
56
+ # allow using the generated/ path from `git diff` to update objects without manually converting
57
+ id.include?(ID_SEPARATOR) ? id : PartsSerializer.tracking_id_for_path(id)
62
58
  end.sort.uniq
63
59
  end
64
60
 
@@ -2,6 +2,9 @@
2
2
 
3
3
  module Kennel
4
4
  class PartsSerializer
5
+ FILE_EXTENSION = ".json"
6
+ FOLDER = "generated"
7
+
5
8
  def initialize(filter:)
6
9
  @filter = filter
7
10
  end
@@ -9,8 +12,15 @@ module Kennel
9
12
  def write(parts)
10
13
  Progress.progress "Storing" do
11
14
  existing = existing_files_and_folders
12
- used = write_changed(parts)
13
- FileUtils.rm_rf(existing - used)
15
+ used, changed = write_changed(parts)
16
+ FileUtils.rm_rf(existing - used) # cleanup abandoned
17
+ suggest_using_project_filter(changed)
18
+ end
19
+ end
20
+
21
+ class << self
22
+ def tracking_id_for_path(path)
23
+ path.sub("#{FOLDER}/", "").sub(FILE_EXTENSION, "").sub("/", ":")
14
24
  end
15
25
  end
16
26
 
@@ -20,28 +30,29 @@ module Kennel
20
30
 
21
31
  def write_changed(parts)
22
32
  used = []
33
+ changed = []
23
34
 
24
35
  Utils.parallel(parts, max: 2) do |part|
25
36
  path = path_for_tracking_id(part.tracking_id)
26
37
 
38
+ # match paths returned from existing_files_and_folders
27
39
  used << File.dirname(path) # we have 1 level of sub folders, so this is enough
28
40
  used << path
29
41
 
30
42
  content = part.as_json.merge(api_resource: part.class.api_resource)
31
- write_file_if_necessary(path, content)
43
+ changed << path if write_file_if_necessary(path, content)
32
44
  end
33
-
34
- used
45
+ [used, changed]
35
46
  end
36
47
 
37
48
  def existing_files_and_folders
38
- paths = Dir["generated/**/*"]
49
+ paths = Dir["#{FOLDER}/**/*"] # we rely on this returning folders and files, see write_changed
39
50
 
40
51
  # when filtering we only need the files we are going to write
41
52
  if filter.filtering?
42
53
  paths.select! do |path|
43
- tracking_id = filter.tracking_id_for_path(path)
44
- filter.matches_tracking_id?(tracking_id)
54
+ tracking_id = self.class.tracking_id_for_path(path)
55
+ filter.filters_tracking_id?(tracking_id)
45
56
  end
46
57
  end
47
58
 
@@ -49,7 +60,7 @@ module Kennel
49
60
  end
50
61
 
51
62
  def path_for_tracking_id(tracking_id)
52
- "generated/#{tracking_id.tr("/", ":").sub(":", "/")}.json"
63
+ "#{FOLDER}/#{tracking_id.tr("/", ":").sub(":", "/")}#{FILE_EXTENSION}"
53
64
  end
54
65
 
55
66
  def write_file_if_necessary(path, content)
@@ -58,13 +69,21 @@ module Kennel
58
69
 
59
70
  # 99% case
60
71
  begin
61
- return if File.read(path) == content
62
- rescue Errno::ENOENT
72
+ return false if File.read(path) == content
73
+ rescue Errno::ENOENT # file or even folder did not exist
63
74
  FileUtils.mkdir_p(File.dirname(path))
64
75
  end
65
76
 
66
77
  # slow 1% case
67
78
  File.write(path, content)
79
+ true
80
+ end
81
+
82
+ def suggest_using_project_filter(changed)
83
+ return if filter.filtering?
84
+ projects = changed.map { |path| path.split("/")[1] }.uniq
85
+ return if projects.size != 1
86
+ warn "Hint: Using PROJECT=#{projects[0]} is faster"
68
87
  end
69
88
  end
70
89
  end
@@ -12,7 +12,8 @@ module Kennel
12
12
  # All requested projects. This is a slow operation when loading all projects.
13
13
  def projects
14
14
  load_requested
15
- loaded_projects.map(&:new)
15
+ projects = loaded_projects.map(&:new)
16
+ @filter.filter_projects projects # in case we loaded more though dependencies
16
17
  end
17
18
 
18
19
  private
@@ -27,7 +27,7 @@ module Kennel
27
27
  # ignore when deleted from the codebase
28
28
  # (when running with filters we cannot see the other resources in the codebase)
29
29
  api_resource = a.fetch(:klass).api_resource
30
- next if !id_map.get(api_resource, tracking_id) && filter.matches_tracking_id?(tracking_id)
30
+ next if !id_map.get(api_resource, tracking_id) && filter.filters_tracking_id?(tracking_id)
31
31
 
32
32
  id_map.set(api_resource, tracking_id, a.fetch(:id))
33
33
  if a.fetch(:klass).api_resource == "synthetics/tests"
data/lib/kennel/syncer.rb CHANGED
@@ -179,7 +179,7 @@ module Kennel
179
179
 
180
180
  actual.select! do |a|
181
181
  tracking_id = a.fetch(:tracking_id)
182
- tracking_id.nil? || filter.matches_tracking_id?(tracking_id)
182
+ tracking_id.nil? || filter.filters_tracking_id?(tracking_id)
183
183
  end
184
184
  end
185
185
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Kennel
3
- VERSION = "2.15.0"
3
+ VERSION = "2.16.0"
4
4
  end
data/lib/kennel.rb CHANGED
@@ -69,7 +69,9 @@ module Kennel
69
69
 
70
70
  def generate
71
71
  parts = generated
72
- PartsSerializer.new(filter: filter).write(parts) if ENV["STORE"] != "false" # quicker when debugging
72
+ if ENV["STORE"] != "false" # quicker when debugging
73
+ PartsSerializer.new(filter: filter).write(parts)
74
+ end
73
75
  parts
74
76
  end
75
77
 
@@ -109,8 +111,7 @@ module Kennel
109
111
  def generated(**kwargs)
110
112
  @generated ||= begin
111
113
  projects = Progress.progress "Loading projects", **kwargs do
112
- projects = ProjectsProvider.new(filter: filter).projects
113
- filter.filter_projects projects
114
+ ProjectsProvider.new(filter: filter).projects
114
115
  end
115
116
 
116
117
  parts = Progress.progress "Finding parts", **kwargs do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kennel
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.15.0
4
+ version: 2.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser