Skip to content

Commit 127a974

Browse files
Astro-Hanjackwener
andauthored
feat(hackernews): add new, best, ask, show, jobs, search, user commands (#290)
Expand HackerNews from 1 command to 8, covering all major HN use cases. All YAML adapters, strategy: public, browser: false. - new/best/ask/show/jobs: Firebase API list endpoints with deleted/dead filtering - search: Algolia API with query + sort (relevance/date) - user: Firebase user profile with date formatting - top.yaml: add filter for deleted/dead items + dynamic pre-fetch limit - E2E tests for all 7 new commands - Update README, README.zh-CN, adapter docs Co-authored-by: jackwener <jakevingoo@gmail.com>
1 parent fcb5a9d commit 127a974

File tree

13 files changed

+400
-28
lines changed

13 files changed

+400
-28
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ Run `opencli list` for the live registry.
127127
| **devto** | `top` `tag` `user` | Public |
128128
| **arxiv** | `search` `paper` | Public |
129129
| **wikipedia** | `search` `summary` | Public |
130-
| **hackernews** | `top` | Public |
130+
| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | Public |
131131
| **linkedin** | `search` | Browser |
132132
| **reuters** | `search` | Browser |
133133
| **smzdm** | `search` | Browser |

README.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ npm install -g @jackwener/opencli@latest
129129
| **devto** | `top` `tag` `user` | 公开 |
130130
| **arxiv** | `search` `paper` | 公开 |
131131
| **wikipedia** | `search` `summary` | 公开 |
132-
| **hackernews** | `top` | 公共 API |
132+
| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | 公共 API |
133133
| **linkedin** | `search` | 浏览器 |
134134
| **reuters** | `search` | 浏览器 |
135135
| **smzdm** | `search` | 浏览器 |

docs/adapters/browser/hackernews.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,35 @@
66

77
| Command | Description |
88
|---------|-------------|
9-
| `opencli hackernews top` | |
9+
| `opencli hackernews top` | Hacker News top stories |
10+
| `opencli hackernews new` | Hacker News newest stories |
11+
| `opencli hackernews best` | Hacker News best stories |
12+
| `opencli hackernews ask` | Hacker News Ask HN posts |
13+
| `opencli hackernews show` | Hacker News Show HN posts |
14+
| `opencli hackernews jobs` | Hacker News job postings |
15+
| `opencli hackernews search <query>` | Search Hacker News stories |
16+
| `opencli hackernews user <username>` | Hacker News user profile |
1017

1118
## Usage Examples
1219

1320
```bash
14-
# Quick start
21+
# Top stories
1522
opencli hackernews top --limit 5
1623

24+
# Newest stories
25+
opencli hackernews new --limit 10
26+
27+
# Search stories
28+
opencli hackernews search "machine learning" --limit 5
29+
30+
# User profile
31+
opencli hackernews user pg
32+
1733
# JSON output
1834
opencli hackernews top -f json
1935

20-
# Verbose mode
21-
opencli hackernews top -v
36+
# Sort search by date
37+
opencli hackernews search "rust" --sort date
2238
```
2339

2440
## Prerequisites

docs/adapters/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Run `opencli list` for the live registry.
4141

4242
| Site | Commands | Mode |
4343
|------|----------|------|
44-
| **[hackernews](/adapters/browser/hackernews)** | `top` | 🌐 Public |
44+
| **[hackernews](/adapters/browser/hackernews)** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | 🌐 Public |
4545
| **[bbc](/adapters/browser/bbc)** | `news` | 🌐 Public |
4646
| **[devto](/adapters/browser/devto)** | `top` `tag` `user` | 🌐 Public |
4747
| **[apple-podcasts](/adapters/browser/apple-podcasts)** | `search` `episodes` `top` | 🌐 Public |

src/clis/hackernews/ask.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
site: hackernews
2+
name: ask
3+
description: Hacker News Ask HN posts
4+
domain: news.ycombinator.com
5+
strategy: public
6+
browser: false
7+
8+
args:
9+
limit:
10+
type: int
11+
default: 20
12+
description: Number of stories
13+
14+
pipeline:
15+
- fetch:
16+
url: https://hacker-news.firebaseio.com/v0/askstories.json
17+
18+
- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"
19+
20+
- map:
21+
id: ${{ item }}
22+
23+
- fetch:
24+
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json
25+
26+
- filter: item.title && !item.deleted && !item.dead
27+
28+
- map:
29+
rank: ${{ index + 1 }}
30+
title: ${{ item.title }}
31+
score: ${{ item.score }}
32+
author: ${{ item.by }}
33+
comments: ${{ item.descendants }}
34+
url: ${{ item.url }}
35+
36+
- limit: ${{ args.limit }}
37+
38+
columns: [rank, title, score, author, comments]

src/clis/hackernews/best.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
site: hackernews
2+
name: best
3+
description: Hacker News best stories
4+
domain: news.ycombinator.com
5+
strategy: public
6+
browser: false
7+
8+
args:
9+
limit:
10+
type: int
11+
default: 20
12+
description: Number of stories
13+
14+
pipeline:
15+
- fetch:
16+
url: https://hacker-news.firebaseio.com/v0/beststories.json
17+
18+
- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"
19+
20+
- map:
21+
id: ${{ item }}
22+
23+
- fetch:
24+
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json
25+
26+
- filter: item.title && !item.deleted && !item.dead
27+
28+
- map:
29+
rank: ${{ index + 1 }}
30+
title: ${{ item.title }}
31+
score: ${{ item.score }}
32+
author: ${{ item.by }}
33+
comments: ${{ item.descendants }}
34+
url: ${{ item.url }}
35+
36+
- limit: ${{ args.limit }}
37+
38+
columns: [rank, title, score, author, comments]

src/clis/hackernews/jobs.yaml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
site: hackernews
2+
name: jobs
3+
description: Hacker News job postings
4+
domain: news.ycombinator.com
5+
strategy: public
6+
browser: false
7+
8+
args:
9+
limit:
10+
type: int
11+
default: 20
12+
description: Number of job postings
13+
14+
pipeline:
15+
- fetch:
16+
url: https://hacker-news.firebaseio.com/v0/jobstories.json
17+
18+
- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"
19+
20+
- map:
21+
id: ${{ item }}
22+
23+
- fetch:
24+
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json
25+
26+
- filter: item.title && !item.deleted && !item.dead
27+
28+
- map:
29+
rank: ${{ index + 1 }}
30+
title: ${{ item.title }}
31+
author: ${{ item.by }}
32+
url: ${{ item.url }}
33+
34+
- limit: ${{ args.limit }}
35+
36+
columns: [rank, title, author, url]

src/clis/hackernews/new.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
site: hackernews
2+
name: new
3+
description: Hacker News newest stories
4+
domain: news.ycombinator.com
5+
strategy: public
6+
browser: false
7+
8+
args:
9+
limit:
10+
type: int
11+
default: 20
12+
description: Number of stories
13+
14+
pipeline:
15+
- fetch:
16+
url: https://hacker-news.firebaseio.com/v0/newstories.json
17+
18+
- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"
19+
20+
- map:
21+
id: ${{ item }}
22+
23+
- fetch:
24+
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json
25+
26+
- filter: item.title && !item.deleted && !item.dead
27+
28+
- map:
29+
rank: ${{ index + 1 }}
30+
title: ${{ item.title }}
31+
score: ${{ item.score }}
32+
author: ${{ item.by }}
33+
comments: ${{ item.descendants }}
34+
url: ${{ item.url }}
35+
36+
- limit: ${{ args.limit }}
37+
38+
columns: [rank, title, score, author, comments]

src/clis/hackernews/search.yaml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
site: hackernews
2+
name: search
3+
description: Search Hacker News stories
4+
domain: news.ycombinator.com
5+
strategy: public
6+
browser: false
7+
8+
args:
9+
query:
10+
type: str
11+
required: true
12+
positional: true
13+
description: Search query
14+
limit:
15+
type: int
16+
default: 20
17+
description: Number of results
18+
sort:
19+
type: str
20+
default: relevance
21+
choices: [relevance, date]
22+
description: Sort by relevance or date
23+
24+
pipeline:
25+
- fetch:
26+
url: "https://hn.algolia.com/api/v1/${{ args.sort === 'date' ? 'search_by_date' : 'search' }}"
27+
params:
28+
query: ${{ args.query }}
29+
tags: story
30+
hitsPerPage: ${{ args.limit }}
31+
32+
- select: hits
33+
34+
- map:
35+
rank: ${{ index + 1 }}
36+
title: ${{ item.title }}
37+
score: ${{ item.points }}
38+
author: ${{ item.author }}
39+
comments: ${{ item.num_comments }}
40+
url: ${{ item.url }}
41+
42+
- limit: ${{ args.limit }}
43+
44+
columns: [rank, title, score, author, comments]

src/clis/hackernews/show.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
site: hackernews
2+
name: show
3+
description: Hacker News Show HN posts
4+
domain: news.ycombinator.com
5+
strategy: public
6+
browser: false
7+
8+
args:
9+
limit:
10+
type: int
11+
default: 20
12+
description: Number of stories
13+
14+
pipeline:
15+
- fetch:
16+
url: https://hacker-news.firebaseio.com/v0/showstories.json
17+
18+
- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"
19+
20+
- map:
21+
id: ${{ item }}
22+
23+
- fetch:
24+
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json
25+
26+
- filter: item.title && !item.deleted && !item.dead
27+
28+
- map:
29+
rank: ${{ index + 1 }}
30+
title: ${{ item.title }}
31+
score: ${{ item.score }}
32+
author: ${{ item.by }}
33+
comments: ${{ item.descendants }}
34+
url: ${{ item.url }}
35+
36+
- limit: ${{ args.limit }}
37+
38+
columns: [rank, title, score, author, comments]

0 commit comments

Comments
 (0)