kennel 1.11.3 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
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