kennel 1.11.3 → 1.12.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: d4b3405787bca44e16c573912811165eaaa78b2389c4b847695a80089c8a158d
4
- data.tar.gz: 6d1e508699b35bd4ba4bf534c3cdfc89e4755e8a17668bcfe0cf98e509dd7747
3
+ metadata.gz: 7114ffae96587ada9ea64441476daf3caf82f1149c877e9529a598651f25eece
4
+ data.tar.gz: 57986d14b955e2b392f68742e40b2284d8a3d36e67a8bce8d71c57ee35842145
5
5
  SHA512:
6
- metadata.gz: d5bdbb129ac49aa4d651a87877170f33ddca80ef3065b5eae312da15911020df020aa409e5345f43a1ffdf88728e6577cd7dcd354db5a72c4278d6ef57e44307
7
- data.tar.gz: 7ca44d43b7c5dc9df34cdd20489889db9c74bd0a50133936a15f3d7d5680aa03eb393c9a14ffad1ae477398ed7b729ac927323fe01d0e19ea6ff401915f230b5
6
+ metadata.gz: 0f205bdb359a2ce62a6d4564e89b9e13ebc7faed6ce3e7ec41fdff29a03ea86b9017c8cfcfe1c347ce4f77d7ed895fd5606f6373638cad92a30b5e49d5e5425e
7
+ data.tar.gz: 6619e5a232fe196deabcf5ef48d80ab01733f93922b842762cdd6baf705b5e72e70193d0f36eedb1bd53e21dd63804701797b6f491547a797b1dc3f24b3d04b2
data/lib/kennel/syncer.rb CHANGED
@@ -2,6 +2,7 @@
2
2
  module Kennel
3
3
  class Syncer
4
4
  CACHE_FILE = "tmp/cache/details" # keep in sync with .travis.yml caching
5
+ TRACKING_FIELDS = [:message, :description].freeze
5
6
 
6
7
  def initialize(api, expected, project: nil)
7
8
  @api = api
@@ -28,6 +29,8 @@ module Kennel
28
29
  end
29
30
 
30
31
  def update
32
+ block_irreversible_partial_changes
33
+
31
34
  @create.each do |_, e|
32
35
  reply = @api.create e.class.api_resource, e.as_json
33
36
  reply = unnest(e.class.api_resource, reply)
@@ -54,11 +57,11 @@ module Kennel
54
57
  def calculate_diff
55
58
  @update = []
56
59
  @delete = []
57
- actual = Progress.progress "Downloading definitions" do
58
- filter_by_project! download_definitions
59
- end
60
+ actual = Progress.progress("Downloading definitions") { download_definitions }
60
61
 
61
62
  Progress.progress "Diffing" do
63
+ filter_by_project! actual
64
+
62
65
  details_cache do |cache|
63
66
  actual.each do |a|
64
67
  id = a.fetch(:id)
@@ -66,9 +69,7 @@ module Kennel
66
69
  if e = delete_matching_expected(a)
67
70
  fill_details(a, cache) if e.class::API_LIST_INCOMPLETE
68
71
  diff = e.diff(a)
69
- if diff.any?
70
- @update << [id, e, a, diff]
71
- end
72
+ @update << [id, e, a, diff] if diff.any?
72
73
  elsif tracking_id(a) # was previously managed
73
74
  @delete << [id, nil, a]
74
75
  end
@@ -168,14 +169,21 @@ module Kennel
168
169
  end
169
170
  end
170
171
 
172
+ def block_irreversible_partial_changes
173
+ return unless @project_filter
174
+ return if
175
+ @delete.none? &&
176
+ @update.none? { |_, e, _, diff| e.id && diff.any? { |_, field| TRACKING_FIELDS.include?(field.to_sym) } }
177
+
178
+ raise "Partial updates should not modify resources with an id, since these changes are irreversible"
179
+ end
180
+
171
181
  def filter_by_project!(definitions)
172
- if @project_filter
173
- definitions.select! do |a|
174
- id = tracking_id(a)
175
- !id || id.start_with?("#{@project_filter}:")
176
- end
182
+ return unless @project_filter
183
+ definitions.select! do |a|
184
+ id = tracking_id(a)
185
+ !id || id.start_with?("#{@project_filter}:")
177
186
  end
178
- definitions
179
187
  end
180
188
 
181
189
  def add_tracking_id(e)
@@ -189,7 +197,7 @@ module Kennel
189
197
  end
190
198
 
191
199
  def tracking_field(a)
192
- a[:message] ? :message : :description
200
+ TRACKING_FIELDS.detect { |f| a.key?(f) }
193
201
  end
194
202
  end
195
203
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Kennel
3
- VERSION = "1.11.3"
3
+ VERSION = "1.12.0"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kennel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.3
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-04 00:00:00.000000000 Z
11
+ date: 2018-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday