From 2cb13998e856692ed273c931b83477caf8b7b020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogumi=C5=82=20Kami=C5=84ski?= Date: Tue, 11 Oct 2022 22:37:06 +0200 Subject: [PATCH] Update DictRows and DictColumns definition (#310) * Update DictRows and DictColumns definition * Update Project.toml * Update runtests.jl * Update runtests.jl * Update test/runtests.jl * Update src/Tables.jl Co-authored-by: Milan Bouchet-Valat * Update src/Tables.jl Co-authored-by: Milan Bouchet-Valat --- Project.toml | 2 +- src/Tables.jl | 12 ++++++------ test/runtests.jl | 31 +++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/Project.toml b/Project.toml index 311d5e8..0b02045 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Tables" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" authors = ["quinnj "] -version = "1.9.0" +version = "1.10.0" [deps] DataAPI = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" diff --git a/src/Tables.jl b/src/Tables.jl index b9bdc06..143c4a2 100644 --- a/src/Tables.jl +++ b/src/Tables.jl @@ -144,13 +144,13 @@ getcolumn(x::AbstractDict{Symbol}, nm::Symbol) = x[nm] getcolumn(x::AbstractDict{Symbol}, ::Type{T}, i::Int, nm::Symbol) where {T} = x[nm] columnnames(x::AbstractDict{Symbol}) = collect(keys(x)) -getcolumn(x::AbstractDict{String}, i::Int) = x[String(columnnames(x)[i])] -getcolumn(x::AbstractDict{String}, nm::Symbol) = x[String(nm)] -getcolumn(x::AbstractDict{String}, ::Type{T}, i::Int, nm::Symbol) where {T} = x[String(nm)] -columnnames(x::AbstractDict{String}) = collect(Symbol(k) for k in keys(x)) +getcolumn(x::AbstractDict{<:AbstractString}, i::Int) = x[String(columnnames(x)[i])] +getcolumn(x::AbstractDict{<:AbstractString}, nm::Symbol) = x[String(nm)] +getcolumn(x::AbstractDict{<:AbstractString}, ::Type{T}, i::Int, nm::Symbol) where {T} = x[String(nm)] +columnnames(x::AbstractDict{<:AbstractString}) = collect(Symbol(k) for k in keys(x)) # AbstractVector of Dicts for Tables.rows -const DictRows = AbstractVector{T} where {T <: Union{AbstractDict{String}, AbstractDict{Symbol}}} +const DictRows = AbstractVector{T} where {T <: Union{AbstractDict{<:AbstractString}, AbstractDict{Symbol}}} isrowtable(::Type{<:DictRows}) = true # DictRows doesn't naturally lend itself to the `Tables.schema` requirement # we can't just look at the first row, because the types might change, @@ -159,7 +159,7 @@ isrowtable(::Type{<:DictRows}) = true schema(x::DictRows) = nothing # Dict of AbstractVectors for Tables.columns -const DictColumns = AbstractDict{K, V} where {K <: Union{Symbol, String}, V <: AbstractVector} +const DictColumns = Union{<:AbstractDict{<:AbstractString, <:AbstractVector}, <:AbstractDict{Symbol, <:AbstractVector}} istable(::Type{<:DictColumns}) = true columnaccess(::Type{<:DictColumns}) = true columns(x::DictColumns) = x diff --git a/test/runtests.jl b/test/runtests.jl index 25206bb..fbbbc92 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -900,3 +900,34 @@ end @test_throws MethodError Tables.ByRow(identity)(1) @test_throws MethodError Tables.ByRow(identity)([1 2]) end + +@testset "istable on dictionaries" begin + @test Tables.istable(Dict{Union{String}, Vector}) + @test Tables.istable(Dict{Union{Symbol}, Vector}) + @test Tables.istable(Dict{Union{SubString}, Vector}) + @test Tables.istable(Dict{Union{AbstractString}, Vector}) + @test !Tables.istable(Dict{Union{String, Symbol}, Vector}) + @test Tables.istable(Vector{Dict{Symbol}}) + @test Tables.istable(Vector{Dict{String}}) + @test Tables.istable(Vector{Dict{SubString}}) + @test Tables.istable(Vector{Dict{AbstractString}}) + + @test Set(Tables.columnnames(Dict(:a=>1, :b=>2))) == Set([:a, :b]) + @test Set(Tables.columnnames(Dict("a"=>1, "b"=>2))) == Set([:a, :b]) + @test Set(Tables.columnnames(Dict("a"=>1, SubString("b")=>2))) == Set([:a, :b]) + @test Set(Tables.columnnames(Dict(SubString("a")=>1, SubString("b")=>2))) == Set([:a, :b]) + + @test Tables.getcolumn(Dict(:a=>1, :b=>2), 1) == 1 + @test Tables.getcolumn(Dict("a"=>1, "b"=>2), 1 + (Int === Int64)) == 1 + @test Tables.getcolumn(Dict("a"=>1, SubString("b")=>2), 1 + (Int === Int64)) == 1 + @test Tables.getcolumn(Dict(SubString("a")=>1, SubString("b")=>2), 1 + (Int === Int64)) == 1 + @test Tables.getcolumn(Dict(:a=>1, :b=>2), :a) == 1 + @test Tables.getcolumn(Dict("a"=>1, "b"=>2), :a) == 1 + @test Tables.getcolumn(Dict("a"=>1, SubString("b")=>2), :a) == 1 + @test Tables.getcolumn(Dict(SubString("a")=>1, SubString("b")=>2), :a) == 1 + @test Tables.getcolumn(Dict(:a=>1, :b=>2), Int, 1, :a) == 1 + @test Tables.getcolumn(Dict("a"=>1, "b"=>2), Int, 1, :a) == 1 + @test Tables.getcolumn(Dict("a"=>1, SubString("b")=>2), Int, 1, :a) == 1 + @test Tables.getcolumn(Dict(SubString("a")=>1, SubString("b")=>2), Int, 1, :a) == 1 +end +