fusuma 2.4.1 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +32 -0
- data/bin/console +2 -2
- data/fusuma.gemspec +17 -18
- data/lib/fusuma/config/index.rb +17 -17
- data/lib/fusuma/config/searcher.rb +1 -1
- data/lib/fusuma/config/yaml_duplication_checker.rb +7 -7
- data/lib/fusuma/config.rb +17 -13
- data/lib/fusuma/device.rb +12 -12
- data/lib/fusuma/environment.rb +10 -10
- data/lib/fusuma/hash_support.rb +1 -1
- data/lib/fusuma/libinput_command.rb +18 -19
- data/lib/fusuma/multi_logger.rb +4 -4
- data/lib/fusuma/plugin/base.rb +6 -6
- data/lib/fusuma/plugin/buffers/buffer.rb +5 -4
- data/lib/fusuma/plugin/buffers/gesture_buffer.rb +6 -6
- data/lib/fusuma/plugin/buffers/timer_buffer.rb +2 -2
- data/lib/fusuma/plugin/detectors/detector.rb +5 -5
- data/lib/fusuma/plugin/detectors/hold_detector.rb +29 -29
- data/lib/fusuma/plugin/detectors/pinch_detector.rb +47 -47
- data/lib/fusuma/plugin/detectors/rotate_detector.rb +40 -40
- data/lib/fusuma/plugin/detectors/swipe_detector.rb +43 -43
- data/lib/fusuma/plugin/events/event.rb +11 -11
- data/lib/fusuma/plugin/events/records/gesture_record.rb +5 -5
- data/lib/fusuma/plugin/events/records/index_record.rb +5 -5
- data/lib/fusuma/plugin/events/records/record.rb +2 -2
- data/lib/fusuma/plugin/events/records/text_record.rb +1 -1
- data/lib/fusuma/plugin/executors/command_executor.rb +4 -4
- data/lib/fusuma/plugin/executors/executor.rb +3 -3
- data/lib/fusuma/plugin/filters/filter.rb +3 -3
- data/lib/fusuma/plugin/filters/libinput_device_filter.rb +12 -12
- data/lib/fusuma/plugin/inputs/input.rb +8 -8
- data/lib/fusuma/plugin/inputs/libinput_command_input.rb +13 -13
- data/lib/fusuma/plugin/inputs/timer_input.rb +3 -3
- data/lib/fusuma/plugin/manager.rb +58 -31
- data/lib/fusuma/plugin/parsers/libinput_gesture_parser.rb +10 -10
- data/lib/fusuma/plugin/parsers/parser.rb +3 -3
- data/lib/fusuma/string_support.rb +3 -3
- data/lib/fusuma/version.rb +1 -1
- data/lib/fusuma.rb +10 -10
- metadata +3 -79
- data/spec/helpers/config_helper.rb +0 -20
- data/spec/lib/config/searcher_spec.rb +0 -179
- data/spec/lib/config_spec.rb +0 -104
- data/spec/lib/custom_process_spec.rb +0 -29
- data/spec/lib/device_spec.rb +0 -96
- data/spec/lib/dummy_config.yml +0 -31
- data/spec/lib/fusuma_spec.rb +0 -103
- data/spec/lib/libinput-list-devices_iberianpig-XPS-9360.txt +0 -181
- data/spec/lib/libinput-list-devices_magic_trackpad.txt +0 -51
- data/spec/lib/libinput-list-devices_razer_razer_blade.txt +0 -252
- data/spec/lib/libinput-list-devices_thejinx0r.txt +0 -361
- data/spec/lib/libinput-list-devices_unavailable.txt +0 -36
- data/spec/lib/libinput_command_spec.rb +0 -164
- data/spec/lib/plugin/base_spec.rb +0 -74
- data/spec/lib/plugin/buffers/buffer_spec.rb +0 -80
- data/spec/lib/plugin/buffers/dummy_buffer.rb +0 -20
- data/spec/lib/plugin/buffers/gesture_buffer_spec.rb +0 -192
- data/spec/lib/plugin/detectors/detector_spec.rb +0 -43
- data/spec/lib/plugin/detectors/dummy_detector.rb +0 -24
- data/spec/lib/plugin/detectors/hold_detector_spec.rb +0 -145
- data/spec/lib/plugin/detectors/pinch_detector_spec.rb +0 -119
- data/spec/lib/plugin/detectors/rotate_detector_spec.rb +0 -125
- data/spec/lib/plugin/detectors/swipe_detector_spec.rb +0 -118
- data/spec/lib/plugin/events/event_spec.rb +0 -30
- data/spec/lib/plugin/events/records/gesture_record_spec.rb +0 -22
- data/spec/lib/plugin/events/records/record_spec.rb +0 -31
- data/spec/lib/plugin/events/records/text_record_spec.rb +0 -26
- data/spec/lib/plugin/executors/command_executor_spec.rb +0 -57
- data/spec/lib/plugin/executors/executor_spec.rb +0 -164
- data/spec/lib/plugin/filters/filter_spec.rb +0 -92
- data/spec/lib/plugin/filters/libinput_filter_spec.rb +0 -120
- data/spec/lib/plugin/inputs/input_spec.rb +0 -70
- data/spec/lib/plugin/inputs/libinput_command_input_spec.rb +0 -121
- data/spec/lib/plugin/inputs/timer_input_spec.rb +0 -40
- data/spec/lib/plugin/manager_spec.rb +0 -27
- data/spec/lib/plugin/parsers/libinput_gesture_parser_spec.rb +0 -76
- data/spec/lib/plugin/parsers/parser_spec.rb +0 -45
- data/spec/spec_helper.rb +0 -23
| @@ -1,118 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require './lib/fusuma/plugin/detectors/swipe_detector'
         | 
| 6 | 
            -
            require './lib/fusuma/plugin/buffers/gesture_buffer'
         | 
| 7 | 
            -
            require './lib/fusuma/plugin/events/records/gesture_record'
         | 
| 8 | 
            -
            require './lib/fusuma/config'
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            module Fusuma
         | 
| 11 | 
            -
              module Plugin
         | 
| 12 | 
            -
                module Detectors
         | 
| 13 | 
            -
                  RSpec.describe SwipeDetector do
         | 
| 14 | 
            -
                    before do
         | 
| 15 | 
            -
                      @detector = SwipeDetector.new
         | 
| 16 | 
            -
                      @buffer = Buffers::GestureBuffer.new
         | 
| 17 | 
            -
                    end
         | 
| 18 | 
            -
             | 
| 19 | 
            -
                    around do |example|
         | 
| 20 | 
            -
                      ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 21 | 
            -
                        threshold:
         | 
| 22 | 
            -
                          swipe: 1
         | 
| 23 | 
            -
                      CONFIG
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                      example.run
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                      Config.custom_path = nil
         | 
| 28 | 
            -
                    end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                    describe '#detect' do
         | 
| 31 | 
            -
                      context 'with no swipe event in buffer' do
         | 
| 32 | 
            -
                        before do
         | 
| 33 | 
            -
                          @buffer.clear
         | 
| 34 | 
            -
                        end
         | 
| 35 | 
            -
                        it { expect(@detector.detect([@buffer])).to eq nil }
         | 
| 36 | 
            -
                      end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                      context 'with not enough swipe events in buffer' do
         | 
| 39 | 
            -
                        before do
         | 
| 40 | 
            -
                          deltas = [
         | 
| 41 | 
            -
                            Events::Records::GestureRecord::Delta.new(0,  0, 0, 0, 0, 0), # begin
         | 
| 42 | 
            -
                            Events::Records::GestureRecord::Delta.new(20, 0, 0, 0, 0, 0)  # update
         | 
| 43 | 
            -
                          ]
         | 
| 44 | 
            -
                          events = create_events(deltas: deltas)
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                          events.each { |event| @buffer.buffer(event) }
         | 
| 47 | 
            -
                        end
         | 
| 48 | 
            -
                        it 'should have repeat record' do
         | 
| 49 | 
            -
                          event = @detector.detect([@buffer])
         | 
| 50 | 
            -
                          expect(event.record.trigger).to eq :repeat
         | 
| 51 | 
            -
                        end
         | 
| 52 | 
            -
                      end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                      context 'with enough swipe RIGHT event' do
         | 
| 55 | 
            -
                        before do
         | 
| 56 | 
            -
                          deltas = [
         | 
| 57 | 
            -
                            Events::Records::GestureRecord::Delta.new(0,  0, 0, 0, 0, 0), # begin
         | 
| 58 | 
            -
                            Events::Records::GestureRecord::Delta.new(0,  0, 0, 0, 0, 0), # update
         | 
| 59 | 
            -
                            Events::Records::GestureRecord::Delta.new(31, 0, 0, 0, 0, 0)  # update
         | 
| 60 | 
            -
                          ]
         | 
| 61 | 
            -
                          events = create_events(deltas: deltas)
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                          events.each { |event| @buffer.buffer(event) }
         | 
| 64 | 
            -
                        end
         | 
| 65 | 
            -
                        it { expect(@detector.detect([@buffer])).to all be_a Events::Event }
         | 
| 66 | 
            -
                        it { expect(@detector.detect([@buffer]).map(&:record)).to all be_a Events::Records::IndexRecord }
         | 
| 67 | 
            -
                        it { expect(@detector.detect([@buffer]).map(&:record).map(&:index)).to all be_a Config::Index }
         | 
| 68 | 
            -
                        it 'should detect 3 fingers swipe-right' do
         | 
| 69 | 
            -
                          events = @detector.detect([@buffer])
         | 
| 70 | 
            -
                          expect(events[0].record.index.keys.map(&:symbol))
         | 
| 71 | 
            -
                            .to eq([:swipe, 3, :right])
         | 
| 72 | 
            -
                          expect(events[1].record.index.keys.map(&:symbol))
         | 
| 73 | 
            -
                            .to eq([:swipe, 3, :right, :update])
         | 
| 74 | 
            -
                        end
         | 
| 75 | 
            -
                      end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                      context 'with enough swipe DOWN event' do
         | 
| 78 | 
            -
                        before do
         | 
| 79 | 
            -
                          deltas = [
         | 
| 80 | 
            -
                            Events::Records::GestureRecord::Delta.new(0, 0, 0, 0),
         | 
| 81 | 
            -
                            Events::Records::GestureRecord::Delta.new(0, 0, 0, 0),
         | 
| 82 | 
            -
                            Events::Records::GestureRecord::Delta.new(0, 31, 0, 0)
         | 
| 83 | 
            -
                          ]
         | 
| 84 | 
            -
                          events = create_events(deltas: deltas)
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                          events.each { |event| @buffer.buffer(event) }
         | 
| 87 | 
            -
                        end
         | 
| 88 | 
            -
                        it 'should detect 3 fingers swipe-down' do
         | 
| 89 | 
            -
                          events = @detector.detect([@buffer])
         | 
| 90 | 
            -
                          expect(events[0].record.index.keys.map(&:symbol))
         | 
| 91 | 
            -
                            .to eq([:swipe, 3, :down])
         | 
| 92 | 
            -
                          expect(events[1].record.index.keys.map(&:symbol))
         | 
| 93 | 
            -
                            .to eq([:swipe, 3, :down, :update])
         | 
| 94 | 
            -
                        end
         | 
| 95 | 
            -
                      end
         | 
| 96 | 
            -
                    end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                    private
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                    def create_events(deltas: [])
         | 
| 101 | 
            -
                      record_type = SwipeDetector::GESTURE_RECORD_TYPE
         | 
| 102 | 
            -
                      deltas.map do |delta|
         | 
| 103 | 
            -
                        status = if deltas[0].equal? delta
         | 
| 104 | 
            -
                                   'begin'
         | 
| 105 | 
            -
                                 else
         | 
| 106 | 
            -
                                   'update'
         | 
| 107 | 
            -
                                 end
         | 
| 108 | 
            -
                        gesture_record = Events::Records::GestureRecord.new(status: status,
         | 
| 109 | 
            -
                                                                            gesture: record_type,
         | 
| 110 | 
            -
                                                                            finger: 3,
         | 
| 111 | 
            -
                                                                            delta: delta)
         | 
| 112 | 
            -
                        Events::Event.new(tag: 'libinput_gesture_parser', record: gesture_record)
         | 
| 113 | 
            -
                      end
         | 
| 114 | 
            -
                    end
         | 
| 115 | 
            -
                  end
         | 
| 116 | 
            -
                end
         | 
| 117 | 
            -
              end
         | 
| 118 | 
            -
            end
         | 
| @@ -1,30 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require './lib/fusuma/plugin/events/event'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Fusuma
         | 
| 7 | 
            -
              module Plugin
         | 
| 8 | 
            -
                module Events
         | 
| 9 | 
            -
                  RSpec.describe Event do
         | 
| 10 | 
            -
                    let(:event) { Event.new(**args) }
         | 
| 11 | 
            -
                    let(:args) { { tag: 'text', record: 'dummy_text' } }
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                    class DummyRecord < Records::Record
         | 
| 14 | 
            -
                    end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                    describe '#record' do
         | 
| 17 | 
            -
                      context 'with text' do
         | 
| 18 | 
            -
                        it { expect(event.record).to be_a Records::Record }
         | 
| 19 | 
            -
                      end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                      context 'with Record' do
         | 
| 22 | 
            -
                        let(:args) { { tag: 'dummy_record', record: DummyRecord.new } }
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                        it { expect(event.record).to be_a Records::Record }
         | 
| 25 | 
            -
                      end
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
                end
         | 
| 29 | 
            -
              end
         | 
| 30 | 
            -
            end
         | 
| @@ -1,22 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require './lib/fusuma/plugin/events/records/gesture_record'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Fusuma
         | 
| 7 | 
            -
              module Plugin
         | 
| 8 | 
            -
                module Events
         | 
| 9 | 
            -
                  module Records
         | 
| 10 | 
            -
                    RSpec.describe GestureRecord do
         | 
| 11 | 
            -
                      let(:record) do
         | 
| 12 | 
            -
                        described_class.new(status: 'updating',
         | 
| 13 | 
            -
                                            gesture: 'swipe',
         | 
| 14 | 
            -
                                            finger: 3,
         | 
| 15 | 
            -
                                            direction: direction)
         | 
| 16 | 
            -
                      end
         | 
| 17 | 
            -
                      let(:direction) { GestureRecord::Delta.new(0, 0, 1, 0) }
         | 
| 18 | 
            -
                    end
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
                end
         | 
| 21 | 
            -
              end
         | 
| 22 | 
            -
            end
         | 
| @@ -1,31 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require './lib/fusuma/plugin/events/records/record'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Fusuma
         | 
| 7 | 
            -
              module Plugin
         | 
| 8 | 
            -
                module Events
         | 
| 9 | 
            -
                  module Records
         | 
| 10 | 
            -
                    RSpec.describe Record do
         | 
| 11 | 
            -
                      class DummyRecord < Records::Record
         | 
| 12 | 
            -
                        def type
         | 
| 13 | 
            -
                          :dummy
         | 
| 14 | 
            -
                        end
         | 
| 15 | 
            -
                      end
         | 
| 16 | 
            -
                      let(:record) { described_class.new }
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                      describe '#type' do
         | 
| 19 | 
            -
                        it { expect { record.type }.to raise_error(NotImplementedError) }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                        context 'override #type' do
         | 
| 22 | 
            -
                          let(:record) { DummyRecord.new }
         | 
| 23 | 
            -
                          it { expect { record.type }.not_to raise_error(NotImplementedError) }
         | 
| 24 | 
            -
                          it { expect(record.type).to eq :dummy }
         | 
| 25 | 
            -
                        end
         | 
| 26 | 
            -
                      end
         | 
| 27 | 
            -
                    end
         | 
| 28 | 
            -
                  end
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
            end
         | 
| @@ -1,26 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require './lib/fusuma/plugin/events/records/text_record'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Fusuma
         | 
| 7 | 
            -
              module Plugin
         | 
| 8 | 
            -
                module Events
         | 
| 9 | 
            -
                  module Records
         | 
| 10 | 
            -
                    RSpec.describe TextRecord do
         | 
| 11 | 
            -
                      let(:record) { described_class.new('this is dummy') }
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                      describe '#type' do
         | 
| 14 | 
            -
                        subject { record.type }
         | 
| 15 | 
            -
                        it { is_expected.to eq :text }
         | 
| 16 | 
            -
                      end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                      describe '#to_s' do
         | 
| 19 | 
            -
                        subject { record.to_s }
         | 
| 20 | 
            -
                        it { is_expected.to eq 'this is dummy' }
         | 
| 21 | 
            -
                      end
         | 
| 22 | 
            -
                    end
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
                end
         | 
| 25 | 
            -
              end
         | 
| 26 | 
            -
            end
         | 
| @@ -1,57 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require './lib/fusuma/plugin/executors/command_executor'
         | 
| 5 | 
            -
            require './lib/fusuma/plugin/events/event'
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            module Fusuma
         | 
| 8 | 
            -
              module Plugin
         | 
| 9 | 
            -
                module Executors
         | 
| 10 | 
            -
                  RSpec.describe CommandExecutor do
         | 
| 11 | 
            -
                    before do
         | 
| 12 | 
            -
                      index = Config::Index.new([:dummy, 1, :direction])
         | 
| 13 | 
            -
                      record = Events::Records::IndexRecord.new(index: index)
         | 
| 14 | 
            -
                      @event = Events::Event.new(tag: 'dummy_detector', record: record)
         | 
| 15 | 
            -
                      @executor = CommandExecutor.new
         | 
| 16 | 
            -
                    end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                    around do |example|
         | 
| 19 | 
            -
                      ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 20 | 
            -
                        dummy:
         | 
| 21 | 
            -
                          1:
         | 
| 22 | 
            -
                            direction:
         | 
| 23 | 
            -
                              command: 'echo dummy'
         | 
| 24 | 
            -
                              interval: 1
         | 
| 25 | 
            -
                      CONFIG
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                      example.run
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                      Config.custom_path = nil
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                    describe '#execute' do
         | 
| 33 | 
            -
                      it 'spawn' do
         | 
| 34 | 
            -
                        command = 'echo dummy'
         | 
| 35 | 
            -
                        env = {}
         | 
| 36 | 
            -
                        expect(Process).to receive(:spawn).with(env, command)
         | 
| 37 | 
            -
                        expect(Process).to receive(:detach).with(anything)
         | 
| 38 | 
            -
                        @executor.execute(@event)
         | 
| 39 | 
            -
                      end
         | 
| 40 | 
            -
                    end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                    describe '#executable?' do
         | 
| 43 | 
            -
                      context 'detector is matched with config file' do
         | 
| 44 | 
            -
                        it { expect(@executor.executable?(@event)).to be_truthy }
         | 
| 45 | 
            -
                      end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                      context 'detector is NOT matched with config file' do
         | 
| 48 | 
            -
                        before do
         | 
| 49 | 
            -
                          @event.tag = 'invalid'
         | 
| 50 | 
            -
                        end
         | 
| 51 | 
            -
                        it { expect(@executor.executable?(@event)).to be_falsey }
         | 
| 52 | 
            -
                      end
         | 
| 53 | 
            -
                    end
         | 
| 54 | 
            -
                  end
         | 
| 55 | 
            -
                end
         | 
| 56 | 
            -
              end
         | 
| 57 | 
            -
            end
         | 
| @@ -1,164 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require './lib/fusuma/config'
         | 
| 6 | 
            -
            require './lib/fusuma/plugin/executors/executor'
         | 
| 7 | 
            -
            require './lib/fusuma/plugin/detectors/detector'
         | 
| 8 | 
            -
            require './lib/fusuma/plugin/events/event'
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            module Fusuma
         | 
| 11 | 
            -
              module Plugin
         | 
| 12 | 
            -
                module Executors
         | 
| 13 | 
            -
                  RSpec.describe Executor do
         | 
| 14 | 
            -
                    before { @executor = Executor.new }
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                    describe '#execute_key' do
         | 
| 17 | 
            -
                      it { expect { @executor.execute_keys }.to raise_error(NotImplementedError) }
         | 
| 18 | 
            -
                    end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                    describe '#execute' do
         | 
| 21 | 
            -
                      it { expect { @executor.execute('dummy') }.to raise_error(NotImplementedError) }
         | 
| 22 | 
            -
                    end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                    describe '#executable?' do
         | 
| 25 | 
            -
                      it { expect { @executor.executable?('dummy') }.to raise_error(NotImplementedError) }
         | 
| 26 | 
            -
                    end
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                  class DummyExecutor < Executor
         | 
| 30 | 
            -
                    def execute_keys
         | 
| 31 | 
            -
                      [:dummy]
         | 
| 32 | 
            -
                    end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                    def execute(event)
         | 
| 35 | 
            -
                      index = Config::Index.new([*event.record.index.keys, :dummy])
         | 
| 36 | 
            -
                      content = Config.search(index)
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                      # stdout
         | 
| 39 | 
            -
                      puts content if executable?(event)
         | 
| 40 | 
            -
                    end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                    def executable?(event)
         | 
| 43 | 
            -
                      event.tag == 'dummy'
         | 
| 44 | 
            -
                    end
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                  RSpec.describe DummyExecutor do
         | 
| 48 | 
            -
                    before do
         | 
| 49 | 
            -
                      index = Config::Index.new([:dummy_gesture,
         | 
| 50 | 
            -
                                                 Config::Index::Key.new(:dummy_direction, skippable: true)])
         | 
| 51 | 
            -
                      record = Events::Records::IndexRecord.new(index: index)
         | 
| 52 | 
            -
                      @event = Events::Event.new(tag: 'dummy', record: record)
         | 
| 53 | 
            -
                      @executor = DummyExecutor.new
         | 
| 54 | 
            -
                    end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                    around do |example|
         | 
| 57 | 
            -
                      ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 58 | 
            -
                        dummy_gesture:
         | 
| 59 | 
            -
                          dummy_direction:
         | 
| 60 | 
            -
                            dummy: 'echo dummy'
         | 
| 61 | 
            -
                            interval: 0.3
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                        plugin:
         | 
| 64 | 
            -
                         executors:
         | 
| 65 | 
            -
                           dummy_executor:
         | 
| 66 | 
            -
                             dummy: dummy
         | 
| 67 | 
            -
                      CONFIG
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                      example.run
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                      Config.custom_path = nil
         | 
| 72 | 
            -
                    end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                    describe '#execute' do
         | 
| 75 | 
            -
                      it { expect { @executor.execute(@event) }.to output("echo dummy\n").to_stdout }
         | 
| 76 | 
            -
                      context 'without executable' do
         | 
| 77 | 
            -
                        before do
         | 
| 78 | 
            -
                          allow(@executor).to receive(:executable?).and_return false
         | 
| 79 | 
            -
                        end
         | 
| 80 | 
            -
                        it { expect { @executor.execute(@event) }.not_to output("echo dummy\n").to_stdout }
         | 
| 81 | 
            -
                      end
         | 
| 82 | 
            -
                    end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                    describe '#executable?' do
         | 
| 85 | 
            -
                      it { expect(@executor.executable?(@event)).to be_truthy }
         | 
| 86 | 
            -
                    end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                    describe 'interval' do
         | 
| 89 | 
            -
                      it 'should return interval from Config' do
         | 
| 90 | 
            -
                        interval_time = 0.3 * DummyExecutor::BASE_ONESHOT_INTERVAL
         | 
| 91 | 
            -
                        expect(@executor.interval(@event)).to eq interval_time
         | 
| 92 | 
            -
                      end
         | 
| 93 | 
            -
             | 
| 94 | 
            -
                      context 'without skippable direction' do
         | 
| 95 | 
            -
                        around do |example|
         | 
| 96 | 
            -
                          ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 97 | 
            -
                            dummy_gesture:
         | 
| 98 | 
            -
                              interval: 0.1
         | 
| 99 | 
            -
                              dummy_direction:
         | 
| 100 | 
            -
                                dummy: 'echo dummy'
         | 
| 101 | 
            -
             | 
| 102 | 
            -
                            plugin:
         | 
| 103 | 
            -
                             executors:
         | 
| 104 | 
            -
                               dummy_executor:
         | 
| 105 | 
            -
                                 dummy: dummy
         | 
| 106 | 
            -
                          CONFIG
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                          example.run
         | 
| 109 | 
            -
             | 
| 110 | 
            -
                          Config.custom_path = nil
         | 
| 111 | 
            -
                        end
         | 
| 112 | 
            -
                        it 'should not return parent interval' do
         | 
| 113 | 
            -
                          expect(@executor.interval(@event)).to eq DummyExecutor::BASE_ONESHOT_INTERVAL
         | 
| 114 | 
            -
                          expect(@executor.interval(@event)).not_to eq 0.1 * DummyExecutor::BASE_ONESHOT_INTERVAL
         | 
| 115 | 
            -
                        end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
                        context 'with Config::Searcher.skip' do
         | 
| 118 | 
            -
                          it 'should return parent interval' do
         | 
| 119 | 
            -
                            Config::Searcher.skip do
         | 
| 120 | 
            -
                              expect(@executor.interval(@event)).to eq 0.1 * DummyExecutor::BASE_ONESHOT_INTERVAL
         | 
| 121 | 
            -
                            end
         | 
| 122 | 
            -
                          end
         | 
| 123 | 
            -
                        end
         | 
| 124 | 
            -
                      end
         | 
| 125 | 
            -
                    end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                    describe 'enough_interval?' do
         | 
| 128 | 
            -
                      it 'should return true at first time' do
         | 
| 129 | 
            -
                        expect(@executor.enough_interval?(@event)).to eq true
         | 
| 130 | 
            -
                      end
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                      context 'after update_interval' do
         | 
| 133 | 
            -
                        before do
         | 
| 134 | 
            -
                          @executor.update_interval(@event)
         | 
| 135 | 
            -
                        end
         | 
| 136 | 
            -
                        it 'should return false' do
         | 
| 137 | 
            -
                          expect(@executor.enough_interval?(@event)).to eq false
         | 
| 138 | 
            -
                        end
         | 
| 139 | 
            -
             | 
| 140 | 
            -
                        context 'after wait interval time' do
         | 
| 141 | 
            -
                          before do
         | 
| 142 | 
            -
                            # dummy_gesture/dummy_direction/interval => 0.3
         | 
| 143 | 
            -
                            interval_time = 0.3 * DummyExecutor::BASE_ONESHOT_INTERVAL
         | 
| 144 | 
            -
             | 
| 145 | 
            -
                            @event2 = Events::Event.new(
         | 
| 146 | 
            -
                              time: @event.time + interval_time,
         | 
| 147 | 
            -
                              tag: 'dummy',
         | 
| 148 | 
            -
                              record: @event.record
         | 
| 149 | 
            -
                            )
         | 
| 150 | 
            -
                          end
         | 
| 151 | 
            -
                          it 'should return true after wait' do
         | 
| 152 | 
            -
                            expect(@executor.enough_interval?(@event2)).to eq true
         | 
| 153 | 
            -
                          end
         | 
| 154 | 
            -
                        end
         | 
| 155 | 
            -
                      end
         | 
| 156 | 
            -
                    end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                    describe '#config_params' do
         | 
| 159 | 
            -
                      it { expect(@executor.config_params).to eq(dummy: 'dummy') }
         | 
| 160 | 
            -
                    end
         | 
| 161 | 
            -
                  end
         | 
| 162 | 
            -
                end
         | 
| 163 | 
            -
              end
         | 
| 164 | 
            -
            end
         | 
| @@ -1,92 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require 'tempfile'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            require './lib/fusuma/config'
         | 
| 7 | 
            -
            require './lib/fusuma/plugin/filters/filter'
         | 
| 8 | 
            -
            require './lib/fusuma/plugin/events/event'
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            module Fusuma
         | 
| 11 | 
            -
              module Plugin
         | 
| 12 | 
            -
                module Filters
         | 
| 13 | 
            -
                  class DummyFilter < Filter
         | 
| 14 | 
            -
                    DEFAULT_SOURCE = 'dummy_input'
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                    def config_param_types
         | 
| 17 | 
            -
                      {
         | 
| 18 | 
            -
                        source: String
         | 
| 19 | 
            -
                      }
         | 
| 20 | 
            -
                    end
         | 
| 21 | 
            -
                  end
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  RSpec.describe DummyFilter do
         | 
| 24 | 
            -
                    let(:filter) { DummyFilter.new }
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                    describe '#source' do
         | 
| 27 | 
            -
                      subject { filter.source }
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                      it { is_expected.to eq DummyFilter::DEFAULT_SOURCE }
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                      context 'with config' do
         | 
| 32 | 
            -
                        around do |example|
         | 
| 33 | 
            -
                          @custom_source = 'custom_input'
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                          ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 36 | 
            -
                            plugin:
         | 
| 37 | 
            -
                             filters:
         | 
| 38 | 
            -
                               dummy_filter:
         | 
| 39 | 
            -
                                 source: #{@custom_source}
         | 
| 40 | 
            -
                          CONFIG
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                          example.run
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                          Config.custom_path = nil
         | 
| 45 | 
            -
                        end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                        it { is_expected.to eq @custom_source }
         | 
| 48 | 
            -
                      end
         | 
| 49 | 
            -
                    end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                    describe '#filter' do
         | 
| 52 | 
            -
                      subject { filter.filter(event) }
         | 
| 53 | 
            -
                      let(:event) { Events::Event.new(tag: 'dummy_input', record: 'dummy') }
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                      context 'when filter#keep? return false' do
         | 
| 56 | 
            -
                        before do
         | 
| 57 | 
            -
                          allow(filter).to receive(:keep?).and_return(false)
         | 
| 58 | 
            -
                        end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                        it { is_expected.to be nil }
         | 
| 61 | 
            -
                      end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                      context 'when filter#keep? return true' do
         | 
| 64 | 
            -
                        before do
         | 
| 65 | 
            -
                          allow(filter).to receive(:keep?).and_return(true)
         | 
| 66 | 
            -
                        end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                        it { is_expected.to be event }
         | 
| 69 | 
            -
                      end
         | 
| 70 | 
            -
                    end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                    describe '#config_params' do
         | 
| 73 | 
            -
                      around do |example|
         | 
| 74 | 
            -
                        ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 75 | 
            -
                          plugin:
         | 
| 76 | 
            -
                           filters:
         | 
| 77 | 
            -
                             dummy_filter:
         | 
| 78 | 
            -
                               dummy: dummy
         | 
| 79 | 
            -
                        CONFIG
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                        example.run
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                        Config.custom_path = nil
         | 
| 84 | 
            -
                      end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                      subject { filter.config_params }
         | 
| 87 | 
            -
                      it { is_expected.to eq(dummy: 'dummy') }
         | 
| 88 | 
            -
                    end
         | 
| 89 | 
            -
                  end
         | 
| 90 | 
            -
                end
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
            end
         | 
| @@ -1,120 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require 'spec_helper'
         | 
| 4 | 
            -
            require 'tempfile'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            require './lib/fusuma/config'
         | 
| 7 | 
            -
            require './lib/fusuma/plugin/filters/libinput_device_filter'
         | 
| 8 | 
            -
            require './lib/fusuma/plugin/events/event'
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            module Fusuma
         | 
| 11 | 
            -
              module Plugin
         | 
| 12 | 
            -
                module Filters
         | 
| 13 | 
            -
                  RSpec.describe LibinputDeviceFilter do
         | 
| 14 | 
            -
                    before do
         | 
| 15 | 
            -
                      @filter = LibinputDeviceFilter.new
         | 
| 16 | 
            -
                    end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                    describe '#source' do
         | 
| 19 | 
            -
                      it { expect(@filter.source).to eq LibinputDeviceFilter::DEFAULT_SOURCE }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                      context 'with config' do
         | 
| 22 | 
            -
                        around do |example|
         | 
| 23 | 
            -
                          @custom_source = 'custom_input'
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                          ConfigHelper.load_config_yml = <<~CONFIG
         | 
| 26 | 
            -
                            plugin:
         | 
| 27 | 
            -
                             filters:
         | 
| 28 | 
            -
                               libinput_device_filter:
         | 
| 29 | 
            -
                                 source: #{@custom_source}
         | 
| 30 | 
            -
                          CONFIG
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                          example.run
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                          Config.custom_path = nil
         | 
| 35 | 
            -
                        end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                        it { expect(@filter.source).to eq @custom_source }
         | 
| 38 | 
            -
                      end
         | 
| 39 | 
            -
                    end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                    describe '#filter' do
         | 
| 42 | 
            -
                      before do
         | 
| 43 | 
            -
                        @event = Events::Event.new(tag: 'libinput_command_input', record: 'dummy')
         | 
| 44 | 
            -
                      end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                      context 'when filter#keep? return false' do
         | 
| 47 | 
            -
                        before do
         | 
| 48 | 
            -
                          allow(@filter).to receive(:keep?).and_return(false)
         | 
| 49 | 
            -
                        end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                        it { expect(@filter.filter(@event)).to be nil }
         | 
| 52 | 
            -
                      end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                      context 'when filter#keep? return true' do
         | 
| 55 | 
            -
                        before do
         | 
| 56 | 
            -
                          allow(@filter).to receive(:keep?).and_return(true)
         | 
| 57 | 
            -
                        end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                        it { expect(@filter.filter(@event)).to be @event }
         | 
| 60 | 
            -
                      end
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                    describe '#keep?' do
         | 
| 64 | 
            -
                      before do
         | 
| 65 | 
            -
                        device = Device.new(id: 'event18', name: 'Awesome Touchpad', available: true)
         | 
| 66 | 
            -
                        allow(Device).to receive(:all).and_return([device])
         | 
| 67 | 
            -
                        @keep_device = LibinputDeviceFilter::KeepDevice.new(name_patterns: [])
         | 
| 68 | 
            -
                        allow(@filter).to receive(:keep_device).and_return(@keep_device)
         | 
| 69 | 
            -
                      end
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                      context 'when including record generated from touchpad' do
         | 
| 72 | 
            -
                        before do
         | 
| 73 | 
            -
                          text = ' event18  GESTURE_SWIPE_UPDATE  +1.44s  4 11.23/ 1.00 (36.91/ 3.28 unaccelerated) '
         | 
| 74 | 
            -
                          @event = Events::Event.new(tag: 'libinput_command_input', record: text)
         | 
| 75 | 
            -
                        end
         | 
| 76 | 
            -
                        it 'should keep record' do
         | 
| 77 | 
            -
                          expect(@filter.keep?(@event.record)).to be true
         | 
| 78 | 
            -
                        end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                        context 'when including -' do
         | 
| 81 | 
            -
                          before do
         | 
| 82 | 
            -
                            text = '-event18  GESTURE_SWIPE_UPDATE  +1.44s  4 11.23/ 1.00 (36.91/ 3.28 unaccelerated) '
         | 
| 83 | 
            -
                            @event = Events::Event.new(tag: 'libinput_command_input', record: text)
         | 
| 84 | 
            -
                          end
         | 
| 85 | 
            -
                          it 'should keep record' do
         | 
| 86 | 
            -
                            expect(@filter.keep?(@event.record)).to be true
         | 
| 87 | 
            -
                          end
         | 
| 88 | 
            -
                        end
         | 
| 89 | 
            -
                      end
         | 
| 90 | 
            -
                      context 'when new device is added' do
         | 
| 91 | 
            -
                        before do
         | 
| 92 | 
            -
                          text = '-event18 DEVICE_ADDED Apple Wireless Trackpad seat0 default group13 cap:pg size 132x112mm tap(dl off) left scroll-nat scroll-2fg-edge click-buttonareas-clickfing '
         | 
| 93 | 
            -
                          @event = Events::Event.new(tag: 'libinput_command_input', record: text)
         | 
| 94 | 
            -
                        end
         | 
| 95 | 
            -
                        it 'should reset KeepDevice' do
         | 
| 96 | 
            -
                          expect(@keep_device).to receive(:reset)
         | 
| 97 | 
            -
                          @filter.keep?(@event.record)
         | 
| 98 | 
            -
                        end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                        it 'discard DEVICE_ADDED record' do
         | 
| 101 | 
            -
                          expect(@filter.keep?(@event.record)).to be false
         | 
| 102 | 
            -
                        end
         | 
| 103 | 
            -
             | 
| 104 | 
            -
                        context 'when keep device is NOT matched' do
         | 
| 105 | 
            -
                          before do
         | 
| 106 | 
            -
                            @keep_device = LibinputDeviceFilter::KeepDevice.new(name_patterns: ['Microsoft Arc Mouse'])
         | 
| 107 | 
            -
                            allow(@filter).to receive(:keep_device).and_return(@keep_device)
         | 
| 108 | 
            -
                          end
         | 
| 109 | 
            -
                          it 'should NOT reset KeepDevice' do
         | 
| 110 | 
            -
                            expect(@keep_device).not_to receive(:reset)
         | 
| 111 | 
            -
                            # NOTE: @event.record is 'Apple Wireless Touchpad'
         | 
| 112 | 
            -
                            @filter.keep?(@event.record)
         | 
| 113 | 
            -
                          end
         | 
| 114 | 
            -
                        end
         | 
| 115 | 
            -
                      end
         | 
| 116 | 
            -
                    end
         | 
| 117 | 
            -
                  end
         | 
| 118 | 
            -
                end
         | 
| 119 | 
            -
              end
         | 
| 120 | 
            -
            end
         |