lib/fusuma.rb in fusuma-1.2.1 vs lib/fusuma.rb in fusuma-1.3.0

- old
+ new

@@ -31,39 +31,38 @@ load_custom_config(option[:config_path]) Plugin::Manager.require_plugins_from_relative Plugin::Manager.require_plugins_from_config - print_version(then_exit: option[:version]) + print_version print_enabled_plugins + Kernel.exit(0) if option[:version] print_device_list if option[:list] # TODO: remove keep_device_from_option from command line options Plugin::Filters::LibinputDeviceFilter::KeepDevice.from_option = option[:device] Process.daemon if option[:daemon] end - # TODO: print after reading plugins - def print_version(then_exit: false) + def print_version MultiLogger.info '---------------------------------------------' MultiLogger.info "Fusuma: #{Fusuma::VERSION}" MultiLogger.info "libinput: #{Plugin::Inputs::LibinputCommandInput.new.version}" MultiLogger.info "OS: #{`uname -rsv`}".strip MultiLogger.info "Distribution: #{`cat /etc/issue`}".strip MultiLogger.info "Desktop session: #{`echo $DESKTOP_SESSION`}".strip MultiLogger.info '---------------------------------------------' - Kernel.exit(0) if then_exit end def print_enabled_plugins - MultiLogger.debug '---------------------------------------------' - MultiLogger.debug 'Enabled Plugins: ' + MultiLogger.info '---------------------------------------------' + MultiLogger.info 'Enabled Plugins: ' Plugin::Manager.plugins .reject { |k, _v| k.to_s =~ /Base/ } .map { |_base, plugins| plugins.map { |plugin| " #{plugin}" } } - .flatten.sort.each { |name| MultiLogger.debug name } - MultiLogger.debug '---------------------------------------------' + .flatten.sort.each { |name| MultiLogger.info(name) } + MultiLogger.info '---------------------------------------------' end def print_device_list puts Device.available.map(&:name) exit(0) @@ -72,15 +71,10 @@ def load_custom_config(config_path = nil) return unless config_path Config.custom_path = config_path end - - def debug_mode - MultiLogger.instance.debug_mode = true - print_version - end end def initialize @inputs = Plugin::Inputs::Input.plugins.map(&:new) @filters = Plugin::Filters::Filter.plugins.map(&:new) @@ -95,48 +89,56 @@ @inputs.first.run do |event| filtered = filter(event) parsed = parse(filtered) buffered = buffer(parsed) detected = detect(buffered) - execute(detected) + merged = merge(detected) + execute(merged) end end def filter(event) - @filters.reduce(event) { |e, f| f.filter(e) if e } + event if @filters.any? { |f| f.filter(event) } end def parse(event) - @parsers.reduce(event) { |e, p| p.parse(e) if e } + @parsers.reduce(event) { |e, p| p.parse(e) if e } end def buffer(event) @buffers.each { |b| b.buffer(event) } end # @param buffers [Array<Buffer>] - # @return [Event] if event is detected - # @return [NilClass] if event is NOT detected + # @return [Array<Event>] def detect(buffers) - @detectors.each_with_object([]) do |detector, index_records| - event = detector.detect(buffers) # event - - if event&.record&.mergable? - event.record.merge(records: index_records) - buffers.each(&:clear) # clear buffer - break(event) + @detectors.reduce([]) do |detected, detector| + if (event = detector.detect(buffers)) + detected << event + else + detected end - - break nil if @detectors.last == detector end end + # @param events [Array<Event>] + # @return [Event] a Event merged all records from arguments + # @return [NilClass] when event is NOT given + def merge(events) + main_events, modifiers = events.partition { |event| event.record.mergable? } + return nil unless (main_event = main_events.first) + + main_event.record.merge(records: modifiers.map(&:record)) + main_event + end + def execute(event) return unless event executor = @executors.find do |e| e.executable?(event) end + executor&.execute(event) end end end