cubism 0.1.0.pre10 → 0.1.0.pre13

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +16 -0
  3. data/Appraisals~ +16 -0
  4. data/CHANGELOG.md +87 -0
  5. data/Gemfile +7 -0
  6. data/Gemfile.lock +220 -0
  7. data/Gemfile~ +9 -0
  8. data/README.md +35 -14
  9. data/README.md~ +191 -0
  10. data/app/assets/javascripts/cubism.js +141 -0
  11. data/app/assets/javascripts/cubism.min.js +2 -0
  12. data/app/assets/javascripts/cubism.min.js.map +1 -0
  13. data/app/assets/javascripts/cubism.umd.js +149 -0
  14. data/app/assets/javascripts/cubism.umd.min.js +2 -0
  15. data/app/assets/javascripts/cubism.umd.min.js.map +1 -0
  16. data/app/channels/cubism/presence_channel.rb +14 -5
  17. data/app/helpers/cubism_helper.rb +15 -17
  18. data/app/models/concerns/cubism/presence.rb +11 -3
  19. data/bin/rails +14 -0
  20. data/bin/standardize +4 -0
  21. data/bin/test +5 -0
  22. data/cubism.gemspec +36 -0
  23. data/cubism.gemspec~ +28 -0
  24. data/lib/cubism/broadcaster.rb +13 -6
  25. data/lib/cubism/cubicle_store.rb +141 -0
  26. data/lib/cubism/engine.rb +23 -2
  27. data/lib/cubism/importmap.rb +2 -0
  28. data/lib/cubism/preprocessor.rb +4 -1
  29. data/lib/cubism/version.rb +1 -1
  30. data/lib/cubism.rb +3 -2
  31. data/package.json +43 -0
  32. data/package.json~ +33 -0
  33. data/rollup.config.js +77 -0
  34. data/{lib/cubism/parser.rb~ → rollup.config.js~} +0 -0
  35. data/test/block_container_test.rb +105 -0
  36. data/test/block_source_test.rb +102 -0
  37. data/test/broadcaster_test.rb +66 -0
  38. data/test/channels/cubism/presence_channel_test.rb +72 -0
  39. data/test/cubicle_store_test.rb +34 -0
  40. data/test/cubism_test.rb +7 -0
  41. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  42. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  43. data/test/dummy/app/controllers/application_controller.rb +2 -0
  44. data/test/dummy/app/helpers/application_helper.rb +2 -0
  45. data/test/dummy/app/jobs/application_job.rb +7 -0
  46. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  47. data/test/dummy/app/models/application_record.rb +3 -0
  48. data/test/dummy/app/models/post.rb +3 -0
  49. data/test/dummy/app/models/user.rb +3 -0
  50. data/test/dummy/config/application.rb +22 -0
  51. data/test/dummy/config/boot.rb +5 -0
  52. data/test/dummy/config/environment.rb +5 -0
  53. data/test/dummy/config/environments/development.rb +76 -0
  54. data/test/dummy/config/environments/production.rb +120 -0
  55. data/test/dummy/config/environments/test.rb +59 -0
  56. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  57. data/test/dummy/config/initializers/assets.rb +12 -0
  58. data/test/dummy/config/initializers/backtrace_silencers.rb +8 -0
  59. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  60. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  61. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  62. data/test/dummy/config/initializers/inflections.rb +16 -0
  63. data/test/dummy/config/initializers/mime_types.rb +4 -0
  64. data/test/dummy/config/initializers/permissions_policy.rb +11 -0
  65. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  66. data/test/dummy/config/puma.rb +43 -0
  67. data/test/dummy/config/routes.rb +3 -0
  68. data/test/dummy/db/migrate/20220102072929_create_posts.rb +10 -0
  69. data/test/dummy/db/migrate/20220102073003_create_users.rb +9 -0
  70. data/test/dummy/db/schema.rb +26 -0
  71. data/test/dummy/test/models/post_test.rb +7 -0
  72. data/test/dummy/test/models/user_test.rb +7 -0
  73. data/test/helpers/cubism_helper_test.rb +39 -0
  74. data/test/integration/navigation_test.rb +7 -0
  75. data/test/models/concerns/presence_test.rb +25 -0
  76. data/test/models/concerns/user_test.rb +9 -0
  77. data/test/rendering/preprocessor_test.rb +61 -0
  78. data/test/test_helper.rb +16 -0
  79. data/yarn.lock +2814 -0
  80. metadata +118 -18
  81. data/app/channels/cubism/presence_channel.rb~ +0 -52
  82. data/app/helpers/cubism_helper.rb~ +0 -34
  83. data/app/models/concerns/cubism/presence.rb~ +0 -13
  84. data/config/routes.rb +0 -2
  85. data/lib/cubism/broadcaster.rb~ +0 -50
  86. data/lib/cubism/cubicle_block_store.rb +0 -56
  87. data/lib/cubism/cubicle_block_store.rb~ +0 -43
  88. data/lib/cubism/engine.rb~ +0 -4
  89. data/lib/cubism/preprocessor.rb~ +0 -26
  90. data/lib/cubism/version.rb~ +0 -3
  91. data/lib/cubism.rb~ +0 -18
  92. data/lib/tasks/cubism_tasks.rake +0 -4
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cubism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre10
4
+ version: 0.1.0.pre13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Rubisch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-24 00:00:00.000000000 Z
11
+ date: 2022-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 5.0.0.pre8
47
+ version: 5.0.0.pre9
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 5.0.0.pre8
54
+ version: 5.0.0.pre9
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: standard
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -129,32 +129,88 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
+ - Appraisals
133
+ - Appraisals~
134
+ - CHANGELOG.md
135
+ - Gemfile
136
+ - Gemfile.lock
137
+ - Gemfile~
132
138
  - MIT-LICENSE
133
139
  - README.md
140
+ - README.md~
134
141
  - Rakefile
142
+ - app/assets/javascripts/cubism.js
143
+ - app/assets/javascripts/cubism.min.js
144
+ - app/assets/javascripts/cubism.min.js.map
145
+ - app/assets/javascripts/cubism.umd.js
146
+ - app/assets/javascripts/cubism.umd.min.js
147
+ - app/assets/javascripts/cubism.umd.min.js.map
135
148
  - app/channels/cubism/presence_channel.rb
136
- - app/channels/cubism/presence_channel.rb~
137
149
  - app/helpers/cubism_helper.rb
138
- - app/helpers/cubism_helper.rb~
139
150
  - app/models/concerns/cubism/presence.rb
140
- - app/models/concerns/cubism/presence.rb~
141
151
  - app/models/concerns/cubism/user.rb
142
152
  - app/models/cubism/current.rb
143
- - config/routes.rb
153
+ - bin/rails
154
+ - bin/standardize
155
+ - bin/test
156
+ - cubism.gemspec
157
+ - cubism.gemspec~
144
158
  - lib/cubism.rb
145
- - lib/cubism.rb~
146
159
  - lib/cubism/broadcaster.rb
147
- - lib/cubism/broadcaster.rb~
148
- - lib/cubism/cubicle_block_store.rb
149
- - lib/cubism/cubicle_block_store.rb~
160
+ - lib/cubism/cubicle_store.rb
150
161
  - lib/cubism/engine.rb
151
- - lib/cubism/engine.rb~
152
- - lib/cubism/parser.rb~
162
+ - lib/cubism/importmap.rb
153
163
  - lib/cubism/preprocessor.rb
154
- - lib/cubism/preprocessor.rb~
155
164
  - lib/cubism/version.rb
156
- - lib/cubism/version.rb~
157
- - lib/tasks/cubism_tasks.rake
165
+ - package.json
166
+ - package.json~
167
+ - rollup.config.js
168
+ - rollup.config.js~
169
+ - test/block_container_test.rb
170
+ - test/block_source_test.rb
171
+ - test/broadcaster_test.rb
172
+ - test/channels/cubism/presence_channel_test.rb
173
+ - test/cubicle_store_test.rb
174
+ - test/cubism_test.rb
175
+ - test/dummy/app/channels/application_cable/channel.rb
176
+ - test/dummy/app/channels/application_cable/connection.rb
177
+ - test/dummy/app/controllers/application_controller.rb
178
+ - test/dummy/app/helpers/application_helper.rb
179
+ - test/dummy/app/jobs/application_job.rb
180
+ - test/dummy/app/mailers/application_mailer.rb
181
+ - test/dummy/app/models/application_record.rb
182
+ - test/dummy/app/models/post.rb
183
+ - test/dummy/app/models/user.rb
184
+ - test/dummy/config/application.rb
185
+ - test/dummy/config/boot.rb
186
+ - test/dummy/config/environment.rb
187
+ - test/dummy/config/environments/development.rb
188
+ - test/dummy/config/environments/production.rb
189
+ - test/dummy/config/environments/test.rb
190
+ - test/dummy/config/initializers/application_controller_renderer.rb
191
+ - test/dummy/config/initializers/assets.rb
192
+ - test/dummy/config/initializers/backtrace_silencers.rb
193
+ - test/dummy/config/initializers/content_security_policy.rb
194
+ - test/dummy/config/initializers/cookies_serializer.rb
195
+ - test/dummy/config/initializers/filter_parameter_logging.rb
196
+ - test/dummy/config/initializers/inflections.rb
197
+ - test/dummy/config/initializers/mime_types.rb
198
+ - test/dummy/config/initializers/permissions_policy.rb
199
+ - test/dummy/config/initializers/wrap_parameters.rb
200
+ - test/dummy/config/puma.rb
201
+ - test/dummy/config/routes.rb
202
+ - test/dummy/db/migrate/20220102072929_create_posts.rb
203
+ - test/dummy/db/migrate/20220102073003_create_users.rb
204
+ - test/dummy/db/schema.rb
205
+ - test/dummy/test/models/post_test.rb
206
+ - test/dummy/test/models/user_test.rb
207
+ - test/helpers/cubism_helper_test.rb
208
+ - test/integration/navigation_test.rb
209
+ - test/models/concerns/presence_test.rb
210
+ - test/models/concerns/user_test.rb
211
+ - test/rendering/preprocessor_test.rb
212
+ - test/test_helper.rb
213
+ - yarn.lock
158
214
  homepage: https://github.com/julianrubisch/cubism
159
215
  licenses:
160
216
  - MIT
@@ -180,4 +236,48 @@ rubygems_version: 3.1.4
180
236
  signing_key:
181
237
  specification_version: 4
182
238
  summary: Lightweight Resource-Based Presence Solution with CableReady
183
- test_files: []
239
+ test_files:
240
+ - test/dummy/app/mailers/application_mailer.rb
241
+ - test/dummy/app/models/application_record.rb
242
+ - test/dummy/app/models/post.rb
243
+ - test/dummy/app/models/user.rb
244
+ - test/dummy/app/jobs/application_job.rb
245
+ - test/dummy/app/controllers/application_controller.rb
246
+ - test/dummy/app/helpers/application_helper.rb
247
+ - test/dummy/app/channels/application_cable/connection.rb
248
+ - test/dummy/app/channels/application_cable/channel.rb
249
+ - test/dummy/test/models/post_test.rb
250
+ - test/dummy/test/models/user_test.rb
251
+ - test/dummy/config/routes.rb
252
+ - test/dummy/config/environments/production.rb
253
+ - test/dummy/config/environments/development.rb
254
+ - test/dummy/config/environments/test.rb
255
+ - test/dummy/config/environment.rb
256
+ - test/dummy/config/application.rb
257
+ - test/dummy/config/puma.rb
258
+ - test/dummy/config/boot.rb
259
+ - test/dummy/config/initializers/application_controller_renderer.rb
260
+ - test/dummy/config/initializers/backtrace_silencers.rb
261
+ - test/dummy/config/initializers/mime_types.rb
262
+ - test/dummy/config/initializers/filter_parameter_logging.rb
263
+ - test/dummy/config/initializers/wrap_parameters.rb
264
+ - test/dummy/config/initializers/assets.rb
265
+ - test/dummy/config/initializers/cookies_serializer.rb
266
+ - test/dummy/config/initializers/permissions_policy.rb
267
+ - test/dummy/config/initializers/content_security_policy.rb
268
+ - test/dummy/config/initializers/inflections.rb
269
+ - test/dummy/db/schema.rb
270
+ - test/dummy/db/migrate/20220102072929_create_posts.rb
271
+ - test/dummy/db/migrate/20220102073003_create_users.rb
272
+ - test/integration/navigation_test.rb
273
+ - test/broadcaster_test.rb
274
+ - test/cubicle_store_test.rb
275
+ - test/models/concerns/presence_test.rb
276
+ - test/models/concerns/user_test.rb
277
+ - test/block_container_test.rb
278
+ - test/cubism_test.rb
279
+ - test/rendering/preprocessor_test.rb
280
+ - test/test_helper.rb
281
+ - test/helpers/cubism_helper_test.rb
282
+ - test/block_source_test.rb
283
+ - test/channels/cubism/presence_channel_test.rb
@@ -1,52 +0,0 @@
1
- class Cubism::PresenceChannel < ActionCable::Channel::Base
2
- include CableReady::StreamIdentifier
3
-
4
- def subscribed
5
- if resource.present?
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?
9
- else
10
- reject
11
- end
12
- end
13
-
14
- def unsubscribed
15
- return unless resource.present?
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
27
- resource.present_users.remove(user.id)
28
- end
29
-
30
- private
31
-
32
- def resource
33
- locator = verified_stream_identifier(params[:identifier])
34
- GlobalID::Locator.locate(locator)
35
- end
36
-
37
- def user
38
- GlobalID::Locator.locate_signed(params[:user])
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
52
- end
@@ -1,34 +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
- filename, lineno = block.source_location
6
- block_location = block.source_location.join(":")
7
- resource_user_key = "#{resource.to_gid}:#{user.to_gid}"
8
- digested_block_key = ActiveSupport::Digest.hexdigest("#{block_location}:#{resource_user_key}")
9
-
10
- Cubism.store[digested_block_key] = Cubism::BlockStoreItem.new(
11
- block_location: block_location,
12
- resource_gid: resource.to_gid.to_s,
13
- user_gid: user.to_gid.to_s
14
- )
15
-
16
- if Cubism.store[block_location].blank? && !block_location.start_with?("inline template")
17
- lines = File.readlines(filename)[lineno - 1..]
18
-
19
- preprocessor = Cubism::Preprocessor.new(source: lines.join.squish, view_context: self)
20
- Cubism.store[block_location] = preprocessor.process
21
- end
22
-
23
- tag.cubicle_element(
24
- identifier: signed_stream_identifier(resource.to_gid.to_s),
25
- user: user.to_sgid.to_s,
26
- "appear-trigger": Array(appear_trigger).join(","),
27
- "disappear-trigger": disappear_trigger,
28
- "trigger-root": trigger_root,
29
- id: "cubicle-#{digested_block_key}",
30
- "exclude-current-user": exclude_current_user,
31
- **html_options
32
- )
33
- end
34
- end
@@ -1,13 +0,0 @@
1
- module Cubism::Presence
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- kredis_set :present_users, after_change: :stream_presence
6
- kredis_set :cubicle_element_ids
7
- kredis_hash :excluded_user_id_for_element_id
8
- end
9
-
10
- def stream_presence
11
- Cubism::Broadcaster.new(resource: self).broadcast
12
- end
13
- end
data/config/routes.rb DELETED
@@ -1,2 +0,0 @@
1
- Rails.application.routes.draw do
2
- end
@@ -1,50 +0,0 @@
1
- require "cable_ready"
2
- require "parser/current"
3
-
4
- module Cubism
5
- class Broadcaster
6
- include CableReady::Broadcaster
7
- include CableReady::StreamIdentifier
8
- include ActionView::Helpers
9
-
10
- attr_reader :resource
11
-
12
- def initialize(resource:)
13
- @resource = resource
14
- end
15
-
16
- def broadcast
17
- resource.cubicle_element_ids.to_a.each do |element_id|
18
- /cubicle-(?<block_key>.+)/ =~ element_id
19
- block_store_item = Cubism.store[block_key]
20
-
21
- next if block_store_item.blank?
22
-
23
- block_source = Cubism.store[block_store_item.block_location]
24
- erubi = ActionView::Template::Handlers::ERB::Erubi.new(block_source)
25
- ast = Parser::CurrentRuby.parse erubi.src
26
-
27
- # html = ApplicationController.render(inline: block_source, locals: {current_user: block_store_item.user, "@project": block_store_item.resource, users: resource.present_users_for_element_id(element_id)})
28
-
29
- # binding.pry
30
-
31
- # context = ActionView::Base.with_view_paths(ActionController::Base.view_paths)
32
- # erubi = ActionView::Template::Handlers::ERB::Erubi.new(File.read(filename), filename: filename)
33
- # context = ApplicationController.new.view_context
34
-
35
- # filename, lineno = block_store_item.block_location.split
36
-
37
- # binding.pry
38
-
39
- # block = Cubism.store[block_key].block
40
- # view_context = Cubism.store[block_key].context
41
- # html = view_context.capture(resource.present_users_for_element_id(element_id), &block)
42
-
43
- cable_ready[element_id].inner_html(
44
- selector: "cubicle-element##{element_id}[identifier='#{signed_stream_identifier(resource.to_global_id.to_s)}']",
45
- html: "#{resource.present_users_for_element_id(element_id).map(&:id)}"
46
- ).broadcast
47
- end
48
- end
49
- end
50
- end
@@ -1,56 +0,0 @@
1
- module Cubism
2
- class CubicleBlockStore
3
- delegate_missing_to :@blocks
4
-
5
- def initialize
6
- @blocks = Kredis.hash "cubism-blocks"
7
- end
8
-
9
- def [](key)
10
- Marshal.load(@blocks[key]) if @blocks[key]
11
- end
12
-
13
- def []=(key, value)
14
- mutex.synchronize do
15
- @blocks[key] = Marshal.dump value
16
- end
17
- end
18
-
19
- def clear
20
- mutex.synchronize do
21
- # kredis #remove
22
- @blocks.remove
23
- end
24
- end
25
-
26
- def size
27
- @blocks.to_h.size
28
- end
29
-
30
- private
31
-
32
- def mutex
33
- @mutex ||= Mutex.new
34
- end
35
- end
36
-
37
- BlockStoreItem = Struct.new(:block_location, :block_source, :user_gid, :resource_gid, keyword_init: true) do
38
- def user
39
- GlobalID::Locator.locate self[:user_gid]
40
- end
41
-
42
- def resource
43
- GlobalID::Locator.locate self[:resource_gid]
44
- end
45
-
46
- def marshal_dump
47
- to_h
48
- end
49
-
50
- def marshal_load(serialized_item)
51
- %i[block_location block_source user_gid resource_gid].each do |arg|
52
- send("#{arg}=", serialized_item[arg])
53
- end
54
- end
55
- end
56
- end
@@ -1,43 +0,0 @@
1
- module Cubism
2
- class CubicleBlockStore
3
- include Singleton
4
-
5
- delegate_missing_to :@blocks
6
-
7
- def initialize
8
- @blocks = {}
9
- end
10
-
11
- def [](key)
12
- @blocks[key]
13
- end
14
-
15
- def []=(key, value)
16
- mutex.synchronize do
17
- @blocks[key] = value
18
- end
19
- end
20
-
21
- def clear
22
- mutex.synchronize do
23
- @blocks.clear
24
- end
25
- end
26
-
27
- private
28
-
29
- def mutex
30
- @mutex ||= Mutex.new
31
- end
32
- end
33
-
34
- BlockStoreItem = Struct.new(:block_location, :user_gid, :resource_gid, keyword_init: true) do
35
- def user
36
- GlobalID::Locator.locate self[:user_gid]
37
- end
38
-
39
- def resource
40
- GlobalID::Locator.locate self[:resource_gid]
41
- end
42
- end
43
- end
@@ -1,4 +0,0 @@
1
- module Cubism
2
- class Engine < ::Rails::Engine
3
- end
4
- end
@@ -1,26 +0,0 @@
1
- module Cubism
2
- class Preprocessor
3
- def initialize(source:, view_context:)
4
- start_pos = /<%= cubicle_for/ =~ source
5
- @source = source[start_pos..]
6
- @view_context = view_context
7
- end
8
-
9
- def process
10
- begin
11
- do_parse
12
- rescue NameError
13
- # we ignore any name errors from unset instance variables or local assigns here
14
- end
15
-
16
- @source
17
- end
18
-
19
- def do_parse
20
- ActionView::Template::Handlers::ERB::Erubi.new(@source).evaluate(@view_context)
21
- rescue SyntaxError
22
- @source = @source[..-2]
23
- do_parse
24
- end
25
- end
26
- end
@@ -1,3 +0,0 @@
1
- module Cubism
2
- VERSION = "0.1.0.pre9"
3
- end
data/lib/cubism.rb~ DELETED
@@ -1,18 +0,0 @@
1
- require "kredis"
2
-
3
- require "cubism/version"
4
- require "cubism/engine"
5
- require "cubism/broadcaster"
6
- require "cubism/cubicle_block_store"
7
- require "cubism/preprocessor"
8
-
9
- module Cubism
10
- extend ActiveSupport::Autoload
11
-
12
- autoload :Broadcaster, "cubism/broadcaster"
13
- autoload :Preprocessor, "cubism/preprocessor"
14
-
15
- mattr_accessor :user_class, instance_writer: false, instance_reader: false
16
-
17
- mattr_reader :store, instance_reader: false, default: Cubism::CubicleBlockStore.instance
18
- end
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :cubism do
3
- # # Task goes here
4
- # end