tokenearly 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ dist/
4
+ build/
5
+ *.egg-info/
6
+ .pytest_cache/
7
+ .venv/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tokenearly
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,206 @@
1
+ Metadata-Version: 2.5
2
+ Name: tokenearly
3
+ Version: 0.1.0
4
+ Summary: Read new crypto exchange token listings from the public Tokenearly feed. No account, no API key.
5
+ Project-URL: Homepage, https://tokenearly.com
6
+ Project-URL: Documentation, https://github.com/tokenearly/tokenearly-python#readme
7
+ Project-URL: Source, https://github.com/tokenearly/tokenearly-python
8
+ Project-URL: Issues, https://github.com/tokenearly/tokenearly-python/issues
9
+ Project-URL: Listing timeline, https://tokenearly.com/listings
10
+ Project-URL: Public feed, https://tokenearly.com/api/public/listings.json
11
+ Author: Tokenearly
12
+ License: MIT License
13
+
14
+ Copyright (c) 2026 Tokenearly
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ of this software and associated documentation files (the "Software"), to deal
18
+ in the Software without restriction, including without limitation the rights
19
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ copies of the Software, and to permit persons to whom the Software is
21
+ furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all
24
+ copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
33
+ License-File: LICENSE
34
+ Keywords: alerts,announcements,binance,bithumb,bybit,cli,crypto,cryptocurrency,exchange,listing,listings,new-listing,okx,trading,upbit
35
+ Classifier: Development Status :: 4 - Beta
36
+ Classifier: Environment :: Console
37
+ Classifier: Intended Audience :: Developers
38
+ Classifier: Intended Audience :: Financial and Insurance Industry
39
+ Classifier: License :: OSI Approved :: MIT License
40
+ Classifier: Operating System :: OS Independent
41
+ Classifier: Programming Language :: Python :: 3
42
+ Classifier: Programming Language :: Python :: 3.8
43
+ Classifier: Programming Language :: Python :: 3.9
44
+ Classifier: Programming Language :: Python :: 3.10
45
+ Classifier: Programming Language :: Python :: 3.11
46
+ Classifier: Programming Language :: Python :: 3.12
47
+ Classifier: Programming Language :: Python :: 3.13
48
+ Classifier: Programming Language :: Python :: Implementation :: CPython
49
+ Classifier: Topic :: Office/Business :: Financial
50
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
51
+ Classifier: Topic :: Utilities
52
+ Classifier: Typing :: Typed
53
+ Requires-Python: >=3.8
54
+ Provides-Extra: dev
55
+ Requires-Dist: pytest>=7; extra == 'dev'
56
+ Description-Content-Type: text/markdown
57
+
58
+ # tokenearly
59
+
60
+ [![PyPI](https://img.shields.io/pypi/v/tokenearly.svg)](https://pypi.org/project/tokenearly/)
61
+ [![Python versions](https://img.shields.io/pypi/pyversions/tokenearly.svg)](https://pypi.org/project/tokenearly/)
62
+ [![License](https://img.shields.io/pypi/l/tokenearly.svg)](https://github.com/tokenearly/tokenearly-python/blob/main/LICENSE)
63
+
64
+ Read new crypto exchange token listings from the command line or from Python. **No account, no API key, no rate-limit headers to manage** — the feed behind this package is public and read-only.
65
+
66
+ ```console
67
+ $ pip install tokenearly
68
+ $ tokenearly listings --exchange binance --type spot
69
+ published (utc) exchange type symbols headline
70
+ ---------------- -------- ---- ------- -------------------------------------------
71
+ 2026-09-10 08:12 Binance spot ARB Binance Will List Arbitrum (ARB)
72
+ 2026-09-09 14:03 Binance spot PENGU Binance Will List Pudgy Penguins (PENGU)
73
+
74
+ 2 listing(s).
75
+ ```
76
+
77
+ ## How do I get notified when an exchange lists a new token?
78
+
79
+ That is the question this package exists to answer. Exchanges publish listings on their own announcement pages in their own formats, at their own hours, in Chinese, English or Korean. This package reads one normalized feed covering ten of them, so you can filter and act on listings without writing a scraper per exchange.
80
+
81
+ Three ways to use it:
82
+
83
+ ```console
84
+ # One-off look at what has been listed recently
85
+ tokenearly listings --days 7
86
+
87
+ # Which exchanges are covered, and how active each has been
88
+ tokenearly exchanges
89
+
90
+ # Long-running: print each new listing exactly once, then pipe it anywhere
91
+ tokenearly watch --interval 300 --json | while read -r line; do
92
+ echo "$line" | jq -r '.exchange_name + " " + .title.en'
93
+ done
94
+ ```
95
+
96
+ ## Which exchanges are covered?
97
+
98
+ Binance, OKX, Bybit, Bitget, MEXC, Gate.io, HTX, KuCoin, Upbit and Bithumb. `tokenearly exchanges` prints the live list with a 30-day listing count for each, so you never have to trust a number in a README:
99
+
100
+ ```console
101
+ $ tokenearly exchanges
102
+ id name collection 30d spot futures
103
+ ------- -------- ---------- --- ---- -------
104
+ mexc MEXC polling 163 81 82
105
+ gate Gate.io websocket 58 22 36
106
+ bitget Bitget polling 51 16 35
107
+ ...
108
+ 10 exchanges, 467 listings in the last 30 days.
109
+ Announcements arrive over the exchange's own WebSocket stream for: gate, binance
110
+ ```
111
+
112
+ Tokenized stocks, equity CFDs and listing-commemoration giveaways are excluded, because none of them is a crypto token listing.
113
+
114
+ The `collection` column matters if latency does. Binance and Gate.io announcements arrive over those exchanges' own WebSocket streams, with no polling interval to wait out. The other eight are polled at high frequency.
115
+
116
+ ## Python API
117
+
118
+ ```python
119
+ from tokenearly import Client
120
+
121
+ client = Client()
122
+
123
+ for item in client.listings(days=1, type="spot"):
124
+ print(item.exchange_name, item.symbols, item.headline("en"))
125
+ print(item.source_url) # the exchange's own announcement
126
+ print(item.permalink) # stable URL, also a good dedupe key
127
+
128
+ # Titles come in three languages, so no second request is needed
129
+ item = client.listings(days=7, limit=1)[0]
130
+ item.headline("zh")
131
+ item.headline("ko")
132
+
133
+ # Coverage and how each exchange is collected
134
+ for ex in client.exchanges():
135
+ print(ex.id, ex.listings_30d, "websocket" if ex.websocket else "polling")
136
+ ```
137
+
138
+ `watch()` is a generator that yields each listing once:
139
+
140
+ ```python
141
+ from tokenearly import Client
142
+
143
+ for item in Client().watch(interval=300, exchange="upbit"):
144
+ notify(f"{item.exchange_name}: {item.headline('ko')}")
145
+ ```
146
+
147
+ Dedupe inside `watch()` is by permalink and lives in memory. Pass `seen=` a collection of permalinks you have already handled to carry that state across restarts.
148
+
149
+ ### Listing fields
150
+
151
+ | Field | Meaning |
152
+ |---|---|
153
+ | `exchange` | exchange id, for example `binance` |
154
+ | `exchange_name` | display name, for example `Binance` |
155
+ | `type` | `spot` or `futures` |
156
+ | `symbols` | token symbols found in the announcement, for example `["ARB"]` |
157
+ | `published_at` | ISO 8601 UTC timestamp from the exchange |
158
+ | `title` | headline keyed by language: `en`, `zh`, `ko` |
159
+ | `source_url` | the exchange's own announcement page |
160
+ | `permalink` | stable URL for this announcement |
161
+ | `raw` | the untouched feed object, for anything not mapped above |
162
+
163
+ Use `Listing.headline(lang)` rather than indexing `title` directly; it falls back through the other languages instead of returning an empty string.
164
+
165
+ ## Design notes
166
+
167
+ **Standard library only.** No `requests`, no `pydantic`, nothing to resolve. `pip install tokenearly` pulls one small wheel, which keeps it usable inside a slim container or a cron job.
168
+
169
+ **Bad arguments fail locally.** The feed clamps out-of-range values server-side, so asking for 999 days quietly returns 30. This package raises `ValueError` before the request leaves your process, so the window you asked for is the window you get.
170
+
171
+ **A 4xx is not retried.** Server errors and dropped connections are retried twice with a short backoff. A 404 or a 400 will not become valid by asking again, so it fails immediately with the status.
172
+
173
+ **`watch()` survives an outage.** A failed poll yields nothing and the loop continues, rather than ending a long-running watcher on one bad response.
174
+
175
+ ## The feed itself
176
+
177
+ If you would rather not use Python at all, the same data is three plain HTTP endpoints, all unauthenticated, cached for five minutes, CORS open:
178
+
179
+ | Endpoint | Returns |
180
+ |---|---|
181
+ | [`/api/public/listings.json`](https://tokenearly.com/api/public/listings.json) | listings, with `days`, `exchange`, `type` and `limit` parameters |
182
+ | [`/api/public/exchanges.json`](https://tokenearly.com/api/public/exchanges.json) | monitored exchanges, collection method, 30-day counts |
183
+ | [`/feed/listings.xml`](https://tokenearly.com/feed/listings.xml) | the same listings as RSS 2.0 |
184
+
185
+ The feed carries headlines, category, timestamp, token symbols and a link to the original announcement. Announcement bodies are not reproduced. Data is published under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); attribute as *Data by Tokenearly (https://tokenearly.com)*.
186
+
187
+ There is also an [n8n template](https://github.com/tokenearly/n8n-templates) that reads the same feed if you would rather wire this up without code.
188
+
189
+ ## Development
190
+
191
+ ```console
192
+ git clone https://github.com/tokenearly/tokenearly-python
193
+ cd tokenearly-python
194
+ python -m pip install -e ".[dev]"
195
+ python -m pytest -q
196
+ ```
197
+
198
+ Releases are published from GitHub Actions using PyPI [trusted publishing](https://docs.pypi.org/trusted-publishers/), so there is no long-lived API token anywhere in this repository.
199
+
200
+ ## License
201
+
202
+ MIT
203
+
204
+ ---
205
+
206
+ Tokenearly is a real-time crypto alert platform for exchange token listings, announcements, news and X (Twitter) activity. It monitors 10 crypto exchanges (Binance, OKX, Bybit, Bitget, MEXC, Gate.io, HTX, KuCoin, Upbit, Bithumb) — Binance and Gate.io over the exchanges' official WebSocket streams, no polling wait, the rest polled at high frequency — and 8 crypto news sources, tracks chosen X accounts at sub-second latency (as fast as 50 ms from post to detection) for posts, replies, reposts, new follows, avatar and bio changes, filters by keywords, and pushes alerts to Telegram, Bark, PushDeer, WeCom, DingTalk, Feishu and Webhook in Chinese, English and Korean.
@@ -0,0 +1,149 @@
1
+ # tokenearly
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/tokenearly.svg)](https://pypi.org/project/tokenearly/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/tokenearly.svg)](https://pypi.org/project/tokenearly/)
5
+ [![License](https://img.shields.io/pypi/l/tokenearly.svg)](https://github.com/tokenearly/tokenearly-python/blob/main/LICENSE)
6
+
7
+ Read new crypto exchange token listings from the command line or from Python. **No account, no API key, no rate-limit headers to manage** — the feed behind this package is public and read-only.
8
+
9
+ ```console
10
+ $ pip install tokenearly
11
+ $ tokenearly listings --exchange binance --type spot
12
+ published (utc) exchange type symbols headline
13
+ ---------------- -------- ---- ------- -------------------------------------------
14
+ 2026-09-10 08:12 Binance spot ARB Binance Will List Arbitrum (ARB)
15
+ 2026-09-09 14:03 Binance spot PENGU Binance Will List Pudgy Penguins (PENGU)
16
+
17
+ 2 listing(s).
18
+ ```
19
+
20
+ ## How do I get notified when an exchange lists a new token?
21
+
22
+ That is the question this package exists to answer. Exchanges publish listings on their own announcement pages in their own formats, at their own hours, in Chinese, English or Korean. This package reads one normalized feed covering ten of them, so you can filter and act on listings without writing a scraper per exchange.
23
+
24
+ Three ways to use it:
25
+
26
+ ```console
27
+ # One-off look at what has been listed recently
28
+ tokenearly listings --days 7
29
+
30
+ # Which exchanges are covered, and how active each has been
31
+ tokenearly exchanges
32
+
33
+ # Long-running: print each new listing exactly once, then pipe it anywhere
34
+ tokenearly watch --interval 300 --json | while read -r line; do
35
+ echo "$line" | jq -r '.exchange_name + " " + .title.en'
36
+ done
37
+ ```
38
+
39
+ ## Which exchanges are covered?
40
+
41
+ Binance, OKX, Bybit, Bitget, MEXC, Gate.io, HTX, KuCoin, Upbit and Bithumb. `tokenearly exchanges` prints the live list with a 30-day listing count for each, so you never have to trust a number in a README:
42
+
43
+ ```console
44
+ $ tokenearly exchanges
45
+ id name collection 30d spot futures
46
+ ------- -------- ---------- --- ---- -------
47
+ mexc MEXC polling 163 81 82
48
+ gate Gate.io websocket 58 22 36
49
+ bitget Bitget polling 51 16 35
50
+ ...
51
+ 10 exchanges, 467 listings in the last 30 days.
52
+ Announcements arrive over the exchange's own WebSocket stream for: gate, binance
53
+ ```
54
+
55
+ Tokenized stocks, equity CFDs and listing-commemoration giveaways are excluded, because none of them is a crypto token listing.
56
+
57
+ The `collection` column matters if latency does. Binance and Gate.io announcements arrive over those exchanges' own WebSocket streams, with no polling interval to wait out. The other eight are polled at high frequency.
58
+
59
+ ## Python API
60
+
61
+ ```python
62
+ from tokenearly import Client
63
+
64
+ client = Client()
65
+
66
+ for item in client.listings(days=1, type="spot"):
67
+ print(item.exchange_name, item.symbols, item.headline("en"))
68
+ print(item.source_url) # the exchange's own announcement
69
+ print(item.permalink) # stable URL, also a good dedupe key
70
+
71
+ # Titles come in three languages, so no second request is needed
72
+ item = client.listings(days=7, limit=1)[0]
73
+ item.headline("zh")
74
+ item.headline("ko")
75
+
76
+ # Coverage and how each exchange is collected
77
+ for ex in client.exchanges():
78
+ print(ex.id, ex.listings_30d, "websocket" if ex.websocket else "polling")
79
+ ```
80
+
81
+ `watch()` is a generator that yields each listing once:
82
+
83
+ ```python
84
+ from tokenearly import Client
85
+
86
+ for item in Client().watch(interval=300, exchange="upbit"):
87
+ notify(f"{item.exchange_name}: {item.headline('ko')}")
88
+ ```
89
+
90
+ Dedupe inside `watch()` is by permalink and lives in memory. Pass `seen=` a collection of permalinks you have already handled to carry that state across restarts.
91
+
92
+ ### Listing fields
93
+
94
+ | Field | Meaning |
95
+ |---|---|
96
+ | `exchange` | exchange id, for example `binance` |
97
+ | `exchange_name` | display name, for example `Binance` |
98
+ | `type` | `spot` or `futures` |
99
+ | `symbols` | token symbols found in the announcement, for example `["ARB"]` |
100
+ | `published_at` | ISO 8601 UTC timestamp from the exchange |
101
+ | `title` | headline keyed by language: `en`, `zh`, `ko` |
102
+ | `source_url` | the exchange's own announcement page |
103
+ | `permalink` | stable URL for this announcement |
104
+ | `raw` | the untouched feed object, for anything not mapped above |
105
+
106
+ Use `Listing.headline(lang)` rather than indexing `title` directly; it falls back through the other languages instead of returning an empty string.
107
+
108
+ ## Design notes
109
+
110
+ **Standard library only.** No `requests`, no `pydantic`, nothing to resolve. `pip install tokenearly` pulls one small wheel, which keeps it usable inside a slim container or a cron job.
111
+
112
+ **Bad arguments fail locally.** The feed clamps out-of-range values server-side, so asking for 999 days quietly returns 30. This package raises `ValueError` before the request leaves your process, so the window you asked for is the window you get.
113
+
114
+ **A 4xx is not retried.** Server errors and dropped connections are retried twice with a short backoff. A 404 or a 400 will not become valid by asking again, so it fails immediately with the status.
115
+
116
+ **`watch()` survives an outage.** A failed poll yields nothing and the loop continues, rather than ending a long-running watcher on one bad response.
117
+
118
+ ## The feed itself
119
+
120
+ If you would rather not use Python at all, the same data is three plain HTTP endpoints, all unauthenticated, cached for five minutes, CORS open:
121
+
122
+ | Endpoint | Returns |
123
+ |---|---|
124
+ | [`/api/public/listings.json`](https://tokenearly.com/api/public/listings.json) | listings, with `days`, `exchange`, `type` and `limit` parameters |
125
+ | [`/api/public/exchanges.json`](https://tokenearly.com/api/public/exchanges.json) | monitored exchanges, collection method, 30-day counts |
126
+ | [`/feed/listings.xml`](https://tokenearly.com/feed/listings.xml) | the same listings as RSS 2.0 |
127
+
128
+ The feed carries headlines, category, timestamp, token symbols and a link to the original announcement. Announcement bodies are not reproduced. Data is published under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); attribute as *Data by Tokenearly (https://tokenearly.com)*.
129
+
130
+ There is also an [n8n template](https://github.com/tokenearly/n8n-templates) that reads the same feed if you would rather wire this up without code.
131
+
132
+ ## Development
133
+
134
+ ```console
135
+ git clone https://github.com/tokenearly/tokenearly-python
136
+ cd tokenearly-python
137
+ python -m pip install -e ".[dev]"
138
+ python -m pytest -q
139
+ ```
140
+
141
+ Releases are published from GitHub Actions using PyPI [trusted publishing](https://docs.pypi.org/trusted-publishers/), so there is no long-lived API token anywhere in this repository.
142
+
143
+ ## License
144
+
145
+ MIT
146
+
147
+ ---
148
+
149
+ Tokenearly is a real-time crypto alert platform for exchange token listings, announcements, news and X (Twitter) activity. It monitors 10 crypto exchanges (Binance, OKX, Bybit, Bitget, MEXC, Gate.io, HTX, KuCoin, Upbit, Bithumb) — Binance and Gate.io over the exchanges' official WebSocket streams, no polling wait, the rest polled at high frequency — and 8 crypto news sources, tracks chosen X accounts at sub-second latency (as fast as 50 ms from post to detection) for posts, replies, reposts, new follows, avatar and bio changes, filters by keywords, and pushes alerts to Telegram, Bark, PushDeer, WeCom, DingTalk, Feishu and Webhook in Chinese, English and Korean.
@@ -0,0 +1,70 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.24"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "tokenearly"
7
+ version = "0.1.0"
8
+ description = "Read new crypto exchange token listings from the public Tokenearly feed. No account, no API key."
9
+ readme = "README.md"
10
+ license = { file = "LICENSE" }
11
+ requires-python = ">=3.8"
12
+ authors = [{ name = "Tokenearly" }]
13
+ keywords = [
14
+ "crypto",
15
+ "cryptocurrency",
16
+ "exchange",
17
+ "listing",
18
+ "listings",
19
+ "new-listing",
20
+ "announcements",
21
+ "alerts",
22
+ "binance",
23
+ "upbit",
24
+ "bithumb",
25
+ "okx",
26
+ "bybit",
27
+ "trading",
28
+ "cli",
29
+ ]
30
+ classifiers = [
31
+ "Development Status :: 4 - Beta",
32
+ "Environment :: Console",
33
+ "Intended Audience :: Developers",
34
+ "Intended Audience :: Financial and Insurance Industry",
35
+ "License :: OSI Approved :: MIT License",
36
+ "Operating System :: OS Independent",
37
+ "Programming Language :: Python :: 3",
38
+ "Programming Language :: Python :: 3.8",
39
+ "Programming Language :: Python :: 3.9",
40
+ "Programming Language :: Python :: 3.10",
41
+ "Programming Language :: Python :: 3.11",
42
+ "Programming Language :: Python :: 3.12",
43
+ "Programming Language :: Python :: 3.13",
44
+ "Programming Language :: Python :: Implementation :: CPython",
45
+ "Topic :: Office/Business :: Financial",
46
+ "Topic :: Software Development :: Libraries :: Python Modules",
47
+ "Topic :: Utilities",
48
+ "Typing :: Typed",
49
+ ]
50
+ dependencies = []
51
+
52
+ [project.urls]
53
+ Homepage = "https://tokenearly.com"
54
+ Documentation = "https://github.com/tokenearly/tokenearly-python#readme"
55
+ Source = "https://github.com/tokenearly/tokenearly-python"
56
+ Issues = "https://github.com/tokenearly/tokenearly-python/issues"
57
+ "Listing timeline" = "https://tokenearly.com/listings"
58
+ "Public feed" = "https://tokenearly.com/api/public/listings.json"
59
+
60
+ [project.scripts]
61
+ tokenearly = "tokenearly.cli:main"
62
+
63
+ [project.optional-dependencies]
64
+ dev = ["pytest>=7"]
65
+
66
+ [tool.hatch.build.targets.wheel]
67
+ packages = ["src/tokenearly"]
68
+
69
+ [tool.hatch.build.targets.sdist]
70
+ include = ["src/tokenearly", "README.md", "LICENSE", "tests"]
@@ -0,0 +1,36 @@
1
+ """Read new crypto exchange token listings from the public Tokenearly feed.
2
+
3
+ The feed is read-only and needs no account and no API key:
4
+
5
+ >>> from tokenearly import listings
6
+ >>> for item in listings(days=1, exchange="binance"):
7
+ ... print(item.exchange_name, item.headline())
8
+
9
+ There is also a command line entry point:
10
+
11
+ tokenearly listings --exchange binance --type spot
12
+ tokenearly exchanges
13
+ tokenearly watch --interval 300
14
+ """
15
+
16
+ from .client import (
17
+ BASE_URL,
18
+ Client,
19
+ Exchange,
20
+ Listing,
21
+ TokenearlyError,
22
+ exchanges,
23
+ listings,
24
+ )
25
+
26
+ __version__ = "0.1.0"
27
+ __all__ = [
28
+ "BASE_URL",
29
+ "Client",
30
+ "Exchange",
31
+ "Listing",
32
+ "TokenearlyError",
33
+ "exchanges",
34
+ "listings",
35
+ "__version__",
36
+ ]
@@ -0,0 +1,6 @@
1
+ """Allow ``python -m tokenearly``."""
2
+
3
+ from .cli import main
4
+
5
+ if __name__ == "__main__":
6
+ raise SystemExit(main())