cable_ready 4.4.3 → 5.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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