motion 0.5.0 → 0.7.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: 579385926d481a6978aa354e54e7b63cdd92f8bb37dc60b49be0f1530371c0d5
4
- data.tar.gz: 9d37a416852746fb7b75fd74a3ff972419baddf822b1283c42b86b18be3a0b64
3
+ metadata.gz: ff2870c4229fefaba7ff72f8275b969006a6b0db22144c234e5dd3554523a95d
4
+ data.tar.gz: 5c5488e3dd2ae17e8bd4db86c5daf64db3093bcf35729a2d185965cc84f8be27
5
5
  SHA512:
6
- metadata.gz: 0bcc311420b91f6479e1a8e9e45680e9854f5f719dc74ef7f25eeda5595e960f3d1082bf84d5b42c6e1bd01b61c24f788ef34df4322bee95d8162e4b732c08d1
7
- data.tar.gz: d3d8ead03222c53a801116cc20197860cad5bd8aaa5534b728cc37a32ca00b231fbafdee1fa6e649f004f9b897eef1826a5b8c5d8317d1b3fd11da5586776b43
6
+ metadata.gz: af5d390212fac33bc5db249f23d9401b5ca5da3c2ef4edfd6a606d68ce5fa4fc8c5153b5e29ee2fb8b4a8d5c07e40aa543e1ef35cef0682c021675a24fcb7fed
7
+ data.tar.gz: 4418c496d43ea478b16c828538fc3a18850c8ba60d68646a715453ee47b80c9751aa1948df1c423002c4b19b223be115d12b9ed4be7ce28cc14db611272d4f04
@@ -13,7 +13,7 @@ module Motion
13
13
  ACTION_METHODS = Set.new(["process_motion"]).freeze
14
14
  private_constant :ACTION_METHODS
15
15
 
16
- # Don't use the ActionCable huertistic for deciding what actions can be
16
+ # Don't use the ActionCable heuristic for deciding what actions can be
17
17
  # called from JavaScript. Instead, hard-code the list so we can make other
18
18
  # methods public without worrying about them being called from JavaScript.
19
19
  def self.action_methods
@@ -84,7 +84,7 @@ module Motion
84
84
  @log_helper ||= LogHelper.for_channel(self)
85
85
  end
86
86
 
87
- # Memoize the renderer on the connection so that it can be shared accross
87
+ # Memoize the renderer on the connection so that it can be shared across
88
88
  # all components. `ActionController::Renderer` is already thread-safe and
89
89
  # designed to be reused.
90
90
  def renderer
@@ -28,7 +28,9 @@ module Motion
28
28
  @assets_environment
29
29
  ].freeze
30
30
 
31
- private_constant :STATE_EXCLUDED_IVARS
31
+ STATE_IVAR_OBFUSCATION_PREFIX = "@__vc_"
32
+
33
+ private_constant :STATE_EXCLUDED_IVARS, :STATE_IVAR_OBFUSCATION_PREFIX
32
34
 
33
35
  def rerender!
34
36
  @_awaiting_forced_rerender = true
@@ -69,6 +71,7 @@ module Motion
69
71
 
70
72
  def marshal_dump
71
73
  (instance_variables - STATE_EXCLUDED_IVARS)
74
+ .reject { |ivar| ivar.start_with? STATE_IVAR_OBFUSCATION_PREFIX }
72
75
  .map { |ivar| [ivar, instance_variable_get(ivar)] }
73
76
  .to_h
74
77
  end
@@ -22,6 +22,10 @@ module Motion
22
22
  raw["value"]
23
23
  end
24
24
 
25
+ def checked?
26
+ raw["checked"]
27
+ end
28
+
25
29
  def attributes
26
30
  raw.fetch("attributes", {})
27
31
  end
data/lib/motion/errors.rb CHANGED
@@ -68,7 +68,7 @@ module Motion
68
68
  class InvalidComponentStateError < ComponentError; end
69
69
 
70
70
  class UnrepresentableStateError < InvalidComponentStateError
71
- def initialize(component, cause)
71
+ def initialize(component, cause, failing_ivars)
72
72
  super(
73
73
  component,
74
74
  "Some state prevented `#{component.class}` from being serialized " \
@@ -79,6 +79,9 @@ module Motion
79
79
  "\n" \
80
80
  "The specific error from `Marshal.dump` was: #{cause}\n" \
81
81
  "\n" \
82
+ "unserializable ivars: #{failing_ivars.join(", ")}\n"\
83
+ "\n" \
84
+ "\n" \
82
85
  "Hint: Ensure that any exotic state variables in " \
83
86
  "`#{component.class}` are removed or replaced."
84
87
  )
@@ -114,7 +117,7 @@ module Motion
114
117
  "of the application to be mounted because new code with old state " \
115
118
  "can lead to unpredictable and unsafe behavior.\n" \
116
119
  "\n" \
117
- "Hint: If you would like to allow this component to surive " \
120
+ "Hint: If you would like to allow this component to survive " \
118
121
  "deployments, consider providing an alternative implimentation for " \
119
122
  "`#{component.class}.upgrade_from`."
120
123
  )
@@ -61,10 +61,22 @@ module Motion
61
61
 
62
62
  private
63
63
 
64
- def dump(component)
64
+ def dump!(component)
65
65
  Marshal.dump(component)
66
+ end
67
+
68
+ def dump(component)
69
+ dump!(component)
66
70
  rescue TypeError => e
67
- raise UnrepresentableStateError.new(component, e.message)
71
+ failing_ivars = []
72
+
73
+ component.marshal_dump.each do |ivar_name, ivar_value|
74
+ dump!(ivar_value)
75
+ rescue TypeError
76
+ failing_ivars << ivar_name
77
+ end
78
+
79
+ raise UnrepresentableStateError.new(component, e.message, failing_ivars)
68
80
  end
69
81
 
70
82
  def load(state)
@@ -4,6 +4,14 @@ require "motion"
4
4
 
5
5
  module Motion
6
6
  module TestHelpers
7
+ class MockComponent < ViewComponent::Base
8
+ include Motion::Component
9
+ end
10
+
11
+ def callback_stub(method_name = :bound)
12
+ Motion::Callback.new(MockComponent.new, method_name)
13
+ end
14
+
7
15
  def assert_motion(component, motion_name)
8
16
  assert motion?(component, motion_name)
9
17
  end
@@ -26,8 +34,37 @@ module Motion
26
34
  end
27
35
  end
28
36
 
37
+ def process_broadcast(component, method_name, msg)
38
+ callback = component.bind(method_name)
39
+ component.process_broadcast(callback.broadcast, msg)
40
+ end
41
+
42
+ def assert_timer(component, method_name, interval)
43
+ assert_equal interval, component.periodic_timers[method_name.to_s]
44
+ end
45
+
46
+ def refute_timer(component, method_name)
47
+ refute timer?(component, method_name)
48
+ end
49
+
50
+ def timer?(component, method_name)
51
+ component.periodic_timers.include?(method_name.to_s)
52
+ end
53
+
29
54
  def motion_event(attributes = {})
30
- Motion::Event.new(ActiveSupport::JSON.decode(attributes.to_json))
55
+ Motion::Event.new(ActiveSupport::JSON.decode(attributes.to_json)).tap do |event|
56
+ set_form_data(event, attributes)
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def set_form_data(event, attrs)
63
+ return event unless attrs.fetch(:element, nil)
64
+
65
+ form_data = attrs.dig(:element, :formData) || {}
66
+ params = ActionController::Parameters.new(form_data)
67
+ event.element.instance_variable_set(:@form_data, params)
31
68
  end
32
69
  end
33
70
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motion
4
- VERSION = "0.5.0"
4
+ VERSION = "0.7.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alec Larsen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-11 00:00:00.000000000 Z
12
+ date: 2022-06-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '5.1'
34
+ version: '5.2'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '5.1'
41
+ version: '5.2'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: lz4-ruby
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -102,7 +102,7 @@ metadata:
102
102
  source_code_uri: https://github.com/unabridged/motion
103
103
  post_install_message: |
104
104
  Friendly reminder: When updating the motion gem, don't forget to update the
105
- NPM package as well (`bin/yarn add '@unabridged/motion@0.5.0'`).
105
+ NPM package as well (`bin/yarn add '@unabridged/motion@0.7.0'`).
106
106
  rdoc_options: []
107
107
  require_paths:
108
108
  - lib
@@ -117,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  requirements: []
120
- rubygems_version: 3.1.2
120
+ rubygems_version: 3.1.6
121
121
  signing_key:
122
122
  specification_version: 4
123
123
  summary: Reactive frontend UI components for Rails in pure Ruby.