Module: Rbbt::Config

Defined in:
lib/rbbt/util/config.rb

Constant Summary collapse

CACHE =
IndiferentHash.setup({})

Class Method Summary collapse

Class Method Details

.add_entry(key, value, tokens) ⇒ Object



8
9
10
11
# File 'lib/rbbt/util/config.rb', line 8

def self.add_entry(key, value, tokens)
  CACHE[key.to_s] ||= [] 
  CACHE[key.to_s] << [tokens, value]
end

.get(key, *tokens) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/rbbt/util/config.rb', line 81

def self.get(key, *tokens)
  tokens = tokens.flatten
  file, _sep, line = caller.reject{|l| 
    l =~ /rbbt\/(?:resource\.rb|workflow\.rb)/ or
      l =~ /rbbt\/resource\/path\.rb/ or
      l =~ /rbbt\/util\/misc\.rb/ or
      l =~ /progress-monitor\.rb/ 
  }.first.partition(":")

  File.expand_path(file)

  tokens << ("file:" << file)
  tokens << ("line:" << file << ":" << line)

  entries = CACHE[key.to_s]
  priorities = {}
  tokens = tokens + ["key:" << key.to_s]
  tokens.each do |token|
    token_prio = match entries, token.to_s
    token_prio.each do |prio, values|
      priorities[prio] ||= []
      priorities[prio].concat(values)
    end
  end

  return nil if priorities.empty?

  priorities.sort_by{|p,v| p}.first.last.first
end

.load_configObject



23
24
25
26
27
# File 'lib/rbbt/util/config.rb', line 23

def self.load_config
  Rbbt.etc.config.find_all.each do |file|
    self.load_file(file)
  end
end

.load_file(file) ⇒ Object



13
14
15
16
17
18
19
20
21
# File 'lib/rbbt/util/config.rb', line 13

def self.load_file(file)
  Log.debug "Loading file: #{ file }"
  TSV.traverse file, :type => :array do |line|
    next if line =~ /^#/
    key, value, *tokens = line.split(/\s/)

    self.add_entry(key, value, tokens) if key
  end
end

.match(entries, token) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rbbt/util/config.rb', line 65

def self.match(entries, token)
  priorities = {}
  entries.each do |tokens, value|
    best_prio = nil
    tokens.each do |tok|
      tok, prio = token_priority tok
      best_prio = prio if best_prio.nil? or best_prio > prio
      next if prio > best_prio
      next unless tok == token
      priorities[prio] ||= []
      priorities[prio] << value
    end
  end if entries
  priorities
end

.set(values, *tokens) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/rbbt/util/config.rb', line 29

def self.set(values, *tokens)
  if not Hash === values
    values = {values => tokens.shift}
  end

  values.each do |key,value|
    add_entry key, value, tokens
  end
end

.token_priority(token) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rbbt/util/config.rb', line 39

def self.token_priority(token)
  token, _sep, priority = token.to_s.partition("::")

  if priority.nil? || priority.empty?
    type, _sep, rest = token.partition(":")
    priority = case type
               when "workflow"
                 4
               when "task"
                 3
               when "file"
                 2
               when "line"
                 1
               when "key"
                 20
               else
                 10
               end
  else
    priority = priority.to_i
  end

  [token, priority]
end