upkeep-rails 0.1.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.

Potentially problematic release.


This version of upkeep-rails might be problematic. Click here for more details.

Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +424 -0
  4. data/docs/architecture/ambient-inputs-roadmap.md +306 -0
  5. data/docs/architecture/herb-roadmap.md +324 -0
  6. data/docs/architecture/identity-and-sharing.md +187 -0
  7. data/docs/architecture/query-dependencies.md +230 -0
  8. data/docs/cost-model-roadmap.md +703 -0
  9. data/docs/guides/getting-started.md +282 -0
  10. data/docs/handoff-2026-05-15.md +230 -0
  11. data/docs/production_roadmap.md +372 -0
  12. data/docs/shared-warm-scale-roadmap.md +214 -0
  13. data/docs/single-subscriber-cold-roadmap.md +192 -0
  14. data/docs/testing.md +113 -0
  15. data/lib/generators/upkeep/install/install_generator.rb +90 -0
  16. data/lib/generators/upkeep/install/templates/create_upkeep_subscriptions.rb.erb +31 -0
  17. data/lib/generators/upkeep/install/templates/subscription.js +107 -0
  18. data/lib/generators/upkeep/install/templates/upkeep.rb +6 -0
  19. data/lib/upkeep/active_record_query.rb +294 -0
  20. data/lib/upkeep/capture/request.rb +150 -0
  21. data/lib/upkeep/dag/subscription_shape.rb +244 -0
  22. data/lib/upkeep/dag.rb +370 -0
  23. data/lib/upkeep/delivery/action_cable_adapter.rb +43 -0
  24. data/lib/upkeep/delivery/async_dispatcher.rb +102 -0
  25. data/lib/upkeep/delivery/broadcast_transport.rb +89 -0
  26. data/lib/upkeep/delivery/transport.rb +194 -0
  27. data/lib/upkeep/delivery/turbo_streams.rb +275 -0
  28. data/lib/upkeep/delivery.rb +7 -0
  29. data/lib/upkeep/dependencies.rb +466 -0
  30. data/lib/upkeep/herb/developer_report.rb +116 -0
  31. data/lib/upkeep/herb/manifest_cache.rb +83 -0
  32. data/lib/upkeep/herb/manifest_diff.rb +183 -0
  33. data/lib/upkeep/herb/source_instrumenter.rb +84 -0
  34. data/lib/upkeep/herb/template_manifest.rb +377 -0
  35. data/lib/upkeep/invalidation/collection_append.rb +84 -0
  36. data/lib/upkeep/invalidation/collection_member_replace.rb +78 -0
  37. data/lib/upkeep/invalidation/collection_prepend.rb +84 -0
  38. data/lib/upkeep/invalidation/collection_remove.rb +57 -0
  39. data/lib/upkeep/invalidation/planner.rb +341 -0
  40. data/lib/upkeep/invalidation.rb +7 -0
  41. data/lib/upkeep/rails/action_view_capture.rb +765 -0
  42. data/lib/upkeep/rails/cable/channel.rb +108 -0
  43. data/lib/upkeep/rails/cable/subscriber_identity.rb +214 -0
  44. data/lib/upkeep/rails/cable.rb +4 -0
  45. data/lib/upkeep/rails/client_subscription.rb +37 -0
  46. data/lib/upkeep/rails/configuration.rb +57 -0
  47. data/lib/upkeep/rails/controller_runtime.rb +137 -0
  48. data/lib/upkeep/rails/install.rb +28 -0
  49. data/lib/upkeep/rails/railtie.rb +36 -0
  50. data/lib/upkeep/rails/replay.rb +176 -0
  51. data/lib/upkeep/rails/testing.rb +36 -0
  52. data/lib/upkeep/rails.rb +276 -0
  53. data/lib/upkeep/replay.rb +408 -0
  54. data/lib/upkeep/runtime.rb +1075 -0
  55. data/lib/upkeep/shared_streams.rb +72 -0
  56. data/lib/upkeep/subscriptions/active_record_store.rb +292 -0
  57. data/lib/upkeep/subscriptions/active_record_subscription_persistence.rb +291 -0
  58. data/lib/upkeep/subscriptions/active_registry.rb +93 -0
  59. data/lib/upkeep/subscriptions/async_durable_writer.rb +136 -0
  60. data/lib/upkeep/subscriptions/json_snapshot.rb +98 -0
  61. data/lib/upkeep/subscriptions/layered_reverse_index.rb +122 -0
  62. data/lib/upkeep/subscriptions/persistent_reverse_index.rb +144 -0
  63. data/lib/upkeep/subscriptions/registrar.rb +36 -0
  64. data/lib/upkeep/subscriptions/reverse_index.rb +294 -0
  65. data/lib/upkeep/subscriptions/shape.rb +116 -0
  66. data/lib/upkeep/subscriptions/store.rb +159 -0
  67. data/lib/upkeep/subscriptions.rb +7 -0
  68. data/lib/upkeep/targeting.rb +135 -0
  69. data/lib/upkeep/version.rb +5 -0
  70. data/lib/upkeep-rails.rb +3 -0
  71. data/lib/upkeep.rb +14 -0
  72. data/upkeep-rails.gemspec +53 -0
  73. metadata +296 -0
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Upkeep
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "upkeep"
data/lib/upkeep.rb ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "upkeep/version"
4
+ require_relative "upkeep/dependencies"
5
+ require_relative "upkeep/dag"
6
+ require_relative "upkeep/replay"
7
+ require_relative "upkeep/active_record_query"
8
+ require_relative "upkeep/runtime"
9
+ require_relative "upkeep/targeting"
10
+ require_relative "upkeep/subscriptions"
11
+ require_relative "upkeep/shared_streams"
12
+ require_relative "upkeep/invalidation"
13
+ require_relative "upkeep/delivery"
14
+ require_relative "upkeep/rails"
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/upkeep/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "upkeep-rails"
7
+ spec.version = Upkeep::VERSION
8
+ spec.authors = [ "Felipe dos Anjos" ]
9
+ spec.email = [ "felipe.cavalheiro.anjos@gmail.com" ]
10
+ spec.license = "MIT"
11
+
12
+ spec.summary = "Dependency-tracked live updates for Rails views"
13
+ spec.description = "Upkeep records the data and identity dependencies used while Rails renders a view, then updates subscribed frames when matching application data changes."
14
+ spec.homepage = "https://github.com/fc-anjos/upkeep-rails"
15
+ spec.required_ruby_version = ">= 3.2.0"
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "#{spec.homepage}/tree/main"
18
+ spec.metadata["bug_tracker_uri"] = "#{spec.homepage}/issues"
19
+ spec.metadata["rubygems_mfa_required"] = "true"
20
+
21
+ internal_files = Dir[
22
+ "lib/upkeep/probes/**/*.rb",
23
+ "lib/upkeep/proofs/**/*.rb"
24
+ ] + %w[
25
+ lib/upkeep/domain.rb
26
+ lib/upkeep/herb/fallback_analyzer.rb
27
+ lib/upkeep/herb/performance_gate.rb
28
+ lib/upkeep/herb/runtime_alignment.rb
29
+ lib/upkeep/proof_support.rb
30
+ lib/upkeep/rendering.rb
31
+ lib/upkeep/templates.rb
32
+ ]
33
+
34
+ spec.files = (Dir[
35
+ "README.md",
36
+ "LICENSE.txt",
37
+ "upkeep-rails.gemspec",
38
+ "docs/**/*.md",
39
+ "lib/**/*.rb",
40
+ "lib/generators/**/templates/**/*"
41
+ ] - internal_files).sort
42
+ spec.require_paths = [ "lib" ]
43
+
44
+ spec.add_dependency "actionview", ">= 7.1", "< 9.0"
45
+ spec.add_dependency "actionpack", ">= 7.1", "< 9.0"
46
+ spec.add_dependency "actioncable", ">= 7.1", "< 9.0"
47
+ spec.add_dependency "activerecord", ">= 7.1", "< 9.0"
48
+ spec.add_dependency "activesupport", ">= 7.1", "< 9.0"
49
+ spec.add_dependency "herb", ">= 0.10.1", "< 0.11"
50
+ spec.add_dependency "nokogiri", ">= 1.15", "< 2.0"
51
+ spec.add_dependency "railties", ">= 7.1", "< 9.0"
52
+ spec.add_dependency "turbo-rails", ">= 2.0", "< 3.0"
53
+ end
metadata ADDED
@@ -0,0 +1,296 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: upkeep-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Felipe dos Anjos
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: actionview
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '7.1'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '9.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '7.1'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '9.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: actionpack
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '7.1'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '9.0'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '7.1'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '9.0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: actioncable
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '7.1'
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '9.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '7.1'
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '9.0'
72
+ - !ruby/object:Gem::Dependency
73
+ name: activerecord
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '7.1'
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '9.0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '7.1'
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '9.0'
92
+ - !ruby/object:Gem::Dependency
93
+ name: activesupport
94
+ requirement: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '7.1'
99
+ - - "<"
100
+ - !ruby/object:Gem::Version
101
+ version: '9.0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '7.1'
109
+ - - "<"
110
+ - !ruby/object:Gem::Version
111
+ version: '9.0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: herb
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 0.10.1
119
+ - - "<"
120
+ - !ruby/object:Gem::Version
121
+ version: '0.11'
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 0.10.1
129
+ - - "<"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.11'
132
+ - !ruby/object:Gem::Dependency
133
+ name: nokogiri
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '1.15'
139
+ - - "<"
140
+ - !ruby/object:Gem::Version
141
+ version: '2.0'
142
+ type: :runtime
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '1.15'
149
+ - - "<"
150
+ - !ruby/object:Gem::Version
151
+ version: '2.0'
152
+ - !ruby/object:Gem::Dependency
153
+ name: railties
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '7.1'
159
+ - - "<"
160
+ - !ruby/object:Gem::Version
161
+ version: '9.0'
162
+ type: :runtime
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '7.1'
169
+ - - "<"
170
+ - !ruby/object:Gem::Version
171
+ version: '9.0'
172
+ - !ruby/object:Gem::Dependency
173
+ name: turbo-rails
174
+ requirement: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '2.0'
179
+ - - "<"
180
+ - !ruby/object:Gem::Version
181
+ version: '3.0'
182
+ type: :runtime
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '2.0'
189
+ - - "<"
190
+ - !ruby/object:Gem::Version
191
+ version: '3.0'
192
+ description: Upkeep records the data and identity dependencies used while Rails renders
193
+ a view, then updates subscribed frames when matching application data changes.
194
+ email:
195
+ - felipe.cavalheiro.anjos@gmail.com
196
+ executables: []
197
+ extensions: []
198
+ extra_rdoc_files: []
199
+ files:
200
+ - LICENSE.txt
201
+ - README.md
202
+ - docs/architecture/ambient-inputs-roadmap.md
203
+ - docs/architecture/herb-roadmap.md
204
+ - docs/architecture/identity-and-sharing.md
205
+ - docs/architecture/query-dependencies.md
206
+ - docs/cost-model-roadmap.md
207
+ - docs/guides/getting-started.md
208
+ - docs/handoff-2026-05-15.md
209
+ - docs/production_roadmap.md
210
+ - docs/shared-warm-scale-roadmap.md
211
+ - docs/single-subscriber-cold-roadmap.md
212
+ - docs/testing.md
213
+ - lib/generators/upkeep/install/install_generator.rb
214
+ - lib/generators/upkeep/install/templates/create_upkeep_subscriptions.rb.erb
215
+ - lib/generators/upkeep/install/templates/subscription.js
216
+ - lib/generators/upkeep/install/templates/upkeep.rb
217
+ - lib/upkeep-rails.rb
218
+ - lib/upkeep.rb
219
+ - lib/upkeep/active_record_query.rb
220
+ - lib/upkeep/capture/request.rb
221
+ - lib/upkeep/dag.rb
222
+ - lib/upkeep/dag/subscription_shape.rb
223
+ - lib/upkeep/delivery.rb
224
+ - lib/upkeep/delivery/action_cable_adapter.rb
225
+ - lib/upkeep/delivery/async_dispatcher.rb
226
+ - lib/upkeep/delivery/broadcast_transport.rb
227
+ - lib/upkeep/delivery/transport.rb
228
+ - lib/upkeep/delivery/turbo_streams.rb
229
+ - lib/upkeep/dependencies.rb
230
+ - lib/upkeep/herb/developer_report.rb
231
+ - lib/upkeep/herb/manifest_cache.rb
232
+ - lib/upkeep/herb/manifest_diff.rb
233
+ - lib/upkeep/herb/source_instrumenter.rb
234
+ - lib/upkeep/herb/template_manifest.rb
235
+ - lib/upkeep/invalidation.rb
236
+ - lib/upkeep/invalidation/collection_append.rb
237
+ - lib/upkeep/invalidation/collection_member_replace.rb
238
+ - lib/upkeep/invalidation/collection_prepend.rb
239
+ - lib/upkeep/invalidation/collection_remove.rb
240
+ - lib/upkeep/invalidation/planner.rb
241
+ - lib/upkeep/rails.rb
242
+ - lib/upkeep/rails/action_view_capture.rb
243
+ - lib/upkeep/rails/cable.rb
244
+ - lib/upkeep/rails/cable/channel.rb
245
+ - lib/upkeep/rails/cable/subscriber_identity.rb
246
+ - lib/upkeep/rails/client_subscription.rb
247
+ - lib/upkeep/rails/configuration.rb
248
+ - lib/upkeep/rails/controller_runtime.rb
249
+ - lib/upkeep/rails/install.rb
250
+ - lib/upkeep/rails/railtie.rb
251
+ - lib/upkeep/rails/replay.rb
252
+ - lib/upkeep/rails/testing.rb
253
+ - lib/upkeep/replay.rb
254
+ - lib/upkeep/runtime.rb
255
+ - lib/upkeep/shared_streams.rb
256
+ - lib/upkeep/subscriptions.rb
257
+ - lib/upkeep/subscriptions/active_record_store.rb
258
+ - lib/upkeep/subscriptions/active_record_subscription_persistence.rb
259
+ - lib/upkeep/subscriptions/active_registry.rb
260
+ - lib/upkeep/subscriptions/async_durable_writer.rb
261
+ - lib/upkeep/subscriptions/json_snapshot.rb
262
+ - lib/upkeep/subscriptions/layered_reverse_index.rb
263
+ - lib/upkeep/subscriptions/persistent_reverse_index.rb
264
+ - lib/upkeep/subscriptions/registrar.rb
265
+ - lib/upkeep/subscriptions/reverse_index.rb
266
+ - lib/upkeep/subscriptions/shape.rb
267
+ - lib/upkeep/subscriptions/store.rb
268
+ - lib/upkeep/targeting.rb
269
+ - lib/upkeep/version.rb
270
+ - upkeep-rails.gemspec
271
+ homepage: https://github.com/fc-anjos/upkeep-rails
272
+ licenses:
273
+ - MIT
274
+ metadata:
275
+ homepage_uri: https://github.com/fc-anjos/upkeep-rails
276
+ source_code_uri: https://github.com/fc-anjos/upkeep-rails/tree/main
277
+ bug_tracker_uri: https://github.com/fc-anjos/upkeep-rails/issues
278
+ rubygems_mfa_required: 'true'
279
+ rdoc_options: []
280
+ require_paths:
281
+ - lib
282
+ required_ruby_version: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: 3.2.0
287
+ required_rubygems_version: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - ">="
290
+ - !ruby/object:Gem::Version
291
+ version: '0'
292
+ requirements: []
293
+ rubygems_version: 3.6.9
294
+ specification_version: 4
295
+ summary: Dependency-tracked live updates for Rails views
296
+ test_files: []