-
Notifications
You must be signed in to change notification settings - Fork 120
/
Copy pathflow_registry.rb
74 lines (62 loc) · 1.72 KB
/
flow_registry.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
64
65
66
67
68
69
70
71
72
73
74
module SmartAnswer
class FlowRegistry
class NotFound < StandardError; end
FLOW_DIR = Rails.root.join('lib', 'smart_answer_flows')
def self.instance
@instance ||= new(FLOW_REGISTRY_OPTIONS)
end
def self.reset_instance
@instance = nil
end
def initialize(options = {})
@load_path = Pathname.new(options[:smart_answer_load_path] || FLOW_DIR)
@show_drafts = options.fetch(:show_drafts, false)
preload_flows! if Rails.env.production? || options[:preload_flows]
end
attr_reader :load_path
def find(name)
raise NotFound unless available?(name)
find_by_name(name) || raise(NotFound)
end
def flows
available_flows.map { |s| find_by_name(s) }.compact
end
def available_flows
Dir[@load_path.join('*.rb')].map do |path|
File.basename(path, ".rb")
end
end
private
def find_by_name(name)
flow = @preloaded ? preloaded(name) : build_flow(name)
return nil if flow && flow.draft? && !@show_drafts
flow
end
def available?(name)
if @preloaded
@preloaded.has_key?(name)
else
available_flows.include?(name)
end
end
def build_flow(name)
class_prefix = name.tr("-", "_").camelize
if Rails.env.development?
load @load_path.join("#{name}.rb")
else
require @load_path.join(name)
end
namespaced_class = "SmartAnswer::#{class_prefix}Flow".constantize
namespaced_class.build
end
def preload_flows!
@preloaded = {}
available_flows.each do |flow_name|
@preloaded[flow_name] = build_flow(flow_name)
end
end
def preloaded(name)
@preloaded && @preloaded[name]
end
end
end