cubism 0.1.0.pre5 → 0.1.0.pre9

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: 4486331e2d59695363fc4e2019ffe4fe7498a1b8d13e5ced08864b4f8fe1613c
4
- data.tar.gz: a80f6add8477c622884f0f985efcda533e5b7d3a13f50a2ebb39fd4fba1a3f69
3
+ metadata.gz: 579dec94521951d33b64eb0c211a210fe86cc89f927a79489cd05258593e3634
4
+ data.tar.gz: 21d48a1e4c42ad33e27e11c1128930d22c2103120307a8bd0351d5321d520f9a
5
5
  SHA512:
6
- metadata.gz: c07214a8095195319734a15296c4a302c59cd9107bb20b8839e52e1994f8447f7cf1065737fe3446b7743c29d0ce15621033a7a8fe44aab3624a467724482e8e
7
- data.tar.gz: e5c9bab8327f4ff0adb46cd6a3465fedb6729597e41eb8dafd5695b870806642a9c28f36b7c3e0e51a0c882c2b42eab6edc6971c2bee34e214b16cf34b17215d
6
+ metadata.gz: 57c779b3efd7deae25de93339ab19d4a673e2bfae83e3f0d02e62741780b8320d4f1e1dd1c2a4c07bfec3a42c417eb5c59e5fbdfddd43a586c28ed9f945e546a
7
+ data.tar.gz: 999b2cae4e2d0c506fd08a02dad104c7e66f50f863fd9f5a58fa600e4fa2d0409ad81d88819905541423b68fccb9d80589a03dafc75c6c6a510aed2966f164fb
data/README.md CHANGED
@@ -92,8 +92,8 @@ CableReady.initialize({ consumer });
92
92
  The `cubicle_for` helper accepts the following options as keyword arguments:
93
93
 
94
94
  - `exclude_current_user (true|false)`: Whether or not to exclude the current user from the list of present users broadcasted to the view. Useful e.g. for "typing..." indicators.
95
- - `appear_trigger`: a JavaScript event name (e.g. `:focus`) to use. The default is `:connect`, i.e. register a user as "appeared"/"present" when the element connects to the DOM.
96
- - `disappear_trigger`: a JavaScript event name (e.g. `:blur`) to use. The default is `:disconnect`, i.e. remove a user form the present users list when the element disconnects from the DOM.
95
+ - `appear_trigger`: JavaScript event names (e.g. `["focus", "debounced:input]`) to use. (Can also be a singular string, which will be converted to an array). The default is `:connect`, i.e. register a user as "appeared"/"present" when the element connects to the DOM.
96
+ - `disappear_trigger`: a JavaScript event name (e.g. `:blur`) to use. (Can also be a singular string, which will be converted to an array). The default is `:disconnect`, i.e. remove a user form the present users list when the element disconnects from the DOM.
97
97
  - `trigger_root`: a CSS selector to attach the appear/disappear events to. Defaults to the `cubicle-element` itself.
98
98
  - `html_options` are passed to the TagBuilder.
99
99
 
@@ -177,4 +177,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
177
177
  <!-- markdownlint-restore -->
178
178
  <!-- prettier-ignore-end -->
179
179
 
180
- <!-- ALL-CONTRIBUTORS-LIST:END -->
180
+ <!-- ALL-CONTRIBUTORS-LIST:END -->
@@ -3,7 +3,7 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
3
3
 
4
4
  def subscribed
5
5
  if resource.present?
6
- stream_for resource
6
+ stream_from params[:element_id]
7
7
  resource.cubicle_element_ids << element_id
8
8
  resource.excluded_user_id_for_element_id[element_id] = user.id if exclude_current_user?
9
9
  else
@@ -3,8 +3,9 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
3
3
 
4
4
  def subscribed
5
5
  if resource.present?
6
- stream_for resource
7
- resource.present_users.add(user.id)
6
+ stream_from params[:element_id]
7
+ resource.cubicle_element_ids << element_id
8
+ resource.excluded_user_id_for_element_id[element_id] = user.id if exclude_current_user?
8
9
  else
9
10
  reject
10
11
  end
@@ -13,6 +14,16 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
13
14
  def unsubscribed
14
15
  return unless resource.present?
15
16
 
17
+ resource.cubicle_element_ids.remove(element_id)
18
+ resource.excluded_user_id_for_element_id.delete(element_id)
19
+ disappear
20
+ end
21
+
22
+ def appear
23
+ resource.present_users.add(user.id)
24
+ end
25
+
26
+ def disappear
16
27
  resource.present_users.remove(user.id)
17
28
  end
18
29
 
@@ -26,4 +37,16 @@ class Cubism::PresenceChannel < ActionCable::Channel::Base
26
37
  def user
27
38
  GlobalID::Locator.locate_signed(params[:user])
28
39
  end
40
+
41
+ def exclude_current_user?
42
+ params[:exclude_current_user]
43
+ end
44
+
45
+ def element_id
46
+ params[:element_id]
47
+ end
48
+
49
+ def url
50
+ params[:url]
51
+ end
29
52
  end
@@ -9,7 +9,7 @@ module CubismHelper
9
9
  tag.cubicle_element(
10
10
  identifier: signed_stream_identifier(resource.to_gid.to_s),
11
11
  user: user.to_sgid.to_s,
12
- "appear-trigger": appear_trigger,
12
+ "appear-trigger": Array(appear_trigger).join(","),
13
13
  "disappear-trigger": disappear_trigger,
14
14
  "trigger-root": trigger_root,
15
15
  id: "cubicle-#{digested_id}",
@@ -10,4 +10,11 @@ module Cubism::Presence
10
10
  def stream_presence
11
11
  Cubism::Broadcaster.new(resource: self).broadcast
12
12
  end
13
+
14
+ def present_users_for_element_id(element_id)
15
+ users = Cubism.user_class.find(present_users.members)
16
+ users.reject! { |user| user.id == excluded_user_id_for_element_id[element_id].to_i }
17
+
18
+ users
19
+ end
13
20
  end
@@ -2,10 +2,12 @@ module Cubism::Presence
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
- kredis_set :present_users, after_change: :stream_presence_later
5
+ kredis_set :present_users, after_change: :stream_presence
6
+ kredis_set :cubicle_element_ids
7
+ kredis_hash :excluded_user_id_for_element_id
6
8
  end
7
9
 
8
- def stream_presence_later
9
- Cubism::StreamPresenceJob.perform_later(resource: self)
10
+ def stream_presence
11
+ Cubism::Broadcaster.new(resource: self).broadcast
10
12
  end
11
13
  end
@@ -16,22 +16,13 @@ module Cubism
16
16
  /cubicle-(?<block_key>.+)/ =~ element_id
17
17
  block = Cubism.store[block_key].block
18
18
  view_context = Cubism.store[block_key].context
19
- html = view_context.capture(users_for(resource, element_id), &block)
19
+ html = view_context.capture(resource.present_users_for_element_id(element_id), &block)
20
20
 
21
- cable_ready[Cubism::PresenceChannel].inner_html(
21
+ cable_ready[element_id].inner_html(
22
22
  selector: "cubicle-element##{element_id}[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
23
23
  html: html
24
- ).broadcast_to(resource)
24
+ ).broadcast
25
25
  end
26
26
  end
27
-
28
- private
29
-
30
- def users_for(resource, element_id)
31
- users = Cubism.user_class.find(resource.present_users.members)
32
- users.reject! { |user| user.id == resource.excluded_user_id_for_element_id[element_id].to_i }
33
-
34
- users
35
- end
36
27
  end
37
28
  end
@@ -1,3 +1,5 @@
1
+ require "cable_ready"
2
+
1
3
  module Cubism
2
4
  class Broadcaster
3
5
  include CableReady::Broadcaster
@@ -16,10 +18,10 @@ module Cubism
16
18
  view_context = Cubism.store[block_key].context
17
19
  html = view_context.capture(users_for(resource, element_id), &block)
18
20
 
19
- cable_ready[Cubism::PresenceChannel].inner_html(
21
+ cable_ready[element_id].inner_html(
20
22
  selector: "cubicle-element##{element_id}[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
21
23
  html: html
22
- ).broadcast_to(resource)
24
+ ).broadcast
23
25
  end
24
26
  end
25
27
 
@@ -2,6 +2,8 @@ module Cubism
2
2
  class CubicleBlockStore
3
3
  include Singleton
4
4
 
5
+ delegate_missing_to :@blocks
6
+
5
7
  def initialize
6
8
  @blocks = {}
7
9
  end
@@ -16,6 +18,12 @@ module Cubism
16
18
  end
17
19
  end
18
20
 
21
+ def clear
22
+ mutex.synchronize do
23
+ @blocks.clear
24
+ end
25
+ end
26
+
19
27
  private
20
28
 
21
29
  def mutex
@@ -0,0 +1,27 @@
1
+ module Cubism
2
+ class CubicleBlockStore
3
+ include Singleton
4
+
5
+ def initialize
6
+ @blocks = {}
7
+ end
8
+
9
+ def [](key)
10
+ @blocks[key]
11
+ end
12
+
13
+ def []=(key, value)
14
+ mutex.synchronize do
15
+ @blocks[key] = value
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def mutex
22
+ @mutex ||= Mutex.new
23
+ end
24
+ end
25
+
26
+ BlockStoreItem = Struct.new(:context, :block, keyword_init: true)
27
+ end
@@ -1,3 +1,3 @@
1
1
  module Cubism
2
- VERSION = "0.1.0.pre5"
2
+ VERSION = "0.1.0.pre9"
3
3
  end
@@ -1,3 +1,3 @@
1
1
  module Cubism
2
- VERSION = "0.1.0.pre4"
2
+ VERSION = "0.1.0.pre8"
3
3
  end
data/lib/cubism.rb~ CHANGED
@@ -2,7 +2,15 @@ require "kredis"
2
2
 
3
3
  require "cubism/version"
4
4
  require "cubism/engine"
5
+ require "cubism/broadcaster"
6
+ require "cubism/cubicle_block_store"
5
7
 
6
8
  module Cubism
9
+ extend ActiveSupport::Autoload
10
+
11
+ autoload :Broadcaster, "cubism/broadcaster"
12
+
7
13
  mattr_accessor :user_class, instance_writer: false, instance_reader: false
14
+
15
+ mattr_reader :store, instance_reader: false, default: Cubism::CubicleBlockStore.instance
8
16
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cubism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre5
4
+ version: 0.1.0.pre9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Rubisch
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-16 00:00:00.000000000 Z
11
+ date: 2022-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.1.0
19
+ version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 6.1.0
26
+ version: '6.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: kredis
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 5.0.0.pre8
55
55
  - !ruby/object:Gem::Dependency
56
- name: pry
56
+ name: standard
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,49 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: standard
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: mocha
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: appraisal
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sqlite3
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
115
  - - ">="
@@ -90,20 +132,13 @@ files:
90
132
  - MIT-LICENSE
91
133
  - README.md
92
134
  - Rakefile
93
- - app/channels/cubism/presence.rb~
94
135
  - app/channels/cubism/presence_channel.rb
95
136
  - app/channels/cubism/presence_channel.rb~
96
137
  - app/helpers/cubism_helper.rb
97
- - app/helpers/cubism_helper.rb~
98
- - app/models/concerns/cubism/base.rb~
99
138
  - app/models/concerns/cubism/presence.rb
100
139
  - app/models/concerns/cubism/presence.rb~
101
140
  - app/models/concerns/cubism/user.rb
102
- - app/models/concerns/cubism/user.rb~
103
- - app/models/cubism/base.rb
104
- - app/models/cubism/base.rb~
105
141
  - app/models/cubism/current.rb
106
- - app/models/cubism/current.rb~
107
142
  - config/routes.rb
108
143
  - lib/cubism.rb
109
144
  - lib/cubism.rb~
@@ -112,8 +147,6 @@ files:
112
147
  - lib/cubism/cubicle_block_store.rb
113
148
  - lib/cubism/cubicle_block_store.rb~
114
149
  - lib/cubism/engine.rb
115
- - lib/cubism/engine.rb~
116
- - lib/cubism/railtie.rb~
117
150
  - lib/cubism/version.rb
118
151
  - lib/cubism/version.rb~
119
152
  - lib/tasks/cubism_tasks.rake
@@ -123,7 +156,7 @@ licenses:
123
156
  metadata:
124
157
  homepage_uri: https://github.com/julianrubisch/cubism
125
158
  source_code_uri: https://github.com/julianrubisch/cubism.git
126
- post_install_message:
159
+ post_install_message:
127
160
  rdoc_options: []
128
161
  require_paths:
129
162
  - lib
@@ -138,8 +171,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
171
  - !ruby/object:Gem::Version
139
172
  version: 1.3.1
140
173
  requirements: []
141
- rubygems_version: 3.2.3
142
- signing_key:
174
+ rubygems_version: 3.1.4
175
+ signing_key:
143
176
  specification_version: 4
144
177
  summary: Lightweight Resource-Based Presence Solution with CableReady
145
178
  test_files: []
@@ -1,18 +0,0 @@
1
- class Cubism::Presence < ActionCable::Channel::Base
2
- def subscribed
3
- resource = GlobalID::Locator.locate_signed params[:signed_resource]
4
- if resource.present?
5
- stream_for resource
6
- resource.present_users.add(current_user.id)
7
- else
8
- reject
9
- end
10
- end
11
-
12
- def unsubscribed
13
- resource = GlobalID::Locator.locate_signed params[:signed_resource]
14
- return unless resource.present?
15
-
16
- resource.present_users.remove(current_user.id)
17
- end
18
- end
@@ -1,24 +0,0 @@
1
- module CubismHelper
2
- include CableReady::StreamIdentifier
3
-
4
- def cubicle_for(resource, user, html_options: {}, appear_trigger: :connect, disappear_trigger: nil, trigger_root: nil, exclude_current_user: true, &block)
5
- key = "#{block.source_location.join(":")}:#{resource.to_gid}:#{user.to_gid}"
6
- verifiable_id = CableReady.signed_stream_verifier.generate(key)
7
-
8
- Cubism.store[verifiable_id] = Cubism::BlockStoreItem.new(context: self, block: block.dup)
9
- template = capture(&block)
10
-
11
- tag.cubicle_element(
12
- identifier: signed_stream_identifier(resource.to_gid.to_s),
13
- user: user.to_sgid.to_s,
14
- "appear-trigger": appear_trigger,
15
- "disappear-trigger": disappear_trigger,
16
- "trigger-root": trigger_root,
17
- id: "cubicle-#{verifiable_id}",
18
- "exclude-current-user": exclude_current_user,
19
- **html_options
20
- ) do
21
- content_tag(:template, template, {slot: "template"})
22
- end
23
- end
24
- end
@@ -1,3 +0,0 @@
1
- module Cubism::Base
2
- extend ActiveSupport::Concern
3
- end
@@ -1,11 +0,0 @@
1
- module Cubism::User
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- Cubism.user_class = self
6
-
7
- class_eval do
8
- cattr_accessor :cubicle_attributes
9
- end
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- class Cubism::Base
2
- include ActiveModel::Model
3
- include Kredis::Attributes
4
- include Cubism::Presence
5
- include GlobalID::Identification
6
-
7
- def self.find(id)
8
- new if id == "cubism-#{self.class.name.underscore}"
9
- end
10
-
11
- def id
12
- "cubism-#{self.class.name.underscore}"
13
- end
14
- end
@@ -1,13 +0,0 @@
1
- class Cubism::Base
2
- include ActiveModel::Model
3
- include Cubism::Presence
4
- include GlobalID::Identifiable
5
-
6
- def self.find(id)
7
- new if id == "cubism-#{self.class.name.underscore}"
8
- end
9
-
10
- def id
11
- "cubism-#{self.class.name.underscore}"
12
- end
13
- end
File without changes
@@ -1,5 +0,0 @@
1
- module Cubism
2
- class Engine < ::Rails::Engine
3
- end
4
- end
5
-
@@ -1,4 +0,0 @@
1
- module Cubism
2
- class Railtie < ::Rails::Railtie
3
- end
4
- end