Skip to content

The AxisArrays backend does not extend Base.haskeys correctly #22

@tdunning

Description

@tdunning

I was getting this:

julia> CfGRIB.DataSet("./foo.grib")
[ Info: before haskey
# 1 method for generic function "haskey":
[1] haskey(obj::CfGRIB.AxisArrayWrapper, key) in CfGRIB at /home/tdunning/cfgrib.jl/src/backends/axisarrays.jl:36# 0 methods for generic function "haskey":[ Info: About to destroy {file}
[ Info: Done destroy
ERROR: MethodError: no method matching haskey(::GRIB.Message, ::String)
You may have intended to import Base.haskey
Closest candidates are:
  haskey(::CfGRIB.AxisArrayWrapper, ::Any) at /home/tdunning/cfgrib.jl/src/backends/axisarrays.jl:36
Stacktrace:
  [1] read_message(message::GRIB.Message, key::String)
    @ CfGRIB ~/cfgrib.jl/src/cfmessage.jl:275
  [2] (::CfGRIB.var"#16#17"{FileIndex, UnionAll, Int64, Vector{String}, Dict{Int64, Int64}, OrderedCollections.OrderedDict{NamedTuple, Int64}})(f::GRIB.GribFile)
    @ CfGRIB ~/cfgrib.jl/src/indexing.jl:101
  [3] GRIB.GribFile(f::CfGRIB.var"#16#17"{FileIndex, UnionAll, Int64, Vector{String}, Dict{Int64, Int64}, OrderedCollections.OrderedDict{NamedTuple, Int64}}, filename::String; mode::String)
    @ GRIB ~/GRIB.jl/src/gribfile.jl:52
  [4] GRIB.GribFile(f::Function, filename::String)
    @ GRIB ~/GRIB.jl/src/gribfile.jl:50
  [5] from_gribfile!(index::FileIndex)
    @ CfGRIB ~/cfgrib.jl/src/indexing.jl:96
  [6] FileIndex(grib_path::String, index_keys::Vector{String}; filter_by_keys::Dict{Any, Any})
    @ CfGRIB ~/cfgrib.jl/src/indexing.jl:49
  [7] FileIndex
    @ ~/cfgrib.jl/src/indexing.jl:42 [inlined]
  [8] DataSet(path::String; encode_cf::NTuple{4, String}, errors::String, filter_by_keys::Dict{Any, Any}, read_keys::Vector{String}, squeeze::Bool, time_dims::Tuple{String, String})
    @ CfGRIB ~/cfgrib.jl/src/dataset.jl:154
  [9] DataSet(path::String)
    @ CfGRIB ~/cfgrib.jl/src/dataset.jl:153

This is strange because the REPL can see all the different definitions.

The issue is at line 36 of src/backends/axisarrays.jl:

getindex(obj::AxisArrayWrapper, key) = getfield(obj, :datasets)[key]
keys(obj::AxisArrayWrapper) = keys(getfield(obj, :datasets))
haskey(obj::AxisArrayWrapper, key) = key in keys(obj)

These should be:

Base.getindex(obj::AxisArrayWrapper, key) = getfield(obj, :datasets)[key]
Base.keys(obj::AxisArrayWrapper) = keys(getfield(obj, :datasets))
Base.haskey(obj::AxisArrayWrapper, key) = key in keys(obj)

I will send a pull request shortly.

I am surprised that this didn't get uncovered in testing. I would create a test if advised where and how.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions