class ServiceScan

This class loads ruby files and initializes the services specified inside of them

Attributes

base_dirs[R]

Public Class Methods

new(base_dirs = ["services"]) click to toggle source
# File lib/didit/service_scan.rb, line 9
def initialize(base_dirs = ["services"])
        @base_dirs = base_dirs
end

Public Instance Methods

run!() click to toggle source
# File lib/didit/service_scan.rb, line 13
def run!
        perform_initial_scan
        inject_single
        inject_lists
        post_construct_triggers
end

Private Instance Methods

add_attr_reader(service_instance, id, injectable) click to toggle source

Add a reader method to a service_instance

# File lib/didit/service_scan.rb, line 96
def add_attr_reader(service_instance, id, injectable)
        metaclass = class << service_instance; self; end

        metaclass.send(:define_method, id) do
                injectable
        end
end
get_multi_injects(service) click to toggle source

Return a list of multiple injects for a service

# File lib/didit/service_scan.rb, line 84
def get_multi_injects(service)
        puts service.inspect
        if not service[:requires] or service[:requires].empty?
                []
        else
                service[:requires].find_all { |req| req[:type] == "multiple" }
        end
end
get_single_inject(service) click to toggle source

Return a list of single injects for a service

# File lib/didit/service_scan.rb, line 73
def get_single_inject(service)
        if not service[:requires] or service[:requires].empty?
                []
        else
                service[:requires].find_all { |req| req[:type] == "one" }
        end
end
inject_lists() click to toggle source

Find injectables for the inject_list methods that have been specified

# File lib/didit/service_scan.rb, line 40
def inject_lists
        Didit::SERVICES.each do |(key, service)|
                get_multi_injects(service).each do |needs| 
                        puts ".. service #{service[:identifier]} requires #{needs[:id]}"

                        instances_list = Didit::services_with_base(needs[:id])
                        puts "INSTANCES: #{instances_list.inspect}"

                        service_instance = service[:class_instance]
                        add_attr_reader(service_instance, needs[:var_name], instances_list)
                end
        end

end
inject_single() click to toggle source

Find injectable that is to be bound to inject

# File lib/didit/service_scan.rb, line 58
def inject_single
        Didit::SERVICES.each do |(key, service)|
                get_single_inject(service).each do |needs| 
                        puts ".. service #{service[:identifier]} requires #{needs[:id]}"

                        injected_instance = Didit::service(needs[:id])
                        service_instance = service[:class_instance]
                        add_attr_reader(service_instance, needs[:id].to_sym, injected_instance)
                end
        end
end
perform_initial_scan() click to toggle source

Scan the specified folders and load them

# File lib/didit/service_scan.rb, line 107
def perform_initial_scan
        root_folder = Dir.pwd
        puts "From: #{root_folder}"

        @base_dirs.each do |dir|

                puts "Scanning #{dir}"

                Dir.chdir(dir)
                Dir.glob("**/*.rb") do |file|
                        load "./#{file}"
                end

                Dir.chdir(root_folder)
        end          
end
post_construct_triggers() click to toggle source

Run the post construct methods

# File lib/didit/service_scan.rb, line 26
def post_construct_triggers
        Didit::SERVICES.each do |(key, service)|
                if service[:post_config] then
                        service[:post_config].each do |method_name|
                                service[:class_instance].method(method_name).call
                        end
                end
        end

end