fusuma 2.0.0 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -22
  3. data/fusuma.gemspec +2 -4
  4. data/lib/fusuma.rb +11 -4
  5. data/lib/fusuma/config.rb +1 -1
  6. data/lib/fusuma/config/searcher.rb +1 -2
  7. data/lib/fusuma/environment.rb +1 -1
  8. data/lib/fusuma/libinput_command.rb +11 -11
  9. data/lib/fusuma/plugin/buffers/timer_buffer.rb +1 -3
  10. data/lib/fusuma/plugin/executors/command_executor.rb +10 -10
  11. data/lib/fusuma/plugin/executors/executor.rb +1 -1
  12. data/lib/fusuma/plugin/inputs/libinput_command_input.rb +9 -2
  13. data/lib/fusuma/plugin/manager.rb +3 -3
  14. data/lib/fusuma/version.rb +1 -1
  15. data/spec/helpers/config_helper.rb +20 -0
  16. data/spec/lib/config/searcher_spec.rb +179 -0
  17. data/spec/lib/config_spec.rb +104 -0
  18. data/spec/lib/custom_process_spec.rb +28 -0
  19. data/spec/lib/device_spec.rb +96 -0
  20. data/spec/lib/dummy_config.yml +31 -0
  21. data/spec/lib/fusuma_spec.rb +103 -0
  22. data/spec/lib/libinput-list-devices_iberianpig-XPS-9360.txt +181 -0
  23. data/spec/lib/libinput-list-devices_magic_trackpad.txt +51 -0
  24. data/spec/lib/libinput-list-devices_razer_razer_blade.txt +252 -0
  25. data/spec/lib/libinput-list-devices_thejinx0r.txt +361 -0
  26. data/spec/lib/libinput-list-devices_unavailable.txt +36 -0
  27. data/spec/lib/libinput_command_spec.rb +164 -0
  28. data/spec/lib/plugin/base_spec.rb +74 -0
  29. data/spec/lib/plugin/buffers/buffer_spec.rb +80 -0
  30. data/spec/lib/plugin/buffers/dummy_buffer.rb +20 -0
  31. data/spec/lib/plugin/buffers/gesture_buffer_spec.rb +172 -0
  32. data/spec/lib/plugin/detectors/detector_spec.rb +43 -0
  33. data/spec/lib/plugin/detectors/dummy_detector.rb +24 -0
  34. data/spec/lib/plugin/detectors/pinch_detector_spec.rb +119 -0
  35. data/spec/lib/plugin/detectors/rotate_detector_spec.rb +125 -0
  36. data/spec/lib/plugin/detectors/swipe_detector_spec.rb +118 -0
  37. data/spec/lib/plugin/events/event_spec.rb +30 -0
  38. data/spec/lib/plugin/events/records/gesture_record_spec.rb +22 -0
  39. data/spec/lib/plugin/events/records/record_spec.rb +31 -0
  40. data/spec/lib/plugin/events/records/text_record_spec.rb +26 -0
  41. data/spec/lib/plugin/executors/command_executor_spec.rb +57 -0
  42. data/spec/lib/plugin/executors/executor_spec.rb +164 -0
  43. data/spec/lib/plugin/filters/filter_spec.rb +92 -0
  44. data/spec/lib/plugin/filters/libinput_filter_spec.rb +120 -0
  45. data/spec/lib/plugin/inputs/input_spec.rb +70 -0
  46. data/spec/lib/plugin/inputs/libinput_command_input_spec.rb +121 -0
  47. data/spec/lib/plugin/inputs/timer_input_spec.rb +40 -0
  48. data/spec/lib/plugin/manager_spec.rb +27 -0
  49. data/spec/lib/plugin/parsers/parser_spec.rb +45 -0
  50. data/spec/spec_helper.rb +20 -0
  51. metadata +76 -35
  52. data/.github/FUNDING.yml +0 -8
  53. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  54. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -17
  55. data/.github/pull_request_template.md +0 -9
  56. data/.github/stale.yml +0 -18
  57. data/.gitignore +0 -17
  58. data/.reek.yml +0 -96
  59. data/.rspec +0 -2
  60. data/.rubocop.yml +0 -43
  61. data/.rubocop_todo.yml +0 -55
  62. data/.solargraph.yml +0 -16
  63. data/.travis.yml +0 -9
  64. data/CHANGELOG.md +0 -456
  65. data/CODE_OF_CONDUCT.md +0 -74
  66. data/CONTRIBUTING.md +0 -72
  67. data/Gemfile +0 -23
  68. data/Rakefile +0 -15
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require './lib/fusuma/plugin/events/event'
6
+ require './lib/fusuma/plugin/detectors/detector'
7
+ require './lib/fusuma/config'
8
+ require_relative '../buffers/dummy_buffer'
9
+ require_relative './dummy_detector'
10
+
11
+ module Fusuma
12
+ module Plugin
13
+ module Detectors
14
+ RSpec.describe DummyDetector do
15
+ before do
16
+ @detector = DummyDetector.new
17
+ @buffer = Buffers::DummyBuffer.new
18
+ end
19
+
20
+ around do |example|
21
+ ConfigHelper.load_config_yml = <<~CONFIG
22
+ plugin:
23
+ detectors:
24
+ dummy_detector:
25
+ dummy: dummy
26
+ CONFIG
27
+
28
+ example.run
29
+
30
+ ConfigHelper.clear_config_yml
31
+ end
32
+
33
+ describe '#detect' do
34
+ it { expect(@detector.detect([@buffer])).to be_a(Events::Event) }
35
+ end
36
+
37
+ describe '#config_params' do
38
+ it { expect(@detector.config_params).to eq(dummy: 'dummy') }
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './lib/fusuma/plugin/detectors/detector'
4
+ require './lib/fusuma/plugin/buffers/buffer'
5
+ require './lib/fusuma/plugin/events/records/index_record'
6
+
7
+ module Fusuma
8
+ module Plugin
9
+ module Detectors
10
+ class DummyDetector < Detector
11
+ # @param buffers [Array<Buffers::Buffer>]
12
+ # @return [Event]
13
+ def detect(buffers)
14
+ buffers.each do |buffer|
15
+ next unless buffer.type == 'dummy'
16
+
17
+ record = Events::Records::IndexRecord.new(index: Config::Index.new(%w[dummy index]))
18
+ return create_event(record: record)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require './lib/fusuma/plugin/detectors/pinch_detector'
6
+ require './lib/fusuma/plugin/buffers/gesture_buffer'
7
+ require './lib/fusuma/plugin/events/event'
8
+ require './lib/fusuma/config'
9
+
10
+ module Fusuma
11
+ module Plugin
12
+ module Detectors
13
+ RSpec.describe PinchDetector do
14
+ before do
15
+ @detector = PinchDetector.new
16
+ @buffer = Buffers::GestureBuffer.new
17
+ end
18
+
19
+ around do |example|
20
+ ConfigHelper.load_config_yml = <<~CONFIG
21
+ threshold:
22
+ rotate: 1
23
+ CONFIG
24
+
25
+ example.run
26
+
27
+ Config.custom_path = nil
28
+ end
29
+
30
+ describe '#detect' do
31
+ context 'with no pinch 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 pinch events in buffer' do
39
+ before do
40
+ deltas = [
41
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1, 0),
42
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.1, 0)
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
+ expect(@detector.detect([@buffer]).record.trigger).to eq :repeat
50
+ end
51
+ end
52
+
53
+ context 'with enough pinch IN event' do
54
+ before do
55
+ deltas = [
56
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.0, 0),
57
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.0, 0),
58
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 2.0, 0)
59
+ ]
60
+ events = create_events(deltas: deltas)
61
+
62
+ events.each { |event| @buffer.buffer(event) }
63
+ end
64
+ it { expect(@detector.detect([@buffer])).to all be_a Events::Event }
65
+ it { expect(@detector.detect([@buffer]).map(&:record)).to all be_a Events::Records::IndexRecord }
66
+ it { expect(@detector.detect([@buffer]).map(&:record).map(&:index)).to all be_a Config::Index }
67
+
68
+ it 'should detect 3 fingers pinch-in (oneshot/repeat)' do
69
+ events = @detector.detect([@buffer])
70
+ expect(events[0].record.index.keys.map(&:symbol))
71
+ .to eq([:pinch, 3, :in])
72
+ expect(events[1].record.index.keys.map(&:symbol))
73
+ .to eq([:pinch, 3, :in, :update])
74
+ end
75
+ end
76
+
77
+ context 'with enough pinch OUT event' do
78
+ before do
79
+ deltas = [
80
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 1.0, 0),
81
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0.6, 0),
82
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0.3, 0)
83
+ ]
84
+ events = create_events(deltas: deltas)
85
+
86
+ events.each { |event| @buffer.buffer(event) }
87
+ end
88
+ it 'should detect 3 fingers pinch-out (oneshot/repeat)' do
89
+ events = @detector.detect([@buffer])
90
+ expect(events[0].record.index.keys.map(&:symbol))
91
+ .to eq([:pinch, 3, :out])
92
+ expect(events[1].record.index.keys.map(&:symbol))
93
+ .to eq([:pinch, 3, :out, :update])
94
+ end
95
+ end
96
+ end
97
+
98
+ private
99
+
100
+ def create_events(deltas: [])
101
+ record_type = PinchDetector::GESTURE_RECORD_TYPE
102
+ deltas.map do |delta|
103
+ status = if deltas[0].equal? delta
104
+ 'begin'
105
+ else
106
+ 'update'
107
+ end
108
+
109
+ gesture_record = Events::Records::GestureRecord.new(status: status,
110
+ gesture: record_type,
111
+ finger: 3,
112
+ delta: delta)
113
+ Events::Event.new(tag: 'libinput_gesture_parser', record: gesture_record)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require './lib/fusuma/plugin/detectors/rotate_detector'
6
+ require './lib/fusuma/plugin/buffers/gesture_buffer'
7
+ require './lib/fusuma/plugin/events/event'
8
+ require './lib/fusuma/config'
9
+
10
+ module Fusuma
11
+ module Plugin
12
+ module Detectors
13
+ RSpec.describe RotateDetector do
14
+ before do
15
+ @detector = RotateDetector.new
16
+ @buffer = Buffers::GestureBuffer.new
17
+ end
18
+
19
+ around do |example|
20
+ ConfigHelper.load_config_yml = <<~CONFIG
21
+ threshold:
22
+ rotate: 1
23
+ CONFIG
24
+
25
+ example.run
26
+
27
+ Config.custom_path = nil
28
+ end
29
+
30
+ describe '#detect' do
31
+ context 'with no rotate 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 rotate events in buffer' do
39
+ before do
40
+ deltas = [
41
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.4),
42
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.5)
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
+ expect(@detector.detect([@buffer]).record.trigger).to eq :repeat
50
+ end
51
+ end
52
+
53
+ context 'with enough rotate IN event' do
54
+ before do
55
+ deltas = [
56
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.5),
57
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.6),
58
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, 0.6)
59
+ ]
60
+ events = create_events(deltas: deltas)
61
+
62
+ events.each { |event| @buffer.buffer(event) }
63
+ end
64
+ it { expect(@detector.detect([@buffer])).to all be_a Events::Event }
65
+ it {
66
+ expect(@detector.detect([@buffer]).map(&:record)).to all be_a Events::Records::IndexRecord
67
+ }
68
+ it {
69
+ expect(@detector.detect([@buffer]).map(&:record).map(&:index)).to all be_a Config::Index
70
+ }
71
+ it 'should detect 3 fingers rotate-clockwise (oneshot/repeat)' do
72
+ events = @detector.detect([@buffer])
73
+ expect(events[0].record.index.keys.map(&:symbol))
74
+ .to eq([:rotate, 3, :clockwise])
75
+ expect(events[1].record.index.keys.map(&:symbol))
76
+ .to eq([:rotate, 3, :clockwise, :update])
77
+ end
78
+ end
79
+
80
+ context 'with enough rotate OUT event' do
81
+ before do
82
+ deltas = [
83
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, -0.5),
84
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, -0.6),
85
+ Events::Records::GestureRecord::Delta.new(0, 0, 0, 0, 0, -0.6)
86
+ ]
87
+ events = create_events(deltas: deltas)
88
+
89
+ events.each { |event| @buffer.buffer(event) }
90
+ end
91
+ it 'should detect 3 fingers rotate-counterclockwise' do
92
+ events = @detector.detect([@buffer])
93
+ indexes = events.map { |e| e.record.index.keys.map(&:symbol) }
94
+ expect(indexes).to eq(
95
+ [
96
+ [:rotate, 3, :counterclockwise],
97
+ [:rotate, 3, :counterclockwise, :update]
98
+ ]
99
+ )
100
+ end
101
+ end
102
+ end
103
+
104
+ private
105
+
106
+ def create_events(deltas: [])
107
+ record_type = RotateDetector::GESTURE_RECORD_TYPE
108
+ deltas.map do |delta|
109
+ status = if deltas[0].equal? delta
110
+ 'begin'
111
+ else
112
+ 'update'
113
+ end
114
+
115
+ gesture_record = Events::Records::GestureRecord.new(status: status,
116
+ gesture: record_type,
117
+ finger: 3,
118
+ delta: delta)
119
+ Events::Event.new(tag: 'libinput_gesture_parser', record: gesture_record)
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,118 @@
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
@@ -0,0 +1,30 @@
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