Compare commits
10 commits
c1447e5852
...
bbd899404f
| Author | SHA1 | Date | |
|---|---|---|---|
| bbd899404f | |||
| 371a096fa4 | |||
| cdf3c70ff9 | |||
| 5ddf28547e | |||
| 3b911f6ceb | |||
| 7342d5ec74 | |||
| 215c0de21c | |||
| 376ab0d395 | |||
| 17fde29ef6 | |||
| 281c3b1fe1 |
10 changed files with 3442 additions and 58 deletions
2
.env.example
Normal file
2
.env.example
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
export APCA_API_KEY_ID="XXXXXXXXXXXXXXXXXXXXXXXXX"
|
||||
export APCA_API_SECRET_KEY="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
|
||||
20
README.md
Normal file
20
README.md
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Ticker Tape
|
||||
|
||||
To download a list of trades from a specific day from Alpaca, make an account on https://alpaca.markets/ and set APCA_API_KEY_ID and APCA_API_SECRET_KEY environment variables.
|
||||
|
||||
Then use `ticker_tape.py` to download and then sort them:
|
||||
|
||||
```
|
||||
python ticker_tape.py --symbol-file sp100_symbols.txt --start 2026-06-12 --raw > trades_unsorted.csv
|
||||
sort -t, -k1 trades_unsorted.csv > trades_sorted.csv
|
||||
```
|
||||
|
||||
To generate ESC/POS commands for the receipt printer use `print_tape.py`:
|
||||
|
||||
```
|
||||
uv run python print_tape.py -o ticker_tape.escpos trades_sorted.csv
|
||||
```
|
||||
|
||||
Defaults to 10,000 trades per escpos file, cutting the receipt paper every 1000 stocks.
|
||||
|
||||
1000 trades translates into about roughly 10 feet of receipt paper.
|
||||
30
djia_symbols.txt
Normal file
30
djia_symbols.txt
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
MMM
|
||||
AXP
|
||||
AMGN
|
||||
AMZN
|
||||
AAPL
|
||||
BA
|
||||
CAT
|
||||
CVX
|
||||
CSCO
|
||||
KO
|
||||
DIS
|
||||
GS
|
||||
HD
|
||||
HON
|
||||
IBM
|
||||
JNJ
|
||||
JPM
|
||||
MCD
|
||||
MRK
|
||||
MSFT
|
||||
NKE
|
||||
NVDA
|
||||
PG
|
||||
CRM
|
||||
SHW
|
||||
TRV
|
||||
UNH
|
||||
VZ
|
||||
V
|
||||
WMT
|
||||
2412
nyse_symbols.txt
Normal file
2412
nyse_symbols.txt
Normal file
File diff suppressed because it is too large
Load diff
126
print_tape.py
126
print_tape.py
|
|
@ -4,9 +4,9 @@
|
|||
Reads a CSV of trades (timestamp, symbol, lots, price) and generates
|
||||
ESC/POS commands with 90° rotated text to emulate an old stock ticker tape.
|
||||
|
||||
Each character gets its own printed row. When the receipt paper is turned
|
||||
sideways, symbol characters read across the top and price characters read
|
||||
across the bottom — just like a real ticker tape.
|
||||
Trades are distributed across 4 parallel columns. Each column independently
|
||||
prints symbol characters at the top of the tape and price/lot characters at
|
||||
the bottom — just like a real multi-track ticker tape.
|
||||
"""
|
||||
|
||||
import csv
|
||||
|
|
@ -16,35 +16,106 @@ from escpos.printer import Dummy
|
|||
|
||||
from glyphs import price_to_fraction, upload_fractions
|
||||
|
||||
# TM-T88V with 90° rotation: Font A chars are 24 dots wide (instead of 12),
|
||||
# so 512 printable dots / 24 = 21 chars fit across the 80mm paper width.
|
||||
LINE_WIDTH = 21
|
||||
# TM-T88V print area and font metrics
|
||||
PRINT_WIDTH_DOTS = 512 # 80mm paper printable width
|
||||
CHAR_WIDTH_DOTS = 24 # Font A rotated 90°: 24 dots wide
|
||||
NUM_COLUMNS = 4
|
||||
|
||||
# The TM-T88V has ~4mm (~28 dot) non-printable margins on each side.
|
||||
# To make columns look evenly spaced on the paper, we treat the margin
|
||||
# as part of the edge gap. Setting inter-column gap = margin gives perfect
|
||||
# symmetry: 5 gaps(28) + 4 cols(107) = 568 paper dots, 512 printable.
|
||||
MARGIN_DOTS = 28
|
||||
PAPER_DOTS = PRINT_WIDTH_DOTS + 2 * MARGIN_DOTS
|
||||
GAP_DOTS = MARGIN_DOTS
|
||||
COL_SPAN_DOTS = (PAPER_DOTS - (NUM_COLUMNS + 1) * GAP_DOTS) // NUM_COLUMNS # 107
|
||||
|
||||
COL_BOTTOM = [(i + 1) * GAP_DOTS + i * COL_SPAN_DOTS - MARGIN_DOTS for i in range(NUM_COLUMNS)]
|
||||
COL_TOP = [b + COL_SPAN_DOTS - CHAR_WIDTH_DOTS for b in COL_BOTTOM]
|
||||
|
||||
|
||||
def print_trade(p, symbol, lots, price):
|
||||
"""Print a single trade as ticker tape characters, one per row."""
|
||||
def format_price(lots, price):
|
||||
"""Format price/lots string for a trade."""
|
||||
frac = price_to_fraction(price)
|
||||
if lots > 1:
|
||||
price_str = f"{lots}s{frac}"
|
||||
else:
|
||||
price_str = frac
|
||||
return f"{lots}s{frac}"
|
||||
return frac
|
||||
|
||||
# Symbol characters at the top (right-aligned)
|
||||
|
||||
def trade_char_count(symbol, price_str):
|
||||
"""Total characters a trade occupies in a column (symbol + price + separator)."""
|
||||
return len(symbol) + len(price_str) + 1
|
||||
|
||||
|
||||
def assign_to_columns(trades):
|
||||
"""Assign trades to columns, always picking the column with the fewest chars."""
|
||||
columns = [[] for _ in range(NUM_COLUMNS)]
|
||||
lengths = [0] * NUM_COLUMNS
|
||||
|
||||
for symbol, lots, price in trades:
|
||||
price_str = format_price(lots, price)
|
||||
count = trade_char_count(symbol, price_str)
|
||||
shortest = lengths.index(min(lengths))
|
||||
columns[shortest].append((symbol, price_str))
|
||||
lengths[shortest] += count
|
||||
|
||||
return columns
|
||||
|
||||
|
||||
def build_column_chars(trades_in_column):
|
||||
"""Build the character sequence for one column.
|
||||
|
||||
Each entry is ('top', ch), ('bottom', ch), or ('blank',) controlling
|
||||
where the character is placed within the column width.
|
||||
"""
|
||||
chars = []
|
||||
for symbol, price_str in trades_in_column:
|
||||
for ch in symbol:
|
||||
p.text(" " * (LINE_WIDTH - 1) + ch + "\n")
|
||||
|
||||
# Price characters at the bottom (left-aligned)
|
||||
chars.append(("top", ch))
|
||||
for ch in price_str:
|
||||
p.text(ch + "\n")
|
||||
chars.append(("bottom", ch))
|
||||
chars.append(("blank",))
|
||||
return chars
|
||||
|
||||
# Blank line separator between trades
|
||||
p.text("\n")
|
||||
|
||||
def _set_pos(p, dots):
|
||||
"""ESC $ nL nH: set absolute horizontal print position in dots."""
|
||||
p._raw(b"\x1b\x24" + bytes([dots % 256, dots // 256]))
|
||||
|
||||
|
||||
def print_all(p, trades):
|
||||
"""Print all trades across multiple columns, one row at a time."""
|
||||
columns = assign_to_columns(trades)
|
||||
col_chars = [build_column_chars(col) for col in columns]
|
||||
max_len = max(len(cc) for cc in col_chars)
|
||||
|
||||
for row_idx in range(max_len):
|
||||
for col_idx in range(NUM_COLUMNS):
|
||||
if row_idx < len(col_chars[col_idx]):
|
||||
entry = col_chars[col_idx][row_idx]
|
||||
if entry[0] == "top":
|
||||
_set_pos(p, COL_TOP[col_idx])
|
||||
p._raw(entry[1].encode())
|
||||
elif entry[0] == "bottom":
|
||||
_set_pos(p, COL_BOTTOM[col_idx])
|
||||
p._raw(entry[1].encode())
|
||||
p._raw(b"\n")
|
||||
|
||||
return max_len
|
||||
|
||||
|
||||
def main():
|
||||
csv_file = sys.argv[1] if len(sys.argv) > 1 else "trades_sample_sorted.csv"
|
||||
output_file = sys.argv[2] if len(sys.argv) > 2 else "ticker_tape.bin"
|
||||
|
||||
# Read all trades
|
||||
trades = []
|
||||
with open(csv_file) as f:
|
||||
reader = csv.reader(f)
|
||||
for row in reader:
|
||||
_timestamp, symbol, lots_str, price_str = row
|
||||
trades.append((symbol, int(lots_str), float(price_str)))
|
||||
|
||||
p = Dummy(profile="TM-T88V")
|
||||
p.hw("INIT")
|
||||
# ESC V 1: 90° clockwise character rotation (not exposed by python-escpos)
|
||||
|
|
@ -55,21 +126,22 @@ def main():
|
|||
# Upload custom fraction glyphs (⅛ ¼ ⅜ ½ ⅝ ¾ ⅞)
|
||||
upload_fractions(p)
|
||||
|
||||
with open(csv_file) as f:
|
||||
reader = csv.reader(f)
|
||||
for row in reader:
|
||||
_timestamp, symbol, lots_str, price_str = row
|
||||
lots = int(lots_str)
|
||||
price = float(price_str)
|
||||
print_trade(p, symbol, lots, price)
|
||||
num_rows = print_all(p, trades)
|
||||
|
||||
# Feed past the cutter (~20mm above print head, ~12 lines at 12-dot spacing)
|
||||
p.text("\n" * 16)
|
||||
# Feed past the cutter (~20mm above print head)
|
||||
feed_rows = 16
|
||||
p.text("\n" * feed_rows)
|
||||
p.cut()
|
||||
|
||||
with open(output_file, "wb") as f:
|
||||
f.write(p.output)
|
||||
|
||||
# Calculate print length: each row is 12 dots at 180 DPI
|
||||
total_rows = num_rows + feed_rows
|
||||
length_mm = total_rows * 12 / 180 * 25.4
|
||||
length_in = total_rows * 12 / 180
|
||||
print(f"Wrote {len(p.output)} bytes to {output_file}", file=sys.stderr)
|
||||
print(f"{num_rows} rows, {length_mm:.0f}mm ({length_in:.1f}in) of tape", file=sys.stderr)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
|||
8
pyproject.toml
Normal file
8
pyproject.toml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[project]
|
||||
name = "ticker-tape"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
requires-python = ">=3.13"
|
||||
dependencies = [
|
||||
"python-escpos>=3.1",
|
||||
]
|
||||
100
sp100_symbols.txt
Normal file
100
sp100_symbols.txt
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
NVDA
|
||||
GOOGL
|
||||
GOOG
|
||||
AAPL
|
||||
MSFT
|
||||
AMZN
|
||||
AVGO
|
||||
TSLA
|
||||
META
|
||||
MU
|
||||
LLY
|
||||
WMT
|
||||
JPM
|
||||
AMD
|
||||
INTC
|
||||
XOM
|
||||
V
|
||||
JNJ
|
||||
ORCL
|
||||
CSCO
|
||||
LRCX
|
||||
AMAT
|
||||
COST
|
||||
MA
|
||||
CAT
|
||||
ABBV
|
||||
BAC
|
||||
CVX
|
||||
UNH
|
||||
KO
|
||||
GE
|
||||
PG
|
||||
NFLX
|
||||
MS
|
||||
HD
|
||||
GS
|
||||
PLTR
|
||||
MRK
|
||||
PM
|
||||
TXN
|
||||
WFC
|
||||
IBM
|
||||
GEV
|
||||
RTX
|
||||
LIN
|
||||
C
|
||||
QCOM
|
||||
AXP
|
||||
TMUS
|
||||
MCD
|
||||
VZ
|
||||
PEP
|
||||
AMGN
|
||||
NEE
|
||||
TMO
|
||||
DIS
|
||||
BA
|
||||
BLK
|
||||
T
|
||||
UNP
|
||||
SCHW
|
||||
DE
|
||||
GILD
|
||||
ABT
|
||||
PFE
|
||||
ISRG
|
||||
COP
|
||||
UBER
|
||||
HON
|
||||
CRM
|
||||
CVS
|
||||
BKNG
|
||||
DHR
|
||||
LMT
|
||||
LOW
|
||||
MO
|
||||
SBUX
|
||||
BMY
|
||||
COF
|
||||
SO
|
||||
NOW
|
||||
ACN
|
||||
MDT
|
||||
BNY
|
||||
DUK
|
||||
GD
|
||||
UPS
|
||||
USB
|
||||
CMCSA
|
||||
AMT
|
||||
MMM
|
||||
ADBE
|
||||
MDLZ
|
||||
FDX
|
||||
EMR
|
||||
INTU
|
||||
GM
|
||||
CL
|
||||
SPG
|
||||
NKE
|
||||
502
sp500_symbols.txt
Normal file
502
sp500_symbols.txt
Normal file
|
|
@ -0,0 +1,502 @@
|
|||
A
|
||||
AAL
|
||||
AAPL
|
||||
ABBV
|
||||
ABNB
|
||||
ABT
|
||||
ACGL
|
||||
ACN
|
||||
ADBE
|
||||
ADI
|
||||
ADM
|
||||
ADP
|
||||
ADSK
|
||||
AEE
|
||||
AEP
|
||||
AES
|
||||
AFL
|
||||
AIG
|
||||
AIZ
|
||||
AJG
|
||||
AKAM
|
||||
ALB
|
||||
ALGN
|
||||
ALL
|
||||
ALLE
|
||||
AMAT
|
||||
AMCR
|
||||
AMD
|
||||
AME
|
||||
AMGN
|
||||
AMP
|
||||
AMT
|
||||
AMZN
|
||||
ANET
|
||||
AON
|
||||
AOS
|
||||
APA
|
||||
APD
|
||||
APH
|
||||
APO
|
||||
APP
|
||||
APTV
|
||||
ARE
|
||||
ARES
|
||||
AVGO
|
||||
AVB
|
||||
AVY
|
||||
AWK
|
||||
AXON
|
||||
AXP
|
||||
AZO
|
||||
BA
|
||||
BAC
|
||||
BALL
|
||||
BAX
|
||||
BBY
|
||||
BDX
|
||||
BEN
|
||||
BF.B
|
||||
BG
|
||||
BIIB
|
||||
BKR
|
||||
BLK
|
||||
BLDR
|
||||
BMY
|
||||
BNY
|
||||
BKNG
|
||||
BR
|
||||
BRK.B
|
||||
BRO
|
||||
BSX
|
||||
BX
|
||||
BXP
|
||||
C
|
||||
CAG
|
||||
CAH
|
||||
CARR
|
||||
CASY
|
||||
CAT
|
||||
CB
|
||||
CBOE
|
||||
CBRE
|
||||
CCL
|
||||
CDNS
|
||||
CDW
|
||||
CEG
|
||||
CF
|
||||
CFG
|
||||
CHD
|
||||
CHRW
|
||||
CHTR
|
||||
CI
|
||||
CIEN
|
||||
CINF
|
||||
CL
|
||||
CLX
|
||||
CME
|
||||
CMG
|
||||
CMI
|
||||
CMS
|
||||
CNC
|
||||
CNP
|
||||
COF
|
||||
COHR
|
||||
COIN
|
||||
CL
|
||||
CMCSA
|
||||
COP
|
||||
CPAY
|
||||
CPB
|
||||
CPT
|
||||
COR
|
||||
COST
|
||||
CPRT
|
||||
CRH
|
||||
CRL
|
||||
CRM
|
||||
CRWD
|
||||
CSGP
|
||||
CSCO
|
||||
CSX
|
||||
CTAS
|
||||
CTSH
|
||||
CTVA
|
||||
CVNA
|
||||
CVS
|
||||
CVX
|
||||
CCI
|
||||
D
|
||||
DAL
|
||||
DD
|
||||
DDOG
|
||||
DE
|
||||
DECK
|
||||
DELL
|
||||
DG
|
||||
DGX
|
||||
DHI
|
||||
DHR
|
||||
DIS
|
||||
DLTR
|
||||
DLR
|
||||
DOC
|
||||
DOV
|
||||
DOW
|
||||
DPZ
|
||||
DRI
|
||||
DTE
|
||||
DUK
|
||||
DVA
|
||||
DVN
|
||||
DASH
|
||||
DXCM
|
||||
EA
|
||||
EBAY
|
||||
ECL
|
||||
ED
|
||||
EFX
|
||||
EG
|
||||
EIX
|
||||
EL
|
||||
ELV
|
||||
EME
|
||||
EMR
|
||||
EOG
|
||||
EQIX
|
||||
EQR
|
||||
EQT
|
||||
ERIE
|
||||
ES
|
||||
ESS
|
||||
ETN
|
||||
ETR
|
||||
EVRG
|
||||
EW
|
||||
EXC
|
||||
EXE
|
||||
EXPE
|
||||
EXPD
|
||||
EXR
|
||||
XOM
|
||||
F
|
||||
FANG
|
||||
FAST
|
||||
FSLR
|
||||
FBHS
|
||||
FCX
|
||||
FDS
|
||||
FDX
|
||||
FDXF
|
||||
FE
|
||||
FFIV
|
||||
FICO
|
||||
FIS
|
||||
FISV
|
||||
FITB
|
||||
FIX
|
||||
FOXA
|
||||
FOX
|
||||
FRT
|
||||
FTNT
|
||||
FTV
|
||||
GD
|
||||
GDDY
|
||||
GE
|
||||
GEHC
|
||||
GEN
|
||||
GEV
|
||||
GILD
|
||||
GIS
|
||||
GL
|
||||
GLW
|
||||
GM
|
||||
GNRC
|
||||
GOOG
|
||||
GOOGL
|
||||
GPC
|
||||
GPN
|
||||
GRMN
|
||||
GS
|
||||
GWW
|
||||
HAL
|
||||
HAS
|
||||
HCA
|
||||
HD
|
||||
HDOC
|
||||
HIG
|
||||
HLT
|
||||
HON
|
||||
HPE
|
||||
HPQ
|
||||
HRL
|
||||
HSIC
|
||||
HST
|
||||
HSY
|
||||
HUBB
|
||||
HUM
|
||||
HWM
|
||||
HBAN
|
||||
HII
|
||||
IBM
|
||||
ICE
|
||||
IDXX
|
||||
IEX
|
||||
IFF
|
||||
INCY
|
||||
INTC
|
||||
INTU
|
||||
INVH
|
||||
IP
|
||||
IQV
|
||||
IR
|
||||
IRM
|
||||
ISRG
|
||||
IT
|
||||
ITW
|
||||
IVZ
|
||||
J
|
||||
JBHT
|
||||
JBL
|
||||
JCI
|
||||
JKHY
|
||||
JNJ
|
||||
JPM
|
||||
K
|
||||
KDP
|
||||
KEY
|
||||
KEYS
|
||||
KHC
|
||||
KIM
|
||||
KLAC
|
||||
KMB
|
||||
KMI
|
||||
KKR
|
||||
KO
|
||||
KR
|
||||
KVUE
|
||||
L
|
||||
LDOS
|
||||
LEN
|
||||
LH
|
||||
LHX
|
||||
LII
|
||||
LIN
|
||||
LITE
|
||||
LLY
|
||||
LMT
|
||||
LOW
|
||||
LRCX
|
||||
LULU
|
||||
LUV
|
||||
LVS
|
||||
LYB
|
||||
LYV
|
||||
MA
|
||||
MAA
|
||||
MAR
|
||||
MAS
|
||||
MCD
|
||||
MCHP
|
||||
MCK
|
||||
MCO
|
||||
MDLZ
|
||||
MDT
|
||||
MET
|
||||
META
|
||||
MGM
|
||||
MKC
|
||||
MLM
|
||||
MMM
|
||||
MNST
|
||||
MO
|
||||
MOS
|
||||
MPC
|
||||
MPWR
|
||||
MRK
|
||||
MRNA
|
||||
MRSH
|
||||
MS
|
||||
MSCI
|
||||
MSFT
|
||||
MSI
|
||||
MTB
|
||||
MTD
|
||||
MU
|
||||
NCLH
|
||||
NDAQ
|
||||
NDSN
|
||||
NEE
|
||||
NEM
|
||||
NFLX
|
||||
NI
|
||||
NKE
|
||||
NOC
|
||||
NOW
|
||||
NRG
|
||||
NSC
|
||||
NTAP
|
||||
NTRS
|
||||
NUE
|
||||
NVDA
|
||||
NVR
|
||||
NWS
|
||||
NWSA
|
||||
NXPI
|
||||
O
|
||||
ODFL
|
||||
OKE
|
||||
OMC
|
||||
ON
|
||||
ORCL
|
||||
ORLY
|
||||
OTIS
|
||||
OXY
|
||||
PCAR
|
||||
PCG
|
||||
PEG
|
||||
PEP
|
||||
PFE
|
||||
PFG
|
||||
PG
|
||||
PGR
|
||||
PH
|
||||
PHM
|
||||
PKG
|
||||
PLD
|
||||
PLTR
|
||||
PM
|
||||
PNC
|
||||
PNR
|
||||
PNW
|
||||
PODD
|
||||
POOL
|
||||
PPG
|
||||
PPL
|
||||
PRU
|
||||
PSA
|
||||
PSKY
|
||||
PSX
|
||||
PTC
|
||||
PWR
|
||||
PYPL
|
||||
Q
|
||||
QCOM
|
||||
RCL
|
||||
REG
|
||||
REGN
|
||||
RF
|
||||
RJF
|
||||
RL
|
||||
RMD
|
||||
ROK
|
||||
ROL
|
||||
ROP
|
||||
ROST
|
||||
RSG
|
||||
RTX
|
||||
RVTY
|
||||
HOOD
|
||||
SBAC
|
||||
SBUX
|
||||
SCHW
|
||||
SHW
|
||||
SJM
|
||||
SLB
|
||||
SMCI
|
||||
SNA
|
||||
SNDK
|
||||
SNPS
|
||||
SO
|
||||
SOLV
|
||||
SPG
|
||||
SPGI
|
||||
SRE
|
||||
STE
|
||||
STLD
|
||||
STT
|
||||
STX
|
||||
STZ
|
||||
SW
|
||||
SWK
|
||||
SWKS
|
||||
SYF
|
||||
SYK
|
||||
SYY
|
||||
SATS
|
||||
T
|
||||
TAP
|
||||
TDG
|
||||
TDY
|
||||
TEL
|
||||
TER
|
||||
TFC
|
||||
TGT
|
||||
TJX
|
||||
TKO
|
||||
TMO
|
||||
TMUS
|
||||
TPL
|
||||
TPR
|
||||
TRGP
|
||||
TRMB
|
||||
TROW
|
||||
TRV
|
||||
TSCO
|
||||
TSLA
|
||||
TSN
|
||||
TT
|
||||
TTD
|
||||
TTWO
|
||||
TXT
|
||||
TYL
|
||||
UAL
|
||||
UBER
|
||||
UDR
|
||||
UHS
|
||||
ULTA
|
||||
UNH
|
||||
UNP
|
||||
UPS
|
||||
URI
|
||||
USB
|
||||
V
|
||||
VEEV
|
||||
VFC
|
||||
VICI
|
||||
VLO
|
||||
VLTO
|
||||
VMC
|
||||
VRSN
|
||||
VRSK
|
||||
VRT
|
||||
VRTX
|
||||
VST
|
||||
VTR
|
||||
VTRS
|
||||
VZ
|
||||
WAB
|
||||
WAT
|
||||
WBD
|
||||
WDC
|
||||
WEC
|
||||
WELL
|
||||
WFC
|
||||
WM
|
||||
WMB
|
||||
WMT
|
||||
WRB
|
||||
WSM
|
||||
WST
|
||||
WTW
|
||||
WDAY
|
||||
WY
|
||||
WYNN
|
||||
XEL
|
||||
XOM
|
||||
XYL
|
||||
XYZ
|
||||
YUM
|
||||
ZBRA
|
||||
ZBH
|
||||
ZTS
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
import argparse
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import requests
|
||||
|
|
@ -34,6 +35,13 @@ def fetch_trades(api_key, api_secret, symbols, start, end, limit=1000, page_toke
|
|||
print(f"[DEBUG] GET {BASE_URL}", file=sys.stderr)
|
||||
print(f"[DEBUG] params: {params}", file=sys.stderr)
|
||||
|
||||
time.sleep(0.3) # stay under 200 req/min
|
||||
resp = requests.get(BASE_URL, headers=headers, params=params)
|
||||
|
||||
# retry once on rate limit
|
||||
if resp.status_code == 429:
|
||||
print("[RATE LIMITED] sleeping 5s...", file=sys.stderr)
|
||||
time.sleep(5)
|
||||
resp = requests.get(BASE_URL, headers=headers, params=params)
|
||||
|
||||
if debug:
|
||||
|
|
@ -81,10 +89,12 @@ def main():
|
|||
parser = argparse.ArgumentParser(description="NYSE ticker tape via Alpaca market data")
|
||||
parser.add_argument("--symbols", default=DEFAULT_SYMBOLS,
|
||||
help=f"Comma-separated symbols (default: {DEFAULT_SYMBOLS})")
|
||||
parser.add_argument("--symbol-file", metavar="FILE",
|
||||
help="Read symbols from FILE (one per line) and batch requests")
|
||||
parser.add_argument("--start", help="Start datetime, YYYY-MM-DD or RFC-3339 (default: previous trading day)")
|
||||
parser.add_argument("--end", help="End datetime (default: same day as start)")
|
||||
parser.add_argument("--limit", type=int, default=1000,
|
||||
help="Max trades to fetch per API call (default: 1000, max: 10000)")
|
||||
parser.add_argument("--limit", type=int, default=10000,
|
||||
help="Max trades to fetch per API call (default: 10000, max: 10000)")
|
||||
parser.add_argument("--all", action="store_true",
|
||||
help="Paginate through ALL trades in the range (many API calls)")
|
||||
parser.add_argument("--tape", default="A",
|
||||
|
|
@ -121,17 +131,38 @@ def main():
|
|||
|
||||
tape_filter = None if args.no_filter or args.tape.lower() == "all" else args.tape.upper()
|
||||
|
||||
# Build symbol batches
|
||||
if args.symbol_file:
|
||||
with open(args.symbol_file) as f:
|
||||
all_symbols = [line.strip() for line in f if line.strip()]
|
||||
# Batch into groups of 500 to stay under URL length limits
|
||||
batch_size = 500
|
||||
batches = []
|
||||
for i in range(0, len(all_symbols), batch_size):
|
||||
batches.append(",".join(all_symbols[i:i + batch_size]))
|
||||
print(f"{len(all_symbols)} symbols in {len(batches)} batches", file=sys.stderr)
|
||||
# --all-nyse implies --all (paginate everything)
|
||||
args.all = True
|
||||
else:
|
||||
batches = [args.symbols]
|
||||
|
||||
if args.debug:
|
||||
print(f"[DEBUG] start={args.start} end={args.end}", file=sys.stderr)
|
||||
print(f"[DEBUG] symbols={args.symbols}", file=sys.stderr)
|
||||
print(f"[DEBUG] tape_filter={tape_filter} (A=NYSE-listed, B=regional, C=Nasdaq)", file=sys.stderr)
|
||||
|
||||
page_token = None
|
||||
total = 0
|
||||
api_calls = 0
|
||||
exchanges_seen = {}
|
||||
|
||||
for batch_num, symbols in enumerate(batches, 1):
|
||||
if len(batches) > 1:
|
||||
print(f"Batch {batch_num}/{len(batches)}...", file=sys.stderr)
|
||||
|
||||
page_token = None
|
||||
while True:
|
||||
data = fetch_trades(api_key, api_secret, args.symbols,
|
||||
data = fetch_trades(api_key, api_secret, symbols,
|
||||
args.start, args.end, args.limit, page_token, debug=args.debug)
|
||||
api_calls += 1
|
||||
trades = flatten_and_sort(data)
|
||||
|
||||
if args.debug:
|
||||
|
|
@ -161,15 +192,19 @@ def main():
|
|||
if not page_token or not args.all:
|
||||
break
|
||||
|
||||
if api_calls % 100 == 0:
|
||||
print(f" {api_calls} API calls, {total} trades so far...", file=sys.stderr)
|
||||
|
||||
if args.debug and exchanges_seen:
|
||||
print(f"[DEBUG] exchange codes seen: {exchanges_seen}", file=sys.stderr)
|
||||
print(f"[DEBUG] (exchanges: N=NYSE, Q=Nasdaq, P=Arca, D=FINRA, K=EDGX...)", file=sys.stderr)
|
||||
print(f"[DEBUG] (tapes: A=NYSE-listed, B=regional, C=Nasdaq-listed)", file=sys.stderr)
|
||||
|
||||
print(f"Done: {total} trades, {api_calls} API calls.", file=sys.stderr)
|
||||
if total == 0:
|
||||
print("No trades found. Try --no-filter or different --tape/symbols/dates.", file=sys.stderr)
|
||||
elif not args.all and data.get("next_page_token"):
|
||||
print(f"\n--- {total} trades shown. More available; use --all to paginate. ---", file=sys.stderr)
|
||||
print(f"More available; use --all to paginate.", file=sys.stderr)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
|||
203
uv.lock
generated
Normal file
203
uv.lock
generated
Normal file
|
|
@ -0,0 +1,203 @@
|
|||
version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.13"
|
||||
|
||||
[[package]]
|
||||
name = "appdirs"
|
||||
version = "1.4.4"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "argcomplete"
|
||||
version = "3.6.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/38/61/0b9ae6399dd4a58d8c1b1dc5a27d6f2808023d0b5dd3104bb99f45a33ff6/argcomplete-3.6.3.tar.gz", hash = "sha256:62e8ed4fd6a45864acc8235409461b72c9a28ee785a2011cc5eb78318786c89c", size = 73754, upload-time = "2025-10-20T03:33:34.741Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl", hash = "sha256:f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce", size = 43846, upload-time = "2025-10-20T03:33:33.021Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "colorama"
|
||||
version = "0.4.6"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "importlib-resources"
|
||||
version = "7.1.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/e4/06/b56dfa750b44e86157093bc8fca0ab81dccbf5260510de4eaf1cb69b5b99/importlib_resources-7.1.0.tar.gz", hash = "sha256:0722d4c6212489c530f2a145a34c0a7a3b4721bc96a15fada5930e2a0b760708", size = 44985, upload-time = "2026-04-12T16:36:09.232Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/8a/db/55a262f3606bebcae07cc14095338471ad7c0bbcaa37707e6f0ee49725b7/importlib_resources-7.1.0-py3-none-any.whl", hash = "sha256:1bd7b48b4088eddb2cd16382150bb515af0bd2c70128194392725f82ad2c96a1", size = 37232, upload-time = "2026-04-12T16:36:08.219Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pillow"
|
||||
version = "12.2.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "python-barcode"
|
||||
version = "0.16.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/0e/f2/4c0b07f100e1e184ba682021322c336bbba6aa7adfabd2616f70eff917d9/python_barcode-0.16.1.tar.gz", hash = "sha256:665ed09516b0088b5593061c5ac8662caa0b08d56bdad328388b1cab39939ac5", size = 233777, upload-time = "2025-08-27T11:05:45.614Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b2/34/810885dca784b02e5ad0f71ced9c06ba5e9d33a6493bc886f7470ce82a39/python_barcode-0.16.1-py3-none-any.whl", hash = "sha256:5776567478c9a0dae473374bb86631ba0b5ea99aaf302763b364e367ac51f367", size = 228046, upload-time = "2025-08-27T11:05:42.776Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "python-escpos"
|
||||
version = "3.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "appdirs" },
|
||||
{ name = "argcomplete" },
|
||||
{ name = "importlib-resources" },
|
||||
{ name = "pillow" },
|
||||
{ name = "python-barcode" },
|
||||
{ name = "pyyaml" },
|
||||
{ name = "qrcode" },
|
||||
{ name = "setuptools" },
|
||||
{ name = "six" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/b5/e8/dbcaca6c9db8d133e3a2fc36982f20bb0bdc9bdc9e04a540b231dd75b2d1/python-escpos-3.1.tar.gz", hash = "sha256:31240cdd43a6d3371c2c536f8dec02f31bf68ee967cd2edb255a94cf67295ac0", size = 199540, upload-time = "2023-12-17T22:06:03.643Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/88/5e/def5f834b900d98c4c6477469b4e0cd1147d7158ddffcddac6904ec53f6e/python_escpos-3.1-py3-none-any.whl", hash = "sha256:d9aec8c50b106ca83aaf0781e2bd38a02c82ab206cb6d673241db5252438c73e", size = 69350, upload-time = "2023-12-17T22:06:01.048Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml"
|
||||
version = "6.0.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "qrcode"
|
||||
version = "8.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/8f/b2/7fc2931bfae0af02d5f53b174e9cf701adbb35f39d69c2af63d4a39f81a9/qrcode-8.2.tar.gz", hash = "sha256:35c3f2a4172b33136ab9f6b3ef1c00260dd2f66f858f24d88418a015f446506c", size = 43317, upload-time = "2025-05-01T15:44:24.726Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/b8/d2d6d731733f51684bbf76bf34dab3b70a9148e8f2cef2bb544fccec681a/qrcode-8.2-py3-none-any.whl", hash = "sha256:16e64e0716c14960108e85d853062c9e8bba5ca8252c0b4d0231b9df4060ff4f", size = 45986, upload-time = "2025-05-01T15:44:22.781Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "setuptools"
|
||||
version = "82.0.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "six"
|
||||
version = "1.17.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ticker-tape"
|
||||
version = "0.1.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "python-escpos" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [{ name = "python-escpos", specifier = ">=3.1" }]
|
||||
Loading…
Add table
Add a link
Reference in a new issue