pads 1.0.0 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef83cd4cd517c8201f18b8208a6adb8ca42d5dadef3e810c5007822662768b1f
4
- data.tar.gz: 77a457197b5c98ec963a95b2f62a6b9e1e59a2d69cdfd268112279e280248df5
3
+ metadata.gz: 942bd276399a7af1bf8ecb7a833f8bc9cb936051eaf0e3c656a026921dd8b1fe
4
+ data.tar.gz: 9e50d4235e2f9e419a124d9826f599b41090f1a48b8aeb00824cb2cb7e4ffb59
5
5
  SHA512:
6
- metadata.gz: 48cd6de1372be26d55b682c4de3ad1119c6855b588190f05ea1c9ce4b34412a15ccc851c760e8e8e388a5dd786f596b93e21bac9975f0c9011bc9d33e166101d
7
- data.tar.gz: 98939e84ce761264920b1a039ff62dd50fd31ee8a2c497b55467ede72a505f1a7ea7a163d6a181e6b2f005c956e83637c25d8ad890dc792ea42df1150cd72d20
6
+ metadata.gz: 329b4c43fac33e81d1fdbc35932212e7c68e37e58d426de0b54460b578bbc0bfa5b37bef99ac39881bd29d72f9b8cab6a5b1a78b2b9024776c440aa515b78678
7
+ data.tar.gz: 9a246144993e02bfc6bb3155603ae28b4cc1156fc5f16509db2e4ac22acb807612644432e364f0d70bcb78ef7bd887bcfd8e49dbb0dd8acc88939141026d81ca
data/lib/pads/pad.rb CHANGED
@@ -31,10 +31,15 @@ module Pads
31
31
  new_view
32
32
  end
33
33
 
34
- def pop_view
35
- raise 'You cannot pop the top level view' if @view_stack.one?
34
+ def pop_view(view = self.view)
35
+ index = @view_stack.index(view)
36
36
 
37
- change_view { @view_stack.shift }
37
+ raise ArgumentError, 'The given view is not part of the stack' if index.nil?
38
+ raise ArgumentError, 'You cannot pop the top level view' if view == @view_stack.last
39
+
40
+ indexes = 0..index
41
+ @view_stack[indexes].each &:cancel_beats
42
+ change_view { @view_stack.slice! indexes }
38
43
  end
39
44
 
40
45
  def with_view(new_view = PadView.new)
@@ -42,7 +47,7 @@ module Pads
42
47
  push_view new_view
43
48
  yield new_view
44
49
  ensure
45
- pop_view
50
+ pop_view new_view
46
51
  end
47
52
 
48
53
  def bind_events(source_dispatcher)
@@ -63,6 +68,19 @@ module Pads
63
68
 
64
69
  private
65
70
 
71
+ def method_missing(symbol, *args, &block)
72
+ view = self.view
73
+ if view.respond_to? symbol
74
+ view.__send__ symbol, *args, &block
75
+ else
76
+ super
77
+ end
78
+ end
79
+
80
+ def respond_to_missing?(symbol, *)
81
+ view.respond_to?(symbol) or super
82
+ end
83
+
66
84
  def change_view
67
85
  view&.delete_observer self
68
86
  yield
@@ -63,6 +63,8 @@ module Pads
63
63
  end
64
64
  end
65
65
 
66
+ alias << push
67
+
66
68
  # @return [Array<Pad, PadGroup>]
67
69
  def members
68
70
  @members.dup
data/lib/pads/pad_view.rb CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'pads/observable_pad_state'
4
4
 
5
+ require 'set'
6
+
5
7
  module Pads
6
8
  # Represents a stackable view of a pad
7
9
  class PadView < ObservablePadState
@@ -16,6 +18,7 @@ module Pads
16
18
 
17
19
  @events = Events::Dispatcher.new
18
20
  @button_handlers = []
21
+ @beats = Set.new.compare_by_identity
19
22
 
20
23
  @events.on :button_clicked do |event|
21
24
  @button_handlers[event.index]&.call
@@ -40,5 +43,22 @@ module Pads
40
43
  @button_handlers << handler
41
44
  self.buttons += [label]
42
45
  end
46
+
47
+ def beat(delay, delay_first: false)
48
+ Thread.new do
49
+ thread = Thread.current
50
+ @beats << thread
51
+ while @beats.include? thread
52
+ yield self unless delay_first
53
+ delay_first = false
54
+ sleep delay
55
+ end
56
+ end
57
+ end
58
+
59
+ def cancel_beats
60
+ @beats.clear
61
+ self
62
+ end
43
63
  end
44
64
  end
data/lib/pads/provider.rb CHANGED
@@ -24,6 +24,8 @@ module Pads
24
24
  @root.push(*args, &block)
25
25
  end
26
26
 
27
+ alias << push
28
+
27
29
  def wait
28
30
  @client.wait
29
31
  end
data/lib/pads/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pads
4
- VERSION = '1.0.0'
4
+ VERSION = '1.1.0'
5
5
  end
data/lib/pads.rb CHANGED
@@ -7,9 +7,17 @@ require 'pads/live_array'
7
7
 
8
8
  # Provide pads to the Pads macOS app.
9
9
  module Pads
10
- def self.provide(*args)
10
+ def self.run(*args, &block)
11
+ loop do
12
+ run! *args, &block
13
+ rescue Errno::ECONNREFUSED
14
+ sleep 1
15
+ end
16
+ end
17
+
18
+ def self.run!(*args)
11
19
  provider = Provider.new(*args)
12
- yield provider
20
+ Thread.new { yield provider }
13
21
  provider.wait
14
22
  end
15
23
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pads
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil E. Pearson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-26 00:00:00.000000000 Z
11
+ date: 2022-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: interop
@@ -36,7 +36,6 @@ files:
36
36
  - ".ruby-version"
37
37
  - CODE_OF_CONDUCT.md
38
38
  - Gemfile
39
- - Gemfile.lock
40
39
  - LICENSE.txt
41
40
  - README.md
42
41
  - Rakefile
@@ -87,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
86
  - !ruby/object:Gem::Version
88
87
  version: '0'
89
88
  requirements: []
90
- rubygems_version: 3.3.7
89
+ rubygems_version: 3.0.9
91
90
  signing_key:
92
91
  specification_version: 4
93
92
  summary: Ruby client for the Pads macOS app
data/Gemfile.lock DELETED
@@ -1,66 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- pads (1.0.0)
5
- interop (~> 0.3.1)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- ast (2.4.2)
11
- diff-lcs (1.5.0)
12
- interop (0.3.1)
13
- parallel (1.21.0)
14
- parser (3.1.1.0)
15
- ast (~> 2.4.1)
16
- rainbow (3.1.1)
17
- rake (13.0.6)
18
- regexp_parser (2.2.1)
19
- rexml (3.2.5)
20
- rspec (3.11.0)
21
- rspec-core (~> 3.11.0)
22
- rspec-expectations (~> 3.11.0)
23
- rspec-mocks (~> 3.11.0)
24
- rspec-core (3.11.0)
25
- rspec-support (~> 3.11.0)
26
- rspec-expectations (3.11.0)
27
- diff-lcs (>= 1.2.0, < 2.0)
28
- rspec-support (~> 3.11.0)
29
- rspec-mocks (3.11.0)
30
- diff-lcs (>= 1.2.0, < 2.0)
31
- rspec-support (~> 3.11.0)
32
- rspec-support (3.11.0)
33
- rubocop (1.25.1)
34
- parallel (~> 1.10)
35
- parser (>= 3.1.0.0)
36
- rainbow (>= 2.2.2, < 4.0)
37
- regexp_parser (>= 1.8, < 3.0)
38
- rexml
39
- rubocop-ast (>= 1.15.1, < 2.0)
40
- ruby-progressbar (~> 1.7)
41
- unicode-display_width (>= 1.4.0, < 3.0)
42
- rubocop-ast (1.16.0)
43
- parser (>= 3.1.1.0)
44
- rubocop-rake (0.6.0)
45
- rubocop (~> 1.0)
46
- rubocop-rspec (2.9.0)
47
- rubocop (~> 1.19)
48
- ruby-progressbar (1.11.0)
49
- unicode-display_width (2.1.0)
50
-
51
- PLATFORMS
52
- x86_64-darwin-19
53
- x86_64-darwin-20
54
- x86_64-darwin-21
55
- x86_64-linux
56
-
57
- DEPENDENCIES
58
- pads!
59
- rake (~> 13.0)
60
- rspec (~> 3.0)
61
- rubocop (~> 1.21)
62
- rubocop-rake
63
- rubocop-rspec
64
-
65
- BUNDLED WITH
66
- 2.3.5