cable_ready 4.2.0 → 4.3.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e576813856258661e5734171c7b318a2cb175555380b930ecd7e39070c8ccf0c
4
- data.tar.gz: 3a1523ab640bade41097d06b92e9ee30280c6cab87b5a76b0d213107e096d289
3
+ metadata.gz: 97d1c34cd35126aebacd48f7aca392baa47991f89677ea1f22fc7c6c7cdc3ff8
4
+ data.tar.gz: ea3aac6324f788063497cd88100200e5168cebb5b6e74b9a5ce8b5c32c65df6c
5
5
  SHA512:
6
- metadata.gz: 5a28688ca371e11cb503f6fcd7e390911488885ee50bae435963eaa42f4d641568766470121d7b7c7bf2d90d1a74dd48faa52c9a22a860fa1d91d26cf059b17f
7
- data.tar.gz: 74a88801ef990880f5d8d2724f9f37cdf510a195979474d1f78ea15d73b2dfe4e9ff26c99dca4638cf916d5f5162c6aad4ad9b5c711157f7c93138459f311dc1
6
+ metadata.gz: d625cb0b81b01dfd7a4dfa6bf452fdb5b56ea1e231bb56441801818ff1d31b78a58b032c0af0d33be8e447660b419c1693b291fea6eb5aa10b094611fbc19b89
7
+ data.tar.gz: f39ea747112802ee20f11557820e65894596e940adb146fca7bbc6d21aeb92380393144188826f943111ca28f4a06ace7fa6999d258b38af7df2ff1cc5ff0f4e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cable_ready (4.2.0)
4
+ cable_ready (4.3.0.pre0)
5
5
  rails (>= 5.2)
6
6
 
7
7
  GEM
@@ -62,7 +62,7 @@ GEM
62
62
  minitest (~> 5.1)
63
63
  tzinfo (~> 1.1)
64
64
  zeitwerk (~> 2.2, >= 2.2.2)
65
- ast (2.4.0)
65
+ ast (2.4.1)
66
66
  builder (3.2.4)
67
67
  coderay (1.1.3)
68
68
  concurrent-ruby (1.1.6)
@@ -70,7 +70,7 @@ GEM
70
70
  erubi (1.9.0)
71
71
  globalid (0.4.2)
72
72
  activesupport (>= 4.2.0)
73
- i18n (1.8.2)
73
+ i18n (1.8.3)
74
74
  concurrent-ruby (~> 1.0)
75
75
  loofah (2.5.0)
76
76
  crass (~> 1.0.2)
@@ -126,27 +126,32 @@ GEM
126
126
  thor (>= 0.20.3, < 2.0)
127
127
  rainbow (3.0.0)
128
128
  rake (13.0.1)
129
+ regexp_parser (1.7.1)
129
130
  rexml (3.2.4)
130
- rubocop (0.83.0)
131
+ rubocop (0.85.1)
131
132
  parallel (~> 1.10)
132
133
  parser (>= 2.7.0.1)
133
134
  rainbow (>= 2.2.2, < 4.0)
135
+ regexp_parser (>= 1.7)
134
136
  rexml
137
+ rubocop-ast (>= 0.0.3)
135
138
  ruby-progressbar (~> 1.7)
136
139
  unicode-display_width (>= 1.4.0, < 2.0)
137
- rubocop-performance (1.5.2)
140
+ rubocop-ast (0.0.3)
141
+ parser (>= 2.7.0.1)
142
+ rubocop-performance (1.6.1)
138
143
  rubocop (>= 0.71.0)
139
144
  ruby-progressbar (1.10.1)
140
- sprockets (4.0.0)
145
+ sprockets (4.0.2)
141
146
  concurrent-ruby (~> 1.0)
142
147
  rack (> 1, < 3)
143
148
  sprockets-rails (3.2.1)
144
149
  actionpack (>= 4.0)
145
150
  activesupport (>= 4.0)
146
151
  sprockets (>= 3.0.0)
147
- standard (0.4.6)
148
- rubocop (~> 0.83.0)
149
- rubocop-performance (~> 1.5.2)
152
+ standard (0.4.7)
153
+ rubocop (~> 0.85.0)
154
+ rubocop-performance (~> 1.6.0)
150
155
  standardrb (1.0.0)
151
156
  standard
152
157
  thor (1.0.1)
@@ -156,7 +161,7 @@ GEM
156
161
  unicode-display_width (1.7.0)
157
162
  websocket-driver (0.7.2)
158
163
  websocket-extensions (>= 0.1.0)
159
- websocket-extensions (0.1.4)
164
+ websocket-extensions (0.1.5)
160
165
  zeitwerk (2.3.0)
161
166
 
162
167
  PLATFORMS
@@ -7,7 +7,11 @@ module CableReady
7
7
  extend ::ActiveSupport::Concern
8
8
 
9
9
  def cable_ready
10
- @cable_ready_channels ||= CableReady::Channels.new
10
+ CableReady::Channels.instance
11
+ end
12
+
13
+ def dom_id(record, prefix = nil)
14
+ "##{ActionView::RecordIdentifier.dom_id(record, prefix)}"
11
15
  end
12
16
  end
13
17
  end
@@ -2,234 +2,39 @@
2
2
 
3
3
  module CableReady
4
4
  class Channel
5
- attr_reader :name, :operations
5
+ attr_reader :identifier, :operations, :available_operations
6
6
 
7
- # Example Operations Payload:
8
- #
9
- # {
10
- # # Cookies .....................................................................................................
11
- #
12
- # set_cookie: [
13
- # {cookie: "example=value; path=/; expires=Sat, 07 Mar 2020 16:19:19 GMT"},
14
- # ...
15
- # ]
16
- #
17
- # # DOM Events ..................................................................................................
18
- #
19
- # dispatch_event: [{
20
- # name: "string",
21
- # detail: "object",
22
- # selector: "string",
23
- # }, ...],
24
- #
25
- # # Element Mutations ...........................................................................................
26
- #
27
- # morph: [{
28
- # selector: "string",
29
- # html: "string"
30
- # children_only: true|false,
31
- # permanent_attribute_name: "string",
32
- # focus_selector: "string",
33
- # }, ...],
34
- #
35
- # inner_html: [{
36
- # selector: "string",
37
- # focus_selector: "string",
38
- # html: "string"
39
- # }, ...],
40
- #
41
- # outer_html: [{
42
- # selector: "string",
43
- # focus_selector: "string",
44
- # html: "string"
45
- # }, ...],
46
- #
47
- # text_content: [{
48
- # selector: "string",
49
- # text: "string"
50
- # }, ...]
51
- #
52
- # insert_adjacent_html: [{
53
- # selector: "string",
54
- # focus_selector: "string",
55
- # position: "string",
56
- # html: "string"
57
- # }, ...],
58
- #
59
- # insert_adjacent_text: [{
60
- # selector: "string",
61
- # position: "string",
62
- # text: "string"
63
- # }, ...],
64
- #
65
- # remove: [{
66
- # selector: "string",
67
- # focus_selector: "string,
68
- # }, ...],
69
- #
70
- # set_property: [{
71
- # name: "string",
72
- # selector: "string",
73
- # value: "string"
74
- # }, ...],
75
- #
76
- # set_value: [{
77
- # selector: "string",
78
- # value: "string"
79
- # }, ...],
80
- #
81
- # # Attribute Mutations .........................................................................................
82
- #
83
- # set_attribute: [{
84
- # selector: "string",
85
- # name: "string",
86
- # value: "string"
87
- # }, ...],
88
- #
89
- # remove_attribute: [{
90
- # selector: "string",
91
- # name: "string"
92
- # }, ...],
93
- #
94
- # # CSS Class Mutations .........................................................................................
95
- #
96
- # add_css_class: [{
97
- # selector: "string",
98
- # name: "string"
99
- # }, ...],
100
- #
101
- # remove_css_class: [{
102
- # selector: "string",
103
- # name: "string"
104
- # }, ...],
105
- #
106
- # # Style Mutations ...........................................................................................
107
- #
108
- # set_style: [{
109
- # selector: "string",
110
- # name: "string",
111
- # value: "string"
112
- # }, ...],
113
- #
114
- # # Dataset Mutations ...........................................................................................
115
- #
116
- # set_dataset_property: [{
117
- # selector: "string",
118
- # name: "string",
119
- # value: "string"
120
- # }, ...],
121
- # }
122
- def initialize(name)
123
- @name = name
124
- @operations = stub
7
+ def initialize(identifier, available_operations)
8
+ @identifier = identifier
9
+ @available_operations = available_operations
10
+ reset
11
+ available_operations.each do |available_operation, implementation|
12
+ define_singleton_method available_operation, &implementation
13
+ end
125
14
  end
126
15
 
127
- def clear
128
- @operations = stub
129
- end
130
-
131
- def broadcast
16
+ def broadcast(clear)
132
17
  operations.select! { |_, list| list.present? }
133
18
  operations.deep_transform_keys! { |key| key.to_s.camelize(:lower) }
134
- ActionCable.server.broadcast name, "cableReady" => true, "operations" => operations
135
- clear
136
- end
137
-
138
- def set_cookie(value)
139
- add_operation(:set_cookie, {cookie: value})
140
- end
141
-
142
- def dispatch_event(options = {})
143
- add_operation(:dispatch_event, options)
144
- end
145
-
146
- def morph(options = {})
147
- add_operation(:morph, options)
148
- end
149
-
150
- def inner_html(options = {})
151
- add_operation(:inner_html, options)
152
- end
153
-
154
- def outer_html(options = {})
155
- add_operation(:outer_html, options)
156
- end
157
-
158
- def text_content(options = {})
159
- add_operation(:text_content, options)
160
- end
161
-
162
- def insert_adjacent_html(options = {})
163
- add_operation(:insert_adjacent_html, options)
164
- end
165
-
166
- def insert_adjacent_text(options = {})
167
- add_operation(:insert_adjacent_text, options)
19
+ ActionCable.server.broadcast identifier, "cableReady" => true, "operations" => operations
20
+ reset if clear
168
21
  end
169
22
 
170
- def remove(options = {})
171
- add_operation(:remove, options)
172
- end
173
-
174
- def set_property(options = {})
175
- add_operation(:set_property, options)
176
- end
177
-
178
- def set_value(options = {})
179
- add_operation(:set_value, options)
180
- end
181
-
182
- def set_attribute(options = {})
183
- add_operation(:set_attribute, options)
184
- end
185
-
186
- def remove_attribute(options = {})
187
- add_operation(:remove_attribute, options)
188
- end
189
-
190
- def add_css_class(options = {})
191
- add_operation(:add_css_class, options)
192
- end
193
-
194
- def remove_css_class(options = {})
195
- add_operation(:remove_css_class, options)
196
- end
197
-
198
- def set_style(options = {})
199
- add_operation(:set_style, options)
200
- end
201
-
202
- def set_dataset_property(options = {})
203
- add_operation(:set_dataset_property, options)
23
+ def broadcast_to(model, clear)
24
+ operations.select! { |_, list| list.present? }
25
+ operations.deep_transform_keys! { |key| key.to_s.camelize(:lower) }
26
+ identifier.broadcast_to model, "cableReady" => true, "operations" => operations
27
+ reset if clear
204
28
  end
205
29
 
206
30
  private
207
31
 
208
32
  def add_operation(key, options)
209
- operations[key] ||= []
210
33
  operations[key] << options
211
34
  end
212
35
 
213
- def stub
214
- {
215
- add_css_class: [],
216
- dispatch_event: [],
217
- inner_html: [],
218
- insert_adjacent_html: [],
219
- insert_adjacent_text: [],
220
- morph: [],
221
- outer_html: [],
222
- remove: [],
223
- remove_attribute: [],
224
- remove_css_class: [],
225
- set_attribute: [],
226
- set_cookie: [],
227
- set_dataset_property: [],
228
- set_style: [],
229
- set_property: [],
230
- set_value: [],
231
- text_content: []
232
- }
36
+ def reset
37
+ @operations = Hash.new { |hash, operation| hash[operation] = [] }
233
38
  end
234
39
  end
235
40
  end
@@ -4,21 +4,65 @@ require_relative "channel"
4
4
 
5
5
  module CableReady
6
6
  class Channels
7
+ include Singleton
8
+ attr_accessor :operations
9
+
10
+ def self.configure
11
+ yield CableReady::Channels.instance if block_given?
12
+ end
13
+
7
14
  def initialize
8
15
  @channels = {}
16
+ @operations = {}
17
+ %i[
18
+ add_css_class
19
+ dispatch_event
20
+ inner_html
21
+ insert_adjacent_html
22
+ insert_adjacent_text
23
+ morph
24
+ outer_html
25
+ remove
26
+ remove_attribute
27
+ remove_css_class
28
+ set_attribute
29
+ set_cookie
30
+ set_dataset_property
31
+ set_property
32
+ set_style
33
+ set_styles
34
+ set_value
35
+ ].each do |operation|
36
+ add_operation operation
37
+ end
9
38
  end
10
39
 
11
- def [](channel_name)
12
- @channels[channel_name] ||= CableReady::Channel.new(channel_name)
40
+ def add_operation(operation, &implementation)
41
+ @operations[operation] = implementation || ->(options = {}) { add_operation(operation, options) }
13
42
  end
14
43
 
15
- def clear
16
- @channels = {}
44
+ def [](identifier)
45
+ @channels[identifier] ||= CableReady::Channel.new(identifier, operations)
46
+ end
47
+
48
+ def broadcast(*identifiers, clear: true)
49
+ @channels.values
50
+ .reject { |channel| identifiers.any? && identifiers.exclude?(channel.identifier) }
51
+ .select { |channel| channel.identifier.is_a?(String) }
52
+ .tap do |channels|
53
+ channels.each { |channel| @channels[channel.identifier].broadcast(clear) }
54
+ channels.each { |channel| @channels.except!(channel.identifier) if clear }
55
+ end
17
56
  end
18
57
 
19
- def broadcast
20
- @channels.values.map(&:broadcast)
21
- clear
58
+ def broadcast_to(model, *identifiers, clear: true)
59
+ @channels.values
60
+ .reject { |channel| identifiers.any? && identifiers.exclude?(channel.identifier) }
61
+ .reject { |channel| channel.identifier.is_a?(String) }
62
+ .tap do |channels|
63
+ channels.each { |channel| @channels[channel.identifier].broadcast_to(model, clear) }
64
+ channels.each { |channel| @channels.except!(channel.identifier) if clear }
65
+ end
22
66
  end
23
67
  end
24
68
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CableReady
4
- VERSION = "4.2.0"
4
+ VERSION = "4.3.0.pre0"
5
5
  end
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.2.0
4
+ version: 4.3.0.pre0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Hopkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-02 00:00:00.000000000 Z
11
+ date: 2020-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -120,9 +120,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  required_rubygems_version: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
123
+ - - ">"
124
124
  - !ruby/object:Gem::Version
125
- version: '0'
125
+ version: 1.3.1
126
126
  requirements: []
127
127
  rubygems_version: 3.0.3
128
128
  signing_key: