cable_ready 4.4.3 → 5.0.0.pre1

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +238 -155
  3. data/Gemfile.lock +144 -100
  4. data/LATEST +1 -0
  5. data/README.md +13 -13
  6. data/Rakefile +8 -2
  7. data/app/channels/cable_ready/stream.rb +12 -0
  8. data/app/helpers/cable_ready_helper.rb +11 -0
  9. data/app/jobs/cable_ready_broadcast_job.rb +14 -0
  10. data/bin/standardize +1 -1
  11. data/lib/cable_ready.rb +41 -0
  12. data/lib/cable_ready/broadcaster.rb +3 -4
  13. data/lib/cable_ready/cable_car.rb +17 -0
  14. data/lib/cable_ready/channel.rb +14 -36
  15. data/lib/cable_ready/channels.rb +22 -65
  16. data/lib/cable_ready/compoundable.rb +11 -0
  17. data/lib/cable_ready/config.rb +78 -0
  18. data/lib/cable_ready/identifiable.rb +19 -0
  19. data/lib/cable_ready/operation_builder.rb +69 -0
  20. data/lib/cable_ready/sanity_checker.rb +151 -0
  21. data/lib/cable_ready/stream_identifier.rb +13 -0
  22. data/lib/cable_ready/version.rb +1 -1
  23. data/lib/generators/cable_ready/channel_generator.rb +71 -0
  24. data/lib/generators/cable_ready/initializer_generator.rb +14 -0
  25. data/lib/generators/cable_ready/stream_from_generator.rb +43 -0
  26. data/lib/generators/cable_ready/templates/config/initializers/cable_ready.rb +18 -0
  27. data/test/lib/cable_ready/cable_car_test.rb +28 -0
  28. data/test/lib/cable_ready/identifiable_test.rb +75 -0
  29. data/test/lib/cable_ready/operation_builder_test.rb +128 -0
  30. data/test/lib/generators/cable_ready/channel_generator_test.rb +157 -0
  31. data/test/support/generator_test_helpers.rb +28 -0
  32. data/test/test_helper.rb +15 -0
  33. metadata +66 -15
  34. data/cable_ready.gemspec +0 -25
  35. data/package.json +0 -36
  36. data/tags +0 -57
  37. data/yarn.lock +0 -2552
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+ require "generators/cable_ready/channel_generator"
5
+
6
+ class CableReady::ChannelGeneratorTest < Rails::Generators::TestCase
7
+ include ::GeneratorTestHelpers
8
+
9
+ tests CableReady::ChannelGenerator
10
+ destination File.expand_path("../../../../tmp/dummy", __dir__)
11
+
12
+ prepare_destination
13
+ create_sample_app
14
+
15
+ MiniTest.after_run do
16
+ remove_sample_app
17
+ end
18
+
19
+ test "should generate channel with the same resource name and stimulus controller" do
20
+ run_generator ["user", "--stream-for=user", "--stimulus"]
21
+
22
+ assert_file "app/channels/user_channel.rb" do |content|
23
+ assert_match(/class\ UserChannel\ </, content)
24
+ assert_match(/stream_for\ User\.find\(params\[:id\]\)/, content)
25
+ end
26
+
27
+ assert_file "app/javascript/channels/user_channel.js", /"UserChannel"/
28
+ assert_file "app/javascript/controllers/user_controller.js", /'UserChannel'/
29
+ end
30
+
31
+ test "should generate channel with different resource name" do
32
+ run_generator ["my_name", "--stream-for=under_scored_resource_name", "--no-stimulus"]
33
+
34
+ assert_file "app/channels/my_name_channel.rb" do |content|
35
+ assert_match(/class\ MyNameChannel\ </, content)
36
+ assert_match(/stream_for\ UnderScoredResourceName\.find\(params\[:id\]\)/, content)
37
+ end
38
+
39
+ assert_file "app/javascript/channels/my_name_channel.js", /"MyNameChannel"/
40
+ assert_no_file "app/javascript/controllers/my_name_controller.js"
41
+ end
42
+
43
+ test "should not generate stimulus controller if not requested" do
44
+ run_generator ["comment", "--stream-for=comment", "--no-stimulus"]
45
+
46
+ assert_file "app/channels/comment_channel.rb"
47
+ assert_file "app/javascript/channels/comment_channel.js"
48
+ assert_no_file "app/javascript/controllers/comment_controller.js"
49
+ end
50
+
51
+ test "should run the generator when streaming from identifier" do
52
+ run_generator ["page", "--stream-from=page"]
53
+
54
+ assert_file "app/channels/page_channel.rb" do |content|
55
+ assert_match(/PageChannel/, content)
56
+ assert_match(/stream_from\ "page"/, content)
57
+ end
58
+
59
+ assert_file "app/javascript/channels/page_channel.js" do |content|
60
+ assert_match(/"PageChannel"/, content)
61
+ assert_match(/import\ CableReady/, content)
62
+ assert_match(/if\ \(data\.cableReady\)\ CableReady\.perform\(data\.operations\)/, content)
63
+ end
64
+ end
65
+
66
+ test "should run the generator when streaming without resource and different identifier" do
67
+ run_generator ["my_page", "--stream-from=ThisIsMyPage"]
68
+
69
+ assert_file "app/channels/my_page_channel.rb" do |content|
70
+ assert_match(/MyPageChannel/, content)
71
+ assert_match(/stream_from\ "this_is_my_page"/, content)
72
+ end
73
+
74
+ assert_file "app/javascript/channels/my_page_channel.js" do |content|
75
+ assert_match(/"MyPageChannel"/, content)
76
+ assert_match(/import\ CableReady/, content)
77
+ assert_match(/if\ \(data\.cableReady\)\ CableReady\.perform\(data\.operations\)/, content)
78
+ end
79
+ end
80
+
81
+ test "should run the generator and use the NAME for --stream-from if nothing passed" do
82
+ run_generator ["house", "--stream-from"]
83
+
84
+ assert_file "app/channels/house_channel.rb" do |content|
85
+ assert_match(/HouseChannel/, content)
86
+ assert_match(/stream_from\ "house"/, content)
87
+ end
88
+
89
+ assert_file "app/javascript/channels/house_channel.js" do |content|
90
+ assert_match(/"HouseChannel"/, content)
91
+ assert_match(/import\ CableReady/, content)
92
+ assert_match(/if\ \(data\.cableReady\)\ CableReady\.perform\(data\.operations\)/, content)
93
+ end
94
+ end
95
+
96
+ test "should run the generator and use the NAME for --stream-for if nothing passed" do
97
+ run_generator ["option", "--stream-for", "--stimulus"]
98
+
99
+ assert_file "app/channels/option_channel.rb" do |content|
100
+ assert_match(/class\ OptionChannel\ </, content)
101
+ assert_match(/stream_for\ Option\.find\(params\[:id\]\)/, content)
102
+ end
103
+
104
+ assert_file "app/javascript/channels/option_channel.js", /"OptionChannel"/
105
+ assert_file "app/javascript/controllers/option_controller.js", /'OptionChannel'/
106
+ end
107
+
108
+ test "should run not generate anything if passed stream_from and stream_for" do
109
+ assert_raises "Can't specify --stream-from and --stream-for at the same time" do
110
+ run_generator ["error", "--stream-from=1", "--stream-for=2"]
111
+ end
112
+ end
113
+
114
+ # some tests without generator options to simulate the inputs passed via cli
115
+
116
+ test "should generate channel with the same resource name and stimulus controller (without options)" do
117
+ CableReady::ChannelGenerator.any_instance.stubs(:using_broadcast_to?).returns(true)
118
+ CableReady::ChannelGenerator.any_instance.stubs(:resource).returns("Post")
119
+ CableReady::ChannelGenerator.any_instance.stubs(:using_stimulus?).returns(true)
120
+
121
+ run_generator ["post"]
122
+
123
+ assert_file "app/channels/post_channel.rb" do |content|
124
+ assert_match(/class\ PostChannel\ </, content)
125
+ assert_match(/stream_for\ Post\.find\(params\[:id\]\)/, content)
126
+ end
127
+
128
+ assert_file "app/javascript/channels/post_channel.js", /PostChannel/
129
+ assert_file "app/javascript/controllers/post_controller.js", /'PostChannel'/
130
+ end
131
+
132
+ test "should not generate stimulus controller if not requested (without options)" do
133
+ CableReady::ChannelGenerator.any_instance.stubs(:using_broadcast_to?).returns(true)
134
+ CableReady::ChannelGenerator.any_instance.stubs(:resource).returns("Admin")
135
+ CableReady::ChannelGenerator.any_instance.stubs(:using_stimulus?).returns(false)
136
+
137
+ run_generator ["admin"]
138
+
139
+ assert_file "app/channels/admin_channel.rb"
140
+ assert_file "app/javascript/channels/admin_channel.js"
141
+ assert_no_file "app/javascript/controllers/admin_controller.js"
142
+ end
143
+
144
+ test "should run the generator when streaming from identifier (without options)" do
145
+ CableReady::ChannelGenerator.any_instance.stubs(:using_broadcast_to?).returns(false)
146
+ CableReady::ChannelGenerator.any_instance.stubs(:identifier).returns("index_identifier")
147
+
148
+ run_generator ["index"]
149
+
150
+ assert_file "app/channels/index_channel.rb" do |content|
151
+ assert_match(/IndexChannel/, content)
152
+ assert_match(/stream_from\ "index_identifier"/, content)
153
+ end
154
+
155
+ assert_file "app/javascript/channels/index_channel.js", /"IndexChannel"/
156
+ end
157
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GeneratorTestHelpers
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ def sample_app_path
10
+ File.expand_path("../../tmp/dummy", __dir__)
11
+ end
12
+
13
+ def prepare_destination
14
+ FileUtils.rm_rf(sample_app_path) if Dir.exist?(sample_app_path)
15
+ FileUtils.mkdir_p(sample_app_path)
16
+ end
17
+
18
+ def create_sample_app
19
+ FileUtils.cd(sample_app_path) do
20
+ system "rails new . --minimal --skip-active-record --skip-test-unit --skip-spring --skip-bundle --quiet --force"
21
+ end
22
+ end
23
+
24
+ def remove_sample_app
25
+ FileUtils.rm_rf(destination_root)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Configure Rails Environment
4
+ ENV["RAILS_ENV"] = "test"
5
+
6
+ require "mocha"
7
+ require "rails"
8
+ require "rails/generators"
9
+ require "rails/test_help"
10
+ require "minitest/mock"
11
+ require "mocha/minitest"
12
+ require "pry"
13
+
14
+ # Load support files
15
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cable_ready
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.3
4
+ version: 5.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Hopkins
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-01 00:00:00.000000000 Z
11
+ date: 2021-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thread-local
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: github_changelog_generator
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -108,7 +122,21 @@ dependencies:
108
122
  - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
- description:
125
+ - !ruby/object:Gem::Dependency
126
+ name: mocha
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description:
112
140
  email:
113
141
  - natehop@gmail.com
114
142
  executables: []
@@ -119,27 +147,44 @@ files:
119
147
  - CODE_OF_CONDUCT.md
120
148
  - Gemfile
121
149
  - Gemfile.lock
150
+ - LATEST
122
151
  - LICENSE.txt
123
152
  - README.md
124
153
  - Rakefile
154
+ - app/channels/cable_ready/stream.rb
155
+ - app/helpers/cable_ready_helper.rb
156
+ - app/jobs/cable_ready_broadcast_job.rb
125
157
  - bin/console
126
158
  - bin/loc
127
159
  - bin/setup
128
160
  - bin/standardize
129
- - cable_ready.gemspec
130
161
  - lib/cable_ready.rb
131
162
  - lib/cable_ready/broadcaster.rb
163
+ - lib/cable_ready/cable_car.rb
132
164
  - lib/cable_ready/channel.rb
133
165
  - lib/cable_ready/channels.rb
166
+ - lib/cable_ready/compoundable.rb
167
+ - lib/cable_ready/config.rb
168
+ - lib/cable_ready/identifiable.rb
169
+ - lib/cable_ready/operation_builder.rb
170
+ - lib/cable_ready/sanity_checker.rb
171
+ - lib/cable_ready/stream_identifier.rb
134
172
  - lib/cable_ready/version.rb
135
- - package.json
136
- - tags
137
- - yarn.lock
138
- homepage: https://github.com/hopsoft/cable_ready
173
+ - lib/generators/cable_ready/channel_generator.rb
174
+ - lib/generators/cable_ready/initializer_generator.rb
175
+ - lib/generators/cable_ready/stream_from_generator.rb
176
+ - lib/generators/cable_ready/templates/config/initializers/cable_ready.rb
177
+ - test/lib/cable_ready/cable_car_test.rb
178
+ - test/lib/cable_ready/identifiable_test.rb
179
+ - test/lib/cable_ready/operation_builder_test.rb
180
+ - test/lib/generators/cable_ready/channel_generator_test.rb
181
+ - test/support/generator_test_helpers.rb
182
+ - test/test_helper.rb
183
+ homepage: https://github.com/stimulusreflex/cable_ready
139
184
  licenses:
140
185
  - MIT
141
186
  metadata: {}
142
- post_install_message:
187
+ post_install_message:
143
188
  rdoc_options: []
144
189
  require_paths:
145
190
  - lib
@@ -150,12 +195,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
195
  version: '0'
151
196
  required_rubygems_version: !ruby/object:Gem::Requirement
152
197
  requirements:
153
- - - ">="
198
+ - - ">"
154
199
  - !ruby/object:Gem::Version
155
- version: '0'
200
+ version: 1.3.1
156
201
  requirements: []
157
- rubygems_version: 3.1.2
158
- signing_key:
202
+ rubygems_version: 3.1.6
203
+ signing_key:
159
204
  specification_version: 4
160
205
  summary: Out-of-Band Server Triggered DOM Operations
161
- test_files: []
206
+ test_files:
207
+ - test/support/generator_test_helpers.rb
208
+ - test/lib/generators/cable_ready/channel_generator_test.rb
209
+ - test/lib/cable_ready/cable_car_test.rb
210
+ - test/lib/cable_ready/identifiable_test.rb
211
+ - test/lib/cable_ready/operation_builder_test.rb
212
+ - test/test_helper.rb
data/cable_ready.gemspec DELETED
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path("../lib/cable_ready/version", __FILE__)
4
-
5
- Gem::Specification.new do |gem|
6
- gem.name = "cable_ready"
7
- gem.license = "MIT"
8
- gem.version = CableReady::VERSION
9
- gem.authors = ["Nathan Hopkins"]
10
- gem.email = ["natehop@gmail.com"]
11
- gem.homepage = "https://github.com/hopsoft/cable_ready"
12
- gem.summary = "Out-of-Band Server Triggered DOM Operations"
13
-
14
- gem.files = Dir["lib/**/*.rb", "app/assets/javascripts/cable_ready.js", "bin/*", "[A-Z]*"]
15
- gem.test_files = Dir["test/**/*.rb"]
16
-
17
- gem.add_dependency "rails", ">= 5.2"
18
-
19
- gem.add_development_dependency "github_changelog_generator"
20
- gem.add_development_dependency "magic_frozen_string_literal"
21
- gem.add_development_dependency "pry"
22
- gem.add_development_dependency "pry-nav"
23
- gem.add_development_dependency "rake"
24
- gem.add_development_dependency "standardrb"
25
- end
data/package.json DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "name": "cable_ready",
3
- "version": "4.4.2",
4
- "description": "CableReady helps you create great real-time user experiences by making it simple to trigger client-side DOM changes from server-side Ruby.",
5
- "keywords": [
6
- "ruby",
7
- "rails",
8
- "websockets",
9
- "actioncable",
10
- "cable",
11
- "ssr",
12
- "stimulus_reflex",
13
- "client-side",
14
- "dom"
15
- ],
16
- "homepage": "https://cableready.stimulusreflex.com/",
17
- "bugs": {
18
- "url": "https://github.com/hopsoft/cable_ready/issues"
19
- },
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com:hopsoft/cable_ready.git"
23
- },
24
- "license": "MIT",
25
- "author": "Nathan Hopkins <natehop@gmail.com>",
26
- "main": "./javascript/cable_ready.js",
27
- "scripts": {
28
- "prettier-standard-check": "yarn run prettier-standard --check ./javascript/**/*.js"
29
- },
30
- "dependencies": {
31
- "morphdom": "^2.6.1"
32
- },
33
- "devDependencies": {
34
- "prettier-standard": "^16.1.0"
35
- }
36
- }
data/tags DELETED
@@ -1,57 +0,0 @@
1
- !_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
2
- !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
3
- !_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
4
- !_TAG_PROGRAM_NAME Exuberant Ctags //
5
- !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
6
- !_TAG_PROGRAM_VERSION 5.8 //
7
- Broadcaster lib/cable_ready/broadcaster.rb /^ module Broadcaster$/;" m class:CableReady
8
- CableReady lib/cable_ready.rb /^module CableReady$/;" m
9
- CableReady lib/cable_ready/broadcaster.rb /^module CableReady$/;" m
10
- CableReady lib/cable_ready/channel.rb /^module CableReady$/;" m
11
- CableReady lib/cable_ready/channels.rb /^module CableReady$/;" m
12
- CableReady lib/cable_ready/version.rb /^module CableReady$/;" m
13
- Channel lib/cable_ready/channel.rb /^ class Channel$/;" c class:CableReady
14
- Channels lib/cable_ready/channels.rb /^ class Channels$/;" c class:CableReady
15
- Engine lib/cable_ready.rb /^ class Engine < Rails::Engine$/;" c class:CableReady
16
- [] lib/cable_ready/channels.rb /^ def [](identifier)$/;" f class:CableReady.Channels
17
- add_operation lib/cable_ready/channels.rb /^ def add_operation(operation, &implementation)$/;" f class:CableReady.Channels
18
- broadcast lib/cable_ready/channel.rb /^ def broadcast(clear = true)$/;" f class:CableReady.Channel
19
- broadcast lib/cable_ready/channels.rb /^ def broadcast(*identifiers, clear: true)$/;" f class:CableReady.Channels
20
- broadcast_to lib/cable_ready/channel.rb /^ def broadcast_to(model, clear = true)$/;" f class:CableReady.Channel
21
- broadcast_to lib/cable_ready/channels.rb /^ def broadcast_to(model, *identifiers, clear: true)$/;" f class:CableReady.Channels
22
- cable_ready lib/cable_ready/broadcaster.rb /^ def cable_ready$/;" f class:CableReady.Broadcaster
23
- channel_broadcast lib/cable_ready/channel.rb /^ def channel_broadcast(clear)$/;" f class:CableReady.Channel
24
- channel_broadcast_to lib/cable_ready/channel.rb /^ def channel_broadcast_to(model, clear)$/;" f class:CableReady.Channel
25
- configure lib/cable_ready/channels.rb /^ def self.configure$/;" F class:CableReady.Channels
26
- const.bubbles javascript/cable_ready.js /^ const init = { bubbles: true, cancelable: true, detail: detail }$/;" p
27
- const.cancelable javascript/cable_ready.js /^ const init = { bubbles: true, cancelable: true, detail: detail }$/;" p
28
- const.color javascript/cable_ready.js /^ color: true,$/;" p
29
- const.date javascript/cable_ready.js /^ date: true,$/;" p
30
- const.datetime javascript/cable_ready.js /^ datetime: true,$/;" p
31
- const.datetime-local javascript/cable_ready.js /^ 'datetime-local': true,$/;" p
32
- const.detail javascript/cable_ready.js /^ const init = { bubbles: true, cancelable: true, detail: detail }$/;" p
33
- const.email javascript/cable_ready.js /^ email: true,$/;" p
34
- const.month javascript/cable_ready.js /^ month: true,$/;" p
35
- const.number javascript/cable_ready.js /^ number: true,$/;" p
36
- const.password javascript/cable_ready.js /^ password: true,$/;" p
37
- const.pushState javascript/cable_ready.js /^ pushState: config => {$/;" p
38
- const.range javascript/cable_ready.js /^ range: true,$/;" p
39
- const.search javascript/cable_ready.js /^ search: true,$/;" p
40
- const.select-multiple javascript/cable_ready.js /^ 'select-multiple': true,$/;" p
41
- const.select-one javascript/cable_ready.js /^ 'select-one': true,$/;" p
42
- const.tel javascript/cable_ready.js /^ tel: true,$/;" p
43
- const.text javascript/cable_ready.js /^ text: true,$/;" p
44
- const.textarea javascript/cable_ready.js /^ textarea: true,$/;" p
45
- const.time javascript/cable_ready.js /^ time: true,$/;" p
46
- const.url javascript/cable_ready.js /^ url: true,$/;" p
47
- const.value javascript/cable_ready.js /^ const ignore = { value: true }$/;" p
48
- const.week javascript/cable_ready.js /^ week: true$/;" p
49
- dom_id lib/cable_ready/broadcaster.rb /^ def dom_id(record, prefix = nil)$/;" f class:CableReady.Broadcaster
50
- enqueue_operation lib/cable_ready/channel.rb /^ def enqueue_operation(key, options)$/;" f class:CableReady.Channel
51
- import.INPUT javascript/cable_ready.js /^ INPUT: true,$/;" p
52
- import.SELECT javascript/cable_ready.js /^ SELECT: true$/;" p
53
- import.TEXTAREA javascript/cable_ready.js /^ TEXTAREA: true,$/;" p
54
- initialize lib/cable_ready/channel.rb /^ def initialize(identifier, available_operations)$/;" f class:CableReady.Channel
55
- initialize lib/cable_ready/channels.rb /^ def initialize$/;" f class:CableReady.Channels
56
- mutex lib/cable_ready/channels.rb /^ def mutex$/;" f class:CableReady.Channels
57
- reset lib/cable_ready/channel.rb /^ def reset$/;" f class:CableReady.Channel