JuliaPackaging / Requires.jl

Lazy code loading for Julia
Other
195 stars 28 forks source link

Not getting access to functions as expected #111

Open hbsmith opened 2 years ago

hbsmith commented 2 years ago

(Originally this was created as an issue in the InteractiveDynamics repo, but the issue might be with requires so I'm reposting here):

I have a MWE where I would expect to get access to the agents/ functions from InteractiveDynamics, but for some reason they don't get loaded.

The main InteractiveDynamics.jl src file looks like this:

module InteractiveDynamics

using Makie, Observables, OSMMakie

include("colors.jl")
include("utils.jl")
using Requires

function __init__()
    @require DynamicalSystems = "61744808-ddfa-5f27-97ff-6e42cc95d634" begin
        # include("numericdata/plot_dataset.jl")
        # include("numericdata/trajectory_highlighter.jl")
        include("chaos/orbitdiagram.jl")
        include("chaos/poincareclick.jl")
        include("chaos/trajanim.jl")
        include("chaos/cobweb.jl")
        include("chaos/brainscan.jl")
    end
    @require DynamicalBilliards = "4986ee89-4ee5-5cef-b6b8-e49ba721d7a5" begin
        include("billiards/defs_plotting.jl")
        include("billiards/defs_animating.jl")
        include("billiards/premade_anim_functions.jl")
        include("billiards/exports.jl")
    end
    @require Agents = "46ada45e-f475-11e8-01d0-f70cc89e6671" begin
        include("agents/abmplot.jl")
        include("agents/lifting.jl")
        include("agents/interaction.jl")
        include("agents/inspection.jl")
        include("agents/convenience.jl")
        include("agents/deprecations.jl")
    end
end

end

If I generate a new package "TestMod", activate the environment, and add only "InteractiveDynamics" and "Agents", I get a Project.toml that looks like this:

name = "TestMod"
uuid = "43a1a35d-8048-4c0f-b05e-6c9f886ced7d"
authors = ["me <me@myemail.com>"]
version = "0.1.0"

[deps]
Agents = "46ada45e-f475-11e8-01d0-f70cc89e6671"
InteractiveDynamics = "ec714cd0-5f51-11eb-0b6e-452e7367ff84"

Then if my TestMod.jl file is simply:

module TestMod;

using Agents
using InteractiveDynamics

@show(names(InteractiveDynamics, all=true))

import InteractiveDynamics.agent2string

end

And I run:

(@v1.8) pkg> activate .
julia> using TestMod

[ Info: Precompiling TestMod [43a1a35d-8048-4c0f-b05e-6c9f886ced7d]
names(InteractiveDynamics, all = true) = [Symbol("##meta#58"), Symbol("##record_interaction#1"), Symbol("##record_interaction#4"), Symbol("#10#19"), Symbol("#11#20"), Symbol("#12#21"), Symbol("#13#22"), Symbol("#14#23"), Symbol("#15#24"), Symbol("#16#25"), Symbol("#17#26"), Symbol("#2#3"), Symbol("#5#6"), Symbol("#7#8"), Symbol("#9#18"), Symbol("#__init__"), Symbol("#colors_from_map"), Symbol("#darken_color"), Symbol("#eval"), Symbol("#get_value"), Symbol("#has_key"), Symbol("#include"), Symbol("#lighten_color"), Symbol("#pushupdate!"), Symbol("#randomcolor"), Symbol("#record_interaction"), Symbol("#record_interaction##kw"), Symbol("#record_interaction#1"), Symbol("#record_interaction#4"), Symbol("#rotate2D"), Symbol("#scale"), Symbol("#set_value!"), Symbol("#subscript"), Symbol("#superscript"), Symbol("#to_alpha"), Symbol("#translate"), :COLORSCHEME, :CYCLIC_COLORS, :CyclicContainer, :DEFAULT_BG, :InteractiveDynamics, :JULIADYNAMICS_BLACK, :JULIADYNAMICS_CMAP, :JULIADYNAMICS_CMAP_DIVERGING, :JULIADYNAMICS_COLORS, :MARKER, :Point2f, :Polygon, :__init__, :colors_from_map, :darken_color, :eval, :get_value, :has_key, :include, :lighten_color, :pushupdate!, :randomcolor, :record_interaction, :rotate2D, :scale, :set_value!, :subscript, :superscript, :to_alpha, :translate]
WARNING: could not import InteractiveDynamics.agent2string into TestMod

I would expect to get access to all the functions within the src/agents/ files, but we can see that I don't get access to any of them.

Is this expected behavior? How can I get access to these functions from inside my "TestMod.jl" module?

Thanks

hbsmith commented 2 years ago

It's worth noting that if instead of trying to load the module with using, I just navigate to the directory and do

julia> include("src/TestMod.jl")

everything works as expected

mkitti commented 1 year ago

You might need to use @eval before the includes so that the methods are read into the top level global scope.