Module: AbideDevUtils::Ppt::FacterUtils
  
  
  
  
  
  
  
  
  
  
  
  
    - Defined in:
 
    - lib/abide_dev_utils/ppt/facter_utils.rb
 
  
  
 
Overview
  
    
Methods relating to Facter
   
 
  
Defined Under Namespace
  
    
  
    
      Classes: FactSet, FactSets
    
  
  
    
      Class Method Summary
      collapse
    
    
  
  
    Class Method Details
    
      
  
  
    .all_versions  ⇒ Object 
  
  
  
  
    
      
241
242
243 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 241
def all_versions
  @all_versions ||= fact_sets.sort.map(&:facter_version)
end 
     | 
  
 
    
      
  
  
    .fact_sets  ⇒ Object 
  
  
  
  
    
def latest_version
all_versions[-1]
end
   
 
  
  
    
      
231
232
233
234
235
236
237
238
239 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 231
def fact_sets
  @fact_sets ||= FacterDB.facterdb_fact_files.each_with_object([]) do |f, ary|
    facter_version = File.basename(File.dirname(f))
    fact_set = ary.find { |fs| fs.facter_version == facter_version }
    fact_set ||= FactSet.new(facter_version)
    fact_set.load_facts(f)
    ary << fact_set unless ary.include?(fact_set)
  end
end
     | 
  
 
    
      
  
  
    .latest_version  ⇒ Object 
  
  
  
  
    
      
245
246
247 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 245
def latest_version
  @latest_version ||= all_versions.last
end 
     | 
  
 
    
      
  
  
    .previous_major_version(facter_version = latest_version)  ⇒ Object 
  
  
  
  
    
      
258
259
260
261
262
263
264
265 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 258
def previous_major_version(facter_version = latest_version)
  majver = facter_version.split('.')[0]
  prev_majver = (majver.to_i - 1).to_s
  prev_ver = all_versions.select { |v| v.start_with?(prev_majver) }.max
  return nil if prev_ver.to_i < 1
  prev_ver
end
     | 
  
 
    
      
  
  
    .previous_version(facter_version = latest_version)  ⇒ Object 
  
  
  
  
    
      
267
268
269
270
271
272
273 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 267
def previous_version(facter_version = latest_version)
  reversed = all_versions.reverse
  rev_index = reversed.index(facter_version)
  return nil if rev_index.nil? || rev_index == reversed.length - 1
  reversed[reversed.index(facter_version) + 1]
end 
     | 
  
 
    
      
  
  
    .recurse_versions(version = latest_version, &block)  ⇒ Object 
  
  
  
  
    
      
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 275
def recurse_versions(version = latest_version, &block)
  output = yield version
  return output unless output.nil? || output.empty?
  prev_ver = previous_version(version).dup
  return nil if prev_ver.nil?
  recurse_versions(prev_ver, &block)
rescue SystemStackError
  locals = {
    prev_ver_map: @previous_major_version_map,
    current_version: current_version,
  }
  raise "Failed to find output while recursing versions. Locals: #{locals}"
end
     | 
  
 
    
      
  
  
    .recursive_facts_for_os(os_name, os_release_major = nil, facter_version: latest_version)  ⇒ Object 
  
  
  
  
    
      
291
292
293
294
295 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 291
def recursive_facts_for_os(os_name, os_release_major = nil, facter_version: latest_version)
  recurse_versions(facter_version) do |ver|
    facts_for_os(os_name, os_release_major, facter_version: ver)
  end
end
     | 
  
 
    
      
  
  
    .resolve_dot_path(dot_path, facter_version: latest_version, strict: false)  ⇒ Object 
  
  
  
  
    
def facts_for_os(os_name, os_release_major = nil, facter_version: latest_version)
fact_sets..find do |f|
  f['os']['name'] == os_name && f['os']['release']['major'] == os_release_major.to_s
end
end
   
 
  
  
    
      
303
304
305
306
307
308
309
310
311
312
313
314
315 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 303
def resolve_dot_path(dot_path, facter_version: latest_version, strict: false)
  path_array = dot_path.delete_prefix('facts.').split('.')
  resolved = if strict
               fact_sets[facter_version].map do |fs|
                 fs.dig(*path_array)
               end
             else
               recurse_versions(facter_version) do |ver|
                 fact_sets[ver].map { |fs| fs.dig(*path_array) }
               end
             end
  resolved&.compact&.uniq
end
     | 
  
 
    
      
  
  
    
      
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 317
def resolve_related_dot_paths(*dot_paths, facter_version: latest_version, strict: false)
  resolved = []
  if strict
    fact_sets[facter_version].map do |fs|
      resolved << dot_paths.map do |p|
        path_array = p.delete_prefix('facts.').split('.')
        fs.dig(*path_array)
      end
    end
  else
    recurse_versions(facter_version) do |ver|
      fact_sets[ver].map do |fs|
        resolved << dot_paths.map do |p|
          path_array = p.delete_prefix('facts.').split('.')
          fs.dig(*path_array)
        end
      end
    end
  end
  resolved
end
     | 
  
 
    
      
  
  
    .with_version(version) {|fact_set| ... } ⇒ Object 
  
  
  
  
    
      
249
250
251
252
253
254
255
256 
     | 
    
      # File 'lib/abide_dev_utils/ppt/facter_utils.rb', line 249
def with_version(version)
  return unless block_given?
  fact_set = fact_sets.find { |fs| fs.facter_version == version }
  raise "No facts found for version #{version}" unless fact_set
  yield fact_set
end
     |