Skip to content

Commit 5524df0

Browse files
committed
Make pyconvert registration explicit
1 parent 7d98a71 commit 5524df0

File tree

8 files changed

+92
-165
lines changed

8 files changed

+92
-165
lines changed

src/Convert/ctypes.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,9 @@ function ctypes_rule_specs()
7171
end
7272
return specs
7373
end
74+
75+
function register_ctypes_rules!()
76+
for rule in ctypes_rule_specs()
77+
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
78+
end
79+
end

src/Convert/numpy.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,9 @@ function numpy_rule_specs()
182182

183183
return specs
184184
end
185+
186+
function register_numpy_rules!()
187+
for rule in numpy_rule_specs()
188+
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
189+
end
190+
end

src/Convert/pandas.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,9 @@ function pandas_rule_specs()
1212
),
1313
]
1414
end
15+
16+
function register_pandas_rules!()
17+
for rule in pandas_rule_specs()
18+
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
19+
end
20+
end

src/Convert/pyconvert.jl

Lines changed: 43 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -436,108 +436,48 @@ function init_pyconvert_extratypes()
436436
)
437437
end
438438

439-
function pyconvert_rule_specs()
440-
return PyConvertRuleSpec[
441-
(func = pyconvert_rule_none, tname = "builtins:NoneType", type = Nothing, scope = Any),
442-
(func = pyconvert_rule_bool, tname = "builtins:bool", type = Bool, scope = Any),
443-
(func = pyconvert_rule_float, tname = "builtins:float", type = Float64, scope = Any),
444-
(
445-
func = pyconvert_rule_complex,
446-
tname = "builtins:complex",
447-
type = Complex{Float64},
448-
scope = Any,
449-
),
450-
(func = pyconvert_rule_int, tname = "numbers:Integral", type = Integer, scope = Any),
451-
(func = pyconvert_rule_str, tname = "builtins:str", type = String, scope = Any),
452-
(
453-
func = pyconvert_rule_bytes,
454-
tname = "builtins:bytes",
455-
type = Base.CodeUnits{UInt8,String},
456-
scope = Any,
457-
),
458-
(
459-
func = pyconvert_rule_range,
460-
tname = "builtins:range",
461-
type = StepRange{<:Integer,<:Integer},
462-
scope = Any,
463-
),
464-
(
465-
func = pyconvert_rule_fraction,
466-
tname = "numbers:Rational",
467-
type = Rational{<:Integer},
468-
scope = Any,
469-
),
470-
(func = pyconvert_rule_iterable, tname = "builtins:tuple", type = NamedTuple, scope = Any),
471-
(func = pyconvert_rule_iterable, tname = "builtins:tuple", type = Tuple, scope = Any),
472-
(func = pyconvert_rule_datetime, tname = "datetime:datetime", type = DateTime, scope = Any),
473-
(func = pyconvert_rule_date, tname = "datetime:date", type = Date, scope = Any),
474-
(func = pyconvert_rule_time, tname = "datetime:time", type = Time, scope = Any),
475-
(
476-
func = pyconvert_rule_timedelta,
477-
tname = "datetime:timedelta",
478-
type = Microsecond,
479-
scope = Any,
480-
),
481-
(
482-
func = pyconvert_rule_exception,
483-
tname = "builtins:BaseException",
484-
type = PyException,
485-
scope = Any,
486-
),
487-
(func = pyconvert_rule_none, tname = "builtins:NoneType", type = Missing, scope = Missing),
488-
(func = pyconvert_rule_bool, tname = "builtins:bool", type = Number, scope = Number),
489-
(func = pyconvert_rule_float, tname = "numbers:Real", type = Number, scope = Number),
490-
(func = pyconvert_rule_float, tname = "builtins:float", type = Nothing, scope = Nothing),
491-
(func = pyconvert_rule_float, tname = "builtins:float", type = Missing, scope = Missing),
492-
(func = pyconvert_rule_complex, tname = "numbers:Complex", type = Number, scope = Number),
493-
(func = pyconvert_rule_int, tname = "numbers:Integral", type = Number, scope = Number),
494-
(func = pyconvert_rule_str, tname = "builtins:str", type = Symbol, scope = Symbol),
495-
(func = pyconvert_rule_str, tname = "builtins:str", type = Char, scope = Char),
496-
(func = pyconvert_rule_bytes, tname = "builtins:bytes", type = Vector{UInt8}, scope = Vector{UInt8}),
497-
(
498-
func = pyconvert_rule_range,
499-
tname = "builtins:range",
500-
type = UnitRange{<:Integer},
501-
scope = UnitRange{<:Integer},
502-
),
503-
(func = pyconvert_rule_fraction, tname = "numbers:Rational", type = Number, scope = Number),
504-
(
505-
func = pyconvert_rule_iterable,
506-
tname = "collections.abc:Iterable",
507-
type = Vector,
508-
scope = Vector,
509-
),
510-
(func = pyconvert_rule_iterable, tname = "collections.abc:Iterable", type = Tuple, scope = Tuple),
511-
(func = pyconvert_rule_iterable, tname = "collections.abc:Iterable", type = Pair, scope = Pair),
512-
(func = pyconvert_rule_iterable, tname = "collections.abc:Iterable", type = Set, scope = Set),
513-
(
514-
func = pyconvert_rule_iterable,
515-
tname = "collections.abc:Sequence",
516-
type = Vector,
517-
scope = Vector,
518-
),
519-
(func = pyconvert_rule_iterable, tname = "collections.abc:Sequence", type = Tuple, scope = Tuple),
520-
(func = pyconvert_rule_iterable, tname = "collections.abc:Set", type = Set, scope = Set),
521-
(func = pyconvert_rule_mapping, tname = "collections.abc:Mapping", type = Dict, scope = Dict),
522-
(
523-
func = pyconvert_rule_timedelta,
524-
tname = "datetime:timedelta",
525-
type = Millisecond,
526-
scope = Millisecond,
527-
),
528-
(func = pyconvert_rule_timedelta, tname = "datetime:timedelta", type = Second, scope = Second),
529-
(
530-
func = pyconvert_rule_timedelta,
531-
tname = "datetime:timedelta",
532-
type = Nanosecond,
533-
scope = Nanosecond,
534-
),
535-
]
439+
function register_pyconvert_rules!()
440+
pyconvert_add_rule(pyconvert_rule_none, "builtins:NoneType", Nothing, Any)
441+
pyconvert_add_rule(pyconvert_rule_bool, "builtins:bool", Bool, Any)
442+
pyconvert_add_rule(pyconvert_rule_float, "builtins:float", Float64, Any)
443+
pyconvert_add_rule(pyconvert_rule_complex, "builtins:complex", Complex{Float64}, Any)
444+
pyconvert_add_rule(pyconvert_rule_int, "numbers:Integral", Integer, Any)
445+
pyconvert_add_rule(pyconvert_rule_str, "builtins:str", String, Any)
446+
pyconvert_add_rule(pyconvert_rule_bytes, "builtins:bytes", Base.CodeUnits{UInt8,String}, Any)
447+
pyconvert_add_rule(pyconvert_rule_range, "builtins:range", StepRange{<:Integer,<:Integer}, Any)
448+
pyconvert_add_rule(pyconvert_rule_fraction, "numbers:Rational", Rational{<:Integer}, Any)
449+
pyconvert_add_rule(pyconvert_rule_iterable, "builtins:tuple", NamedTuple, Any)
450+
pyconvert_add_rule(pyconvert_rule_iterable, "builtins:tuple", Tuple, Any)
451+
pyconvert_add_rule(pyconvert_rule_datetime, "datetime:datetime", DateTime, Any)
452+
pyconvert_add_rule(pyconvert_rule_date, "datetime:date", Date, Any)
453+
pyconvert_add_rule(pyconvert_rule_time, "datetime:time", Time, Any)
454+
pyconvert_add_rule(pyconvert_rule_timedelta, "datetime:timedelta", Microsecond, Any)
455+
pyconvert_add_rule(pyconvert_rule_exception, "builtins:BaseException", PyException, Any)
456+
pyconvert_add_rule(pyconvert_rule_none, "builtins:NoneType", Missing, Missing)
457+
pyconvert_add_rule(pyconvert_rule_bool, "builtins:bool", Number, Number)
458+
pyconvert_add_rule(pyconvert_rule_float, "numbers:Real", Number, Number)
459+
pyconvert_add_rule(pyconvert_rule_float, "builtins:float", Nothing, Nothing)
460+
pyconvert_add_rule(pyconvert_rule_float, "builtins:float", Missing, Missing)
461+
pyconvert_add_rule(pyconvert_rule_complex, "numbers:Complex", Number, Number)
462+
pyconvert_add_rule(pyconvert_rule_int, "numbers:Integral", Number, Number)
463+
pyconvert_add_rule(pyconvert_rule_str, "builtins:str", Symbol, Symbol)
464+
pyconvert_add_rule(pyconvert_rule_str, "builtins:str", Char, Char)
465+
pyconvert_add_rule(pyconvert_rule_bytes, "builtins:bytes", Vector{UInt8}, Vector{UInt8})
466+
pyconvert_add_rule(pyconvert_rule_range, "builtins:range", UnitRange{<:Integer}, UnitRange{<:Integer})
467+
pyconvert_add_rule(pyconvert_rule_fraction, "numbers:Rational", Number, Number)
468+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Iterable", Vector, Vector)
469+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Iterable", Tuple, Tuple)
470+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Iterable", Pair, Pair)
471+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Iterable", Set, Set)
472+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Sequence", Vector, Vector)
473+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Sequence", Tuple, Tuple)
474+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Set", Set, Set)
475+
pyconvert_add_rule(pyconvert_rule_mapping, "collections.abc:Mapping", Dict, Dict)
476+
pyconvert_add_rule(pyconvert_rule_timedelta, "datetime:timedelta", Millisecond, Millisecond)
477+
pyconvert_add_rule(pyconvert_rule_timedelta, "datetime:timedelta", Second, Second)
478+
pyconvert_add_rule(pyconvert_rule_timedelta, "datetime:timedelta", Nanosecond, Nanosecond)
536479
end
537480

538-
pyconvert_fallback_rule_specs() = PyConvertRuleSpec[(
539-
func = pyconvert_rule_object,
540-
tname = "builtins:object",
541-
type = Py,
542-
scope = Any,
543-
)]
481+
function register_pyconvert_fallback_rules!()
482+
pyconvert_add_rule(pyconvert_rule_object, "builtins:object", Py, Any)
483+
end

src/JlWrap/JlWrap.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ using ..NumpyDates: NumpyDates
1111
using ..C
1212
using ..Core
1313
using ..Convert
14-
using ..Convert: PyConvertRuleSpec
1514
using ..GC: GC
1615
using ..GIL
1716

src/JlWrap/base.jl

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,9 @@ function init_base()
2525
pyjuliacallmodule.JlBase = pyjlbasetype
2626
end
2727

28-
jlwrap_rule_specs() = PyConvertRuleSpec[(
29-
func = pyconvert_rule_jlvalue,
30-
tname = "juliacall:JlBase",
31-
type = Any,
32-
scope = Any,
33-
)]
28+
function register_jlwrap_rules!()
29+
pyconvert_add_rule(pyconvert_rule_jlvalue, "juliacall:JlBase", Any, Any)
30+
end
3431

3532
pyconvert_rule_jlvalue(::Type{T}, x::Py) where {T} =
3633
pyconvert_tryconvert(T, _pyjl_getvalue(x))

src/PythonCall.jl

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,13 @@ end
3434
function __init__()
3535
Convert.init_pyconvert_extratypes()
3636

37-
for rule in Convert.pyconvert_rule_specs()
38-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
39-
end
40-
for rule in Convert.ctypes_rule_specs()
41-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
42-
end
43-
for rule in Convert.numpy_rule_specs()
44-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
45-
end
46-
for rule in Convert.pandas_rule_specs()
47-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
48-
end
49-
for rule in Wrap.wrap_pyconvert_rule_specs()
50-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
51-
end
52-
for rule in JlWrap.jlwrap_rule_specs()
53-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
54-
end
55-
for rule in Convert.pyconvert_fallback_rule_specs()
56-
pyconvert_add_rule(rule.func, rule.tname, rule.type, rule.scope)
57-
end
37+
Convert.register_pyconvert_rules!()
38+
Convert.register_ctypes_rules!()
39+
Convert.register_numpy_rules!()
40+
Convert.register_pandas_rules!()
41+
Wrap.register_wrap_pyconvert_rules!()
42+
JlWrap.register_jlwrap_rules!()
43+
Convert.register_pyconvert_fallback_rules!()
5844
end
5945

6046
end

src/Wrap/Wrap.jl

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ using ..NumpyDates
1111
using ..C
1212
using ..Core
1313
using ..Convert
14-
using ..Convert: PyConvertRuleSpec
1514
using ..PyMacro
1615

1716
import ..PythonCall:
@@ -32,39 +31,27 @@ include("PyIO.jl")
3231
include("PyTable.jl")
3332
include("PyPandasDataFrame.jl")
3433

35-
function wrap_pyconvert_rule_specs()
36-
return PyConvertRuleSpec[
37-
(func = pyconvert_rule_array_nocopy, tname = "<arraystruct>", type = PyArray, scope = Any),
38-
(func = pyconvert_rule_array_nocopy, tname = "<arrayinterface>", type = PyArray, scope = Any),
39-
(func = pyconvert_rule_array_nocopy, tname = "<array>", type = PyArray, scope = Any),
40-
(func = pyconvert_rule_array_nocopy, tname = "<buffer>", type = PyArray, scope = Any),
41-
(func = pyconvert_rule_iterable, tname = "collections.abc:Iterable", type = PyIterable, scope = PyIterable),
42-
(func = pyconvert_rule_sequence, tname = "collections.abc:Sequence", type = PyList, scope = PyList),
43-
(func = pyconvert_rule_set, tname = "collections.abc:Set", type = PySet, scope = PySet),
44-
(func = pyconvert_rule_mapping, tname = "collections.abc:Mapping", type = PyDict, scope = PyDict),
45-
(func = pyconvert_rule_io, tname = "io:IOBase", type = PyIO, scope = PyIO),
46-
(func = pyconvert_rule_io, tname = "_io:_IOBase", type = PyIO, scope = PyIO),
47-
(
48-
func = pyconvert_rule_pandasdataframe,
49-
tname = "pandas.core.frame:DataFrame",
50-
type = PyPandasDataFrame,
51-
scope = PyPandasDataFrame,
52-
),
53-
(
54-
func = pyconvert_rule_sequence,
55-
tname = "pandas.core.arrays.base:ExtensionArray",
56-
type = PyList,
57-
scope = PyList,
58-
),
59-
(func = pyconvert_rule_array, tname = "<arraystruct>", type = Array, scope = Array),
60-
(func = pyconvert_rule_array, tname = "<arrayinterface>", type = Array, scope = Array),
61-
(func = pyconvert_rule_array, tname = "<array>", type = Array, scope = Array),
62-
(func = pyconvert_rule_array, tname = "<buffer>", type = Array, scope = Array),
63-
(func = pyconvert_rule_array, tname = "<arraystruct>", type = AbstractArray, scope = AbstractArray),
64-
(func = pyconvert_rule_array, tname = "<arrayinterface>", type = AbstractArray, scope = AbstractArray),
65-
(func = pyconvert_rule_array, tname = "<array>", type = AbstractArray, scope = AbstractArray),
66-
(func = pyconvert_rule_array, tname = "<buffer>", type = AbstractArray, scope = AbstractArray),
67-
]
34+
function register_wrap_pyconvert_rules!()
35+
pyconvert_add_rule(pyconvert_rule_array_nocopy, "<arraystruct>", PyArray, Any)
36+
pyconvert_add_rule(pyconvert_rule_array_nocopy, "<arrayinterface>", PyArray, Any)
37+
pyconvert_add_rule(pyconvert_rule_array_nocopy, "<array>", PyArray, Any)
38+
pyconvert_add_rule(pyconvert_rule_array_nocopy, "<buffer>", PyArray, Any)
39+
pyconvert_add_rule(pyconvert_rule_iterable, "collections.abc:Iterable", PyIterable, PyIterable)
40+
pyconvert_add_rule(pyconvert_rule_sequence, "collections.abc:Sequence", PyList, PyList)
41+
pyconvert_add_rule(pyconvert_rule_set, "collections.abc:Set", PySet, PySet)
42+
pyconvert_add_rule(pyconvert_rule_mapping, "collections.abc:Mapping", PyDict, PyDict)
43+
pyconvert_add_rule(pyconvert_rule_io, "io:IOBase", PyIO, PyIO)
44+
pyconvert_add_rule(pyconvert_rule_io, "_io:_IOBase", PyIO, PyIO)
45+
pyconvert_add_rule(pyconvert_rule_pandasdataframe, "pandas.core.frame:DataFrame", PyPandasDataFrame, PyPandasDataFrame)
46+
pyconvert_add_rule(pyconvert_rule_sequence, "pandas.core.arrays.base:ExtensionArray", PyList, PyList)
47+
pyconvert_add_rule(pyconvert_rule_array, "<arraystruct>", Array, Array)
48+
pyconvert_add_rule(pyconvert_rule_array, "<arrayinterface>", Array, Array)
49+
pyconvert_add_rule(pyconvert_rule_array, "<array>", Array, Array)
50+
pyconvert_add_rule(pyconvert_rule_array, "<buffer>", Array, Array)
51+
pyconvert_add_rule(pyconvert_rule_array, "<arraystruct>", AbstractArray, AbstractArray)
52+
pyconvert_add_rule(pyconvert_rule_array, "<arrayinterface>", AbstractArray, AbstractArray)
53+
pyconvert_add_rule(pyconvert_rule_array, "<array>", AbstractArray, AbstractArray)
54+
pyconvert_add_rule(pyconvert_rule_array, "<buffer>", AbstractArray, AbstractArray)
6855
end
6956

7057
end

0 commit comments

Comments
 (0)