Skip to content
6 changes: 4 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Meshes = "eacbb407-ea5a-433e-ab97-5258b1ca43fa"
PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
TableTraits = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
TransformsBase = "28dd2a49-a57a-4bfb-84ca-1a49db9b96b8"
Expand All @@ -42,12 +43,13 @@ Distributions = "0.25"
IteratorInterfaceExtensions = "1.0"
Makie = "0.24"
Meshes = "0.54"
PrettyTables = "2.2"
PrettyTables = "3.0.2"
Random = "1.9"
Statistics = "1.9"
StyledStrings = "1.0"
TableTraits = "1.0"
TableTransforms = "1.31"
Tables = "1.10"
TransformsBase = "1.4"
Unitful = "1.17"
julia = "1.9"
julia = "1.10"
1 change: 1 addition & 0 deletions src/GeoTables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ using Random
using Unitful
using Statistics
using PrettyTables
using StyledStrings
using CoordRefSystems
using DataScienceTraits

Expand Down
56 changes: 24 additions & 32 deletions src/abstractgeotable.jl
Original file line number Diff line number Diff line change
Expand Up @@ -127,56 +127,48 @@ end
Base.show(io::IO, geotable::AbstractGeoTable) = summary(io, geotable)

function Base.show(io::IO, ::MIME"text/plain", geotable::AbstractGeoTable)
fcolor = crayon"bold magenta"
gcolor = crayon"bold (0,128,128)"
hcolors = [fill(fcolor, ncol(geotable) - 1); gcolor]
pretty_table(
io,
geotable;
backend=Val(:text),
_common_kwargs(geotable)...,
header_crayon=hcolors,
newline_at_end=false
)
pretty_table(io, geotable; backend=:text, _common_kwargs(geotable)...)
end

function Base.show(io::IO, ::MIME"text/html", geotable::AbstractGeoTable)
pretty_table(io, geotable; backend=Val(:html), _common_kwargs(geotable)..., max_num_of_rows=10)
pretty_table(io, geotable; backend=:html, _common_kwargs(geotable)..., renderer=:show)
end

function _common_kwargs(geotable)
dom = domain(geotable)
tab = values(geotable)
names = propertynames(geotable)

# header
header = string.(names)

# subheaders
tuples = map(names) do name
labels = map(names) do name
if name === :geometry
ename = prettyname(eltype(dom))
cname = prettyname(crs(dom))
dname = rmmodule(datum(crs(dom)))
header₁ = ename
header₂ = "🖈 $cname{$dname}"
label₁ = styled"{(weight=bold),cyan:$name}"
label₂ = prettyname(eltype(dom))
label₃ = "🖈 $cname{$dname}"
else
cols = Tables.columns(tab)
x = Tables.getcolumn(cols, name)
T = eltype(x)
label₁ = styled"{(weight=bold),magenta:$name}"
T = Tables.getcolumn(Tables.columns(tab), name) |> eltype
if T <: Missing
header₁ = "Missing"
header₂ = "[NoUnits]"
label₂ = "Missing"
label₃ = "[NoUnits]"
else
S = nonmissingtype(T)
header₁ = string(nameof(scitype(S)))
header₂ = S <: AbstractQuantity ? "[$(unit(S))]" : "[NoUnits]"
label₂ = string(nameof(scitype(S)))
label₃ = S <: AbstractQuantity ? "[$(unit(S))]" : "[NoUnits]"
end
end
header₁, header₂
label₁, label₂, label₃
end
subheader₁ = first.(tuples)
subheader₂ = last.(tuples)

(title=summary(geotable), header=(header, subheader₁, subheader₂), alignment=:c, vcrop_mode=:bottom)
labels₁ = getindex.(labels, 1)
labels₂ = getindex.(labels, 2)
labels₃ = getindex.(labels, 3)

(
title=summary(geotable),
column_labels=[labels₁, labels₂, labels₃],
maximum_number_of_rows=10,
new_line_at_end=false,
alignment=:c
)
end
178 changes: 90 additions & 88 deletions test/shows.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ if !Sys.isapple()
gtb = georef((; a, b, c), pset)
@test sprint(show, gtb) == "9×4 GeoTable over 9 PointSet"
@test sprint(show, MIME("text/plain"), gtb) == """
9×4 GeoTable over 9 PointSet
9×4 GeoTable over 9 PointSet
┌─────────────┬────────────┬─────────────┬──────────────────────┐
│ a │ b │ c │ geometry │
│ Categorical │ Continuous │ Categorical │ Point │
Expand All @@ -29,7 +29,7 @@ if !Sys.isapple()
vgtb = view(gtb, 1:3)
@test sprint(show, vgtb) == "3×4 SubGeoTable over 3 view(::PointSet, 1:3)"
@test sprint(show, MIME("text/plain"), vgtb) == """
3×4 SubGeoTable over 3 view(::PointSet, 1:3)
3×4 SubGeoTable over 3 view(::PointSet, 1:3)
┌─────────────┬────────────┬─────────────┬──────────────────────┐
│ a │ b │ c │ geometry │
│ Categorical │ Continuous │ Categorical │ Point │
Expand All @@ -43,7 +43,7 @@ if !Sys.isapple()
gtb = georef((a=a * u"m/s", b=b * u"km/hr", c=c), pset)
@test sprint(show, gtb) == "9×4 GeoTable over 9 PointSet"
@test sprint(show, MIME("text/plain"), gtb) == """
9×4 GeoTable over 9 PointSet
9×4 GeoTable over 9 PointSet
┌─────────────┬───────────────┬─────────────┬──────────────────────┐
│ a │ b │ c │ geometry │
│ Categorical │ Continuous │ Categorical │ Point │
Expand All @@ -63,7 +63,7 @@ if !Sys.isapple()
gtb = georef((a=[missing; a[2:9]], b=[b[1:4]; missing; b[6:9]], c=[c[1:8]; missing]), pset)
@test sprint(show, gtb) == "9×4 GeoTable over 9 PointSet"
@test sprint(show, MIME("text/plain"), gtb) == """
9×4 GeoTable over 9 PointSet
9×4 GeoTable over 9 PointSet
┌─────────────┬────────────┬─────────────┬──────────────────────┐
│ a │ b │ c │ geometry │
│ Categorical │ Continuous │ Categorical │ Point │
Expand All @@ -83,7 +83,7 @@ if !Sys.isapple()
gtb = georef((a=[missing; a[2:9]] * u"m/s", b=[b[1:4]; missing; b[6:9]] * u"km/hr", c=[c[1:8]; missing]), pset)
@test sprint(show, gtb) == "9×4 GeoTable over 9 PointSet"
@test sprint(show, MIME("text/plain"), gtb) == """
9×4 GeoTable over 9 PointSet
9×4 GeoTable over 9 PointSet
┌─────────────┬───────────────┬─────────────┬──────────────────────┐
│ a │ b │ c │ geometry │
│ Categorical │ Continuous │ Categorical │ Point │
Expand All @@ -103,7 +103,7 @@ if !Sys.isapple()
gtb = georef((; x=fill(missing, 9)), pset)
@test sprint(show, gtb) == "9×2 GeoTable over 9 PointSet"
@test sprint(show, MIME("text/plain"), gtb) == """
9×2 GeoTable over 9 PointSet
9×2 GeoTable over 9 PointSet
┌───────────┬──────────────────────┐
│ x │ geometry │
│ Missing │ Point │
Expand Down Expand Up @@ -140,87 +140,89 @@ if !Sys.isapple()
│ (x: 9.0 m, y: 9.0 m) │
└──────────────────────┘"""

gtb = georef((; a, b, c), pset)
@test sprint(show, MIME("text/html"), gtb) == """
<table>
<caption style = "text-align: left;">9×4 GeoTable over 9 PointSet</caption>
<thead>
<tr class = "header">
<th style = "text-align: center;">a</th>
<th style = "text-align: center;">b</th>
<th style = "text-align: center;">c</th>
<th style = "text-align: center;">geometry</th>
</tr>
<tr class = "subheader">
<th style = "text-align: center;">Categorical</th>
<th style = "text-align: center;">Continuous</th>
<th style = "text-align: center;">Categorical</th>
<th style = "text-align: center;">Point</th>
</tr>
<tr class = "subheader headerLastRow">
<th style = "text-align: center;">[NoUnits]</th>
<th style = "text-align: center;">[NoUnits]</th>
<th style = "text-align: center;">[NoUnits]</th>
<th style = "text-align: center;">🖈 Cartesian{NoDatum}</th>
</tr>
</thead>
<tbody>
<tr>
<td style = "text-align: center;">0</td>
<td style = "text-align: center;">2.34</td>
<td style = "text-align: center;">txt1</td>
<td style = "text-align: center;">(x: 1.0 m, y: 1.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">6</td>
<td style = "text-align: center;">7.5</td>
<td style = "text-align: center;">txt2</td>
<td style = "text-align: center;">(x: 2.0 m, y: 2.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">6</td>
<td style = "text-align: center;">0.06</td>
<td style = "text-align: center;">txt3</td>
<td style = "text-align: center;">(x: 3.0 m, y: 3.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">3</td>
<td style = "text-align: center;">1.29</td>
<td style = "text-align: center;">txt4</td>
<td style = "text-align: center;">(x: 4.0 m, y: 4.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">9</td>
<td style = "text-align: center;">3.64</td>
<td style = "text-align: center;">txt5</td>
<td style = "text-align: center;">(x: 5.0 m, y: 5.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">5</td>
<td style = "text-align: center;">8.05</td>
<td style = "text-align: center;">txt6</td>
<td style = "text-align: center;">(x: 6.0 m, y: 6.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">2</td>
<td style = "text-align: center;">0.11</td>
<td style = "text-align: center;">txt7</td>
<td style = "text-align: center;">(x: 7.0 m, y: 7.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">2</td>
<td style = "text-align: center;">0.64</td>
<td style = "text-align: center;">txt8</td>
<td style = "text-align: center;">(x: 8.0 m, y: 8.0 m)</td>
</tr>
<tr>
<td style = "text-align: center;">8</td>
<td style = "text-align: center;">8.46</td>
<td style = "text-align: center;">txt9</td>
<td style = "text-align: center;">(x: 9.0 m, y: 9.0 m)</td>
</tr>
</tbody>
</table>
"""
# https://github.com/JuliaLang/StyledStrings.jl/issues/122
# gtb = georef((; a, b, c), pset)
# @test sprint(show, MIME("text/html"), gtb) == """
# <table>
# <thead>
# <tr class = "title">
# <td colspan = "4" style = "text-align: center; font-size: x-large; font-weight: bold;">9×4 GeoTable over 9 PointSet</td>
# </tr>
# <tr class = "columnLabelRow">
# <th style = "text-align: center; font-weight: bold;"><span style="font-weight: 700; color: #803d9b">a</span></th>
# <th style = "text-align: center; font-weight: bold;"><span style="font-weight: 700; color: #803d9b">b</span></th>
# <th style = "text-align: center; font-weight: bold;"><span style="font-weight: 700; color: #803d9b">c</span></th>
# <th style = "text-align: center; font-weight: bold;"><span style="font-weight: 700; color: #0097a7">geometry</span></th>
# </tr>
# <tr class = "columnLabelRow">
# <th style = "text-align: center;">Categorical</th>
# <th style = "text-align: center;">Continuous</th>
# <th style = "text-align: center;">Categorical</th>
# <th style = "text-align: center;">Point</th>
# </tr>
# <tr class = "columnLabelRow">
# <th style = "text-align: center;">[NoUnits]</th>
# <th style = "text-align: center;">[NoUnits]</th>
# <th style = "text-align: center;">[NoUnits]</th>
# <th style = "text-align: center;">🖈 Cartesian{NoDatum}</th>
# </tr>
# </thead>
# <tbody>
# <tr class = "dataRow">
# <td style = "text-align: center;">0</td>
# <td style = "text-align: center;">2.34</td>
# <td style = "text-align: center;">txt1</td>
# <td style = "text-align: center;">(x: 1.0 m, y: 1.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">6</td>
# <td style = "text-align: center;">7.5</td>
# <td style = "text-align: center;">txt2</td>
# <td style = "text-align: center;">(x: 2.0 m, y: 2.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">6</td>
# <td style = "text-align: center;">0.06</td>
# <td style = "text-align: center;">txt3</td>
# <td style = "text-align: center;">(x: 3.0 m, y: 3.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">3</td>
# <td style = "text-align: center;">1.29</td>
# <td style = "text-align: center;">txt4</td>
# <td style = "text-align: center;">(x: 4.0 m, y: 4.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">9</td>
# <td style = "text-align: center;">3.64</td>
# <td style = "text-align: center;">txt5</td>
# <td style = "text-align: center;">(x: 5.0 m, y: 5.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">5</td>
# <td style = "text-align: center;">8.05</td>
# <td style = "text-align: center;">txt6</td>
# <td style = "text-align: center;">(x: 6.0 m, y: 6.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">2</td>
# <td style = "text-align: center;">0.11</td>
# <td style = "text-align: center;">txt7</td>
# <td style = "text-align: center;">(x: 7.0 m, y: 7.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">2</td>
# <td style = "text-align: center;">0.64</td>
# <td style = "text-align: center;">txt8</td>
# <td style = "text-align: center;">(x: 8.0 m, y: 8.0 m)</td>
# </tr>
# <tr class = "dataRow">
# <td style = "text-align: center;">8</td>
# <td style = "text-align: center;">8.46</td>
# <td style = "text-align: center;">txt9</td>
# <td style = "text-align: center;">(x: 9.0 m, y: 9.0 m)</td>
# </tr>
# </tbody>
# </table>"""
end
end
Loading