diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..afeade6 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +export APCA_API_KEY_ID="XXXXXXXXXXXXXXXXXXXXXXXXX" +export APCA_API_SECRET_KEY="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" diff --git a/README.md b/README.md new file mode 100644 index 0000000..e45912b --- /dev/null +++ b/README.md @@ -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. diff --git a/djia_symbols.txt b/djia_symbols.txt new file mode 100644 index 0000000..e6cf4ad --- /dev/null +++ b/djia_symbols.txt @@ -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 diff --git a/nyse_symbols.txt b/nyse_symbols.txt new file mode 100644 index 0000000..9e87b23 --- /dev/null +++ b/nyse_symbols.txt @@ -0,0 +1,2412 @@ +A +AA +AADX +AAMI +AAP +AAT +AAUC +AB +ABBV +ABCB +ABEV +ABG +ABM +ABR +ABT +ABX +ABXL +ACA +ACCO +ACEL +ACH +ACHR +ACI +ACLO +ACM +ACN +ACP +ACR +ACRE +ACV +ACVA +AD +ADC +ADCT +ADM +ADNT +ADT +ADX +AEE +AEFC +AEG +AEM +AEO +AER +AERO +AES +AESI +AEXA +AFB +AFG +AFGB +AFGC +AFGD +AFGE +AFL +AG +AGBK +AGCO +AGD +AGI +AGL +AGM +AGO +AGRO +AGX +AHR +AHRT +AHT +AI +AIG +AII +AIIA +AIN +AIO +AIR +AIT +AIV +AIZ +AIZN +AJG +AKA +AKAF +AKR +ALB +ALC +ALG +ALH +ALIT +ALK +ALL +ALLE +ALLY +ALSN +ALTG +ALUB +ALV +ALX +AM +AMBP +AMBQ +AMC +AMCR +AME +AMG +AMH +AMN +AMP +AMPX +AMPY +AMR +AMRC +AMRZ +AMT +AMTB +AMTD +AMTM +AMWL +AMX +AN +ANDG +ANET +ANF +ANGX +ANRO +ANVS +AOD +AOMD +AOMN +AOMR +AON +AORT +AOS +AP +APAM +APD +APG +APH +APLE +APO +APOS +APTV +AQN +AQNB +AR +ARCO +ARDC +ARDT +ARE +ARES +ARI +ARIS +ARL +ARLO +ARMK +AROC +ARR +ARW +ARX +AS +ASA +ASAN +ASB +ASBA +ASC +ASG +ASGI +ASH +ASIC +ASIX +ASPN +ASR +ASX +ATEN +ATHM +ATHS +ATI +ATKR +ATMU +ATO +ATR +ATS +AU +AUB +AUNA +AVA +AVAL +AVB +AVBC +AVD +AVEX +AVK +AVNS +AVNT +AVTR +AVY +AWF +AWI +AWK +AWP +AWR +AX +AXIA +AXP +AXR +AXS +AXTA +AYI +AZN +AZO +AZZ +B +BA +BABA +BAC +BAH +BAK +BALL +BALY +BAM +BANC +BAP +BARK +BAX +BB +BBAI +BBAR +BBBY +BBD +BBDC +BBDO +BBN +BBT +BBUC +BBVA +BBW +BBWI +BBY +BC +BCAT +BCC +BCE +BCEM +BCGD +BCH +BCO +BCS +BCSF +BCSM +BCSS +BCX +BDC +BDJ +BDN +BDX +BE +BEBE +BEKE +BEN +BEP +BEPC +BEPH +BEPI +BEPJ +BETA +BFAM +BFH +BFLY +BFS +BG +BGB +BGH +BGR +BGS +BGSF +BGSI +BGT +BGX +BGY +BH +BHC +BHE +BHK +BHP +BHR +BHV +BHVN +BIII +BILL +BIO +BIP +BIPC +BIPH +BIPI +BIPJ +BIRK +BIT +BJ +BKD +BKE +BKH +BKKT +BKSY +BKT +BKU +BKV +BLCO +BLD +BLDR +BLK +BLND +BLSH +BLW +BLX +BMA +BME +BMEZ +BMI +BMN +BMO +BMY +BN +BNED +BNH +BNJ +BNL +BNS +BNT +BNY +BOBS +BOC +BOE +BOH +BOND +BOOT +BORR +BOW +BOX +BP +BPRE +BR +BRBR +BRC +BRCC +BRCE +BREE +BRIE +BRO +BROL +BROS +BRSL +BRSP +BRT +BRW +BRX +BSAC +BSBR +BSL +BSM +BST +BSTZ +BSX +BTE +BTGO +BTI +BTO +BTT +BTU +BTX +BTZ +BUD +BUI +BUR +BURL +BUXX +BV +BVN +BW +BWA +BWG +BWIV +BWLP +BWMX +BWNB +BWXT +BX +BXC +BXDC +BXMT +BXP +BXSL +BY +BYD +BZH +C +CAAP +CABO +CACI +CAE +CAF +CAG +CAH +CAL +CALX +CALY +CANG +CAPL +CARR +CARS +CAT +CATO +CAVA +CB +CBAN +CBL +CBNA +CBRE +CBT +CBU +CBZ +CC +CCI +CCID +CCIF +CCJ +CCK +CCL +CCM +CCO +CCS +CCU +CCZ +CDE +CDLR +CDP +CDRE +CE +CEE +CEPU +CF +CFG +CFND +CFR +CGAU +CGV +CHCT +CHD +CHE +CHGG +CHH +CHMI +CHPT +CHT +CHWY +CI +CIA +CIB +CICB +CICC +CIEN +CIF +CIG +CII +CIM +CIMN +CIMO +CIMP +CINT +CION +CL +CLB +CLBR +CLDT +CLF +CLH +CLPR +CLS +CLVT +CLW +CLX +CM +CMBT +CMC +CMCM +CMDB +CMG +CMI +CMP +CMRE +CMS +CMSA +CMSC +CMSD +CMTG +CNA +CNC +CNF +CNH +CNI +CNK +CNM +CNMD +CNNE +CNO +CNP +CNQ +CNR +CNS +CNX +CODI +COF +COHR +COLD +COMP +CON +COOK +COP +COPL +COR +COSO +COTY +COUR +CP +CPA +CPAC +CPAI +CPAY +CPF +CPK +CPNG +CPRI +CPS +CPT +CQP +CR +CRBD +CRBG +CRC +CRCL +CRGY +CRH +CRI +CRK +CRL +CRM +CRS +CRT +CSAN +CSL +CSR +CSTM +CSV +CSW +CTEV +CTO +CTOS +CTRE +CTRI +CTS +CTVA +CUBB +CUBE +CUBI +CURB +CURV +CUZ +CVE +CVEO +CVI +CVLG +CVNA +CVS +CVSA +CVX +CW +CWAN +CWEN +CWH +CWK +CWT +CX +CXM +CXT +CXW +CYD +CYH +D +DAC +DAL +DAN +DAO +DAR +DAVA +DB +DBD +DBI +DBL +DBRG +DCBG +DCH +DCI +DCO +DCOM +DD +DDD +DDL +DDS +DDT +DE +DEA +DEC +DECK +DEI +DELL +DEO +DFH +DFIN +DFP +DG +DGX +DHF +DHI +DHR +DHT +DHX +DIN +DINO +DIS +DIVY +DK +DKL +DKS +DLB +DLNG +DLR +DLX +DLY +DMA +DMB +DMO +DNA +DNOW +DNP +DOC +DOCN +DOCS +DOLE +DOUG +DOV +DOW +DPG +DQ +DRD +DRI +DRLL +DSL +DSM +DSMC +DSTX +DSU +DSX +DT +DTB +DTE +DTF +DTG +DTK +DTM +DTW +DUK +DUKB +DV +DVA +DVN +DX +DXC +DXYZ +DY +E +EAF +EAI +EARN +EAT +EBF +EBS +EC +ECAT +ECC +ECCC +ECCU +ECCV +ECG +ECL +ECO +ECVT +ED +EDD +EDF +EDN +EDU +EE +EEA +EEX +EFC +EFOR +EFR +EFT +EFX +EFXT +EG +EGO +EGP +EGY +EHC +EHI +EIC +EICA +EIG +EIIA +EIX +EL +ELAN +ELC +ELF +ELLA +ELME +ELPC +ELS +ELV +EMA +EMBJ +EMD +EME +EMF +EMN +EMO +EMP +EMR +ENB +ENHA +ENIC +ENJ +ENO +ENOV +ENR +ENS +ENVA +EOD +EOG +EOI +EOS +EOT +EPAC +EPAM +EPC +EPD +EPR +EPRT +EQBK +EQH +EQNR +EQR +EQS +EQT +ERO +EROC +EROK +ES +ESAB +ESE +ESI +ESNT +ESRT +ESS +ESTC +ET +ETB +ETD +ETG +ETJ +ETN +ETO +ETR +ETSS +ETSY +ETV +ETW +ETX +ETY +EVAC +EVC +EVEX +EVF +EVG +EVH +EVMN +EVN +EVR +EVT +EVTC +EVTL +EVTR +EW +EXG +EXK +EXP +EXPD +EXR +F +FAF +FBIN +FBK +FBP +FBRT +FC +FCF +FCN +FCPT +FCRS +FCT +FCX +FDP +FDS +FDX +FDXF +FE +FEDU +FEGE +FENG +FEOE +FERG +FET +FF +FFA +FFC +FG +FGN +FGSN +FHI +FHN +FICO +FIG +FIGS +FINS +FINV +FIS +FITB +FIX +FIXT +FLC +FLG +FLNG +FLO +FLOC +FLR +FLS +FLUT +FLXR +FMC +FMN +FMS +FMX +FMY +FN +FNB +FND +FNF +FNV +FOA +FOF +FOR +FOUR +FPF +FPH +FPI +FPS +FR +FRA +FRO +FRT +FSCO +FSK +FSM +FSS +FSSL +FT +FTHY +FTI +FTK +FTS +FTV +FTW +FTWO +FUBO +FUL +FUN +FVR +FVRR +FXED +G +GAB +GAM +GAP +GATX +GBAB +GBCI +GBTG +GBX +GCO +GCTS +GCV +GD +GDDY +GDIV +GDL +GDO +GDOT +GDV +GE +GEF +GEL +GENI +GEO +GETY +GEV +GF +GFF +GFI +GFL +GFR +GGB +GGG +GGT +GGZ +GHC +GHG +GHI +GHM +GHY +GIB +GIC +GIL +GIS +GJH +GJO +GJP +GJR +GJS +GJT +GKOS +GL +GLED +GLOB +GLP +GLW +GM +GME +GMED +GMMF +GMRS +GNE +GNK +GNL +GNRC +GNT +GNW +GOF +GOLD +GOLF +GOOS +GOTU +GPC +GPGI +GPI +GPJA +GPK +GPMT +GPN +GPOR +GPRK +GRBK +GRC +GRDN +GRMN +GRND +GRNT +GROV +GRX +GS +GSBD +GSK +GSL +GTES +GTLS +GTN +GTY +GUG +GUT +GVA +GWH +GWRE +GWW +GXO +GYLD +H +HAE +HAFN +HAL +HASI +HAWK +HAYW +HBB +HBM +HCA +HCC +HCI +HCXY +HD +HDB +HE +HEI +HEQ +HESM +HF +HFEQ +HFGM +HFMF +HFND +HFRO +HG +HGER +HGLB +HGTY +HGV +HHH +HIG +HII +HIMS +HIO +HIPO +HIW +HIX +HKD +HL +HLF +HLI +HLIO +HLLY +HLN +HLT +HLX +HMC +HMN +HMY +HNGE +HNI +HOG +HOMB +HOV +HP +HPE +HPF +HPI +HPP +HPQ +HPS +HQH +HQL +HR +HRB +HRI +HRL +HRTG +HSBC +HSHP +HSY +HTB +HTD +HTFC +HTGC +HTH +HTT +HUBB +HUBS +HUM +HUN +HUYA +HVT +HWM +HXL +HY +HYB +HYBX +HYI +HYT +HYTR +HZO +IAE +IAG +IBM +IBN +IBP +IBTA +ICE +ICL +IDA +IDE +IDT +IEX +IFF +IFN +IFS +IGA +IGCB +IGD +IGI +IGR +IH +IHD +IHG +IHS +IIF +IIIN +IIM +IIPR +IMAX +INFO +INFQ +INFY +ING +INGM +INGR +INN +INR +INSP +INSW +INVH +INVX +IONQ +IOT +IP +IPB +IPI +IQI +IQV +IR +IRAB +IRM +IRS +IRT +ISD +IT +ITGR +ITT +ITUB +ITW +IVR +IVT +IVZ +IX +J +JACS +JAN +JBGS +JBI +JBK +JBL +JBND +JBS +JBTM +JCE +JCI +JEF +JELD +JENA +JFR +JGH +JHG +JHI +JHS +JHX +JILL +JKS +JLL +JLS +JMIA +JMM +JNJ +JOBY +JOE +JOF +JPC +JPM +JQC +JRI +JRS +JXN +KAI +KB +KBDC +KBH +KBR +KD +KEN +KEP +KEX +KEY +KEYS +KF +KFRC +KFY +KGC +KGS +KIM +KIO +KKR +KKRS +KKRT +KLAR +KLC +KMI +KMPB +KMPR +KMT +KMX +KN +KNF +KNOP +KNSL +KNTK +KNX +KO +KODK +KOF +KOP +KORE +KOS +KPET +KR +KRC +KREF +KRG +KRMN +KRO +KRP +KRSP +KSS +KT +KTB +KTF +KTH +KTN +KVUE +KVYO +KW +KWR +KWY +KYN +L +LAC +LAD +LADR +LANV +LAR +LAW +LAZ +LB +LBRT +LC +LCII +LCLN +LDI +LDOS +LDP +LEA +LEG +LEN +LEO +LEU +LEVI +LFT +LGI +LH +LHX +LII +LION +LITB +LLY +LMND +LMT +LNC +LND +LNG +LNN +LOAR +LOB +LOCL +LOMA +LOW +LPG +LPL +LPX +LRN +LSPD +LTC +LTH +LTM +LU +LUCK +LUMN +LUV +LUXE +LVS +LVWR +LW +LXFR +LXP +LXU +LYB +LYG +LYV +LZB +LZM +M +MA +MAA +MAC +MAGN +MAIN +MAIR +MAN +MANE +MANU +MAS +MATV +MATX +MAX +MBC +MBI +MC +MCB +MCD +MCI +MCK +MCN +MCO +MCR +MCS +MCY +MD +MDA +MDST +MDT +MDU +MDV +MEC +MED +MEGI +MEI +MET +MFA +MFAN +MFAO +MFC +MFG +MFM +MFSB +MFSG +MFSI +MFSM +MFSV +MG +MGA +MGF +MGM +MGR +MGRB +MGRD +MGRE +MGY +MH +MHD +MHF +MHK +MHLA +MHNC +MHO +MIAX +MICC +MIN +MIR +MITN +MITP +MITT +MIY +MKC +MKL +MLI +MLM +MLP +MLR +MMD +MMI +MMID +MMK +MMKT +MMM +MMS +MMT +MMU +MNR +MNSO +MNTN +MO +MOD +MOGU +MOH +MOS +MOV +MP +MPA +MPC +MPLX +MPT +MPV +MQY +MRK +MRP +MRSH +MS +MSA +MSB +MSC +MSCI +MSD +MSDL +MSGE +MSGS +MSI +MSIF +MSM +MT +MTAL +MTB +MTD +MTDR +MTG +MTH +MTN +MTR +MTRN +MTUS +MTW +MTX +MTZ +MUA +MUC +MUFG +MUI +MUJ +MUR +MUSA +MUSE +MUX +MVO +MWA +MX +MXE +MXF +MYE +MYI +MYN +MZYX +NABL +NAC +NAD +NAN +NAT +NATL +NAZ +NBB +NBHC +NBR +NBXG +NC +NCA +NCDL +NCLH +NCV +NCZ +NDMO +NE +NEA +NEE +NEM +NET +NEU +NEXA +NFG +NFJ +NGG +NGL +NGS +NGVC +NGVT +NHI +NI +NIC +NIE +NIM +NIO +NIQ +NJR +NKE +NKX +NL +NLOP +NLY +NMAI +NMAX +NMCO +NMG +NMI +NMM +NMR +NMS +NMT +NMZ +NNI +NNN +NNY +NOA +NOAH +NOC +NOG +NOK +NOMD +NOV +NOW +NP +NPB +NPCT +NPFD +NPK +NPKI +NPO +NPV +NPWR +NRDY +NREF +NRG +NRGV +NRK +NRP +NRT +NRUC +NSA +NSC +NSP +NTB +NTR +NTST +NTZ +NU +NUE +NUS +NUV +NUVB +NUW +NVG +NVGS +NVO +NVR +NVRI +NVS +NVST +NVT +NWAX +NWG +NWN +NX +NXDR +NXDT +NXE +NXG +NXP +NXRT +NYC +NYT +NZF +O +OBDC +OBK +OC +ODC +ODV +OEC +OFG +OFRM +OGC +OGE +OGN +OGS +OHI +OI +OIA +OII +OIS +OKE +OKLO +OLN +OLP +OMC +OMF +ONIT +ONL +ONON +ONT +ONTO +OOMA +OPAD +OPFI +OPLN +OPP +OPTU +OPY +OR +ORA +ORC +ORCL +ORI +ORN +OSCR +OSG +OSK +OTF +OTIS +OUT +OVV +OWL +OWLT +OXM +OXY +P +PAAS +PAC +PACK +PACS +PAG +PAGS +PAI +PAII +PAM +PAR +PARR +PATH +PAXS +PAY +PAYC +PB +PBA +PBF +PBH +PBI +PBR +PBT +PCF +PCG +PCM +PCN +PCOR +PCQ +PD +PDCC +PDI +PDM +PDO +PDPA +PDS +PDT +PDX +PEB +PEG +PEN +PEO +PERF +PEW +PFD +PFE +PFGC +PFH +PFL +PFLA +PFLT +PFN +PFO +PFS +PFSI +PG +PGP +PGR +PGZ +PH +PHG +PHI +PHIN +PHK +PHM +PHR +PII +PIM +PINE +PINS +PIPR +PJT +PK +PKE +PKG +PKX +PL +PLD +PLGO +PLNT +PLOW +PM +PML +PMM +PMMF +PMO +PMT +PMTU +PMTV +PMTW +PNC +PNFP +PNI +PNNT +PNR +PNW +POR +POST +PPG +PPL +PPLC +PPT +PR +PRA +PRCS +PRG +PRGO +PRH +PRI +PRIM +PRKS +PRLB +PRM +PRMB +PRS +PRSU +PRT +PRU +PRVS +PS +PSA +PSBD +PSF +PSFE +PSN +PSO +PSQH +PSTL +PSUS +PSX +PTA +PTY +PUK +PUMP +PVH +PVL +PWR +PXED +PYT +Q +QBTS +QGEN +QRED +QSR +QTWO +QUAD +QXO +R +RA +RAC +RACE +RAL +RAMP +RBA +RBC +RBLX +RBRK +RC +RCD +RCI +RCL +RCS +RCUS +RDDT +RDN +RDW +RDY +RELX +RERE +RES +REX +REXR +REZI +RF +RFI +RFL +RFM +RFMZ +RGA +RGR +RGT +RH +RHI +RHLD +RHP +RIG +RIO +RITM +RIV +RJF +RKT +RL +RLI +RLJ +RLTY +RLX +RM +RMAX +RMD +RMI +RMM +RMMZ +RMT +RNG +RNGR +RNP +RNR +RNST +ROG +ROK +ROL +RONB +RPC +RPM +RPT +RQI +RRC +RRX +RS +RSF +RSG +RSI +RSKD +RTO +RTX +RVI +RVLV +RVT +RVTY +RWT +RWTN +RWTO +RWTP +RWTQ +RWTS +RXO +RY +RYAM +RYAN +RYN +RYZ +RZC +S +SA +SABA +SAC +SAFE +SAGU +SAH +SAJ +SAM +SAN +SAP +SAR +SARO +SAT +SAV +SAY +SAZ +SB +SBH +SBI +SBR +SBS +SBSI +SBSW +SBXD +SBXE +SCCO +SCD +SCHW +SCI +SCL +SCM +SD +SDHC +SDHY +SDRL +SE +SEG +SEI +SEM +SES +SF +SFB +SFBS +SFL +SG +SGHC +SGI +SGOV +SGU +SHAK +SHEL +SHG +SHO +SHOC +SHV +SHW +SI +SID +SIG +SII +SILA +SITC +SITE +SJM +SJT +SKE +SKIL +SKLZ +SKM +SKT +SKY +SKYH +SLAI +SLB +SLF +SLG +SLGN +SLNZ +SLQT +SLVM +SM +SMA +SMBK +SMC +SMFG +SMG +SMHI +SMP +SMR +SMRT +SMWB +SN +SNA +SNAP +SNDA +SNDR +SNN +SNOW +SNX +SO +SOBO +SOC +SOJC +SOJD +SOJE +SOJF +SOLV +SOMN +SON +SONY +SOR +SOS +SOUL +SPB +SPCE +SPE +SPG +SPGI +SPH +SPHR +SPIR +SPMA +SPMC +SPME +SPNT +SPOT +SPRU +SPXC +SPXX +SQM +SQNS +SR +SRE +SREA +SRFM +SRG +SRI +SRJN +SRL +SRV +SSB +SSD +SSL +SSMR +SST +SSTK +ST +STAG +STC +STE +STEL +STEM +STEW +STG +STK +STLA +STM +STN +STNG +STT +STUB +STVN +STWD +STXD +STXE +STXF +STXG +STXK +STXT +STXV +STZ +SU +SUI +SUN +SUNB +SUNC +SUPV +SUZ +SVV +SW +SWK +SWX +SWZ +SXC +SXI +SXT +SYF +SYK +SYY +T +TAC +TAK +TAL +TALO +TAP +TBB +TBBB +TBI +TBLU +TBN +TCAI +TCBX +TCI +TCPA +TD +TDAY +TDC +TDF +TDG +TDOC +TDS +TDW +TDY +TE +TECK +TEI +TEL +TEN +TEO +TEVA +TEX +TFC +TFII +TFIN +TFPM +TFX +TG +TGE +TGLS +TGS +TGT +THC +THG +THIR +THLV +THMR +THO +THQ +THW +TIC +TIMB +TISI +TJX +TK +TKC +TKO +TKR +TLK +TLYS +TM +TME +TMHC +TMO +TNC +TNET +TNGY +TNK +TNL +TOL +TOST +TPB +TPC +TPL +TPR +TPTA +TPVG +TPYP +TPZ +TR +TRAD +TRAK +TRC +TREX +TRGP +TRLV +TRN +TRNO +TROX +TRP +TRTX +TRU +TRV +TS +TSI +TSLX +TSM +TSN +TSQ +TT +TTAM +TTC +TTE +TTI +TU +TUYA +TV +TVC +TVE +TWI +TWLO +TWN +TWO +TWOD +TX +TXNM +TXO +TXT +TY +TYG +TYL +U +UA +UAA +UAMY +UAN +UBER +UBS +UCB +UDR +UE +UFI +UGI +UGP +UHAL +UHS +UHT +UI +UIS +UL +ULS +UMC +UMH +UNF +UNFI +UNH +UNM +UNMA +UNP +UP +UPS +URI +USA +USAC +USB +USFD +USNA +USPH +UTF +UTI +UTL +UTZ +UVE +UVV +UWMC +UZD +UZE +UZF +V +VAC +VACI +VAL +VALE +VATE +VBF +VCV +VCX +VECA +VEEV +VEL +VET +VFC +VG +VGI +VGM +VGNT +VHI +VIA +VICI +VIK +VIPS +VIRT +VIST +VIV +VKQ +VLN +VLO +VLRS +VLT +VLTO +VMC +VMI +VMO +VNO +VNT +VOC +VOYA +VOYG +VPG +VPV +VRT +VRTS +VSH +VST +VSTS +VSXY +VTEX +VTMX +VTN +VTOL +VTR +VTS +VVR +VVV +VVX +VYX +VZ +W +WAB +WAGN +WAL +WAT +WBI +WBIY +WBS +WBX +WCC +WCN +WD +WDH +WDI +WDS +WEA +WEAV +WEC +WELL +WENC +WES +WEX +WF +WFC +WFG +WGO +WH +WHD +WHG +WHK +WHR +WIA +WINN +WIT +WIW +WK +WKC +WLK +WLKP +WLTG +WLY +WLYB +WM +WMB +WMK +WMS +WNC +WOLF +WOR +WPAC +WPC +WPM +WPP +WRB +WRBY +WS +WSM +WSO +WSR +WST +WT +WTI +WTM +WTRG +WTS +WTTR +WU +WWW +WY +XFLH +XFLT +XHR +XIFR +XOM +XPER +XPEV +XPO +XPOF +XPRO +XRN +XXI +XYF +XYL +XYZ +XZO +YALA +YCY +YELP +YETI +YEXT +YMM +YOU +YPF +YRD +YSG +YSS +YUM +YUMC +ZBH +ZEPP +ZETA +ZGN +ZH +ZIM +ZIP +ZKH +ZTO +ZTR +ZTS +ZVIA +ZWS diff --git a/print_tape.py b/print_tape.py index d149029..f4d9a61 100644 --- a/print_tape.py +++ b/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) - for ch in symbol: - p.text(" " * (LINE_WIDTH - 1) + ch + "\n") - # Price characters at the bottom (left-aligned) - for ch in price_str: - p.text(ch + "\n") +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 - # Blank line separator between trades - p.text("\n") + +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: + chars.append(("top", ch)) + for ch in price_str: + chars.append(("bottom", ch)) + chars.append(("blank",)) + return chars + + +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__": diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..728b686 --- /dev/null +++ b/pyproject.toml @@ -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", +] diff --git a/sp100_symbols.txt b/sp100_symbols.txt new file mode 100644 index 0000000..97087af --- /dev/null +++ b/sp100_symbols.txt @@ -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 diff --git a/sp500_symbols.txt b/sp500_symbols.txt new file mode 100644 index 0000000..c2ed563 --- /dev/null +++ b/sp500_symbols.txt @@ -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 diff --git a/ticker_tape.py b/ticker_tape.py index 83a3e81..96c2634 100644 --- a/ticker_tape.py +++ b/ticker_tape.py @@ -4,6 +4,7 @@ import argparse import os import sys +import time from datetime import datetime, timedelta import requests @@ -34,8 +35,15 @@ 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: print(f"[DEBUG] HTTP {resp.status_code}", file=sys.stderr) if not resp.ok: @@ -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,55 +131,80 @@ 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 = {} - while True: - data = fetch_trades(api_key, api_secret, args.symbols, - args.start, args.end, args.limit, page_token, debug=args.debug) - trades = flatten_and_sort(data) - if args.debug: + 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, symbols, + args.start, args.end, args.limit, page_token, debug=args.debug) + api_calls += 1 + trades = flatten_and_sort(data) + + if args.debug: + for trade in trades: + ex = trade.get("x", "?") + tape = trade.get("z", "?") + exchanges_seen[ex] = exchanges_seen.get(ex, 0) + 1 + exchanges_seen[f"tape:{tape}"] = exchanges_seen.get(f"tape:{tape}", 0) + 1 + for trade in trades: - ex = trade.get("x", "?") - tape = trade.get("z", "?") - exchanges_seen[ex] = exchanges_seen.get(ex, 0) + 1 - exchanges_seen[f"tape:{tape}"] = exchanges_seen.get(f"tape:{tape}", 0) + 1 + if tape_filter and trade.get("z") != tape_filter: + continue + if trade["s"] < 100: + continue - for trade in trades: - if tape_filter and trade.get("z") != tape_filter: - continue - if trade["s"] < 100: - continue + lots = trade["s"] // 100 - lots = trade["s"] // 100 + if args.raw: + print(f"{trade['t']},{trade['sym']},{lots},{trade['p']:.2f}") + else: + ts = trade["t"][:19].replace("T", " ") + line = format_tape_line(trade["sym"], lots, trade["p"]) + print(f"{ts} {line}") + total += 1 - if args.raw: - print(f"{trade['t']},{trade['sym']},{lots},{trade['p']:.2f}") - else: - ts = trade["t"][:19].replace("T", " ") - line = format_tape_line(trade["sym"], lots, trade["p"]) - print(f"{ts} {line}") - total += 1 + page_token = data.get("next_page_token") + if not page_token or not args.all: + break - page_token = data.get("next_page_token") - 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__": diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..ac23894 --- /dev/null +++ b/uv.lock @@ -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" }]