Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 84 additions & 3 deletions internal/output/output_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2229,10 +2229,28 @@ func TestStyledRenderTablePreservesURLs(t *testing.T) {
assert.Contains(t, buf.String(), url)
}

func TestMarkdownRenderTablePreservesURLs(t *testing.T) {
url := "https://3.basecampapi.com/1234567/buckets/12345678/todolists/9876543210.json"
func TestMarkdownRenderTableSkipsURLColumns(t *testing.T) {
data := []any{
map[string]any{"name": "Tasks", "todolists_url": url},
map[string]any{
"name": "Tasks",
"todolists_url": "https://3.basecampapi.com/1234567/buckets/12345678/todolists/9876543210.json",
},
}
var buf bytes.Buffer
w := New(Options{Format: FormatMarkdown, Writer: &buf})
err := w.OK(data)
require.NoError(t, err)

output := buf.String()
assert.Contains(t, output, "Tasks")
assert.NotContains(t, output, "todolists_url")
assert.NotContains(t, output, "Todolists Url")
}

func TestMarkdownRenderTablePreservesURLValues(t *testing.T) {
url := "https://example.com/page"
data := []any{
map[string]any{"name": "Tasks", "homepage": url},
}
var buf bytes.Buffer
w := New(Options{Format: FormatMarkdown, Writer: &buf})
Expand All @@ -2242,6 +2260,69 @@ func TestMarkdownRenderTablePreservesURLs(t *testing.T) {
assert.Contains(t, buf.String(), url)
}

func TestMarkdownTableSkipsLowValueColumns(t *testing.T) {
data := []any{
map[string]any{
"id": 1,
"name": "Test",
"comments_count": 5,
"boosts_count": 3,
"position": 2,
"attachable_sgid": "abc123",
"personable_type": "User",
"recording_type": "Todo",
"subscription_url": "https://api.example.com/sub",
"bookmark_url": "https://api.example.com/bookmark",
},
}
var buf bytes.Buffer
w := New(Options{Format: FormatMarkdown, Writer: &buf})
err := w.OK(data)
require.NoError(t, err)

output := buf.String()
assert.Contains(t, output, "Id")
assert.Contains(t, output, "Name")
assert.NotContains(t, output, "Comments Count")
assert.NotContains(t, output, "Boosts Count")
assert.NotContains(t, output, "Position")
assert.NotContains(t, output, "Attachable Sgid")
assert.NotContains(t, output, "Personable Type")
assert.NotContains(t, output, "Recording Type")
assert.NotContains(t, output, "Subscription Url")
assert.NotContains(t, output, "Bookmark Url")
}

func TestMarkdownTableKeepsTypeColumn(t *testing.T) {
data := []any{
map[string]any{"name": "Docs", "type": "Folder"},
map[string]any{"name": "photo.jpg", "type": "Upload"},
}
var buf bytes.Buffer
w := New(Options{Format: FormatMarkdown, Writer: &buf})
err := w.OK(data)
require.NoError(t, err)

output := buf.String()
assert.Contains(t, output, "Type")
assert.Contains(t, output, "Folder")
assert.Contains(t, output, "Upload")
}

func TestMarkdownTableKeepsBaseURLColumn(t *testing.T) {
data := []any{
map[string]any{"name": "Work", "base_url": "https://3.basecamp.com/1234"},
}
var buf bytes.Buffer
w := New(Options{Format: FormatMarkdown, Writer: &buf})
err := w.OK(data)
require.NoError(t, err)

output := buf.String()
assert.Contains(t, output, "Base Url")
assert.Contains(t, output, "https://3.basecamp.com/1234")
}

func TestRenderDataStripsEscapesFromTopLevelStrings(t *testing.T) {
tests := []struct {
name string
Expand Down
28 changes: 27 additions & 1 deletion internal/output/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,32 @@ var skipColumns = map[string]bool{
"app_url": true,
}

// skipMarkdownExtra lists fields excluded from markdown tables only.
// These are internal counters or type markers that add noise to wide tables.
// The styled renderer may still show these when terminal width allows.
var skipMarkdownExtra = map[string]bool{
"comments_count": true,
"boosts_count": true,
"position": true,
"attachable_sgid": true,
"personable_type": true,
"recording_type": true,
}

// keepURLColumns lists _url-suffixed fields that carry meaningful data
// and should not be filtered from markdown tables.
var keepURLColumns = map[string]bool{
"base_url": true,
"payload_url": true,
"download_url": true,
}

func skipMarkdownColumn(key string) bool {
return skipColumns[key] ||
skipMarkdownExtra[key] ||
(strings.HasSuffix(key, "_url") && !keepURLColumns[key])
}

type column struct {
key string
header string
Expand Down Expand Up @@ -968,7 +994,7 @@ func (r *MarkdownRenderer) detectColumns(data []map[string]any) []column {
var cols []column

for key, val := range first {
if skipColumns[key] {
if skipMarkdownColumn(key) {
continue
}

Expand Down
Loading