Class: Flor::Loader

Inherits:
CoreLoader show all
Defined in:
lib/flor/unit/loader.rb

Instance Method Summary collapse

Methods inherited from CoreLoader

#require, #shutdown

Constructor Details

#initialize(unit) ⇒ Loader

NB: tasker configuration entries start with “loa_”



31
32
33
34
35
36
37
38
39
40
# File 'lib/flor/unit/loader.rb', line 31

def initialize(unit)

  @unit = unit

  @cache = {}
  @mutex = Mutex.new

  @root = File.absolute_path(
    @unit.conf['lod_path'] || @unit.conf['root'] || '.')
end

Instance Method Details

#definitions(start = nil) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/flor/unit/loader.rb', line 163

def definitions(start=nil)

  start ||= ''

  Dir[File.join(@root, '**/*.{flo,flor}')]
    .collect { |pa| pa[@root.length..-1] }
    .collect { |pa| pa.gsub(/\A\/usr\//, '/') }
    .collect { |pa| pa.gsub(/\/lib\/(sub)?flows\//, '/') }
    .collect { |pa| pa.gsub(/\.flor?\z/, '') }
    .collect { |pa| pa.gsub(/\//, '.') }
    .collect { |pa| pa.gsub(/\A\./, '') }
    .sort
    .select { |pa| Flor.sub_domain?(start, pa) }
end

#domains(start = nil) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/flor/unit/loader.rb', line 136

def domains(start=nil)

  start ||= ''

  Dir[File.join(@root, '**/*.{json,flo,flor,rb}')]
    .collect { |pa| pa[@root.length..-1] }
    .sort
    .collect { |pa|
      pa = pa[4..-1] if pa.match(/^\/usr\//)
      case pa
      when /\.flor?$/ then extract_flow_domain(pa)
      when /\/lib\/hooks\// then extract_hook_domain(pa)
      when /\/lib\/taskers\// then extract_tasker_domain(pa)
      when /\/etc\/variables\// then extract_variable_domain(pa)
      else nil
      end }
    .compact
    .select { |pa| pa.length > 1 }
    .collect { |pa|
      pa = pa[1..-1] if pa[0, 1] == '/'
      pa = pa[0..-2] if pa.match(/\/$/)
      pa.gsub('/', '.') }
    .sort
    .uniq
    .select { |dm| Flor.sub_domain?(start, dm) }
end

#hooks(domain) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/flor/unit/loader.rb', line 114

def hooks(domain)

  # NB: do not relativize path, because Ruby load path != cwd,
  # stay absolute for `require` and `load`

  Dir[File.join(@root, '**/*.json')]
    .select { |f| f.index('/lib/hooks/') }
    .collect { |pa| [ pa, expose_d(pa, {}) ] }
    .select { |pa, d| Flor.sub_domain?(d, domain) }
    .sort_by { |pa, d| d.count('.') }
    .collect { |pa, d|
      eval_hook_conf(pa, {})
        .each_with_index { |h, i| h['_path'] = "#{pa}:#{i}" } }
    .flatten(1)
end

#library(domain, name = nil, opts = {}) ⇒ Object

If found, returns [ source_path, path ]



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/flor/unit/loader.rb', line 60

def library(domain, name=nil, opts={})

  domain, name, opts = [ domain, nil, name ] if name.is_a?(Hash)
  domain, name = split_dn(domain, name)

  if m = name.match(/(\.flor?)\z/)
    name = name[0..m[1].length - 1]
  end

  path, _, _ = (Dir[File.join(@root, '**/*.{flo,flor}')])
    .select { |f| f.index('/lib/') }
    .collect { |pa| [ pa, *expose_dn(pa, opts) ] }
    .select { |pa, d, n| n == name && Flor.sub_domain?(d, domain) }
    .sort_by { |pa, d, n| d.count('.') }
    .last

  path ? [ Flor.relativize_path(path), File.read(path) ] : nil
end

#load_hooks(exid) ⇒ Object



130
131
132
133
134
# File 'lib/flor/unit/loader.rb', line 130

def load_hooks(exid)

  hooks(Flor.domain(exid))
    .collect { |h| Flor::Hook.new(@unit, exid, h) }
end

#tasker(domain, name, message = {}) ⇒ Object



79
80
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
110
111
112
# File 'lib/flor/unit/loader.rb', line 79

def tasker(domain, name, message={})

  # NB: do not relativize path, because Ruby load path != cwd,
  # stay absolute for `require` and `load`

  domain, name = split_dn(domain, name)

  pat, _, nam = Dir[File.join(@root, '**/*.{json,rb}')]
    .select { |pa| pa.index('/lib/taskers/') }
    .collect { |pa| [ pa, *expose_dn(pa, {}) ] }
    .select { |pa, d, n|
      Flor.sub_domain?([ d, n ], domain) ||
      (n == name && Flor.sub_domain?(d, domain)) }
    .sort_by { |pa, d, n| d.count('.') }
    .last

  return nil unless pat

  conf = eval_tasker_conf(pat, message)

  return conf if nam == name

  cnf = conf[name]

  return nil unless cnf

  extras = conf.select { |_, v| ! v.is_a?(Hash) }
  extras['_path'] = pat

  (cnf.is_a?(Array) ? cnf : [ cnf ])
    .each { |h| h.merge!(extras) }

  cnf
end

#variables(domain) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/flor/unit/loader.rb', line 42

def variables(domain)

  Dir[File.join(@root, '**/*.json')]
    .select { |f| f.index('/etc/variables/') }
    .collect { |pa| [ pa, expose_d(pa, {}) ] }
    .select { |pa, d| Flor.sub_domain?(d, domain) }
    .sort_by { |pa, d| d.count('.') }
    .inject({}) { |vars, (pa, _)| vars.merge!(eval_variables(pa, {})) }
end