inventory_refresh 0.1.2 → 0.2.3

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.gitignore +6 -0
  4. data/.travis.yml +3 -3
  5. data/Gemfile +4 -0
  6. data/inventory_refresh.gemspec +7 -5
  7. data/lib/inventory_refresh.rb +1 -0
  8. data/lib/inventory_refresh/inventory_collection.rb +114 -649
  9. data/lib/inventory_refresh/inventory_collection/builder.rb +249 -0
  10. data/lib/inventory_refresh/inventory_collection/graph.rb +0 -15
  11. data/lib/inventory_refresh/inventory_collection/helpers.rb +6 -0
  12. data/lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb +80 -0
  13. data/lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb +456 -0
  14. data/lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb +132 -0
  15. data/lib/inventory_refresh/inventory_collection/index/type/skeletal.rb +5 -5
  16. data/lib/inventory_refresh/inventory_collection/reference.rb +4 -0
  17. data/lib/inventory_refresh/inventory_collection/scanner.rb +111 -18
  18. data/lib/inventory_refresh/inventory_collection/serialization.rb +7 -7
  19. data/lib/inventory_refresh/inventory_collection/unconnected_edge.rb +19 -0
  20. data/lib/inventory_refresh/inventory_object.rb +17 -11
  21. data/lib/inventory_refresh/inventory_object_lazy.rb +20 -10
  22. data/lib/inventory_refresh/persister.rb +212 -0
  23. data/lib/inventory_refresh/save_collection/base.rb +18 -3
  24. data/lib/inventory_refresh/save_collection/saver/base.rb +25 -62
  25. data/lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb +73 -225
  26. data/lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb +226 -0
  27. data/lib/inventory_refresh/save_collection/saver/retention_helper.rb +115 -0
  28. data/lib/inventory_refresh/save_collection/saver/sql_helper.rb +122 -0
  29. data/lib/inventory_refresh/save_collection/saver/sql_helper_update.rb +24 -5
  30. data/lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb +6 -6
  31. data/lib/inventory_refresh/save_collection/sweeper.rb +69 -0
  32. data/lib/inventory_refresh/save_inventory.rb +18 -8
  33. data/lib/inventory_refresh/target_collection.rb +12 -0
  34. data/lib/inventory_refresh/version.rb +1 -1
  35. metadata +73 -25
  36. data/lib/inventory_refresh/save_collection/recursive.rb +0 -52
  37. data/lib/inventory_refresh/save_collection/saver/concurrent_safe.rb +0 -71
@@ -76,5 +76,17 @@ module InventoryRefresh
76
76
  def manager_refs_by_association_reset
77
77
  @manager_refs_by_association = nil
78
78
  end
79
+
80
+ # Returns list of ems_refs
81
+ # @return [Array<String>]
82
+ def references(collection)
83
+ manager_refs_by_association.try(:[], collection).try(:[], :ems_ref)&.to_a || []
84
+ end
85
+
86
+ # Returns list of names
87
+ # @return [Array<String>]
88
+ def name_references(collection)
89
+ manager_refs_by_association.try(:[], collection).try(:[], :name)&.to_a || []
90
+ end
79
91
  end
80
92
  end
@@ -1,3 +1,3 @@
1
1
  module InventoryRefresh
2
- VERSION = "0.1.2".freeze
2
+ VERSION = "0.2.3".freeze
3
3
  end
metadata CHANGED
@@ -1,57 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inventory_refresh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ManageIQ Developers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-04 00:00:00.000000000 Z
11
+ date: 2020-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: 5.0.6
22
+ version: '6.1'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '5.0'
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: 5.0.6
32
+ version: '6.1'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: more_core_extensions
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '3.5'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '5'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">="
39
48
  - !ruby/object:Gem::Version
40
49
  version: '3.5'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '5'
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: pg
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
- - - "~>"
57
+ - - ">"
46
58
  - !ruby/object:Gem::Version
47
- version: 0.18.2
59
+ version: '0'
48
60
  type: :runtime
49
61
  prerelease: false
50
62
  version_requirements: !ruby/object:Gem::Requirement
51
63
  requirements:
52
- - - "~>"
64
+ - - ">"
53
65
  - !ruby/object:Gem::Version
54
- version: 0.18.2
66
+ version: '0'
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: ancestry
57
69
  requirement: !ruby/object:Gem::Requirement
@@ -72,28 +84,28 @@ dependencies:
72
84
  requirements:
73
85
  - - "~>"
74
86
  - !ruby/object:Gem::Version
75
- version: '1.16'
87
+ version: '2.0'
76
88
  type: :development
77
89
  prerelease: false
78
90
  version_requirements: !ruby/object:Gem::Requirement
79
91
  requirements:
80
92
  - - "~>"
81
93
  - !ruby/object:Gem::Version
82
- version: '1.16'
94
+ version: '2.0'
83
95
  - !ruby/object:Gem::Dependency
84
- name: factory_girl
96
+ name: factory_bot
85
97
  requirement: !ruby/object:Gem::Requirement
86
98
  requirements:
87
99
  - - "~>"
88
100
  - !ruby/object:Gem::Version
89
- version: 4.5.0
101
+ version: 4.11.1
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
93
105
  requirements:
94
106
  - - "~>"
95
107
  - !ruby/object:Gem::Version
96
- version: 4.5.0
108
+ version: 4.11.1
97
109
  - !ruby/object:Gem::Dependency
98
110
  name: rake
99
111
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +134,34 @@ dependencies:
122
134
  - - "~>"
123
135
  - !ruby/object:Gem::Version
124
136
  version: '3.0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: rubocop
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ - !ruby/object:Gem::Dependency
152
+ name: rubocop-performance
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
125
165
  - !ruby/object:Gem::Dependency
126
166
  name: simplecov
127
167
  requirement: !ruby/object:Gem::Requirement
@@ -137,7 +177,7 @@ dependencies:
137
177
  - !ruby/object:Gem::Version
138
178
  version: '0'
139
179
  description: Topological Inventory Persister
140
- email:
180
+ email:
141
181
  executables: []
142
182
  extensions: []
143
183
  extra_rdoc_files: []
@@ -158,6 +198,7 @@ files:
158
198
  - Rakefile
159
199
  - bin/console
160
200
  - bin/setup
201
+ - bundler.d/.gitkeep
161
202
  - config/database.yml
162
203
  - inventory_refresh.gemspec
163
204
  - lib/inventory_refresh.rb
@@ -166,8 +207,13 @@ files:
166
207
  - lib/inventory_refresh/graph.rb
167
208
  - lib/inventory_refresh/graph/topological_sort.rb
168
209
  - lib/inventory_refresh/inventory_collection.rb
210
+ - lib/inventory_refresh/inventory_collection/builder.rb
169
211
  - lib/inventory_refresh/inventory_collection/data_storage.rb
170
212
  - lib/inventory_refresh/inventory_collection/graph.rb
213
+ - lib/inventory_refresh/inventory_collection/helpers.rb
214
+ - lib/inventory_refresh/inventory_collection/helpers/associations_helper.rb
215
+ - lib/inventory_refresh/inventory_collection/helpers/initialize_helper.rb
216
+ - lib/inventory_refresh/inventory_collection/helpers/questions_helper.rb
171
217
  - lib/inventory_refresh/inventory_collection/index/proxy.rb
172
218
  - lib/inventory_refresh/inventory_collection/index/type/base.rb
173
219
  - lib/inventory_refresh/inventory_collection/index/type/data.rb
@@ -177,20 +223,23 @@ files:
177
223
  - lib/inventory_refresh/inventory_collection/references_storage.rb
178
224
  - lib/inventory_refresh/inventory_collection/scanner.rb
179
225
  - lib/inventory_refresh/inventory_collection/serialization.rb
226
+ - lib/inventory_refresh/inventory_collection/unconnected_edge.rb
180
227
  - lib/inventory_refresh/inventory_object.rb
181
228
  - lib/inventory_refresh/inventory_object_lazy.rb
182
229
  - lib/inventory_refresh/logging.rb
183
230
  - lib/inventory_refresh/null_logger.rb
231
+ - lib/inventory_refresh/persister.rb
184
232
  - lib/inventory_refresh/save_collection/base.rb
185
- - lib/inventory_refresh/save_collection/recursive.rb
186
233
  - lib/inventory_refresh/save_collection/saver/base.rb
187
234
  - lib/inventory_refresh/save_collection/saver/batch.rb
188
- - lib/inventory_refresh/save_collection/saver/concurrent_safe.rb
189
235
  - lib/inventory_refresh/save_collection/saver/concurrent_safe_batch.rb
190
236
  - lib/inventory_refresh/save_collection/saver/default.rb
237
+ - lib/inventory_refresh/save_collection/saver/partial_upsert_helper.rb
238
+ - lib/inventory_refresh/save_collection/saver/retention_helper.rb
191
239
  - lib/inventory_refresh/save_collection/saver/sql_helper.rb
192
240
  - lib/inventory_refresh/save_collection/saver/sql_helper_update.rb
193
241
  - lib/inventory_refresh/save_collection/saver/sql_helper_upsert.rb
242
+ - lib/inventory_refresh/save_collection/sweeper.rb
194
243
  - lib/inventory_refresh/save_collection/topological_sort.rb
195
244
  - lib/inventory_refresh/save_inventory.rb
196
245
  - lib/inventory_refresh/target.rb
@@ -200,7 +249,7 @@ homepage: https://github.com/ManageIQ/inventory_refresh
200
249
  licenses:
201
250
  - Apache-2.0
202
251
  metadata: {}
203
- post_install_message:
252
+ post_install_message:
204
253
  rdoc_options: []
205
254
  require_paths:
206
255
  - lib
@@ -215,9 +264,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
264
  - !ruby/object:Gem::Version
216
265
  version: '0'
217
266
  requirements: []
218
- rubyforge_project:
219
- rubygems_version: 2.7.6
220
- signing_key:
267
+ rubygems_version: 3.2.0.rc.2
268
+ signing_key:
221
269
  specification_version: 4
222
270
  summary: Topological Inventory Persister
223
271
  test_files: []
@@ -1,52 +0,0 @@
1
- require "inventory_refresh/save_collection/base"
2
-
3
- module InventoryRefresh::SaveCollection
4
- class Recursive < InventoryRefresh::SaveCollection::Base
5
- class << self
6
- # Saves the passed InventoryCollection objects by recursively passing the graph
7
- #
8
- # @param ems [ExtManagementSystem] manager owning the inventory_collections
9
- # @param inventory_collections [Array<InventoryRefresh::InventoryCollection>] array of InventoryCollection objects
10
- # for saving
11
- def save_collections(ems, inventory_collections)
12
- graph = InventoryRefresh::InventoryCollection::Graph.new(inventory_collections)
13
- graph.build_directed_acyclic_graph!
14
-
15
- graph.nodes.each do |inventory_collection|
16
- save_collection(ems, inventory_collection, [])
17
- end
18
- end
19
-
20
- private
21
-
22
- # Saves the one passed InventoryCollection object
23
- #
24
- # @param ems [ExtManagementSystem] manager owning the inventory_collections
25
- # @param inventory_collection [InventoryRefresh::InventoryCollection] InventoryCollection object for saving
26
- # @param traversed_collections [Array<InventoryRefresh::InventoryCollection>] array of traversed InventoryCollection
27
- # objects, that we use for detecting possible cycle
28
- def save_collection(ems, inventory_collection, traversed_collections)
29
- unless inventory_collection.kind_of?(::InventoryRefresh::InventoryCollection)
30
- raise "A InventoryRefresh::SaveInventory needs a InventoryCollection object, it got: #{inventory_collection.inspect}"
31
- end
32
-
33
- return if inventory_collection.saved?
34
-
35
- traversed_collections << inventory_collection
36
-
37
- unless inventory_collection.saveable?
38
- inventory_collection.dependencies.each do |dependency|
39
- next if dependency.saved?
40
- if traversed_collections.include?(dependency)
41
- raise "Edge from #{inventory_collection} to #{dependency} creates a cycle"
42
- end
43
- save_collection(ems, dependency, traversed_collections)
44
- end
45
- end
46
-
47
- logger.debug("Saving #{inventory_collection} of size #{inventory_collection.size}")
48
- save_inventory_object_inventory(ems, inventory_collection)
49
- end
50
- end
51
- end
52
- end
@@ -1,71 +0,0 @@
1
- require "inventory_refresh/save_collection/saver/base"
2
-
3
- module InventoryRefresh::SaveCollection
4
- module Saver
5
- class ConcurrentSafe < InventoryRefresh::SaveCollection::Saver::Base
6
- # TODO(lsmola) this strategy does not make much sense, it's better to use concurent_safe_batch and make batch size
7
- # configurable
8
- private
9
-
10
- # Updates the passed record with hash data and stores primary key value into inventory_object.
11
- #
12
- # @param record [ApplicationRecord] record we want to update in DB
13
- # @param hash [Hash] data we want to update the record with
14
- # @param inventory_object [InventoryRefresh::InventoryObject] InventoryObject instance where we will store primary
15
- # key value
16
- def update_record!(record, hash, inventory_object)
17
- assign_attributes_for_update!(hash, time_now)
18
- record.assign_attributes(hash.except(:id))
19
-
20
- if !inventory_object.inventory_collection.check_changed? || record.changed?
21
- update_query = inventory_object.inventory_collection.model_class.where(:id => record.id)
22
- if hash[:remote_data_timestamp]
23
- timestamp_field = inventory_collection.model_class.arel_table[:remote_data_timestamp]
24
- update_query = update_query.where(timestamp_field.lt(hash[:remote_data_timestamp]))
25
- end
26
-
27
- update_query.update_all(hash)
28
- inventory_collection.store_updated_records(record)
29
- end
30
-
31
- inventory_object.id = record.id
32
- end
33
-
34
- # Creates a new record in the DB using the passed hash data
35
- #
36
- # @param hash [Hash] hash with data we want to persist to DB
37
- # @param inventory_object [InventoryRefresh::InventoryObject] InventoryObject instance where we will store primary
38
- # key value
39
- def create_record!(hash, inventory_object)
40
- all_attribute_keys = hash.keys
41
- data = inventory_collection.model_class.new(hash).attributes.symbolize_keys
42
-
43
- # TODO(lsmola) abstract common behavior into base class
44
- all_attribute_keys << :type if supports_sti?
45
- all_attribute_keys << :created_at if supports_created_at?
46
- all_attribute_keys << :updated_at if supports_updated_at?
47
- all_attribute_keys << :created_on if supports_created_on?
48
- all_attribute_keys << :updated_on if supports_updated_on?
49
- hash_for_creation = if inventory_collection.use_ar_object?
50
- record = inventory_collection.model_class.new(data)
51
- values_for_database!(all_attribute_keys,
52
- record.attributes.symbolize_keys)
53
- elsif serializable_keys?
54
- values_for_database!(all_attribute_keys,
55
- data)
56
- else
57
- data
58
- end
59
-
60
- assign_attributes_for_create!(hash_for_creation, time_now)
61
-
62
- result_id = ActiveRecord::Base.connection.execute(
63
- build_insert_query(all_attribute_keys, [hash_for_creation])
64
- )
65
-
66
- inventory_object.id = result_id.to_a.try(:first).try(:[], "id")
67
- inventory_collection.store_created_records(inventory_object)
68
- end
69
- end
70
- end
71
- end