Is it OK to re-export something from a different package?

As the title say, i am wandering if it is OK to reexport a method from a different package. I currently have :

module MyPackage

using OtherPackage

struct mytype end
OtherPackage.function(x::mytype) = 1

end

The fact is that MyPackage provides new methods to this function, on types that are defined in MyPackage (so no type piracy), but the generic is only exported if I do :

using MyPackage
# Cannot use `function`
using OtherPackage
# Now i can 

Would it me OK to export OtherPackage.function, so that i could do:

using MyPackage
# `function` is available

?

If I’m understanding you correctly, in this case you could. It is also natural to just tell your users they must load both packages.

1 Like

Thanks. Do you know if there is a ‘standard’, or a good practice regarding the choice between re-exporting and telling people to load both packages ?

I would say that it depends on the relationship between your package and the other package. If your package builds “on top of” the other package but a user wouldn’t particularly need to be aware of the underlying package then re-export. If your package is an addition that a user would be using while also using the underlying package directly then advise they load both.

3 Likes

Seems fair, thanks.

What is the exact syntax for re-exporting a function from another package?

This is not working for me.

EDIT: Sorry, this was a git and a dev vs. add issue. The code below is now working as intended.

module MyPackage
using AlgebraOfGraphics
export draw

struct MyType
    data::SomeOtherType
    plot::Layer # type from AoG
end
export MyType

function f()
    # computations
    return MyType(data, plot)
end
export f

end # module 
julia> using MyPackage

julia> results = f();

julia> draw(results.plot)

I did get an unexpected error when I wrote export AlgebraOfGraphics.draw instead of export draw though. I would have thought either would work?

julia> using MyPackage
[ Info: Precompiling MyPackage [d29f79e6-4313-439e-a1e0-c6c95527bf41]
ERROR: LoadError: syntax: "module" at <file_path>.jl:1 expected "end", got "."

If you have package B and C which extend a method from package A, is it okay if both B and C export the extended function from A? Any best practices to be aware of?