| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -11,10 +11,10 @@ public class CodecGroups | |||
| 11 | 11 | [Test] | |
| 12 | 12 | public void GetEncodersByType() | |
| 13 | 13 | { | |
| 14 | - var encoder1 = new ObjectToRawProxyEncoder<Uri>(); | ||
| 15 | - var encoder2 = new ObjectToRawProxyEncoder<Uri>(); | ||
| 14 | + var encoder1 = new ObjectToEncoderInstanceEncoder<Uri>(); | ||
| 15 | + var encoder2 = new ObjectToEncoderInstanceEncoder<Uri>(); | ||
| 16 | 16 | var group = new EncoderGroup { | |
| 17 | - new ObjectToRawProxyEncoder<Tuple<int>>(), | ||
| 17 | + new ObjectToEncoderInstanceEncoder<Tuple<int>>(), | ||
| 18 | 18 | encoder1, | |
| 19 | 19 | encoder2, | |
| 20 | 20 | }; | |
@@ -27,8 +27,8 @@ public void GetEncodersByType() | |||
| 27 | 27 | public void CanEncode() | |
| 28 | 28 | { | |
| 29 | 29 | var group = new EncoderGroup { | |
| 30 | - new ObjectToRawProxyEncoder<Tuple<int>>(), | ||
| 31 | - new ObjectToRawProxyEncoder<Uri>(), | ||
| 30 | + new ObjectToEncoderInstanceEncoder<Tuple<int>>(), | ||
| 31 | + new ObjectToEncoderInstanceEncoder<Uri>(), | ||
| 32 | 32 | }; | |
| 33 | 33 | ||
| 34 | 34 | Assert.IsTrue(group.CanEncode(typeof(Tuple<int>))); | |
@@ -39,9 +39,9 @@ public void CanEncode() | |||
| 39 | 39 | [Test] | |
| 40 | 40 | public void Encodes() | |
| 41 | 41 | { | |
| 42 | - var encoder0 = new ObjectToRawProxyEncoder<Tuple<int>>(); | ||
| 43 | - var encoder1 = new ObjectToRawProxyEncoder<Uri>(); | ||
| 44 | - var encoder2 = new ObjectToRawProxyEncoder<Uri>(); | ||
| 42 | + var encoder0 = new ObjectToEncoderInstanceEncoder<Tuple<int>>(); | ||
| 43 | + var encoder1 = new ObjectToEncoderInstanceEncoder<Uri>(); | ||
| 44 | + var encoder2 = new ObjectToEncoderInstanceEncoder<Uri>(); | ||
| 45 | 45 | var group = new EncoderGroup { | |
| 46 | 46 | encoder0, | |
| 47 | 47 | encoder1, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -86,9 +86,9 @@ static void TupleRoundtripGeneric<T, TTuple>() { | |||
| 86 | 86 | ||
| 87 | 87 | /// <summary> | |
| 88 | 88 | /// "Decodes" only objects of exact type <typeparamref name="T"/>. | |
| 89 | - /// Result is just a raw Python object proxy. | ||
| 89 | + /// Result is just the raw proxy to the encoder instance itself. | ||
| 90 | 90 | /// </summary> | |
| 91 | - class ObjectToRawProxyEncoder<T> : IPyObjectEncoder | ||
| 91 | + class ObjectToEncoderInstanceEncoder<T> : IPyObjectEncoder | ||
| 92 | 92 | { | |
| 93 | 93 | public bool CanEncode(Type type) => type == typeof(T); | |
| 94 | 94 | public PyObject TryEncode(object value) => this.GetRawPythonProxy(); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,20 @@ | |||
| 1 | + using System; | ||
| 2 | + | ||
| 3 | + namespace Python.Runtime.Codecs | ||
| 4 | + { | ||
| 5 | + /// <summary> | ||
| 6 | + /// A .NET object encoder, that returns raw proxies (e.g. no conversion to Python types). | ||
| 7 | + /// <para>You must inherit from this class and override <see cref="CanEncode"/>.</para> | ||
| 8 | + /// </summary> | ||
| 9 | + [Obsolete(Util.UnstableApiMessage)] | ||
| 10 | + public abstract class RawProxyEncoder: IPyObjectEncoder | ||
| 11 | + { | ||
| 12 | + public PyObject TryEncode(object value) | ||
| 13 | + { | ||
| 14 | + if (value is null) throw new ArgumentNullException(nameof(value)); | ||
| 15 | + | ||
| 16 | + return value.GetRawPythonProxy(); | ||
| 17 | + } | ||
| 18 | + public abstract bool CanEncode(Type type); | ||
| 19 | + } | ||
| 20 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,7 +1,9 @@ | |||
| 1 | 1 | namespace Python.Test | |
| 2 | 2 | { | |
| 3 | + using System.Collections.Generic; | ||
| 4 | + | ||
| 3 | 5 | /// <summary> | |
| 4 | - /// Supports units tests for field access. | ||
| 6 | + /// Supports unit tests for field access. | ||
| 5 | 7 | /// </summary> | |
| 6 | 8 | public class ConversionTest | |
| 7 | 9 | { | |
@@ -32,6 +34,7 @@ public ConversionTest() | |||
| 32 | 34 | ||
| 33 | 35 | public byte[] ByteArrayField; | |
| 34 | 36 | public sbyte[] SByteArrayField; | |
| 37 | + public readonly List<int> ListField = new List<int>(); | ||
| 35 | 38 | ||
| 36 | 39 | public T? Echo<T>(T? arg) where T: struct { | |
| 37 | 40 | return arg; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,6 +6,8 @@ | |||
| 6 | 6 | import System | |
| 7 | 7 | import pytest | |
| 8 | 8 | from Python.Test import ConversionTest, UnicodeString | |
| 9 | + from Python.Runtime import PyObjectConversions | ||
| 10 | + from Python.Runtime.Codecs import RawProxyEncoder | ||
| 9 | 11 | ||
| 10 | 12 | from ._compat import indexbytes, long, unichr, text_type, PY2, PY3 | |
| 11 | 13 | ||
@@ -700,3 +702,18 @@ def test_sbyte_array_conversion(): | |||
| 700 | 702 | array = ob.SByteArrayField | |
| 701 | 703 | for i, _ in enumerate(value): | |
| 702 | 704 | assert array[i] == indexbytes(value, i) | |
| 705 | + | ||
| 706 | + def test_codecs(): | ||
| 707 | + """Test codec registration from Python""" | ||
| 708 | + class ListAsRawEncoder(RawProxyEncoder): | ||
| 709 | + def CanEncode(self, clr_type): | ||
| 710 | + return clr_type.Name == "List`1" and clr_type.Namespace == "System.Collections.Generic" | ||
| 711 | + | ||
| 712 | + list_raw_encoder = ListAsRawEncoder() | ||
| 713 | + PyObjectConversions.RegisterEncoder(list_raw_encoder) | ||
| 714 | + | ||
| 715 | + ob = ConversionTest() | ||
| 716 | + | ||
| 717 | + l = ob.ListField | ||
| 718 | + l.Add(42) | ||
| 719 | + assert ob.ListField.Count == 1 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments