y-rb 0.5.5 → 0.5.6

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: edc6866064725654c9601618a16913f88a63625a55afb8664f23195e86c6f7c2
4
- data.tar.gz: e4455b991ca2fb4df071aca482524e8a94b625ca8a6a04740fcc28206b0548b2
3
+ metadata.gz: 3ba8a4ad198489874ed399d303ab720f4f86e6b9e85014ada856a874d6f23485
4
+ data.tar.gz: 82e9ac65ce9df4711cee24cfe176108b0871b183ec7e5b6981fb52533b594b4b
5
5
  SHA512:
6
- metadata.gz: 9014b8a70ad8a95515610604a835b2778aec675f67ae2261a77978a62fceb41f63347921966b6dffabd2b1b7faee4c624ce6febacf3322354abf5215665d3666
7
- data.tar.gz: b1463c32e13d3be83ff3b826df95078af8e485be9be3c9340744e2fb2ae46887819fcb9bb5da026b286548134c244c82d6c8dd25103263a9d78d532bdc571c34
6
+ metadata.gz: 9f4134c2cfaca9b0297055156d1521020d3d890c3740bb0f6a52fa241dfdb3b310a8913ea9069ee440e8e0d1760ca4395d3ac076b84497762c8ea2b2161f1fa7
7
+ data.tar.gz: 7ffc794a224a373eddd35c7d020e2517634b4e0bab65a4c8c9491ffca373122f7ff9b70e2282ef2634b48233ca8b36ccf5eafa16b65f0e220aac207173e3ea66
data/ext/yrb/Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "yrb"
3
- version = "0.5.5"
3
+ version = "0.5.6"
4
4
  authors = ["Hannes Moser <box@hannesmoser.at>"]
5
5
  edition = "2021"
6
6
  homepage = "https://github.com/y-crdt/yrb"
data/ext/yrb/src/lib.rs CHANGED
@@ -2,6 +2,7 @@ extern crate core;
2
2
 
3
3
  use crate::yarray::YArray;
4
4
  use crate::yawareness::{YAwareness, YAwarenessEvent};
5
+ use crate::ydiff::YDiff;
5
6
  use crate::ydoc::YDoc;
6
7
  use crate::ymap::YMap;
7
8
  use crate::ytext::YText;
@@ -9,6 +10,7 @@ use crate::ytransaction::YTransaction;
9
10
  use crate::yxml_element::YXmlElement;
10
11
  use crate::yxml_fragment::YXmlFragment;
11
12
  use crate::yxml_text::YXmlText;
13
+
12
14
  use magnus::{class, define_module, function, method, Error, Module, Object};
13
15
 
14
16
  mod utils;
@@ -16,6 +18,7 @@ mod yany;
16
18
  mod yarray;
17
19
  mod yattrs;
18
20
  mod yawareness;
21
+ mod ydiff;
19
22
  mod ydoc;
20
23
  mod ymap;
21
24
  mod ytext;
@@ -224,6 +227,9 @@ fn init() -> Result<(), Error> {
224
227
  .define_class("Text", class::object())
225
228
  .expect("cannot define class Y::Text");
226
229
 
230
+ ytext
231
+ .define_private_method("ytext_diff", method!(YText::ytext_diff, 1))
232
+ .expect("cannot define private method: ytext_diff");
227
233
  ytext
228
234
  .define_private_method("ytext_format", method!(YText::ytext_format, 4))
229
235
  .expect("cannot define private method: ytext_format");
@@ -618,7 +624,7 @@ fn init() -> Result<(), Error> {
618
624
 
619
625
  let yawareness_event = module
620
626
  .define_class("AwarenessEvent", class::object())
621
- .expect("cannot define class Y:AwarenessEvent");
627
+ .expect("cannot define class Y::AwarenessEvent");
622
628
  yawareness_event
623
629
  .define_method("added", method!(YAwarenessEvent::added, 0))
624
630
  .expect("cannot define private method: added");
@@ -629,5 +635,15 @@ fn init() -> Result<(), Error> {
629
635
  .define_method("removed", method!(YAwarenessEvent::removed, 0))
630
636
  .expect("cannot define private method: removed");
631
637
 
638
+ let ydiff = module
639
+ .define_class("Diff", class::object())
640
+ .expect("cannot define class Y::Diff");
641
+ ydiff
642
+ .define_private_method("ydiff_insert", method!(YDiff::ydiff_insert, 0))
643
+ .expect("cannot define private method: insert");
644
+ ydiff
645
+ .define_private_method("ydiff_attrs", method!(YDiff::ydiff_attrs, 0))
646
+ .expect("cannot define private method: attrs");
647
+
632
648
  Ok(())
633
649
  }
@@ -1,16 +1,21 @@
1
1
  use crate::yvalue::YValue;
2
2
  use magnus::r_hash::ForEach::Continue;
3
3
  use magnus::{RHash, Value};
4
- use std::ops::{Deref, DerefMut};
4
+ use std::cell::RefCell;
5
5
  use std::sync::Arc;
6
6
  use yrs::types::Attrs;
7
7
  use yrs::Any;
8
8
 
9
- pub(crate) struct YAttrs(pub(crate) Attrs);
9
+ #[magnus::wrap(class = "Y::Attrs")]
10
+ #[derive(Clone)]
11
+ pub(crate) struct YAttrs(pub(crate) RefCell<Attrs>);
12
+
13
+ /// SAFETY: This is safe because we only access this data when the GVL is held.
14
+ unsafe impl Send for YAttrs {}
10
15
 
11
16
  impl From<Attrs> for YAttrs {
12
17
  fn from(value: Attrs) -> Self {
13
- YAttrs(value)
18
+ YAttrs(RefCell::from(value))
14
19
  }
15
20
  }
16
21
 
@@ -29,20 +34,6 @@ impl From<RHash> for YAttrs {
29
34
  })
30
35
  .expect("cannot iterate attributes hash");
31
36
 
32
- YAttrs(attrs)
33
- }
34
- }
35
-
36
- impl Deref for YAttrs {
37
- type Target = Attrs;
38
-
39
- fn deref(&self) -> &Self::Target {
40
- &self.0
41
- }
42
- }
43
-
44
- impl DerefMut for YAttrs {
45
- fn deref_mut(&mut self) -> &mut Self::Target {
46
- &mut self.0
37
+ YAttrs(RefCell::from(attrs))
47
38
  }
48
39
  }
@@ -0,0 +1,19 @@
1
+ use magnus::{IntoValue, RHash, Value};
2
+
3
+ unsafe impl Send for YDiff {}
4
+
5
+ #[magnus::wrap(class = "Y::Diff")]
6
+ pub(crate) struct YDiff {
7
+ pub(crate) ydiff_insert: Value,
8
+ pub(crate) ydiff_attrs: Option<RHash>,
9
+ }
10
+
11
+ impl YDiff {
12
+ pub(crate) fn ydiff_insert(&self) -> Value {
13
+ self.ydiff_insert
14
+ }
15
+
16
+ pub(crate) fn ydiff_attrs(&self) -> Option<Value> {
17
+ self.ydiff_attrs.as_ref().map(|value| value.into_value())
18
+ }
19
+ }
data/ext/yrb/src/ytext.rs CHANGED
@@ -1,10 +1,13 @@
1
1
  use crate::yattrs::YAttrs;
2
+ use crate::ydiff::YDiff;
2
3
  use crate::yvalue::YValue;
3
4
  use crate::YTransaction;
4
5
  use magnus::block::Proc;
5
6
  use magnus::value::Qnil;
6
- use magnus::{Error, RHash, Symbol, Value};
7
+ use magnus::RArray;
8
+ pub(crate) use magnus::{Error, IntoValue, RHash, Symbol, Value};
7
9
  use std::cell::RefCell;
10
+ use yrs::types::text::YChange;
8
11
  use yrs::types::Delta;
9
12
  use yrs::{Any, GetString, Observable, Text, TextRef};
10
13
 
@@ -15,6 +18,38 @@ pub(crate) struct YText(pub(crate) RefCell<TextRef>);
15
18
  unsafe impl Send for YText {}
16
19
 
17
20
  impl YText {
21
+ pub(crate) fn ytext_diff(&self, transaction: &YTransaction) -> RArray {
22
+ let tx = transaction.transaction();
23
+ let tx = tx.as_ref().unwrap();
24
+
25
+ RArray::from_iter(
26
+ self.0
27
+ .borrow()
28
+ .diff(tx, YChange::identity)
29
+ .iter()
30
+ .map(move |diff| {
31
+ let yvalue = YValue::from(diff.insert.clone());
32
+ let insert = yvalue.0.into_inner();
33
+ let attributes = diff.attributes.as_ref().map_or_else(
34
+ || None,
35
+ |boxed_attrs| {
36
+ let attributes = RHash::new();
37
+ for (key, value) in boxed_attrs.iter() {
38
+ let key = key.to_string();
39
+ let value = YValue::from(value.clone()).0.into_inner();
40
+ attributes.aset(key, value).expect("cannot add value");
41
+ }
42
+ Some(attributes)
43
+ },
44
+ );
45
+ YDiff {
46
+ ydiff_insert: insert,
47
+ ydiff_attrs: attributes,
48
+ }
49
+ .into_value()
50
+ }),
51
+ )
52
+ }
18
53
  pub(crate) fn ytext_format(
19
54
  &self,
20
55
  transaction: &YTransaction,
@@ -27,7 +62,9 @@ impl YText {
27
62
 
28
63
  let a = YAttrs::from(attrs);
29
64
 
30
- self.0.borrow_mut().format(tx, index, length, a.0)
65
+ self.0
66
+ .borrow_mut()
67
+ .format(tx, index, length, a.0.into_inner())
31
68
  }
32
69
  pub(crate) fn ytext_insert(&self, transaction: &YTransaction, index: u32, chunk: String) {
33
70
  let mut tx = transaction.transaction();
@@ -66,7 +103,7 @@ impl YText {
66
103
 
67
104
  self.0
68
105
  .borrow_mut()
69
- .insert_embed_with_attributes(tx, index, avalue, a.0);
106
+ .insert_embed_with_attributes(tx, index, avalue, a.0.into_inner());
70
107
  }
71
108
  pub(crate) fn ytext_insert_with_attributes(
72
109
  &self,
@@ -82,7 +119,7 @@ impl YText {
82
119
 
83
120
  self.0
84
121
  .borrow_mut()
85
- .insert_with_attributes(tx, index, chunk.as_str(), a.0)
122
+ .insert_with_attributes(tx, index, chunk.as_str(), a.0.into_inner())
86
123
  }
87
124
  pub(crate) fn ytext_length(&self, transaction: &YTransaction) -> u32 {
88
125
  let tx = transaction.transaction();
data/lib/y/array.rb CHANGED
@@ -115,8 +115,8 @@ module Y
115
115
  end
116
116
 
117
117
  # @return [void]
118
- def each(&block)
119
- document.current_transaction { |tx| yarray_each(tx, &block) }
118
+ def each(...)
119
+ document.current_transaction { |tx| yarray_each(tx, ...) }
120
120
  end
121
121
 
122
122
  # Check if the array is empty
data/lib/y/diff.rb ADDED
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Y
4
+ # A representation of an uniformly-formatted chunk of rich context stored by
5
+ # Text or XmlText. It contains a value (which could be a string, embedded
6
+ # object or another shared type) with optional formatting attributes wrapping
7
+ # around this chunk.
8
+ class Diff
9
+ # @return [Object]
10
+ def insert
11
+ ydiff_insert
12
+ end
13
+
14
+ # @return [Hash]
15
+ def attrs
16
+ ydiff_attrs
17
+ end
18
+
19
+ # Convert the diff to a Hash representation
20
+ #
21
+ # @return [Hash]
22
+ def to_h
23
+ {
24
+ insert: ydiff_insert,
25
+ attrs: ydiff_attrs
26
+ }
27
+ end
28
+
29
+ # @!method ydiff_insert()
30
+ # Returns string representation of text
31
+ #
32
+ # @return [Object]
33
+
34
+ # @!method ydiff_attrs()
35
+ #
36
+ # @return [Hash]
37
+ end
38
+ end
data/lib/y/text.rb CHANGED
@@ -80,6 +80,15 @@ module Y
80
80
  ytext_unobserve(subscription_id)
81
81
  end
82
82
 
83
+ # Diff
84
+ #
85
+ # @return[Array<YDiff>]
86
+ def diff
87
+ document.current_transaction do |tx|
88
+ ytext_diff(tx)
89
+ end
90
+ end
91
+
83
92
  # Checks if text is empty
84
93
  #
85
94
  # @example Check if text is empty
@@ -284,6 +293,12 @@ module Y
284
293
  value.is_a?(Hash)
285
294
  end
286
295
 
296
+ # @!method ytext_diff(tx)
297
+ # Returns text changes as list of diffs
298
+ #
299
+ # @param transaction [Y::Transaction]
300
+ # @return [Array<YDiff>]
301
+
287
302
  # @!method ytext_insert(tx, index, chunk)
288
303
  # Insert into text at position
289
304
  #
data/lib/y/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Y
4
- VERSION = "0.5.5"
4
+ VERSION = "0.5.6"
5
5
  end
data/lib/y-rb.rb CHANGED
@@ -11,6 +11,7 @@ end
11
11
 
12
12
  require_relative "y/array"
13
13
  require_relative "y/awareness"
14
+ require_relative "y/diff"
14
15
  require_relative "y/doc"
15
16
  require_relative "y/map"
16
17
  require_relative "y/text"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: y-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannes Moser
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-08 00:00:00.000000000 Z
11
+ date: 2024-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -83,6 +83,7 @@ files:
83
83
  - ext/yrb/src/yarray.rs
84
84
  - ext/yrb/src/yattrs.rs
85
85
  - ext/yrb/src/yawareness.rs
86
+ - ext/yrb/src/ydiff.rs
86
87
  - ext/yrb/src/ydoc.rs
87
88
  - ext/yrb/src/ymap.rs
88
89
  - ext/yrb/src/ytext.rs
@@ -95,6 +96,7 @@ files:
95
96
  - lib/y.rb
96
97
  - lib/y/array.rb
97
98
  - lib/y/awareness.rb
99
+ - lib/y/diff.rb
98
100
  - lib/y/doc.rb
99
101
  - lib/y/map.rb
100
102
  - lib/y/text.rb