turbo_live 0.2.0 → 0.3.0

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: 973ebc91558a780fcdfc2e8dea4c6b1bc3d090678ee30535768e3b9d7ad1f9aa
4
- data.tar.gz: 63e48c4f2b207557d9b111609a3dad42a10f70ea3719ea96a1477ed8f4e952fe
3
+ metadata.gz: f35b2977f8f91c94aa92547a23facedec57a0fe96c10b497a9ee4f0583ee3aa6
4
+ data.tar.gz: b2d82cbcc93d640fd1dee6a32753fe93d5ef7e509e2e6db569d74b24c84cb651
5
5
  SHA512:
6
- metadata.gz: f1118112757bfde64bbdd6417827ad56ea031ba950f2006a8151436f55101ca14543b991317d3825ecd143844417b2fafe84c2d6cccf7d408c9c14d213e18c1f
7
- data.tar.gz: 7c1269811dd43b3a80188f9cafefc571c198c0eb9bd5adf9683353b7a67ef4ef915832a29bdf3fc1db710eeeb10a8ebca4b1829d4b05dacb7e2d05468891c01d
6
+ metadata.gz: 3108716f45050495efcb80b7c5d7b8ea0ba0fe1712ffa72165299dc31ad9e0a7443e3e961323ed33dbcb35f4fb4f65c52d1a530f5b2e8e537028d7fec612f91a
7
+ data.tar.gz: 1118bcb7d3bcbd573265edaff2be2b3d5590614a7018d68e8ecb4e628404c6eec24f4ce00d1f6260ecf078e717d6ff8741e1dbc603389395b22eb4539971d541
data/README.md CHANGED
@@ -6,6 +6,10 @@ TurboLive is a Ruby gem that enables the creation of async, progressively enhanc
6
6
 
7
7
  - [Installation](#installation)
8
8
  - [Setup](#setup)
9
+ - [Rails Routes](#rails-routes)
10
+ - [Stimulus Controller](#stimulus-controller)
11
+ - [ActionCable (Optional)](#actioncable-optional)
12
+ - [Serializer Configuration](#serializer-configuration)
9
13
  - [Usage](#usage)
10
14
  - [Creating a Component](#creating-a-component)
11
15
  - [Model State](#model-state)
@@ -46,7 +50,13 @@ For importmaps:
46
50
  bin/importmap pin @radioactive-labs/turbo-live
47
51
  ```
48
52
 
49
- For npm:
53
+ For yarn:
54
+
55
+ ```console
56
+ yarn add @radioactive-labs/turbo-live
57
+ ```
58
+
59
+ Or YAR:
50
60
 
51
61
  ```console
52
62
  npm install @radioactive-labs/turbo-live
@@ -54,6 +64,21 @@ npm install @radioactive-labs/turbo-live
54
64
 
55
65
  ## Setup
56
66
 
67
+ ### Rails Routes
68
+
69
+ In your rails routes, mount the engine:
70
+
71
+ ```diff
72
+ Rails.application.routes.draw do
73
+ # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
74
+
75
+ + mount TurboLive::Engine => "/turbo_live"
76
+
77
+ # Defines the root path route ("/")
78
+ root "index#index"
79
+ end
80
+ ```
81
+
57
82
  ### Stimulus Controller
58
83
 
59
84
  TurboLive uses a Stimulus controller to manage interactions. In your `app/javascript/controllers/index.js`:
@@ -61,9 +86,10 @@ TurboLive uses a Stimulus controller to manage interactions. In your `app/javasc
61
86
  ```diff
62
87
  import { application } from "controllers/application"
63
88
  import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
64
- +import * as turboLive from "@radioactive-labs/turbo-live"
65
89
 
66
90
  eagerLoadControllersFrom("controllers", application)
91
+
92
+ +import * as turboLive from "@radioactive-labs/turbo-live"
67
93
  +turboLive.registerControllers(application)
68
94
  ```
69
95
 
@@ -88,6 +114,28 @@ import "controllers"
88
114
  +import "channels"
89
115
  ```
90
116
 
117
+ ### Serializer Configuration
118
+
119
+ TurboLive requires a serializer for state management.
120
+
121
+ The default serializer (`TurboLive::Serializer`) simply wraps YAML, which handles primitive objects and basic collections.
122
+ If you need to serialize complex objects, you can provide your own serializer implementation or customize the in-built.
123
+
124
+ You can configure the serializer in an initializer:
125
+
126
+ ```ruby
127
+ # config/initializers/turbo_live.rb
128
+
129
+ # Optional - defaults to TurboLive::Serializer
130
+ TurboLive.serializer = YourCustomSerializer
131
+
132
+ # (Optional) You can set a custom verifier key for security
133
+ TurboLive.verifier_key = Rails.application.secret_key_base
134
+
135
+ # pass extra permitted classes to the underlying YAML serializer
136
+ TurboLive::Serializer.permitted_classes << BigDecimal
137
+ ```
138
+
91
139
  ## Usage
92
140
 
93
141
  A TurboLive component is a self-contained, interactive unit of a web application that can update in real-time without full page reloads. Components follow [The Elm Architecture](https://guide.elm-lang.org/architecture/) pattern.
@@ -14,9 +14,9 @@ class CountdownComponent < TurboLive::Component
14
14
 
15
15
  def update(input)
16
16
  case input
17
- in [:countdown]
17
+ in :countdown
18
18
  self.countdown -= 1
19
- in [:start]
19
+ in :start
20
20
  self.countdown = 1000
21
21
  end
22
22
  end
@@ -15,11 +15,11 @@ class CounterComponent < TurboLive::Component
15
15
 
16
16
  def update(input)
17
17
  case input
18
- in [:decrement]
18
+ in :decrement
19
19
  self.count -= 1
20
- in [:increment]
20
+ in :increment
21
21
  self.count += 1
22
- in [:reset]
22
+ in :reset
23
23
  self.count = 0
24
24
  end
25
25
  end
@@ -75,14 +75,14 @@ class FlappyBirdComponent < TurboLive::Component
75
75
 
76
76
  def update(input)
77
77
  case input
78
- in [:jump]
78
+ in :jump
79
79
  if game_over
80
80
  reset_game
81
81
  else
82
82
  self.nonce = NONCES[live_id] = NONCES[live_id] + 1
83
83
  self.bird_velocity = JUMP_STRENGTH
84
84
  end
85
- in [:tick]
85
+ in :tick
86
86
  norender! if nonce < NONCES[live_id]
87
87
  update_game_state
88
88
  end
@@ -12,6 +12,7 @@ class ShowcaseComponent < TurboLive::Component
12
12
  li { button(**on(click: [:change_component, :countdown])) { "Countdown" } }
13
13
  li { button(**on(click: [:change_component, :tic_tac_toe])) { "TicTacToe" } }
14
14
  li { button(**on(click: [:change_component, :flappy_bird])) { "Flappy Bird" } }
15
+ li { button(**on(click: [:change_component, :form])) { "Form" } }
15
16
  end
16
17
  end
17
18
  div class: "right-column" do
@@ -24,7 +25,7 @@ class ShowcaseComponent < TurboLive::Component
24
25
 
25
26
  def update(input)
26
27
  case input
27
- in [[:change_component, component]]
28
+ in [:change_component, component]
28
29
  self.component = component
29
30
  end
30
31
  end
@@ -41,6 +42,8 @@ class ShowcaseComponent < TurboLive::Component
41
42
  TicTacToeComponent
42
43
  when :flappy_bird
43
44
  FlappyBirdComponent
45
+ when :form
46
+ FormComponent
44
47
  end
45
48
  end
46
49
  end
@@ -50,9 +50,9 @@ class TicTacToeComponent < TurboLive::Component
50
50
 
51
51
  def update(input)
52
52
  case input
53
- in [[:make_move, index]]
53
+ in [:make_move, index]
54
54
  make_move(index)
55
- in [:reset_game]
55
+ in :reset_game
56
56
  reset_game
57
57
  end
58
58
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TurboLive
4
+ class Serializer
5
+ class << self
6
+ def dump(obj)
7
+ YAML.dump(obj)
8
+ end
9
+
10
+ def load(obj)
11
+ YAML.safe_load(obj, permitted_classes: permitted_classes)
12
+ end
13
+
14
+ def permitted_classes
15
+ @permitted_classes ||= []
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TurboLive
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/turbo_live.rb CHANGED
@@ -3,9 +3,10 @@
3
3
  require_relative "turbo_live/version"
4
4
  require_relative "turbo_live/component"
5
5
  require_relative "turbo_live/renderer"
6
+ require_relative "turbo_live/serializer"
6
7
 
7
8
  require_relative "turbo_live/engine" if defined?(Rails)
8
- require_relative "../app/channels/components_channel" if defined?(ActionCable)
9
+ require_relative "../app/channels/turbo_live/components_channel" if defined?(ActionCable::Channel::Base)
9
10
 
10
11
  module TurboLive
11
12
  class Error < StandardError; end
@@ -17,13 +18,18 @@ module TurboLive
17
18
 
18
19
  class << self
19
20
  attr_writer :verifier_key
21
+ attr_writer :serializer
20
22
 
21
23
  def verifier
22
- @verifier ||= ActiveSupport::MessageVerifier.new(verifier_key, digest: "SHA256", serializer: YAML)
24
+ @verifier ||= ActiveSupport::MessageVerifier.new(verifier_key, digest: "SHA256", serializer: serializer)
23
25
  end
24
26
 
25
27
  def verifier_key
26
28
  @verifier_key or raise ArgumentError, "Turbo requires a verifier_key"
27
29
  end
30
+
31
+ def serializer
32
+ @serializer ||= TurboLive::Serializer
33
+ end
28
34
  end
29
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbo_live
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - TheDumbTechGuy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-10-17 00:00:00.000000000 Z
11
+ date: 2024-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: phlex-rails
@@ -52,7 +52,7 @@ files:
52
52
  - LICENSE.txt
53
53
  - README.md
54
54
  - Rakefile
55
- - app/channels/components_channel.rb
55
+ - app/channels/turbo_live/components_channel.rb
56
56
  - app/controllers/turbo_live/components_controller.rb
57
57
  - config/routes.rb
58
58
  - examples/countdown_component.rb
@@ -64,6 +64,7 @@ files:
64
64
  - lib/turbo_live/component.rb
65
65
  - lib/turbo_live/engine.rb
66
66
  - lib/turbo_live/renderer.rb
67
+ - lib/turbo_live/serializer.rb
67
68
  - lib/turbo_live/version.rb
68
69
  - package-lock.json
69
70
  - package.json