inventory_refresh 0.1.2 → 0.2.3

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