pkscreener 0.46.20250214.717__cp312-cp312-win_amd64.whl → 0.46.20250218.719__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/README.txt +5 -5
  2. pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/__init__.py +1 -0
  3. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/pkscreenerbot.py +142 -6
  4. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/requirements.txt +2 -2
  5. {pkscreener-0.46.20250214.717.dist-info → pkscreener-0.46.20250218.719.dist-info}/METADATA +7 -7
  6. pkscreener-0.46.20250218.719.dist-info/RECORD +58 -0
  7. pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/__init__.py +0 -1
  8. pkscreener-0.46.20250214.717.dist-info/RECORD +0 -58
  9. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/Disclaimer.txt +0 -0
  10. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/LICENSE-Others.txt +0 -0
  11. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/LICENSE.txt +0 -0
  12. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/LogoWM.txt +0 -0
  13. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/__init__.py +0 -0
  14. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
  15. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/AssetsManager.py +0 -0
  16. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Backtest.py +0 -0
  17. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Barometer.py +0 -0
  18. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
  19. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/CandlePatterns.py +0 -0
  20. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Changelog.py +0 -0
  21. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/ConfigManager.py +0 -0
  22. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
  23. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/ConsoleUtility.py +0 -0
  24. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Fetcher.py +0 -0
  25. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
  26. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/ImageUtility.py +0 -0
  27. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/MarketMonitor.py +0 -0
  28. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/MarketStatus.py +0 -0
  29. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
  30. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Messenger.py +0 -0
  31. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
  32. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKAnalytics.py +0 -0
  33. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
  34. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
  35. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
  36. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
  37. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKScanRunner.py +0 -0
  38. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
  39. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
  40. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
  41. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKTask.py +0 -0
  42. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
  43. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Pktalib.py +0 -0
  44. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
  45. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/PortfolioXRay.py +0 -0
  46. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/ScreeningStatistics.py +0 -0
  47. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/StockScreener.py +0 -0
  48. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
  49. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
  50. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/Utility.py +0 -0
  51. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
  52. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/classes/keys.py +0 -0
  53. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/courbd.ttf +0 -0
  54. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/globals.py +0 -0
  55. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/pkscreener.ini +0 -0
  56. {pkscreener-0.46.20250214.717.data → pkscreener-0.46.20250218.719.data}/purelib/pkscreener/pkscreenercli.py +0 -0
  57. {pkscreener-0.46.20250214.717.dist-info → pkscreener-0.46.20250218.719.dist-info}/LICENSE +0 -0
  58. {pkscreener-0.46.20250214.717.dist-info → pkscreener-0.46.20250218.719.dist-info}/WHEEL +0 -0
  59. {pkscreener-0.46.20250214.717.dist-info → pkscreener-0.46.20250218.719.dist-info}/entry_points.txt +0 -0
  60. {pkscreener-0.46.20250214.717.dist-info → pkscreener-0.46.20250218.719.dist-info}/top_level.txt +0 -0
@@ -328,15 +328,15 @@ After you have finished the run, go to that copied path, zip the contents of the
328
328
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
329
329
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
330
330
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
331
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli.exe
331
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli.exe
332
332
  [Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
333
- [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_x64.bin
333
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.bin
334
334
  [Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
335
- [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_arm64.bin
335
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.bin
336
336
  [Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
337
- [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_x64.run
337
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.run
338
338
  [Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
339
- [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_arm64.run
339
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.run
340
340
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
341
341
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
342
342
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -0,0 +1 @@
1
+ VERSION='0.46.20250218.719'
@@ -547,6 +547,64 @@ def PScanners(update: Update, context: CallbackContext) -> str:
547
547
  registerUser(user)
548
548
  return START_ROUTES
549
549
 
550
+ def addNewButtonsToReplyMarkup(reply_markup, buttonKeyTextDict={}):
551
+ # Get the existing inline keyboard
552
+ keyboard = reply_markup.inline_keyboard if reply_markup else []
553
+ inlineMenus = [] # Temporary list to hold a row of buttons
554
+ for key, value in buttonKeyTextDict.items():
555
+ inlineMenus.append(InlineKeyboardButton(f"{value}", callback_data=f"{key}"))
556
+ # Add row of 2 buttons when full
557
+ if len(inlineMenus) == 2:
558
+ keyboard.append(inlineMenus)
559
+ inlineMenus = [] # Reset row
560
+ # Append any remaining buttons (if not forming a full row)
561
+ if inlineMenus:
562
+ keyboard.append(inlineMenus)
563
+ return InlineKeyboardMarkup(keyboard)
564
+
565
+ def cancelAlertSubscription(update:Update,context:CallbackContext):
566
+ global bot_available
567
+ updatedResults= ""
568
+ updateCarrier = None
569
+ if update is None:
570
+ return
571
+ else:
572
+ if update.callback_query is not None:
573
+ updateCarrier = update.callback_query
574
+ if update.message is not None:
575
+ updateCarrier = update.message
576
+ if updateCarrier is None:
577
+ return
578
+ # Get user that sent /start and log his name
579
+ user = updateCarrier.from_user
580
+ scanId = updateCarrier.data.upper().replace("CAN_", "")
581
+ logger.info("User %s started the conversation.", user.first_name)
582
+ if not bot_available:
583
+ # Sometimes, either the payment does not go through or
584
+ # it takes time to process the last month's payment if
585
+ # done in the past 24 hours while the last date was today.
586
+ # If that happens, we won't be able to run bots or scanners
587
+ # without incurring heavy charges. Let's run in the
588
+ # unavailable mode instead until this gets fixed.
589
+ updatedResults = APOLOGY_TEXT
590
+ reply_markup=default_markup(user=user)
591
+ try:
592
+ dbManager = DBManager()
593
+ result = dbManager.removeScannerJob(user.id,scanId)
594
+ if result:
595
+ updatedResults = f"<b>{scanId}</b> has been successfully removed from your alert subscription(s). If you re-subscribe, the associated charges will be deducted from your alerts remaining balance. For any feedback, please reach out to @ItsOnlyPK. You can use the <b>Subscriptions</b> button below to check/view your existing subscriptions. We thank you for your support and trust! Keep exploring!"
596
+ else:
597
+ updatedResults = f"We encountered some <b>error</b> while trying to remove <b>{scanId}</b> from your alert subscription(s). Please try again or reach out to @ItsOnlyPK with feedback. If you re-subscribe, the associated charges will be deducted from your alerts remaining balance. You can use the <b>Subscriptions</b> button below to check/view your existing subscriptions. We thank you for your support and trust! Keep exploring!"
598
+ if hasattr(updateCarrier, "reply_text"):
599
+ updateCarrier.reply_text(text=sanitiseTexts(updatedResults), reply_markup=reply_markup,parse_mode="HTML")
600
+ elif hasattr(updateCarrier, "edit_message_text"):
601
+ editMessageText(query=updateCarrier,editedText=sanitiseTexts(updatedResults),reply_markup=reply_markup)
602
+ shareUpdateWithChannel(update=update, context=context, optionChoices=f"/CAN_{scanId}_{user.id}\n{updatedResults}")
603
+ except Exception as e: # pragma: no cover
604
+ logger.error(e)
605
+ pass
606
+ return START_ROUTES
607
+
550
608
  def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False):
551
609
  global bot_available
552
610
  updateCarrier = None
@@ -572,6 +630,7 @@ def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False)
572
630
  # unavailable mode instead until this gets fixed.
573
631
  updatedResults = APOLOGY_TEXT
574
632
 
633
+ reply_markup=default_markup(user=user)
575
634
  if bot_available:
576
635
  try:
577
636
  otpValue = 0
@@ -581,7 +640,8 @@ def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False)
581
640
  scannerJobsSubscribed = ""
582
641
  if alertUser is not None and len(alertUser.scannerJobs) > 0:
583
642
  scannerJobsSubscribed = ", ".join(alertUser.scannerJobs)
584
- scannerJobsSubscribed = f"Subscribed to [{scannerJobsSubscribed}]"
643
+ if len(scannerJobsSubscribed) > 0:
644
+ scannerJobsSubscribed = f"Subscribed to [{scannerJobsSubscribed}]"
585
645
  except Exception as e: # pragma: no cover
586
646
  logger.error(e)
587
647
  pass
@@ -609,10 +669,19 @@ def viewSubscriptionOptions(update:Update,context:CallbackContext,sendOTP=False)
609
669
  updatedResults = f"Please use the following to login to PKScreener:\n{userText}\n<b>OTP</b> : <code>{otpValue}</code>\n\nCurrent subscription : <b>{subscriptionModelName}</b>.\nCurrent alerts balance: <b>₹ {alertUser.balance if alertUser is not None else 0}</b> {scannerJobsSubscribed}. {subscriptionModelNames}"
610
670
  else:
611
671
  updatedResults = f"Current subscription: <b>{subscriptionModelName}</b>.\nCurrent alerts balance: <b>₹ {alertUser.balance if alertUser is not None else 0}</b> {scannerJobsSubscribed}. {subscriptionModelNames}"
672
+
673
+ #Add new buttons with alert subscription options to cancel
674
+ if alertUser is not None and len(alertUser.scannerJobs) > 0:
675
+ buttonDict = {}
676
+ for scannerJob in alertUser.scannerJobs:
677
+ if len(scannerJob) > 0:
678
+ buttonDict[f"CAN_{scannerJob}"] = f"Stop {scannerJob} 🔔"
679
+ reply_markup = addNewButtonsToReplyMarkup(reply_markup,buttonDict)
680
+
612
681
  if hasattr(updateCarrier, "reply_text"):
613
- updateCarrier.reply_text(text=sanitiseTexts(updatedResults), reply_markup=default_markup(user=user),parse_mode="HTML")
682
+ updateCarrier.reply_text(text=sanitiseTexts(updatedResults), reply_markup=reply_markup,parse_mode="HTML")
614
683
  elif hasattr(updateCarrier, "edit_message_text"):
615
- editMessageText(query=updateCarrier,editedText=sanitiseTexts(updatedResults),reply_markup=default_markup(user=user))
684
+ editMessageText(query=updateCarrier,editedText=sanitiseTexts(updatedResults),reply_markup=reply_markup)
616
685
  shareUpdateWithChannel(update=update, context=context, optionChoices=f"/otp\n{updatedResults}")
617
686
  return START_ROUTES
618
687
 
@@ -1202,6 +1271,48 @@ def Level2(update: Update, context: CallbackContext) -> str:
1202
1271
  registerUser(user)
1203
1272
  return START_ROUTES
1204
1273
 
1274
+ def handleHousekeeping(update: Update, context: CallbackContext) -> str:
1275
+ updateCarrier = None
1276
+ menuText = "Not implemented yet..."
1277
+ shouldSendUpdate = False
1278
+ if update is None:
1279
+ return
1280
+ else:
1281
+ if update.callback_query is not None:
1282
+ updateCarrier = update.callback_query
1283
+ if update.message is not None:
1284
+ updateCarrier = update.message
1285
+ if updateCarrier is None:
1286
+ return
1287
+ # Get user that sent /start and log his name
1288
+ user = updateCarrier.from_user
1289
+ query = update.callback_query
1290
+ query.answer()
1291
+ preSelection = (query.data.upper().replace("C", ""))
1292
+ selection = preSelection.split("_")[1]
1293
+ if query is None:
1294
+ start(update, context)
1295
+ return START_ROUTES
1296
+ reply_markup = default_markup(user)
1297
+ dbMgr = DBManager()
1298
+ if selection == "GAU":
1299
+ userIds = dbMgr.getUsers(fieldName="userId")
1300
+ if userIds is not None:
1301
+ menuText = f"Number of all registered users in the DB: {len(userIds)}"
1302
+ elif selection == "GAS":
1303
+ scanners = dbMgr.scannerJobsWithActiveUsers()
1304
+ if scanners is not None:
1305
+ if len(scanners) > 0:
1306
+ menuText = f"Number of all scans running today in the DB: {len(scanners)}"
1307
+ for scanner in scanners:
1308
+ scanID = scanner.scannerId
1309
+ subUsers = ", ".join(scanner.userIds)
1310
+ menuText = f"{menuText}\nScanner: {scanID} : Users: {subUsers}"
1311
+ else:
1312
+ menuText = "No users are subscribed for alerts today!"
1313
+ editMessageText(query=query,editedText=menuText,reply_markup=reply_markup)
1314
+ return START_ROUTES
1315
+
1205
1316
  def default_markup(user=None,monitorIndex=0):
1206
1317
  mns = m0.renderForMenu(selectedMenu=None,
1207
1318
  skip=TOP_LEVEL_SCANNER_SKIP_MENUS[:len(TOP_LEVEL_SCANNER_SKIP_MENUS)-1],
@@ -1210,14 +1321,22 @@ def default_markup(user=None,monitorIndex=0):
1210
1321
  )
1211
1322
  if (PKDateUtilities.isTradingTime() and not PKDateUtilities.isTodayHoliday()[0]) or ("PKDevTools_Default_Log_Level" in os.environ.keys()) or sys.argv[0].endswith(".py"):
1212
1323
  mns.append(menu().create(f"MI_{monitorIndex}", "👩‍💻 🚀 Intraday Monitor", 2))
1324
+ hskMenus = []
1213
1325
  if user is not None and user.username == OWNER_USER:
1214
- mns.append(menu().create(f"DV_0", ("✅ Enable Logging" if not configManager.logsEnabled else "🚫 Disable Logging"), 2))
1215
- mns.append(menu().create(f"DV_1", "🔄 Restart Bot", 2))
1326
+ hskMenus.append(menu().create(f"DV_0", ("✅ Enable Logging" if not configManager.logsEnabled else "🚫 Disable Logging"), 2))
1327
+ hskMenus.append(menu().create(f"DV_1", "🔄 Restart Bot", 2))
1328
+ hskMenus.append(menu().create(f"HSK_GAU", "Get Active Users", 2))
1329
+ hskMenus.append(menu().create(f"HSK_GAP", "Get Paying Users", 2))
1330
+ hskMenus.append(menu().create(f"HSK_GAS", "Get Alerting Users", 2))
1331
+ hskMenus.append(menu().create(f"HSK_EUS", "Enable User Subs", 2))
1332
+ hskMenus.append(menu().create(f"HSK_DUS", "Disable User Subs", 2))
1333
+ hskMenus.append(menu().create(f"HSK_UUB", "Update User Balance", 2))
1334
+
1216
1335
  keyboard = []
1217
1336
  inlineMenus = []
1218
1337
  lastRowMenus = []
1219
1338
  rowIndex = 0
1220
- iconDict = {"X":"🕵️‍♂️ 🔍 ","B":"📈 🎯 ","P":"🧨 💥 ","MI":"","DV":"","VS":"🔔 📣 ","start":"🟢 🏁 "}
1339
+ iconDict = {"X":"🕵️‍♂️ 🔍 ","B":"📈 🎯 ","P":"🧨 💥 ","MI":"","DV":"","VS":"🔔 📣 ","start":"🟢 🏁 ", "HS":"🕵️‍♂️ "}
1221
1340
  for mnu in mns:
1222
1341
  if mnu.menuKey[0:2] in TOP_LEVEL_SCANNER_MENUS:
1223
1342
  rowIndex +=1
@@ -1245,6 +1364,21 @@ def default_markup(user=None,monitorIndex=0):
1245
1364
  if len(inlineMenus) > 0:
1246
1365
  keyboard.append(inlineMenus)
1247
1366
  keyboard.append(lastRowMenus)
1367
+ rowIndex = 0
1368
+ inlineMenus = []
1369
+ for hskMenu in hskMenus:
1370
+ rowIndex +=1
1371
+ inlineMenus.append(
1372
+ InlineKeyboardButton(
1373
+ iconDict.get(str(hskMenu.menuKey[0:2])) + hskMenu.menuText.split("(")[0],
1374
+ callback_data="C" + str(hskMenu.menuKey),
1375
+ )
1376
+ )
1377
+ if rowIndex % 2 == 0:
1378
+ keyboard.append(inlineMenus)
1379
+ inlineMenus = []
1380
+ if len(inlineMenus) > 0:
1381
+ keyboard.append(inlineMenus)
1248
1382
  reply_markup = InlineKeyboardMarkup(keyboard)
1249
1383
  return reply_markup
1250
1384
 
@@ -2114,6 +2248,8 @@ def runpkscreenerbot(availability=True) -> None:
2114
2248
  CallbackQueryHandler(Level2, pattern="^" + str("CP_")),
2115
2249
  CallbackQueryHandler(subscribeToScannerAlerts, pattern="^" + str("SUB_")),
2116
2250
  CallbackQueryHandler(viewSubscriptionOptions, pattern="^" + str("VS_")),
2251
+ CallbackQueryHandler(cancelAlertSubscription, pattern="^" + str("CAN_")),
2252
+ CallbackQueryHandler(handleHousekeeping, pattern="^" + str("CHSK_")),
2117
2253
  # CallbackQueryHandler(Level2, pattern="^" + str("CG_")),
2118
2254
  CallbackQueryHandler(end, pattern="^" + str("CZ") + "$"),
2119
2255
  CallbackQueryHandler(start, pattern="^"),
@@ -19,8 +19,8 @@ pandas_ta #>=0.3.14b0
19
19
  # and https://github.com/pyinstaller/pyinstaller/issues/7269
20
20
  pefile>=2023.2.7,<2024.8.26
21
21
  Pillow #>=9.5.0,<=9.5.0 # Keep at this version because getsize_multiline is deprecated/removed in higher versions
22
- PKDevTools>=0.13.20250126.233
23
- PKNSETools>=0.1.20250122.137
22
+ PKDevTools>=0.13.20250126.235
23
+ PKNSETools>=0.1.20250122.138
24
24
  Pyarrow #>=17.0.0
25
25
  pyppeteer #>=2.0.0
26
26
  pytz #>=2024.2
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pkscreener
3
- Version: 0.46.20250214.717
3
+ Version: 0.46.20250218.719
4
4
  Summary: A Python-based stock screener for NSE, India with alerts to Telegram Channel (pkscreener)
5
5
  Home-page: https://github.com/pkjmesra/pkscreener
6
- Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250214.717.zip
6
+ Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250218.719.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -357,15 +357,15 @@ After you have finished the run, go to that copied path, zip the contents of the
357
357
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
358
358
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
359
359
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
360
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli.exe
360
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli.exe
361
361
  [Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
362
- [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_x64.bin
362
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.bin
363
363
  [Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
364
- [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_arm64.bin
364
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.bin
365
365
  [Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
366
- [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_x64.run
366
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_x64.run
367
367
  [Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
368
- [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.716/pkscreenercli_arm64.run
368
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250214.718/pkscreenercli_arm64.run
369
369
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
370
370
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
371
371
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -0,0 +1,58 @@
1
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/Disclaimer.txt,sha256=x7M9Clrb9qACqOa-Vnwh9wliISLgudW5Kv_dgEk3N_Q,1405
2
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/LICENSE-Others.txt,sha256=0put8oIYbAYz98IGnp2F1CpHoyR_iyk0PRYG5D-U1K0,277059
3
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/LICENSE.txt,sha256=q80QYQZCkhPymkaQKXZJwOFYU6X-4lUHRzCGYERdLpA,1099
4
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/README.txt,sha256=ufEdmy2D1GRQ_jX1PDUWLw-ceXsFcKCOcBuk1ciUPuc,33085
6
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/__init__.py,sha256=cH0zxpSdH-dhmZihoe5mpE2NRRmF2Na_KaGMO9u33Rg,1669
7
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/globals.py,sha256=h7gRVI1ljj5AQp-KvOMGz9LqXYvt0v2YaWdxFeP-rqg,245088
9
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/pkscreener.ini,sha256=v0MV7kLxi0ehh1a013wg6TLXDeeLRO8PKapICSU1u-k,2451
10
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/pkscreenerbot.py,sha256=lbj8iheNtOAxrtDHKxh_QA-PBrIUuoEWobKxYqfAgxs,116861
11
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/pkscreenercli.py,sha256=NtW0PGiMKgkBfQk6jZ8WE_ipTRrZP7v1020xQNHZdUE,58213
12
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/requirements.txt,sha256=MRt1xjlgh8eFDf459OVS71QheZ-PnmQ1GyQg2wkJEGI,1503
13
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/ArtTexts.py,sha256=UzU0v3LX4PsWcx_ATv5M-T4v93uLz2hmvyDtew6qzZk,19708
14
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/AssetsManager.py,sha256=0__n99u7SD0KHmpnybm_msu35CAlv5W6WwtT5LrSkNc,34313
15
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Backtest.py,sha256=VoNronl--07E477I9lhwfEjI4vK5VHu_tcDRO1K96hU,10784
16
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Barometer.py,sha256=aZWu0TFbwRBvnkyN_Ws4a_2FYNhKKuqEpoQAqokthPc,9640
17
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=Dev8eCx8eGNqDsbXj-t68hLSDpKDICcyb9yH_n_IbYg,3086
18
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=IFVUXzx175aqZlL7JlmNl308aeIkSD6Hugl4M9zg9Io,17419
19
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Changelog.py,sha256=S0hNTDYptWUxFrdTzqinjFLIywVAuKlYR1aCjepADn0,1511
20
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/ConfigManager.py,sha256=ZIxZ-IqWjIXpo_7SWRLx5e8sc0b92gGnc4qqMZVproM,54426
21
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=QZLPA0li0bfs1zNijfq_utovulY5fl4vXWk89CBpL5Q,10291
22
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=gNMAm4iQF0ClmVPBe6ZnsjWQ-rfnTq6R_mLBjA6GgyI,12330
23
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Fetcher.py,sha256=ZwU9iW0nbGAgM0mKZNjYgy9sm8jRSw9PvYmyhuY7Pos,12620
24
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/GlobalStore.py,sha256=UCYctbau2ZAShkWOLA7-p52Pg_irghCWRoa6UrIKYQQ,3799
25
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/ImageUtility.py,sha256=DKPiM7u-fGPujD63VLCWUsvesgflVYDiLqyw_KWOK8g,37629
26
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=--qQpmLt7XTljACGDWIIOZO01uWJpEbG78wyMRynTI4,22450
27
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/MarketStatus.py,sha256=oBDTCTGazzOEhcclugxOOtyhu2VVT2XQ-t-GmY_pT7g,3823
28
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/MenuOptions.py,sha256=RIPQ9mVC9I07GZubrmOtUAQg10GbCoYwF3fnvV1dvqY,65741
29
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Messenger.py,sha256=yKqq3eE2JkvTOeKcNZoPpCgxQ9FjcEeB1iHIKwwq8dA,8572
30
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=jSjVqgiZ4CGVkieJMekNLHZGx_eOGN-Xg4RF3eZO_Nk,13816
31
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=4LdzjSjbJExBpD2DM9wXWuFqKiC8QEr9HT2XFiJq7oA,5368
32
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKDataService.py,sha256=InEI3AGt_ykYfbwq2v1_NWUefTqPluKHSh_4ksFSUzE,3456
33
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=wh48WLLFxBAFHML5Sq5G5-UFP96snJ9yKJgpKWuQ2Zs,2253
34
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=zscdvHwDb5GQttqnR4Ed0SsVfOFeqKQgfIo6LWukgH0,34366
35
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=L3O3EwIZBE9PpdDFIGH-2Ec9Gi3IlzCd6RfQSXUd6So,5695
36
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=9Qy6xouK6qkNExeWF8LrxYXynI3Ju9UrSY5kI5W81Ok,27313
37
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=wDMORWmyglcu06woVNpgDlESsMIiYX96MXO0VoBlLYg,1694
38
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKScheduler.py,sha256=Od3Niv6Q_aHarau9agCVt7h194votlaDX4j1Xv-_ru4,8994
39
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=BIICJx79QjGFPrnmQ34357jOGp79vuiknx6A_kC9y8Y,8466
40
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKTask.py,sha256=YPxzn0dA5ty7CtRFi1wQphC9vCdK8tB2_3DYHje9jgc,1907
41
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=q5V3GChPEFl4-je4VFJDGDT4GK37t3sBT0UY9GT6L8s,11657
42
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Pktalib.py,sha256=yko7TZMOsLoBv-LbTuT903CsGdyckhypXldh7uoAXmo,34179
43
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Portfolio.py,sha256=dxviO0G3OqJza4Nbpj5OCph8PZlfkRCkL3LfLJYgqu0,14196
44
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=cMQ-yZrBPWo4gACxFqj3HNG9rqmyqXkS88qpy77JP_s,49612
45
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=LHPQLinxcvIFCJE6vWN-l50bamJCexbfLn9HP4JNRn0,225368
46
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/StockScreener.py,sha256=wL6RjojBvTqo9XUlh2qoCpERrKdGNTlcDtCTReA0jkI,68437
47
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/StockSentiment.py,sha256=kc5jdXRGm2nIvDK-2y4i_Y1w47_2zWpunjlQsKB7IBY,3640
48
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=MXJrQPD4yvKSI4p_RcnHt5oZg8AZ59ME7Jf-Nryoy5g,5055
49
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/Utility.py,sha256=6JpIich2-knaZ4sjsjyMoO_4S622KK-Jte2Hi4eYIOs,13870
50
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=GgxHCWOOEUv4M7xbIZtcoxndzII4eInex24U99uEWcI,5769
51
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/__init__.py,sha256=BCKw9m_4O-B4oUAvnHQRQqIFNijfHCIfzGHsmLLZJII,28
52
+ pkscreener-0.46.20250218.719.data/purelib/pkscreener/classes/keys.py,sha256=tygV0iu8bKmSPo6HGj1Cb-rTtEWErGrsYRZY7SoCb1g,6957
53
+ pkscreener-0.46.20250218.719.dist-info/LICENSE,sha256=q80QYQZCkhPymkaQKXZJwOFYU6X-4lUHRzCGYERdLpA,1099
54
+ pkscreener-0.46.20250218.719.dist-info/METADATA,sha256=_Tvsq8b4M7G2c7p-e6ELFiyeVWb5aPzpqKZA9RZXD6E,34107
55
+ pkscreener-0.46.20250218.719.dist-info/WHEEL,sha256=cRmSBGD-cl98KkuHMNqv9Ac9L9_VqTvcBYwpIvxN0cg,101
56
+ pkscreener-0.46.20250218.719.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
+ pkscreener-0.46.20250218.719.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
+ pkscreener-0.46.20250218.719.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- VERSION='0.46.20250214.717'
@@ -1,58 +0,0 @@
1
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/Disclaimer.txt,sha256=x7M9Clrb9qACqOa-Vnwh9wliISLgudW5Kv_dgEk3N_Q,1405
2
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/LICENSE-Others.txt,sha256=0put8oIYbAYz98IGnp2F1CpHoyR_iyk0PRYG5D-U1K0,277059
3
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/LICENSE.txt,sha256=q80QYQZCkhPymkaQKXZJwOFYU6X-4lUHRzCGYERdLpA,1099
4
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/README.txt,sha256=m34HJO8WLL5QE2RzTDxdJcvZie5_22p8XRfVc3iQ1Yo,33085
6
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/__init__.py,sha256=cH0zxpSdH-dhmZihoe5mpE2NRRmF2Na_KaGMO9u33Rg,1669
7
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/globals.py,sha256=h7gRVI1ljj5AQp-KvOMGz9LqXYvt0v2YaWdxFeP-rqg,245088
9
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/pkscreener.ini,sha256=v0MV7kLxi0ehh1a013wg6TLXDeeLRO8PKapICSU1u-k,2451
10
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/pkscreenerbot.py,sha256=UudYgPFr0yrp4PqSyqWZxw2L2jQMHXCFgOygvOxQ9B0,109998
11
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/pkscreenercli.py,sha256=NtW0PGiMKgkBfQk6jZ8WE_ipTRrZP7v1020xQNHZdUE,58213
12
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/requirements.txt,sha256=TJVfdV2FVMH2KO5lPX_i1PrMOLFRtFMzGDsbhElMqJI,1503
13
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/ArtTexts.py,sha256=UzU0v3LX4PsWcx_ATv5M-T4v93uLz2hmvyDtew6qzZk,19708
14
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/AssetsManager.py,sha256=0__n99u7SD0KHmpnybm_msu35CAlv5W6WwtT5LrSkNc,34313
15
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Backtest.py,sha256=VoNronl--07E477I9lhwfEjI4vK5VHu_tcDRO1K96hU,10784
16
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Barometer.py,sha256=aZWu0TFbwRBvnkyN_Ws4a_2FYNhKKuqEpoQAqokthPc,9640
17
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=Dev8eCx8eGNqDsbXj-t68hLSDpKDICcyb9yH_n_IbYg,3086
18
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=IFVUXzx175aqZlL7JlmNl308aeIkSD6Hugl4M9zg9Io,17419
19
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Changelog.py,sha256=S0hNTDYptWUxFrdTzqinjFLIywVAuKlYR1aCjepADn0,1511
20
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/ConfigManager.py,sha256=ZIxZ-IqWjIXpo_7SWRLx5e8sc0b92gGnc4qqMZVproM,54426
21
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=QZLPA0li0bfs1zNijfq_utovulY5fl4vXWk89CBpL5Q,10291
22
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=gNMAm4iQF0ClmVPBe6ZnsjWQ-rfnTq6R_mLBjA6GgyI,12330
23
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Fetcher.py,sha256=ZwU9iW0nbGAgM0mKZNjYgy9sm8jRSw9PvYmyhuY7Pos,12620
24
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/GlobalStore.py,sha256=UCYctbau2ZAShkWOLA7-p52Pg_irghCWRoa6UrIKYQQ,3799
25
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/ImageUtility.py,sha256=DKPiM7u-fGPujD63VLCWUsvesgflVYDiLqyw_KWOK8g,37629
26
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=--qQpmLt7XTljACGDWIIOZO01uWJpEbG78wyMRynTI4,22450
27
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/MarketStatus.py,sha256=oBDTCTGazzOEhcclugxOOtyhu2VVT2XQ-t-GmY_pT7g,3823
28
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/MenuOptions.py,sha256=RIPQ9mVC9I07GZubrmOtUAQg10GbCoYwF3fnvV1dvqY,65741
29
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Messenger.py,sha256=yKqq3eE2JkvTOeKcNZoPpCgxQ9FjcEeB1iHIKwwq8dA,8572
30
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=jSjVqgiZ4CGVkieJMekNLHZGx_eOGN-Xg4RF3eZO_Nk,13816
31
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=4LdzjSjbJExBpD2DM9wXWuFqKiC8QEr9HT2XFiJq7oA,5368
32
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKDataService.py,sha256=InEI3AGt_ykYfbwq2v1_NWUefTqPluKHSh_4ksFSUzE,3456
33
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=wh48WLLFxBAFHML5Sq5G5-UFP96snJ9yKJgpKWuQ2Zs,2253
34
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=zscdvHwDb5GQttqnR4Ed0SsVfOFeqKQgfIo6LWukgH0,34366
35
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=L3O3EwIZBE9PpdDFIGH-2Ec9Gi3IlzCd6RfQSXUd6So,5695
36
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=9Qy6xouK6qkNExeWF8LrxYXynI3Ju9UrSY5kI5W81Ok,27313
37
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=wDMORWmyglcu06woVNpgDlESsMIiYX96MXO0VoBlLYg,1694
38
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKScheduler.py,sha256=Od3Niv6Q_aHarau9agCVt7h194votlaDX4j1Xv-_ru4,8994
39
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=BIICJx79QjGFPrnmQ34357jOGp79vuiknx6A_kC9y8Y,8466
40
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKTask.py,sha256=YPxzn0dA5ty7CtRFi1wQphC9vCdK8tB2_3DYHje9jgc,1907
41
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=q5V3GChPEFl4-je4VFJDGDT4GK37t3sBT0UY9GT6L8s,11657
42
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Pktalib.py,sha256=yko7TZMOsLoBv-LbTuT903CsGdyckhypXldh7uoAXmo,34179
43
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Portfolio.py,sha256=dxviO0G3OqJza4Nbpj5OCph8PZlfkRCkL3LfLJYgqu0,14196
44
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=cMQ-yZrBPWo4gACxFqj3HNG9rqmyqXkS88qpy77JP_s,49612
45
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=LHPQLinxcvIFCJE6vWN-l50bamJCexbfLn9HP4JNRn0,225368
46
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/StockScreener.py,sha256=wL6RjojBvTqo9XUlh2qoCpERrKdGNTlcDtCTReA0jkI,68437
47
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/StockSentiment.py,sha256=kc5jdXRGm2nIvDK-2y4i_Y1w47_2zWpunjlQsKB7IBY,3640
48
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=MXJrQPD4yvKSI4p_RcnHt5oZg8AZ59ME7Jf-Nryoy5g,5055
49
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/Utility.py,sha256=6JpIich2-knaZ4sjsjyMoO_4S622KK-Jte2Hi4eYIOs,13870
50
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=GgxHCWOOEUv4M7xbIZtcoxndzII4eInex24U99uEWcI,5769
51
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/__init__.py,sha256=j-ZTQTwkIiHG2HMtTelpshbpgpH93IJzViV75Q5DwM0,28
52
- pkscreener-0.46.20250214.717.data/purelib/pkscreener/classes/keys.py,sha256=tygV0iu8bKmSPo6HGj1Cb-rTtEWErGrsYRZY7SoCb1g,6957
53
- pkscreener-0.46.20250214.717.dist-info/LICENSE,sha256=q80QYQZCkhPymkaQKXZJwOFYU6X-4lUHRzCGYERdLpA,1099
54
- pkscreener-0.46.20250214.717.dist-info/METADATA,sha256=Ko7FHknxuG12SrKHYyY_IzZ9BJK95FEOEG0aul4Bq4M,34107
55
- pkscreener-0.46.20250214.717.dist-info/WHEEL,sha256=cRmSBGD-cl98KkuHMNqv9Ac9L9_VqTvcBYwpIvxN0cg,101
56
- pkscreener-0.46.20250214.717.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
- pkscreener-0.46.20250214.717.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
- pkscreener-0.46.20250214.717.dist-info/RECORD,,