futurism 0.4.1 → 0.5.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc887b3a3173cce8feec82e572327f820cdb39793b5ee5fd5977b6e32c1edb78
4
- data.tar.gz: e0f429c1861f30754e91c3dcce1121bf95894f558792f15f7f72958006b01dea
3
+ metadata.gz: cde59cb75363c7ba6032575a5783a0f0407cdb630fa1301fda0c38e7bc21949f
4
+ data.tar.gz: d8f5acd7d125dd0b41071704c10e0db6cca741cea7f271c290517527ff522ef6
5
5
  SHA512:
6
- metadata.gz: 603a65c0d08974feeaceb867e076ab69daf99e51a139fd8f9c2634d7e3b885a7f662ae1c2c32e0e2c31ec6e2dd1b55ec2df8ad385441abfe25d66a7088d30a21
7
- data.tar.gz: 11d930242efc8ff82a7b495197b4c5fceb9a0a7cc4e89fc48d9464e05e85e7eb307b7a25dac85628e2a5f7e66e1427e960150f544b325552142fc1ececb5e7db
6
+ metadata.gz: f6d561d2864614bbc0bc41f030477f7cc1ab8ea3518edbca35903054adcc0107aad3634085cd3de85455f2c0d0569829a13ec7cb2ada161db812b478d2140cd2
7
+ data.tar.gz: efcd9f32c2814e05f9603daf8e949c6df2869d32e94da772cf6097ceb6e5587f3d543363c95eea07f8ad26e41ce18430899a6e2a541bff31ccc0c62cb1171883
@@ -37,7 +37,11 @@ module Futurism
37
37
  def resource(signed_params:, sgid:)
38
38
  return GlobalID::Locator.locate_signed(sgid) if sgid.present?
39
39
 
40
- Rails.application.message_verifier("futurism").verify(signed_params)
40
+ Rails
41
+ .application
42
+ .message_verifier("futurism")
43
+ .verify(signed_params)
44
+ .deep_transform_values { |value| value.is_a?(String) && value.start_with?("gid://") ? GlobalID::Locator.locate(value) : value }
41
45
  end
42
46
  end
43
47
  end
@@ -2,8 +2,16 @@ module Futurism
2
2
  class Channel < ActionCable::Channel::Base
3
3
  include CableReady::Broadcaster
4
4
 
5
+ def stream_name
6
+ ids = connection.identifiers.map { |identifier| send(identifier).try(:id) || send(identifier) }
7
+ [
8
+ params[:channel],
9
+ ids.select(&:present?).join(";")
10
+ ].select(&:present?).join(":")
11
+ end
12
+
5
13
  def subscribed
6
- stream_from "Futurism::Channel"
14
+ stream_from stream_name
7
15
  end
8
16
 
9
17
  def receive(data)
@@ -15,7 +23,7 @@ module Futurism
15
23
  resources.each do |signed_params, sgid|
16
24
  selector = "[data-signed-params='#{signed_params}']"
17
25
  selector << "[data-sgid='#{sgid}']" if sgid.present?
18
- cable_ready["Futurism::Channel"].outer_html(
26
+ cable_ready[stream_name].outer_html(
19
27
  selector: selector,
20
28
  html: ApplicationController.render(resource(signed_params: signed_params, sgid: sgid))
21
29
  )
@@ -29,7 +37,11 @@ module Futurism
29
37
  def resource(signed_params:, sgid:)
30
38
  return GlobalID::Locator.locate_signed(sgid) if sgid.present?
31
39
 
32
- Rails.application.message_verifier("futurism").verify(signed_params)
40
+ Rails
41
+ .application
42
+ .message_verifier("futurism")
43
+ .verify(signed_params)
44
+ .deep_transform_values { |value| value.start_with?("gid://") ? GlobalID::Locator.locate(value) : value }
33
45
  end
34
46
  end
35
47
  end
@@ -65,10 +65,18 @@ module Futurism
65
65
  end
66
66
  end
67
67
 
68
+ def transformed_options
69
+ require_relative "shims/deep_transform_values" unless options.respond_to? :deep_transform_values
70
+
71
+ options.deep_transform_values do |value|
72
+ value.is_a?(ActiveRecord::Base) ? value.to_global_id.to_s : value
73
+ end
74
+ end
75
+
68
76
  private
69
77
 
70
78
  def signed_params
71
- Rails.application.message_verifier("futurism").generate(options)
79
+ Rails.application.message_verifier("futurism").generate(transformed_options)
72
80
  end
73
81
  end
74
82
  end
@@ -6,7 +6,8 @@ module Futurism
6
6
  if records_or_string.is_a?(ActiveRecord::Base) || records_or_string.is_a?(ActiveRecord::Relation)
7
7
  futurize_active_record(records_or_string, extends: extends, placeholder: placeholder, **options)
8
8
  elsif records_or_string.is_a?(String)
9
- futurize_with_options(extends: extends, placeholder: placeholder, partial: records_or_string, **options)
9
+ html_options = options.delete(:html_options)
10
+ futurize_with_options(extends: extends, placeholder: placeholder, partial: records_or_string, locals: options, html_options: html_options)
10
11
  else
11
12
  futurize_with_options(extends: extends, placeholder: placeholder, **options)
12
13
  end
@@ -35,38 +36,47 @@ module Futurism
35
36
  class Element
36
37
  include ActionView::Helpers
37
38
 
38
- attr_reader :extends, :placeholder, :html_options, :model, :options
39
+ attr_reader :extends, :placeholder, :html_options, :data_attributes, :model, :options
39
40
 
40
41
  def initialize(extends:, placeholder:, options:)
41
42
  @extends = extends
42
43
  @placeholder = placeholder
43
44
  @html_options = options.delete(:html_options) || {}
45
+ @data_attributes = html_options.fetch(:data, {}).except(:sgid, :signed_params)
44
46
  @model = options.delete(:model)
45
- @options = options
47
+ @options = data_attributes.any? ? options.merge(data: data_attributes) : options
46
48
  end
47
49
 
48
50
  def dataset
49
- {
51
+ data_attributes.merge({
50
52
  signed_params: signed_params,
51
53
  sgid: model && model.to_sgid.to_s
52
- }
54
+ })
53
55
  end
54
56
 
55
57
  def render
56
58
  case extends
57
59
  when :li
58
- content_tag :li, placeholder, {data: dataset, is: "futurism-li"}.merge(html_options)
60
+ content_tag :li, placeholder, html_options.deep_merge({data: dataset, is: "futurism-li"})
59
61
  when :tr
60
- content_tag :tr, placeholder, {data: dataset, is: "futurism-table-row"}.merge(html_options)
62
+ content_tag :tr, placeholder, html_options.deep_merge({data: dataset, is: "futurism-table-row"})
61
63
  else
62
- content_tag :"futurism-element", placeholder, {data: dataset}.merge(html_options)
64
+ content_tag :"futurism-element", placeholder, html_options.deep_merge({data: dataset})
65
+ end
66
+ end
67
+
68
+ def transformed_options
69
+ require_relative "shims/deep_transform_values" unless options.respond_to? :deep_transform_values
70
+
71
+ options.deep_transform_values do |value|
72
+ value.is_a?(ActiveRecord::Base) ? value.to_global_id.to_s : value
63
73
  end
64
74
  end
65
75
 
66
76
  private
67
77
 
68
78
  def signed_params
69
- Rails.application.message_verifier("futurism").generate(options)
79
+ Rails.application.message_verifier("futurism").generate(transformed_options)
70
80
  end
71
81
  end
72
82
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hash
4
+ # Returns a new hash with all values converted by the block operation.
5
+ # This includes the values from the root hash and from all
6
+ # nested hashes and arrays.
7
+ #
8
+ # hash = { person: { name: 'Rob', age: '28' } }
9
+ #
10
+ # hash.deep_transform_values{ |value| value.to_s.upcase }
11
+ # # => {person: {name: "ROB", age: "28"}}
12
+ def deep_transform_values(&block)
13
+ _deep_transform_values_in_object(self, &block)
14
+ end
15
+
16
+ # Destructively converts all values by using the block operation.
17
+ # This includes the values from the root hash and from all
18
+ # nested hashes and arrays.
19
+ def deep_transform_values!(&block)
20
+ _deep_transform_values_in_object!(self, &block)
21
+ end
22
+
23
+ private
24
+
25
+ # Support methods for deep transforming nested hashes and arrays.
26
+ def _deep_transform_values_in_object(object, &block)
27
+ case object
28
+ when Hash
29
+ object.transform_values { |value| _deep_transform_values_in_object(value, &block) }
30
+ when Array
31
+ object.map { |e| _deep_transform_values_in_object(e, &block) }
32
+ else
33
+ yield(object)
34
+ end
35
+ end
36
+
37
+ def _deep_transform_values_in_object!(object, &block)
38
+ case object
39
+ when Hash
40
+ object.transform_values! { |value| _deep_transform_values_in_object!(value, &block) }
41
+ when Array
42
+ object.map! { |e| _deep_transform_values_in_object!(e, &block) }
43
+ else
44
+ yield(object)
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module Futurism
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: futurism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Rubisch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-09 00:00:00.000000000 Z
11
+ date: 2020-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: appraisal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +142,14 @@ dependencies:
128
142
  requirements:
129
143
  - - ">="
130
144
  - !ruby/object:Gem::Version
131
- version: '6'
145
+ version: '5.2'
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
- version: '6'
152
+ version: '5.2'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: cable_ready
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -170,6 +184,7 @@ files:
170
184
  - lib/futurism/engine.rb
171
185
  - lib/futurism/helpers.rb
172
186
  - lib/futurism/helpers.rb~
187
+ - lib/futurism/shims/deep_transform_values.rb
173
188
  - lib/futurism/version.rb
174
189
  - lib/tasks/futurism_tasks.rake
175
190
  - lib/tasks/futurism_tasks.rake~